-- GCell.mesa
-- Last Edited by: Sturgis, July 10, 1984 5:40:59 pm PDT
DIRECTORY
Dependencies USING[Action],
Expressions USING[IdTableSet],
NewCalcGlobal USING[Displayer, Document],
Rope USING[ROPE],
IO USING[STREAM],
StructureNodes USING[StructureNode],
ViewerClasses USING[Viewer];
GCell: DEFINITIONS =
BEGIN OPEN Expressions, NewCalcGlobal, Rope, IO, StructureNodes, ViewerClasses;
-- note: in some of the following procedures there is a BOOLEAN parameter named "entry". This should be set true when called from outside the monitor protecting the object of the call, be it a GCell or a GCellArray. These outside calls will generally come from an instance of a GCellTool, or a GCellArrayTool. The called procedure will lock the appropriate monitor for the duration of the call.
StandardGCells: TYPE = {null, colTitle, colSum, rowTitle, rowSum, assignment, slot};
GCellItemDescriptor: TYPE = RECORD[
mode: GCellItemMode,
justification: GCellItemJustification,
rowSumMode: GCellItemRowColSumMode,
colSumMode: GCellItemRowColSumMode,
valueMode: GCellItemValueMode,
id: ROPE,
text: ROPE,
zeroValText: ROPE -- used in case: mode = ShowValue, value = 0 and not NIL.
];
SetAGCellProc: TYPE = PROCEDURE[nItems: CARDINAL, getOneItem: PROCEDURE RETURNS[GCellItemDescriptor]];
GCellItemMode: TYPE = {showText, showId, showExp, showValue, noShow};
GCellItemJustification: TYPE = {left, centered, right, leftDecimal, rightDecimal};
GCellItemRowColSumMode: TYPE = {addVal, subVal, setZero, noEffect};
GCellItemValueMode: TYPE = {rowSum, colSum, expression};
SelectionDirection: TYPE = {first, next, previous, last};
NarrowGCell: PROCEDURE[REF ANY] RETURNS[StructureNode];
LoadGCell: PROCEDURE[document: NewCalcGlobal.Document, displayer: Displayer, gcaSn: StructureNode, vParent: Viewer, from: STREAM, version: CARDINAL] RETURNS[StructureNode];
CreateGCell: PROCEDURE[document: NewCalcGlobal.Document, displayer: Displayer, gcaSn: StructureNode, vParent: Viewer, type: StandardGCells] RETURNS[StructureNode];
SetGCellIdInfo: PROCEDURE[gcn: StructureNode, idTables: IdTableSet];
NoteSummers: PROCEDURE[gcn: StructureNode, rowSummer, colSummer: Dependencies.Action];
DoRowSum: PROCEDURE[gcn: StructureNode, sumToLeft: REAL] RETURNS[REAL];
DoColSum: PROCEDURE[gcn: StructureNode, sumAbove: REAL] RETURNS[REAL];
SetGCellContents: PROCEDURE[gcn: StructureNode, nItems: CARDINAL, getOneItem: PROCEDURE RETURNS[GCellItemDescriptor], entry: BOOLEAN ← FALSE];
GetGCellContents: PROCEDURE[StructureNode, SetAGCellProc, --entry--BOOLEAN ← FALSE];
StepSelection: PROCEDURE[gcn: StructureNode, itemX: CARDINAL, direction: SelectionDirection] RETURNS[ok: BOOLEAN];
ForceNoteItemSelection: PROCEDURE[itemRef: REF ANY];
-- the following procedure is exported by GCellToolImpl
MakeAGCellToolInstance: PROCEDURE[document: NewCalcGlobal.Document];
-- the following procedure is exported by ArrayToolImpl
BuildArrayTool: PROCEDURE[];
-- the following are exported by GCellArrayImpl
SetAGCellArrayProc: TYPE = PROCEDURE[nColumns, nRows: CARDINAL, GetOneCell: PROCEDURE[SetAGCellProc]];
LoadGCellArray: PROCEDURE[document: NewCalcGlobal.Document, displayer: Displayer, vParent: Viewer, from: IO.STREAM, version: CARDINAL] RETURNS[StructureNode];
CreateGCellArray: PROCEDURE[document: NewCalcGlobal.Document, displayer: Displayer, vParent: Viewer] RETURNS[StructureNode];
SetGCellArray: PROCEDURE[gcaSn: StructureNode, nColumns, nRows: CARDINAL, GetOneCell: PROCEDURE[SetAGCellProc], entry: BOOLEAN ← FALSE];
GetGCellArray: PROCEDURE[StructureNode, SetAGCellArrayProc, --entry--BOOLEAN ← FALSE];
GetGCellArrayShape: PROCEDURE[StructureNode] RETURNS[nRows, nColumns: CARDINAL];
SetGCellArrayRow: PROCEDURE[gcaSn: StructureNode, nColumns: CARDINAL, J: CARDINAL, GetOneCell: PROCEDURE[SetAGCellProc], entry: BOOLEAN];
SetGCellArrayColumn: PROCEDURE[gcaSn: StructureNode, I: CARDINAL, nRows: CARDINAL, GetOneCell: PROCEDURE[SetAGCellProc], entry: BOOLEAN];
GetGCellArrayRow: PROCEDURE[gcaSn: StructureNode, J: CARDINAL, send: SetAGCellArrayProc, entry: BOOLEAN];
GetGCellArrayColumn: PROCEDURE[gcaSn: StructureNode, I: CARDINAL, send: SetAGCellArrayProc, entry: BOOLEAN];
GetIdTableSet: PROCEDURE[gcaSn: StructureNode, I, J: CARDINAL, callBack: PROCEDURE[IdTableSet]];
-- the following are exported by ColumnOfRows
SlotCase: TYPE = {slot, GCellArray, individualHCellArray, itemHCellArray, summaryHCellArray, pageId};
SetAColumnOfRowsProc: TYPE = PROCEDURE[nRows: CARDINAL, GetOneRow: PROCEDURE[SetARowOfSlotsProc]];
SetARowOfSlotsProc: TYPE = PROCEDURE[nSlots: CARDINAL, GetOneSlot: PROCEDURE[SetASlotProc]];
SetASlotProc: TYPE = PROCEDURE[case: SlotCase, GetOneArray: PROCEDURE[SetAGCellArrayProc]];
LoadColumnOfRows: PROCEDURE[document: NewCalcGlobal.Document, displayer: Displayer, vParent: Viewer, name: Rope.ROPE, from: IO.STREAM, version: CARDINAL] RETURNS[StructureNode];
CreateColumnOfRows: PROCEDURE[document: NewCalcGlobal.Document, displayer: Displayer, vParent: Viewer, pageName: Rope.ROPE] RETURNS[StructureNode];
ResetPageNameOfColumnOfRows: PROCEDURE[info: StructureNode, pageName: Rope.ROPE];
SetColumnOfRows: PROCEDURE[sn: StructureNode, nRows: CARDINAL, getOneRow: PROCEDURE[SetARowOfSlotsProc], entry: BOOLEAN ← FALSE];
GetColumnOfRows: PROCEDURE[StructureNode, SetAColumnOfRowsProc, --entry--BOOLEAN ← FALSE];
SetColumnOfRowsName: PROCEDURE[StructureNode, Rope.ROPE];
-- following exported by ColumnOfRows for array groups
CountOpenSlotsInColumnOfRows: PROCEDURE[StructureNode] RETURNS[CARDINAL];
InstallHCellArrayAtOpenSlotInColumnOfRows: PROCEDURE[sn: StructureNode, rowNumber, colNumber: CARDINAL, case: SlotCase, createIt: PROCEDURE[displayer: NewCalcGlobal.Displayer, vParent: ViewerClasses.Viewer, pageName: Rope.ROPE] RETURNS[StructureNode]];
InstallHCellArrayAtAnOpenSlotInColumnOfRows: PROCEDURE[sn: StructureNode, case: SlotCase, createIt: PROCEDURE[displayer: NewCalcGlobal.Displayer, vParent: ViewerClasses.Viewer, pageName: Rope.ROPE, rowNumber, colNumber: CARDINAL] RETURNS[StructureNode]];
GetHCellArrayAtSlotInColumnOfRows: PROCEDURE[sn: StructureNode, rowNumber, colNumber: CARDINAL] RETURNS[StructureNode];
ConnectInstalledItemArraysInColumnOfRows: PROCEDURE[sn: StructureNode, connectOneItemArray: PROCEDURE[itemHcaSn: StructureNodes.StructureNode, row, col: CARDINAL]];
GenerateSummaryArraysInColumnOfRows: PROCEDURE[sn: StructureNode, seeOneArray: PROCEDURE[summaryHcaSn: StructureNodes.StructureNode, summaryKey: LONG CARDINAL] RETURNS[continue: BOOLEAN]];
ConnectLoadedItemArraysInColumnOfRows: PROCEDURE[sn: StructureNode, connectOneItemArray: PROCEDURE[itemHcaSn: StructureNodes.StructureNode, itemKey: LONG CARDINAL, atRow: CARDINAL]];
-- the following procedures are exported by NewCalcImpl
GetItemSelection: PROCEDURE RETURNS[displayer: Displayer, sn: StructureNode, itemX: CARDINAL];
NoteItemSelection: PROCEDURE[displayer: Displayer, sn: StructureNode, itemX: CARDINAL];
GetArraySelection: PROCEDURE RETURNS[displayer: Displayer, gcaSn: StructureNode, I, J: CARDINAL];
NoteArraySelection: PROCEDURE[displayer: Displayer, gcaSn: StructureNode, I, J: CARDINAL];
END..
-- September 22, 1982 6:27 pm: Sturgis, started GCell.mesa, from definitions temporarily in GCellMatrixImpl
-- October 4, 1982 2:27 pm: add zero value text to GCellItemDescriptor
-- October 6, 1982 5:08 pm: add MakeAGCellToolInstance, NoteSelection, and GetSelection.
-- October 8, 1982 12:18 pm: add slot type to standard GCells.
-- October 11, 1982 2:28 pm: move in the GCellArray procedures, define SetAGCellProc, and SetAGCellArrayProc.
-- October 14, 1982 3:17 pm: cleanup the note and get selection routines, include displayer and GCellArray in the parameters.
-- October 16, 1982 3:13 pm: added entry parameter to some calls to indicate that a monitor should be locked.
-- October 22, 1982 1:30 pm: add modes to control interaction with row and column summers, add calls for row and collumn summers.
-- October 26, 1982 3:29 pm: add selection features.
-- November 2, 1982 5:08 pm: add SubstituteInGCell.
-- November 3, 1982 3:10 pm: Remove SubstituteInGCell, now a logical node operation. Also add the types for Set and Get a column of rows, and related types and procedures.
-- November 14, 1982 1:39 pm: change selection logic, add specific array and item select procedures. Add SetZero to row and column sum modes.
-- November 14, 1982 3:20 pm: add Get/Set GCellArray Row/Column
-- November 14, 1982 3:40 pm: add GetGCellArrayShape.
-- February 25, 1983 2:58 pm: replace DisplayNode and LogicalNode by StructureNode.
-- March 3, 1983 2:47 pm: add a procedure for GCellArrays to obtain the IdtableSet appropriate to a particular cell.
-- March 4, 1983 12:57 pm: owing to problems in GCellToolImpl, have to remove the new idTables param to SetGCellContents. GCellImplA will have to call GetIdTableSet.
-- March 4, 1983 1:07 pm: owing to unsafe large return record, modify GetIdTableSet to use a call back procedure to deliver its intended result.