Syntax10.Scn.FntSyntax10i.Scn.FntMarkElemsAlloc`=IStampElemsAlloc14 Mar 98qInfoElemsAllocVSyntax10.Scn.FntpdIStampElemsAlloc14 Mar 98"Title": ViewerBar "Author": Martin Rammerstorfer (MR) "Abstract": . "Keywords": viewer, fast access, menu "Version": 1 "From": 23.03.97 15:14:03 "Until":  "Changes": no changes "Hints":Syntax10b.Scn.Fntr`=P4PopupElemsAllocCompile#Syntax10.Scn.FntddFolds.Compile MsgWindows.Mod/s PopupElems.Mod/s ViewerBar.Mod/s PopupEditor.Mod/s AccessElems.Mod/s~` P4AsciiCoder#Syntax10.Scn.FntAsciiCoder.CodeFiles % ViewerBar.Mod PopupElems.Mod MsgWindows.Mod PopupEditor.Mod AccessElems.Mod ViewerBar.Start.Text ViewerBar.Menu.Text Dirs.Menu.Text Edit.Menu.Text System.Menu.Text ViewerBar.Text PopupElems.Menu.Text PopupEditor.Dlg ~  P4Help#Syntax10.Scn.FntEdit.Open ViewerBar.Text8FoldElemsNew88CSyntax10.Scn.FntSyntax10i.Scn.Fnt Black = 15; White = 0; Red = 1; Green = 2; Blue = 3; (* Magenta = 4;*) Yellow = 5; (* Grey = 6; *) Brown = 7; (* DarkGreen = 8; DarkBlue = 9; *) Grey2 = 13; CR = 0DX; (* TAB = 09X; *) Closed = 0; HelpBit = 1; Remove = 2; IsAViewerBar = 3; PutDown = 4; MR = 0; MM = 1; ML = 2; MenuCall = "Menu: "; StartCall = "Start: "; MenuExt = "*.Menu.Text"; StartExt = "*.Start.Text"; DefaultStartName = "$ViewerBar.Start.Text"; DefaultMenuName = "$ViewerBar.Menu.Text"; DefaultStartName2 = "ViewerBar.Start.Text"; DefaultMenuName2 = "ViewerBar.Menu.Text"; DUnit = TextFrames.Unit; ButtonStart = -1; ButtonHistory = -2; HistoryMaxSize = 8; NameLen = 48; UpdateTime = 250; (* In Oberon.Time ticks *) 8v8Syntax10.Scn.Fnt 8FoldElemsNew#Syntax10.Scn.FntPP PElemDesc = RECORD (PopupElems.ElemDesc) nr: INTEGER; x, y: INTEGER; END;8*W8#Syntax10.Scn.Fnt ViewerElemDesc = RECORD next: ViewerElem; state: SET; pElem: PElem; vwr: Viewers.Viewer; name: ARRAY NameLen OF CHAR; END;8*g8#Syntax10.Scn.Fntww ViewerListDesc = RECORD first, last: ViewerElem; cur, prev: ViewerElem; cnt: INTEGER; invalid: BOOLEAN; END;88#Syntax10.Scn.Fnt;; carloc, selbeg, selend: LONGINT; valid: BOOLEAN; END;8 PElem = POINTER TO PElemDesc;  ViewerElem = POINTER TO ViewerElemDesc;  ViewerList = POINTER TO ViewerListDesc;  CaretSave = RECORD  Name = ARRAY OF CHAR; 8S8CSyntax10.Scn.FntSyntax10i.Scn.Fnt8?k menuViewer: MenuViewers.Viewer; oldHandler: Display.Handler; w: Texts.Writer; minimized, noHide, startupDir, heightOk, showLocalTexts: BOOLEAN; shownHeight, textHeight, historyPrintYPos: INTEGER; task, updateT: Oberon.Task; cmdStart, cmdStartS, cmdMenus, cmdHistory: PElem; txtVwrPopupPos: LONGINT; vwrList, vwrRecall: ViewerList; menuBuffer, startBuffer: Texts.Buffer; menuName, startName: ARRAY 48 OF CHAR; oldNotifier: Dir.Notifier; notified: BOOLEAN; userFrame, userMenu: CaretSave; (* For storing caret and selection of affected viewer *) listString: ARRAY 10 OF CHAR; listPattern: ARRAY 24 OF CHAR; 8"8#Syntax10.Scn.FntPROCEDURE ^CloseBar*; PROCEDURE ^OpenViewerBar (title: ARRAY OF CHAR; VAR txt: Texts.Text); PROCEDURE ^InstallTask; PROCEDURE ^Update (); PROCEDURE ^Refresh*; PROCEDURE ^PHandle* (e: Texts.Elem; VAR m: Texts.ElemMsg); PROCEDURE ^InitMenu (name: ARRAY OF CHAR; VAR buf: Texts.Buffer); PROCEDURE ^InitStart (); PROCEDURE ^RemoveClosed*; PROCEDURE ^Animate (x0, y0, w0, h0, x1, y1, w1, h1, steps: INTEGER); PROCEDURE ^MoveToHistory (elem: PElem); 88MSyntax10.Scn.FntSyntax10i.Scn.Fnt MarkElemsAlloc 8FoldElemsNew#Syntax10.Scn.Fnt66 BEGIN Texts.SetFont (w, Fonts.Default) END TDefault; 8 t8#Syntax10.Scn.FntFF BEGIN Texts.SetFont (w, Fonts.This ("Syntax10b.Scn.Fnt")) END TBold; 8 V8#Syntax10.Scn.Fnt-- BEGIN Texts.SetColor (w, col) END SetColor; 8 {kK8#Syntax10.Scn.Fnt,, BEGIN Texts.WriteString (w, s) END String; 8 {kK#8#Syntax10.Scn.Fnt@@ BEGIN String (s); TBold; String (sBold); TDefault END StringB; 8 {kK8#Syntax10.Scn.Fnt)) BEGIN Texts.WriteInt (w, n, 0) END Int; 8 ~kK8#Syntax10.Scn.Fnt!! BEGIN Texts.WriteLn (w) END Ln; 8 kK8#Syntax10.Scn.Fnt-- BEGIN Texts.Append (txt, w.buf) END Append; 8 +?*8#Syntax10.Scn.Fnt VAR cmds: PElem; BEGIN NEW (cmds); COPY (name, cmds.name); cmds.small := TRUE; cmds.menu := TextFrames.Text (""); cmds.nr := -1; cmds.handle := PHandle; Texts.Delete (cmds.menu, 0, cmds.menu.len); Append (cmds.menu); RETURN cmds END CreatePopup; 8  PPl8#Syntax10.Scn.Fntrr VAR c: PElem; copy: Texts.CopyMsg; BEGIN IF doCopy THEN IF all THEN cmds.handle (cmds, copy); c := copy.e (PElem) ELSE NEW (c); Texts.CopyElem (cmds, c); c.nr := cmds.nr; c.name := cmds.name; c.menu := cmds.menu; c.small := cmds.small; c.def := cmds.def END ELSE c := cmds END; Texts.WriteElem (w, c); Append (menu.text); RETURN c END InsertPopup; 8 (* Text operations *) PROCEDURE TDefault;  PROCEDURE TBold;  PROCEDURE SetColor (col: SHORTINT);  PROCEDURE String (s: ARRAY OF CHAR);  PROCEDURE StringB (s, sBold: ARRAY OF CHAR);  PROCEDURE Int (n: LONGINT);  PROCEDURE Ln;  PROCEDURE Append (txt: Texts.Text);  PROCEDURE CreatePopup (name: ARRAY OF CHAR): PElem;  PROCEDURE InsertPopup (cmds: PElem; menu: TextFrames.Frame; doCopy, all: BOOLEAN): PElem;  88Syntax10.Scn.FntSyntax10i.Scn.Fnt?m8FoldElemsNew#Syntax10.Scn.Fntqq VAR elem: ViewerElem; BEGIN NEW (elem); elem.state := {}; elem.vwr := viewer; RETURN elem END NewViewerElem; 8)8#Syntax10.Scn.FntZZ VAR list: ViewerList; BEGIN NEW (list); list.cnt := 0; RETURN list END NewViewerList; 8F8#Syntax10.Scn.Fnt VAR cur, prev: ViewerElem; BEGIN cur := v.first; prev := NIL; WHILE (cur # NIL) & (cur.vwr # viewer) DO prev := cur; cur := cur.next END; v.cur := cur; v.prev := prev; RETURN cur END Find; 8@8#Syntax10.Scn.Fnt VAR cur, prev: ViewerElem; BEGIN cur := v.first; prev := NIL; WHILE (cur # NIL) & (cur.pElem # elem) DO prev := cur; cur := cur.next END; v.cur := cur; v.prev := prev; RETURN cur END FindPopup; 8=8#Syntax10.Scn.Fnt VAR cur, prev: ViewerElem; cnt: INTEGER; BEGIN cur := v.first; prev := NIL; cnt := 0; WHILE (cur # NIL) & (cnt # nr) DO prev := cur; cur := cur.next; INC (cnt) END; v.cur := cur; v.prev := prev; RETURN cur END FindNr; 8R28CSyntax10.Scn.FntVSyntax10b.Scn.Fnt0 VAR elem: ViewerElem; BEGIN ASSERT (viewer # NIL); IF viewer.state = HelpBit THEN RETURN END; elem := v.Find (viewer); IF elem = NIL THEN elem := NewViewerElem (viewer); IF v.first = NIL THEN v.first := elem ELSE v.last.next := elem END; v.prev := v.last; v.last := elem; v.cur := elem; IF ~isStatusBar THEN INC (v.cnt) ELSE INCL (elem.state, IsAViewerBar) END END END Insert; 8Aa8CSyntax10.Scn.FntPSyntax10b.Scn.Fnt] VAR elem: ViewerElem; BEGIN ASSERT (viewer # NIL); IF viewer.state = 1 THEN RETURN END; elem := v.Find (viewer); IF elem = NIL THEN elem := NewViewerElem (viewer); IF v.first = NIL THEN v.last := elem; elem.next := NIL ELSE elem.next := v.first END; v.first := elem; v.prev := NIL; v.cur := elem; INC (v.cnt) END END InsertFirst; 8<-8#Syntax10.Scn.Fnt VAR elem: ViewerElem; BEGIN ASSERT (viewer # NIL); elem := v.Find (viewer); IF v.cur # NIL THEN IF v.prev = NIL THEN v.first := v.cur.next ELSE v.prev.next := v.cur.next END; IF ~(IsAViewerBar IN elem.state) THEN DEC (v.cnt) END; IF v.last = v.cur THEN v.last := v.prev END; IF (v.first = NIL) OR (v.cnt = 0) THEN ASSERT (v.cnt = 0); v.last := NIL; v.first := NIL END; v.cur := NIL; v.prev := NIL END END Remove; 8-8#Syntax10.Scn.Fnt VAR cur, prev: ViewerElem; BEGIN cur := v.first; prev := NIL; WHILE cur # NIL DO IF (Remove IN cur.state) OR ((IsAViewerBar IN cur.state) & (cur.vwr.state <= 0)) THEN IF ~(IsAViewerBar IN cur.state) THEN DEC (v.cnt) END; cur := cur.next; IF prev # NIL THEN prev.next := cur ELSE v.first := cur END ELSE prev := cur; cur := cur.next END END; IF prev # NIL THEN v.last := prev END; v.prev := NIL; v.cur := NIL END DelRemoveable; 8=8#Syntax10.Scn.Fnt   BEGIN IF dst = NIL THEN dst := NewViewerList () END; v.cur := v.first; v.prev := NIL; WHILE v.cur # NIL DO IF Closed IN v.cur.state THEN IF ~(IsAViewerBar IN v.cur.state) THEN dst.InsertFirst (v.cur.vwr); COPY (v.cur.name, dst.cur.name); dst.cur.state := {Closed}; DEC (v.cnt) END; IF v.prev # NIL THEN v.prev.next := v.cur.next; v.cur := v.prev.next ELSE v.first := v.first.next; v.cur := v.first END ELSE v.prev := v.cur; v.cur := v.cur.next END END; v.last := v.prev END MoveClosed; !878#Syntax10.Scn.Fnt BEGIN IF dst = NIL THEN dst := NewViewerList () END; v.cur := v.first; v.prev := NIL; WHILE v.cur # NIL DO IF ~(IsAViewerBar IN v.cur.state) THEN dst.Insert (v.cur.vwr, FALSE); COPY (v.cur.name, dst.cur.name); DEC (v.cnt); IF v.prev # NIL THEN v.prev.next := v.cur.next; v.cur := v.prev.next ELSE v.first := v.first.next; v.cur := v.first END ELSIF v.cur # NIL THEN v.prev := v.cur; v.cur := v.cur.next END END END Move;  8A:8#Syntax10.Scn.Fnt BEGIN IF start THEN v.cur := v.first; v.prev := NIL; RETURN v.cur END; v.prev := v.cur; IF v.cur # NIL THEN v.cur := v.cur.next END; RETURN v.cur END Iterate; $8)8#Syntax10.Scn.Fnt^^ BEGIN v.first := NIL; v.last := NIL; v.cur := NIL; v.prev := NIL; v.cnt := 0 END RemoveAll;  898#Syntax10.Scn.Fnt VAR cur, prev: ViewerElem; BEGIN cur := v.first; prev := NIL; WHILE (cur # NIL) & (i > 0) DO prev := cur; cur := cur.next; DEC (i) END; v.cur := cur; v.prev := prev; RETURN cur END Get; 8-R8#Syntax10.Scn.Fnt VAR cnt: INTEGER; BEGIN cnt := 0; WHILE v.Iterate (cnt = 0) # NIL DO EXCL (v.cur.state, HelpBit); INC (cnt) END END ClearHelpBits; 8/8Syntax10.Scn.Fntr8FoldElemsNew#Syntax10.Scn.Fntllfirst, cur: Viewers.Viewer; lastCnt, cnt: INTEGER; changed: BOOLEAN; vwr: MenuViewers.Viewer; elem: PElem;88#Syntax10.Scn.FntUU v.Insert (cur, FALSE); INCL (v.cur.state, HelpBit); cur := Viewers.Next (cur) Syntax10i.Scn.Fnt.8#% 8#Syntax10.Scn.Fnt IF ~(IsAViewerBar IN v.cur.state) THEN vwr := v.cur.vwr(MenuViewers.Viewer); IF HelpBit IN v.cur.state THEN IF Closed IN v.cur.state THEN changed := TRUE; EXCL (v.cur.state, Closed) END ELSE IF v.cur.vwr.state >= 1 THEN INCL (v.cur.state, Remove) ELSIF ~(Closed IN v.cur.state) THEN elem := v.cur.pElem; changed := TRUE; INCL (v.cur.state, Closed); IF ~(PutDown IN v.cur.state) THEN MoveToHistory (elem); IF elem # NIL THEN Animate (cmdHistory.x, cmdHistory.y, SHORT (cmdHistory.W DIV TextFrames.Unit), SHORT (cmdHistory.H DIV TextFrames.Unit), vwr.X, vwr.Y + vwr.H - vwr.menuH, vwr.W, vwr.menuH, 15) END ELSE EXCL (v.cur.state, PutDown); Animate (elem.x, elem.y, SHORT (elem.W DIV TextFrames.Unit), SHORT (elem.H DIV TextFrames.Unit), vwr.X, vwr.Y + vwr.H - vwr.menuH, vwr.W, vwr.menuH, 15) END END END END; INC (cnt) 8L VAR  BEGIN v.ClearHelpBits (); lastCnt := v.cnt; first := menuViewer; v.Insert (first, TRUE); INCL (v.cur.state, HelpBit); cur := Viewers.Next (first); WHILE cur # first DO  Iterate through opened viewers in user track  END; cnt := 0; changed := FALSE; (* Check if changed *) WHILE v.Iterate (cnt = 0) # NIL DO  Update entries in list  END; v.DelRemoveable (); RETURN (lastCnt # v.cnt) OR changed END Update; +8%w8#Syntax10.Scn.Fntgg VAR cnt: INTEGER; BEGIN cnt := 0; WHILE v.Iterate (cnt = 0) # NIL DO IF v.cur.name = "" THEN String ('"No name."'); IF v.cur.vwr = NIL THEN String ("vwr=NIL ") ELSE IF HelpBit IN v.cur.state THEN String (" HelpBit") END; IF Remove IN v.cur.state THEN String (" Remove") END; IF Closed IN v.cur.state THEN String (" Closed") END; IF IsAViewerBar IN v.cur.state THEN String (" IsAVwrBar") END; IF v.cur.vwr = menuViewer THEN String (" ViewerBar") END; IF v.cur.vwr.state = 1 THEN String (" Filler") END END ELSE String (v.cur.name) END; Ln; INC (cnt) END END Print; 8 (* ViewerList - class *) PROCEDURE NewViewerElem (viewer: Viewers.Viewer): ViewerElem;  PROCEDURE NewViewerList (): ViewerList;  PROCEDURE (v: ViewerList) Find (viewer: Viewers.Viewer): ViewerElem;  PROCEDURE (v: ViewerList) FindPopup (elem: PElem): ViewerElem;  PROCEDURE (v: ViewerList) FindNr (nr: INTEGER): ViewerElem;  PROCEDURE (v: ViewerList) Insert (viewer: Viewers.Viewer; isStatusBar: BOOLEAN);  PROCEDURE (v: ViewerList) InsertFirst (viewer: Viewers.Viewer);  PROCEDURE (v: ViewerList) Remove (viewer: Viewers.Viewer);  PROCEDURE (v: ViewerList) DelRemoveable ();  PROCEDURE (v: ViewerList) MoveClosed (VAR dst: ViewerList);  Move with Closed marked viewers  PROCEDURE (v: ViewerList) Move (VAR dst: ViewerList);  Move all viewers from v to dst  PROCEDURE (v: ViewerList) Iterate (start: BOOLEAN): ViewerElem;  Iterate stepwise through all elems  PROCEDURE (v: ViewerList) RemoveAll ();  Clears list  PROCEDURE (v: ViewerList) Get (i: INTEGER): ViewerElem;  Gets i-th element  PROCEDURE (v: ViewerList) ClearHelpBits ();  Clears all help-bits in elems  PROCEDURE (v: ViewerList) Update (): BOOLEAN;  Compare list with opened viewer -> Update  PROCEDURE (v: ViewerList) Print ();  Print elems into writer  88 Syntax10.Scn.FntSyntax10i.Scn.FntQ$8FoldElemsNew#Syntax10.Scn.Fnt VAR i: INTEGER; BEGIN Texts.Read (r, ch); i := 0; WHILE (i < (LEN (name) - 1)) & (ch = name [i]) DO INC (i); Texts.Read (r, ch) END; RETURN i = (LEN (name) - 1) END CompareName; 8E8#Syntax10.Scn.Fnt VAR i: INTEGER; BEGIN i := 0; IF ch = '"' THEN Texts.Read (r, ch); WHILE ~r.eot & (ch # '"') DO name [i] := ch; INC (i); Texts.Read (r, ch) END ELSE WHILE ~r.eot & (ch > " ") DO name [i] := ch; INC (i); Texts.Read (r, ch) END END ; name[i] := 0X END ReadLine; 88w8Syntax10.Scn.Fnt8FoldElemsNewCSyntax10.Scn.Fnt,Syntax10b.Scn.Fnt  BEGIN IF ~CompareName (r, cmd, ch) THEN RETURN FALSE END; IF msg.keys = {MM} THEN ReadLine (r, name, ch); InitMenu (name, buf); InitStart (); Refresh ELSE Oberon.Par.text := e.menu; Oberon.Par.pos := msg.pos + LEN (cmd) - 2; Edit.Open END; RETURN TRUE END Set; 8~Syntax10b.Scn.FntcFU8+Syntax10.Scn.FntG8FoldElemsNew#Syntax10.Scn.FntTexts.OpenReader (r, e.menu, 0); pos := 0; cnt := 0; WHILE pos < msg.pos DO Texts.Read (r, ch); INC (pos); IF ch = CR THEN INC (cnt) END END;Syntax10i.Scn.Fnt8f  Search selected line  IF cnt >= 2 THEN vElem := vwrRecall.FindNr (cnt - 2); IF vElem # NIL THEN ASSERT (vElem.vwr # NIL); vwrRecall.Remove (vElem.vwr); IF msg.keys = {MM} THEN vwrList.Insert (vElem.vwr, FALSE); INCL (vwrList.cur.state, Closed) END; vwrList.invalid := TRUE; Update () END ELSIF cnt = 0 THEN vwrList.invalid := TRUE; RemoveClosed ENDSyntax10i.Scn.Fnt'84 VAR ch: CHAR; pos: LONGINT; r: Texts.Reader; vElem: ViewerElem; cnt: INTEGER; PROCEDURE Set (r: Texts.Reader; cmd: Name; VAR name: Name; VAR buf: Texts.Buffer): BOOLEAN;  BEGIN IF e.nr = ButtonStart THEN Texts.OpenReader (r, e.menu, msg.pos); IF Set (r, MenuCall, menuName, menuBuffer) THEN RETURN END; Texts.OpenReader (r, e.menu, msg.pos); IF Set (r, StartCall, startName, startBuffer) THEN RETURN END; Texts.OpenReader (r, e.menu, msg.pos); IF CompareName (r, "Menu Off.", ch) THEN menuBuffer := NIL; menuName := ""; vwrList.invalid := TRUE; Refresh (); RETURN END; Texts.OpenReader (r, e.menu, msg.pos); IF CompareName (r, "Start Off.", ch) THEN startBuffer := NIL; startName := ""; InitStart (); vwrList.invalid := TRUE; Refresh (); RETURN END; PopupElems.Handle (e, msg) ELSIF e.nr = ButtonHistory THEN  Recall selected viewer (Trash-Button)  ELSE PopupElems.Handle (e, msg) END END Execute; 8 Syntax10b.Scn.Fnt($8#Syntax10.Scn.Fnt VAR e1: PElem; BEGIN WITH e: PElem DO WITH m: Texts.CopyMsg DO IF m.e = NIL THEN NEW (e1); m.e := e1 END; m.e(PElem).nr := e.nr; PopupElems.Handle (e, m) | m: PopupElems.ExecMsg DO Execute (e, m) | m: TextFrames.DisplayMsg DO IF e.nr = ButtonHistory THEN historyPrintYPos := m.Y0 END; IF ~m.prepare THEN e.x := m.X0; e.y := m.Y0 END; PopupElems.Handle (e, m) ELSE PopupElems.Handle (e, m) END END END PHandle; 8P (* PElem handling *) PROCEDURE CompareName (VAR r: Texts.Reader; name: Name; VAR ch: CHAR): BOOLEAN;  PROCEDURE ReadLine (VAR r: Texts.Reader; VAR name: Name; ch: CHAR);  PROCEDURE Execute (e: PElem; msg: PopupElems.ExecMsg);  Execute command  PROCEDURE PHandle* (e: Texts.Elem; VAR m: Texts.ElemMsg);  Handler for PopupElems  828/Syntax10.Scn.FntSyntax10i.Scn.Fnt@8FoldElemsNewCSyntax10.Scn.Fnt0Syntax10b.Scn.Fnt+ BEGIN IF tFrame = NIL THEN cs.valid := FALSE; RETURN END; IF tFrame.hasCar THEN cs.carloc := tFrame.carloc.pos ELSE cs.carloc := -1 END; IF tFrame.hasSel THEN cs.selbeg := tFrame.selbeg.pos; cs.selend := tFrame.selend.pos ELSE cs.selbeg := -1; cs.selend := -1 END; cs.valid := TRUE END Save; 8C8CSyntax10.Scn.Fnt.Syntax10b.Scn.Fnt BEGIN IF (tFrame = NIL) OR (~cs.valid) THEN RETURN END; IF cs.carloc >= 0 THEN TextFrames.SetCaret (tFrame, cs.carloc) END; IF cs.selbeg >= 0 THEN TextFrames.SetSelection (tFrame, cs.selbeg, cs.selend) END END Restore; 8 (* CaretSave - class *) PROCEDURE (VAR cs: CaretSave) Save (tFrame: TextFrames.Frame);  PROCEDURE (VAR cs: CaretSave) Restore (tFrame: TextFrames.Frame);  88Syntax10.Scn.FntSyntax10i.Scn.Fnt- MarkElemsAllocNr8FoldElemsNew#Syntax10.Scn.Fntll VAR vwr: Viewers.Viewer; BEGIN vwr := Viewers.Next (menuViewer); IF vwr IS MenuViewers.Viewer THEN userMenu.Save (vwr.dsc(TextFrames.Frame)); IF vwr.dsc.next IS TextFrames.Frame THEN userFrame.Save (vwr.dsc(TextFrames.Frame).next(TextFrames.Frame)); ELSE userFrame.Save (NIL); END ELSE userFrame.Save (NIL); userMenu.Save (NIL) END END SaveCaret; 8 bN8#Syntax10.Scn.FntCC VAR vwr: Viewers.Viewer; BEGIN vwr := Viewers.Next (menuViewer); IF userFrame.valid & (vwr.dsc # NIL) & (vwr.dsc.next # NIL) THEN userFrame.Restore (vwr.dsc(TextFrames.Frame).next(TextFrames.Frame)) END; IF userMenu.valid & (vwr.dsc # NIL) THEN userMenu.Restore (vwr.dsc(TextFrames.Frame)) END END RestoreCaret; 8 $̢ 8CSyntax10.Scn.FntFSyntax10b.Scn.Fnt! VAR txt: Texts.Text; BEGIN IF minimized OR noHide THEN Refresh (); RETURN END; minimized := TRUE; Oberon.Remove (task); IF menuViewer # NIL THEN SaveCaret (); Viewers.Close (menuViewer) END; menuViewer := NIL; shownHeight := 0; OpenViewerBar ("", txt); RestoreCaret () END BarDown; 8 $̢ 8CSyntax10.Scn.Fnt=Syntax10b.Scn.Fnt VAR txt: Texts.Text; BEGIN IF ~minimized THEN Refresh (); RETURN END; minimized := FALSE; InstallTask (); IF menuViewer # NIL THEN SaveCaret (); Viewers.Close (menuViewer) END; menuViewer := NIL; shownHeight := textHeight; OpenViewerBar ("", txt); RestoreCaret () END BarUp; 8 Fo8#Syntax10.Scn.Fnt;; BEGIN IF menuViewer.state <= 0 THEN vwrList.Remove (menuViewer); menuViewer := NIL; Refresh END; IF notified THEN InitMenu (startName, startBuffer); InitMenu (menuName, menuBuffer); InitStart (); Refresh; notified := FALSE ELSE Update END; updateT.time := Input.Time () + UpdateTime END HandleUpdateTask; +8 Fo8#Syntax10.Scn.Fnt BEGIN IF updateT = NIL THEN NEW (updateT) END; updateT.safe := FALSE; updateT.time := Input.Time () + UpdateTime; updateT.handle := HandleUpdateTask; Oberon.Install (updateT) END InstallUpdateTask; 8 Fo8CSyntax10.Scn.Fnt@Syntax10b.Scn.Fnt! VAR keys: SET; x, y: INTEGER; BEGIN IF menuViewer = NIL THEN RETURN END; Input.Mouse (keys, x, y); IF ~((y >= menuViewer.Y) & (y < (menuViewer.Y + menuViewer.H)) & (x >= menuViewer.X) & (x < (menuViewer.X + menuViewer.W))) THEN Oberon.Remove (task); BarDown END END HandleTask; /8 Fo88#Syntax10.Scn.Fnt BEGIN IF task = NIL THEN NEW (task) END; task.safe := FALSE; task.time := Input.Time () + 1000; task.handle := HandleTask; Oberon.Install (task) END InstallTask; )8  b8#Syntax10.Scn.Fnt VAR vElem: ViewerElem; vwr: MenuViewers.Viewer; BEGIN vElem := vwrList.FindPopup (elem); ASSERT (vElem # NIL); vwr := vElem.vwr(MenuViewers.Viewer); IF vwr # NIL THEN IF vwr.state > 0 THEN Animate (cmdHistory.x, cmdHistory.y, SHORT (cmdHistory.W DIV TextFrames.Unit), SHORT (cmdHistory.H DIV TextFrames.Unit), vwr.X, vwr.Y + vwr.H - vwr.menuH, vwr.W, vwr.menuH, 17) ELSIF vwr.state = 0 THEN Animate (cmdHistory.x, cmdHistory.y, SHORT (cmdHistory.W DIV TextFrames.Unit), SHORT (cmdHistory.H DIV TextFrames.Unit), elem.x, elem.y, SHORT (elem.W DIV TextFrames.Unit), SHORT (elem.H DIV TextFrames.Unit), 7) END; vwrRecall.InsertFirst (vwr); COPY (vElem.name, vwrRecall.cur.name); vwrList.Remove (vwr) END; Viewers.Close (vwr) END MoveToHistory; 8 e148 Syntax10.Scn.Fnt.y8FoldElemsNew#Syntax10.Scn.Fntee BEGIN Display.ReplConst (Grey2, x + 1, y + h DIV 2 - 1, w - 3, 2, Display.invert) END InvertLine; Syntax10i.Scn.Fnt7838Syntax10.Scn.Fnt8FoldElemsNew8Syntax10i.Scn.Fnti VAR keysum, keys: SET; x, y, w, h, hx, hy: INTEGER; r: Texts.Reader; loc: TextFrames.Location; (*vElem: ViewerElem;*) inverted: BOOLEAN; (*vwr: MenuViewers.Viewer;*) elem: PElem; BEGIN inverted := FALSE; Input.Mouse (keys, x, y); keysum := keys + {MR}; TextFrames.LocateChar (V.dsc(TextFrames.Frame), x, y, loc); Texts.OpenReader (r, V.dsc(TextFrames.Frame).text, loc.pos); Texts.ReadElem (r); IF (r.elem # NIL) & (r.elem IS PElem) & (r.elem(PElem).nr # ButtonStart) THEN elem := r.elem(PElem); w := SHORT (r.elem.W DIV DUnit); h := SHORT (r.elem.H DIV DUnit); REPEAT Input.Mouse (keys, x, y); keysum := keysum + keys UNTIL keys # {MR}; hx := loc.x; hy := loc.y; IF keysum = {ML, MR} THEN InvertLine (hx, hy, w, h); inverted := TRUE END; REPEAT Input.Mouse (keys, x, y); keysum := keysum + keys; IF inverted & (keysum # {ML, MR}) THEN InvertLine (hx, hy, w, h); inverted := FALSE END UNTIL keys = {}; IF inverted THEN InvertLine (hx, hy, w, h) END; IF ~((x < hx) OR (y < hy) OR (x > (hx + w)) OR (y > (hy + h))) & (keysum = {ML, MR}) THEN IF elem = cmdHistory THEN vwrRecall.RemoveAll () (* Clear Trash *) ELSE MoveToHistory (elem) END; vwrList.invalid := TRUE; Update END END END DeleteMsg; 84O8Syntax10.Scn.Fntv8FoldElemsNew#Syntax10.Scn.Fnthhkeysum, keys: SET; x, y, w, h: INTEGER; r: Texts.Reader; loc: TextFrames.Location; vElem: ViewerElem;8 VAR  BEGIN Input.Mouse (keys, x, y); keysum := keys + {ML}; TextFrames.LocateChar (V.dsc(TextFrames.Frame), x, y, loc); Texts.OpenReader (r, V.dsc(TextFrames.Frame).text, loc.pos); Texts.ReadElem (r); IF (r.elem # NIL) & (r.elem IS PElem) & (r.elem(PElem).nr >= ButtonStart) THEN w := SHORT (r.elem.W DIV DUnit); h := SHORT (r.elem.H DIV DUnit); REPEAT Input.Mouse (keys, x, y); keysum := keysum + keys UNTIL keys # {ML}; REPEAT Input.Mouse (keys, x, y); keysum := keysum + keys UNTIL keys = {}; IF ~((x < loc.x) OR (y < loc.y) OR (x > (loc.x + w)) OR (y > (loc.y + h))) & (keysum = {ML}) THEN IF r.elem(PElem).nr = ButtonStart THEN InitStart (); Refresh END END END END RefreshMsg;  8 PROCEDURE InvertLine (x, y, w, h: INTEGER);  Invert line in PopupElem (for disposing viewer/trash)  PROCEDURE DeleteMsg (VAR V: MenuViewers.Viewer);  Dispose viewer/trash (MR-ML)  PROCEDURE RefreshMsg (VAR V: MenuViewers.Viewer);  System.Grow if ML on PopupElem  BEGIN WITH V: MenuViewers.Viewer DO IF M IS Oberon.InputMsg THEN WITH M: Oberon.InputMsg DO IF M.id = Oberon.track THEN IF M.Y < V.Y + 1 THEN Oberon.DrawCursor (Oberon.Mouse, Oberon.Arrow, M.X, M.Y) ELSIF M.Y < V.Y + V.H - V.menuH THEN (* Do nothing *) ELSIF M.Y < V.Y + V.H THEN IF minimized THEN BarUp () ELSIF M.keys = {MR} THEN DeleteMsg (V) ELSIF M.keys = {MM} THEN V.dsc.handle (V.dsc, M) ELSIF M.keys = {ML} THEN RefreshMsg (V) END ELSE Oberon.DrawCursor (Oberon.Mouse, Oberon.Arrow, M.X, M.Y) END ELSE oldHandler (V, M) END END ELSE oldHandler (V, M) END END END Handle; 89 (* Frame Handling / Bar operations / Tasks *) PROCEDURE SaveCaret ();  PROCEDURE RestoreCaret ();  PROCEDURE BarDown ();  PROCEDURE BarUp ();  PROCEDURE HandleUpdateTask ();  Check opened viewers -> update PopupElems  PROCEDURE InstallUpdateTask ();  Install Task for update  PROCEDURE HandleTask ();  If mouse not in ViewerBar then hide ViewerBar  PROCEDURE InstallTask ();  Set timer for hiding ViewerBar (if set)  PROCEDURE MoveToHistory (elem: PElem);  PROCEDURE Handle (V: Display.Frame; VAR M: Display.FrameMsg);  ViewerBar-handle  )8f8Syntax10i.Scn.Fnt8Syntax10.Scn.Fnt MarkElemsAllocr8FoldElemsNewSyntax10.Scn.FntE8FoldElemsNew#Syntax10.Scn.Fntcur: Viewers.Viewer; dsc: Display.Frame; menuF: TextFrames.Frame; elem: PElem; name: ARRAY NameLen OF CHAR; text: Texts.Text; ok: BOOLEAN; nr: INTEGER;8-8#Syntax10.Scn.Fnt BEGIN RETURN (((ORD (ch) >= ORD (' ')) & (ORD (ch) <= ORD ('~'))) OR (ch = '') OR (ch = '') OR (ch = '') OR (ch = '') OR (ch = '') OR (ch = '')) & (ch # '|') END IsValidChar; 8A8#Syntax10.Scn.Fnt VAR i: INTEGER; r: Texts.Reader; BEGIN Texts.OpenReader (r, txt, 0); i := -1; REPEAT INC (i); Texts.Read (r, name [i]) UNTIL ~IsValidChar (name [i]) OR (i >= (NameLen - 2)); DEC (i); WHILE (i >= 0) & (name [i] = ' ') DO DEC (i) END; name [i + 1] := 0X END ReadName; 88#Syntax10.Scn.Fnt''IF cur IS MenuViewers.Viewer THEN dsc := cur.dsc; IF dsc IS TextFrames.Frame THEN text := dsc(TextFrames.Frame).text; ok := TRUE; String ("ViewerBar.Do "); Int (nr); String (" ~") END ELSE String ("ViewerBar.Do "); Int (nr); String (" ~"); name := ""; ok := TRUE END;Syntax10i.Scn.Fnt48#8CSyntax10.Scn.FntSyntax10i.Scn.Fnt:IF text # NIL THEN ReadName (name, text); text := NIL END; IF name = "" THEN name := '"No name."' END; COPY (name, vwrList.cur.name); elem := CreatePopup (name); elem.nr := nr; IF ~(Closed IN vwrList.cur.state) THEN TBold; SetColor (Blue) (* ELSIF cur.state < -1 THEN TDefault; SetColor (Green) *) END; IF cur.state >= -1 THEN vwrList.cur.pElem := InsertPopup (elem, menuF, FALSE, FALSE); SetColor (Black); TDefault END<8!8#Syntax10.Scn.FntLLSetColor (Brown); TBold; String ("Remove closed"); TDefault; SetColor (Black); Ln; String ("____________"); Ln; vwrRecall.Print (); elem := CreatePopup ("History"); elem.nr := ButtonHistory; IF vwrRecall.cnt # 0 THEN SetColor (Brown); TBold END; cmdHistory := InsertPopup (elem, menuF, FALSE, FALSE); TDefault; SetColor (Black)8W VAR  PROCEDURE IsValidChar (ch: CHAR): BOOLEAN;  PROCEDURE ReadName (VAR name: ARRAY OF CHAR; txt: Texts.Text);  BEGIN menuF := menuViewer.dsc (TextFrames.Frame); nr := 0; WHILE (vwrList.Iterate (nr = 0) # NIL) & (vwrList.cur.vwr # NIL) DO text := NIL; ok := FALSE; cur := vwrList.cur.vwr; IF ~(IsAViewerBar IN vwrList.cur.state) THEN  Identify Viewer "cur" and set command in PopupElem  IF ok THEN (* Register viewer in Viewer-bar *)  Insert viewer in ViewerBar as PopupElem with the same name  END END; INC (nr) END;  Print Trash-Popup  END PrintViewers; #8 E {8Syntax10.Scn.Fnt:8FoldElemsNew#Syntax10.Scn.Fnt Texts.Delete (txt, 0, txt.len); String (" | "); SetColor (Yellow); TBold; cmdStartS := InsertPopup (cmdStart, menuViewer.dsc (TextFrames.Frame), TRUE, FALSE); TDefault; SetColor (Black); String (" - "); Append (txt); IF menuBuffer # NIL THEN NEW (buf); Texts.OpenBuf (buf); Texts.Copy (menuBuffer, buf); Texts.Append (txt, buf); String ("-"); txtVwrPopupPos := menuBuffer.len + 1 ENDSyntax10i.Scn.Fnt8-i8CSyntax10.Scn.FntnSyntax10i.Scn.FntUh := textHeight; IF ~heightOk THEN IF historyPrintYPos < 1 THEN INC (textHeight, (*1*) TextFrames.menuH) (* Calculate height of menu *) ELSIF historyPrintYPos > 1 THEN DEC (textHeight, (*1*) historyPrintYPos - 1); heightOk := TRUE END ELSE heightOk := FALSE END; IF h # textHeight THEN shownHeight := textHeight; Refresh ENDP8e VAR txt: Texts.Text; buf: Texts.Buffer; h: INTEGER; upd: BOOLEAN; BEGIN upd := vwrList.invalid OR vwrList.Update (); vwrList.invalid := FALSE; historyPrintYPos := -1; IF upd THEN BarUp () END; txt := menuViewer.dsc (TextFrames.Frame).text; IF ~minimized & (upd OR (txt.len < 7)) THEN IF txt.len >= (7 + txtVwrPopupPos) THEN Texts.Delete (txt, 7 + txtVwrPopupPos, txt.len) ELSE  Redraw Start-button and menu  END; Append (txt); PrintViewers ();  Check if height of ViewerBar corresponds with the text-height in the ViewerBar  END; IF vwrRecall.cnt > HistoryMaxSize THEN vwrRecall.Remove (vwrRecall.last.vwr) END END Update; 8 kK; 8#Syntax10.Scn.Fnt VAR menuF, mainF: TextFrames.Frame; BEGIN IF menuViewer # NIL THEN Viewers.Close (menuViewer); menuViewer := NIL END; txt := TextFrames.Text (""); menuF := TextFrames.NewMenu (title, ""); mainF := TextFrames.NewText (txt, 0); menuViewer := MenuViewers.New (menuF, mainF, shownHeight + 1, 0, shownHeight + 2); vwrList.Insert (menuViewer, TRUE); oldHandler := menuViewer.handle; menuViewer.handle := Handle; IF ~minimized THEN Update () END END OpenViewerBar; 8 O:8#Syntax10.Scn.Fnt VAR x, y, w, h, i, j: INTEGER; time: LONGINT; BEGIN i := 0; WHILE i <= steps DO j := steps - i; x := (x0 * i + x1 * j) DIV steps; y := (y0 * i + y1 * j) DIV steps; w := (w0 * i + w1 * j) DIV steps; h := (h0 * i + h1 * j) DIV steps; Display.ReplConst (Black, x, y, w, h, Display.invert); time := Oberon.Time (); WHILE time >= (Oberon.Time () - 1) DO IF Input.Available () # 0 THEN i := steps + 1 END END; Display.ReplConst (Black, x, y, w, h, Display.invert); INC (i) END END Animate;  8 "ZSyntax10b.Scn.Fnt8{Syntax10.Scn.FntSyntax10b.Scn.FntK8FoldElemsNewCSyntax10.Scn.FnttSyntax10i.Scn.Fnt" IF (vwr # NIL) & (vwr.state <= 0) THEN IF vwr.state = 0 THEN Animate (vwr.X, vwr.Y + vwr.H - vwr.menuH, vwr.W, vwr.menuH, elem.pElem.x, elem.pElem.y, SHORT (elem.pElem.W DIV TextFrames.Unit), SHORT (elem.pElem.H DIV TextFrames.Unit), 15); Viewers.Open (vwr, vwr.X, vwr.Y + vwr.H); msg.id := Viewers.restore; vwr.handle (vwr, msg) ELSE (* Suspended, or not registered *) END ENDSyntax10i.Scn.Fnt 8Q VAR i: INTEGER; elem: ViewerElem; vwr: MenuViewers.Viewer; msg: Viewers.ViewerMsg; BEGIN In.Open; In.Int (i); elem := vwrList.Get (i); IF elem = NIL THEN MW.MessageBoxS ("The value #i is not a valid viewer-number$(Allowed range from 1 to #vwrList.cnt)", MW.Error); RETURN END; vwr := elem.vwr(MenuViewers.Viewer); IF Closed IN elem.state THEN  Open viewer  ELSE INCL (elem.state, PutDown); Viewers.Close (vwr) END; Update END Do; )8 (* Printing of the menu-bar / Menubar-button-actions *) PROCEDURE PrintViewers ();  Print PopupElems in the ViewerBar  PROCEDURE Update ();  PROCEDURE OpenViewerBar (title: ARRAY OF CHAR; VAR txt: Texts.Text);  Open MenuViewer  PROCEDURE Animate (x0, y0, w0, h0, x1, y1, w1, h1, steps: INTEGER);  Animation: open/close a viewer  PROCEDURE Do*;  Called by clicking on a menu-bar button  88X!Syntax10.Scn.FntSyntax10i.Scn.Fnt MarkElemsAllocSyntax10b.Scn.Fnt*8FoldElemsNew#Syntax10.Scn.Fnt BEGIN IF menuViewer = NIL THEN String ("Installing ViewerBar (by MR)"); Ln; Append (Oberon.Log); BarUp (); IF updateT = NIL THEN InstallUpdateTask () END END END Install; *8 R< 8#Syntax10.Scn.FntII BEGIN IF task # NIL THEN Oberon.Remove (task); task := NIL END; IF updateT # NIL THEN Oberon.Remove (updateT); updateT := NIL END; IF menuViewer # NIL THEN menuViewer.handle := oldHandler; Viewers.Close (menuViewer); menuViewer := NIL; vwrList.RemoveAll (); vwrRecall.RemoveAll (); minimized := TRUE END END CloseBar; 8 r[ 8PSyntax10.Scn.Fnt 8FoldElemsNew#Syntax10.Scn.Fnt VAR i, j, h: LONGINT; BEGIN i := 10; j := 0; WHILE i > 0 DO h := (val DIV i) MOD 10; str [j] := CHR (h + ORD ('0')); DEC (val, h * i); i := i DIV 10; INC (j) END; str [j] := 0X END IntToString; 8# VAR date, time: LONGINT; sec, min, hour, year, mon, day: INTEGER; strVal: ARRAY 12 OF CHAR; PROCEDURE IntToString (VAR str: ARRAY OF CHAR; val: LONGINT);  BEGIN Oberon.GetClock (time, date); sec := SHORT (time MOD 64); min := SHORT (time DIV 64 MOD 64); hour := SHORT (time DIV (64 * 64) MOD 32); IntToString (strVal, hour); String (strVal); String (":"); IntToString (strVal, min); String (strVal); String (":"); IntToString (strVal, sec); String (strVal); String (" - "); day := SHORT (date MOD 32); mon := SHORT (date DIV 32 MOD 16); year := SHORT (date DIV 512 MOD 128); IntToString (strVal, day); String (strVal); String ("."); IntToString (strVal, mon); String (strVal); String ("."); IntToString (strVal, year); String (strVal); Ln; Texts.Append (Oberon.Log, w.buf) END ShowTime; :8 R<8pSyntax10.Scn.Fnt$*8FoldElemsNewCSyntax10.Scn.FntSyntax10b.Scn.FntIF MW.MessageBoxSBut ("Do you really want to$exit the Oberon System ?", MW.Message, {MW.BYes, MW.BNo}) # MW.BYes THEN RETURN END;Syntax10i.Scn.Fnt8Z8#Syntax10.Scn.FntSetColor (Red); String ("ViewerBar.Quit at "); ShowTime (); SetColor (Black); String ("Storing System.Log"); Append (Oberon.Log); 88#Syntax10.Scn.Fnt((Texts.Close (Oberon.Log, "$System.Log");,8U8#Syntax10.Scn.FntNEW (quitTask); quitTask.safe := FALSE; quitTask.time := Input.Time () + 100; quitTask.handle := System.Quit; Oberon.Install (quitTask)-8 VAR quitTask: Oberon.Task; BEGIN  Commit quit - command   Final output to the Log-viewer   Store content of Log-viewer to $System.Log   Install task for quitting the Oberon-System  END Quit; B8 R<f8#Syntax10.Scn.Fntxx VAR menuF, mainF: TextFrames.Frame; vwr: MenuViewers.Viewer; x, y: INTEGER; t: Texts.Text; BEGIN menuF := TextFrames.NewMenu ("System.Log", "^Edit.Menu.Text"); NEW (t); Texts.Open (t, "$System.Log"); mainF := TextFrames.NewText (t, 0); Oberon.AllocateUserViewer (Oberon.Mouse.X, x, y); vwr := MenuViewers.New (menuF, mainF, TextFrames.menuH, x, y); END ShowOldLogfile; 28 R< 8#Syntax10.Scn.Fnt__ BEGIN vwrList.invalid := TRUE; vwrList.MoveClosed (vwrRecall); Update () END RemoveClosed; +8 R< 8#Syntax10.Scn.Fnt;; BEGIN vwrRecall.RemoveAll (); Refresh END ClearHistory; .8 R<8#Syntax10.Scn.Fnt66 BEGIN vwrRecall.Move (vwrList); Update END Recall; %8 EG@8#Syntax10.Scn.Fnt BEGIN String ("Current viewers:"); Ln; vwrList.Print (); String ("Recall-Buffer:"); Ln; vwrRecall.Print (); Texts.Append (Oberon.Log, w.buf) END Print; 78 &D8#Syntax10.Scn.Fnt;; VAR width, height, len: INTEGER; fnt: Fonts.Font; text: MW.Name; xh, yh: INTEGER; BEGIN fnt := Fonts.This ("Syntax12.Scn.Fnt"); MW.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, MW.AlignMiddle, MW.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, MW.AlignMiddle, MW.AlignBottom, text, fnt); s.WritePos (xh, yh, Black, text, fnt) END PrintInfo; 8 EG8CSyntax10.Scn.FntoSyntax10b.Scn.Fntq VAR splash: MW.MsgWin; BEGIN NEW (splash); IF ~splash.OpenMsg ("ViewerBar", NIL, 5000) THEN splash := NIL; RETURN END; splash.SetOwnPrint (300, 50, PrintInfo, NIL); splash.Show (); splash.Close (); splash := NIL END Info; 58 aK8#Syntax10.Scn.FntBB VAR txt: Texts.Text; BEGIN OpenViewerBar ("", txt) END Refresh; !8 D 8#Syntax10.Scn.Fnt)) BEGIN Edit.Open; Update END OpenEdit; 8 D 8#Syntax10.Scn.Fnt-- BEGIN System.Open; Update END OpenSystem; 8 oj<+8#Syntax10.Scn.Fnt VAR name: ARRAY 10 OF CHAR; BEGIN In.Open; In.Name (name); BarUp (); IF name = "Off" THEN noHide := TRUE ELSIF name = "On" THEN noHide := FALSE; InstallTask END END Hide; 48 i 8#Syntax10.Scn.Fnt VAR name: ARRAY 10 OF CHAR; BEGIN In.Open; In.Name (name); IF name = "Off" THEN showLocalTexts := FALSE ELSIF name = "On" THEN showLocalTexts := TRUE END; InitStart; Refresh END LocalTexts;  8 Ba8*Syntax10.Scn.Fntm8FoldElemsNew#Syntax10.Scn.Fnt VAR i: INTEGER; BEGIN i := 0; In.Char (line [0]); WHILE In.Done & (line [i] # CR) DO INC (i); In.Char (line [i]) END; IF line [i] # CR THEN INC (i) END; line [i] := 0X END ReadLine; 8M<8#Syntax10.Scn.Fnt VAR cmds, c: PopupElems.Elem; copy: Texts.CopyMsg; BEGIN NEW (cmds); COPY (name, cmds.name); cmds.small := TRUE; cmds.menu := TextFrames.Text (""); cmds.handle := PopupElems.Handle; Texts.Delete (cmds.menu, 0, cmds.menu.len); Append (cmds.menu); PopupElems.MeasureMenu (cmds); cmds.handle (cmds, copy); c := copy.e (PopupElems.Elem); Texts.WriteElem (w, c); Append (text); RETURN c END InsertPopup; 8v VAR elem, subElem: PopupElems.Elem; name: ARRAY 64 OF CHAR; PROCEDURE ReadLine (VAR line: ARRAY OF CHAR);  PROCEDURE InsertPopup (name: Name; VAR text: Texts.Text): PopupElems.Elem;  BEGIN In.Open; ReadLine (name); elem := InsertPopup (name, Oberon.Log); Texts.Delete (elem.menu, 0, elem.menu.len); WHILE In.Done DO ReadLine (name); TBold; String ("Edit.Open "); TDefault; String (name); Ln; TBold; String ("System.Open "); TDefault; String (name); Ln; TBold; String ("Browser.ShowDef "); TDefault; String (name); subElem := InsertPopup (name, elem.menu); Ln; Append (elem.menu) END END CreateAccessPopup; .8 C#8#Syntax10.Scn.Fnt VAR txt: Texts.Text; BEGIN IF menuViewer # NIL THEN SaveCaret (); Viewers.Close (menuViewer) END; System.Grow; menuViewer := NIL; OpenViewerBar ("", txt); RestoreCaret () END Grow; C8) (* Commands in Start-menu *) PROCEDURE Install*;  Installs the ViewerBar in the User-track  PROCEDURE CloseBar*;  Closes the ViewerBar  PROCEDURE ShowTime*;  Shows the current time and date in the System.Log-viewer  PROCEDURE Quit*;  Quits (after a commit) the Oberon System (stores the Log-viewer)  PROCEDURE ShowOldLogfile*;  Shows the old Log-viewer (from the last session)  PROCEDURE RemoveClosed*;  Removes closed viewers from the ViewerBar  PROCEDURE ClearHistory*;  Clears the history from the disposed viewers  PROCEDURE Recall*;  Recall all viewers from the History  PROCEDURE Print*;  Print all registered viewers (For debugging purposes)  PROCEDURE PrintInfo (s: MW.InfoWin; x, y, w, h: INTEGER; absNr, nr: LONGINT);  Print content of "Info"  PROCEDURE Info*;  Open message-box for informations about this module  PROCEDURE Refresh*;  Refresh ViewerBar (full redraw)  PROCEDURE OpenEdit*;  Open with Editor (User-Track)  PROCEDURE OpenSystem*;  Open in System-Track  PROCEDURE Hide*;  Turns the automatic hiding of the ViewerBar on/off  PROCEDURE LocalTexts*;  Shows or hides the Local menus  PROCEDURE CreateAccessPopup*;  Creates hierarchical PopupElem for open file  PROCEDURE Grow*;  Like System.Grow, because System.Grow doesn't work with ViewerBar  8t8<Syntax10.Scn.FntSyntax10i.Scn.Fnt8 MarkElemsAllocS8FoldElemsNewcSyntax10.Scn.FntSyntax10b.Scn.FntSyntax10i.Scn.Fnt BEGIN IF dir THEN RETURN END; (* Directory *) IF Strings.Match (name, listPattern) THEN String (listString); IF startupDir THEN String ("$") END; String (name); Ln END END ListProc; 8 {78CSyntax10.Scn.FntMSyntax10b.Scn.Fnt VAR menuTxt: Texts.Text; BEGIN IF Files.Old (name) = NIL THEN buf := NIL; RETURN END; NEW (menuTxt); Texts.Open (menuTxt, name); NEW (buf); Texts.OpenBuf (buf); Texts.Save (menuTxt, 0, menuTxt.len, buf); txtVwrPopupPos := 0 END InitMenu; 8 ֣ &8#Syntax10.Scn.Fnt VAR current, startup: Dir.Directory; BEGIN startup := Dir.Startup (); current := Dir.Current (); SetColor (Red); String ("Menu ---------------------------"); Ln; SetColor (White); String ("Start Off."); Ln; SetColor (Black); String ("Menu Off."); Ln; SetColor (Red); String ("Startup directory -----------"); Ln; SetColor (White); startupDir := TRUE; COPY (StartCall, listString); COPY (StartExt, listPattern); Dir.Enumerate (startup, ListProc); SetColor (Blue); COPY (MenuCall, listString); COPY (MenuExt, listPattern); Dir.Enumerate (startup, ListProc); IF showLocalTexts & (current # startup) THEN SetColor (Red); String ("Current directory ----------"); Ln; SetColor (White); startupDir := FALSE; COPY (StartCall, listString); COPY (StartExt, listPattern); Dir.Enumerate (current, ListProc); SetColor (Green); COPY (MenuCall, listString); COPY (MenuExt, listPattern); Dir.Enumerate (current, ListProc); END END InitMenuList; !8 a8#Syntax10.Scn.Fnt BEGIN InitMenuList (); cmdMenus := CreatePopup ("Menus ..."); IF startBuffer # NIL THEN Texts.Copy (startBuffer, w.buf); Ln END; SetColor (Red); String ("---------------------------------"); SetColor (Black); Ln; Texts.WriteElem (w, cmdMenus); Ln; StringB ("ViewerBar.", "OpenEdit ^"); Ln; StringB ("ViewerBar.", "OpenSystem ^"); Ln; StringB ("ViewerBar.", "Info"); Ln; SetColor (Red); StringB ("ViewerBar.", "Quit"); SetColor (Black); cmdStart := CreatePopup ("Start") END InitStart; 8 G38aSyntax10.Scn.Fnt78FoldElemsNew#Syntax10.Scn.Fnt VAR i, j: INTEGER; BEGIN j := 0; IF nameMS [0] = '$' THEN i := 1 ELSE i := 0 END; WHILE (nameMS [i] # 0X) & (name [j] # 0X) & (nameMS [i] = name [j]) DO INC (i); INC (j) END; RETURN nameMS [i] = name [j] END Compare; 8 PROCEDURE Compare (VAR nameMS, name: Name): BOOLEAN;  BEGIN notified := notified OR Compare (menuName, name) OR Compare (startName, name) OR ((op = Dir.change) & (showLocalTexts OR (menuName [0] # '$'))); oldNotifier (op, path, name) END Notifier;  8 . n8#Syntax10.Scn.Fntpp BEGIN IF oldNotifier # NIL THEN Dir.notify := oldNotifier; oldNotifier := NIL END; CloseBar END TermHandler; 8 8#Syntax10.Scn.Fnt&& BEGIN TermHandler () END FinHandler; 8 Dr 8#Syntax10.Scn.Fnt BEGIN vwrList := NewViewerList (); vwrRecall := NewViewerList (); minimized := TRUE; heightOk := FALSE; noHide := TRUE; showLocalTexts := FALSE; Texts.OpenWriter (w); startName := DefaultStartName; InitMenu (startName, startBuffer); IF startBuffer = NIL THEN startName := DefaultStartName2; InitMenu (startName, startBuffer) END; menuName := DefaultMenuName; InitMenu (menuName, menuBuffer); IF menuBuffer = NIL THEN menuName := DefaultMenuName2; InitMenu (menuName, menuBuffer) END; InitStart (); X.InstallTermHandler (TermHandler, FinHandler, Modules.ThisMod ("ViewerBar")); oldNotifier := Dir.notify; Dir.notify := Notifier; notified := FALSE; textHeight := TextFrames.menuH; userFrame.Save (NIL); userMenu.Save (NIL) END Init; 8Q (* Initialization, File-handling, termination handler *) PROCEDURE ListProc (d: Dir.Directory; name: ARRAY OF CHAR; dir: BOOLEAN; VAR cont: BOOLEAN);  PROCEDURE InitMenu (name: ARRAY OF CHAR; VAR buf: Texts.Buffer);  Load menu in ViewerBar  PROCEDURE InitMenuList ();  Init menus-button in start-menu  PROCEDURE InitStart ();  Init start-button  PROCEDURE Notifier (op: INTEGER; path, name: ARRAY OF CHAR);  Called from module Directories  PROCEDURE TermHandler;  For Windows Oberon  PROCEDURE FinHandler (o: S.PTR);  For PowerMac  PROCEDURE Init ();  Init ViewerBar  48&  uMODULE ViewerBar; (* ViewerBar by MR 27.3.97 -   *)    IMPORT TextFrames, Texts, Oberon, MenuViewers, Display, Viewers, PopupElems, Fonts, Input, In, System, Edit, Strings, Files, Dir := Directories, MW := MsgWindows, X := Platform, Modules, S := SYSTEM; CONST  TYPE  VAR   Forward declarations   Text operations   ViewerList - class   PElem handling   CaretSave - class   Frame Handling / Bar operations / Tasks   Printing of the menu-bar   Commands in Start-menu   Initialization, File-handling, termination handler  BEGIN Init END ViewerBar. ViewerBar.Install System.Free ViewerBar ~