MODULE Mouse EXPORTS Main; IMPORT Trestle, VBT, TextVBT, RigidVBT, HVSplit, BorderedVBTASBdVBT; IMPORT Axis, Region, PaintOp, Fmt; FROM VBT IMPORT Modifier, ClickType; (* used in MouseEvent *) TYPE MouseVBT = VBT.Leaf OBJECT whatChanged, time, cp, modifiers, clickType, clickCount: TextVBT.T; METHODS init (): MouseVBT := Init; OVERRIDES mouse := MouseEvent; repaint := Repaint; (* Leaf repaint does nothing *) END; PROCEDURE Init (v: MouseVBT): MouseVBT = BEGIN v.whatChanged := TextVBT.New(" "); v.time := TextVBT.New(" "); v.cp := TextVBT.New(" "); (* cursor postion *) v.modifiers := TextVBT.New(" "); v.clickType := TextVBT.New(" "); v.clickCount := TextVBT.New(" "); (* "double click", etc *) RETURN v; END Init; PROCEDURE MouseEvent (v: MouseVBT; READONLY cd: VBT.MouseRec) = VAR point := cd.cp.pt; mods := cd.modifiers; text := ""; BEGIN CASE cd.whatChanged OF | Modifier.MouseL => TextVBT.Put(v.whatChanged, "Left Button"); | Modifier.MouseM => TextVBT.Put(v.whatChanged, "Middle Button"); | Modifier.MouseR => TextVBT.Put(v.whatChanged, "Right Button"); END; TextVBT.Put(v.time, Fmt.Unsigned(cd.time)); (* really Word.T *) TextVBT.Put( v.cp, "(" & Fmt.Int(point.h) & "," & Fmt.Int(point.v) & ")"); IF (Modifier.Shift IN mods) THEN text := text & "+Shift"; END; IF (Modifier.Lock IN mods) THEN text := text & "+Lock"; END; IF (Modifier.Control IN mods) THEN text := text & "+Control"; END; IF (Modifier.Option IN mods) THEN text := text & "+Option"; END; TextVBT.Put(v.modifiers, text); CASE cd.clickType OF | ClickType.FirstDown => TextVBT.Put(v.clickType, "FirstDown"); | ClickType.OtherDown => TextVBT.Put(v.clickType, "OtherDown"); | ClickType.OtherUp => TextVBT.Put(v.clickType, "OtherUp"); | ClickType.LastUp => TextVBT.Put(v.clickType, "LastUp"); END; TextVBT.Put(v.clickCount, Fmt.Int(cd.clickCount)); END MouseEvent; PROCEDURE Repaint (v: MouseVBT; READONLY rgn: Region.T) = BEGIN VBT.PaintRegion(v, rgn, PaintOp.Bg); END Repaint; CONST height = 35.0; (* Height of vbt1, vbt2, vbt3 (in millimeters). *) VAR mousevbt := NEW(MouseVBT).init(); vbt1 := RigidVBT.FromHV(mousevbt, 20.0, 35.0); split1 := HVSplit.Cons( Axis.T.Ver, BdVBT.New(TextVBT.New("what changed")), BdVBT.New(TextVBT.New("time")), BdVBT.New(TextVBT.New("position")), BdVBT.New(TextVBT.New("modifiers")), BdVBT.New(TextVBT.New("click type")), BdVBT.New(TextVBT.New("click count"))); vbt2 := RigidVBT.FromHV(split1, 20.0, 35.0); split2 := HVSplit.Cons( Axis.T.Ver, BdVBT.New(mousevbt.whatChanged), BdVBT.New(mousevbt.time), BdVBT.New(mousevbt.cp), BdVBT.New(mousevbt.modifiers), BdVBT.New(mousevbt.clickType), BdVBT.New(mousevbt.clickCount)); vbt3 := RigidVBT.FromHV(split2, 35.0, 35.0); main := HVSplit.Cons(Axis.T.Hor, vbt1, vbt2, vbt3); BEGIN Trestle.Install(main); Trestle.AwaitDelete(main); END Mouse.