ð±Syntax10.Scn.FntSyntax10i.Scn.FntõÿÿÿÐÝðIStampElemsAlloc10 Oct 97ªüÿÿÿÀÔ°­MarkElemsAllocHŠSyntax10b.Scn.Fnt Uÿÿÿÿ€8ÀÔFoldElemsNew&2œƒÿÿÿÿ€8ÀÔ üÿÿÿÀÔ°­+Ø% 2ÿÿÿÿ€8ÀÔEBXHÿÿÿÿ€8ÀÔ üÿÿÿÀÔ°­KŠ*ÿÿÿÿ€8ÀÔbÁ<O!Pÿÿÿÿ€8ÀÔ üÿÿÿÀÔ°­^5ÿÿÿÿ€8ÀÔ4ÿÿÿÿ€8ÀÔ üÿÿÿÀÔ°­LŠÿÿÿÿ€8ÀÔAÿÿÿÿ€8ÀÔ üÿÿÿÀÔ°­MŠÿÿÿÿ€8ÀÔ_rxÿÿÿÿ€8ÀÔ MODULE MultiButtonElems; (* CE  *) IMPORT Elems, PanelElems, GU := GUtils, TextFrames, Display, Oberon, Texts, Viewers, Fonts, Input; CONST ML = 2; MM = 1; MR = 0; DUnit = TextFrames.Unit; PROCEDURE DrawPanel* (p : PanelElems.Panel; x, y, color: INTEGER; pressed : BOOLEAN; f : Display.Frame); VAR h, w, X, Y, W, H : INTEGER; BEGIN h := GU.Unit(p.H, TRUE); w := GU.Unit(p.W, TRUE); GU.Area(f, color, 12, x, y, w, h, GU.Unit(p.border, FALSE), TRUE, pressed); IF f # NIL THEN PanelElems.TruncateFrame(f(PanelElems.Frame), X, Y, W, H) END; PanelElems.DrawContents(p, f, x, y); IF f # NIL THEN PanelElems.SetFrameCoords(f(PanelElems.Frame), X, Y, W, H) END END DrawPanel; PROCEDURE FrameHandle* (f : Display.Frame; VAR msg : Display.FrameMsg); VAR keysum : SET; fnt : Fonts.Font; col : SHORTINT; exec : Elems.ExecMsg; BEGIN WITH f : PanelElems.Frame DO WITH msg : Oberon.InputMsg DO IF f.p.locked THEN IF (msg.id = Oberon.track) & (msg.keys = {MM}) THEN keysum := msg.keys; Elems.GetLook(f.p, fnt, col); DrawPanel(f.p, f.x, f.y, col, TRUE, f); REPEAT Input.Mouse(msg.keys, msg.X, msg.Y); keysum := keysum + msg.keys; UNTIL msg.keys = {}; DrawPanel(f.p, f.x, f.y, col, FALSE, f); IF ~(MR IN keysum) THEN exec.e := f.p; exec.x := msg.X; exec.y := msg.Y; exec.unload := ML IN keysum; exec.f := f; f.p.handle(f.p, exec) END ELSE PanelElems.FrameHandle(f, msg) END ELSE PanelElems.FrameHandle(f, msg) END ELSE PanelElems.FrameHandle(f, msg) END END END FrameHandle; PROCEDURE Handle* (p: Texts.Elem; VAR msg: Texts.ElemMsg); BEGIN WITH p : PanelElems.Panel DO WITH msg : TextFrames.DisplayMsg DO IF ~msg.prepare THEN GU.SetDevice(GU.display); p.sel := NIL; msg.elemFrame := PanelElems.OpenFrame(p, msg.frame, FrameHandle, msg.X0, msg.Y0, SHORT(p.W DIV DUnit), SHORT(p.H DIV DUnit)); DrawPanel(p, msg.X0, msg.Y0, msg.col, FALSE, msg.elemFrame) END | msg : Elems.ExecMsg DO IF msg.x >= 0 THEN Elems.Handle(p, msg) END; (* forget init cmd of a panel *) | msg : Texts.IdentifyMsg DO msg.mod := "MultiButtonElems"; msg.proc := "New" ELSE PanelElems.Handle(p, msg) END END END Handle; PROCEDURE Init* (p : PanelElems.Panel); BEGIN p.handle := Handle; p.border := 1; END Init; PROCEDURE New*;  BEGIN PanelElems.New; Init(Texts.new(PanelElems.Panel)); END New; PROCEDURE Insert*; VAR m: TextFrames.InsertElemMsg; pos : LONGINT; t : Texts.Text; s : Texts.Scanner; BEGIN New; Elems.GetPar(Texts.new(Elems.Elem), s); m.e := Texts.new; Viewers.Broadcast(m); t := Texts.ElemBase(Texts.new); IF t # NIL THEN pos := Texts.ElemPos(m.e); Texts.ChangeLooks(t, pos, pos + 1, {1}, Fonts.Default, 13, 0) END END Insert; END MultiButtonElems.