mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 09:40:21 +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.
|