Subversion Repositories Kolibri OS

Rev

Rev 9628 | Rev 9659 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 9628 Rev 9648
Line 42... Line 42...
42
    disBackColor = backColor;
42
    disBackColor = backColor;
43
    disForeColor = 808080H;
43
    disForeColor = 808080H;
44
    disSelBackColor = 0E4E4E4H;
44
    disSelBackColor = 0E4E4E4H;
45
    disSelForeColor = disForeColor;
45
    disSelForeColor = disForeColor;
Line -... Line 46...
-
 
46
 
-
 
47
	SHIFT* = 256;
-
 
48
	CTRL*  = 512;
Line 46... Line 49...
46
 
49
 
Line 47... Line 50...
47
 
50
 
Line 62... Line 65...
62
        selItem, cliItem: INTEGER;
65
        selItem, cliItem: INTEGER;
Line 63... Line 66...
63
 
66
 
64
        font: G.tFont;
67
        font: G.tFont;
Line 65... Line 68...
65
        canvas: G.tCanvas;
68
        canvas: G.tCanvas;
66
 
-
 
67
        items: List.tList;
-
 
68
        click: PROCEDURE (menu: tMenu; id: INTEGER);
69
 
Line 69... Line 70...
69
        key: PROCEDURE (menu: tMenu; key: INTEGER): BOOLEAN
70
        items: List.tList
70
    END;
71
    END;
71
 
72
 
Line 81... Line 82...
81
        text: ARRAY 32 OF WCHAR;
82
        text: ARRAY 32 OF WCHAR;
82
        menu*: tMenu;
83
        menu*: tMenu;
83
        main: tMain
84
        main: tMain
84
    END;
85
    END;
Line -... Line 86...
-
 
86
 
-
 
87
    tShortcut = POINTER TO RECORD (List.tItem)
-
 
88
    	key, MenuItem: INTEGER
-
 
89
    END;
85
 
90
 
86
    tClick = PROCEDURE (menu: tMenu; id: INTEGER);
-
 
87
    tKey = PROCEDURE (menu: tMenu; key: INTEGER): BOOLEAN;
91
    tClick = PROCEDURE (menu: tMenu; id: INTEGER);
Line 88... Line 92...
88
    tProc = PROCEDURE;
92
    tProc = PROCEDURE;
-
 
93
 
89
 
94
VAR
90
VAR
95
	MenuItem*: INTEGER;
91
    stack: ARRAY maxLEVEL + 1, 2500 OF INTEGER;
96
    stack: ARRAY maxLEVEL + 1, 2500 OF INTEGER;
92
    TIDs: ARRAY maxLEVEL + 1 OF INTEGER;
97
    TIDs: ARRAY maxLEVEL + 1 OF INTEGER;
-
 
98
    resetTimer: tProc;
93
    resetTimer: tProc;
99
    _open: PROCEDURE (m: tMenu; x, y: INTEGER);
94
    _open: PROCEDURE (m: tMenu; x, y: INTEGER);
100
    shortcuts: List.tList;
95
(*
101
(*
96
    backColor, foreColor, selBackColor, selForeColor,
102
    backColor, foreColor, selBackColor, selForeColor,
Line 320... Line 326...
320
        m.active := FALSE
326
        m.active := FALSE
321
    END
327
    END
322
END close;
328
END close;
Line -... Line 329...
-
 
329
 
-
 
330
 
-
 
331
PROCEDURE SetItem* (id: INTEGER);
-
 
332
BEGIN
-
 
333
	MenuItem := id
-
 
334
END SetItem;
323
 
335
 
324
 
336
 
325
PROCEDURE click (m: tMenu; i: INTEGER);
337
PROCEDURE click (m: tMenu; i: INTEGER);
326
VAR
338
VAR
327
    item: List.tItem;
339
    item: List.tItem;
Line 336... Line 348...
336
	    IF (item # NIL) & item(tItem).enabled & (item(tItem).child = NIL) THEN
348
	    IF (item # NIL) & item(tItem).enabled & (item(tItem).child = NIL) THEN
337
	    	id := item(tItem).id
349
	    	id := item(tItem).id
338
	    END
350
	    END
339
    END;
351
    END;
340
    IF id # -1 THEN
352
    IF id # -1 THEN
341
	    m.click(m, id);
353
    	SetItem(id);
342
	    p := m.parent;
354
	    p := m.parent;
343
	   	WHILE p # NIL DO
355
	   	WHILE p # NIL DO
344
	   		p.child := NIL;
356
	   		p.child := NIL;
345
	   		close(p);
357
	   		close(p);
346
	   		p := p.parent
358
	   		p := p.parent
Line 389... Line 401...
389
    END
401
    END
390
    RETURN res
402
    RETURN res
391
END submenu;
403
END submenu;
Line -... Line 404...
-
 
404
 
-
 
405
 
-
 
406
PROCEDURE getShortcut (key: INTEGER): BOOLEAN;
-
 
407
VAR
-
 
408
	item: tShortcut;
-
 
409
	res: INTEGER;
-
 
410
BEGIN
-
 
411
	item := shortcuts.first(tShortcut);
-
 
412
	WHILE (item # NIL) & (item.key # key) DO
-
 
413
		item := item.next(tShortcut)
-
 
414
	END;
-
 
415
	IF item # NIL THEN
-
 
416
		res := item.MenuItem
-
 
417
	ELSE
-
 
418
		res := 0
-
 
419
	END;
-
 
420
	SetItem(res)
-
 
421
	RETURN res # 0
-
 
422
END getShortcut;
392
 
423
 
393
 
424
 
394
PROCEDURE [stdcall] window (m: tMenu);
425
PROCEDURE [stdcall] window (m: tMenu);
395
VAR
426
VAR
396
    x, y: INTEGER;
427
    x, y: INTEGER;
Line 407... Line 438...
407
        |0:
438
        |0:
408
        |1:
439
        |1:
409
            draw_window(m)
440
            draw_window(m)
410
        |2:
441
        |2:
411
        	K.getKBState(shift, ctrl);
442
        	K.getKBState(shift, ctrl);
412
            key := K.GetKey();
443
            key := K.GetKey() DIV 65536;
413
            IF ~shift & ~ ctrl THEN
444
		    IF shift THEN
-
 
445
		    	INC(key, SHIFT)
-
 
446
		    END;
-
 
447
		    IF ctrl THEN
-
 
448
		    	INC(key, CTRL)
-
 
449
		    END;
-
 
450
 
414
	            IF key DIV 65536 = 72 THEN
451
        	CASE key OF
-
 
452
            |72:
415
	                m.selItem := (m.selItem - 1) MOD m.items.count
453
                m.selItem := (m.selItem - 1) MOD m.items.count
416
	            ELSIF key DIV 65536 = 80 THEN
454
            |80:
417
	                m.selItem := (m.selItem + 1) MOD m.items.count
455
                m.selItem := (m.selItem + 1) MOD m.items.count
418
	            ELSIF key DIV 65536 = 28 THEN
456
            |28:
419
	                IF m.selItem >= 0 THEN
457
                IF m.selItem >= 0 THEN
420
	                    click(m, m.selItem)
458
                    click(m, m.selItem)
421
	                END;
459
                END;
422
	                m.cliItem := -1
460
                m.cliItem := -1
423
	            ELSIF key DIV 65536 = 77 THEN
461
            |77:
424
	                IF ~submenu(m, TRUE) THEN
462
                IF ~submenu(m, TRUE) THEN
425
	                	click(m, -(getMainID(m) + 1))
463
                	click(m, -(getMainID(m) + 1))
426
	                END;
464
                END;
427
	                m.cliItem := -1
465
                m.cliItem := -1
428
	            ELSIF key DIV 65536 = 75 THEN
466
            |75:
429
	            	IF m.parent # NIL THEN
467
            	IF m.parent # NIL THEN
430
	                	escape(m)
468
                	escape(m)
431
	            	ELSE
469
            	ELSE
432
	            		click(m, -(getMainID(m) - 1))
470
            		click(m, -(getMainID(m) - 1))
433
	                END;
471
                END;
434
	                m.cliItem := -1
472
                m.cliItem := -1
435
	            ELSIF key DIV 65536 = 1 THEN
473
            |1:
436
	            	escape(m)
474
            	escape(m)
437
	            ELSE
475
            ELSE
438
	                IF m.key(m, key) THEN
476
	            IF getShortcut(key) THEN
439
	                	IF m.parent # NIL THEN
-
 
440
	                		temp := m.parent.tid;
-
 
441
	                		m.parent.tid := 0;
-
 
442
	                		K.ExitID(temp)
-
 
443
	                	END;
-
 
444
	                    exit(m)
-
 
445
	                END
-
 
446
                END
-
 
447
            ELSE
-
 
448
                IF m.key(m, key) THEN
-
 
449
                	IF m.parent # NIL THEN
477
	            	IF m.parent # NIL THEN
450
                		temp := m.parent.tid;
478
	            		temp := m.parent.tid;
451
                		m.parent.tid := 0;
479
	            		m.parent.tid := 0;
452
                		K.ExitID(temp)
480
	            		K.ExitID(temp)
453
                	END;
481
	            	END;
Line 591... Line 619...
591
    item := getItem(m, id)
619
    item := getItem(m, id)
592
    RETURN (item # NIL) & item.enabled
620
    RETURN (item # NIL) & item.enabled
593
END isEnabled;
621
END isEnabled;
Line 594... Line 622...
594
 
622
 
595
 
623
 
596
PROCEDURE create* (items: List.tList; click: tClick; key: tKey): tMenu;
624
PROCEDURE create* (items: List.tList): tMenu;
597
VAR
625
VAR
598
    m: tMenu;
626
    m: tMenu;
599
    maxLength: INTEGER;
627
    maxLength: INTEGER;
Line 604... Line 632...
604
    m.active := FALSE;
632
    m.active := FALSE;
605
    m.parent := NIL;
633
    m.parent := NIL;
606
    m.child := NIL;
634
    m.child := NIL;
607
    m.mainID := 0;
635
    m.mainID := 0;
608
    m.items  := items;
636
    m.items  := items;
609
    m.click := click;
-
 
610
    m.key := key;
-
 
611
    maxLength := 0;
637
    maxLength := 0;
612
    item := items.first(tItem);
638
    item := items.first(tItem);
613
    WHILE item # NIL DO
639
    WHILE item # NIL DO
614
        maxLength := MAX(maxLength, LENGTH(item.text));
640
        maxLength := MAX(maxLength, LENGTH(item.text));
615
        item := item.next(tItem)
641
        item := item.next(tItem)
Line 621... Line 647...
621
    G.SetFont(m.canvas, m.font);
647
    G.SetFont(m.canvas, m.font);
622
    RETURN m
648
    RETURN m
623
END create;
649
END create;
Line -... Line 650...
-
 
650
 
-
 
651
 
-
 
652
PROCEDURE AddShortcut* (key, MenuItem: INTEGER);
-
 
653
VAR
-
 
654
	item: tShortcut;
-
 
655
BEGIN
-
 
656
	NEW(item);
-
 
657
	item.key := key;
-
 
658
	item.MenuItem := MenuItem;
-
 
659
	List.append(shortcuts, item)
-
 
660
END AddShortcut;
624
 
661
 
625
 
662
 
626
PROCEDURE init* (_resetTimer: tProc);
663
PROCEDURE init* (_resetTimer: tProc);
627
VAR
664
VAR
-
 
665
	i: INTEGER;
-
 
666
BEGIN
628
	i: INTEGER;
667
	SetItem(0);
629
BEGIN
668
	shortcuts := List.create(NIL);
630
	resetTimer := _resetTimer;
669
	resetTimer := _resetTimer;
631
	_open := open;
670
	_open := open;
632
	FOR i := 0 TO maxLEVEL DO
671
	FOR i := 0 TO maxLEVEL DO