Rev 8762 | Rev 9175 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 8762 | Rev 9174 | ||
---|---|---|---|
Line 21... | Line 21... | ||
21 | 21 | ||
22 | IMPORT |
22 | IMPORT |
Line 23... | Line 23... | ||
23 | SYSTEM, G := Graph, List, K := KolibriOS; |
23 | SYSTEM, G := Graph, List, K := KolibriOS; |
24 | 24 | ||
25 | CONST |
25 | CONST |
Line 26... | Line 26... | ||
26 | fontHeight = 20; |
26 | fontHeight = 22; |
27 | fontWidth = 8; |
27 | fontWidth = 8; |
28 | 28 | ||
Line -... | Line 29... | ||
- | 29 | RIGHT = 16; |
|
- | 30 | LEFT = 16; |
|
29 | RIGHT = 16; |
31 | TOP = 1; |
30 | LEFT = 16; |
32 | |
31 | TOP = 1; |
33 | maxLEVEL = 1; |
32 | 34 | ||
33 | backColor = 0F0F0F0H; |
35 | backColor = 0F0F0F0H; |
Line 39... | Line 41... | ||
39 | disSelBackColor = 0E4E4E4H; |
41 | disSelBackColor = 0E4E4E4H; |
40 | disSelForeColor = disForeColor; |
42 | disSelForeColor = disForeColor; |
Line 41... | Line 43... | ||
41 | 43 | ||
42 | - | ||
43 | TYPE |
- | |
44 | tItem* = POINTER TO RECORD (List.tItem) |
- | |
45 | id*, check: INTEGER; |
- | |
46 | text: ARRAY 32 OF WCHAR; |
- | |
Line 47... | Line 44... | ||
47 | enabled, delim: BOOLEAN |
44 | |
48 | END; |
45 | TYPE |
- | 46 | ||
- | 47 | tMenu* = POINTER TO RECORD |
|
49 | 48 | tid*: INTEGER; |
|
50 | tMenu* = POINTER TO RECORD |
49 | active*: BOOLEAN; |
Line 51... | Line 50... | ||
51 | tid*: INTEGER; |
50 | parent*, child: tMenu; |
52 | winX, winY, width*, height*: INTEGER; |
51 | winX, winY, width*, height*: INTEGER; |
Line 58... | Line 57... | ||
58 | items: List.tList; |
57 | items: List.tList; |
59 | click: PROCEDURE (menu: tMenu; id: INTEGER); |
58 | click: PROCEDURE (menu: tMenu; id: INTEGER); |
60 | key: PROCEDURE (menu: tMenu; key: INTEGER): BOOLEAN |
59 | key: PROCEDURE (menu: tMenu; key: INTEGER): BOOLEAN |
61 | END; |
60 | END; |
Line -... | Line 61... | ||
- | 61 | ||
- | 62 | tItem* = POINTER TO RECORD (List.tItem) |
|
- | 63 | id*, check: INTEGER; |
|
- | 64 | text: ARRAY 32 OF WCHAR; |
|
- | 65 | enabled, delim: BOOLEAN; |
|
- | 66 | child: tMenu |
|
- | 67 | END; |
|
62 | 68 | ||
63 | tClick = PROCEDURE (menu: tMenu; id: INTEGER); |
69 | tClick = PROCEDURE (menu: tMenu; id: INTEGER); |
- | 70 | tKey = PROCEDURE (menu: tMenu; key: INTEGER): BOOLEAN; |
|
Line 64... | Line 71... | ||
64 | tKey = PROCEDURE (menu: tMenu; key: INTEGER): BOOLEAN; |
71 | tProc = PROCEDURE; |
- | 72 | ||
- | 73 | VAR |
|
65 | 74 | stack: ARRAY maxLEVEL + 1, 250000 OF INTEGER; |
|
66 | VAR |
75 | TIDs: ARRAY maxLEVEL + 1 OF INTEGER; |
- | 76 | resetTimer: tProc; |
|
- | 77 | _open: PROCEDURE (m: tMenu; x, y: INTEGER); |
|
- | 78 | redraw*: BOOLEAN; |
|
- | 79 | ||
- | 80 | ||
- | 81 | PROCEDURE isSender* (tid: INTEGER): BOOLEAN; |
|
- | 82 | VAR |
|
- | 83 | i: INTEGER; |
|
- | 84 | BEGIN |
|
- | 85 | i := 0; |
|
- | 86 | WHILE (i <= maxLEVEL) & (TIDs[i] # tid) DO |
|
- | 87 | INC(i) |
|
- | 88 | END |
|
Line 67... | Line 89... | ||
67 | lastTID*: INTEGER; |
89 | RETURN i <= maxLEVEL |
68 | stack: ARRAY 250000 OF INTEGER; |
90 | END isSender; |
69 | 91 | ||
- | 92 | ||
- | 93 | PROCEDURE exit (m: tMenu); |
|
70 | 94 | BEGIN |
|
71 | PROCEDURE exit (m: tMenu); |
95 | m.tid := 0; |
Line 72... | Line 96... | ||
72 | BEGIN |
96 | m.active := FALSE; |
73 | m.tid := 0; |
97 | resetTimer; |
74 | K.Exit |
98 | K.Exit |
75 | END exit; |
99 | END exit; |
76 | 100 | ||
77 | 101 | ||
Line 78... | Line 102... | ||
78 | PROCEDURE repaint (m: tMenu); |
102 | PROCEDURE repaint (m: tMenu); |
Line 113... | Line 137... | ||
113 | G.FillRect(canvas, 1, y, m.width - 1, y + fontHeight - 4); |
137 | G.FillRect(canvas, 1, y, m.width - 1, y + fontHeight - 4); |
114 | G.SetTextColor(canvas, TextColor); |
138 | G.SetTextColor(canvas, TextColor); |
115 | G.SetBkColor(canvas, BkColor); |
139 | G.SetBkColor(canvas, BkColor); |
116 | G.TextOut2(canvas, LEFT, y + (fontHeight - 16) DIV 2 - 2, item.text, LENGTH(item.text)); |
140 | G.TextOut2(canvas, LEFT, y + (fontHeight - 16) DIV 2 - 2, item.text, LENGTH(item.text)); |
Line 117... | Line -... | ||
117 | - | ||
118 | IF item.check = 1 THEN |
141 | |
- | 142 | G.SetColor(canvas, TextColor); |
|
119 | G.SetColor(canvas, TextColor); |
143 | IF item.check = 1 THEN |
120 | G.DLine(canvas, 4, 7, y + (fontHeight - 16) DIV 2 + 5, -1); |
144 | G.DLine(canvas, 4, 7, y + (fontHeight - 16) DIV 2 + 5, -1); |
121 | G.DLine(canvas, 4, 7, y + (fontHeight - 16) DIV 2 + 6, -1); |
145 | G.DLine(canvas, 4, 7, y + (fontHeight - 16) DIV 2 + 6, -1); |
122 | G.DLine(canvas, 7, 12, y + (fontHeight - 16) DIV 2 + 8, 1); |
146 | G.DLine(canvas, 7, 12, y + (fontHeight - 16) DIV 2 + 8, 1); |
123 | G.DLine(canvas, 7, 12, y + (fontHeight - 16) DIV 2 + 9, 1); |
147 | G.DLine(canvas, 7, 12, y + (fontHeight - 16) DIV 2 + 9, 1); |
124 | ELSIF item.check = 2 THEN |
- | |
125 | G.SetColor(canvas, TextColor); |
148 | ELSIF item.check = 2 THEN |
126 | G.FillRect(canvas, 6, y + fontHeight DIV 2 - 4, 10, y + fontHeight DIV 2) |
149 | G.FillRect(canvas, 6, y + fontHeight DIV 2 - 4, 10, y + fontHeight DIV 2) |
Line -... | Line 150... | ||
- | 150 | END; |
|
- | 151 | ||
- | 152 | IF item.child # NIL THEN |
|
- | 153 | X := m.width - 9; |
|
- | 154 | Y1 := y + (fontHeight - 16) DIV 2 + 2; |
|
- | 155 | Y2 := Y1 + 8; |
|
- | 156 | G.Triangle(canvas, X, Y1, X, Y2, G.triRight) |
|
127 | END; |
157 | END; |
128 | 158 | ||
129 | INC(y, fontHeight); |
159 | INC(y, fontHeight); |
130 | IF item.delim THEN |
160 | IF item.delim THEN |
131 | G.SetColor(canvas, ORD((-BITS(backColor))*{0..23})); |
161 | G.SetColor(canvas, ORD((-BITS(backColor))*{0..23})); |
Line 155... | Line 185... | ||
155 | x := mouseX - m.winX; |
185 | x := mouseX - m.winX; |
156 | y := mouseY - m.winY; |
186 | y := mouseY - m.winY; |
157 | END mouse; |
187 | END mouse; |
Line -... | Line 188... | ||
- | 188 | ||
- | 189 | ||
- | 190 | PROCEDURE close* (m: tMenu); |
|
- | 191 | BEGIN |
|
- | 192 | IF (m # NIL) & (m.tid # 0) THEN |
|
- | 193 | IF m.child # NIL THEN |
|
- | 194 | close(m.child); |
|
- | 195 | m.child := NIL |
|
- | 196 | END; |
|
- | 197 | K.ExitID(m.tid); |
|
- | 198 | m.tid := 0; |
|
- | 199 | m.active := FALSE |
|
- | 200 | END |
|
- | 201 | END close; |
|
158 | 202 | ||
159 | 203 | ||
160 | PROCEDURE click (m: tMenu; i: INTEGER); |
204 | PROCEDURE click (m: tMenu; i: INTEGER); |
- | 205 | VAR |
|
161 | VAR |
206 | item: List.tItem; |
162 | item: List.tItem; |
207 | p: tMenu; |
163 | BEGIN |
208 | BEGIN |
164 | item := List.getItem(m.items, i); |
209 | item := List.getItem(m.items, i); |
- | 210 | IF (item # NIL) & item(tItem).enabled & (item(tItem).child = NIL) THEN |
|
- | 211 | m.click(m, item(tItem).id); |
|
- | 212 | p := m.parent; |
|
- | 213 | WHILE p # NIL DO |
|
- | 214 | p.child := NIL; |
|
- | 215 | close(p); |
|
- | 216 | p := p.parent |
|
165 | IF (item # NIL) & item(tItem).enabled THEN |
217 | END; |
166 | m.click(m, item(tItem).id); |
218 | redraw := TRUE; |
167 | exit(m) |
219 | exit(m) |
Line -... | Line 220... | ||
- | 220 | END |
|
- | 221 | END click; |
|
- | 222 | ||
- | 223 | ||
- | 224 | PROCEDURE opened* (m: tMenu): BOOLEAN; |
|
- | 225 | RETURN m.tid # 0 |
|
- | 226 | END opened; |
|
- | 227 | ||
- | 228 | ||
- | 229 | PROCEDURE isActive (m: tMenu): BOOLEAN; |
|
- | 230 | RETURN (m # NIL) & ((m.tid # 0) & m.active OR isActive(m.child)) |
|
- | 231 | END isActive; |
|
- | 232 | ||
- | 233 | ||
- | 234 | PROCEDURE closeChild (m: tMenu); |
|
- | 235 | BEGIN |
|
- | 236 | IF m.child # NIL THEN |
|
- | 237 | redraw := FALSE; |
|
- | 238 | close(m.child); |
|
- | 239 | m.child := NIL |
|
- | 240 | END |
|
- | 241 | END closeChild; |
|
- | 242 | ||
- | 243 | ||
- | 244 | PROCEDURE submenu (m: tMenu); |
|
- | 245 | VAR |
|
- | 246 | item: List.tItem; |
|
- | 247 | BEGIN |
|
- | 248 | item := List.getItem(m.items, m.selItem); |
|
- | 249 | IF (item # NIL) & item(tItem).enabled & (item(tItem).child # NIL) THEN |
|
- | 250 | IF ~opened(item(tItem).child) THEN |
|
- | 251 | closeChild(m); |
|
- | 252 | _open(item(tItem).child, m.winX + m.width - 2, m.winY + m.selItem*fontHeight); |
|
- | 253 | m.child := item(tItem).child |
|
- | 254 | END |
|
- | 255 | ELSE |
|
- | 256 | closeChild(m) |
|
168 | END |
257 | END |
169 | END click; |
258 | END submenu; |
170 | 259 | ||
171 | 260 | ||
172 | PROCEDURE [stdcall] window (m: tMenu); |
261 | PROCEDURE [stdcall] window (m: tMenu); |
Line 197... | Line 286... | ||
197 | ELSIF key DIV 65536 = 28 THEN |
286 | ELSIF key DIV 65536 = 28 THEN |
198 | IF m.selItem >= 0 THEN |
287 | IF m.selItem >= 0 THEN |
199 | click(m, m.selItem) |
288 | click(m, m.selItem) |
200 | END; |
289 | END; |
201 | m.cliItem := -1 |
290 | m.cliItem := -1 |
- | 291 | ELSIF key DIV 65536 = 77 THEN |
|
- | 292 | submenu(m) |
|
- | 293 | ELSIF key DIV 65536 = 75 THEN |
|
- | 294 | IF m.parent # NIL THEN |
|
- | 295 | exit(m) |
|
- | 296 | END |
|
202 | ELSE |
297 | ELSE |
203 | IF m.key(m, key) THEN |
298 | IF m.key(m, key) THEN |
204 | exit(m) |
299 | exit(m) |
205 | END |
300 | END |
206 | END; |
301 | END; |
207 | repaint(m) |
302 | repaint(m) |
208 | |6: |
303 | |6: |
209 | msState := K.MouseState(); |
304 | msState := K.MouseState(); |
210 | mouse(m, x, y); |
305 | mouse(m, x, y); |
211 | IF (0 <= x) & (x < m.width) & (0 <= y) & (y < m.height) THEN |
306 | IF (0 <= x) & (x < m.width) & (0 <= y) & (y < m.height) THEN |
- | 307 | m.active := TRUE; |
|
212 | m.selItem := (y - TOP) DIV fontHeight; |
308 | m.selItem := (y - TOP) DIV fontHeight; |
213 | IF 8 IN msState THEN |
309 | IF 8 IN msState THEN |
214 | m.cliItem := (y - TOP) DIV fontHeight |
310 | m.cliItem := (y - TOP) DIV fontHeight |
215 | END; |
311 | END; |
216 | IF 16 IN msState THEN |
312 | IF 16 IN msState THEN |
Line 218... | Line 314... | ||
218 | click(m, m.cliItem) |
314 | click(m, m.cliItem) |
219 | END; |
315 | END; |
220 | m.cliItem := -1 |
316 | m.cliItem := -1 |
221 | END |
317 | END |
222 | ELSE |
318 | ELSE |
- | 319 | m.active := FALSE; |
|
223 | m.cliItem := -1; |
320 | m.cliItem := -1; |
224 | IF {8, 9, 10} * msState # {} THEN |
321 | IF ({8, 9, 10, 16} * msState # {}) & ~isActive(m.child) THEN |
225 | exit(m) |
322 | exit(m) |
226 | END |
323 | END |
227 | END; |
324 | END; |
228 | repaint(m) |
325 | repaint(m); |
- | 326 | submenu(m) |
|
229 | END |
327 | END |
230 | END |
328 | END |
231 | END window; |
329 | END window; |
Line -... | Line 330... | ||
- | 330 | ||
- | 331 | ||
- | 332 | PROCEDURE level (m: tMenu): INTEGER; |
|
- | 333 | VAR |
|
- | 334 | res: INTEGER; |
|
- | 335 | BEGIN |
|
- | 336 | res := 0; |
|
- | 337 | WHILE m.parent # NIL DO |
|
- | 338 | INC(res); |
|
- | 339 | m := m.parent |
|
- | 340 | END |
|
- | 341 | RETURN res |
|
- | 342 | END level; |
|
- | 343 | ||
- | 344 | ||
- | 345 | PROCEDURE open* (m: tMenu; x, y: INTEGER); |
|
- | 346 | VAR |
|
- | 347 | L: INTEGER; |
|
- | 348 | BEGIN |
|
- | 349 | IF m.tid = 0 THEN |
|
- | 350 | m.winX := x; |
|
- | 351 | m.winY := y; |
|
- | 352 | L := level(m); |
|
- | 353 | SYSTEM.PUT(SYSTEM.ADR(stack[L][LEN(stack[0]) - 1]), m); |
|
- | 354 | m.tid := K.CreateThread(SYSTEM.ADR(window), stack[L]); |
|
- | 355 | TIDs[L] := m.tid |
|
- | 356 | END |
|
- | 357 | END open; |
|
232 | 358 | ||
233 | 359 | ||
234 | PROCEDURE AddMenuItem* (items: List.tList; id: INTEGER; s: ARRAY OF WCHAR); |
360 | PROCEDURE AddMenuItem* (items: List.tList; id: INTEGER; s: ARRAY OF WCHAR); |
235 | VAR |
361 | VAR |
236 | item: tItem; |
362 | item: tItem; |
237 | BEGIN |
363 | BEGIN |
238 | NEW(item); |
364 | NEW(item); |
239 | item.id := id; |
365 | item.id := id; |
240 | item.text := s; |
366 | item.text := s; |
- | 367 | item.enabled := TRUE; |
|
241 | item.enabled := TRUE; |
368 | item.delim := FALSE; |
242 | item.delim := FALSE; |
369 | item.child := NIL; |
Line 243... | Line 370... | ||
243 | List.append(items, item); |
370 | List.append(items, item); |
244 | END AddMenuItem; |
371 | END AddMenuItem; |
245 | 372 | ||
246 | 373 | ||
Line -... | Line 374... | ||
- | 374 | PROCEDURE delimiter* (items: List.tList); |
|
- | 375 | BEGIN |
|
- | 376 | items.last(tItem).delim := TRUE |
|
- | 377 | END delimiter; |
|
- | 378 | ||
- | 379 | ||
247 | PROCEDURE delimiter* (items: List.tList); |
380 | PROCEDURE child* (items: List.tList; menu: tMenu); |
248 | BEGIN |
381 | BEGIN |
249 | items.last(tItem).delim := TRUE |
382 | items.last(tItem).child := menu |
250 | END delimiter; |
383 | END child; |
251 | 384 | ||
Line 291... | Line 424... | ||
291 | item := getItem(m, id) |
424 | item := getItem(m, id) |
292 | RETURN (item # NIL) & item.enabled |
425 | RETURN (item # NIL) & item.enabled |
293 | END isEnabled; |
426 | END isEnabled; |
Line 294... | Line -... | ||
294 | - | ||
295 | - | ||
296 | PROCEDURE opened* (m: tMenu): BOOLEAN; |
- | |
297 | RETURN m.tid # 0 |
- | |
298 | END opened; |
- | |
299 | - | ||
300 | - | ||
301 | PROCEDURE open* (m: tMenu; x, y: INTEGER); |
- | |
302 | BEGIN |
- | |
303 | IF m.tid = 0 THEN |
- | |
304 | m.winX := x; |
- | |
305 | m.winY := y; |
- | |
306 | SYSTEM.PUT(SYSTEM.ADR(stack[LEN(stack) - 1]), m); |
- | |
307 | lastTID := K.CreateThread(SYSTEM.ADR(window), stack); |
- | |
308 | m.tid := lastTID |
- | |
309 | END |
- | |
310 | END open; |
- | |
311 | - | ||
312 | - | ||
313 | PROCEDURE close* (m: tMenu); |
- | |
314 | BEGIN |
- | |
315 | IF m.tid # 0 THEN |
- | |
316 | K.ExitID(m.tid); |
- | |
317 | m.tid := 0 |
- | |
318 | END |
- | |
319 | END close; |
- | |
320 | 427 | ||
321 | 428 | ||
322 | PROCEDURE create* (items: List.tList; click: tClick; key: tKey): tMenu; |
429 | PROCEDURE create* (items: List.tList; click: tClick; key: tKey): tMenu; |
323 | VAR |
430 | VAR |
324 | m: tMenu; |
431 | m: tMenu; |
325 | maxLength: INTEGER; |
432 | maxLength: INTEGER; |
326 | item: tItem; |
433 | item: tItem; |
327 | BEGIN |
434 | BEGIN |
- | 435 | NEW(m); |
|
- | 436 | m.tid := 0; |
|
- | 437 | m.active := FALSE; |
|
328 | NEW(m); |
438 | m.parent := NIL; |
329 | m.tid := 0; |
439 | m.child := NIL; |
330 | m.items := items; |
440 | m.items := items; |
331 | m.click := click; |
441 | m.click := click; |
332 | m.key := key; |
442 | m.key := key; |
Line 343... | Line 453... | ||
343 | G.SetFont(m.canvas, m.font); |
453 | G.SetFont(m.canvas, m.font); |
344 | RETURN m |
454 | RETURN m |
345 | END create; |
455 | END create; |
Line -... | Line 456... | ||
- | 456 | ||
- | 457 | ||
- | 458 | PROCEDURE Redraw*; |
|
- | 459 | BEGIN |
|
- | 460 | redraw := TRUE |
|
- | 461 | END Redraw; |
|
- | 462 | ||
- | 463 | ||
- | 464 | PROCEDURE init* (_resetTimer: tProc); |
|
346 | 465 | VAR |
|
- | 466 | i: INTEGER; |
|
- | 467 | BEGIN |
|
- | 468 | Redraw; |
|
- | 469 | resetTimer := _resetTimer; |
|
347 | 470 | _open := open; |
|
- | 471 | FOR i := 0 TO maxLEVEL DO |
|
- | 472 | TIDs[i] := 0 |
|
- | 473 | END |
|
- | 474 | END init; |
|
348 | BEGIN |
475 | |
349 | lastTID := 0 |
476 |