Syntax10.Scn.FntSyntax10i.Scn.Fnt!AStampElemsAlloc6 Nov 95WSyntax10b.Scn.Fnt0"RsMODULE DialogInsert; (* Markus Knasmller 3 Aug 94 -  *) IMPORT DialogFrames, DialogListBoxes, Dialogs, DialogTexts, Oberon, TextFrames, Texts, Viewers; CONST dlgItemsIni = "DlgItems.Ini"; TYPE Item = RECORD name: ARRAY 32 OF CHAR; cmd: ARRAY 48 OF CHAR; END; DlgItems = ARRAY 100 OF Item; VAR wr: Texts.Writer; nrOfItems: INTEGER; dlgItems: DlgItems; PROCEDURE Open*; VAR i, x, y: INTEGER; panel: Dialogs.Panel; w: Texts.Writer; t: Texts.Text; o: Dialogs.Object; BEGIN panel := Dialogs.cmdPanel; o := panel.NamedObject ("l"); WITH o: DialogListBoxes.Item DO Texts.OpenWriter (w); Texts.WriteString (w, dlgItems[0].name); FOR i := 1 TO nrOfItems - 1 DO Texts.WriteLn (w); Texts.WriteString (w, dlgItems[i].name) END; t := TextFrames.Text (""); Texts.Append (t, w.buf); o.SetMenu (t) ELSE HALT (99) END END Open; PROCEDURE ReadInt (o: Dialogs.Object; VAR res: INTEGER); (* reads an integer from a dialogtext element *) VAR t: Texts.Text; s: Texts.Scanner; BEGIN WITH o: DialogTexts.Item DO t := o.GetText (); Texts.OpenScanner (s, t, 0); Texts.Scan (s); res := Dialogs.ok; IF s.class = Texts.Int THEN Texts.WriteInt (wr, s.i, 0); Texts.Append (Oberon.Par.text, wr.buf) ELSE res := Dialogs.wrongInput END ELSE res := Dialogs.wrongInput END; END ReadInt; PROCEDURE ReadName (o: Dialogs.Object); VAR t: Texts.Text; r: Texts.Reader; string: ARRAY 32 OF CHAR; i: INTEGER; ch: CHAR; BEGIN WITH o: DialogTexts.Item DO t := o.GetText (); Texts.OpenReader (r, t, 0); Texts.Read (r, ch); i := 0; WHILE ~r.eot DO string[i] := ch; INC (i); Texts.Read (r, ch) END; string[i] := 0X ELSE END; Texts.WriteString (wr, string); Texts.Delete (Oberon.Par.text, 0, Oberon.Par.text.len); Texts.Append (Oberon.Par.text, wr.buf) END ReadName; PROCEDURE ReadCmd (o: Dialogs.Object; VAR string: ARRAY OF CHAR); VAR t: Texts.Text; s: Texts.Scanner; BEGIN WITH o: DialogTexts.Item DO t := o.GetText (); Texts.OpenScanner (s, t, 0); Texts.Scan (s); IF s.class = Texts.Name THEN COPY (s.s, string) ELSE COPY ("", string) END ELSE END END ReadCmd; PROCEDURE ReadPar (o: Dialogs.Object; VAR string: ARRAY OF CHAR); VAR t: Texts.Text; r: Texts.Reader; ch: CHAR; i: INTEGER; BEGIN WITH o: DialogTexts.Item DO t := o.GetText (); Texts.OpenReader (r, t, 0); Texts.Read (r, ch); i := 0; WHILE ~r.eot DO string[i] := ch; INC (i); Texts.Read (r, ch) END; string[i] := 0X ELSE END END ReadPar; PROCEDURE ReadXYWH; (* reads the lower left corner coordinates, wide and height from the Demo-Panel *) VAR ox, oy, ow, oh: Dialogs.Object; i, res, x, y: INTEGER; panel, p: Dialogs.Panel; BEGIN panel := Dialogs.cmdPanel; ox := panel.NamedObject ("x"); oy := panel.NamedObject ("y"); ow := panel.NamedObject ("w"); oh := panel.NamedObject ("h"); DialogFrames.GetCaretPosition (p, x, y); ReadInt (ox, res); IF res # 0 THEN Texts.WriteInt (wr, x, 0); Texts.Append (Oberon.Par.text, wr.buf) END; Texts.WriteString (wr, " "); Texts.Append (Oberon.Par.text, wr.buf); ReadInt (oy, res); IF res # 0 THEN Texts.WriteInt (wr, y, 0); Texts.Append (Oberon.Par.text, wr.buf) END; Texts.WriteString (wr, " "); Texts.Append (Oberon.Par.text, wr.buf); ReadInt (ow, res); IF res # 0THEN Texts.WriteInt (wr, -1, 0); Texts.Append (Oberon.Par.text, wr.buf) END; Texts.WriteString (wr, " "); Texts.Append (Oberon.Par.text, wr.buf); ReadInt (oh, res); IF res # 0THEN Texts.WriteInt (wr, -1, 0); Texts.Append (Oberon.Par.text, wr.buf) END; END ReadXYWH; PROCEDURE ReadNameCmdPar (VAR cmd, par: ARRAY OF CHAR); VAR on, op, oc: Dialogs.Object; BEGIN on := Dialogs.cmdPanel.NamedObject ("name"); oc := Dialogs.cmdPanel.NamedObject ("cmd"); op := Dialogs.cmdPanel.NamedObject ("par"); ReadName (on); ReadCmd (oc, cmd); ReadPar (op, par) END ReadNameCmdPar; PROCEDURE Do*; VAR o, last: Dialogs.Object; p: Dialogs.Panel; name: Texts.Buffer; cmd, par, insert: ARRAY 64 OF CHAR; t: Texts.Text; res: INTEGER; r: Texts.Reader; ch: CHAR; v: Viewers.Viewer; BEGIN last:= Dialogs.lastin; v := Oberon.Par.vwr; Oberon.Par.text := TextFrames.Text (""); Texts.OpenWriter (wr); ReadNameCmdPar (cmd, par); Texts.WriteString (wr, " "); Texts.Append (Oberon.Par.text, wr.buf); ReadXYWH; o := Dialogs.cmdPanel.NamedObject ("l"); WITH o: DialogListBoxes.Item DO IF (o.selline >= 0) & (o.selline < nrOfItems) THEN COPY (dlgItems[o.selline].cmd, insert); END END; Oberon.Call (insert, Oberon.Par, FALSE, res); IF (Dialogs.lastin # last) & (par[0] # 0X) THEN Dialogs.lastin.SetPar (par) END; IF (Dialogs.lastin # last) & (cmd[0] # 0X) THEN Dialogs.lastin.SetCmd (cmd) END; t := v.dsc (TextFrames.Frame).text; Texts.OpenReader (r, t, t.len - 1); Texts.Read (r, ch); IF ch = "!" THEN Texts.Delete (t, t.len - 1, t.len) END END Do; PROCEDURE Init; VAR t: Texts.Text; s: Texts.Scanner; BEGIN t := TextFrames.Text (dlgItemsIni); Texts.OpenScanner (s, t, 0); Texts.Scan (s); nrOfItems := -1; WHILE ~s.eot DO IF s.class = Texts.Name THEN INC (nrOfItems); COPY (s.s, dlgItems[nrOfItems].name); Texts.Scan (s); COPY (s.s, dlgItems[nrOfItems].cmd) END; Texts.Scan (s) END END Init; BEGIN Init END DialogInsert.