ViewSizer.txt 4.2 KB

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