Subversion Repositories Kolibri OS

Rev

Rev 8762 | Rev 9175 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 8762 Rev 9174
1
(*
1
(*
2
    Copyright 2021 Anton Krotov
2
    Copyright 2021 Anton Krotov
3
 
3
 
4
    This file is part of CEdit.
4
    This file is part of CEdit.
5
 
5
 
6
    CEdit is free software: you can redistribute it and/or modify
6
    CEdit is free software: you can redistribute it and/or modify
7
    it under the terms of the GNU General Public License as published by
7
    it under the terms of the GNU General Public License as published by
8
    the Free Software Foundation, either version 3 of the License, or
8
    the Free Software Foundation, either version 3 of the License, or
9
    (at your option) any later version.
9
    (at your option) any later version.
10
 
10
 
11
    CEdit is distributed in the hope that it will be useful,
11
    CEdit is distributed in the hope that it will be useful,
12
    but WITHOUT ANY WARRANTY; without even the implied warranty of
12
    but WITHOUT ANY WARRANTY; without even the implied warranty of
13
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
    GNU General Public License for more details.
14
    GNU General Public License for more details.
15
 
15
 
16
    You should have received a copy of the GNU General Public License
16
    You should have received a copy of the GNU General Public License
17
    along with CEdit. If not, see .
17
    along with CEdit. If not, see .
18
*)
18
*)
19
 
19
 
20
MODULE Menu;
20
MODULE Menu;
21
 
21
 
22
IMPORT
22
IMPORT
23
    SYSTEM, G := Graph, List, K := KolibriOS;
23
    SYSTEM, G := Graph, List, K := KolibriOS;
24
 
24
 
25
CONST
25
CONST
26
    fontHeight = 20;
26
    fontHeight = 22;
27
    fontWidth = 8;
27
    fontWidth = 8;
28
 
28
 
29
    RIGHT = 16;
29
    RIGHT = 16;
30
    LEFT = 16;
30
    LEFT = 16;
31
    TOP = 1;
31
    TOP = 1;
-
 
32
 
-
 
33
    maxLEVEL = 1;
32
 
34
 
33
    backColor = 0F0F0F0H;
35
    backColor = 0F0F0F0H;
34
    foreColor = 0;
36
    foreColor = 0;
35
    selBackColor = 091C9F7H;
37
    selBackColor = 091C9F7H;
36
    selForeColor = 0;
38
    selForeColor = 0;
37
    disBackColor = backColor;
39
    disBackColor = backColor;
38
    disForeColor = 808080H;
40
    disForeColor = 808080H;
39
    disSelBackColor = 0E4E4E4H;
41
    disSelBackColor = 0E4E4E4H;
40
    disSelForeColor = disForeColor;
42
    disSelForeColor = disForeColor;
41
 
43
 
42
 
44
 
43
TYPE
45
TYPE
44
    tItem* = POINTER TO RECORD (List.tItem)
-
 
45
        id*, check: INTEGER;
-
 
46
        text: ARRAY 32 OF WCHAR;
-
 
47
        enabled, delim: BOOLEAN
-
 
48
    END;
-
 
49
 
46
 
50
    tMenu* = POINTER TO RECORD
47
    tMenu* = POINTER TO RECORD
51
        tid*: INTEGER;
48
        tid*: INTEGER;
-
 
49
        active*: BOOLEAN;
-
 
50
        parent*, child: tMenu;
52
        winX, winY, width*, height*: INTEGER;
51
        winX, winY, width*, height*: INTEGER;
53
        selItem, cliItem: INTEGER;
52
        selItem, cliItem: INTEGER;
54
 
53
 
55
        font: G.tFont;
54
        font: G.tFont;
56
        canvas: G.tCanvas;
55
        canvas: G.tCanvas;
57
 
56
 
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;
-
 
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;
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
67
    lastTID*: INTEGER;
89
	RETURN i <= maxLEVEL
68
    stack: ARRAY 250000 OF INTEGER;
90
END isSender;
69
 
91
 
70
 
92
 
71
PROCEDURE exit (m: tMenu);
93
PROCEDURE exit (m: tMenu);
72
BEGIN
94
BEGIN
73
    m.tid := 0;
95
    m.tid := 0;
-
 
96
    m.active := FALSE;
-
 
97
    resetTimer;
74
    K.Exit
98
    K.Exit
75
END exit;
99
END exit;
76
 
100
 
77
 
101
 
78
PROCEDURE repaint (m: tMenu);
102
PROCEDURE repaint (m: tMenu);
79
VAR
103
VAR
80
    y, i: INTEGER;
104
    y, i, X, Y1, Y2: INTEGER;
81
    item: tItem;
105
    item: tItem;
82
    BkColor, TextColor: INTEGER;
106
    BkColor, TextColor: INTEGER;
83
    canvas: G.tCanvas;
107
    canvas: G.tCanvas;
84
 
108
 
85
BEGIN
109
BEGIN
86
    canvas := m.canvas;
110
    canvas := m.canvas;
87
    G.SetColor(canvas, backColor);
111
    G.SetColor(canvas, backColor);
88
    G.clear(canvas);
112
    G.clear(canvas);
89
    G.SetColor(canvas, ORD((-BITS(backColor))*{0..23}) );
113
    G.SetColor(canvas, ORD((-BITS(backColor))*{0..23}) );
90
    G.Rect(canvas, 0, 0, m.width, m.height);
114
    G.Rect(canvas, 0, 0, m.width, m.height);
91
    y := TOP;
115
    y := TOP;
92
    i := 0;
116
    i := 0;
93
    item := m.items.first(tItem);
117
    item := m.items.first(tItem);
94
    WHILE item # NIL DO
118
    WHILE item # NIL DO
95
        IF item.enabled THEN
119
        IF item.enabled THEN
96
            IF i # m.selItem THEN
120
            IF i # m.selItem THEN
97
                BkColor := backColor;
121
                BkColor := backColor;
98
                TextColor := foreColor
122
                TextColor := foreColor
99
            ELSE
123
            ELSE
100
                BkColor := selBackColor;
124
                BkColor := selBackColor;
101
                TextColor := selForeColor
125
                TextColor := selForeColor
102
            END
126
            END
103
        ELSE
127
        ELSE
104
            IF i # m.selItem THEN
128
            IF i # m.selItem THEN
105
                BkColor := disBackColor;
129
                BkColor := disBackColor;
106
                TextColor := disForeColor
130
                TextColor := disForeColor
107
            ELSE
131
            ELSE
108
                BkColor := disSelBackColor;
132
                BkColor := disSelBackColor;
109
                TextColor := disSelForeColor
133
                TextColor := disSelForeColor
110
            END
134
            END
111
        END;
135
        END;
112
        G.SetColor(canvas, BkColor);
136
        G.SetColor(canvas, BkColor);
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));
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
148
        ELSIF item.check = 2 THEN
125
            G.SetColor(canvas, TextColor);
-
 
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)
127
        END;
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)
-
 
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}));
132
            G.HLine(canvas, y - 2, 1, m.width - 1)
162
            G.HLine(canvas, y - 2, 1, m.width - 1)
133
        END;
163
        END;
134
        INC(i);
164
        INC(i);
135
        item := item.next(tItem)
165
        item := item.next(tItem)
136
    END;
166
    END;
137
    G.DrawCanvas(canvas, 0, 0)
167
    G.DrawCanvas(canvas, 0, 0)
138
END repaint;
168
END repaint;
139
 
169
 
140
 
170
 
141
PROCEDURE draw_window (m: tMenu);
171
PROCEDURE draw_window (m: tMenu);
142
BEGIN
172
BEGIN
143
    K.BeginDraw;
173
    K.BeginDraw;
144
    K.CreateWindow(m.winX, m.winY, m.width, m.height, 0, 61H, 0, 1, "");
174
    K.CreateWindow(m.winX, m.winY, m.width, m.height, 0, 61H, 0, 1, "");
145
    repaint(m);
175
    repaint(m);
146
    K.EndDraw
176
    K.EndDraw
147
END draw_window;
177
END draw_window;
148
 
178
 
149
 
179
 
150
PROCEDURE mouse (m: tMenu; VAR x, y: INTEGER);
180
PROCEDURE mouse (m: tMenu; VAR x, y: INTEGER);
151
VAR
181
VAR
152
    mouseX, mouseY: INTEGER;
182
    mouseX, mouseY: INTEGER;
153
BEGIN
183
BEGIN
154
    K.MousePos(mouseX, mouseY);
184
    K.MousePos(mouseX, mouseY);
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;
158
 
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;
-
 
202
 
159
 
203
 
160
PROCEDURE click (m: tMenu; i: INTEGER);
204
PROCEDURE click (m: tMenu; i: INTEGER);
161
VAR
205
VAR
162
    item: List.tItem;
206
    item: List.tItem;
-
 
207
    p: tMenu;
163
BEGIN
208
BEGIN
164
    item := List.getItem(m.items, i);
209
    item := List.getItem(m.items, i);
165
    IF (item # NIL) & item(tItem).enabled THEN
210
    IF (item # NIL) & item(tItem).enabled & (item(tItem).child = NIL) THEN
166
        m.click(m, item(tItem).id);
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
-
 
217
       	END;
-
 
218
       	redraw := TRUE;
167
        exit(m)
219
       	exit(m)
168
    END
220
    END
169
END click;
221
END click;
170
 
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)
-
 
257
    END
-
 
258
END submenu;
-
 
259
 
171
 
260
 
172
PROCEDURE [stdcall] window (m: tMenu);
261
PROCEDURE [stdcall] window (m: tMenu);
173
VAR
262
VAR
174
    x, y: INTEGER;
263
    x, y: INTEGER;
175
    key: INTEGER;
264
    key: INTEGER;
176
    msState: SET;
265
    msState: SET;
177
BEGIN
266
BEGIN
178
    m.selItem := -1;
267
    m.selItem := -1;
179
    m.cliItem := -1;
268
    m.cliItem := -1;
180
    K.SetEventsMask({0, 1, 5});
269
    K.SetEventsMask({0, 1, 5});
181
    WHILE TRUE DO
270
    WHILE TRUE DO
182
        CASE K.WaitForEvent() OF
271
        CASE K.WaitForEvent() OF
183
        |1:
272
        |1:
184
            draw_window(m)
273
            draw_window(m)
185
        |2:
274
        |2:
186
            key := K.GetKey();
275
            key := K.GetKey();
187
            IF key DIV 65536 = 72 THEN
276
            IF key DIV 65536 = 72 THEN
188
                DEC(m.selItem);
277
                DEC(m.selItem);
189
                IF m.selItem < 0 THEN
278
                IF m.selItem < 0 THEN
190
                    m.selItem := 0
279
                    m.selItem := 0
191
                END
280
                END
192
            ELSIF key DIV 65536 = 80 THEN
281
            ELSIF key DIV 65536 = 80 THEN
193
                INC(m.selItem);
282
                INC(m.selItem);
194
                IF m.selItem >= m.items.count THEN
283
                IF m.selItem >= m.items.count THEN
195
                    m.selItem := m.items.count - 1
284
                    m.selItem := m.items.count - 1
196
                END
285
                END
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
217
                    IF m.cliItem = m.selItem THEN
313
                    IF m.cliItem = m.selItem THEN
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;
232
 
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;
-
 
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;
241
    item.enabled := TRUE;
367
    item.enabled := TRUE;
242
    item.delim := FALSE;
368
    item.delim := FALSE;
-
 
369
    item.child := NIL;
243
    List.append(items, item);
370
    List.append(items, item);
244
END AddMenuItem;
371
END AddMenuItem;
245
 
372
 
246
 
373
 
247
PROCEDURE delimiter* (items: List.tList);
374
PROCEDURE delimiter* (items: List.tList);
248
BEGIN
375
BEGIN
249
    items.last(tItem).delim := TRUE
376
    items.last(tItem).delim := TRUE
250
END delimiter;
377
END delimiter;
251
 
378
 
-
 
379
 
-
 
380
PROCEDURE child* (items: List.tList; menu: tMenu);
-
 
381
BEGIN
-
 
382
    items.last(tItem).child := menu
-
 
383
END child;
-
 
384
 
252
 
385
 
253
PROCEDURE getItem (m: tMenu; id: INTEGER): tItem;
386
PROCEDURE getItem (m: tMenu; id: INTEGER): tItem;
254
VAR
387
VAR
255
    item: tItem;
388
    item: tItem;
256
BEGIN
389
BEGIN
257
    item := m.items.first(tItem);
390
    item := m.items.first(tItem);
258
    WHILE (item # NIL) & (item.id # id) DO
391
    WHILE (item # NIL) & (item.id # id) DO
259
        item := item.next(tItem)
392
        item := item.next(tItem)
260
    END
393
    END
261
    RETURN item
394
    RETURN item
262
END getItem;
395
END getItem;
263
 
396
 
264
 
397
 
265
PROCEDURE setEnabled* (m: tMenu; id: INTEGER; value: BOOLEAN);
398
PROCEDURE setEnabled* (m: tMenu; id: INTEGER; value: BOOLEAN);
266
VAR
399
VAR
267
    item: tItem;
400
    item: tItem;
268
BEGIN
401
BEGIN
269
    item := getItem(m, id);
402
    item := getItem(m, id);
270
    IF item # NIL THEN
403
    IF item # NIL THEN
271
        item.enabled := value
404
        item.enabled := value
272
    END
405
    END
273
END setEnabled;
406
END setEnabled;
274
 
407
 
275
 
408
 
276
PROCEDURE setCheck* (m: tMenu; id: INTEGER; value: INTEGER);
409
PROCEDURE setCheck* (m: tMenu; id: INTEGER; value: INTEGER);
277
VAR
410
VAR
278
    item: tItem;
411
    item: tItem;
279
BEGIN
412
BEGIN
280
    item := getItem(m, id);
413
    item := getItem(m, id);
281
    IF item # NIL THEN
414
    IF item # NIL THEN
282
        item.check := value
415
        item.check := value
283
    END
416
    END
284
END setCheck;
417
END setCheck;
285
 
418
 
286
 
419
 
287
PROCEDURE isEnabled* (m: tMenu; id: INTEGER): BOOLEAN;
420
PROCEDURE isEnabled* (m: tMenu; id: INTEGER): BOOLEAN;
288
VAR
421
VAR
289
    item: tItem;
422
    item: tItem;
290
BEGIN
423
BEGIN
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;
294
 
427
 
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
 
-
 
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
328
    NEW(m);
435
    NEW(m);
329
    m.tid := 0;
436
    m.tid := 0;
-
 
437
    m.active := FALSE;
-
 
438
    m.parent := NIL;
-
 
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;
333
    maxLength := 0;
443
    maxLength := 0;
334
    item := items.first(tItem);
444
    item := items.first(tItem);
335
    WHILE item # NIL DO
445
    WHILE item # NIL DO
336
        maxLength := MAX(maxLength, LENGTH(item.text));
446
        maxLength := MAX(maxLength, LENGTH(item.text));
337
        item := item.next(tItem)
447
        item := item.next(tItem)
338
    END;
448
    END;
339
    m.width  := maxLength*fontWidth + LEFT + RIGHT;
449
    m.width  := maxLength*fontWidth + LEFT + RIGHT;
340
    m.height := items.count*fontHeight - 2;
450
    m.height := items.count*fontHeight - 2;
341
    m.font := G.CreateFont(1, "", {});
451
    m.font := G.CreateFont(1, "", {});
342
    m.canvas := G.CreateCanvas(m.width + 1, m.height + 1);
452
    m.canvas := G.CreateCanvas(m.width + 1, m.height + 1);
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;
346
 
456
 
-
 
457
 
-
 
458
PROCEDURE Redraw*;
-
 
459
BEGIN
-
 
460
	redraw := TRUE
-
 
461
END Redraw;
-
 
462
 
-
 
463
 
-
 
464
PROCEDURE init* (_resetTimer: tProc);
-
 
465
VAR
347
 
466
	i: INTEGER;
-
 
467
BEGIN
-
 
468
	Redraw;
-
 
469
	resetTimer := _resetTimer;
-
 
470
	_open := open;
348
BEGIN
471
	FOR i := 0 TO maxLEVEL DO
-
 
472
		TIDs[i] := 0
-
 
473
	END
-
 
474
END init;
-
 
475
 
349
    lastTID := 0
476
 
350
END Menu.
477
END Menu.