Subversion Repositories Kolibri OS

Rev

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