123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361 |
- MODULE DevCommanders;
- (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Dev/Mod/Commanders.odc *)
- (* DO NOT EDIT *)
- IMPORT
- Kernel, Fonts, Ports, Stores, Models, Views, Controllers, Properties, Dialog, Controls,
- TextModels, TextSetters, TextMappers, Services, StdLog;
- CONST
- (* additional Scan types *)
- ident = 19; qualident = 20; execMark = 21;
- point = Ports.point;
- minVersion = 0; maxVersion = 0; maxStdVersion = 0;
- TYPE
- View* = POINTER TO ABSTRACT RECORD (Views.View)
- END;
- EndView* = POINTER TO ABSTRACT RECORD (Views.View)
- END;
- Par* = POINTER TO RECORD
- text*: TextModels.Model;
- beg*, end*: INTEGER
- END;
- Directory* = POINTER TO ABSTRACT RECORD END;
- StdView = POINTER TO RECORD (View) END;
- StdEndView = POINTER TO RECORD (EndView) END;
- StdDirectory = POINTER TO RECORD (Directory) END;
- Scanner = RECORD
- s: TextMappers.Scanner;
- ident: ARRAY LEN(Kernel.Name) OF CHAR;
- qualident: ARRAY LEN(Kernel.Name) * 2 - 1 OF CHAR
- END;
-
- TrapCleaner = POINTER TO RECORD (Kernel.TrapCleaner) END;
- VAR
- par*: Par;
- dir-, stdDir-: Directory;
-
- cleaner: TrapCleaner;
- cleanerInstalled: BOOLEAN;
- (** Cleaner **)
- PROCEDURE (c: TrapCleaner) Cleanup;
- BEGIN
- par := NIL;
- cleanerInstalled := FALSE;
- END Cleanup;
-
- (** View **)
- PROCEDURE (v: View) Externalize- (VAR wr: Stores.Writer), EXTENSIBLE;
- BEGIN
- v.Externalize^(wr);
- wr.WriteVersion(maxVersion);
- wr.WriteXInt(execMark)
- END Externalize;
- PROCEDURE (v: View) Internalize- (VAR rd: Stores.Reader), EXTENSIBLE;
- VAR thisVersion, type: INTEGER;
- BEGIN
- v.Internalize^(rd);
- IF rd.cancelled THEN RETURN END;
- rd.ReadVersion(minVersion, maxVersion, thisVersion);
- IF rd.cancelled THEN RETURN END;
- rd.ReadXInt(type)
- END Internalize;
- (** Directory **)
- PROCEDURE (d: Directory) New* (): View, NEW, ABSTRACT;
- PROCEDURE (d: Directory) NewEnd* (): EndView, NEW, ABSTRACT;
- (* auxilliary procedures *)
- PROCEDURE IsIdent (VAR s: ARRAY OF CHAR): BOOLEAN;
- VAR i: INTEGER; ch: CHAR;
- BEGIN
- ch := s[0]; i := 1;
- IF ("A" <= CAP(ch)) & (CAP(ch) <= "Z") OR (ch >= 0C0X) & (ch # "×") & (ch # "÷") & (ch <= 0FFX) OR (ch = "_") THEN
- REPEAT
- ch := s[i]; INC(i)
- UNTIL ~( ("0" <= ch) & (ch <= "9") OR ("A" <= CAP(ch)) & (CAP(ch) <= "Z")
- OR (ch >= 0C0X) & (ch # "×") & (ch # "÷") & (ch <= 0FFX) OR (ch = "_") );
- RETURN (ch = 0X) & (i <= LEN(Kernel.Name))
- ELSE
- RETURN FALSE
- END
- END IsIdent;
- PROCEDURE Scan (VAR s: Scanner);
- VAR done: BOOLEAN;
- BEGIN
- s.s.Scan;
- IF (s.s.type = TextMappers.view) THEN
- IF Properties.ThisType(s.s.view, "DevCommanders.View") # NIL THEN s.s.type := execMark END
- ELSIF (s.s.type = TextMappers.string) & TextMappers.IsQualIdent(s.s.string) THEN
- s.s.type := qualident; s.qualident := s.s.string$
- ELSIF (s.s.type = TextMappers.string) & IsIdent(s.s.string) THEN
- s.ident := s.s.string$;
- TextMappers.ScanQualIdent(s.s, s.qualident, done);
- IF done THEN s.s.type := qualident ELSE s.s.type := ident END
- END
- END Scan;
- PROCEDURE GetParExtend (r: TextModels.Reader; VAR end: INTEGER);
- VAR v, v1: Views.View;
- BEGIN
- REPEAT r.ReadView(v);
- IF v # NIL THEN
- v1 := v;
- v := Properties.ThisType(v1, "DevCommanders.View") ;
- IF v = NIL THEN v := Properties.ThisType(v1, "DevCommanders.EndView") END
- END
- UNTIL r.eot OR (v # NIL);
- end := r.Pos(); IF ~r.eot THEN DEC(end) END
- END GetParExtend;
- PROCEDURE Unload (cmd: Dialog.String);
- VAR modname: Kernel.Name; str: Dialog.String; i: INTEGER; ch: CHAR; mod: Kernel.Module;
- BEGIN
- i := 0; ch := cmd[0];
- WHILE (ch # 0X) & (ch # ".") DO modname[i] := SHORT(ch); INC(i); ch := cmd[i] END;
- modname[i] := 0X;
- mod := Kernel.ThisLoadedMod(modname);
- IF mod # NIL THEN
- Kernel.UnloadMod(mod);
- IF mod.refcnt < 0 THEN
- str := modname$;
- Dialog.MapParamString("#Dev:Unloaded", str, "", "", str);
- StdLog.String(str); StdLog.Ln;
- Controls.Relink
- ELSE
- str := modname$;
- Dialog.ShowParamMsg("#Dev:UnloadingFailed", str, "", "")
- END
- END
- END Unload;
- PROCEDURE Execute (t: TextModels.Model; pos: INTEGER; VAR end: INTEGER; unload: BOOLEAN);
- VAR s: Scanner; beg, res: INTEGER; cmd: Dialog.String;
- BEGIN
- end := t.Length();
- s.s.ConnectTo(t); s.s.SetPos(pos); s.s.SetOpts({TextMappers.returnViews});
- Scan(s); ASSERT(s.s.type = execMark, 100);
- Scan(s);
- IF s.s.type IN {qualident, TextMappers.string} THEN
- beg := s.s.Pos() - 1; GetParExtend(s.s.rider, end);
- ASSERT(~cleanerInstalled, 101);
- Kernel.PushTrapCleaner(cleaner); cleanerInstalled := TRUE;
- NEW(par); par.text := t; par.beg := beg; par.end := end;
- IF s.s.type = qualident THEN cmd := s.qualident$ ELSE cmd := s.s.string$ END;
- IF unload (* & (s.s.type = qualident)*) THEN Unload(cmd) END;
- Dialog.Call(cmd, " ", res);
- par := NIL;
- Kernel.PopTrapCleaner(cleaner); cleanerInstalled := FALSE;
- END
- END Execute;
- PROCEDURE Track (v: View; f: Views.Frame; x, y: INTEGER; buttons: SET);
- VAR c: Models.Context; w, h, end: INTEGER; isDown, in, in0: BOOLEAN; m: SET;
- BEGIN
- c := v.context; c.GetSize(w, h); in0 := FALSE; in := TRUE;
- REPEAT
- IF in # in0 THEN
- f.MarkRect(0, 0, w, h, Ports.fill, Ports.invert, Ports.show); in0 := in
- END;
- f.Input(x, y, m, isDown);
- in := (0 <= x) & (x < w) & (0 <= y) & (y < h)
- UNTIL ~isDown;
- IF in0 THEN
- f.MarkRect(0, 0, w, h, Ports.fill, Ports.invert, Ports.hide);
- WITH c:TextModels.Context DO
- Execute(c.ThisModel(), c.Pos(), end,Controllers.modify IN buttons)
- ELSE Dialog.Beep
- END
- END
- END Track;
- (* StdView *)
- PROCEDURE (v: StdView) Externalize (VAR wr: Stores.Writer);
- BEGIN
- v.Externalize^(wr);
- wr.WriteVersion(maxStdVersion)
- END Externalize;
- PROCEDURE (v: StdView) Internalize (VAR rd: Stores.Reader);
- VAR thisVersion: INTEGER;
- BEGIN
- v.Internalize^(rd);
- IF rd.cancelled THEN RETURN END;
- rd.ReadVersion(minVersion, maxStdVersion, thisVersion)
- END Internalize;
- PROCEDURE (v: StdView) Restore (f: Views.Frame; l, t, r, b: INTEGER);
- CONST u = point;
- VAR c: Models.Context; a: TextModels.Attributes; font: Fonts.Font; color: Ports.Color;
- size, d, w, asc, dsc, fw: INTEGER; s: ARRAY 2 OF CHAR;
- BEGIN
- ASSERT(v.context # NIL, 20);
- c := v.context;
- WITH c: TextModels.Context DO a := c.Attr(); font := a.font; color := a.color
- ELSE font := Fonts.dir.Default(); color := Ports.defaultColor
- END;
- font.GetBounds(asc, dsc, fw);
- size := asc + dsc; d := size DIV 2;
- f.DrawOval(u, 0, u + size, size, Ports.fill, color);
- s := "!";
- w := font.StringWidth(s);
- f.DrawString(u + d - w DIV 2, size - dsc, Ports.background, s, font)
- END Restore;
- PROCEDURE (v: StdView) HandleCtrlMsg (f: Views.Frame; VAR msg: Controllers.Message;
- VAR focus: Views.View);
- BEGIN
- WITH msg: Controllers.TrackMsg DO
- Track(v, f, msg.x, msg.y, msg.modifiers)
- | msg: Controllers.PollCursorMsg DO
- msg.cursor := Ports.refCursor
- ELSE
- END
- END HandleCtrlMsg;
- PROCEDURE (v: StdView) HandlePropMsg (VAR msg: Properties.Message);
- VAR c: Models.Context; a: TextModels.Attributes; font: Fonts.Font; asc, dsc, fw: INTEGER;
- BEGIN
- WITH msg: Properties.Preference DO
- WITH msg: Properties.SizePref DO
- c := v.context;
- IF (c # NIL) & (c IS TextModels.Context) THEN
- a := c(TextModels.Context).Attr(); font := a.font
- ELSE font := Fonts.dir.Default()
- END;
- font.GetBounds(asc, dsc, fw);
- msg.h := asc + dsc; msg.w := msg.h + 2 * point
- | msg: Properties.ResizePref DO
- msg.fixed := TRUE
- | msg: Properties.FocusPref DO
- msg.hotFocus := TRUE
- | msg: TextSetters.Pref DO
- c := v.context;
- IF (c # NIL) & (c IS TextModels.Context) THEN
- a := c(TextModels.Context).Attr(); font := a.font
- ELSE font := Fonts.dir.Default()
- END;
- font.GetBounds(asc, msg.dsc, fw)
- | msg: Properties.TypePref DO
- IF Services.Is(v, msg.type) THEN msg.view := v END
- ELSE
- END
- ELSE
- END
- END HandlePropMsg;
-
-
- (* StdEndView *)
- PROCEDURE (v: StdEndView) Restore (f: Views.Frame; l, t, r, b: INTEGER);
- CONST u = point;
- VAR c: Models.Context; a: TextModels.Attributes; font: Fonts.Font; color: Ports.Color;
- size, w, asc, dsc, fw: INTEGER; s: ARRAY 2 OF CHAR;
- points: ARRAY 3 OF Ports.Point;
- BEGIN
- ASSERT(v.context # NIL, 20);
- c := v.context;
- WITH c: TextModels.Context DO a := c.Attr(); font := a.font; color := a.color
- ELSE font := Fonts.dir.Default(); color := Ports.defaultColor
- END;
- font.GetBounds(asc, dsc, fw);
- size := asc + dsc;
- points[0].x := 0; points[0].y := size;
- points[1].x := u + (size DIV 2); points[1].y := size DIV 2;
- points[2].x := u + (size DIV 2); points[2].y := size;
- f.DrawPath(points, 3, Ports.fill, color, Ports.closedPoly)
- END Restore;
-
- PROCEDURE (v: StdEndView) HandlePropMsg (VAR msg: Properties.Message);
- VAR c: Models.Context; a: TextModels.Attributes; font: Fonts.Font; asc, dsc, fw: INTEGER;
- BEGIN
- WITH msg: Properties.Preference DO
- WITH msg: Properties.SizePref DO
- c := v.context;
- IF (c # NIL) & (c IS TextModels.Context) THEN
- a := c(TextModels.Context).Attr(); font := a.font
- ELSE font := Fonts.dir.Default()
- END;
- font.GetBounds(asc, dsc, fw);
- msg.h := asc + dsc; msg.w := (msg.h + 2 * point) DIV 2
- | msg: Properties.ResizePref DO
- msg.fixed := TRUE
- | msg: Properties.FocusPref DO
- msg.hotFocus := TRUE
- | msg: TextSetters.Pref DO
- c := v.context;
- IF (c # NIL) & (c IS TextModels.Context) THEN
- a := c(TextModels.Context).Attr(); font := a.font
- ELSE font := Fonts.dir.Default()
- END;
- font.GetBounds(asc, msg.dsc, fw)
- | msg: Properties.TypePref DO
- IF Services.Is(v, msg.type) THEN msg.view := v END
- ELSE
- END
- ELSE
- END
- END HandlePropMsg;
- (* StdDirectory *)
- PROCEDURE (d: StdDirectory) New (): View;
- VAR v: StdView;
- BEGIN
- NEW(v); RETURN v
- END New;
-
- PROCEDURE (d: StdDirectory) NewEnd (): EndView;
- VAR v: StdEndView;
- BEGIN
- NEW(v); RETURN v
- END NewEnd;
- PROCEDURE Deposit*;
- BEGIN
- Views.Deposit(dir.New())
- END Deposit;
- PROCEDURE DepositEnd*;
- BEGIN
- Views.Deposit(dir.NewEnd())
- END DepositEnd;
- PROCEDURE SetDir* (d: Directory);
- BEGIN
- dir := d
- END SetDir;
- PROCEDURE Init;
- VAR d: StdDirectory;
- BEGIN
- NEW(d); dir := d; stdDir := d;
- NEW(cleaner); cleanerInstalled := FALSE;
- END Init;
- BEGIN
- Init
- END DevCommanders.
|