DEADSOFTWARE

Port, TODO
[bbcp.git] / new / Std / Mod / ViewSizer.txt
1 MODULE StdViewSizer;
3 (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Std/Mod/ViewSizer.odc *)
4 (* DO NOT EDIT *)
6 IMPORT Services, Ports, Dialog, Views, Containers, Properties;
8 CONST width = 1; height = 2;
10 VAR
11 size*: RECORD
12 typeName-: Dialog.String;
13 w*, h*: REAL;
14 proportional*, fixedW, fixedH: BOOLEAN;
15 unit, scaleW, scaleH, lastChanged: INTEGER;
16 unitText: ARRAY 6 OF CHAR;
17 view: Views.View;
18 container: Containers.Controller
19 END;
21 PROCEDURE ConnectDialog (v: Views.View; c: Containers.Controller);
22 VAR pref: Properties.ResizePref;
23 BEGIN
24 IF (v # NIL) & (v.context # NIL) THEN
25 IF Dialog.metricSystem THEN size.unit := Ports.mm * 10; size.unitText := "cm"
26 ELSE size.unit := Ports.inch; size.unitText := "inch"
27 END;
28 size.view := v; size.container := c;
29 Services.GetTypeName(v, size.typeName);
30 v.context.GetSize(size.scaleW, size.scaleH);
31 size.w := size.scaleW / size.unit; size.h := size.scaleH / size.unit;
32 pref.fixed := FALSE;
33 pref.horFitToPage := FALSE; pref.verFitToPage := FALSE;
34 pref.horFitToWin := FALSE; pref.verFitToWin := FALSE;
35 Views.HandlePropMsg(v, pref);
36 size.fixedW := pref.fixed;
37 size.fixedH := pref.fixed;
38 size.proportional := FALSE
39 ELSE
40 size.view := NIL; size.container := c; size.typeName := ""
41 END;
42 Dialog.Update(size)
43 END ConnectDialog;
45 PROCEDURE SetViewSize*;
46 BEGIN
47 IF size.view # NIL THEN
48 size.view.context.SetSize(SHORT(ENTIER(size.w * size.unit + 0.5)),
49 SHORT(ENTIER(size.h * size.unit + 0.5)));
50 IF size.container # NIL THEN size.container.SetSingleton(size.view) END;
51 ConnectDialog(size.view, size.container)
52 ELSE Dialog.Beep
53 END
54 END SetViewSize;
56 PROCEDURE InitDialog*;
57 VAR v: Views.View; c: Containers.Controller;
58 BEGIN
59 c := Containers.Focus();
60 IF c # NIL THEN v := c.Singleton() ELSE v := NIL END;
61 IF (v # size.view) OR (c # size.container) THEN ConnectDialog(v, c) END
62 END InitDialog;
64 PROCEDURE ResetDialog*;
65 VAR proportional: BOOLEAN; v: Views.View;
66 BEGIN
67 proportional := size.proportional; v := size.view;
68 size.view := NIL; InitDialog;
69 IF proportional & (v = size.view) THEN size.proportional := TRUE; Dialog.Update(size) END
70 END ResetDialog;
72 PROCEDURE WidthGuard* (VAR par: Dialog.Par);
73 BEGIN
74 InitDialog;
75 par.disabled := size.view = NIL;
76 par.readOnly := size.fixedW
77 END WidthGuard;
79 PROCEDURE HeightGuard* (VAR par: Dialog.Par);
80 BEGIN
81 InitDialog;
82 par.disabled := size.view = NIL;
83 par.readOnly := size.fixedH
84 END HeightGuard;
86 PROCEDURE ProportionGuard* (VAR par: Dialog.Par);
87 BEGIN
88 par.disabled := (size.view = NIL) OR size.fixedW OR size.fixedH OR (size.scaleW = 0) OR (size.scaleH = 0)
89 END ProportionGuard;
91 PROCEDURE UnitGuard* (VAR par: Dialog.Par);
92 BEGIN
93 IF size.view # NIL THEN par.label := size.unitText$ ELSE par.label := "" END
94 END UnitGuard;
96 PROCEDURE AdjustDialogToPref (fixedW, fixedH: BOOLEAN);
97 VAR w, h: INTEGER; w0, h0: REAL; pref: Properties.SizePref;
98 BEGIN
99 w := SHORT(ENTIER(size.w * size.unit + 0.5)); h := SHORT(ENTIER(size.h * size.unit + 0.5));
100 IF size.proportional & (w > 0) & (h > 0) & (size.scaleW > 0) & (size.scaleH > 0) THEN
101 Properties.ProportionalConstraint(size.scaleW, size.scaleH, fixedW, fixedH, w, h)
102 END;
103 pref.w := w; pref.h := h; pref.fixedW := fixedW; pref.fixedH := fixedH;
104 Views.HandlePropMsg(size.view, pref);
105 IF ~fixedW THEN w0 := pref.w / size.unit ELSE w0 := size.w END;
106 IF ~fixedH THEN h0 := pref.h / size.unit ELSE h0 := size.h END;
107 IF (w0 # size.w) OR (h0 # size.h) THEN size.w := w0; size.h := h0; Dialog.Update(size) END
108 END AdjustDialogToPref;
110 PROCEDURE WNotifier* (op, from, to: INTEGER);
111 BEGIN
112 IF size.w > 0 THEN AdjustDialogToPref(TRUE, FALSE); size.lastChanged := width
113 ELSIF size.w # 0 THEN Dialog.Beep
114 END
115 END WNotifier;
117 PROCEDURE HNotifier* (op, from, to: INTEGER);
118 BEGIN
119 IF size.h > 0 THEN AdjustDialogToPref(FALSE, TRUE); size.lastChanged := height
120 ELSIF size.h # 0 THEN Dialog.Beep
121 END
122 END HNotifier;
124 PROCEDURE ProportionNotifier* (op, from, to: INTEGER);
125 BEGIN
126 IF (op = Dialog.changed) & size.proportional THEN
127 IF size.lastChanged = width THEN AdjustDialogToPref(TRUE, FALSE)
128 ELSIF size.lastChanged = height THEN AdjustDialogToPref(FALSE, TRUE)
129 END
130 END
131 END ProportionNotifier;
133 END StdViewSizer.