;Syntax10.Scn.FntGSStampElemsAlloc6 Oct 98i?p_VersionElemsAllocBeg#Syntax10.Scn.FntWindows PowerMac LinuxLinuxWindows#Syntax10.Scn.FntWINDOWS VERSIONPowerMac#Syntax10.Scn.FntPOWERMAC VERSIONLinux p_VersionElemsAllocEnd#-8FoldElemsNew#Syntax10.Scn.Fnt (**************************************************** Revision History: 960128: GO GetWidth/GetNameWidth are now exported ****************************************************) 8MLp#Syntax10.Scn.FntWindows PowerMac LinuxLinuxWindows#Syntax10.Scn.Fnt, Win32PowerMac#Syntax10.Scn.Fnt , MacintoshLinux p[Wp_#Syntax10.Scn.FntWindows PowerMac LinuxLinuxWindows#Syntax10.Scn.Fnt0A1XPowerMac#Syntax10.Scn.Fnt08XLinux p_ 8#Syntax10.Scn.Fnt77 BEGIN IF x < y THEN RETURN y END; RETURN x END Max; 8+8#Syntax10.Scn.Fnt BEGIN Display.ReplConst(black, x, y, w, 1, Display.replace); Display.ReplConst(black, x, y, 1, h, Display.replace); Display.ReplConst(black, x, y + h - 1, w, 1, Display.replace); Display.ReplConst(black, x + w - 1, y, 1, h, Display.replace) END DrawFrame; 8Xr8#Syntax10.Scn.Fntll VAR i, dx, cx, cy, cw, ch: INTEGER; pat: Display.Pattern; BEGIN IF focused THEN DrawFrame(x, y, w, h) END; INC(x, leftMargin); y := y - minY; i := 0; WHILE name[i] # 0X DO Display.GetChar(Fonts.Default.raster, name[i], dx, cx, cy, cw, ch, pat); Display.CopyPattern(black, pat, x + cx, y + cy, Display.paint); INC(x, dx); INC(i) END END DisplayName; 8828#Syntax10.Scn.Fnt VAR i, cw: INTEGER; BEGIN i := 0; cw := 0; WHILE name[i] # 0X DO cw := cw+ charWidth[ORD(name[i])]; INC(i) END; RETURN cw + leftMargin + rightMargin END GetNameWidth; 8/A8#Syntax10.Scn.Fnt VAR w: INTEGER; BEGIN w := 0; REPEAT w := w + charWidth[number MOD 10 + ORD("0")]; number := number DIV 10 UNTIL number = 0; RETURN w END GetWidth; 8B8#Syntax10.Scn.Fnt VAR pat: Pattern; i: INTEGER; BEGIN IF selected THEN pat := icon.selPat ELSE pat := icon.pat END; FOR i := 0 TO SHORT(LEN(pat^)) - 1 DO Display.CopyPattern(pat[i].col, pat[i].pat, x, y, Display.paint) END END Draw; 8$8#Syntax10.Scn.Fnt   BEGIN Display.ReplConst(selectedCol, ef.X + 1, ef.Y + 1, ef.W - 2, ef.H - 2, Display.replace); DisplayName(ef.X, ef.Y, ef.W, ef.H, TRUE, ef.elem.name); Display.CopyPatternC(ef, black, Display.hook, ef.X + ef.cardx, ef.Y- minY - hookH + 2, Display.paint) END Draw; 8K8#Syntax10.Scn.Fnt VAR i, dx, dX: INTEGER; keys: SET; elem: Elem; BEGIN elem := ef.elem; REPEAT dx := leftMargin; dX := X - ef.X; i := 0; WHILE (elem.name[i] # 0X) & ((dx + charWidth[ORD(elem.name[i])]) <= dX) DO dx := dx + charWidth[ORD(elem.name[i])]; INC(i) END; ef.i := i; IF ~ef.hasCar OR (ef.cardx # dx) THEN ef.cardx := dx; ef.hasCar := TRUE; ef.Draw() END; Input.Mouse(keys, X, Y); Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, X, Y); keysum := keysum + keys UNTIL keys = {} END TrackCaret; 8+81Syntax10.Scn.Fnt  VAR j: INTEGER; msg: NotifyMsg; notify: BOOLEAN; elem: Elem; BEGIN elem := ef.elem; notify := FALSE; IF (ch = DEL) OR (ch = DELRIGHT) THEN IF (ch = DEL) & (ef.i > 0) THEN notify := TRUE; DEC(ef.i); ef.cardx := ef.cardx - charWidth[ORD(elem.name[ef.i])]; ELSIF (ch = DELRIGHT) & (elem.name[ef.i] # 0X) THEN notify := TRUE END; IF notify THEN j := ef.i; WHILE elem.name[j] # 0X DO elem.name[j] := elem.name[j+1]; INC(j) END END ELSIF (ch = CRSL) OR (ch = CRSR) THEN IF (ch = CRSL) & (ef.i > 0) THEN ef.cardx := ef.cardx - charWidth[ORD(elem.name[ef.i - 1])]; DEC(ef.i) ELSIF (ch = CRSR) & (elem.name[ef.i] # 0X) THEN ef.cardx := ef.cardx + charWidth[ORD(elem.name[ef.i])]; INC(ef.i) END; ef.Draw() ELSIF (ch >= " ") & (ef.i + 1 < LEN(elem.name)) & (charWidth[ORD(ch)] > 0) THEN notify := TRUE; j := ef.i; WHILE (elem.name[j] # 0X) DO INC(j) END; IF j + 1 = LEN(elem.name) THEN DEC(j, 2) END; WHILE (ef.i <= j) DO elem.name[j+1] := elem.name[j]; DEC(j) END; elem.name[ef.i] := ch; ef.cardx := ef.cardx + charWidth[ORD(ch)]; INC(ef.i); END; IF notify THEN msg.elem := elem; msg.id := draw; Viewers.Broadcast(msg); Display.CopyPatternC(ef, black, Display.hook, ef.X + ef.cardx, ef.Y- minY - hookH + 2, Display.paint) END END Edit; 8F8#Syntax10.Scn.Fnt&& BEGIN WITH ef: EditFrame DO WITH msg: Oberon.InputMsg DO IF msg.id = Oberon.track THEN IF msg.keys = {ML} THEN ef.TrackCaret(msg.keys, msg.X, msg.Y) END ELSIF (msg.id = Oberon.consume) & ef.hasCar THEN ef.Edit(msg.ch); END ELSE END ELSE END END FrameHandle; 808#Syntax10.Scn.Fnt44 BEGIN e.icon.Draw(e.selected, x, y) END DrawIcon; 8+8#Syntax10.Scn.Fnt00 VAR w, h: INTEGER; BEGIN INC(y, e.desc); e.DrawIcon(x, y); x := x + e.iconW; y := y + minY; w := SHORT(e.W DIV Unit) - e.iconW; h := SHORT(e.H DIV Unit) - 1; IF e.selected THEN Display.ReplConst(selectedCol, x, y, w, h, Display.replace) END; DisplayName(x, y, w, h, e.focused, e.name); END Draw; 84<8#Syntax10.Scn.Fnt VAR msg: NotifyMsg; BEGIN e.focused := FALSE; e.selected := FALSE; msg.id := draw; COPY(name, e.name); msg.elem := e; Viewers.Broadcast(msg) END Defocus; 8778#Syntax10.Scn.Fnt VAR frame: EditFrame; msg: NotifyMsg; BEGIN e.selected := TRUE; e.focused := TRUE; msg.elem := e; msg.id := draw; Viewers.Broadcast(msg); NEW(frame); frame.X := x + e.iconW; frame.Y := y + e.desc + minY; frame.W := SHORT(e.W DIV Unit) - e.iconW; frame.H := SHORT(e.H DIV Unit) - 1; COPY(e.name, frame.oldName); frame.handle := FrameHandle; frame.elem := e; frame.hasCar := FALSE; RETURN frame END Focus; 818#Syntax10.Scn.Fnt>> BEGIN f.W := SHORT(e.W DIV Unit) - e.iconW END ResizeFrame; 8)X8#Syntax10.Scn.Fnt VAR msg: NotifyMsg; BEGIN e.selected := ~e.selected; msg.elem := e; msg.id := draw; Viewers.Broadcast(msg) END ToggleSelection; 80k8#Syntax10.Scn.Fntss VAR clone: Elem; BEGIN IF de = NIL THEN NEW(clone); de := clone END; Texts.CopyElem(e,de); de(Elem).name := e.name; de(Elem).size := e.size; de(Elem).date := e.date; de(Elem).time := e.time; de(Elem).icon := e.icon; de(Elem).iconW := e.iconW; de(Elem).iconH := e.iconH; de(Elem).desc := e.desc; de(Elem).selected := e.selected; de(Elem).focused := FALSE END Copy; 8T38#Syntax10.Scn.Fnt BEGIN Texts.Write(w, Tab); IF name = showSize THEN Texts.WriteInt(w, e.size, 0) ELSIF name = showDate THEN Texts.WriteDate(w, e.time, e.date) END END WriteAttribute; 8XR8#Syntax10.Scn.Fnt VAR i: INTEGER; BEGIN FOR i := 0 TO attributes.nOfAttributes - 1 DO e.WriteAttribute(w, attributes.names[i]) END END WriteAttributes; 8V8#Syntax10.Scn.Fnt BEGIN IF name = showSize THEN width := LONG(GetWidth(e.size))*Unit ELSIF name = showDate THEN width := LONG(15*LONG(charWidth[ORD("0")]))*Unit ELSE width := 0 END END GetAttributeWidth; 8dD8#Syntax10.Scn.Fnt VAR i: INTEGER; BEGIN FOR i := 0 TO attributes.nOfAttributes - 1 DO e.GetAttributeWidth(widths[i], attributes.names[i]) END END GetAttributeWidths; 8@8#Syntax10.Scn.FntXX BEGIN WITH e: Elem DO WITH msg: Texts.CopyMsg DO e.Copy(msg.e) | msg: TextFrames.DisplayMsg DO IF msg.prepare THEN e.desc := SHORT(-msg.Y0); e.W := LONG(e.iconW + GetNameWidth(e.name))*Unit; e.H := LONG(Max(e.iconH, maxY+1) - minY)*Unit ELSE e.Draw(msg.X0, msg.Y0) END ELSE END ELSE END END ElemHandle; 8O8#Syntax10.Scn.Fnt'' BEGIN e.icon := fileIcon; e.iconW := W; e.iconH := H; e.W := LONG(e.iconW + GetNameWidth(name))*Unit; e.H := Max(e.iconH, maxY) - minY; COPY(name, e.name); e.size := size; e.date := date; e.time := time; e.selected := FALSE; e.focused := FALSE; e.handle := ElemHandle; END InitElem; 8;T8#Syntax10.Scn.Fnt BEGIN IF folder.open THEN folder.openIcon.Draw(folder.selected, x, y) ELSE folder.icon.Draw(folder.selected, x, y) END END DrawIcon; 8<G8#Syntax10.Scn.Fnt VAR clone: FolderElem; i: INTEGER; BEGIN IF de = NIL THEN NEW(clone); de := clone END; folder.Copy^(de); de(FolderElem).openIcon := folder.openIcon; de(FolderElem).indent := folder.indent; de(FolderElem).pattern := folder.pattern; de(FolderElem).sortOrder := folder.sortOrder; de(FolderElem).open := folder.open; de(FolderElem).nOfTabs := folder.nOfTabs; IF folder.nOfTabs > 0 THEN NEW(de(FolderElem).minTabWidths, folder.nOfTabs); FOR i := 0 TO folder.nOfTabs - 1 DO de(FolderElem).minTabWidths[i] := folder.minTabWidths[i] END END; de(FolderElem).attributes.nOfAttributes := folder.attributes.nOfAttributes; IF de(FolderElem).attributes.nOfAttributes > 0 THEN NEW(de(FolderElem).attributes.names, de(FolderElem).attributes.nOfAttributes); FOR i := 0 TO de(FolderElem).attributes.nOfAttributes - 1 DO de(FolderElem).attributes.names[i] := folder.attributes.names[i] END END END Copy; 8_8#Syntax10.Scn.Fnt00 BEGIN Texts.Write(w, Tab) END WriteAttribute; 8K8#Syntax10.Scn.Fnt VAR keys: SET; msg: NotifyMsg; BEGIN REPEAT Input.Mouse(keys, x, y); Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, x, y); keysum := keysum + keys UNTIL keys = {}; IF keysum = {MM} THEN msg.elem := folder; msg.id := switchFolder; Viewers.Broadcast(msg) END END Track; 8A8#Syntax10.Scn.Fnt BEGIN WITH e: FolderElem DO WITH msg: TextFrames.TrackMsg DO IF msg.keys = {MM} THEN e.Track(msg.keys, msg.X, msg.Y) END ELSE ElemHandle(e,msg) END ELSE END END FolderHandle; 88#Syntax10.Scn.Fnt\\ VAR i: INTEGER; BEGIN InitElem(e, name, 0, 0, 0); e.attributes.nOfAttributes := attributes.nOfAttributes; IF attributes.nOfAttributes > 0 THEN NEW(e.attributes.names, attributes.nOfAttributes); FOR i := 0 TO attributes.nOfAttributes - 1 DO e.attributes.names[i] := attributes.names[i] END; ELSE attributes.names := NIL END; COPY(pattern, e.pattern); e.icon := folderIcon; e.openIcon := folderOpenIcon; e.indent := LONG(e.iconW + leftMargin)*LONG(Unit); e.minTabWidths := NIL; e.nOfTabs := 0; e.open := open; COPY(sortOrder, e.sortOrder); e.handle := FolderHandle END InitFolderElem; 8u8 Syntax10.Scn.Fnta8FoldElemsNew#Syntax10.Scn.FntminY := 0; maxY := 0; FOR i := 0 TO 255 DO Display.GetChar(Fonts.Default.raster, CHR(i), dx, cx, cy, cw, ch, cPattern); IF minY > cy THEN minY := cy END; IF maxY < cy + ch THEN maxY := cy + ch END; charWidth[i] := SHORT(dx) END;  88#Syntax10.Scn.Fnt NEW(fileIcon); NEW(fileIcon.pat, 2); pat[0] := {}; pat[1] := {0..8}; pat[2] := {0,8}; pat[3] := {0,8}; pat[4] := {0,8}; pat[5] := {0,8}; pat[6] := {0,8}; pat[7] := {0,5..8}; pat[8] := {0,5,8}; pat[9] := {0,5,7}; pat[10] := {0..6}; fileIcon.pat[0].pat :=Display.NewPattern (pat, 14, 10); fileIcon.pat[0].col := black; pat[0] := {}; pat[1] := {}; pat[2] := {1..7}; pat[3] := {1..7}; pat[4] := {1..7}; pat[5] := {1..7}; pat[6] := {1..7}; pat[7] := {1..4}; pat[8] := {1..4,6,7}; pat[9] := {1..4,6}; pat[10] := {}; fileIcon.pat[1].pat :=Display.NewPattern (pat, 14, 10); fileIcon.pat[1].col := middlegray; NEW(fileIcon.selPat,2); fileIcon.selPat^[0] := fileIcon.pat^[0]; fileIcon.selPat[1].pat := fileIcon.pat[1].pat; fileIcon.selPat[1].col := darkgray;  88#Syntax10.Scn.Fnt NEW(folderIcon); NEW(folderIcon.pat, 2); pat[0] := {}; pat[1] := {0..12}; pat[2] := {0,12}; pat[3] := {0,12}; pat[4] := {0,12}; pat[5] := {0,12}; pat[6] := {0,12}; pat[7] := {0..12}; pat[8] := {0, 6}; pat[9] := {1, 5}; pat[10] := {2..4}; folderIcon.pat[0].pat := Display.NewPattern (pat, 14, 10); folderIcon.pat[0].col := black; pat[0] := {}; pat[1] := {}; pat[2] := {1..11}; pat[3] := {1..11}; pat[4] := {1..11}; pat[5] := {1..11}; pat[6] := {1..11}; pat[7] := {}; pat[8] := {1..5}; pat[9] := {2..4}; pat[10] := {}; folderIcon.pat[1].pat := Display.NewPattern (pat, 14, 10); folderIcon.pat[1].col := middlegray; NEW(folderOpenIcon); NEW(folderOpenIcon.pat,3); pat[0] := {}; pat[1] := {0..12}; pat[2] := {0, 13}; pat[3] := {0,1,13}; pat[4] := {0,2,14}; pat[5] := {0,3..14}; pat[6] := {0, 12}; pat[7] := {0, 7..12}; pat[8] := {0, 6}; pat[9] := {1, 5}; pat[10] := {2..4}; folderOpenIcon.pat[0].pat := Display.NewPattern (pat, 15, 10); folderOpenIcon.pat[0].col := black; pat[0] := {}; pat[1] := {}; pat[2] := {}; pat[3] := {}; pat[4] := {1}; pat[5] := {1, 2}; pat[6] := {1..11}; pat[7] := {1..6}; pat[8] := {1..5}; pat[9] := {2..4}; pat[10] := {}; folderOpenIcon.pat[1].pat := Display.NewPattern (pat, 15, 10); folderOpenIcon.pat[1].col := lightgray; pat[0] := {}; pat[1] := {}; pat[2] := {1..12}; pat[3] := {2..12}; pat[4] := {3..13}; pat[5] := {}; pat[6] := {}; pat[7] := {}; pat[8] := {}; pat[9] := {}; pat[10] := {}; folderOpenIcon.pat[2].pat := Display.NewPattern (pat, 15, 10); folderOpenIcon.pat[2].col := darkgray; NEW(folderIcon.selPat, 2); folderIcon.selPat^[0] := folderIcon.pat^[0]; folderIcon.selPat[1].pat := folderIcon.pat[1].pat; folderIcon.selPat[1].col := darkgray; NEW(folderOpenIcon.selPat,3); folderOpenIcon.selPat^[0] := folderOpenIcon.pat^[0]; folderOpenIcon.selPat[1].pat := folderOpenIcon.pat[1].pat; folderOpenIcon.selPat[1].col := darkgray; folderOpenIcon.selPat[2].pat := folderOpenIcon.pat[2].pat; folderOpenIcon.selPat[2].col := black 8 VAR i, dx, cx, cy, cw, ch: INTEGER; cPattern: Display.Pattern; pat: ARRAY 14 OF SET; BEGIN  char widths   file icons   folder icons  END Init; 8cMODULE FMElems; (* Christian Maryhofer, 24 Jan 96; Gnter Obiltschnig,  *) (* This module contains two versions. Versions: - PowerMac - Windows To switch versions click on  with the middle mouse button. *) Revision History IMPORT Display, Files, Fonts, In, Input, Oberon, Texts, TextFrames, Viewers, Unix; (* dummy import to force error on wrong system *) CONST Unit = TextFrames.Unit; W = 16; H = 10; leftMargin = 2; rightMargin = 3; (* in pixel *) hookW = 8; hookH = 8; lightgray = 12; middlegray = 13; darkgray = 14; black = 15; selectedCol = middlegray; MR = 0; MM = 1; ML = 2; Tab = 09X; CRSL = 0C4X; CRSR = 0C3X; DEL = 7FX; DELRIGHT = 0A1X; draw* = 0; switchFolder* = 1; showDate* = "date"; showSize* = "size"; TYPE AttributeName* = ARRAY 8 OF CHAR; AttributeNames*= POINTER TO ARRAY OF AttributeName; Attributes* = RECORD names*: AttributeNames; nOfAttributes*: INTEGER END; Name* = ARRAY 32 OF CHAR; PatternDesc* = RECORD pat*: Display.Pattern; col*: INTEGER END; Pattern* = POINTER TO ARRAY OF PatternDesc; Icon* = POINTER TO IconDesc; IconDesc* = RECORD pat*: Pattern; selPat*: Pattern END; Elem* = POINTER TO ElemDesc; ElemDesc* = RECORD (Texts.ElemDesc) name*: Name; size*: LONGINT; date*: LONGINT; time*: LONGINT; icon*: Icon; iconW*, iconH*: INTEGER; (* in pixel *) desc: INTEGER; (* line descender *) focused, selected*: BOOLEAN; END; FolderElem* = POINTER TO FolderElemDesc; FolderElemDesc* = RECORD (ElemDesc) attributes*: Attributes; openIcon*: Icon; pattern*: Name; minTabWidths*: POINTER TO ARRAY OF LONGINT; indent*: LONGINT; sortOrder*: AttributeName; nOfTabs*: INTEGER; open*: BOOLEAN END; EditFrame* = POINTER TO EditFrameDesc; EditFrameDesc* = RECORD (Display.FrameDesc) oldName*: Name; elem*: Elem; i, cardx: INTEGER; (* cardx is the caret indent *) hasCar: BOOLEAN END; NotifyMsg* = RECORD (Display.FrameMsg) elem*: Elem; id*: INTEGER; (* draw, switch open *) END; VAR charWidth: ARRAY 256 OF SHORTINT; fileIcon: Icon; folderIcon: Icon; folderOpenIcon: Icon; minY, maxY: INTEGER; (* part of the font metric (font.minY and font.maxX) *) PROCEDURE Max (x, y: INTEGER): INTEGER; PROCEDURE DrawFrame (x, y, w, h: INTEGER); PROCEDURE DisplayName (x, y, w, h: INTEGER; focused: BOOLEAN; VAR name: ARRAY OF CHAR); PROCEDURE GetNameWidth*(name: ARRAY OF CHAR): INTEGER; PROCEDURE GetWidth*(number: LONGINT): INTEGER; PROCEDURE (icon: Icon) Draw* (selected: BOOLEAN; x, y: INTEGER); PROCEDURE (ef: EditFrame) Draw (); PROCEDURE (ef: EditFrame) TrackCaret (VAR keysum: SET; VAR X,Y: INTEGER); PROCEDURE (ef: EditFrame) Edit (ch: CHAR); PROCEDURE FrameHandle (ef: Display.Frame; VAR msg: Display.FrameMsg); PROCEDURE (e: Elem) DrawIcon* (x, y: INTEGER); PROCEDURE (e: Elem) Draw* (x, y: INTEGER); PROCEDURE (e: Elem) Defocus* (name: ARRAY OF CHAR); PROCEDURE (e: Elem) Focus* (x, y: INTEGER): EditFrame; PROCEDURE (e: Elem) ResizeFrame* (f: EditFrame); PROCEDURE (e: Elem) ToggleSelection* (); PROCEDURE (e: Elem) Copy* (VAR de: Texts.Elem); PROCEDURE (e: Elem) WriteAttribute* (VAR w: Texts.Writer; VAR name: AttributeName); PROCEDURE (e: Elem) WriteAttributes* (VAR w: Texts.Writer; VAR attributes: Attributes); PROCEDURE (e: Elem) GetAttributeWidth* (VAR width: LONGINT; VAR name: AttributeName); PROCEDURE (e: Elem) GetAttributeWidths* (VAR widths: ARRAY OF LONGINT; VAR attributes: Attributes); PROCEDURE ElemHandle* (e: Texts.Elem; VAR msg: Texts.ElemMsg); PROCEDURE InitElem* (e: Elem; name: ARRAY OF CHAR; size, date, time: LONGINT); PROCEDURE (folder: FolderElem) DrawIcon* (x, y: INTEGER); PROCEDURE (folder: FolderElem) Copy* (VAR de: Texts.Elem); PROCEDURE (folder: FolderElem) WriteAttribute* (VAR w: Texts.Writer; VAR name: AttributeName); PROCEDURE (folder: FolderElem) Track (VAR keysum: SET; VAR x, y: INTEGER); PROCEDURE FolderHandle* (e: Texts.Elem; VAR msg: Texts.ElemMsg); PROCEDURE InitFolderElem* (e: FolderElem; name, pattern, sortOrder: ARRAY OF CHAR; VAR attributes: Attributes; open: BOOLEAN); PROCEDURE Init; BEGIN Init END FMElems.