mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			131 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
MODULE ObxControls;
 | 
						|
(**
 | 
						|
    project         = "BlackBox"
 | 
						|
    organization    = "www.oberon.ch"
 | 
						|
    contributors    = "Oberon microsystems"
 | 
						|
    version         = "System/Rsrc/About"
 | 
						|
    copyright       = "System/Rsrc/About"
 | 
						|
    license         = "Docu/BB-License"
 | 
						|
    changes         = ""
 | 
						|
    issues          = ""
 | 
						|
 | 
						|
**)
 | 
						|
 | 
						|
IMPORT Dialog, Ports, Properties, Views;
 | 
						|
 | 
						|
CONST beginner = 0; advanced = 1; expert = 2; guru = 3;    (* user classes *)
 | 
						|
 | 
						|
TYPE
 | 
						|
    View = POINTER TO RECORD (Views.View)
 | 
						|
        size: INTEGER    (* border size in mm *)
 | 
						|
    END;
 | 
						|
 | 
						|
VAR
 | 
						|
    data*: RECORD
 | 
						|
        class*: INTEGER;    (* current user class *)
 | 
						|
        list*: Dialog.List;    (* list of currently available sizes, derived from class *)
 | 
						|
        width*: INTEGER    (* width of next view to be opened. Derived from
 | 
						|
                                    class, or entered through a text entry field *)
 | 
						|
    END;
 | 
						|
 | 
						|
    predef: ARRAY 6 OF INTEGER;    (* table of predefined sizes *)
 | 
						|
 | 
						|
 | 
						|
PROCEDURE SetList;
 | 
						|
BEGIN
 | 
						|
    IF data.class = beginner THEN
 | 
						|
        data.list.SetLen(1);
 | 
						|
        data.list.SetItem(0, "default")
 | 
						|
    ELSIF data.class = advanced THEN
 | 
						|
        data.list.SetLen(4);
 | 
						|
        data.list.SetItem(0, "default");
 | 
						|
        data.list.SetItem(1, "small");
 | 
						|
        data.list.SetItem(2, "medium");
 | 
						|
        data.list.SetItem(3, "large");
 | 
						|
    ELSE
 | 
						|
        data.list.SetLen(6);
 | 
						|
        data.list.SetItem(0, "default");
 | 
						|
        data.list.SetItem(1, "small");
 | 
						|
        data.list.SetItem(2, "medium");
 | 
						|
        data.list.SetItem(3, "large");
 | 
						|
        data.list.SetItem(4, "tiny");
 | 
						|
        data.list.SetItem(5, "huge");
 | 
						|
    END
 | 
						|
END SetList;
 | 
						|
 | 
						|
(* View *)
 | 
						|
 | 
						|
PROCEDURE (v: View) CopyFromSimpleView (source: Views.View);
 | 
						|
BEGIN
 | 
						|
    v.size := source(View).size
 | 
						|
END CopyFromSimpleView;
 | 
						|
 | 
						|
PROCEDURE (v: View) Restore (f: Views.Frame; l, t, r, b: INTEGER);
 | 
						|
BEGIN    (* fill view with a red square of size v.size *)
 | 
						|
    IF v.size = 0 THEN v.size := predef[0] END;    (* lazy initialization of size *)
 | 
						|
    f.DrawRect(0, 0, v.size, v.size, Ports.fill, Ports.red)
 | 
						|
END Restore;
 | 
						|
 | 
						|
PROCEDURE (v: View) HandlePropMsg (VAR msg: Views.PropMessage);
 | 
						|
BEGIN
 | 
						|
    WITH msg: Properties.SizePref DO
 | 
						|
        IF v.size = 0 THEN v.size := predef[0] END;    (* lazy initialization of size *)
 | 
						|
        msg.w := v.size; msg.h := v.size    (* tell environment about desired width and height *)
 | 
						|
    ELSE    (* ignore other messages *)
 | 
						|
    END
 | 
						|
END HandlePropMsg;
 | 
						|
 | 
						|
(* notifiers *)
 | 
						|
 | 
						|
PROCEDURE ClassNotify* (op, from, to: INTEGER);
 | 
						|
BEGIN    (* react to change in data.class *)
 | 
						|
    IF op = Dialog.changed THEN
 | 
						|
        IF (to = beginner) OR (to = advanced) & (data.list.index > 3) THEN
 | 
						|
            (* if class is reduced, make sure that selection contains legal elements *)
 | 
						|
            data.list.index := 0; data.width := predef[0];    (* modify interactor *)
 | 
						|
            Dialog.Update(data)    (* redraw controls where necessary *)
 | 
						|
        END;
 | 
						|
        SetList;
 | 
						|
        Dialog.UpdateList(data.list)    (* reconstruct list box contents *)
 | 
						|
    END
 | 
						|
END ClassNotify;
 | 
						|
 | 
						|
PROCEDURE ListNotify* (op, from, to: INTEGER);
 | 
						|
BEGIN    (* reacto to change in data.list (index to was selected) *)
 | 
						|
    IF op = Dialog.changed THEN
 | 
						|
        data.width := predef[to];    (* modify interactor *)
 | 
						|
        Dialog.Update(data)    (* redraw controls where necessary *)
 | 
						|
    END
 | 
						|
END ListNotify;
 | 
						|
 | 
						|
(* guards *)
 | 
						|
 | 
						|
PROCEDURE ListGuard* (VAR par: Dialog.Par);
 | 
						|
BEGIN    (* disable list box for a beginner *)
 | 
						|
    par.disabled := data.class = beginner
 | 
						|
END ListGuard;
 | 
						|
 | 
						|
PROCEDURE WidthGuard* (VAR par: Dialog.Par);
 | 
						|
BEGIN    (* make text entry field read-only if user is not guru *)
 | 
						|
    par.readOnly := data.class # guru
 | 
						|
END WidthGuard;
 | 
						|
 | 
						|
(* commands *)
 | 
						|
 | 
						|
PROCEDURE Open*;
 | 
						|
    VAR v: View;
 | 
						|
BEGIN
 | 
						|
    NEW(v);    (* create and initialize a new view *)
 | 
						|
    v.size := data.width * Ports.mm;    (* define view's size in function of class *)
 | 
						|
    Views.OpenAux(v, "Example")    (* open the view in a window *)
 | 
						|
END Open;
 | 
						|
 | 
						|
BEGIN    (* initialization of global variables *)
 | 
						|
    predef[0] := 40; predef[1] := 30; predef[2] := 50;    (* predefined sizes *)
 | 
						|
    predef[3] := 70; predef[4] := 20; predef[5] := 100;
 | 
						|
    data.class := beginner;    (* default values *)
 | 
						|
    data.list.index := 0;
 | 
						|
    data.width := predef[0];
 | 
						|
    SetList
 | 
						|
END ObxControls.
 |