ðð{Syntax10.Scn.FntSyntax10i.Scn.FntüÿÿÿÀÔ°­MarkElemsAllocõÿÿÿ€‹ðIStampElemsAlloc16 Mar 98ñþÿÿÐûqInfoElemsAllocVSyntax10.Scn.Fnt™õÿÿÿSðIStampElemsAlloc16 Mar 98¹"Title": MsgWindows "Author": Martin Rammerstorfer (MR) "Abstract": . "Keywords": startup, author, info "Version": 1 "From": 13.04.97 18:24:00 "Until":  "Changes": no changes "Hints":a÷ûÿÿ€8ÀÔFoldElemsNewëSyntax10.Scn.FntSyntax10b.Scn.Fnt        Syntax10i.Scn.Fnt E White* = 0; Red* = 1; Green* = 2; Magenta* = 4; Yellow* = 5; LightBlue* = 10; Grey0* = 12; Grey1* = 13; Grey2* = 14; Black* = 15; BackGndCol* = Grey1; AlignLeft* = 1; AlignMiddle* = 0; AlignRight* = -1; AlignBottom* = 1; AlignTop* = -1; (* WritePos *) NoTime* = 0; Message* = 1; Warning* = 2; Error* = 3; InfoMsg* = 4; (* Available MsgWindows *) BYes* = 0; BNo* = 1; BCancel* = 2; BAddToLog* = 3; (* Available buttons *) CR = 0DX; chm = 3; cvm = 2; MsgMes = 2; ML = 2; MM = 1; MR = 0; (* Mouse buttons *) Unit* = TextFrames.Unit; ÿÿÿÿ€8ÀÔŸúÿÿ€8ÀÔíSyntax10.Scn.FntSyntax10b.Scn.Fnt   E  ¡þÿÿ€8ÀÔFoldElemsNewmSyntax10.Scn.FntSyntax10b.Scn.Fntâó x-, y-, w-, h-: INTEGER; wait: OberonTicks; bmp: Bitmaps.Bitmap; isSaved: BOOLEAN; content: Texts.Text; backGndCol: INTEGER; cntAbsNr, cntNr: LONGINT; firstPrint, idlePrint: PrintProc; isOpen: BOOLEAN; mx, my: INTEGER; END;Syntax10i.Scn.Fnt*ÿÿÿÿ€8ÀÔ •þÿÿ€8ÀÔïSyntax10.Scn.FntSyntax10b.Scn.Fnt  Syntax10i.Scn.Fnt   } name-: Name; nW-, nH-, nX-, nY-: INTEGER; (* Header *) mW-, mH-, mX-, mY-: INTEGER; (* Body *) type-: INTEGER; END;&ÿÿÿÿ€8ÀÔu OberonTicks* = LONGINT; Name* = ARRAY 64 OF CHAR; String* = ARRAY OF CHAR; InfoWin* = POINTER TO InfoWinDesc; PrintProc* = PROCEDURE (s: InfoWin; x, y, w, h: INTEGER; absNr, nr: LONGINT); InfoWinDesc* = RECORD  InfoWin: window without frame and header  MsgWin* = POINTER TO MsgWinDesc; MsgWinDesc* = RECORD (InfoWinDesc)  MsgWin: Window with frame and header  ÿÿÿÿ€8ÀÔGýÿÿ€8ÀÔ·Syntax10.Scn.FntSyntax10i.Scn.Fnt1(Syntax10b.Scn.Fnt&(S = wMsgTime: OberonTicks; (* Time in animated text *) wMsgNr: INTEGER; (* Color in animated text in MsgWindows (idle) *) idleStr: ARRAY 5 OF CHAR; (* Animated text in MsgWindows (idle) *) bigFnt, headFnt, butFnt*, txtFnt: Fonts.Font; (* The fonts used in the MsgWindows *) w: Texts.Writer; procDepth: INTEGER; (* Nr of skipped procs for displaying variables in MsgWindows (used in ShowVars) *) defElems*: ARRAY 32 OF Texts.Elem; (* Will be initialized in PopupElems.Mod (Procedure: Init) *) lastCmd: INTEGER;ÿÿÿÿ€8ÀÔ¢ÿÿÿ€8ÀÔCSyntax10.Scn.FntSyntax10i.Scn.Fnt (* Forward declarations *) ÿÿÿÿ€8ÀÔ*‡ÿÿÿ€8ÀÔCSyntax10.Scn.FntSyntax10b.Scn.Fnt7 BEGIN IF x < y THEN RETURN y END; RETURN x END Max; ÿÿÿÿ€8ÀÔC Syntax10b.Scn.Fnt BÌþÿÿ€8ÀÔ#Syntax10.Scn.Fnt VAR cdx, cx, cy, cw, ch: INTEGER; pat: Display.Pattern; BEGIN len := 0; width := 0; height := 0; WHILE str [len] # 0X DO Display.GetChar (fnt.raster, str [len], cdx, cx, cy, cw, ch, pat); INC (width, cdx); height := Max (height, ch); INC (len) END END GetStrDim; ÿÿÿÿ€8ÀÔ¾Ñÿÿ€8ÀÔœ'Syntax10.Scn.FntSyntax10i.Scn.FntSyntax10b.Scn.Fntÿÿÿ€8ÀÔFoldElemsNew#Syntax10.Scn.Fnt]] BEGIN s.x := (Display.Width - s.w) DIV 2; s.y := (Display.Height - s.h) DIV 2 END CalcPos; 0ÿÿÿÿ€8ÀÔ2üÿÿ€8ÀÔ7Syntax10.Scn.Fnt„Syntax10b.Scn.Fnt liþÿÿ€8ÀÔFoldElemsNew#Syntax10.Scn.Fntuu IF ch = CR THEN mW := Max (mW, wid); wid := 0; lineH := Max (lineH, r.fnt.maxY); INC (curH, lineH); lineH := 0 ELSIF r.elem # NIL THEN INC (wid, SHORT (r.elem.W DIV Unit)); lineH := Max (lineH, SHORT (r.elem.H DIV Unit)) ELSE Display.GetChar (r.fnt.raster, ch, dx, x, y, w, h, p); lineH := Max (h, lineH); INC (wid, dx) END; Texts.Read (r, ch) Syntax10i.Scn.Fnt<ÿÿÿÿ€8ÀÔYÄ VAR r: Texts.Reader; ch: CHAR; wid, dx, x, y, w, h, curH, lineH: INTEGER; p: LONGINT; BEGIN IF (txt = NIL) OR (txt.len = 0) THEN RETURN FALSE END; curH := 0; lineH := 0; wid := 0; Texts.OpenReader (r, txt, 0); Texts.Read (r, ch); WHILE ~r.eot DO  Iterate through text and calculate measurement of the text  END; mW := Max (mW, wid) + 2 * chm; INC (curH, lineH); mH := Max (curH + 2 * cvm, mH); (* Set InfoWin size *) RETURN TRUE END Measure; ÿÿÿÿ€8ÀÔ B¼þÿÿ€8ÀÔCSyntax10.Scn.Fnt.Syntax10b.Scn.Fnt È VAR dummy: BOOLEAN; BEGIN IF s.isOpen THEN RETURN FALSE END; s.isOpen := TRUE; s.backGndCol := backCol; s.wait := wait; s.cntAbsNr := -1; s.cntNr := -1; s.content := txt; dummy := s.Measure (txt, s.w, s.h); s.CalcPos (); RETURN TRUE END OpenInfo; ÿÿÿÿ€8ÀÔ 4Vÿÿÿ€8ÀÔ#Syntax10.Scn.Fntˆˆ BEGIN s.firstPrint := firstPrint; s.idlePrint := idlePrint; s.h := Max (s.h, h); s.w := Max (s.w, w); s.CalcPos () END SetOwnPrint; ÿÿÿÿ€8ÀÔ bÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt|| BEGIN Texts.Save (s.content, 0, s.content.len, w.buf); Texts.WriteLn (w); Texts.Append (Oberon.Log, w.buf) END AddToLog; ÿÿÿÿ€8ÀÔ ?´ýÿÿ€8ÀÔ¸Syntax10.Scn.FntcÈþÿÿ€8ÀÔFoldElemsNew#Syntax10.Scn.Fnt Display.GetChar (fnt.raster, str [i], cdx, cx, cy, cw, ch, pat); IF ((relX + cw) <= s.w) & (relX >= 0) & ((relY + ch) <= s.h) & (relY >= 0) THEN Display.CopyPattern (col, pat, s.x + relX + cx, s.y + relY + cy - fnt.minY, Display.paint) END; INC (relX, cdx); INC (i) Syntax10i.Scn.Fntÿÿÿÿ€8ÀÔ• VAR i, cdx, cx, cy, cw, ch: INTEGER; pat: Display.Pattern; BEGIN i := 0; WHILE str [i] # 0X DO  Write each character of str  END END WritePos; ÿÿÿÿ€8ÀÔ ,wÿÿÿ€8ÀÔ#Syntax10.Scn.Fntgg BEGIN Display.ReplConst (col, s.x + relX, s.y + relY, width, height, Display.invert); END InvertRect; ÿÿÿÿ€8ÀÔ ,wÿÿÿ€8ÀÔ#Syntax10.Scn.Fntgg BEGIN Display.ReplConst (col, s.x + relX, s.y + relY, width, height, Display.replace); END PrintRect; ÿÿÿÿ€8ÀÔd>ùÿÿ€8ÀÔ…Syntax10.Scn.Fntfÿÿÿ€8ÀÔFoldElemsNew#Syntax10.Scn.Fntxxe: Texts.Elem; ch: CHAR; dx, x, y, w, h, maxH, i: INTEGER; pat: Display.Pattern; p: LONGINT; m: TextFrames.DisplayMsg;ÿÿÿÿ€8ÀÔF$ÿÿÿ€8ÀÔ#Syntax10.Scn.Fntºº IF r1.elem # NIL THEN maxH := Max (maxH, SHORT (r1.elem.H DIV Unit)) ELSE Display.GetChar (r1.fnt.raster, ch, dx, x, y, w, h, p); maxH := Max (h, maxH) END; Texts.Read (r1, ch) ÿÿÿÿ€8ÀÔ&Syntax10b.Scn.FntGÁÿÿÿ€8ÀÔ$Syntax10i.Scn.Fnt Mouse pressed on this elem €ÿÿÿÿ€8ÀÔù> VAR  BEGIN Texts.Read (r1, ch); maxH := 0; WHILE ~r1.eot & (ch # CR) DO  END; DEC (Y, maxH); IF Y < pY THEN RETURN END; LOOP Texts.Read (r, ch); IF r.eot OR (ch = CR) THEN EXIT ELSIF r.elem # NIL THEN e := r.elem; IF (X + (e.W DIV Unit)) <= (pX + pW) THEN m.prepare := FALSE; m.fnt := r.fnt; m.col := r.col; m.pos := Texts.Pos (r) - 1; m.frame := NIL; m.X0 := X; m.Y0 := Y; m.elemFrame := NIL; e.handle (e, m); IF ((s.mx + s.x) >= X) & ((s.my + s.y) >= Y) & ((s.mx + s.x) <= (X + e.W DIV Unit)) & ((s.my + s.y) <= (Y + e.H DIV Unit)) THEN i := 0; WHILE (i < 32) & (defElems [i] # e) DO INC (i) END; IF i # 32 THEN lastCmd := i END; IF i = BAddToLog THEN s.AddToLog () END; s.InvertRect (X - s.x, Y - s.y, SHORT (e.W DIV Unit), SHORT (e.H DIV Unit), Black) END END; INC (X, SHORT (e.W DIV Unit)) ELSE Display.GetChar (r.fnt.raster, ch, dx, x, y, w, h, pat); IF (X + dx) <= (pX + pW) THEN Display.CopyPattern (r.col, pat, X + x, Y + y, Display.paint) END; INC (X, dx) END END END DrawLine; ÿÿÿÿ€8ÀÔ -úþÿÿ€8ÀÔ#Syntax10.Scn.Fntää VAR R, R1: Texts.Reader; X, Y: INTEGER; BEGIN X := pX + chm; Y := pY + pH; Texts.OpenReader (R, s.content, 0); Texts.OpenReader (R1, s.content, 0); WHILE ~R.eot DO s.DrawLine (R, R1, pX, pY, pW, pH, X, Y) END END DrawText; ÿÿÿÿ€8ÀÔ Cÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt›› BEGIN lastCmd := -1; IF (s.bmp # NIL) & (s.content # NIL) & (s.content.len # 0) THEN s.DrawText (s.content, s.x, s.y, s.w, s.h) END END DrawContent; ÿÿÿÿ€8ÀÔ /ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt¯¯ BEGIN IF s.content # NIL THEN s.DrawContent () END; IF s.firstPrint # NIL THEN INC (s.cntAbsNr); s.firstPrint (s, s.x, s.y, s.w, s.h, s.cntAbsNr, 0) END END PrintFirst; 4ÿÿÿÿ€8ÀÔ Lÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt’’ BEGIN IF s.idlePrint # NIL THEN INC (s.cntAbsNr); INC (s.cntNr); s.idlePrint (s, s.x, s.y, s.w, s.h, s.cntAbsNr, s.cntNr) END END PrintIdle; ,ÿÿÿÿ€8ÀÔ WÎýÿÿ€8ÀÔŸSyntax10.Scn.Fntdrÿÿÿ€8ÀÔFoldElemsNew#Syntax10.Scn.Fntll AlignLeft: (* x := x *) | AlignRight: x := x + w - width | AlignMiddle: x := x + ((w - width) DIV 2) ÿÿÿÿ€8ÀÔpÿÿÿ€8ÀÔ#Syntax10.Scn.Fntnn AlignTop: y := y + h - height | AlignBottom: (* y := y *) | AlignMiddle: y := y + ((h - height) DIV 2) ÿÿÿÿ€8ÀÔ” VAR len, width, height: INTEGER; BEGIN GetStrDim (str, fnt, width, height, len); CASE alignX OF  END; CASE alignY OF  END END GetAlignPos; ÿÿÿÿ€8ÀÔ}þÿÿ€8ÀÔ#Syntax10.Scn.Fntaa BEGIN IF s.isSaved THEN Bitmaps.CopyBlock (s.bmp, Bitmaps.Disp, 0, 0, s.w, s.h, s.x, s.y, 0); s.isSaved := FALSE; s.x := x; s.y := y; Bitmaps.CopyBlock (Bitmaps.Disp, s.bmp, s.x, s.y, s.w, s.h, 0, 0, 0); s.isSaved := TRUE; s.PrintRect (0, 0, s.w, s.h, s.backGndCol); s.cntNr := 0; s.PrintFirst () ELSE s.x := x; s.y := y END END SetPos; .ÿÿÿÿ€8ÀÔÿÿÿ€8ÀÔ#Syntax10.Scn.FntËË BEGIN s.bmp := Bitmaps.New (s.w, s.h); Bitmaps.CopyBlock (Bitmaps.Disp, s.bmp, s.x, s.y, s.w, s.h, 0, 0, 0); s.isSaved := TRUE; s.PrintRect (0, 0, s.w, s.h, s.backGndCol); s.PrintFirst () END Draw; ÿÿÿÿ€8ÀÔ§÷ÿÿ€8ÀÔåSyntax10.Scn.Fntsÿÿÿ€8ÀÔFoldElemsNew#Syntax10.Scn.Fntkkmx, my, hx, hy, mx2, my2: INTEGER; endTick, wTick: OberonTicks; keys, keySum: SET; pressed, cmd: BOOLEAN;ÿÿÿÿ€8ÀÔ—Àûÿÿ€8ÀÔSyntax10.Scn.FntÕUýÿÿ€8ÀÔFoldElemsNewÛSyntax10.Scn.Fnt¬—ÿÿÿ€8ÀÔFoldElemsNew#Syntax10.Scn.FntGGwTick := Oberon.Time () + 25; WHILE Oberon.Time () < wTick DO END;Syntax10i.Scn.Fntÿÿÿÿ€8ÀÔÑ keySum := {}; WHILE keys # {} DO Input.Mouse (keys, mx, my); DEC (mx, s.x); DEC (my, s.y); s.InvertRect (mx - hx, my - hy, s.w, s.h, Black); REPEAT  Wait a moment  Input.Mouse (keys, mx2, my2); DEC (mx2, s.x); DEC (my2, s.y); keySum := keySum + keys UNTIL (mx2 # mx) OR (my2 # my) OR (keys # {MR}); s.InvertRect (mx - hx, my - hy, s.w, s.h, Black) END; IF keySum = {MR} THEN s.SetPos (s.x + mx - hx, s.y + my - hy) END Syntax10i.Scn.Fnt ÿÿÿÿ€8ÀÔ-$Input.Mouse (keys, mx, my); DEC (mx, s.x); DEC (my, s.y); pressed := pressed OR (MM IN keys) OR (ML IN keys); cmd := pressed & (keys = {}); keySum := keySum + keys; hx := mx; hy := my; IF keys = {MR} THEN  Move InfoWin to a new position  END; IF MR IN keySum THEN keySum := {} ENDSyntax10i.Scn.Fntÿÿÿÿ€8ÀÔ}±þÿÿ€8ÀÔúSyntax10.Scn.Fnt1xÿÿÿ€8ÀÔFoldElemsNew#Syntax10.Scn.FntffIF lastCmd # -1 THEN endTick := Oberon.Time () + 50; WHILE Oberon.Time () < endTick DO END ENDSyntax10i.Scn.Fnt"ÿÿÿÿ€8ÀÔV s.mx := mx; s.my := my; s.DrawContent ();  Wait a moment, if button pressed  8ÿÿÿÿ€8ÀÔu VAR  BEGIN endTick := Oberon.Time () + s.wait; keys := {}; keySum := {}; mx := -1; my := -1; cmd := FALSE; pressed := FALSE; REPEAT s.PrintIdle ();  Handle mouse  UNTIL ((Oberon.Time () >= endTick) & (s.wait > 0)) OR ((keySum # {}) & (keys = {})) OR cmd; IF cmd & ~(MR IN keySum) THEN  Redraw content and invert selected elem (if specified)  END END Wait; $ÿÿÿÿ€8ÀÔÿÿÿ€8ÀÔ#Syntax10.Scn.FntÊÊ BEGIN IF s.isSaved & (s.bmp # NIL) THEN Bitmaps.CopyBlock (s.bmp, Bitmaps.Disp, 0, 0, s.w, s.h, s.x, s.y, 0); s.isSaved := FALSE END; s.bmp := NIL; s.content := NIL; s.isOpen := FALSE END Close; $ÿÿÿÿ€8ÀÔjÿÿÿ€8ÀÔCSyntax10.Scn.FntSyntax10b.Scn.Fnt4T BEGIN IF ~s.isOpen THEN RETURN END; s.Draw (); s.Wait (); s.Close () END Show; ÿÿÿÿ€8ÀÔ§ (* Class InfoWin *) PROCEDURE (s: InfoWin) CalcPos* ();  Calculate center of screen for opening InfoWin  PROCEDURE (s: InfoWin) Measure* (txt: Texts.Text; VAR mW, mH: INTEGER): BOOLEAN;  PROCEDURE (s: InfoWin) OpenInfo* (backCol: INTEGER; txt: Texts.Text; wait: OberonTicks): BOOLEAN;  PROCEDURE (s: InfoWin) SetOwnPrint* (w, h: INTEGER; firstPrint, idlePrint: PrintProc);  PROCEDURE (s: InfoWin) AddToLog* ();  Append text to Logfile  PROCEDURE (s: InfoWin) WritePos* (relX, relY, col: INTEGER; VAR str: String; fnt: Fonts.Font);  PROCEDURE (s: InfoWin) InvertRect* (relX, relY, width, height, col: INTEGER);  Invert rectangle in InfoWin  PROCEDURE (s: InfoWin) PrintRect* (relX, relY, width, height, col: INTEGER);  Draw filled rectangle  PROCEDURE (s: InfoWin) DrawLine (VAR r, r1: Texts.Reader; pX,pY,pW,pH,X: INTEGER; VAR Y: INTEGER);  PROCEDURE (s: InfoWin) DrawText* (txt: Texts.Text; pX, pY, pW, pH: INTEGER);  Draw text into InfoWin  PROCEDURE (s: InfoWin) DrawContent* ();  Draw content of InfoWin  PROCEDURE (s: InfoWin) PrintFirst* ();  Called if InfoWin is first drawn (or after a move)  PROCEDURE (s: InfoWin) PrintIdle* ();  Called if InfoWin is waiting (Method Wait)  PROCEDURE (s: InfoWin) GetAlignPos* (VAR x, y: INTEGER; w, h, alignX, alignY: INTEGER; VAR str: String; fnt: Fonts.Font);  PROCEDURE (s: InfoWin) SetPos* (x, y: INTEGER);  Move InfoWin to a new position on the screen  PROCEDURE (s: InfoWin) Draw* ();  Draw InfoWin to screen  PROCEDURE (s: InfoWin) Wait* ();  Wait until mouse-button or timeout  PROCEDURE (s: InfoWin) Close* ();  Close InfoWin (remove from screen)  PROCEDURE (s: InfoWin) Show* ();  Calls Draw, Wait and Close  ÿÿÿÿ€8ÀÔNóÿÿ€8ÀÔW Syntax10.Scn.FntSyntax10i.Scn.FntSyntax10b.Scn.FntEþÿÿ€8ÀÔFoldElemsNew#Syntax10.Scn.Fnt™™ VAR dummy: BOOLEAN; len: INTEGER; BEGIN GetStrDim (m.name, headFnt, m.nW, m.nH, len); dummy := m.Measure (m.content, m.mW, m.mH); m.mX := MsgMes; m.mY := MsgMes; m.w := Max (m.mW, m.nW) + 2 * MsgMes; m.h := m.mH + 3 * MsgMes + m.nH; m.nX := MsgMes; m.nY := m.mH + 2 * MsgMes; m.mW := Max (m.mW, m.nW); m.nW := m.mW; m.x := (Display.Width - m.w) DIV 2; m.y := (Display.Height - m.h) DIV 2 END CalcPos; /ÿÿÿÿ€8ÀÔ<Öþÿÿ€8ÀÔCSyntax10.Scn.FntSyntax10b.Scn.Fnt Ãè BEGIN IF m.isOpen THEN RETURN FALSE END; m.isOpen := TRUE; m.type := -1; m.backGndCol := BackGndCol; m.wait := wait; m.cntAbsNr := -1; m.cntNr := -1; m.content := txt; m.name := name; m.CalcPos (); RETURN TRUE END OpenMsg; ÿÿÿÿ€8ÀÔ 4Rÿÿÿ€8ÀÔ#Syntax10.Scn.FntŒŒ BEGIN m.firstPrint := firstPrint; m.idlePrint := idlePrint; m.mW := Max (m.mW, w); m.mH := Max (m.mH, h); m.CalcPos () END SetOwnPrint; ÿÿÿÿ€8ÀÔ Óþÿÿ€8ÀÔ#Syntax10.Scn.Fnt   BEGIN Texts.SetFont (w, headFnt); Texts.WriteString (w, m.name); Texts.WriteLn (w); Texts.Append (Oberon.Log, w.buf); Texts.Save (m.content, 0, m.content.len, w.buf); Texts.SetFont (w, txtFnt); Texts.WriteLn (w); Texts.Append (Oberon.Log, w.buf) END AddToLog; #ÿÿÿÿ€8ÀÔ Cÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt›› BEGIN IF (m.bmp # NIL) & (m.content # NIL) & (m.content.len # 0) THEN m.DrawText (m.content, m.x + m.mX, m.y + m.mY, m.mW, m.mH) END END DrawContent; ÿÿÿÿ€8ÀÔ Þýÿÿ€8ÀÔ#Syntax10.Scn.Fnt VAR width, height, len: INTEGER; x, y: INTEGER; BEGIN GetStrDim (m.name, headFnt, width, height, len); m.PrintRect (m.nX, m.nY, m.nW, m.nH, Grey0); m.PrintRect (m.mX, m.mY, m.mW, m.mH, Grey0); x := m.nX; y := m.nY; m.GetAlignPos (x, y, m.nW, m.nH, AlignMiddle, AlignTop, m.name, headFnt); m.WritePos (x, y, Black, m.name, headFnt); IF m.content # NIL THEN m.DrawContent () END; IF m.firstPrint # NIL THEN INC (m.cntAbsNr); m.firstPrint (m, m.mX, m.mY, m.mW, m.mH, m.cntAbsNr, 0) END END PrintFirst; 4ÿÿÿÿ€8ÀÔ Hÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt–– BEGIN IF m.idlePrint # NIL THEN INC (m.cntAbsNr); INC (m.cntNr); m.idlePrint (m, m.mX, m.mY, m.mW, m.mH, m.cntAbsNr, m.cntNr) END END PrintIdle; ,ÿÿÿÿ€8ÀÔ\ (* Class MsgWin *) PROCEDURE (m: MsgWin) CalcPos* ();  Calculate center of screen for opening MsgWin  PROCEDURE (m: MsgWin) OpenMsg* (name: Name; txt: Texts.Text; wait: OberonTicks): BOOLEAN;  PROCEDURE (m: MsgWin) SetOwnPrint* (w, h: INTEGER; firstPrint, idlePrint: PrintProc);  PROCEDURE (m: MsgWin) AddToLog* ();  Append header and text to Logfile  PROCEDURE (m: MsgWin) DrawContent* ();  Draw content of MsgWin  PROCEDURE (m: MsgWin) PrintFirst* ();  Called if InfoWin is first drawn (or after a move)  PROCEDURE (m: MsgWin) PrintIdle* ();  Called if InfoWin is waiting (Method Wait)  ÿÿÿÿ€8ÀÔN¥ýÿÿ€8ÀÔCSyntax10.Scn.FntXSyntax10b.Scn.Fnt» VAR time: OberonTicks; yPos, xPos, W, H, width, height, len: INTEGER; BEGIN GetStrDim (idleStr, bigFnt, width, height, len); WITH s: MsgWin DO yPos := s.nY + 2; xPos := s.nX + 2; H := s.nH - 4; W := H ELSE yPos := s.y - height - 6; xPos := 2; w := width + 4; h := height + 4 END; time := Oberon.Time (); IF (wMsgTime + 100) > time THEN RETURN END; wMsgTime := time; wMsgNr := (wMsgNr + 1) MOD 16; s.PrintRect (xPos, yPos, W, H, White); s.WritePos (xPos + W DIV 2 - width DIV 2, yPos, wMsgNr, idleStr, bigFnt) END MsgBoxIdle; ÿÿÿÿ€8ÀÔEzâÿÿ€8ÀÔºSyntax10.Scn.FntO¹ÿÿÿ€8ÀÔFoldElemsNew#Syntax10.Scn.Fnt%% BEGIN Texts.Write (w, ch) END Ch; ÿÿÿÿ€8ÀÔ$³ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt++ BEGIN Texts.WriteString (w, s) END Str; ÿÿÿÿ€8ÀÔ³ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt++ BEGIN Texts.WriteInt (w, i, 0) END Int; ÿÿÿÿ€8ÀÔ#²ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt,, BEGIN Texts.SetColor (w, col) END Color; ÿÿÿÿ€8ÀÔ,ÿÿÿ€8ÀÔ#Syntax10.Scn.FntÃà BEGIN RETURN ((ORD (ch) >= ORD ('A')) & (ORD (ch) <= ORD ('Z'))) OR ((ORD (ch) >= ORD ('a')) & (ORD (ch) <= ORD ('z'))) OR (ch = '.') OR (ch = '[') OR (ch = ']') END IsNameChar; ÿÿÿÿ€8ÀÔH"ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt¼¼ VAR ch: CHAR; j: LONGINT; BEGIN ch := content [i]; j := 0; WHILE IsNameChar (ch) DO name [j] := ch; INC (j); INC (i); ch := content [i] END; name [j] := 0X END GetName; ÿÿÿÿ€8ÀÔT–þÿÿ€8ÀÔ#Syntax10.Scn.FntHH VAR ch: CHAR; j: INTEGER; BEGIN ch := name [i]; varName [0] := 0X; j := 0; WHILE (ch # 0X) & (ch # '.') & (ch # '[') DO varName [j] := ch; INC (j); INC (i); ch := name [i] END; WHILE (ch = '.') OR (ch = '[') OR (ch = ']') DO INC (i); ch := name [i] END; varName [j] := 0X; RETURN j # 0 END GetVarName; ÿÿÿÿ€8ÀÔ+jóÿÿ€8ÀÔ Syntax10.Scn.Fnt7ÿÿÿ€8ÀÔFoldElemsNew#Syntax10.Scn.Fnt§§r1: Ref.Rider; si: SHORTINT; ch: CHAR; i, j: INTEGER; li: LONGINT; re: REAL; lr: LONGREAL; b: BOOLEAN; s: SET; proc: Ref.ProcVar; str: ARRAY 1024 OF CHAR; p: S.PTR;ÿÿÿÿ€8ÀÔ Syntax10b.Scn.FntASÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt‹‹ r.Read (ch); IF (ch < " ") OR (ch > "~") THEN Str ("CHR("); Int (ORD (ch)); Ch (")"); ELSE Ch ('"'); Ch (ch); Ch ('"') ENDÿÿÿÿ€8ÀÔ I%"%8=¨þÿÿ€8ÀÔ#Syntax10.Scn.Fnt66 r.ReadSet (s); Ch ("{"); b := TRUE; FOR i := 0 TO MAX (SET) DO IF i IN s THEN IF b THEN b := FALSE ELSE Ch (",") END; Int (i); j := i + 1; WHILE (j <= MAX (SET)) & (j IN s) DO INC (j) END; IF j > i + 1 THEN Str (".."); Int (j - 1) END; i := j END END; Ch("}")ÿÿÿÿ€8ÀÔ  &ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt¸¸ r.ReadProc (proc); S.GET (S.ADR (proc), li); Ref.OpenProc (li, r1); IF r1.mod = "" THEN Texts.WriteHex (w, li); Ch ("H") ELSE Str (r1.mod); Ch ("."); Str (r1.name) ENDÿÿÿÿ€8ÀÔ qÿÿÿ€8ÀÔ#Syntax10.Scn.Fntmm r.ReadPtr (p); IF p = NIL THEN Str ("NIL") ELSE Texts.WriteHex (w, S.VAL (LONGINT, p)); Ch ('H') ENDÿÿÿÿ€8ÀÔ Zÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt„„ Color (Red); Str ("RECORD "); Color (Black); IF r.type # NIL THEN Str (r.type.module.name); Ch ('.'); Str (r.type.name) ENDÿÿÿÿ€8ÀÔ ýüÿÿ€8ÀÔ=Syntax10.Scn.Fnt¥þÿÿ€8ÀÔFoldElemsNew#Syntax10.Scn.Fnt Ref.Byte: Str ("BYTE") | Ref.Bool: Str ("BOOLEAN") | Ref.SInt: Str ("SHORTINT") | Ref.Int: Str ("INTEGER") | Ref.LInt: Str ("LONGINT") | Ref.Real: Str ("REAL") | Ref.LReal: Str ("LONGREAL") | Ref.Set: Str ("SET") | Ref.Pointer: Str ("POINTER") | Ref.Procedure: Str ("PROCEDURE") | Ref.Array, Ref.DynArr: Str ("ARRAY") | Ref.Record: Str ("RECORD") ELSE Str ("UNKNOWN") ÿÿÿÿ€8ÀÔ Ç r.Zoom (r1); IF r1.form = Ref.Char THEN r.ReadString (str); Ch('"'); Str (str); Ch ('"') ELSE Color (Red); Str ("ARRAY OF "); CASE r1.form OF  END; Color (Black) ENDÿÿÿÿ€8ÀÔXŠ VAR  BEGIN CASE r.form OF Ref.None: Color (Red); Str ("Rider-form = None"); Color (Black) | Ref.Byte, Ref.Char:  | Ref.Bool: r.ReadBool (b); IF b THEN Str ("TRUE") ELSE Str ("FALSE") END | Ref.SInt: r.ReadSInt (si); Int (si) | Ref.Int: r.ReadInt (i); Int (i) | Ref.LInt: r.ReadLInt (li); Int (li) | Ref.Real: r.ReadReal (re); Texts.WriteReal (w, re, 10) | Ref.LReal: r.ReadLReal (lr); Texts.WriteLongReal (w, lr, 10) | Ref.Set:  | Ref.Procedure:  | Ref.Pointer:  | Ref.Record:  | Ref.Array, Ref.DynArr:  ELSE Color (Red); Str ("Error: Unknown value"); Color (Black) END END WriteValue; Syntax10i.Scn.Fnt$ÿÿÿÿ€8ÀÔ0Hùÿÿ€8ÀÔÙSyntax10.Scn.FntŸ]þÿÿ€8ÀÔFoldElemsNewCSyntax10.Scn.FntSyntax10b.Scn.Fnt?a VAR varName: ARRAY 40 OF CHAR; BEGIN WHILE (r.mode # Ref.End) & GetVarName (name, varName, pos) DO WHILE (r.mode # Ref.End) & (r.name # varName) DO r.Next () END; IF r.mode # Ref.End THEN IF (name [pos] = 0X) & (r.name = varName) THEN WriteValue (r); pos := -1; RETURN ELSE r.Zoom (r) END END END END TraceInto; ÿÿÿÿ€8ÀÔCSyntax10i.Scn.Fnt@lÿÿÿ€8ÀÔCSyntax10.Scn.FntGSyntax10b.Scn.FntRpos := 0; r.Zoom (r); TraceInto (name, r, pos); IF pos = -1 THEN RETURN END;ÿÿÿÿ€8ÀÔ_ÿÿÿ€8ÀÔCSyntax10.Scn.FntTSyntax10b.Scn.Fnt_pos := 0; Ref.OpenVars (r.mod, r); TraceInto (name, r, pos); IF pos = -1 THEN RETURN END;!ÿÿÿÿ€8ÀÔÿÿÿ€8ÀÔCSyntax10.Scn.Fnt¡Syntax10b.Scn.Fnt¹pos := 0; IF GetVarName (name, varName, pos) THEN Ref.OpenVars (varName, r); IF r.mode # Ref.End THEN TraceInto (name, r, pos); IF pos = -1 THEN RETURN END END END;ÿÿÿÿ€8ÀÔCà VAR r: Ref.Rider; i: INTEGER; pos: LONGINT; varName: ARRAY 40 OF CHAR; PROCEDURE TraceInto (VAR name: ARRAY OF CHAR; VAR r: Ref.Rider; VAR pos: LONGINT);  BEGIN Ref.OpenStack (NIL, r); r.Next (); r.Next (); r.Next (); (* Internal procedures *) i := 0; WHILE (i < procDepth) DO r.Next (); INC (i) END;  Trace if local variable   Trace if module-global variable   Trace if Module.variable  Color (Red); Ch ('#'); Str (name); Color (Black) END WriteVar; ÿÿÿÿ€8ÀÔ^Ñþÿÿ€8ÀÔ#Syntax10.Scn.Fnt   '$': Texts.WriteLn (w); INC (i) | '#': INC (i); CASE content [i] OF '$': Texts.Write (w, '$'); INC (i) | '#': Texts.Write (w, '#'); INC (i) ELSE GetName (content, name, i); WriteVar (name) END ELSE Texts.Write (w, ch); INC (i)  ÿÿÿÿ€8ÀÔ@Í VAR i: LONGINT; ch: CHAR; name: ARRAY 128 OF CHAR; PROCEDURE Ch (ch: CHAR);  PROCEDURE Str (s: ARRAY OF CHAR);  PROCEDURE Int (i: LONGINT);  PROCEDURE Color (col: SHORTINT);  PROCEDURE IsNameChar (ch: CHAR): BOOLEAN;  PROCEDURE GetName (VAR content, name: ARRAY OF CHAR; VAR i: LONGINT);  PROCEDURE GetVarName (VAR name, varName: ARRAY OF CHAR; VAR i: LONGINT): BOOLEAN;  PROCEDURE WriteValue (VAR r: Ref.Rider);  Check type and print value or type  PROCEDURE WriteVar (VAR name: ARRAY OF CHAR);  BEGIN Texts.SetFont (w, txtFnt); i := 0; ch := content [i]; WHILE ch # 0X DO CASE ch OF  Analyze string and create text  END; ch := content [i] END; procDepth := 0 END SetContent; ÿÿÿÿ€8ÀÔ  )Küÿÿ€8ÀÔßSyntax10.Scn.Fntf\ÿÿÿ€8ÀÔFoldElemsNew#Syntax10.Scn.Fnt‚‚CASE type OF Message: wName := "Message" | Warning: wName := "Warning" | Error: wName := "Error" ELSE wName := "Info" END;Syntax10i.Scn.Fntÿÿÿÿ€8ÀÔŠfÿÿÿ€8ÀÔ#Syntax10.Scn.FntxxCASE type OF Message: idleStr := "M" | Warning: idleStr := "!" | Error: idleStr := "!!" ELSE idleStr := "i" END;ÿÿÿÿ€8ÀÔ¯× VAR mWin: MsgWin; txt: Texts.Text; wName: Name; dummy: BOOLEAN; width, height, len: INTEGER; BEGIN  Set header of MessageBox  NEW (txt); Texts.Open (txt, ""); Texts.Append (txt, buf); NEW (mWin); dummy := mWin.OpenMsg (wName, txt, NoTime); mWin.type := type;  Set string for animation  GetStrDim (wName, headFnt, width, height, len); mWin.SetOwnPrint (Max (mWin.nW, width + 60), 0, NIL, MsgBoxIdle); wMsgNr := 0; mWin.Show (); mWin := NIL END MessageBox; ÿÿÿÿ€8ÀÔ  *@ÿÿÿ€8ÀÔCSyntax10.Scn.Fnt!Syntax10i.Scn.Fnt1,~ BEGIN SetContent (content, w); (* Translate string to Oberon-text in writer w *) MessageBox (w.buf, type) END MessageBoxS; ÿÿÿÿ€8ÀÔ <ëüÿÿ€8ÀÔSyntax10.Scn.Fnt{bþÿÿ€8ÀÔFoldElemsNew#Syntax10.Scn.Fnt||Texts.SetFont (w, butFnt); Texts.WriteLn (w); Texts.Write (w, ' '); Texts.WriteLn (w); Texts.WriteString (w, " "); WHILE but # {} DO IF (i IN but) & (defElems [i] # NIL) THEN defElems [i].handle (defElems [i], copyMsg); Texts.WriteElem (w, copyMsg.e); Texts.WriteString (w, " "); defElems [i] := copyMsg.e; copyMsg.e := NIL END; EXCL (but, i); INC (i) END;Syntax10i.Scn.Fnt.ÿÿÿÿ€8ÀÔ[ VAR i: INTEGER; copyMsg: Texts.CopyMsg; hBuf: Texts.Buffer; BEGIN i := 0; lastCmd := -1; hBuf := w.buf; w.buf := buf;  Insert specified elems after the Oberon-text  buf := w.buf; w.buf := hBuf; MessageBox (buf, type); RETURN lastCmd END MessageBoxBut; ÿÿÿÿ€8ÀÔ =€ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt^^ BEGIN SetContent (content, w); RETURN MessageBoxBut (w.buf, type, but) END MessageBoxSBut; ÿÿÿÿ€8ÀÔ  àþÿÿ€8ÀÔ#Syntax10.Scn.Fntþþ VAR str: ARRAY 1024 OF CHAR; BEGIN In.Open; IF In.Next () = In.string THEN In.String (str) ELSIF In.Next () = In.name THEN In.Name (str) ELSE MessageBoxS ("Unknown parameter", Error) END; procDepth := 1; MessageBoxS (str, InfoMsg) END ShowVars; *ÿÿÿÿ€8ÀÔLµýÿÿ€8ÀÔ#Syntax10.Scn.Fnt)) VAR width, height, len: INTEGER; fnt: Fonts.Font; text: Name; xh, yh: INTEGER; BEGIN fnt := Fonts.This ("Syntax12.Scn.Fnt"); GetStrDim ("(", fnt, width, height, len); COPY ("A project at the SSW-Institute (JKU-Linz)", text); xh := x; yh := y; s.GetAlignPos (xh, yh, w, h, AlignMiddle, AlignTop, text, fnt); s.WritePos (xh, yh - 10, Red, text, fnt); COPY ("(C) 1997 by Martin Rammerstorfer", text); xh := x; yh := y; s.GetAlignPos (xh, yh, w, h, AlignMiddle, AlignBottom, text, fnt); s.WritePos (xh, yh, Black, text, fnt) END PrintInfo; ÿÿÿÿ€8ÀÔ ÿþÿÿ€8ÀÔ#Syntax10.Scn.Fntßß VAR mWin: MsgWin; txt: Texts.Text; dummy: BOOLEAN; BEGIN NEW (mWin); txt := NIL; dummy := mWin.OpenMsg ("MessageWindows", txt, NoTime); mWin.SetOwnPrint (300, 50, PrintInfo, NIL); mWin.Show (); mWin := NIL END Info; ÿÿÿÿ€8ÀÔñþÿÿ€8ÀÔ#Syntax10.Scn.Fntíí BEGIN headFnt := Fonts.This ("Syntax20b.Scn.Fnt"); bigFnt := Fonts.This ("Syntax18b.Scn.Fnt"); butFnt := Fonts.This ("Syntax12b.Scn.Fnt"); txtFnt := Fonts.This ("Syntax10.Scn.Fnt"); Texts.OpenWriter (w); procDepth := 0 END Init; ÿÿÿÿ€8ÀÔIÒMODULE MsgWindows; (* MsgWindows by MR 13.4.97 -   *) IMPORT S := SYSTEM, Bitmaps, TextFrames, Texts, Display, Oberon, Input, Fonts, Ref, In; CONST  TYPE  VAR   Forward declarations  PROCEDURE Max (x, y: INTEGER): INTEGER;  (* Calculates the dimensions of a string with the specified font *) PROCEDURE GetStrDim* (str: String; fnt: Fonts.Font; VAR width, height, len: INTEGER);   Class InfoWin   Class MsgWin  PROCEDURE MsgBoxIdle (s: InfoWin; x, y, w, h: INTEGER; absNr, nr: LONGINT);  Idle-proc for MessageBox  PROCEDURE SetContent (content: ARRAY OF CHAR; VAR w: Texts.Writer);  Evaluate content-string  PROCEDURE MessageBox* (VAR buf: Texts.Buffer; type: INTEGER);  PROCEDURE MessageBoxS* (content: ARRAY OF CHAR; type: INTEGER);  PROCEDURE MessageBoxBut* (VAR buf: Texts.Buffer; type: INTEGER; but: SET): INTEGER;  PROCEDURE MessageBoxSBut* (content: ARRAY OF CHAR; type: INTEGER; but: SET): INTEGER;  PROCEDURE ShowVars*;  Show values/types of specified variables  PROCEDURE PrintInfo (s: InfoWin; x, y, w, h: INTEGER; absNr, nr: LONGINT);  PROCEDURE Info*;  Print Info about MsgWindows  PROCEDURE Init ();  BEGIN Init () END MsgWindows. Folds.Compile MsgWindows.Mod Edit.Store *