home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 July / Chip_2004-07_cd1.bin / tema / aos / files / Oberon.exe / Oberon / Docu.exe / Docu / Examples.Mod (.txt) < prev    next >
Oberon Text  |  2000-02-29  |  18KB  |  530 lines

  1. Oberon10.Scn.Fnt
  2. Syntax10.Scn.Fnt
  3. (* ETH Oberon, Copyright 2000 ETH Zuerich Institut fuer Computersysteme, ETH Zentrum, CH-8092 Zuerich.
  4. Refer to the "General ETH Oberon System Source License" contract available at: http://www.oberon.ethz.ch/ *)
  5.     Examples.Mod, jm 24.2.93 - Modified by AFI - December 18, 1994.
  6.     This module illustrates how gadgets can be manipulated under program control.
  7.     Commands exported by this module are used in the tutorial "GadgetsOberon.html".
  8. MODULE Examples; (** portable *)
  9. IMPORT
  10.     Attributes, BasicGadgets, Desktops, Display, Gadgets, Oberon, Objects,
  11.     Out, Printer, Texts, Documents;
  12.     W: Texts.Writer;
  13.     tmp: Objects.Object;
  14. (*-- Increment integer gadget --*)
  15. (* This command must be executed from a gadget *)
  16. PROCEDURE Increm*;
  17.     VAR obj: Objects.Object;
  18. BEGIN
  19.     obj := Gadgets.FindObj(Gadgets.context, "Level");
  20.     IF (obj # NIL) THEN
  21.         INC(obj(BasicGadgets.Integer).val);
  22.         Gadgets.Update(obj)
  23. END Increm;
  24. (*-- Decrement integer gadget --*)
  25. (* This command must be executed from a gadget *)
  26. PROCEDURE Decrem*;
  27.     VAR obj: Objects.Object;
  28. BEGIN
  29.     obj := Gadgets.FindObj(Gadgets.context, "Level");
  30.     IF (obj # NIL) THEN
  31.         DEC(obj(BasicGadgets.Integer).val);
  32.         Gadgets.Update(obj)
  33. END Decrem;
  34. (*-- Create a slider gadget and insert it at the caret position --*)
  35. PROCEDURE InsertAtCaret*;
  36.     VAR obj: Objects.Object;
  37. BEGIN
  38.     Out.String("Inserting slider gadget at caret"); Out.Ln;
  39.     obj := Gadgets.CreateObject("BasicGadgets.NewSlider");
  40.     Gadgets.Integrate(obj)
  41. END InsertAtCaret;
  42. (*-- Create a text field linked to an integer and insert it at the caret position --*)
  43. PROCEDURE InsertPair*;
  44.     VAR F: Display.Frame; obj: Objects.Object; L:Objects.LinkMsg;
  45. BEGIN
  46.     Out.String("Insert view/model pair"); Out.Ln;
  47.     F := Gadgets.CreateViewModel("TextFields.NewTextField", "BasicGadgets.NewInteger");
  48.     Gadgets.Integrate(F);
  49.     (* Name the model "Volts" *)
  50.     Gadgets.NameObj(F(Gadgets.Frame).obj, "Volts");
  51.     (* Create a slider, insert it in the desktop and name it "Slider" *)
  52.     obj := Gadgets.CreateObject("BasicGadgets.NewSlider");
  53.     Gadgets.Integrate(obj);
  54.     Gadgets.NameObj(obj, "Slider");
  55.     (* Link the integer to the slider *)
  56.     (* NOT so: obj(Gadgets.Frame).obj := F(Gadgets.Frame).obj
  57.         but so, sending a link message to the slider. *)
  58.     L.id := Objects.set; L.obj := F(Gadgets.Frame).obj;
  59.     L.name := "Model"; L.res := -1; Objects.Stamp(L);
  60.     obj.handle(obj, L);
  61.     Gadgets.Update(obj)
  62. END InsertPair;
  63. (*-- Display names assigned in previous example --*)
  64. PROCEDURE ShowNames*;
  65.     VAR S: Display.SelectMsg; ObjName: ARRAY 64 OF CHAR;
  66. BEGIN
  67.     S.id := Display.get; S.F := NIL; S.time := -1;
  68.     Display.Broadcast(S);
  69.     IF (S.time # -1) & (S.obj # NIL) THEN
  70.         Out.String("Visual gadget name: ");
  71.         Gadgets.GetObjName(S.obj, ObjName);
  72.         Out.String(ObjName); Out.Ln;
  73.             (*==================*)
  74.         IF S.obj(Gadgets.Frame).obj # NIL THEN
  75.             Out.String("Model gadget name: ");
  76.             Gadgets.GetObjName(S.obj(Gadgets.Frame).obj, ObjName);
  77.             Out.String(ObjName); Out.Ln
  78.         ELSE
  79.             Out.String("No model exists"); Out.Ln
  80.         END
  81. END ShowNames;
  82. (*-- Display information about an object --*)
  83. PROCEDURE Info*(obj: Objects.Object);
  84.     VAR A: Objects.AttrMsg;
  85. BEGIN
  86.     IF obj # NIL THEN
  87.         A.id := Objects.get; A.name := "Gen"; A.s := ""; A.res := -1;
  88.         obj.handle(obj, A); (* Retrieve its new procedure *)
  89.         IF A.s # "" THEN Texts.WriteString(W, "  "); Texts.WriteString(W, A.s)
  90.         ELSE Texts.WriteString(W, "  Unknown generator!")
  91.         END;
  92.         IF obj IS Desktops.DocGadget THEN Texts.WriteString(W, ": desktop document")
  93.         ELSIF obj IS Documents.Document THEN Texts.WriteString(W, ": document")
  94.         ELSIF obj IS Gadgets.View THEN Texts.WriteString(W, ": view")
  95.         ELSIF obj IS Gadgets.Frame THEN Texts.WriteString(W, ": visual gadget")
  96.         ELSIF obj IS Display.Frame THEN Texts.WriteString(W, ": display frame")
  97.         ELSIF obj IS Gadgets.Object THEN Texts.WriteString(W, ": model gadget")
  98.         ELSE Texts.WriteString(W, ": type unknown")
  99.         END;
  100.         Texts.WriteLn(W)
  101.     END;
  102.     Texts.Append(Oberon.Log, W.buf)
  103. END Info;
  104. PROCEDURE Explore*;
  105. BEGIN
  106.     Info(Oberon.Par.frame);
  107.     Info(Oberon.Par.obj);
  108.     Info(Gadgets.executorObj);
  109.     Info(Gadgets.context)
  110. END Explore;
  111. (*-- Tell everything about the execution environment --*)
  112. (* This command must be executed from a gadget. *)
  113. PROCEDURE FindObj*;
  114.     VAR obj: Objects.Object;
  115. BEGIN
  116.     (* Note: the context is already set before reaching this point. *)
  117.     obj := Gadgets.FindObj(Gadgets.context, "Test");
  118.     IF (obj # NIL) & (obj IS BasicGadgets.Button) THEN
  119.         Out.String("Executor gadget:"); Out.Ln;
  120.         Info(Gadgets.executorObj);
  121.         Out.String("found:"); Out.Ln;
  122.         Info(obj);
  123.         Out.String("in context:"); Out.Ln;
  124.         Info(Gadgets.context); Out.Ln
  125. END FindObj;
  126. (*-- Select gadget --*)
  127. (* This command must be executed from a gadget *)
  128. PROCEDURE SelectGadget*;
  129.     VAR S: Display.SelectMsg; obj: Objects.Object;
  130. BEGIN
  131.     obj := Gadgets.FindObj(Gadgets.context, "Test");
  132.     IF (obj # NIL) THEN
  133.         Out.String("Select gadget 'Test'"); Out.Ln;
  134.         S.id := Display.set; S.F := obj(Display.Frame); S.obj := NIL; S.sel := NIL; S.time := -1;
  135.         Display.Broadcast(S);
  136.         Info(S.obj);
  137.         Info(S.sel);
  138.         Out.String("Gadget selected."); Out.Ln;
  139.         Gadgets.Update(obj);
  140.         Out.String("   and now redrawn.")
  141.     ELSE Out.String("No object 'Test' found")
  142.     END;
  143.     Out.Ln
  144. END SelectGadget;
  145. (*-- Deselect selected gadget --*)
  146. (* This command must be executed from a gadget *)
  147. PROCEDURE DeselectGadget*;
  148.     VAR S: Display.SelectMsg; obj: Objects.Object;
  149. BEGIN
  150.     Out.String("Deselect gadget"); Out.Ln;
  151.     S.id := Display.get; S.F := NIL; S.obj := NIL; S.time := -1;
  152.     Display.Broadcast(S);
  153.     IF (S.time # -1) & (S.obj # NIL) THEN
  154.         obj := S.obj;
  155.         S.id := Display.reset; S.F := obj(Display.Frame); S.obj := NIL; S.sel := NIL; S.time := -1;
  156.         Display.Broadcast(S);
  157.         Info(S.obj);
  158.         Info(S.sel);
  159.         Out.String("Gadget deselected"); Out.Ln;
  160.         Gadgets.Update(obj);
  161.         Out.String("   and now redrawn.")
  162.     ELSE Out.String("No object selected.")
  163.     END;
  164.     Out.Ln
  165. END DeselectGadget;
  166. (*-- Display information about the currently selected objects --*)
  167. PROCEDURE GetSelection*;
  168.     VAR S: Display.SelectMsg; obj: Objects.Object;
  169. BEGIN
  170.     Out.String("Examples.GetSelection"); Out.Ln;
  171.     S.id := Display.get; S.F := NIL; S.time := -1;
  172.     Display.Broadcast(S);
  173.     IF (S.time # -1) & (S.obj # NIL) THEN
  174.         obj := S.obj;
  175.         WHILE obj # NIL DO
  176.             Info(obj);
  177.             Out.String("    Ancestor:");
  178.             Info(S.sel);
  179.             obj := obj.slink
  180.         END
  181.     ELSE Out.String("No object selected.")
  182.         (*-- time is still = -1 and obj = NIL --*)
  183. END GetSelection;
  184. (*-- Remove selected gadget --*)
  185. PROCEDURE RemoveSelection*;
  186.     VAR S: Display.SelectMsg; C: Display.ControlMsg;
  187. BEGIN
  188.     Out.String("Remove selected gadget"); Out.Ln;
  189.     S.id := Display.get; S.F := NIL; S.obj := NIL; S.time := -1;
  190.     Display.Broadcast(S);
  191.     IF (S.time # -1) & (S.obj # NIL) THEN
  192.         C.id := Display.remove; C.F := S.obj(Display.Frame); Display.Broadcast(C)
  193. END RemoveSelection;
  194. (*-- Suspend selected gadget --*)
  195. PROCEDURE SuspendSelection*;
  196.     VAR S: Display.SelectMsg; C: Display.ControlMsg;
  197. BEGIN
  198.     Out.String("Suspend selected gadget"); Out.Ln;
  199.     S.id := Display.get; S.F := NIL; S.obj := NIL; S.time := -1;
  200.     Display.Broadcast(S);
  201.     IF (S.time # -1) & (S.obj # NIL) THEN
  202.         C.id := Display.suspend; C.F := S.obj(Display.Frame); Display.Broadcast(C)
  203. END SuspendSelection;
  204. (*-- Locate gadget at screen coordinates X, Y --*)
  205. PROCEDURE LocateP*;
  206.     VAR F: Display.Frame; X, Y: INTEGER; u, v: INTEGER;
  207. BEGIN
  208.     X := Oberon.Pointer.X;
  209.     Y := Oberon.Pointer.Y;
  210.     Out.String("Gadget at X="); Out.Int(X, 5);
  211.     Out.String("  Y="); Out.Int(Y, 5); Out.Ln;
  212.     Gadgets.ThisFrame(X, Y, F, u, v);
  213.     Info(F);
  214.     Out.String("  Rel. point coord. ");
  215.     Out.String("u="); Out.Int(u, 5);
  216.     Out.String("  v="); Out.Int(v, 5); Out.Ln
  217. END LocateP;
  218. (*-- Locate gadget at screen coordinates X, Y --*)
  219. PROCEDURE Locate*;
  220.     VAR L: Display.LocateMsg; X, Y: INTEGER;
  221. BEGIN
  222.     X := Oberon.Pointer.X;
  223.     Y := Oberon.Pointer.Y;
  224.     Out.String("Gadget at X="); Out.Int(X, 5);
  225.     Out.String("  Y="); Out.Int(Y, 5); Out.Ln;
  226.     L.X := X; L.Y := Y; L.res := -1; L.F := NIL; L.loc := NIL;
  227.     Display.Broadcast(L);
  228.     Info(L.loc);
  229.     Out.String("  Rel. point coord. ");
  230.     Out.String("u="); Out.Int(L.u, 5);
  231.     Out.String("  v="); Out.Int(L.v, 5); Out.Ln
  232. END Locate;
  233. (*-- Move selected gadget to absolute coordinates X, Y --*)
  234. PROCEDURE MoveGadget*;
  235.     VAR S: Display.SelectMsg; M: Display.ModifyMsg; F: Display.Frame;
  236.         AS: Attributes.Scanner; X, Y: INTEGER;
  237. BEGIN
  238.     Out.String("Moving gadget."); Out.Ln;
  239.     Attributes.OpenScanner(AS, Oberon.Par.text, Oberon.Par.pos);
  240.     Attributes.Scan(AS);
  241.     IF AS.class = Attributes.Int THEN
  242.         X := SHORT(AS.i); Attributes.Scan(AS);
  243.         IF AS.class = Attributes.Int THEN
  244.             Y := SHORT(AS.i);
  245.             S.id := Display.get; S.F := NIL; S.obj := NIL; S.time := -1;
  246.             Display.Broadcast(S);
  247.             IF (S.time # -1) & (S.obj # NIL) THEN
  248.                 F := S.obj(Display.Frame);
  249.                 M.id := Display.move;
  250.                 M.mode := Display.display;
  251.                 M.F := F;
  252.                 M.X := F.X + X; M.Y := F.Y + Y;
  253.                 M.W := F.W; M.H := F.H;
  254.                 M.dX := X; M.dY := Y;
  255.                 M.dW := 0; M.dH := 0;
  256.                 Display.Broadcast(M)
  257.             END
  258.         END
  259. END MoveGadget;
  260. (*-- Show selected gadget location (X, Y) and size (W, H) --*)
  261. PROCEDURE LocateGadget*;
  262.     VAR S: Display.SelectMsg; F: Display.Frame;
  263. BEGIN
  264.     Out.String("Gadget frame coordinates:"); Out.Ln;
  265.     S.id := Display.get; S.F := NIL; S.obj := NIL; S.time := -1;
  266.     Display.Broadcast(S);
  267.     IF (S.time # -1) & (S.obj # NIL) THEN
  268.         F := S.obj(Display.Frame);
  269.         Out.String("X="); Out.Int(F.X, 5);
  270.         Out.String("   Y"); Out.Int(F.Y, 5); Out.Ln;
  271.         Out.String("W="); Out.Int(F.W, 5);
  272.         Out.String("   H="); Out.Int(F.H, 5); Out.Ln
  273. END LocateGadget;
  274. (*-- Move selected gadgets to the caret --*)
  275. PROCEDURE MoveToCaret*;
  276.     VAR S: Display.SelectMsg; C: Display.ControlMsg; obj: Objects.Object;
  277. BEGIN
  278.     Out.String("Moving gadget to caret"); Out.Ln;
  279.     S.id := Display.get; S.F := NIL; S.obj := NIL; S.time := -1;
  280.     Display.Broadcast(S);
  281.     IF (S.time # -1) & (S.obj # NIL) THEN
  282.         obj := S.obj;
  283.         C.id := Display.remove; C.F := obj(Display.Frame); Display.Broadcast(C);
  284.         Gadgets.Integrate(obj)
  285. END MoveToCaret;
  286. (*-- Print selected gadgets --*)
  287. PROCEDURE PrintGadget*;
  288.     VAR S: Display.SelectMsg; P: Display.DisplayMsg; obj: Objects.Object;
  289. BEGIN
  290.     Printer.Open("LPT1", "");
  291.     Out.String("Printing gadget"); Out.Ln;
  292.     S.id := Display.get; S.F := NIL; S.obj := NIL; S.time := -1;
  293.     Display.Broadcast(S);
  294.     IF (S.time # -1) & (S.obj # NIL) THEN
  295.         obj := S.obj;
  296.         P.device := Display.printer; P.id := Display.contents; P.F := obj(Display.Frame);
  297.         P.res := -1;
  298.         Display.Broadcast(P);
  299. END PrintGadget;
  300. (*-- Show a named attribute of a gadget --*)
  301. PROCEDURE RetrObjAttr(name: ARRAY OF CHAR);
  302.     VAR A: Objects.AttrMsg;
  303. BEGIN
  304.     Out.String("    "); Out.String(name); 
  305.     A.id := Objects.get; COPY(name, A.name); A.res := -1; Objects.Stamp(A);
  306.     tmp.handle(tmp, A);
  307.     IF A.res >= 0 THEN    (* Attribute exists *)
  308.         IF A.class = Objects.String THEN Out.String(" is string = "); Out.String(A.s)
  309.         ELSIF A.class = Objects.Int THEN Out.String(" is integer = "); Out.Int(A.i, 5)
  310.         ELSIF A.class = Objects.Real THEN Out.String(" is real = "); Out.Real(A.x, 5)
  311.         ELSIF A.class = Objects.LongReal THEN Out.String(" is real = "); Out.LongReal(A.y, 5)
  312.         ELSIF A.class = Objects.Char THEN Out.String(" is char = "); Out.Char(A.c)
  313.         ELSIF A.class = Objects.Bool THEN Out.String(" is boolean = ");
  314.             IF A.b THEN Out.String("TRUE")
  315.             ELSE Out.String("FALSE")
  316.             END
  317.         ELSE Out.String("Unknown class")
  318.         END
  319.     END;
  320.     Out.Ln
  321. END RetrObjAttr;
  322. PROCEDURE EnumAttr*;
  323.     VAR S: Display.SelectMsg; obj: Objects.Object; A: Objects.AttrMsg;
  324. BEGIN
  325.     Out.String("Examples.EnumAttr"); Out.Ln;
  326.     S.id := Display.get; S.F := NIL; S.obj := NIL; S.time := -1;
  327.     Display.Broadcast(S);
  328.     IF (S.time # -1) & (S.obj # NIL) THEN
  329.         obj := S.obj;
  330.         WHILE obj # NIL DO
  331.             tmp := obj;
  332.             Info(obj);
  333.             A.id := Objects.enum; A.Enum := RetrObjAttr; A.res := -1; Objects.Stamp(A); obj.handle(obj, A);
  334.             obj := tmp.slink
  335.         END
  336. END EnumAttr;
  337. PROCEDURE EnumAttr2*;
  338.     VAR S: Display.SelectMsg; obj: Objects.Object; At: Attributes.Attr;
  339.         AV: Attributes.StringAttr;
  340. BEGIN
  341.     Out.String("Examples.EnumAttr2"); Out.Ln;
  342.     S.id := Display.get; S.F := NIL; S.obj := NIL; S.time := -1;
  343.     Display.Broadcast(S);
  344.     IF (S.time # -1) & (S.obj # NIL) THEN
  345.         obj := S.obj;
  346.         WHILE obj # NIL DO
  347.             tmp := obj;
  348.             Info(obj);
  349.             Info(obj(Gadgets.Frame).obj);
  350.             At := obj(Gadgets.Frame).attr; (* Why is this = NIL ??? *)
  351.             IF At = NIL THEN Out.String("Is Nil") END;
  352.             NEW(AV);
  353.             AV.s := "Gogo";
  354.             AV.next := NIL;
  355.             Attributes.InsertAttr(At, "Andr
  356. ", AV);
  357.             Attributes.DeleteAttr(At, "Tutorial");
  358.             Out.String("Done");
  359.             obj := tmp.slink
  360.         END
  361. END EnumAttr2;
  362. (*-- Show the 'Value' attribute of objects --*)
  363. PROCEDURE ShowValue*;
  364.     VAR S: Display.SelectMsg; obj: Objects.Object;
  365. BEGIN
  366.     Out.String("Show 'Value' attribute"); Out.Ln;
  367.     S.id := Display.get; S.F := NIL; S.obj := NIL; S.time := -1;
  368.     Display.Broadcast(S);
  369.     IF (S.time # -1) & (S.obj # NIL) THEN
  370.         obj := S.obj;
  371.         WHILE obj # NIL DO
  372.             Info(obj);
  373.             tmp := obj;
  374.             RetrObjAttr("Value");
  375.             obj := obj.slink
  376.         END
  377. END ShowValue;
  378. (*-- Resize selected gadgets --*)
  379. PROCEDURE Resize*;
  380.     VAR S: Display.SelectMsg; obj: Objects.Object; F: Display.Frame; M: Display.ModifyMsg;
  381.         AS: Attributes.Scanner; W, H: INTEGER;
  382. BEGIN
  383.     Out.String("Resize selected gadgets"); Out.Ln;
  384.     Attributes.OpenScanner(AS, Oberon.Par.text, Oberon.Par.pos);
  385.     Attributes.Scan(AS);
  386.     IF AS.class = Attributes.Int THEN
  387.         W := SHORT(AS.i); Attributes.Scan(AS);
  388.         IF AS.class = Attributes.Int THEN
  389.             H := SHORT(AS.i);
  390.             S.id := Display.get; S.F := NIL; S.time := -1;
  391.             Display.Broadcast(S);
  392.             IF (S.time # -1) & (S.obj # NIL) THEN
  393.                 obj := S.obj;
  394.                 WHILE obj # NIL DO
  395.                     F := obj(Display.Frame);
  396.                     M.id := Display.extend; (* OR Display.reduce: means change size for gadgets *)
  397.                     M.mode := Display.display; (* display changes immediately *)
  398.                     M.F := F;
  399.                     M.X := F.X; M.Y := F.Y;
  400.                     M.dX := 0; M.dY := 0;
  401.                     M.W := W; M.H := H;
  402.                     M.dW := W - F.W; M.dH := H - F.H; (* deltas *)
  403.                     Display.Broadcast(M);
  404.                 (*    F.handle(F, M);    ???    *)
  405.                     obj := obj.slink
  406.                 END
  407.             END
  408.         END
  409. END Resize;
  410. (*-- Shows the current message path --*)
  411. (* This command must be executed from a gadget *)
  412. PROCEDURE ShowThread*;
  413. VAR obj: Objects.Object;
  414. BEGIN
  415.     Out.String("Examples.ShowThread"); Out.Ln;
  416.     obj := Oberon.Par.obj;
  417.     WHILE obj # NIL DO
  418.         Info(obj);
  419.         obj := obj.dlink
  420. END ShowThread;
  421. (* Consume command. Delete the object thrown into the executor of this command *)
  422. PROCEDURE Delete*;
  423.     VAR C: Display.ControlMsg;
  424. BEGIN
  425.     Out.String("Examples.Delete"); Out.Ln;
  426.     IF Gadgets.senderObj # NIL THEN
  427.         C.id := Display.remove; C.F := Gadgets.senderObj(Display.Frame);
  428.         Display.Broadcast(C)
  429. END Delete;
  430. (*-- Look for an integer model gadget called "Test" in the current
  431.         context and increment its val field. The model is visualized by
  432.         a text field.--*)
  433. (*-- This command must be executed in a given context. --*)
  434. PROCEDURE Inc*;
  435.     VAR obj: Objects.Object;
  436. BEGIN
  437.     obj := Gadgets.FindObj(Gadgets.context, "Test");
  438.     IF (obj # NIL) & (obj IS BasicGadgets.Integer) THEN
  439.         WITH obj: BasicGadgets.Integer DO
  440.             INC(obj.val);
  441.             BasicGadgets.SetValue(obj)
  442.         END
  443.     END;
  444. (*-- Look for an slider gadget called "Slider" in the current
  445.         context and increment its val field --*)
  446.     obj := Gadgets.FindObj(Gadgets.context, "Slider");
  447.     IF (obj # NIL) & (obj IS BasicGadgets.Slider) THEN
  448.         WITH obj: BasicGadgets.Slider DO
  449.             INC(obj.val);
  450.             BasicGadgets.SetValue(obj)
  451.         END
  452. END Inc;
  453. (*-- Look for an integer object called Test in the current context,
  454.         build a slider and link them together, and
  455.         insert the slider at the caret position. *)
  456. (* This command must be executed from a gadget. *)
  457. PROCEDURE AddSlider*;
  458.     VAR obj: Objects.Object; F: Objects.Object;
  459. BEGIN
  460.     obj := Gadgets.FindObj(Gadgets.context, "Test");
  461.     IF (obj # NIL) & (obj IS BasicGadgets.Integer) THEN
  462.         F := Gadgets.CreateObject("BasicGadgets.NewSlider");
  463.         WITH F: Gadgets.Frame DO
  464.             F.obj := obj; (* Link slider to the integer object *)
  465.             Gadgets.Integrate(F);
  466.             Gadgets.Update(obj)
  467.         END
  468. END AddSlider;
  469. PROCEDURE ShowDoc*;
  470.     VAR D: Documents.Document;
  471. BEGIN
  472.     D := Documents.MarkedDoc();
  473.     Info(D);
  474. END ShowDoc;
  475. PROCEDURE OpenDoc*;
  476. VAR D: Documents.Document;
  477. BEGIN
  478.     D := Documents.Open("Tutorials.html");
  479.     IF D # NIL THEN Desktops.ShowDoc(D)
  480.     ELSE Out.String("No such document found.")
  481. END OpenDoc;
  482. (*-----------------------------------*)
  483. (* Used in the GadgetsOberon.html tutorial. *)
  484.     PROCEDURE Add*;
  485.         VAR x, a, b: BasicGadgets.Real;
  486.         PROCEDURE GetReal(name: ARRAY OF CHAR): BasicGadgets.Real;
  487.             VAR obj: Objects.Object;
  488.         BEGIN
  489.             obj := Gadgets.FindObj(Gadgets.context, name);
  490.             IF (obj # NIL) & (obj IS BasicGadgets.Real) THEN
  491.                 RETURN obj(BasicGadgets.Real)
  492.             ELSE
  493.                 RETURN NIL
  494.             END
  495.         END GetReal;
  496.     BEGIN
  497.         (* 1. get the real gadgets *)
  498.         x := GetReal("xx");
  499.         a := GetReal("aa");
  500.         b := GetReal("bb");
  501.         IF (x = NIL) OR (a = NIL) OR (b = NIL) THEN
  502.             RETURN
  503.         END;
  504.         (* 2. solve the equation *)
  505.         IF Gadgets.executorObj(Gadgets.Frame).obj # x THEN
  506.             (* command executed from text field aa or bb *)
  507.             x.val := b.val -a.val
  508.         END;
  509.         (* 3. notify clients of model x that x.val has changed *)
  510.         BasicGadgets.SetValue(x)
  511.     END Add;
  512. (*-----------------------------------*)
  513.     BEGIN
  514.     Texts.OpenWriter(W)
  515. END Examples.
  516. Some commands to test out the above module:
  517. Out.Open
  518. Examples.GetSelection ~
  519. Examples.RemoveSelection ~
  520. Examples.MoveSelection ~
  521. Examples.ShowAttr ~
  522. Examples.Resize 100 25 ~
  523. Gadgets.ChangeAttr Cmd Examples.ShowThread ~
  524. Gadgets.ChangeAttr ConsumeCmd Examples.Delete ~
  525. Examples.Build ~
  526. Gadgets.ChangeAttr Cmd Examples.Inc ~
  527. Gadgets.ChangeAttr Cmd Examples.AddSlider ~
  528. Examples.MoveGadget 10 10 ~
  529. Examples.LocateGadget
  530.