DIRECTORY CD, CDApplications, CDCommandOps, --CDDefaults, CDIO, CDOps, CDPanel, CDSequencer, CDSil, CDTexts, CDValue, Convert, FileNames, Rope, TerminalIO, UserProfile; CDSilTextCommands: CEDAR PROGRAM IMPORTS CDApplications, CDCommandOps, --CDDefaults,-- CDIO, CDOps, CDPanel, CDSequencer, CDSil, CDTexts, CDValue, Convert, FileNames, Rope, TerminalIO, UserProfile = BEGIN FontRec: TYPE = CDTexts.FontRec; CreateTextComm: PROC [comm: CDSequencer.Command] = BEGIN fn: NAT _ MIN[INT[fontNum]-1, CDValue.FetchInt[boundTo: comm.design, key: $CDSilFontNumber, propagation: technology] ]; font: REF CDTexts.FontRec _ fontArray[fn]; r: Rope.ROPE _ TerminalIO.RequestRope["Create text\n", "please type: "]; ob: CD.ObPtr; lev: CD.Layer _ CDSil.xneutral; IF Rope.IsEmpty[r] THEN { TerminalIO.WriteRope["empty text not included\n"]; RETURN }; ob _ CDTexts.CreateText[text: r, font: font, layer: lev]; CDOps.AddAnObject[design: comm.design, ob: ob, location: comm.pos, orientation: 0]; END; ChangeTextComm: PROC [comm: CDSequencer.Command] = BEGIN ap: CD.ApplicationPtr _ CDCommandOps.TheApplication[comm, "change text"]; IF ap#NIL THEN { WITH ap.ob.specificRef SELECT FROM t: CDTexts.TextPtr => { ob: CD.ObPtr; r: Rope.ROPE; TerminalIO.WriteRope["replace text """]; TerminalIO.WriteRope[t.text]; TerminalIO.WriteRope[""" >"]; r _ TerminalIO.RequestRope[]; IF Rope.IsEmpty[r] THEN TerminalIO.WriteRope["empty text not used\n"] ELSE { ob _ CDTexts.CreateText[text: r, font: t.font, layer: ap.ob.layer]; CDOps.DelayedRedraw[comm.design, CDApplications.ARectO[ap]]; IF ob#NIL THEN ap.ob _ ob; CDOps.DelayedRedraw[comm.design, CDApplications.ARectO[ap], FALSE]; } } ENDCASE => TerminalIO.WriteRope["selected ob is not text; not done\n"]; }; END; ChangeFontComm: PROC [comm: CDSequencer.Command] = BEGIN ap: CD.ApplicationPtr _ CDCommandOps.TheApplication[comm, "change font"]; IF ap#NIL THEN { WITH ap.ob.specificRef SELECT FROM t: CDTexts.TextPtr => { fn: NAT _ MIN[INT[fontNum]-1, CDValue.FetchInt[comm.design, $CDSilFontNumber]]; font: REF CDTexts.FontRec _ fontArray[fn]; ob: CD.ObPtr _ CDTexts.CreateText[text: t.text, font: font, layer: ap.ob.layer]; CDOps.DelayedRedraw[comm.design, CDApplications.ARectO[ap]]; IF ob#NIL THEN ap.ob _ ob; CDOps.DelayedRedraw[comm.design, CDApplications.ARectO[ap], FALSE]; } ENDCASE => TerminalIO.WriteRope["selected ob is not text; not done\n"]; }; END; ScaleApp: PROC [design: CD.Design, aptr: CD.ApplicationPtr, factor: REAL] = BEGIN IF aptr#NIL AND aptr.ob#NIL THEN WITH aptr.ob.specificRef SELECT FROM tp: CDTexts.TextPtr => { font: REF CDTexts.FontRec ~ tp.font; scaledFont: REF CDTexts.FontRec ~ CDTexts.MakeFont[ name: font.name, scale: font.scale*factor, scaleByReplacingFontAllowed: font.scaleByReplacingFontAllowed, layerSubstitute: font.layerSubstitute ]; IF scaledFont#NIL THEN { txt: CD.ObPtr ~ CDTexts.CreateText[tp.text, scaledFont, aptr.ob.layer]; IF txt#NIL THEN { IF design#NIL THEN CDCommandOps.RedrawApplication[design, aptr]; aptr.ob _ txt; IF design#NIL THEN CDCommandOps.RedrawApplication[design, aptr]; }; }; }; ENDCASE => ERROR END; fontNum: NAT = 8; FontRange: TYPE = [0..fontNum); fontArray: ARRAY FontRange OF REF CDTexts.FontRec_ALL[NIL]; techName: Rope.ROPE = "ChipNSil"; Fontname: PROC [fn: FontRange] RETURNS [fontname: Rope.ROPE] = BEGIN num: Rope.ROPE = Convert.RopeFromInt[from: fn, showRadix: FALSE]; fontname _ UserProfile.Token[key: Rope.Cat["ChipNDale.", techName, ".Font", num]]; IF Rope.IsEmpty[fontname] THEN fontname _ DefaultFontName[fn]; END; MakeFont: PROC [fn: FontRange] RETURNS [REF CDTexts.FontRec] = BEGIN font: REF CDTexts.FontRec _ NIL; fontname : Rope.ROPE _ Fontname[fn]; scale: REAL _ (1.0*UserProfile.Number[key: Rope.Cat["ChipNDale.", techName, ".ScaleFont", Convert.RopeFromInt[fn]], default: 32 ])/16; IF fontArray[fn]#NIL AND Rope.Equal[fontArray[fn].name, fontname] AND scale=fontArray[fn].scale THEN RETURN [fontArray[fn]]; IF NOT Rope.IsEmpty[fontname] THEN { fontname _ CDIO.MakeName [base: fontname, ext: "Strike", wDir: "/Indigo/AltoFonts/"]; font _ CDTexts.MakeFont[scale: scale, name: fontname] }; IF font=NIL THEN { font _ CDTexts.GetFont[key: $CDxCompatibilityFont]; }; RETURN [font] END; DefaultFontName: PROC [fn: FontRange] RETURNS [Rope.ROPE] = BEGIN RETURN [SELECT fn FROM 0 => "Helvetica10.strike", 1 => "Helvetica7.strike", 2 => "Gates32.strike", 3 => "Template64.strike", 4 => "Helvetica14.strike", 5 => "Helvetica18.strike", 6 => "TimesRoman10.strike", 7 => "Hippo10.strike", ENDCASE => NIL] END; NoteProfileChange: UserProfile.ProfileChangedProc = BEGIN FOR fn: FontRange IN [0..fontNum) DO fontArray[fn] _ MakeFont[fn]; ENDLOOP; END; ChangeDefaultFont: PROC [comm: CDSequencer.Command] = BEGIN n: INT; list: LIST OF Rope.ROPE_NIL; TerminalIO.WriteRope["change font\n"]; FOR i: INT IN FontRange DO name: Rope.ROPE _ fontArray[i].name; IF Rope.IsEmpty[name] THEN name _ " ?? " ; list _ CONS[name, list] ENDLOOP; n _ TerminalIO.RequestSelection[label: "change font", choice: list]; IF n>0 THEN { num: INT _ fontNum-n; name: Rope.ROPE _ FileNames.GetShortName[fontArray[num].name]; IF ~Rope.IsEmpty[name] THEN { CDValue.StoreInt[comm.design, $CDSilFontNumber, num]; CDValue.Store[comm.design, $CDSilFontName, name]; CDPanel.RedisplayLabels[comm.design]; TerminalIO.WriteRope[Rope.Cat[" ", name, " for text inputs\n"]]; } } END; ImplCommands: PROC [] = BEGIN CDSequencer.ImplementCommand[$DrawText, CreateTextComm, CDSil.cdsil]; CDSequencer.ImplementCommand[$ChangeText, ChangeTextComm, CDSil.cdsil]; CDSequencer.ImplementCommand[$ChangeFont, ChangeFontComm, CDSil.cdsil]; CDValue.EnregisterKey[$CDSilFontNumber, CDSil.cdsil]; CDValue.EnregisterKey[$CDSilFontName, CDSil.cdsil]; CDPanel.DefineButton[tech: CDSil.cdsil, name: "font", proc: ChangeDefaultFont]; CDPanel.DefineLabel[tech: CDSil.cdsil, name: " ", cdValueKey: $CDSilFontName ]; CDPanel.DefineNewLine[CDSil.cdsil]; UserProfile.CallWhenProfileChanges[NoteProfileChange]; CDValue.StoreInt[CDSil.cdsil, $CDSilFontNumber, 0]; CDValue.Store[CDSil.cdsil, $CDSilFontName, FileNames.GetShortName[fontArray[0].name]]; END; ImplCommands[]; END. ŠCDSilTextCommands.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, April 11, 1985 11:29:25 am PST Last Edited by: Beretta, January 18, 1985 1:15:04 pm PST lev: CD.Layer _ CDDefaults.CurrentLayer[comm.design]; NOT YET GOOD; WAIT FOR IMAGER -- PROC [reason: ProfileChangeReason] Edited on January 18, 1985 1:13:03 pm PST, by Beretta Eliminated alternate font stuff. changes to: MakeFont: if a font cannot be made, $CDxCompatibilityFont is choosen, CDIO.MakeName is called to put wDir: "/Indigo/AltoFonts/" and ext: "Strike". Ê­˜šœ+™+Jšœ Ïmœ7™BJšœ+™+Jšœ<™˜OJšœžœ!˜*JšœžœJ˜PJšœ<˜˜>Jšœ%˜%J˜—šžœ žœžœ˜Jšœžœ@˜Gšžœžœžœ˜Jšžœžœžœ.˜@Jšœ˜Jšžœžœžœ.˜@J˜—J˜—J˜—Jšžœž˜——Jšžœ˜J˜—Jšœ žœ˜Jšœ žœ˜Jš œ žœ žœžœžœžœ˜;J˜Jšœ!˜!J˜š œžœžœžœ˜>Jšž˜Jšœ žœ,žœ˜AJšœR˜RJšžœžœ ˜>Jšžœ˜—J˜š œžœžœžœ˜>Jšž˜Jšœžœžœ˜ Jšœžœ˜$šœžœ ˜+JšœI˜IJšœ ˜ Jšœ˜—Jš žœžœžœ*žœžœžœ˜|šžœžœžœ˜$Jšœ žœF˜UJšœ5˜5J˜—šžœžœžœ˜Jšœ3˜3J˜—Jšžœ˜ Jšžœ˜—J˜š œžœžœžœ˜;Jšž˜šžœžœž˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšžœžœ˜—Jšžœ˜—J˜šŸœ"˜3Jšœžœ™%Jšž˜šžœžœž˜$Jšœ˜Jšžœ˜—Jšžœ˜—J˜š œžœ˜5Jšž˜Jšœžœ˜Jš œžœžœžœžœ˜Jšœ&˜&šžœžœžœ ž˜Jšœ žœ˜$Jšžœžœ˜,Jšœžœ ˜Jšžœ˜—JšœD˜Dšžœžœ˜ Jšœžœ ˜Jšœ žœ/˜>šžœžœ˜Jšœ5˜5Jšœ1˜1Jšœ%˜%JšœA˜AJ˜—J˜—Jšžœ˜—J˜š  œžœ˜Jšž˜J˜EJ˜GJ˜GJšœ5˜5Jšœ3˜3JšœO˜Ošœ'˜'Jšœ(˜(Jšœ˜Jšœ˜—J˜#Jšœ6˜6Jšœ3˜3JšœV˜VJšžœ˜J˜—J˜Jšžœ˜šœ5™5J™ Jšœ Ïrœ<¡œL™ž—J™J™—…—"I