OSDN Git Service

lejos_NXJ_win32_0_5_0beta.zip
[nxt-jsp/lejos_nxj.git] / nxtOSEK / lejos_nxj / src / java / classes / javax / microedition / lcdui / Display.java
1 package javax.microedition.lcdui;\r
2 \r
3 import lejos.nxt.Button;\r
4 import lejos.nxt.ButtonListener;\r
5 import lejos.util.Timer;\r
6 import lejos.util.TimerListener;\r
7 \r
8 /**\r
9  * \r
10  * @author Andre Nijholt\r
11  */\r
12 public class Display {\r
13         private static final int TICKER_INTERVAL_MSEC = 500;\r
14 \r
15         public static final int SCREEN_WIDTH    = 100;\r
16         public static final int SCREEN_HEIGHT   = 64;\r
17 \r
18         public static final int CHAR_WIDTH              = 6;\r
19         public static final int CHAR_HEIGHT     = 8;\r
20 \r
21         public static final int SCREEN_CHAR_WIDTH = SCREEN_WIDTH / CHAR_WIDTH;\r
22         public static final int SCREEN_CHAR_DEPTH = CHAR_HEIGHT;\r
23 \r
24         private static Display display;\r
25         \r
26         private Screen current;\r
27         private Screen alertBackup;\r
28         private int alertTimeout;\r
29         \r
30         private Timer tickerTimer;\r
31         private int tickerOffset = SCREEN_CHAR_WIDTH;\r
32         \r
33         protected Graphics graphics;\r
34         private boolean quit;\r
35         \r
36         private Display() {\r
37                 graphics = new Graphics();\r
38         }\r
39         \r
40         public static Display getDisplay() {\r
41                 if (display == null) {\r
42                         display = new Display();\r
43                 }\r
44                 \r
45                 return display;\r
46         }\r
47         \r
48         public void setCurrent(Screen nextDisplayable) {\r
49                 if (nextDisplayable != null) {\r
50                         if (nextDisplayable instanceof Alert) {\r
51                                 alertBackup = current;                          \r
52                                 alertTimeout = (((Alert) nextDisplayable).getTimeout() == Alert.FOREVER) ? Alert.FOREVER\r
53                                         : ((int) System.currentTimeMillis()) + ((Alert) nextDisplayable).getTimeout();\r
54                         }\r
55                         if (current != null) {\r
56                                 current.hideNotify();\r
57                         }\r
58                         \r
59                         tickerOffset = SCREEN_CHAR_WIDTH;\r
60                         current = nextDisplayable;\r
61                         current.showNotify();\r
62                         current.repaint();\r
63                 }\r
64         }\r
65         \r
66         public void setCurrent(Alert alert, Screen nextDisplayable) {\r
67                 if ((alert != null) && (nextDisplayable != null)) {\r
68                         alertBackup = nextDisplayable;\r
69                         if (current != null) {\r
70                                 current.hideNotify();\r
71                         }\r
72 \r
73                         // Store timeout for alert screen\r
74                         alertTimeout = (alert.getTimeout() == Alert.FOREVER) ? Alert.FOREVER\r
75                                         : ((int) System.currentTimeMillis()) + alert.getTimeout();\r
76                         \r
77                         tickerOffset = SCREEN_CHAR_WIDTH;\r
78                         current = alert;\r
79                         current.showNotify();\r
80                         current.repaint();\r
81                 }\r
82         }\r
83         \r
84         public Displayable getCurrent() {\r
85                 return current;\r
86         }\r
87         \r
88         /**\r
89          * Start displaying the installed menus\r
90          * \r
91          * @param polling true to poll for button updates (recommended)\r
92          */\r
93         public void show(boolean polling) {\r
94                 if (!polling) {\r
95                         // Use non-polling implementation\r
96                         showUsingListeners();\r
97                         return;\r
98                 }\r
99 \r
100                 int btnPressed;\r
101                 int tsTickerUpdate = (int) System.currentTimeMillis();\r
102                 while (!quit) {\r
103                         // Wait for button release\r
104                         while (!quit && (Button.readButtons() > 0)) {\r
105                                 Thread.yield();\r
106                         }\r
107                         // Wait for button pressed and handle main timer checks\r
108                         while (!quit && (Button.readButtons() == 0)) {\r
109                                 if (msecPassed(tsTickerUpdate)) {\r
110                                 int tickerLen = updateTicker(tickerOffset);\r
111                                 if (tickerLen > 0) {\r
112                                         tickerOffset--;\r
113                                         if (tickerOffset < -tickerLen) {\r
114                                                 tickerOffset = SCREEN_CHAR_WIDTH;\r
115                                         }\r
116                                 }\r
117                                 tsTickerUpdate = (int) System.currentTimeMillis() + TICKER_INTERVAL_MSEC;\r
118                                 }\r
119                                 \r
120                                 if ((current != null) && (current instanceof Alert)\r
121                                                 && (alertTimeout != Alert.FOREVER) && msecPassed(alertTimeout)) {\r
122                                 // Hide alert screen and replace backup without notify\r
123                                 current.hideNotify();\r
124                                 current = alertBackup;\r
125                                 }\r
126 \r
127                                 // Handle repaint requests from outside\r
128                                 update();\r
129                                 Thread.yield();\r
130                         }\r
131                         // Check if menu to handle\r
132                         if (current == null) {\r
133                                 continue;\r
134                         }\r
135                         \r
136                         // Debounce button press\r
137                         try {\r
138                                 Thread.sleep(20);\r
139                         } catch (InterruptedException e) {}\r
140                         \r
141                         // Handle debounced button press\r
142                         btnPressed = Button.readButtons();\r
143                         if (btnPressed == 1) {\r
144                                 // ENTER button pressed\r
145                         if (current instanceof Alert) {\r
146                                 // Hide alert screen and replace backup without notify\r
147                                 current.keyPressed(Displayable.KEY_ENTER);\r
148                                 current.hideNotify();\r
149                                 current = alertBackup;\r
150                         } else {\r
151                                 current.keyPressed(Displayable.KEY_ENTER);\r
152                         }\r
153                         update();\r
154                         } else if (btnPressed == 2) {\r
155                                 // LEFT button pressed\r
156                         current.keyPressed(Displayable.KEY_LEFT);\r
157                         update();\r
158                         } else if (btnPressed == 4) {\r
159                                 // RIGHT button pressed\r
160                         current.keyPressed(Displayable.KEY_RIGHT);\r
161                         update();\r
162                         } else if (btnPressed == 8) {\r
163                                 // ESCAPE button pressed\r
164                         current.keyPressed(Displayable.KEY_BACK);\r
165                         update();\r
166                         }\r
167                 }\r
168                 \r
169                 // End application\r
170                 System.exit(0);\r
171         }\r
172         \r
173         public void quit() {\r
174                 quit = true;\r
175         }\r
176         \r
177         private void showUsingListeners() {\r
178             Button.ENTER.addButtonListener(new ButtonListener() {\r
179                 public void buttonReleased (Button b) {}\r
180                 public void buttonPressed (Button b) {\r
181                         if (current != null) {\r
182                                 if (current instanceof Alert) {\r
183                                         // Hide alert screen and replace backup without notify\r
184                                         current.keyPressed(Displayable.KEY_ENTER);\r
185                                         current.hideNotify();\r
186                                         current = alertBackup;\r
187                                 } else {\r
188                                         current.keyPressed(Displayable.KEY_ENTER);\r
189                                 }\r
190                                 update();\r
191                         }\r
192                 }\r
193             });\r
194             Button.ESCAPE.addButtonListener(new ButtonListener() {\r
195                 public void buttonReleased (Button b) {}\r
196                 public void buttonPressed (Button b) {\r
197                         if (current != null) {\r
198                                 current.keyPressed(Displayable.KEY_BACK);\r
199                                 update();\r
200                         }\r
201                 }\r
202             });\r
203             Button.LEFT.addButtonListener(new ButtonListener() {\r
204                 public void buttonReleased (Button b) {}\r
205                 public void buttonPressed (Button b) {\r
206                         if (current != null) {\r
207                                 current.keyPressed(Displayable.KEY_LEFT);\r
208                                 update();\r
209                         }\r
210                 }\r
211             });\r
212             Button.RIGHT.addButtonListener(new ButtonListener() {\r
213                 public void buttonReleased (Button b) {}\r
214                 public void buttonPressed (Button b) {\r
215                         if (current != null) {\r
216                                 current.keyPressed(Displayable.KEY_RIGHT);\r
217                                 update();\r
218                         }\r
219                 }\r
220             });\r
221 \r
222             tickerTimer = new Timer(500, new TimerListener() {\r
223                 public void timedOut() {\r
224                         int tickerLen = updateTicker(tickerOffset);\r
225                         if (tickerLen > 0) {\r
226                                 tickerOffset--;\r
227                                 if (tickerOffset < -tickerLen) {\r
228                                         tickerOffset = SCREEN_CHAR_WIDTH;\r
229                                 }\r
230                         }\r
231                 }\r
232             });\r
233             tickerTimer.start();\r
234             \r
235             // Start update timer task\r
236             new Timer(50, new TimerListener() {\r
237                 public void timedOut() {\r
238                                 if ((current != null) && (current instanceof Alert)\r
239                                                 && (alertTimeout != Alert.FOREVER) && msecPassed(alertTimeout)) {\r
240                                 // Hide alert screen and replace backup without notify\r
241                                 current.hideNotify();\r
242                                 current = alertBackup;\r
243                                 }\r
244                                 \r
245                                 if (quit) {\r
246                                         System.exit(0);\r
247                                 }\r
248 \r
249                         update();\r
250                 }\r
251             }).start();\r
252         }\r
253         \r
254         private void update() {\r
255                 if (current.getPaintRequest()) {\r
256                         graphics.autoRefresh(false);\r
257                         graphics.clear();\r
258                         updateTicker(tickerOffset);\r
259                         \r
260                         current.paint(graphics);\r
261                         current.clearPaintRequest();\r
262                         graphics.refresh();\r
263                         graphics.autoRefresh(true);\r
264                 }\r
265         }\r
266         \r
267         private int updateTicker(int offset) {\r
268                 Ticker ticker = current.getTicker();\r
269                 if (ticker != null) {\r
270                         int tickerLen = ticker.getString().length();\r
271                         for (int i = 0; i < SCREEN_CHAR_WIDTH; i++) {\r
272                                 if ((i >= offset) && ((i - offset) < tickerLen)) {\r
273                                         graphics.drawChar(ticker.getString().charAt(i - offset), \r
274                                                 i * Display.CHAR_WIDTH, 0, false);\r
275                                 } else {\r
276                                         graphics.drawChar(' ', i * Display.CHAR_WIDTH, 0, false);\r
277                                 }\r
278                         }\r
279                         graphics.refresh();\r
280                         return tickerLen;\r
281                 }\r
282                 \r
283                 return 0;\r
284         }\r
285         \r
286         /**\r
287          * Returns true if the given timestamp passed\r
288          * \r
289          * @param ts Timestamp in milliseconds\r
290          * @return true if ts already passed, otherwise false\r
291          */\r
292         private boolean msecPassed(int ts) {\r
293                 return (((int) System.currentTimeMillis() - ts) > 0);\r
294         }\r
295 }\r