-- VTables.mesa, Viewer Tables class
-- Russ Atkinson, September 20, 1982 8:04 pm

DIRECTORY
Buttons USING [ButtonProc],
Rope USING [ROPE],
VFonts USING [Font],
ViewerClasses USING [Viewer];

VTables: CEDAR DEFINITIONS
= BEGIN OPEN Rope, ViewerClasses;

VTable: TYPE = Viewer;

Border: TYPE = RECORD [up,down,left,right: BOOL];
FullBorder: Border = [TRUE, TRUE, TRUE, TRUE];
NullBorder: Border = [FALSE, FALSE, FALSE, FALSE];

Create: PROC
[columns, rows: INTEGER ← 1,
name: ROPENIL,
parent: Viewer ← NIL,
xRuleWidth: INTEGER ← 1,
yRuleWidth: INTEGER ← 1,
x, y, w, h: INTEGER ← 0,
 scrollable: BOOLFALSE]
RETURNS [table: VTable];
-- create an empty table instance from the given parameters
-- if columns <= 0 or rows <= 0, NIL will be returned
-- if parent = NIL, a container will be created
-- (and will be used as the parent)
-- IF w = 0 and h = 0
-- THEN the table width and height will be adjusted dynamically

Install: PROC [table: VTable, paint: BOOLTRUE];
-- install changes to the table
-- this will adjust the positions and sizes of the entries
-- after operations beginning with "Set" or "Exchange"
-- repainting will be inhibited until Install is performed
-- (SetEntryBorder, SetRowsAndColumns, SetTableEntry, SetEntryOffset)

GetTableEntry: PROC
[table: VTable, row, column: NAT ← 0] RETURNS [Viewer];
-- get the current table entry at the given row and column

SetTableEntry: PROC
[table: VTable,
row, column: NAT ← 0,
name: ROPENIL,
flavor: ATOMNIL,
proc: Buttons.ButtonProc ← NIL,
clientData: REFNIL,
w, h: NAT ← 0,
xoff, yoff: INTEGER ← 0,
 border: Border ← FullBorder,
font: VFonts.Font ← NIL,
displayStyle: ATOMNIL,
useMaxSize: BOOLFALSE];
-- set a table entry (requires installation afterwards)
-- (invalid row and column specs cause bounds faults)
-- if flavor = $Viewer, then clientData is a pre-existing viewer
-- (which had better have table as a parent!)
-- otherwise, a new viewer of the appropriate flavor is created
-- (appropriate arguments are passed through to CreateChild)
-- if flavor = NIL, flavor = $Label will be assumed
-- if proc # NIL, flavor = $Button will be forced
-- xoff and yoff give offset within entry
-- useMaxSize governs setting of entry size to max
-- of row and column sizes

SwapTableEntries: PUBLIC PROC
[table: VTable, row1, column1, row2, column2: NAT ← 0,
swapBorders: BOOLFALSE];
-- swap the given table entries
-- reinstallation is required

GetEntryBorder: PROC
[table: VTable, row, column: NAT ← 0] RETURNS [Border];
-- get the current table border at the given row and column
-- if remove is TRUE, NIL is placed in the entry,
-- BUT the entry is not destroyed

SetEntryBorder: PROC
[table: VTable, row, column: NAT ← 0, border: Border ← FullBorder];
-- set the current table border at the given row and column
-- reinstallation is required

GetEntryOffset: PROC
[table: VTable, row, column: NAT ← 0] RETURNS [xoff,yoff: INTEGER];
-- get the current offsets of the given entry

SetEntryOffset: PROC
[table: VTable, row, column: NAT ← 0, xoff,yoff: INTEGER ← 0];
-- sets the current offsets of the given entry
-- reinstallation is required

GetRowsAndColumns: PROC [table: VTable] RETURNS [rows, columns: NAT];
-- get the number of rows and columns

SetRowsAndColumns: PROC [table: VTable, rows, columns: NAT ← 0];
-- sets the number of rows and columns
-- can be used to either grow or shrink the table
-- reinstallation is required

ExchangeRows: PROC [table: VTable, row1,row2: NAT ← 0];
-- exchange the two given rows
-- reinstallation is required

ExchangeColumns: PROC [table: VTable, column1,column2: NAT ← 0];
-- exchange the two given columns
-- reinstallation is required

END.