-- ArrayToolImpl.mesa -- last edit July 11, 1984 9:06:28 am PDT Sturgis DIRECTORY Dependencies USING[CreateDependencySet, DependencySet], Displayer USING[BuildDisplayer, ButtonDefiningProc, PaintDisplayerContents, SetDisplayerContents], Expressions USING[HCellIdSet, IdTable, MakeHCellIdSet, MakeIdTable], GCell USING[CreateGCellArray, GetArraySelection, GetGCellArray, GetGCellArrayColumn, GetGCellArrayRow, GetGCellArrayShape, SetAGCellProc, SetGCellArray, SetGCellArrayColumn, SetGCellArrayRow], NewCalcGlobal USING[Displayer, Document, DocumentProcs, DocumentPublicBody], Rope USING[ROPE], StructureNodes USING[Action, StructureNode], ViewerClasses USING[Viewer]; ArrayToolImpl: MONITOR IMPORTS Displayer, Dependencies, Expressions, GCell EXPORTS GCell = -- NOTE NOTE NOTE NOTE NOTE NOTE -- NOTE: !!!!! WHEN CONVERTING TO OBJECT MONITOR, Set and Get Selection must also be entry procedures. !!!! NOTE NOTE -- ALSO, Array tool will have to set entry TRUE on calls to Get and Set GCellArray. BEGIN OPEN Dependencies, ViewerClasses; -- array tool code, temporary home -- when moving out to its own module, change calls to Get and Set GCellArray to have "entry" = TRUE. ArrayToolPrivateBody: TYPE = RECORD[ dSet: DependencySet, gcaSn: StructureNodes.StructureNode, displayer: NewCalcGlobal.Displayer, container: Viewer, structure: Viewer ]; ArrayToolDisplayerProcs: REF NewCalcGlobal.DocumentProcs ← NEW[NewCalcGlobal.DocumentProcs ← [ExecuteInArrayToolMonitor, ComputeArrayToolTotals, NIL, AdjustArrayTool]]; BuildArrayTool: PUBLIC PROCEDURE = BEGIN ENABLE UNWIND => NULL; dSet: DependencySet ← CreateDependencySet[]; ids: Expressions.IdTable ← Expressions.MakeIdTable[]; hCellIds: Expressions.HCellIdSet ← Expressions.MakeHCellIdSet[]; arrayToolPrivate: REF ArrayToolPrivateBody ← NEW[ArrayToolPrivateBody]; documentPublic: NewCalcGlobal.Document ← NEW[NewCalcGlobal.DocumentPublicBody←[dSet, ids, hCellIds, arrayToolPrivate, ArrayToolDisplayerProcs]]; [arrayToolPrivate.displayer, arrayToolPrivate.container, arrayToolPrivate.structure] ← Displayer.BuildDisplayer[documentPublic, arrayToolPrivate, "arrayTool", DefineArrayToolButtons]; [arrayToolPrivate.gcaSn] ← GCell.CreateGCellArray[documentPublic, arrayToolPrivate.displayer, arrayToolPrivate.structure]; Displayer.SetDisplayerContents[arrayToolPrivate.displayer, "arrayTool", arrayToolPrivate.gcaSn]; documentPublic.procs.adjust[documentPublic]; END; DefineArrayToolButtons: Displayer.ButtonDefiningProc = BEGIN arrayToolPrivate: REF ArrayToolPrivateBody ← NARROW[owner]; defineProcButton[name: "total", proc: ATComputeTotals]; defineProcButton[name: "adjust", proc: ATAdjust]; newLine[]; newLine[]; defineStructureOpButton[InsertColumn]; defineStructureOpButton[AppendColumn]; defineStructureOpButton[DeleteColumn]; newLine[]; defineStructureOpButton[InsertRow]; defineStructureOpButton[AppendRow]; defineStructureOpButton[DeleteRow]; newLine[]; newLine[]; defineProcButton[name: "GetArray", proc: GetArray]; defineProcButton[name: "SetArray", proc: SetArray]; newLine[]; defineProcButton[name: "GetRow", proc: GetArrayRow]; defineProcButton[name: "SetRow", proc: SetArrayRow]; newLine[]; defineProcButton[name: "GetColumn", proc: GetArrayColumn]; defineProcButton[name: "SetColumn", proc: SetArrayColumn]; newLine[]; END; GetArray: ENTRY PROCEDURE[arg: REF ANY] = BEGIN ENABLE UNWIND => NULL; document: NewCalcGlobal.Document ← NARROW[arg]; tool: REF ArrayToolPrivateBody ← NARROW[document.private]; sourceGCA: StructureNodes.StructureNode; Ship: PROCEDURE[nColumns, nRows: CARDINAL, GetOneCell: PROCEDURE[GCell.SetAGCellProc]] = BEGIN GCell.SetGCellArray[tool.gcaSn, nColumns, nRows, GetOneCell]; END; [ , sourceGCA, , ] ← GCell.GetArraySelection[]; IF sourceGCA = NIL THEN RETURN; IF sourceGCA = tool.gcaSn THEN RETURN; GCell.GetGCellArray[sourceGCA, Ship]; document.procs.adjust[document]; END; GetArrayRow: ENTRY PROCEDURE[arg: REF ANY] = BEGIN ENABLE UNWIND => NULL; document: NewCalcGlobal.Document ← NARROW[arg]; tool: REF ArrayToolPrivateBody ← NARROW[document.private]; sourceGCA: StructureNodes.StructureNode; J: CARDINAL; Ship: PROCEDURE[nColumns, nRows: CARDINAL, GetOneCell: PROCEDURE[GCell.SetAGCellProc]] = BEGIN IF nRows # 1 THEN ERROR; GCell.SetGCellArray[tool.gcaSn, nColumns, nRows, GetOneCell]; END; [ , sourceGCA, , J] ← GCell.GetArraySelection[]; IF sourceGCA = NIL THEN RETURN; IF sourceGCA = tool.gcaSn THEN RETURN; GCell.GetGCellArrayRow[sourceGCA, J, Ship, FALSE]; document.procs.adjust[document]; END; GetArrayColumn: ENTRY PROCEDURE[arg: REF ANY] = BEGIN ENABLE UNWIND => NULL; document: NewCalcGlobal.Document ← NARROW[arg]; tool: REF ArrayToolPrivateBody ← NARROW[document.private]; sourceGCA: StructureNodes.StructureNode; I: CARDINAL; Ship: PROCEDURE[nColumns, nRows: CARDINAL, GetOneCell: PROCEDURE[GCell.SetAGCellProc]] = BEGIN IF nColumns # 1 THEN ERROR; GCell.SetGCellArray[tool.gcaSn, nColumns, nRows, GetOneCell]; END; [ , sourceGCA, I, ] ← GCell.GetArraySelection[]; IF sourceGCA = NIL THEN RETURN; IF sourceGCA = tool.gcaSn THEN RETURN; GCell.GetGCellArrayColumn[sourceGCA, I, Ship, FALSE]; document.procs.adjust[document]; END; SetArray: ENTRY PROCEDURE[arg: REF ANY] = BEGIN ENABLE UNWIND => NULL; document: NewCalcGlobal.Document ← NARROW[arg]; tool: REF ArrayToolPrivateBody ← NARROW[document.private]; targetDisplayer: NewCalcGlobal.Displayer; targetGCA: StructureNodes.StructureNode; Ship: PROCEDURE[nColumns, nRows: CARDINAL, GetOneCell: PROCEDURE[GCell.SetAGCellProc]] = BEGIN GCell.SetGCellArray[targetGCA, nColumns, nRows, GetOneCell]; END; [targetDisplayer, targetGCA, , ] ← GCell.GetArraySelection[]; IF targetGCA = NIL THEN RETURN; IF targetGCA = tool.gcaSn THEN RETURN; GCell.GetGCellArray[tool.gcaSn, Ship]; document.procs.adjust[document]; END; SetArrayRow: ENTRY PROCEDURE[arg: REF ANY] = BEGIN ENABLE UNWIND => NULL; document: NewCalcGlobal.Document ← NARROW[arg]; tool: REF ArrayToolPrivateBody ← NARROW[document.private]; targetDisplayer: NewCalcGlobal.Displayer; targetGCA: StructureNodes.StructureNode; J: CARDINAL; toolRows, toolColumns: CARDINAL; Ship: PROCEDURE[nColumns, nRows: CARDINAL, GetOneCell: PROCEDURE[GCell.SetAGCellProc]] = BEGIN IF nRows # 1 THEN ERROR; GCell.SetGCellArrayRow[targetGCA, nColumns, J, GetOneCell, FALSE]; END; [targetDisplayer, targetGCA, , J] ← GCell.GetArraySelection[]; IF targetGCA = NIL THEN RETURN; IF targetGCA = tool.gcaSn THEN RETURN; [nRows: toolRows, nColumns: toolColumns] ← GCell.GetGCellArrayShape[tool.gcaSn]; IF toolRows # 1 THEN RETURN; IF toolColumns # GCell.GetGCellArrayShape[targetGCA].nColumns THEN RETURN; GCell.GetGCellArrayRow[tool.gcaSn, 1, Ship, FALSE]; document.procs.adjust[document]; END; SetArrayColumn: ENTRY PROCEDURE[arg: REF ANY] = BEGIN ENABLE UNWIND => NULL; document: NewCalcGlobal.Document ← NARROW[arg]; tool: REF ArrayToolPrivateBody ← NARROW[document.private]; targetDisplayer: NewCalcGlobal.Displayer; targetGCA: StructureNodes.StructureNode; I: CARDINAL; toolRows, toolColumns: CARDINAL; Ship: PROCEDURE[nColumns, nRows: CARDINAL, GetOneCell: PROCEDURE[GCell.SetAGCellProc]] = BEGIN IF nColumns # 1 THEN ERROR; GCell.SetGCellArrayColumn[targetGCA, I, nRows, GetOneCell, FALSE]; END; [targetDisplayer, targetGCA, I, ] ← GCell.GetArraySelection[]; IF targetGCA = NIL THEN RETURN; IF targetGCA = tool.gcaSn THEN RETURN; [nRows: toolRows, nColumns: toolColumns] ← GCell.GetGCellArrayShape[tool.gcaSn]; IF toolColumns # 1 THEN RETURN; IF toolRows # GCell.GetGCellArrayShape[targetGCA].nRows THEN RETURN; GCell.GetGCellArrayColumn[tool.gcaSn, 1, Ship, FALSE]; document.procs.adjust[document]; END; ATComputeTotals: ENTRY PROCEDURE[arg: REF ANY] = BEGIN ENABLE UNWIND => NULL; NULL; END; ATAdjust: ENTRY PROCEDURE[arg: REF ANY] = BEGIN ENABLE UNWIND => NULL; document: NewCalcGlobal.Document ← NARROW[arg]; tool: REF ArrayToolPrivateBody ← NARROW[document.private]; document.procs.adjust[document]; END; ExecuteInArrayToolMonitor: ENTRY PROCEDURE[document: NewCalcGlobal.Document, p: PROC] = {ENABLE UNWIND => NULL; p[]}; ComputeArrayToolTotals: PROCEDURE[document: NewCalcGlobal.Document] = {NULL}; AdjustArrayTool: PROCEDURE[document: NewCalcGlobal.Document] = BEGIN arrayToolPrivate: REF ArrayToolPrivateBody ← NARROW[document.private]; Displayer.PaintDisplayerContents[arrayToolPrivate.displayer]; END; END.. -- July 10, 1984 2:11:45 pm PDT: Sturgis, created ArrayToolImpl, from NewCalcImpl. -- RTE: July 11, 1984 9:06:18 am PDT: a tight loop, involving AdjustArrayTool and DisplayToolImpl.AfterStructureOp. Modified AdjustArrayTool to call Displayer.PaintDisplayerContents directly.