DIRECTORY Buttons USING [ButtonProc], Char USING [XCHAR, Set, Narrow], EditSpanSupport USING [Apply], EditToolBuilder USING [BuildButton, BuildDataFieldPair, BuildPair, DataFieldButton, GetDataNode, ToNext, ToMiddle, VGap], EditToolPrivate USING [ChangeState, CheckPSel, DoButton, Info, mainToolInfo, Register], Labels USING [Set], MessageWindow USING [Append, Blink], Rope USING [ROPE], TEditDocument USING [Selection], TEditInput USING [CommandProc], TEditInputOps USING [ChangeCaretLooks, ChangeLooks], TEditLocks USING [Lock], TEditOps USING [GetSelData, SetTextContents], TEditSelection USING [LockSel, pSel, SelectionRoot, UnlockDocAndPSel, UnlockSel], TextEdit USING [FetchChar, FetchLooks, Size], TextLooks USING [LooksToRope], Tioga USING [Node, Span, Look, Looks, allLooks, noLooks]; EditToolLooksImpl: CEDAR PROGRAM IMPORTS Char, EditToolPrivate, EditToolBuilder, TEditLocks, TEditOps, EditSpanSupport, Labels, MessageWindow, TextEdit, TextLooks, TEditInputOps, TEditSelection EXPORTS EditToolPrivate = { OPEN EditToolPrivate, EditToolBuilder; ---------------------------- BuildRealLooksButtons: PUBLIC PROC [info: EditToolPrivate.Info] = { OPEN info; [,looksArg] ¬ BuildDataFieldPair[layout, "Looks characters:", LooksArgButton, info, 1]; VGap[layout]; caretLooks ¬ FALSE; [] ¬ BuildButton[layout, "GetLooks", GetLooks, info]; [] ¬ BuildButton[layout, "DoSetLooks", SetLooks, info]; [] ¬ BuildButton[layout, "DoClearLooks", ClearLooks, info]; [] ¬ BuildButton[layout, "DoAddLooks", AddLooks, info]; [] ¬ BuildButton[layout, "DoRemoveLooks", RemoveLooks, info]; ToNext[layout]; ToMiddle[layout]; caretLooksRope ¬ "CaretLooks"; selLooksRope ¬ "SelectionLooks"; [caretLooksLabel,] ¬ BuildPair[layout,CaretLooksButton,caretLooks,caretLooksRope,selLooksRope,info]; }; BuildLooksButtons: PUBLIC PROC [info: EditToolPrivate.Info] = { OPEN info; [,looksArg] ¬ BuildDataFieldPair[layout, "Looks characters:", LooksArgButton, info, 1]; VGap[layout]; caretLooks ¬ FALSE; [] ¬ BuildButton[layout, "Get", GetLooks, info]; [] ¬ BuildButton[layout, "Set", SetLooks, info]; [] ¬ BuildButton[layout, "Clear", ClearLooks, info]; [] ¬ BuildButton[layout, "Add", AddLooks, info]; [] ¬ BuildButton[layout, "Sub", RemoveLooks, info]; ToMiddle[layout]; caretLooksRope ¬ "Caret looks"; selLooksRope ¬ "Selection looks"; [caretLooksLabel,] ¬ BuildPair[layout,CaretLooksButton,caretLooks,caretLooksRope,selLooksRope,info]; }; ---------------------------- looksArgAtom: LIST OF REF = Register[$LooksChars,LooksArgOp]; clearLooksArgAtom: LIST OF REF = Register[$ClearLooksChars,ClearLooksArgOp]; LooksArgButton: Buttons.ButtonProc = { DoButton[looksArgAtom,clearLooksArgAtom, mouseButton=red] }; LooksArgOp: TEditInput.CommandProc = { LooksArg[mainToolInfo] }; LooksArg: PROC [info: Info] = { DataFieldButton[info.looksArg,FALSE] }; ClearLooksArgOp: TEditInput.CommandProc = { ClearLooksArg[mainToolInfo] }; ClearLooksArg: PROC [info: Info] = { DataFieldButton[info.looksArg,TRUE] }; ---------------------------- getLooksAtom: LIST OF REF = Register[$GetLooks,GetLooksOp]; GetLooks: Buttons.ButtonProc = { DoButton[getLooksAtom] }; GetLooksOp: TEditInput.CommandProc = { GetLooksCom[mainToolInfo] }; GetLooksCom: PROC [info: Info] = { OPEN info; pSel: TEditDocument.Selection; root: Tioga.Node; looks: Tioga.Looks; TEditSelection.LockSel[primary, "GetLooksCom"]; pSel ¬ TEditOps.GetSelData[]; IF ~CheckPSel[pSel] THEN { OPEN MessageWindow; Append["Make selection.", TRUE]; Blink[]; TEditSelection.UnlockSel[primary]; RETURN }; root ¬ TEditSelection.SelectionRoot[pSel]; [] ¬ TEditLocks.Lock[root, "GetLooksCom", read]; IF caretLooks THEN looks ¬ pSel.looks -- get the looks for the caret ELSE { -- get the looks for the selection first: BOOLEAN ¬ TRUE; span: Tioga.Span; GetSelLooks: PROC [node: Tioga.Node, start, len: INT] RETURNS [stop: BOOLEAN] = { end: INT ¬ MIN[TextEdit.Size[node],start+len]; FOR i: INT IN [start..end) DO lks: Tioga.Looks ¬ TextEdit.FetchLooks[node,i]; IF first THEN { first ¬ FALSE; looks ¬ lks } ELSE IF lks#looks THEN { OPEN MessageWindow; Append["Selection does not have uniform looks.",TRUE]; Append[" Using looks from first char."]; Blink[]; RETURN [TRUE] }; ENDLOOP; RETURN [FALSE] }; span.start ¬ [pSel.start.pos.node, pSel.start.pos.where]; span.end ¬ [pSel.end.pos.node, pSel.end.pos.where]; EditSpanSupport.Apply[span,GetSelLooks]; IF first THEN looks ¬ pSel.looks -- null selection, use caret }; TEditSelection.UnlockDocAndPSel[root]; TEditOps.SetTextContents[looksArg, TextLooks.LooksToRope[looks]]; }; ---------------------------- GetLooksArg: PROC [info: Info] RETURNS [looks: Tioga.Looks ¬ Tioga.noLooks] = { node: Tioga.Node ~ GetDataNode[info.looksArg]; FOR i: INT IN[0..TextEdit.Size[node]) DO xchar: Char.XCHAR ~ TextEdit.FetchChar[node, i]; IF Char.Set[xchar]=0 THEN { char: CHAR ~ Char.Narrow[xchar]; IF char IN Tioga.Look THEN looks[char] ¬ TRUE; }; ENDLOOP; }; ChangeLooks: PROC [info: Info, add, rem: Tioga.Looks] = { pSel: TEditDocument.Selection; TEditSelection.LockSel[primary, "EditTool.ChangeLooks"]; pSel ¬ TEditOps.GetSelData[]; IF ~CheckPSel[pSel] THEN { OPEN MessageWindow; Append["Make selection.", TRUE]; Blink[]; TEditSelection.UnlockSel[primary]; RETURN }; IF info.caretLooks THEN -- change the looks for the caret TEditInputOps.ChangeCaretLooks[add, rem] ELSE TEditInputOps.ChangeLooks[add, rem]; -- change the looks for the selection TEditSelection.UnlockSel[primary]; }; ---------------------------- setLooksAtom: LIST OF REF = Register[$DoSetLooks,SetLooksOp]; SetLooks: Buttons.ButtonProc = { DoButton[setLooksAtom] }; SetLooksOp: TEditInput.CommandProc = { SetLooksCom[mainToolInfo] }; SetLooksCom: PROC [info: Info] = { ChangeLooks[info,GetLooksArg[info],Tioga.allLooks] }; ---------------------------- addLooksAtom: LIST OF REF = Register[$DoAddLooks,AddLooksOp]; AddLooks: Buttons.ButtonProc = { DoButton[addLooksAtom] }; AddLooksOp: TEditInput.CommandProc = { AddLooksCom[mainToolInfo] }; AddLooksCom: PROC [info: Info] = { ChangeLooks[info,GetLooksArg[info],Tioga.noLooks] }; ---------------------------- removeLooksAtom: LIST OF REF = Register[$DoRemoveLooks,RemoveLooksOp]; RemoveLooks: Buttons.ButtonProc = { DoButton[removeLooksAtom] }; RemoveLooksOp: TEditInput.CommandProc = { RemoveLooksCom[mainToolInfo] }; RemoveLooksCom: PROC [info: Info] = { ChangeLooks[info,Tioga.noLooks,GetLooksArg[info]] }; ---------------------------- clearLooksAtom: LIST OF REF = Register[$DoClearLooks,ClearLooksOp]; ClearLooks: Buttons.ButtonProc = { DoButton[clearLooksAtom] }; ClearLooksOp: TEditInput.CommandProc = { ClearLooksCom[mainToolInfo] }; ClearLooksCom: PROC [info: Info] = { ChangeLooks[info,Tioga.noLooks,Tioga.allLooks] }; ---------------------------- caretLooksRope: Rope.ROPE; selLooksRope: Rope.ROPE; caretLooksAtom: LIST OF REF = Register[$CaretLooks,CaretLooksOp]; selLooksAtom: LIST OF REF = Register[$SelectionLooks,SelectionLooksOp]; CaretLooksButton: Buttons.ButtonProc = { ChangeState[mainToolInfo.caretLooks,caretLooksAtom,selLooksAtom] }; CaretLooksOp: TEditInput.CommandProc = { CaretLooks[mainToolInfo] }; CaretLooks: PROC [info: Info] = { OPEN info; caretLooks ¬ TRUE; Labels.Set[caretLooksLabel,caretLooksRope] }; SelectionLooksOp: TEditInput.CommandProc = { SelectionLooks[mainToolInfo] }; SelectionLooks: PROC [info: Info] = { OPEN info; caretLooks ¬ FALSE; Labels.Set[caretLooksLabel,selLooksRope] }; ---------------------------- }. ..  EditToolLooksImpl.mesa Copyright Σ 1985, 1986, 1991, 1992 by Xerox Corporation. All rights reserved. Doug Wyatt, March 14, 1992 4:56 pm PST Russ Atkinson (RRA) June 18, 1985 4:55:55 pm PDT Alison Lee June 11, 1986 10:13:03 pm PDT Swinehart, November 14, 1986 10:00:45 am PST ΚΙ•NewlineDelimiter –(cedarcode) style™codešΟc™Kšœ ΟeœC™NK™&K™0K™(K™,—K˜šΟk ˜ KšœŸœ˜KšœŸœŸœ˜ KšœŸœ ˜KšœŸœd˜yKšœŸœB˜WKšœŸœ˜KšœŸœ˜$KšœŸœŸœ˜KšœŸœ ˜ Kšœ Ÿœ˜KšœŸœ!˜4Kšœ Ÿœ˜Kšœ Ÿœ˜-KšœŸœ=˜QKšœ Ÿœ˜-Kšœ Ÿœ˜KšœŸœ.˜9—headšœŸœŸ˜ KšŸœ™˜ KšŸœ˜KšœŸœ"˜*—K˜Kš˜K˜šΟnœŸœŸœ"Ÿœ˜NK˜WK˜ Kšœ Ÿœ˜Kšœ5˜5Kšœ7˜7Kšœ;˜;Kšœ7˜7Kšœ=˜=K˜K˜Kšœ˜Kšœ ˜ ˜KšœO˜O—K˜K˜—š œŸœŸœ"Ÿœ˜JK˜WK˜ Kšœ Ÿœ˜Kšœ0˜0K˜0K˜4K˜0K˜3K˜Kšœ˜Kšœ!˜!˜K˜O—K˜K˜—Kš˜KšœŸœŸœŸœ$˜=KšœŸœŸœŸœ.˜LK˜˜&K˜