<<-- EditHistoryImpl.mesa; Edited by Paxton on June 14, 1982 10:42 am>> <<-- Edited by McGregor on September 21, 1982 3:28 pm>> <> DIRECTORY Buttons, Containers, UserExec, EditToolBuilder, IO, MessageWindow, Rope, Runtime, TEditHistory, TEditInput, TEditOps, TypeScript, ViewerClasses, ViewerOps; EditHistoryImpl: CEDAR PROGRAM IMPORTS Containers, UserExec, IO, EditToolBuilder, MessageWindow, Runtime, TEditHistory, TEditInput, TEditOps, ViewerOps = { OPEN EditToolBuilder; Info: TYPE = REF InfoRec; InfoRec: TYPE = RECORD [ layout: Layout, eventNumArg: ViewerClasses.Viewer, sliceSizeArg: ViewerClasses.Viewer, textField: ViewerClasses.Viewer ]; info: Info; -- for the current edit history tool BuildIt: UserExec.CommandProc = { <<-- build an edit history tool>> layout: Layout; name: Rope.ROPE = "EditHistory Tool"; viewer: ViewerClasses.Viewer _ ViewerOps.FindViewer[name]; IF viewer # NIL THEN { -- already have an edit history tool around IF viewer.iconic THEN ViewerOps.OpenIcon[viewer]; MessageWindow.Append["EditHistory Tool already exists",TRUE]; RETURN }; info _ NEW[InfoRec]; info.layout _ layout _ NEW[LayoutRec]; { OPEN layout; entryLeft _ initLeft _ 5; heightSoFar _ initHeight _ entryVSpace; container _ Containers.Create[[name: name, iconic: TRUE, column: right, scrollable: FALSE]]; [] _ BuildButton[layout, "Show", DoShow]; [] _ BuildButton[layout, "Undo", DoUndo]; [,info.eventNumArg] _ BuildDataFieldPair[layout, "since event number:", EventNumberButton, NIL, 1]; layout.heightSoFar _ layout.heightSoFar + layout.entryVSpace/2; [] _ BuildButton[layout, "Get", DoGetSize]; [] _ BuildButton[layout, "Set", DoSetSize]; [,info.sliceSizeArg] _ BuildDataFieldPair[layout, "history size:", SliceSizeButton, NIL, 1]; HRule[layout]; info.textField _ ViewerOps.CreateViewer[flavor: $Text, info: [parent: layout.container, wx: entryLeft, wy: heightSoFar, wh: 700, ww: 200, border: FALSE, scrollable: TRUE], paint: FALSE]; <<-- make the textField grow as the container grows>> Containers.ChildYBound[container, info.textField]; Containers.ChildXBound[container, info.textField]; }}; EventNumberButton: Buttons.ButtonProc = { DataFieldButton[info.eventNumArg, mouseButton#red] }; SliceSizeButton: Buttons.ButtonProc = { DataFieldButton[info.sliceSizeArg, mouseButton#red] }; DoShow: Buttons.ButtonProc = { OPEN IO; num, stop: INT; h: Handle _ CreateOutputStreamToRope[]; TEditInput.CloseEvent[]; num _ TEditHistory.CurrentEventNumber[]; stop _ EditToolBuilder.GetInt[info.eventNumArg ! BadNumber => { stop _ 0; CONTINUE }]; WHILE TEditHistory.Known[num _ num-1] AND num >= stop DO list: LIST OF REF ANY _ TEditHistory.GetRepeatList[num]; Put[h,int[num]]; Put[h,char[TAB]]; Put[h,char[TAB]]; Put[h,rope[ConvertList[list]]]; Put[h,char[CR]]; Put[h,char[CR]]; ENDLOOP; TEditOps.SetTextContents[info.textField, GetOutputStreamRope[h]] }; DoUndo: Buttons.ButtonProc = { num: INT _ GetInt[info.eventNumArg ! BadNumber => GOTO Bad]; TEditHistory.Undo[num]; EXITS Bad => { OPEN MessageWindow; Append["Fill in the \"since event number\" field",TRUE]; Blink[] } }; DoGetSize: Buttons.ButtonProc = { SetInt[info.sliceSizeArg, TEditHistory.SliceSize[]] }; DoSetSize: Buttons.ButtonProc = { num: INT _ GetInt[info.sliceSizeArg ! BadNumber => GOTO Bad]; TEditHistory.NewSliceSize[num]; EXITS Bad => { OPEN MessageWindow; Append["Enter a number in the \"history size\" field",TRUE]; Blink[] } }; TRUSTED {IF Runtime.IsBound[UserExec.RegisterCommand] THEN UserExec.RegisterCommand["EditHistory", BuildIt, "Create an Edit History tool."]}; }.....