<<-- EditToolTopImpl.mesa; Edited by Paxton on December 30, 1982 10:26 am>> <<-- Edited by McGregor on September 21, 1982 3:20 pm>> <> DIRECTORY -- a lot of extra junk in this list EditToolPrivate, EditToolBuilder, Atom, Buttons, Convert, UserExec, EditNotify, Inline, IO, UndoEvent, Labels, List, Menus, MessageWindow, NodeAddrs, Rope, RopeEdit, RopeReader, Rules, RunReader, Runtime, TextEdit, TextFind, TextLooks, TextLooksSupport, TextNode, TEditDocument, TEditInput, TEditInputOps, TEditOps, TreeFind, TypeScript, UserTerminal, ViewerOps, ViewerClasses, ViewerEvents, ViewerSpecs; EditToolTopImpl: CEDAR PROGRAM IMPORTS EditToolPrivate, EditToolBuilder, UserExec, Menus, MessageWindow, Runtime, TEditInput, TextNode, ViewerEvents, ViewerOps EXPORTS EditToolPrivate = { OPEN ViewerSpecs, EditToolBuilder, EditToolPrivate; Event: TYPE = UndoEvent.Ref; BuildContainer: PROC [info: Info, name: Rope.ROPE] = { OPEN info; viewer: ViewerClasses.Viewer; editToolMenu: Menus.Menu _ Menus.CreateMenu[]; Menus.AppendMenuEntry[editToolMenu, Menus.CreateEntry["Stop", Stop]]; Menus.AppendMenuEntry[editToolMenu, Menus.CreateEntry[name: "Search", proc: DoSearchMenuButton, fork: TRUE]]; Menus.AppendMenuEntry[editToolMenu, Menus.CreateEntry[name: "Substitute", proc: DoSubstituteMenuButton, fork: TRUE]]; Menus.AppendMenuEntry[editToolMenu, Menus.CreateEntry["Yes", DoYesMenuButton]]; Menus.AppendMenuEntry[editToolMenu, Menus.CreateEntry["No", DoNoMenuButton]]; Menus.AppendMenuEntry[editToolMenu, Menus.CreateEntry["Replace", DoItMenuButton]]; Menus.AppendMenuEntry[editToolMenu, Menus.CreateEntry[name: "Count", proc: DoCountMenuButton, fork: TRUE]]; layout.container _ viewer _ ViewerOps.CreateViewer[flavor: $Container, info: [name: name, iconic: TRUE, column: right, menu: editToolMenu], paint: TRUE]; editTool _ viewer; -- save in global variable }; editTool: PUBLIC ViewerClasses.Viewer; MyDestroy: ViewerEvents.EventProc = { IF viewer#editTool THEN RETURN; -- filter mainToolInfo _ NIL; editTool _ NIL; UnRegister[]; }; Stop: Menus.MenuProc = { mainToolInfo.interrupt^ _ TRUE; }; ---------------------------- ChangeState: PUBLIC PROC [flag: BOOLEAN, trueList, falseList: LIST OF REF] = { DoButton[IF ~flag THEN trueList ELSE falseList] }; ---------------------------- CycleTriple: PUBLIC PROC [state: [0..2], list0, list1, list2: LIST OF REF] = { nextState: ARRAY [0..2] OF [0..2] = [1,2,0]; nextLIST: ARRAY [0..2] OF LIST OF REF = [list0, list1, list2]; DoButton[nextLIST[nextState[state]]] }; ---------------------------- DoButton: PUBLIC PROC [ redList, blueList: LIST OF REF _ NIL, redButton: BOOL _ FALSE, viewer: ViewerClasses.Viewer _ NIL] = { IF viewer=NIL THEN viewer _ mainToolInfo.targetArg; -- must be a text viewer IF ~redButton AND blueList#NIL THEN TEditInput.Interpret[viewer,blueList] ELSE TEditInput.Interpret[viewer,redList] }; ---------------------------- registered: LIST OF RegCom; RegCom: TYPE = RECORD [atom: ATOM, op: TEditInput.CommandProc]; Register: PUBLIC PROC [atom: ATOM, op: TEditInput.CommandProc] RETURNS [LIST OF REF] = { TEditInput.Register[atom, op]; registered _ CONS[[atom, op], registered]; RETURN [LIST[atom]] }; ReRegister: PROC = { FOR r: LIST OF RegCom _ registered, r.rest UNTIL r=NIL DO TEditInput.Register[r.first.atom, r.first.op]; ENDLOOP }; UnRegister: PROC = { FOR r: LIST OF RegCom _ registered, r.rest UNTIL r=NIL DO TEditInput.UnRegister[r.first.atom, r.first.op]; ENDLOOP }; <<-- Initialization>> mainToolInfo: PUBLIC Info; firstTime: BOOLEAN _ TRUE; InitToolCommand: UserExec.CommandProc = { OPEN IO; name: Rope.ROPE _ "EditTool"; viewer: ViewerClasses.Viewer _ ViewerOps.FindViewer[name]; mainEditTool: BOOLEAN _ viewer = NIL; info: Info _ TextNode.pZone.NEW[InfoRec]; info.layout _ TextNode.pZone.NEW[LayoutRec]; IF ~mainEditTool THEN { -- one already exists IF viewer.iconic THEN ViewerOps.OpenIcon[viewer]; MessageWindow.Append["EditTool already exists",TRUE]; RETURN }; IF firstTime THEN firstTime _ FALSE ELSE ReRegister[]; { OPEN info; interrupt _ NEW[BOOLEAN _ FALSE]; layout.entryLeft _ layout.initLeft _ 0; layout.entryVSpace _ 3; layout.heightSoFar _ layout.initHeight _ 1; ---------------------------- BuildContainer[info,name]; -- build enclosing viewer ---------------------------- BuildTargetEntry[info]; -- the "target:" field BuildSourceEntry[info]; -- the "replacement:" field heights[0] _ layout.heightSoFar+layout.entryVSpace; layout.heightSoFar _ layout.heightSoFar+2; ---------------------------- BuildSearchButtons[info]; -- the various choices for seaching ToNext[layout]; BuildInitCapEntry[info]; -- Capitalize like first replaced char or not ToMiddle[layout]; BuildOperationEntry[info]; -- Do Replace / Do Operations Specified Below ToNext[layout]; BuildSubstituteEntry[info]; -- the within/after/entire choice ToNext[layout]; BuildMiniPatternDocEntry[info]; heights[1] _ layout.heightSoFar+layout.entryVSpace+1; HRule[layout]; ---------------------------- BuildLooksButtons[info]; -- caret/selection looks, Looks:, Get, Set, etc. ToNext[layout]; HRule[layout]; ---------------------------- BuildTypeButtons[info]; -- type names ToNext[layout]; HRule[layout]; ---------------------------- BuildStyleButtons[info]; -- style names ToNext[layout]; heights[2] _ layout.heightSoFar+layout.entryVSpace+1; HRule[layout]; ---------------------------- BuildPropertyButtons[info]; -- property values HRule[layout]; ---------------------------- BuildSortButtons[info]; -- Sort increasing/decreasing; sort text/lines/branches; Sort ToNext[layout]; HRule[layout]; ---------------------------- BuildOperationField[info]; -- the "Operations:" field VGap[layout]; BuildGetAndSetOpsEntries[info]; -- "GetLast" "SetCom" "GetCom" etc. VGap[layout]; BuildFileListEntries[info]; -- the "Files:" field and the DoForEachFile command VGap[layout]; heights[3] _ layout.heightSoFar+layout.entryVSpace+1; HRule[layout]; ---------------------------- BuildExtraButtons[info]; -- the low level edit commands HRule[layout]; ---------------------------- <<--BuildPatternDocEntry[info];-- -- explaining special chars for patterns>> ---------------------------- currentHeightIndex _ 0; ViewerOps.SetOpenHeight[layout.container, heights[currentHeightIndex]]; }; mainToolInfo _ info; }; TRUSTED {IF Runtime.IsBound[UserExec.RegisterCommand] THEN UserExec.RegisterCommand["EditTool", InitToolCommand, "Create a Tioga Edit Tool"]}; [] _ InitToolCommand[NIL, NIL]; [] _ ViewerEvents.RegisterEventProc[MyDestroy, destroy]; }. ..