v:Syntax10.Scn.Fnt,pdIStampElemsAlloc11 Aug 97 8FoldElemsNew#Syntax10.Scn.Fnt VAR i, j: INTEGER; name: ARRAY 256 OF CHAR; d, d0: Directories.Directory; BEGIN d := Directories.This(curDirName); d0 := Directories.Startup(); i := 0; WHILE (d0.path[i] # 0X) & (CAP(d0.path[i]) = CAP(d.path[i])) DO INC(i) END; IF (d0.path[i] = 0X) & ((d.path[i] = 0X) OR (d.path[i] = Directories.delimiter)) THEN IF d.path[i] = Directories.delimiter THEN name[0] := "$"; j := 0; INC (i); REPEAT INC(j); name[j] := d.path[i]; INC(i) UNTIL name[j] = 0X ELSE name := "$" END ELSE COPY(d.path, name) END; i := 0; WHILE name[i] # 0X DO INC(i) END; IF i < 32 THEN COPY(name, curDirName) ELSE curDirName[31] := 0X; j := 31; REPEAT DEC(i); DEC(j); curDirName[j] := name[i] UNTIL j = 1; curDirName[0] := "*" END END SetDirName; 8R8#Syntax10.Scn.FntJJ VAR i, len: INTEGER; ch: CHAR; R: Texts.Reader; BEGIN Texts.OpenReader(R, T, Texts.Pos(S)- 1); Texts.Read(R, ch); IF (S.class = Texts.Name) OR (S.class = Texts.String) THEN COPY(S.s, name); i := 0; WHILE name[i] # 0X DO INC(i) END ELSIF S.class = Texts.Char THEN name[0] := S.c; name[1] := 0X; i := 1; ELSE WHILE ch <= " " DO Texts.Read(R, ch) END; i := 0 END; len := SHORT(LEN(name) - 1); WHILE ~R.eot & (ch > " ") & (i < len) DO name[i] := ch; INC(i); Texts.Read(R, ch) END; name[i] := 0X; Texts.OpenScanner(S, T, Texts.Pos(R) - 1); Texts.Scan(S) END GetName; 8p8#Syntax10.Scn.Fnt BEGIN COPY(FMDevObj.sortName, sortOrder); NEW(attributes.names, TextFrames.MaxTabs - 1); attributes.nOfAttributes := 0; LOOP IF (S.class = Texts.Char) & (S.c = "\") & (S.line = 0) THEN Texts.Scan(S); IF (S.class = Texts.Name) & (S.line = 0) THEN IF S.s = "sort" THEN Texts.Scan(S); IF (S.class = Texts.Name) & (S.line = 0) THEN COPY(S.s, sortOrder) ELSE EXIT END ELSIF S.s = "show" THEN Texts.Scan(S); IF (S.class = Texts.Name) & (S.line = 0) THEN COPY(S.s, attributes.names[attributes.nOfAttributes]); INC(attributes.nOfAttributes) ELSE EXIT END ELSE EXIT END ELSE EXIT END ELSE EXIT END; Texts.Scan(S) END END GetOptions; 88#Syntax10.Scn.Fnt VAR v: Viewers.Viewer; S: Texts.Scanner; text: Texts.Text; beg, end, time: LONGINT; BEGIN text := Oberon.Par.text; Texts.OpenScanner(S, text, Oberon.Par.pos); Texts.Scan(S); IF (Oberon.Par.vwr # NIL) & (Oberon.Par.vwr.dsc # NIL) & (Oberon.Par.vwr.dsc = Oberon.Par.frame) THEN v := Oberon.Par.vwr ELSIF Oberon.Pointer.on THEN v := Oberon.MarkedViewer() ELSE v := NIL END; IF (v # NIL) & (v.dsc # NIL) & (v.dsc.next # NIL) & (v.dsc.next IS TextFrames.Frame) & (v.dsc.next(TextFrames.Frame).text IS FMFrames.Text) THEN frame := v.dsc.next(TextFrames.Frame) ELSE frame := NIL END; IF (S.class = Texts.Char) & (S.c = "^") THEN Oberon.GetSelection(text, beg, end, time); IF time > 0 THEN Texts.OpenScanner(S, text, beg); Texts.Scan(S) ELSE RETURN FALSE END END; IF (S.class = Texts.Char) & (S.c = "\") THEN GetOptions(S, attributes, sortOrder) ELSE GetName(text, S, name); GetOptions(S, attributes, sortOrder) END; RETURN TRUE END GetArgu; 8=8Syntax10.Scn.FntY8FoldElemsNew#Syntax10.Scn.Fnt// VAR curr, node, prev: FMDevObj.Node; e: FMElems.Elem; BEGIN IF root = NIL THEN RETURN NIL END; IF root.elem.selected THEN root.desc := NIL; RETURN root END; curr := root.desc; WHILE curr # NIL DO node := NIL; IF curr.elem IS FMElems.FolderElem THEN node := RemoveFiles (curr) END; IF node = NIL THEN IF curr = root.desc THEN root.desc := curr.next ELSE prev.next := curr.next; curr := prev END END; prev := curr; curr := curr.next; END; IF root.desc = NIL THEN RETURN NIL END; RETURN root END RemoveFiles; 8_ VAR root: FMDevObj.Node; PROCEDURE RemoveFiles (root: FMDevObj.Node): FMDevObj.Node; BEGIN root := FMFrames.GetSelectedElems(t); RETURN RemoveFiles(root) END GetSelectedDirs; 8` 8CSyntax10.Scn.Fnt`8FoldElemsNewCSyntax10.Scn.FntSyntax10b.Scn.Fnt^ VAR i: INTEGER; names: FMElems.AttributeNames; BEGIN NEW(names, attributes.nOfAttributes + 1); FOR i := 0 TO attributes.nOfAttributes - 1 DO (*COPY(attributes.names[i], names[i]) <== doses not work, compiler bug (PowerMac) *) j := -1; REPEAT INC(j); names[i][j] := attributes.names[i][j] UNTIL attributes.names[i][j] = 0X END; (*COPY(name, names[attributes.nOfAttributes]); <== does not work, compiler bug *) j := -1; REPEAT INC(j); names[attributes.nOfAttributes][j] := name[j] UNTIL name[j] = 0X; attributes.names := names; INC(attributes.nOfAttributes) END AppendAttribute; 8Syntax10i.Scn.FntW a ; VAR f, folder: FMElems.FolderElem; i, j: INTEGER; PROCEDURE AppendAttribute (VAR attributes: FMElems.Attributes; name: ARRAY OF CHAR); BEGIN IF root.desc = NIL THEN folder := root.elem(FMElems.FolderElem); IF id = select THEN FMFrames.SelectFiles(t, folder, name) ELSE IF (id = sort) & (name # "") THEN COPY(name, folder.sortOrder) ELSIF id = view THEN COPY(name, folder.pattern) ELSIF id = switchAttributes THEN i := 0; WHILE (i < folder.attributes.nOfAttributes) & (folder.attributes.names[i] # name) DO INC(i) END; IF i < folder.attributes.nOfAttributes THEN (* attribute found *) f := FMFrames.GetEnclosingFolder(t, Texts.ElemPos(folder)); IF f # NIL THEN folder.attributes.names[i] := 0X ELSE DEC(folder.attributes.nOfAttributes); FOR j := i TO folder.attributes.nOfAttributes - 1 DO folder.attributes.names[j] := folder.attributes.names[j+1] END END ELSE (* attribute is not contained *) f := FMFrames.GetEnclosingFolder(t, Texts.ElemPos(folder)); IF f # NIL THEN i := 0; WHILE (i < f.attributes.nOfAttributes) & (f.attributes.names[i] # name) DO INC(i) END; IF i < f.attributes.nOfAttributes THEN (* attribute found *) COPY(name, folder.attributes.names[i]) ELSE AppendAttribute(folder.attributes, name) (* attribute is not contained *) END ELSE AppendAttribute(folder.attributes, name) END END END; IF folder.open THEN FMFrames.SwitchFolder(t, folder); FMFrames.SwitchFolder(t, folder) END END ELSE root := root.desc; WHILE root # NIL DO Change(t, id, root, name); root := root.next END END END Change; 8$8#Syntax10.Scn.Fnt VAR frame: TextFrames.Frame; name: FMElems.Name; attributes: FMElems.Attributes; sortOrder: FMElems.AttributeName; root: FMDevObj.Node; BEGIN IF GetArgu(frame, name, sortOrder, attributes) THEN IF frame # NIL THEN root := GetSelectedDirs(frame.text(FMFrames.Text)); IF root # NIL THEN FMFrames.RemoveFocus(frame); Change(frame.text(FMFrames.Text), id, root, name); IF id # select THEN FMFrames.RemoveSelection(frame) END END END END END ExecuteCmd; 8E8#Syntax10.Scn.Fnt99 VAR x, y: INTEGER; v: Viewers.Viewer; path: FMDevObj.Path; BEGIN Oberon.AllocateSystemViewer(Oberon.Par.vwr.X, x, y); dev.GetPath(folder, path); SetDirName(path); v := MenuViewers.New(TextFrames.NewMenu(path, menu), FMFrames.NewFrame(FMFrames.NewText(dev, folder)), TextFrames.menuH, x, y) END Browse; 8"B8#Syntax10.Scn.Fnt VAR frame: TextFrames.Frame; name: FMElems.Name; attributes: FMElems.Attributes; dummy: BOOLEAN; msg: FMFrames.CopyMoveMsg; BEGIN dummy := GetArgu(frame, name, name, attributes); IF frame # NIL THEN msg.root := FMFrames.GetSelectedElems(frame.text(FMFrames.Text)); msg.devObj := frame.text(FMFrames.Text).devObj; msg.id := id; IF msg.root # NIL THEN Viewers.Broadcast(msg) END END END CopyMove; 8 Syntax10b.Scn.Fnt8#Syntax10.Scn.Fnt** BEGIN CopyMove(FMFrames.copy) END Copy; 8 8#Syntax10.Scn.Fnt VAR frame: TextFrames.Frame; name: FMElems.Name; attributes: FMElems.Attributes; dummy: BOOLEAN; BEGIN dummy := GetArgu(frame, name, name, attributes); IF frame # NIL THEN FMFrames.DeleteSelectedFiles(frame) END END Delete; 8 8#Syntax10.Scn.Fnt** BEGIN CopyMove(FMFrames.move) END Move; 8  8#Syntax10.Scn.Fnt VAR frame: TextFrames.Frame; name, sortOrder: FMElems.Name; attributes: FMElems.Attributes; v: Viewers.Viewer; BEGIN IF GetArgu(frame, name, sortOrder, attributes) THEN v := Oberon.FocusViewer; IF (v # NIL) & (v.dsc # NIL) & (v.dsc.next # NIL) & (v.dsc.next IS TextFrames.Frame) & (v.dsc.next(TextFrames.Frame).text IS FMFrames.Text) THEN frame := v.dsc.next(TextFrames.Frame); FMFrames.NewDir(frame, name) END END END New; 8 8#Syntax10.Scn.Fnt VAR fullName: FMDevObj.Path; sortOrder: FMElems.AttributeName; folder: FMElems.FolderElem; attributes: FMElems.Attributes; dev: FMDevObj.Device; frame: TextFrames.Frame; BEGIN IF GetArgu(frame, fullName, sortOrder, attributes) THEN IF frame # NIL THEN FMFrames.OpenSelectedElems(frame) ELSE dev := FMSysDevObj.NewDevObj(fullName, folder, attributes, sortOrder); IF dev # NIL THEN Browse(dev, folder) END END END END Open; 8  28#Syntax10.Scn.Fnt VAR fullName: FMDevObj.Path; attributes: FMElems.Attributes; sortOrder: FMElems.AttributeName; frame: TextFrames.Frame; folder: FMElems.FolderElem; BEGIN IF GetArgu(frame, fullName, sortOrder, attributes) THEN IF frame # NIL THEN folder := frame.text(FMFrames.Text).devObj.GetTrash(attributes, sortOrder); IF folder # NIL THEN Browse(frame.text(FMFrames.Text).devObj, folder) END END END END OpenTrash; 8 8T Syntax10.Scn.Fnt^z8FoldElemsNew#Syntax10.Scn.Fntdd VAR r: Texts.Reader; BEGIN Texts.OpenReader(r, text, 0); Texts.ReadElem(r); WHILE r.elem # NIL DO IF (r.elem IS FMElems.FolderElem) & ~r.elem(FMElems.FolderElem).open THEN FMFrames.SwitchFolder(text, r.elem(FMElems.FolderElem)); Texts.OpenReader(r, text, Texts.ElemPos(r.elem)); END; Texts.ReadElem(r) END END OpenAllFolders; 848Syntax10.Scn.FntgT8FoldElemsNew#Syntax10.Scn.Fnt VAR empty: BOOLEAN; pos: LONGINT; folder: FMElems.FolderElem; path: FMDevObj.Path; BEGIN empty := TRUE; LOOP Texts.ReadElem(r); IF (r.elem = NIL) OR (r.elem IS FMFrames.EndMarker) THEN RETURN empty ELSIF r.elem IS FMElems.FolderElem THEN folder := r.elem(FMElems.FolderElem); IF ToRemove(folder) THEN pos := Texts.ElemPos(folder); text.devObj.GetPath(parent, path); FMFrames.RemoveElem(text, path, folder.name, text.devObj); Texts.OpenReader(r, text, pos) ELSE empty := FALSE END ELSIF r.elem IS FMElems.Elem THEN empty := FALSE END END END ToRemove;8K VAR r: Texts.Reader; dummy: BOOLEAN; PROCEDURE ToRemove (parent: FMElems.FolderElem): BOOLEAN; BEGIN Texts.OpenReader(r, text, 0); REPEAT Texts.ReadElem(r) UNTIL (r.elem = NIL) OR (r.elem IS FMElems.FolderElem); IF r.elem # NIL THEN dummy := ToRemove(r.elem(FMElems.FolderElem)) END END RemoveEmptyFolders;8M8#Syntax10.Scn.Fnt VAR text: Texts.Text; x, y: INTEGER; v: Viewers.Viewer; frame: TextFrames.Frame; BEGIN devObj.GetPath(folder, fullName); text := FMFrames.NewText(devObj, folder); OpenAllFolders(text(FMFrames.Text)); RemoveEmptyFolders(text(FMFrames.Text)); frame := FMFrames.NewFrame(text(FMFrames.Text)); Oberon.AllocateSystemViewer(Oberon.Par.vwr.X, x, y); v := MenuViewers.New(TextFrames.NewMenu(fullName, "^FileManager.Menu.Text"), frame, TextFrames.menuH, x, y) END OpenViewer; 8Eo8#Syntax10.Scn.Fntoo VAR msg: Texts.CopyMsg; BEGIN IF root.desc = NIL THEN msg.e := NIL; root.elem.handle(root.elem, msg); folder := msg.e(FMElems.FolderElem); folder.open := FALSE; COPY(pattern, folder.pattern); OpenViewer(devObj, folder) ELSE root := root.desc; WHILE root # NIL DO SearchDirs(devObj, root); root := root.next END END END SearchDirs; 8 VAR fullName: FMDevObj.Path; attributes: FMElems.Attributes; sortOrder: FMElems.AttributeName; folder: FMElems.FolderElem; devObj: FMDevObj.Device; frame: TextFrames.Frame; root: FMDevObj.Node; text: Texts.Text; r: Texts.Reader; beg, end, time: LONGINT; pattern: FMElems.Name; i: INTEGER; PROCEDURE OpenAllFolders(text: FMFrames.Text); PROCEDURE RemoveEmptyFolders(text: FMFrames.Text); PROCEDURE OpenViewer (devObj: FMDevObj.Device; folder: FMElems.FolderElem); PROCEDURE SearchDirs(devObj: FMDevObj.Device; root: FMDevObj.Node); BEGIN IF GetArgu(frame, fullName, sortOrder, attributes) THEN IF frame = NIL THEN devObj := FMSysDevObj.NewDevObj(fullName, folder, attributes, sortOrder); IF devObj # NIL THEN OpenViewer(devObj, folder) END ELSE root :=GetSelectedDirs(frame.text(FMFrames.Text)); FMFrames.RemoveSelection(frame); Oberon.GetSelection(text, beg, end, time); pattern := ""; IF time > 0 THEN Texts.OpenReader(r, text, beg); i := 0; REPEAT Texts.Read(r, pattern[i]); INC(i) UNTIL Texts.Pos(r) = end; pattern[i] := 0X; END; IF (root # NIL) & (pattern # "") THEN SearchDirs(frame.text(FMFrames.Text).devObj, root) END END END END Search; 8 8#Syntax10.Scn.Fnt'' BEGIN ExecuteCmd(select) END Select; 8 8#Syntax10.Scn.Fnt:: BEGIN ExecuteCmd(switchAttributes) END SwitchAttribute; 8 8#Syntax10.Scn.Fnt## BEGIN ExecuteCmd(sort) END Sort; 8 8#Syntax10.Scn.Fnt## BEGIN ExecuteCmd(view) END View; 8MODULE FileManager; (* Christian Mayrhofer,  *) IMPORT MenuViewers, Oberon, Texts, TextFrames, Viewers, FMElems, FMDevObj, FMSysDevObj, FMFrames, Directories; CONST menu = "^FileManager.Menu.Text"; select = 0; sort = 1; switchAttributes = 2; view = 3; PROCEDURE SetDirName (VAR curDirName: ARRAY OF CHAR); PROCEDURE GetName (T: Texts.Text; VAR S: Texts.Scanner; VAR name: ARRAY OF CHAR); PROCEDURE GetOptions (VAR S: Texts.Scanner; VAR attributes: FMElems.Attributes; VAR sortOrder: ARRAY OF CHAR); PROCEDURE GetArgu (VAR frame: TextFrames.Frame; VAR name, sortOrder: ARRAY OF CHAR; VAR attributes: FMElems.Attributes): BOOLEAN; PROCEDURE GetSelectedDirs (t: FMFrames.Text): FMDevObj.Node; PROCEDURE Change (t: FMFrames.Text; id: INTEGER; root: FMDevObj.Node; VAR name: ARRAY OF CHAR); PROCEDURE ExecuteCmd (id: INTEGER); PROCEDURE Browse (dev: FMDevObj.Device; folder: FMElems.FolderElem); PROCEDURE CopyMove (id: INTEGER); PROCEDURE Copy*; PROCEDURE Delete*; PROCEDURE Move*; PROCEDURE New*; PROCEDURE Open*; PROCEDURE OpenTrash*; PROCEDURE Search*; PROCEDURE Select*; PROCEDURE SwitchAttribute*; PROCEDURE Sort*; PROCEDURE View*; END FileManager.