DIRECTORY Ascii, CD, CDInstances, CDCommandOps, CDLayers, CDExtras, CDOps, CDPanel, CDPanelFonts, CDSequencer, CDTexts, CDValue, Convert, FileNames, IO, Rope, TerminalIO, UserProfile; CDPanelFontsImpl: CEDAR MONITOR IMPORTS Ascii, CDInstances, CDCommandOps, CDExtras, IO, CDLayers, CDOps, CDPanel, CDSequencer, CDTexts, CDValue, Convert, FileNames, Rope, TerminalIO, UserProfile EXPORTS CDPanelFonts = BEGIN fontNum: NAT = 20; FontRange: TYPE = [0..fontNum); FontArray: TYPE = ARRAY FontRange OF CDTexts.CDFont _ ALL[NIL]; LProc: TYPE = PROC [CD.Layer] RETURNS [CD.Layer]; tList: LIST OF CD.Technology _ NIL; myKey: REF _ NEW[INT]; myKey2: REF _ NEW[INT]; NoteTechnology: ENTRY PROC [tech: CD.Technology] RETURNS [first: BOOL] = BEGIN ENABLE UNWIND => NULL; FOR l: LIST OF CD.Technology _ tList, l.rest WHILE l#NIL DO IF l.first=tech THEN RETURN [FALSE]; ENDLOOP; tList _ CONS[tech, tList]; RETURN [TRUE] END; ImplementIt: PUBLIC PROC [tech: CD.Technology, installCommands: BOOL, defaultFonts: LIST OF Rope.ROPE, defaultSize: INT, layerProc: PROC [CD.Layer] RETURNS [CD.Layer]] = TRUSTED BEGIN CDValue.Store[tech, $defaultFontList, defaultFonts]; CDValue.Store[tech, myKey2, NEW[LProc_layerProc]]; IF installCommands THEN { CDSequencer.ImplementCommand[$DrawText, CreateTextComm, tech]; CDSequencer.ImplementCommand[$ChangeText, ChangeTextComm, tech]; CDSequencer.ImplementCommand[$ChangeFont, ChangeFontComm, tech]; }; IF NoteTechnology[tech].first THEN { CDPanel.DefineButton[tech: tech, name: "font", proc: ChangeDefaultFont]; CDPanel.DefineLabel[tech: tech, name: " ", cdValueKey: $panelFontRope ]; CDPanel.DefineNewLine[tech]; }; Setup[tech]; END; CurrentFont: PUBLIC PROC [d: CD.Design] RETURNS [CDTexts.CDFont] = BEGIN WITH CDValue.Fetch[d, $currentFont, technology] SELECT FROM f: CDTexts.CDFont => RETURN [f]; ENDCASE => RETURN [NIL]; END; FArray: PROC [t: CD.Technology] RETURNS [REF FontArray] = BEGIN ENABLE UNWIND => NULL; WITH CDValue.Fetch[t, myKey] SELECT FROM fa: REF FontArray => RETURN [fa]; ENDCASE => { [] _ CDValue.StoreConditional[t, myKey, NEW[FontArray_ALL[NIL]]]; RETURN [FArray[t]]; } END; SetCurrentFont: PUBLIC PROC [design: REF, font: CDTexts.CDFont, name: Rope.ROPE_NIL] = TRUSTED BEGIN IF font=NIL THEN RETURN; IF name=NIL THEN name _ font.supposedName; CDValue.Store[design, $panelFontRope, name]; CDValue.Store[design, $currentFont, LOOPHOLE[font]]; WITH design SELECT FROM d: CD.Design => CDPanel.RedisplayLabels[d]; ENDCASE => NULL; END; NoteProfileChange: UserProfile.ProfileChangedProc = BEGIN FOR tl: LIST OF CD.Technology _ tList, tl.rest WHILE tl#NIL DO Setup[tl.first]; ENDLOOP; END; SupposedFontName: PROC [t: CD.Technology, fn: INT] RETURNS [fontName: Rope.ROPE, scale: INT] = BEGIN DefaultFontName: PROC [fn: INT] RETURNS [name: Rope.ROPE_NIL, scale: INT_-1] = BEGIN rnl: LIST OF Rope.ROPE; WITH CDValue.Fetch[t, $defaultFontList, global] SELECT FROM rl: LIST OF Rope.ROPE => rnl _ rl; ENDCASE => rnl _ fontNameList; FOR l: LIST OF Rope.ROPE _ rnl, l.rest WHILE l#NIL DO IF fn<=0 THEN {name _ l.first; EXIT}; fn _ fn-1; ENDLOOP; IF name#NIL THEN { [name, scale] _ Scan[name]; name _ Rope.Concat["Xerox/TiogaFonts/", name]; } END; SkipSpaces: PROC [r: Rope.ROPE] RETURNS [Rope.ROPE] = { n: INT _ 0; l: INT _ Rope.Length[r]; WHILE n GOTO exit; name _ SkipSpaces[r]; IF ~Rope.IsEmpty[name] THEN { s: IO.STREAM _ IO.RIS[name]; IF Ascii.Digit[Rope.Fetch[name]] THEN scale _ IO.GetInt[s]; name _ SkipSpaces[IO.GetLineRope[s]]; }; EXITS exit => NULL }; num: Rope.ROPE = Convert.RopeFromInt[fn]; [fontName, scale] _ Scan[UserProfile.Line[key: Rope.Cat["ChipNDale.", t.name, ".Font", num]]]; IF ~Rope.IsEmpty[fontName] AND scale<1 THEN scale _ UserProfile.Number[key: Rope.Cat["ChipNDale.", t.name, ".ScaleFont", num], default: t.lambda]; IF Rope.IsEmpty[fontName] THEN [fontName, scale] _ DefaultFontName[fn]; IF scale<1 THEN scale _ t.lambda; END; Setup: PROC [t: CD.Technology] = BEGIN FontForIndex: PROC [t: CD.Technology, fn: FontRange, fontArray: REF FontArray] = BEGIN fontName: Rope.ROPE; scale: INT; [fontName, scale] _ SupposedFontName[t, fn]; IF fontArray[fn]#NIL AND Rope.Equal[fontName, fontArray[fn].supposedName, FALSE] AND scale=fontArray[fn].scaleI THEN RETURN; IF Rope.IsEmpty[fontName] THEN fontArray[fn] _ NIL ELSE fontArray[fn] _ CDTexts.MakeFont[name: fontName, scale: scale]; END; lastFont: CDTexts.CDFont_NIL; far: REF FontArray _ FArray[t]; IF far#NIL THEN FOR fn: FontRange IN [0..fontNum) DO FontForIndex[t, fn, far]; IF far[fn]#NIL THEN lastFont _ far[fn] ENDLOOP; IF lastFont#NIL THEN SetCurrentFont[t, lastFont, UseName[lastFont, t.lambda]]; END; UseName: PROC [f: CDTexts.CDFont, lambda: INT, full: BOOL_FALSE] RETURNS [name: Rope.ROPE_NIL] = BEGIN IF f#NIL THEN { name _ f.supposedName; IF ~full THEN name _ FileNames.GetShortName[name]; IF f.scaleI#lambda THEN name _ name.Concat[CDExtras.ToLambda[f.scaleI, lambda]] }; IF Rope.IsEmpty[name] THEN name _ " ?? "; END; ChangeDefaultFont: PROC [comm: CDSequencer.Command] = BEGIN n: INT _ 0; lambda: CD.Number _ comm.design.technology.lambda; selected: CDTexts.CDFont_NIL; fa: REF FontArray _ FArray[comm.design.technology]; list: LIST OF Rope.ROPE _ NIL; TerminalIO.WriteRope["change font\n"]; FOR i: INT IN FontRange DO IF fa[i]#NIL THEN list _ CONS[UseName[fa[i], lambda, FALSE], list] ENDLOOP; IF list#NIL THEN n _ TerminalIO.RequestSelection[label: "change font", choice: list]; IF n>0 THEN FOR i: INT DECREASING IN FontRange DO IF fa[i]#NIL THEN { n_n-1; IF n<=0 THEN {selected_fa[i]; EXIT}; }; ENDLOOP; IF selected=NIL THEN TerminalIO.WriteRope["discarded\n"] ELSE { SetCurrentFont[comm.design, selected, UseName[selected, lambda, FALSE]]; TerminalIO.WriteRopes[" ", UseName[selected, lambda, TRUE], " for text inputs\n"]; }; END; CreateTextComm: PROC [comm: CDSequencer.Command] = BEGIN ob: CD.Object; lay: CD.Layer; r: Rope.ROPE; font: CDTexts.CDFont _ CurrentFont[comm.design]; layerProc: REF LProc _ NARROW[CDValue.Fetch[comm.design.technology, myKey2]]; CDPanel.RedisplayLabels[comm.design]; IF font=NIL THEN { TerminalIO.WriteRope["** no font\n"]; RETURN }; r _ TerminalIO.RequestRope["create text >"]; lay _ CDLayers.CurrentLayer[comm.design]; IF layerProc#NIL AND layerProc^#NIL THEN lay _ layerProc[lay]; IF Rope.IsEmpty[r] THEN { TerminalIO.WriteRope["empty text not included\n"]; RETURN }; ob _ CDTexts.CreateText[text: r, font: font, layer: lay]; IF ob=NIL THEN { TerminalIO.WriteRope["not done\n"]; RETURN }; CDOps.AddAnObject[design: comm.design, ob: ob, location: comm.pos, orientation: 0]; END; ChangeTextComm: PROC [comm: CDSequencer.Command] = BEGIN inst: CD.Instance ; CDPanel.RedisplayLabels[comm.design]; inst _ CDCommandOps.TheInstance[comm, "change text"]; IF inst#NIL THEN { WITH inst.ob.specificRef SELECT FROM t: CDTexts.TextPtr => { ob: CD.Object; r: Rope.ROPE; TerminalIO.WriteRopes["replace text """, t.text, """ >"]; r _ TerminalIO.RequestRope[]; IF Rope.IsEmpty[r] THEN TerminalIO.WriteRope["empty text not used\n"] ELSE { ob _ CDTexts.CreateText[text: r, font: t.cdFont, layer: inst.ob.layer]; CDOps.DelayedRedraw[comm.design, CDInstances.InstRectO[inst]]; IF ob#NIL THEN inst.ob _ ob; CDOps.DelayedRedraw[comm.design, CDInstances.InstRectO[inst], FALSE]; } } ENDCASE => TerminalIO.WriteRope["selected ob is not text; not done\n"]; }; END; ChangeFontComm: PROC [comm: CDSequencer.Command] = BEGIN font: CDTexts.CDFont _ CurrentFont[comm.design]; CDPanel.RedisplayLabels[comm.design]; IF font=NIL THEN { TerminalIO.WriteRope["** no font\n"]; RETURN }; FOR il: CD.InstanceList _ CDOps.InstList[comm.design], il.rest WHILE il#NIL DO IF il.first.selected AND CDTexts.IsText[il.first.ob] THEN { ob: CD.Object _ CDTexts.CreateText[ text: NARROW[il.first.ob.specificRef, CDTexts.TextPtr].text, font: font, layer: il.first.ob.layer]; CDOps.DelayedRedraw[comm.design, CDInstances.InstRectO[il.first]]; IF ob#NIL THEN il.first.ob _ ob; CDOps.DelayedRedraw[comm.design, CDInstances.InstRectO[il.first], FALSE] } ENDLOOP END; fontNameList: LIST OF Rope.ROPE = LIST["Template64", "Gates32", "Helvetica18", "Helvetica14", "Helvetica12", "Helvetica10I", "Helvetica10", "Helvetica8I", "Helvetica8", "Helvetica7"]; CDValue.EnregisterKey[$defaultFontList, NIL, $chj]; CDValue.EnregisterKey[$currentFont, NIL, $chj]; CDValue.EnregisterKey[$panelFontRope, NIL, $chj]; CDValue.Store[NIL, $defaultFontList, fontNameList]; UserProfile.CallWhenProfileChanges[NoteProfileChange]; END. τCDPanelFontsImpl.mesa (part of ChipNDale) Copyright c 1983, 1985 by Xerox Corporation. All rights reserved. by Christian Jacobi, June 24, 1983 5:03 pm last edited Christian Jacobi, December 9, 1985 6:22:35 pm PST gbb September 13, 1985 3:27:14 pm PDT --gets a font name and a scale from user profile or default --for limitted time --(re)reads font names for one technology (from user profile) Edited on January 18, 1985 1:13:03 pm PST, by Beretta Eliminated alternate font stuff. changes to: FontForIndex: if a font cannot be made, $CDxCompatibilityFont is choosen, CDIO.MakeName is called to put wDir: "/Indigo/AltoFonts/" and ext: "Strike". Edited on May 31, 1985 1:35:21 pm PDT, by Jacobi redone completely for Cedar 6.0 gbb September 13, 1985 3:26:19 pm PDT changes to: ChangeFontComm: Change is applied to all selected instances. Edited on October 24, 1985 7:04:36 pm PDT, by Jacobi Made technology independent Edited on December 9, 1985 6:08:39 pm PST, by Jacobi Scaling into same rope as font Κ ϊ˜codešœ*™*Kšœ Οmœ7™BKšœ+™+Kšœ=™=K™%—K˜šΟk ˜ Kšœž˜Kšžœ˜Kšœ ˜ Kšœ ˜ K˜ Kšœ ˜ Kšœ˜K˜Kšœ ˜ Kšœ ˜ K˜K˜K˜Kšœ ˜ Kšœ˜Kšœ˜K˜ Kšœ ˜ K˜—šΠblœžœžœ˜ Kšžœ›˜’Kšžœ˜—Kšž˜K˜Kšœ žœ˜Kšœ žœ˜Kš œ žœžœ žœžœžœ˜?Kš œžœžœžœžœžœ˜1K˜Kš œžœžœžœžœ˜#Kšœžœžœžœ˜Kšœžœžœžœ˜K˜š Οnœžœžœžœ žœ žœ˜HKšžœžœžœžœ˜š žœžœžœžœžœžœž˜;Kšžœžœžœžœ˜$Kšžœ˜—Kšœžœ˜Kšžœžœ˜ Kšžœ˜—K˜š  œžœžœžœžœžœžœžœžœ žœžœžœžœ ˜©Kšžœž˜ Kšœ4˜4Kšœžœ˜2šžœžœ˜Jšœ>˜>Jšœ@˜@Jšœ@˜@K˜—šžœžœ˜$KšœH˜Hšœ ˜ Kšœ(˜(Kšœ˜Kšœ˜—Kšœ˜K˜—Kšœ ˜ Kšžœ˜—K˜š  œž œžœ žœ˜BKšž˜šžœ,žœž˜;Kšœžœ˜ Kšžœžœžœ˜—Kšžœ˜—K˜š  œžœžœ žœžœ ˜9Kšžœžœžœžœ˜šžœžœž˜(Kšœžœžœ˜!šžœ˜ Kšœ(žœ žœžœ˜AKšžœ ˜K˜——Kšžœ˜—K˜š  œžœžœ žœ#žœžœ˜VKšžœž˜ Kšžœžœžœžœ˜Kšžœžœžœ˜*Kšœ,˜,Kšœ$žœ˜4šžœžœž˜Kšœžœ&˜+Kšžœžœ˜—Kšžœ˜—K˜šΟbœ ‘˜3Kšž˜š žœžœžœžœžœžœž˜>K˜Kšžœ˜—Kšžœ˜—K˜š œžœžœžœžœžœ žœ˜^Kšœ;™;Kšž˜K˜š œžœžœžœ žœžœ žœ˜NKšž˜Kšœžœžœžœ˜šžœ,žœž˜;Kšœžœžœžœ ˜"Kšžœ˜—š žœžœžœžœžœžœž˜5Kšžœžœžœ˜%Kšœ ˜ Kšžœ˜—šžœžœžœ˜Kšœ˜Kšœ.˜.Kšœ˜—Kšžœ˜—K˜š   œžœ žœžœžœ˜7Kšœžœ˜ Kšœžœ˜Kšžœžœžœ žœ˜5Kšžœžœžœ žœ˜7Kšžœ˜K˜—K˜š  œžœ žœžœ žœ žœ˜FKšžœžœžœ˜#Kšœ˜šžœžœ˜Kš œžœžœžœžœ˜Kšžœžœ žœ ˜;Kšœžœ˜%Kšœ˜—Kšžœ ž˜K˜—K˜Kšœ žœ˜)šœ^˜^Kšœ™šžœžœ ž˜+Kšœf˜f——Kšžœžœ)˜GKšžœ žœ˜!Kšžœ˜—K˜š œžœžœ˜ Kšœ=™=Kšž˜K˜š  œžœžœ'žœ ˜PKšž˜Kšœžœ žœ˜ Kšœ,˜,Kšžœžœžœ2žœžœžœžœ˜~Kšžœžœž˜2Kšžœ@˜DKšžœ˜—K˜Kšœžœ˜Kšœžœ˜šžœžœž˜šžœžœž˜$Kšœ˜Kšžœ žœžœ˜&Kšžœ˜——šžœ žœžœ˜Kšœ9˜9—Kšžœ˜—K˜š œžœžœžœžœžœ žœžœ˜`Kšž˜šžœžœžœ˜Kšœ˜Kšžœžœ&˜3Kšžœžœ8˜OK˜—Kšžœžœ˜)Kšžœ˜—K˜š œžœ˜5Kšž˜Kšœžœ˜ Kšœžœ(˜2Kšœžœ˜Kšœžœ,˜3Kš œžœžœžœžœ˜Kšœ&˜&šžœžœžœ ž˜Kš žœžœžœžœžœ˜BKšžœ˜—KšžœžœžœE˜Ušžœžœ˜ š žœžœž œžœ ž˜%šžœžœžœ˜Kšœžœžœžœ˜+K˜—Kšžœ˜——Kšžœ žœžœ$˜8šžœ˜Kšœ@žœ˜HKšœ4žœ˜SK˜—Kšžœ˜—K˜š œžœ˜2Jšžœ˜Jšœžœ˜Jšœžœ˜Jšœžœ˜ Jšœ0˜0Jšœ žœ žœ0˜MJšœ%˜%šžœžœžœ˜J˜%Jšž˜J˜—Jšœ,˜,Jšœ*˜*Jš žœ žœžœ žœžœ˜>šžœžœ˜J˜2Jšž˜J˜—Jšœ9˜9šžœžœžœ˜J˜#Jšž˜J˜—J˜SJšžœ˜—J˜š œžœ˜2Jšžœ˜Jšœžœ ˜Jšœ%˜%Jšœ5˜5šžœžœžœ˜šžœžœž˜$šœ˜Jšœžœ˜Jšœžœ˜ Jšœ9˜9Jšœ˜Jšžœžœ.˜Ešžœ˜JšœG˜GJšœ>˜>Jšžœžœžœ˜Jšœ>žœ˜EJ˜—J˜—Jšžœ@˜G—Jšœ˜—Jšžœ˜J˜—š œžœ˜2Jšžœ˜Kšœ0˜0Kšœ%˜%šžœžœžœ˜K˜%Kšž˜K˜—š žœžœ5žœžœž˜Nšžœžœžœ˜;Kšœžœ$žœW˜‡KšœB˜BKšžœžœžœ˜ KšœBžœ˜HKšœ˜—Kšžœ˜—Kšžœ˜—J˜K˜Kš œžœžœžœžœ‘˜·Kšœ(žœ˜3Kšœ$žœ˜/Kšœ&žœ˜1Kšœžœ"˜3Kšœ6˜6Kšžœ˜K™šœ5™5K™ Kšœ Οr œ<’œL™’—šœ0™0K™—™%Kšœ ’œ.™H—šœ4™4K™—šœ4™4K™—K™—…—"3