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: ROPE ← NIL,
parent: Viewer ← NIL,
xRuleWidth: INTEGER ← 1,
yRuleWidth: INTEGER ← 1,
x, y, w, h: INTEGER ← 0,
scrollable: BOOL ← FALSE]
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:
BOOL ←
TRUE];
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: ROPE ← NIL,
flavor: ATOM ← NIL,
proc: Buttons.ButtonProc ← NIL,
clientData: REF ← NIL,
w, h: NAT ← 0,
xoff, yoff: INTEGER ← 0,
border: Border ← FullBorder,
font: VFonts.Font ← NIL,
displayStyle: ATOM ← NIL,
useMaxSize: BOOL ← FALSE];
... sets a table entry (requires installation afterwards). Invalid row and column specs cause bounds faults.
flavor = NIL, flavor = $Label will be assumed
flavor = $Viewer => clientData is a pre-existing viewer (which had better have table as a parent!).
flavor # $Viewer => a new viewer of the appropriate flavor is created (appropriate arguments are passed through to CreateChild).
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:
BOOL ←
FALSE];
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.