#!/bin/sh # MetaCard 2.4 stack # The following is not ASCII text, # so now would be a good time to q out of more exec mc $0 "$@" +q Table Fields 3 on preOpenStack set the style of this stack to modeless set the loc of this stack to item 3 of the screenRect / 2,(the height of this stack div 2) + 100 end preOpenStack Using Table Fields U Lucida Grande W Lucida Grande U Lucida Grande U Lucida Grande U Lucida Grande U Lucida Grande U Lucida Grande U Lucida Grande U Lucida Grande W Lucida Grande W Lucida Grande W Lucida Grande U Lucida Grande W Lucida Grande W Lucida Grande U Lucida Grande W Lucida Grande W Lucida Grande U Lucida Grande W Lucida Grande U Arial U Arial W Lucida Grande W Lucida Grande U Lucida Grande U Lucida Grande cREVGeometryCache stackID 11121 cREVGeneral scriptChecksum wM$IɄ[E0 bookmarks debugObjects handlerList preOpenStackscriptSelection char 174 to 173prevHandler preOpenStacktempScript script E
on preOpenStack
set the style of this stack to modeless
set the loc of this stack to item 3 of the screenRect / 2,(the height of this stack div 2) + 100
end preOpenStack
p1################################################################ ## Table handlers and functions: ## ClearTable ## EnableCellEditing ## WriteCellValue ## ReadCellValue ## SelectCell ## SetTableRowsHeight ## SetTableColumsWidth ################################################################ on ClearTable pFieldName -- public handler -- clear a table -- pFieldName parameter is the short name of the table field select empty -- if a cell is being edited, hide it put empty into fld pFieldName set the cRevTable["currentCellValue"] of fld pFieldName to empty -- updates prop in the cRevTable of the table field set the cRevTable["currentView"] of fld pFieldName to empty -- updates prop in the cRevTable of the table field set the cRevTable["formattedView"] of fld pFieldName to empty -- updates prop in the cRevTable of the table field end ClearTable ---------------------------------------------------------------- on EnableCellEditing pFieldName,pFlag -- public handler -- enable or disable cell editing -- pFieldName parameter is the short name of the table field -- pFlag parameter is a boolean (true or false) select empty -- if a cell is being edited, hide it set the cREVTable["celledit"] of fld pFieldName to pFlag -- updates prop in the cRevTable of the table field end EnableCellEditing ---------------------------------------------------------------- on WriteCellValue pFieldName,pColumn,pRow,pValue -- public handler -- write data to a cell -- pFieldName parameter is the short name of the table field -- pColumn parameter is the column number (an integer) -- pRow parameter is the row number (an integer) -- pValue parameter is the text string to write select empty -- if a cell is being edited, hide it set the itemDel to tab put pValue into item pColumn of line pRow of fld pFieldName set the cRevTable["currentView"] of fld pFieldName to the htmlText of fld pFieldName -- updates prop in the cRevTable of the table field set the cRevTable["formattedView"] of fld pFieldName to the htmlText of fld pFieldName -- updates prop in the cRevTable of the table field end WriteCellValue ---------------------------------------------------------------- function ReadCellValue pFieldName,pColumn,pRow -- public handler -- read data from a cell -- pFieldName parameter is the short name of the table field -- pColumn parameter is the column number (an integer) -- pRow parameter is the row number (an integer) set the itemDel to tab return item pColumn of line pRow of fld pFieldName end ReadCellValue ---------------------------------------------------------------- on SelectCell pFieldName,pColumn,pRow -- public handler -- select a cell -- pFieldName parameter is the short name of the table field -- pColumn parameter is the column number (an integer) -- pRow parameter is the row number (an integer) SetCurXCell pFieldName,pColumn -- SetCurYCell pFieldName,pRow -- -- see SetCurXCell and SetCurYCell private handlers below: update prop ----- SetScroll "hScroll",the cRevTable["cellxspacing"] of fld pFieldName * (pColumn - 1),pFieldName,"Header" -- SetScroll "vScroll",the cRevTable["cellyspacing"] of fld pFieldName * (pRow - 1),pFieldName,"Rows" -- -- see SetScroll private handler below: used to update header fields scrolls ----- click at CellLoc(pFieldName,pColumn,pRow) -- ----- -- to select again the current cell, you can use: -- click at the cRevTable["currentxmouseloc"] of fld pFieldName,the cRevTable["currentymouseloc"] of fld pFieldName end SelectCell ---------------------------------------------------------------- on SetTableRowsHeight pFieldName,pHeight -- public handler -- sets the table rows height -- pFieldName parameter is the short name of the table field -- pHeight parameter is an integer set the textHeight of fld pFieldName to pHeight -- in fact this line is not compulsory set the textSize of fld pFieldName to round(pHeight/4*3) set the fixedLineHeight of fld pFieldName to true set the cRevTable["cellyspacing"] of fld pFieldName to pHeight end SetTableRowsHeight ---------------------------------------------------------------- on SetTableColumsWidth pFieldName,pWidth -- public handler -- sets the table columns width -- pFieldName parameter is the short name of the table field -- pWidth parameter is an integer set the tabStops of fld pFieldName to pWidth set the cRevTable["cellxspacing"] of fld pFieldName to pWidth end SetTableColumsWidth ---------------------------------------------------------------- on SetCurXCell pFieldName,pValue -- private handler -- updates prop in the cRevTable of the table field -- pFieldName parameter is the short name of the table field -- pValue parameter is the column number (an integer) set the cRevTable["currentxcell"] of fld pFieldName to pValue end SetCurXCell ---------------------------------------------------------------- on SetCurYCell pFieldName,pValue -- private handler -- updates prop in the cRevTable of the table field -- pFieldName parameter is the short name of the table field -- pValue parameter is the row number (an integer) set the cRevTable["currentycell"] of fld pFieldName to pValue end SetCurYCell ---------------------------------------------------------------- on SetScroll -- private handler -- sets the table field and header fields scrolls if they are any -- the syntax is not very comprehensible since this handler can set the scroll of an unknown number of fields -- then it refers to parameters by order/number and not by name using the do command lock screen lock messages repeat with i = 3 to the paramcount do "put there is a fld" && param(i) && "into tFlag" if tFlag then do "set the" && param(1) && "of fld" && param(i) && "to" && param(2) -- param (3) to param(x) are the names of the fields end repeat unlock messages unlock screen end SetScroll ---------------------------------------------------------------- function CellLoc pFieldName,pColumn,pRow -- private function -- returns the loc of any cell -- pFieldName parameter is the short name of the table field -- pColumn parameter is the column number (an integer) -- pRow parameter is the row number (an integer) local tLeft,tTop,tCellxspacing,tCellyspacing,tCurrenthscroll,tCurrentvscroll ----- put the left of fld pFieldName into tLeft put the top of fld pFieldName into tTop put the cRevTable["cellxspacing"] of fld pFieldName into tCellxspacing put the cRevTable["cellyspacing"] of fld pFieldName into tCellyspacing put the hScroll of fld pFieldName into tCurrenthscroll put the vScroll of fld pFieldName into tCurrentvscroll return ((pColumn - 1) * tCellxspacing) + (tCellxspacing div 2) + tLeft - tCurrenthscroll, \ ((pRow - 1) * tCellyspacing) + (tCellyspacing div 2) + tTop - tCurrentvscroll end CellLoc ################################################################ ## Other handlers and functions ################################################################ function ColumnNumber pLabel -- returns the correct number for columns from A to ZZ if the number of chars of pLabel = 1 then return charToNum(pLabel) - 64 else return (charToNum(last char of pLabel) - 64) + (charToNum(first char of pLabel) - 64) * 26 end ColumnNumber ---------------------------------------------------------------- on rawKeyDown pKey -- allows tabbing and arrowkeys to act in carousel -- horizontal and vertical limits are stored in 2 custom properties (xLimit and yLimit) in the table field if "revCell" is in the target then -- when editing a table field, target function returns something like: field "revCell-1,1" if the xLimit of fld "MyTable" = "None" or the xLimit of fld "MyTable" is empty then pass rawKeyDown -- no limits ----- switch pKey case 65363 -- arrow key right case 65289 -- tab key if the cRevTable["currentxcell"] of fld "MyTable" = the xLimit of fld "MyTable" then if the cRevTable["currentycell"] of fld "MyTable" = the yLimit of fld "MyTable" then SelectCell "MyTable",1,1 -- the first table cell else SelectCell "MyTable",1,the cRevTable["currentycell"] of fld "MyTable" + 1 -- the first table cell in the next line end if else pass rawKeyDown break ----- case 65361 -- arrow key left if the cRevTable["currentxcell"] of fld "MyTable" = 1 then if the cRevTable["currentycell"] of fld "MyTable" <> 1 then SelectCell "MyTable",the xLimit of fld "MyTable",the cRevTable["currentycell"] of fld "MyTable" - 1 -- -- the last allowed table cell in the previous line else SelectCell "MyTable",the xLimit of fld "MyTable",the yLimit of fld "MyTable" -- -- the last allowed table cell end if else pass rawKeyDown break ----- case 65364 -- arrow key down if the cRevTable["currentycell"] of fld "MyTable" = the yLimit of fld "MyTable" then if the cRevTable["currentxcell"] of fld "MyTable" = the xLimit of fld "MyTable" then SelectCell "MyTable",1,1 -- the first table cell else SelectCell "MyTable",the cRevTable["currentxcell"] of fld "MyTable" + 1,1 -- -- the first table cell in the next column else pass rawKeyDown break ----- case 65362 -- arrow key up if the cRevTable["currentycell"] of fld "MyTable" = 1 then if the cRevTable["currentxcell"] of fld "MyTable" <> 1 then SelectCell "MyTable",the cRevTable["currentxcell"] of fld "MyTable" - 1,the yLimit of fld "MyTable" -- -- the last allowed table cell in the previous column else SelectCell "MyTable",the xLimit of fld "MyTable",the yLimit of fld "MyTable" -- -- the last allowed table cell else pass rawKeyDown break ----- default pass rawKeyDown -- lets the engine do it end switch else pass rawKeyDown end rawKeyDown ################################################################ ## Bonus functions ################################################################ function PopulateWithLetters -- generates a tab delimited list from A to ZZ (limited here to CZ) local tList ----- repeat with i = 65 to 90 put numToChar(i) & tab after tList end repeat ----- repeat with i = 65 to 90 repeat with j = 65 to 90 put numToChar(i) & numToChar(j) & tab after tList end repeat end repeat ----- return tList end PopulateWithLetters ---------------------------------------------------------------- function PopulateWithNumbers -- generates a return delimited list of integers local tList ----- repeat with i = 1 to 256 put i & cr after tList end repeat return tList end PopulateWithNumbers ################################################################ ## Demo purposes handlers ################################################################ on rawKeyUp if "revCell" is in the target then UpdateProps -- -- when editing a table field, target function returns something like: field "revCell-1,1" pass rawKeyUp end rawKeyUp ---------------------------------------------------------------- on UpdateProps local tOldProps,tProps,tProp,tCurData ----- lock screen set the label of btn "Column" to line (the cREVTable["currentxcell"] of fld "MyTable") of btn "Column" set the menuHistory of btn "Column" to the cREVTable["currentxcell"] of fld "MyTable" set the label of btn "Row" to the cREVTable["currentycell"] of fld "MyTable" set the menuHistory of btn "Row" to the cREVTable["currentycell"] of fld "MyTable" put ReadCellValue("MyTable",the cREVTable["currentxcell"] of fld "MyTable",the cREVTable["currentycell"] of fld "MyTable") into tCurData put tCurData into fld "Data" set the enabled of btn "Clear Cell" to tCurData <> empty ----- put fld "Props" into tOldProps put the uTableProps of this cd into tProps set the itemDel to tab repeat with i = 1 to the number of lines of tProps do "put the cRevTable[" & quote & line i of tProps & quote & "] of fld" && quote & "MyTable" & quote && "into tProp" replace cr with "" in tProp put tProp into item 2 of line i of tProps end repeat put tProps into fld "Props" unlock screen end UpdateProps ---------------------------------------------------------------- on resizeStack -- system handler revUpdateGeometry set the vScrollBar of fld "Props" to the height of fld "Props" < 429 end resizeStack uTableProps currentxcell currentycell celledit cellformat cellxspacing cellyspacing currentcellvalue currentview formattedview viewablecolumns viewablerows currenthscroll currentvscroll currentxmouseloc currentymouseloc formatcellline formattypeline formatvalueline numbertabstops returnedview topcellloc leftcellloc rightcellloc bottomcellloc topfieldloc leftfieldloc rightfieldloc bottomfieldloc scrollbarwidth cREVGeometryCacheIDs '1115721716032 20481115814708927 46441115733056268 16001115820937830 65041115720484422 20001115882949345 77381115732655934 24421115882949346 77391115882949347 77401115882949348 77411115802671793 36381115740722284 34301115732666160 24441115732766035 22391115820499160 64801115732864919 24461115725521266 20511115729719189 23591115824545996 69471115721275267 20411115728701717 22321115721716001 20491116584744192 111201116584744193 111211115720512284 20011115712244199 11011115801468497 35421115717912212 16351115730563774 23641115711019181 10041115720660099 20031115735434067 24661115730581286 23661115816467730 48471115720843236 20121115828929940 77371115720676987 20041115731828825 24041115816583330 4848 cREVGeometrycache order b1115730581286 1115717912212 1115820499160 1115732655934 1115732864919 1115824545996 1115732766035 total 39 cREVGeneral scriptChecksum m!lTi5 bookmarks handlerList ClearTable EnableCellEditing WriteCellValue ReadCellValue SelectCell SetTableRowsHeight SetTableColumsWidth SetCurXCell SetCurYCell SetScroll CellLoc ColumnNumber rawKeyDown PopulateWithLetters PopulateWithNumbers rawKeyUp UpdateProps resizeStackbreakPoints tempScript prevHandler SelectCellscriptSelection char 1 to 0script j0################################################################
## Table handlers and functions:
## ClearTable
## EnableCellEditing
## WriteCellValue
## ReadCellValue
## SelectCell
## SetTableRowsHeight
## SetTableColumsWidth
################################################################
on ClearTable pFieldName
-- public handler
-- clear a table
-- pFieldName parameter is the short name of the table field
select empty -- if a cell is being edited, hide it
put empty into fld pFieldName
set the cRevTable["currentCellValue"] of fld pFieldName to empty -- updates prop in the cRevTable of the table field
set the cRevTable["currentView"] of fld pFieldName to empty -- updates prop in the cRevTable of the table field
set the cRevTable["formattedView"] of fld pFieldName to empty -- updates prop in the cRevTable of the table field
end ClearTable
----------------------------------------------------------------
on EnableCellEditing pFieldName,pFlag
-- public handler
-- enable or disable cell editing
-- pFieldName parameter is the short name of the table field
-- pFlag parameter is a boolean (true or false)
select empty -- if a cell is being edited, hide it
set the cREVTable["celledit"] of fld pFieldName to pFlag -- updates prop in the cRevTable of the table field
end EnableCellEditing
----------------------------------------------------------------
on WriteCellValue pFieldName,pColumn,pRow,pValue
-- public handler
-- write data to a cell
-- pFieldName parameter is the short name of the table field
-- pColumn parameter is the column number (an integer)
-- pRow parameter is the row number (an integer)
-- pValue parameter is the text string to write
select empty -- if a cell is being edited, hide it
set the itemDel to tab
put pValue into item pColumn of line pRow of fld pFieldName
set the cRevTable["currentView"] of fld pFieldName to the htmlText of fld pFieldName -- updates prop in the cRevTable of the table field
set the cRevTable["formattedView"] of fld pFieldName to the htmlText of fld pFieldName -- updates prop in the cRevTable of the table field
end WriteCellValue
----------------------------------------------------------------
function ReadCellValue pFieldName,pColumn,pRow
-- public handler
-- read data from a cell
-- pFieldName parameter is the short name of the table field
-- pColumn parameter is the column number (an integer)
-- pRow parameter is the row number (an integer)
set the itemDel to tab
return item pColumn of line pRow of fld pFieldName
end ReadCellValue
----------------------------------------------------------------
on SelectCell pFieldName,pColumn,pRow
-- public handler
-- select a cell
-- pFieldName parameter is the short name of the table field
-- pColumn parameter is the column number (an integer)
-- pRow parameter is the row number (an integer)
SetCurXCell pFieldName,pColumn --
SetCurYCell pFieldName,pRow --
-- see SetCurXCell and SetCurYCell private handlers below: update prop
-----
SetScroll "hScroll",the cRevTable["cellxspacing"] of fld pFieldName * (pColumn - 1),pFieldName,"Header" --
SetScroll "vScroll",the cRevTable["cellyspacing"] of fld pFieldName * (pRow - 1),pFieldName,"Rows" --
-- see SetScroll private handler below: used to update header fields scrolls
-----
click at CellLoc(pFieldName,pColumn,pRow) --
-----
-- to select again the current cell, you can use:
-- click at the cRevTable["currentxmouseloc"] of fld pFieldName,the cRevTable["currentymouseloc"] of fld pFieldName
end SelectCell
----------------------------------------------------------------
on SetTableRowsHeight pFieldName,pHeight
-- public handler
-- sets the table rows height
-- pFieldName parameter is the short name of the table field
-- pHeight parameter is an integer
set the textHeight of fld pFieldName to pHeight
-- in fact this line is not compulsory
set the textSize of fld pFieldName to round(pHeight/4*3)
set the fixedLineHeight of fld pFieldName to true
set the cRevTable["cellyspacing"] of fld pFieldName to pHeight
end SetTableRowsHeight
----------------------------------------------------------------
on SetTableColumsWidth pFieldName,pWidth
-- public handler
-- sets the table columns width
-- pFieldName parameter is the short name of the table field
-- pWidth parameter is an integer
set the tabStops of fld pFieldName to pWidth
set the cRevTable["cellxspacing"] of fld pFieldName to pWidth
end SetTableColumsWidth
----------------------------------------------------------------
on SetCurXCell pFieldName,pValue
-- private handler
-- updates prop in the cRevTable of the table field
-- pFieldName parameter is the short name of the table field
-- pValue parameter is the column number (an integer)
set the cRevTable["currentxcell"] of fld pFieldName to pValue
end SetCurXCell
----------------------------------------------------------------
on SetCurYCell pFieldName,pValue
-- private handler
-- updates prop in the cRevTable of the table field
-- pFieldName parameter is the short name of the table field
-- pValue parameter is the row number (an integer)
set the cRevTable["currentycell"] of fld pFieldName to pValue
end SetCurYCell
----------------------------------------------------------------
on SetScroll
-- private handler
-- sets the table field and header fields scrolls if they are any
-- the syntax is not very comprehensible since this handler can set the scroll of an unknown number of fields
-- then it refers to parameters by order/number and not by name using the do command
lock screen
lock messages
repeat with i = 3 to the paramcount
do "put there is a fld" && param(i) && "into tFlag"
if tFlag then do "set the" && param(1) && "of fld" && param(i) && "to" && param(2)
-- param (3) to param(x) are the names of the fields
end repeat
unlock messages
unlock screen
end SetScroll
----------------------------------------------------------------
function CellLoc pFieldName,pColumn,pRow
-- private function
-- returns the loc of any cell
-- pFieldName parameter is the short name of the table field
-- pColumn parameter is the column number (an integer)
-- pRow parameter is the row number (an integer)
local tLeft,tTop,tCellxspacing,tCellyspacing,tCurrenthscroll,tCurrentvscroll
-----
put the left of fld pFieldName into tLeft
put the top of fld pFieldName into tTop
put the cRevTable["cellxspacing"] of fld pFieldName into tCellxspacing
put the cRevTable["cellyspacing"] of fld pFieldName into tCellyspacing
put the hScroll of fld pFieldName into tCurrenthscroll
put the vScroll of fld pFieldName into tCurrentvscroll
return ((pColumn - 1) * tCellxspacing) + (tCellxspacing div 2) + tLeft - tCurrenthscroll, \
((pRow - 1) * tCellyspacing) + (tCellyspacing div 2) + tTop - tCurrentvscroll
end CellLoc
################################################################
## Other handlers and functions
################################################################
function ColumnNumber pLabel -- returns the correct number for columns from A to ZZ
if the number of chars of pLabel = 1 then return charToNum(pLabel) - 64
else return (charToNum(last char of pLabel) - 64) + (charToNum(first char of pLabel) - 64) * 26
end ColumnNumber
----------------------------------------------------------------
on rawKeyDown pKey
-- allows tabbing and arrowkeys to act in carousel
-- horizontal and vertical limits are stored in 2 custom properties (xLimit and yLimit) in the table field
if "revCell" is in the target then
-- when editing a table field, target function returns something like: field "revCell-1,1"
if the xLimit of fld "MyTable" = "None" or the xLimit of fld "MyTable" is empty then pass rawKeyDown -- no limits
-----
switch pKey
case 65363 -- arrow key right
case 65289 -- tab key
if the cRevTable["currentxcell"] of fld "MyTable" = the xLimit of fld "MyTable" then
if the cRevTable["currentycell"] of fld "MyTable" = the yLimit of fld "MyTable" then
SelectCell "MyTable",1,1 -- the first table cell
else
SelectCell "MyTable",1,the cRevTable["currentycell"] of fld "MyTable" + 1 -- the first table cell in the next line
end if
else pass rawKeyDown
break
-----
case 65361 -- arrow key left
if the cRevTable["currentxcell"] of fld "MyTable" = 1 then
if the cRevTable["currentycell"] of fld "MyTable" <> 1 then
SelectCell "MyTable",the xLimit of fld "MyTable",the cRevTable["currentycell"] of fld "MyTable" - 1 --
-- the last allowed table cell in the previous line
else
SelectCell "MyTable",the xLimit of fld "MyTable",the yLimit of fld "MyTable" --
-- the last allowed table cell
end if
else pass rawKeyDown
break
-----
case 65364 -- arrow key down
if the cRevTable["currentycell"] of fld "MyTable" = the yLimit of fld "MyTable" then
if the cRevTable["currentxcell"] of fld "MyTable" = the xLimit of fld "MyTable" then
SelectCell "MyTable",1,1 -- the first table cell
else SelectCell "MyTable",the cRevTable["currentxcell"] of fld "MyTable" + 1,1 --
-- the first table cell in the next column
else pass rawKeyDown
break
-----
case 65362 -- arrow key up
if the cRevTable["currentycell"] of fld "MyTable" = 1 then
if the cRevTable["currentxcell"] of fld "MyTable" <> 1 then
SelectCell "MyTable",the cRevTable["currentxcell"] of fld "MyTable" - 1,the yLimit of fld "MyTable" --
-- the last allowed table cell in the previous column
else SelectCell "MyTable",the xLimit of fld "MyTable",the yLimit of fld "MyTable" --
-- the last allowed table cell
else pass rawKeyDown
break
-----
default
pass rawKeyDown -- lets the engine do it
end switch
else pass rawKeyDown
end rawKeyDown
################################################################
## Bonus functions
################################################################
function PopulateWithLetters -- generates a tab delimited list from A to ZZ (limited here to CZ)
local tList
-----
repeat with i = 65 to 90
put numToChar(i) & tab after tList
end repeat
-----
repeat with i = 65 to 90
repeat with j = 65 to 90
put numToChar(i) & numToChar(j) & tab after tList
end repeat
end repeat
-----
return tList
end PopulateWithLetters
----------------------------------------------------------------
function PopulateWithNumbers -- generates a return delimited list of integers
local tList
-----
repeat with i = 1 to 256
put i & cr after tList
end repeat
return tList
end PopulateWithNumbers
################################################################
## Demo purposes handlers
################################################################
on rawKeyUp
if "revCell" is in the target then UpdateProps --
-- when editing a table field, target function returns something like: field "revCell-1,1"
pass rawKeyUp
end rawKeyUp
----------------------------------------------------------------
on UpdateProps
local tOldProps,tProps,tProp,tCurData
-----
lock screen
set the label of btn "Column" to line (the cREVTable["currentxcell"] of fld "MyTable") of btn "Column"
set the menuHistory of btn "Column" to the cREVTable["currentxcell"] of fld "MyTable"
set the label of btn "Row" to the cREVTable["currentycell"] of fld "MyTable"
set the menuHistory of btn "Row" to the cREVTable["currentycell"] of fld "MyTable"
put ReadCellValue("MyTable",the cREVTable["currentxcell"] of fld "MyTable",the cREVTable["currentycell"] of fld "MyTable") into tCurData
put tCurData into fld "Data"
set the enabled of btn "Clear Cell" to tCurData <> empty
-----
put fld "Props" into tOldProps
put the uTableProps of this cd into tProps
set the itemDel to tab
repeat with i = 1 to the number of lines of tProps
do "put the cRevTable[" & quote & line i of tProps & quote & "] of fld" && quote & "MyTable" & quote && "into tProp"
replace cr with "¬" in tProp
put tProp into item 2 of line i of tProps
end repeat
put tProps into fld "Props"
unlock screen
end UpdateProps
----------------------------------------------------------------
on resizeStack -- system handler
revUpdateGeometry
set the vScrollBar of fld "Props" to the height of fld "Props" < 429
end resizeStack
cREVTable acell false > < @ +p +q <