001: /*
002: *
003: *
004: * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: */
026:
027: package com.sun.midp.lcdui;
028:
029: import com.sun.midp.events.EventTypes;
030: import com.sun.midp.events.EventQueue;
031: import com.sun.midp.events.NativeEvent;
032:
033: import javax.microedition.lcdui.Display;
034: import javax.microedition.lcdui.Displayable;
035: import javax.microedition.lcdui.Item;
036: import javax.microedition.lcdui.CustomItem;
037:
038: import com.sun.midp.security.Permissions;
039: import com.sun.midp.security.SecurityToken;
040:
041: /**
042: * This class provides methods to send events of types
043: * handled by MDisplayEventConsumer I/F implementors.
044: * This class completely hide event construction & sending in its methods.
045: *
046: * Generic comments for all XXXEventProducers:
047: *
048: * For each supported event type there is a separate sendXXXEvent() method,
049: * that gets all needed parameters to construct an event of an approprate class.
050: * The method also performs event sending itself.
051: *
052: * If a given event type merges a set of logically different subtypes,
053: * this class shall provide separate methods for these subtypes.
054: *
055: * It is assumed that only one object instance of this class
056: * is initialized with the system event that is created at (isolate) startup.
057: *
058: * This class only operates on the event queue given to it during
059: * construction, the class does not obtain any restricted object itself,
060: * so it does not need protection.
061: *
062: * All MIDP stack subsystems that need to send events of supported types,
063: * must get a reference to an already created istance of this class.
064: * Typically, this instance should be passed as a constructor parameter.
065: *
066: * Class is NOT final to allow debug/profile/test/automation subsystems
067: * to change, substitute, complement default "event sending" functionality :
068: * Ex.
069: * class LogXXXEventProducer
070: * extends XXXEventProducer {
071: * ...
072: * void sendXXXEvent(parameters) {
073: * LOG("Event of type XXX is about to be sent ...")
074: * super.sendXXXEvent(parameters);
075: * LOG("Event of type XXX has been sent successfully !")
076: * }
077: * ...
078: * }
079: */
080: public class DisplayEventProducer {
081:
082: /** Cached reference to the MIDP event queue. */
083: private EventQueue eventQueue;
084:
085: /**
086: * Construct a new DisplayEventProducer.
087: *
088: * @param theEventQueue An event queue where new events will be posted.
089: */
090: public DisplayEventProducer(EventQueue theEventQueue) {
091:
092: eventQueue = theEventQueue;
093: }
094:
095: /*
096: * LOCAL USER INPUT EVENTS - produced by Native code
097: *
098: * KEY/non-IME
099: * KEY/IME
100: * PEN
101: * CMD
102: * PEER_CHANGED
103: *
104: */
105: /*
106: * NO PRODUCER METHODS for these event types
107: */
108:
109: /*
110: * LOCAL DISPLAY MANAGEMENT EVENTS
111: *
112: * SCREEN_CHANGE
113: * INVALIDATE
114: */
115:
116: /**
117: * Called to schedule a screen change to the given Displayable
118: * as soon as possible
119: *
120: * @param parent parent Display of the Displayable
121: * @param d The Displayable to change to
122: */
123: public void sendScreenChangeEvent(DisplayEventConsumer parent,
124: Displayable d) {
125: eventQueue.post(LCDUIEvent.createScreenChangeEvent(parent, d));
126: }
127:
128: /**
129: * Called to schedule an invalidation of a Form.
130: *
131: * @param d The Display
132: */
133: public void sendInvalidateEvent(DisplayEventConsumer d) {
134: eventQueue.post(LCDUIEvent.createBasicEvent(d,
135: EventTypes.INVALIDATE_EVENT));
136: }
137:
138: /*
139: * LOCAL CALLBACK MANAGEMEMT EVENTS
140: *
141: * CALL_SERIALLLY
142: */
143:
144: /**
145: * Called to schedule a serial callback of a Runnable object passed
146: * into Display's callSerially() method.
147: *
148: * @param d The Display
149: */
150: public void sendCallSeriallyEvent(DisplayEventConsumer d) {
151: eventQueue.post(LCDUIEvent.createBasicEvent(d,
152: EventTypes.CALL_SERIALLY_EVENT));
153: }
154:
155: /*
156: * TBD: add FOREGROUND_NOTIFY (or move to a separate Producer) ...
157: */
158:
159: /*
160: * ITEM EVENTS - not associated with a particular Display
161: *
162: * ITEM_CHANGED/STATE_CHANGE
163: * ITEM_CHANGED/SIZE_REFRESH
164: * ITEM_CHANGED/MAKE_VISIBLE
165: */
166:
167: /**
168: * Schedules a call to an ItemStateListener.
169: *
170: * @param src the Item which has changed, this parameter is need only
171: * by <code>Form</code> however, this means that events cannot be merged.
172: * If <code>Form</code> was to scan its items
173: * for invalid ones in callItemStateChanged, only one of these events
174: * would need to be in the queue at once.
175: */
176: public void sendItemStateChangeEvent(Item src) {
177: eventQueue.post(LCDUIEvent.createItemEvent(src,
178: LCDUIEvent.ITEM_STATE_CHANGED));
179: }
180:
181: /**
182: * Schedules a call requesting a CustomItem to refresh its sizes.
183: *
184: * @param src the CustomItem requested to be refreshed
185: */
186: public void sendItemSizeRefreshEvent(CustomItem src) {
187: eventQueue.post(LCDUIEvent.createItemEvent(src,
188: LCDUIEvent.ITEM_SIZE_REFRESH));
189: }
190:
191: /**
192: * Schedules a call to repaint entire screen content.
193: *
194: * @param d The Display
195: */
196: public void sendScreenRepaintEvent(DisplayEventConsumer d) {
197: eventQueue.post(LCDUIEvent.createScreenRepaintEvent(d));
198: }
199: }
|