aboutsummaryrefslogtreecommitdiff
path: root/vendor/x11iraf/guidemo/table.gui
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/x11iraf/guidemo/table.gui')
-rw-r--r--vendor/x11iraf/guidemo/table.gui1958
1 files changed, 1958 insertions, 0 deletions
diff --git a/vendor/x11iraf/guidemo/table.gui b/vendor/x11iraf/guidemo/table.gui
new file mode 100644
index 00000000..68d71df9
--- /dev/null
+++ b/vendor/x11iraf/guidemo/table.gui
@@ -0,0 +1,1958 @@
+# TABDEMO.GUI -- Test the Table widget.
+
+reset-server
+appInitialize tabdemo Tabdemo {
+
+ *demoObjects:\
+ toplevel Layout panel \
+ panel Frame panelMenuFrame \
+ panelMenuFrame Layout panelMenuBar \
+ panelMenuBar Command newCol \
+ panelMenuBar Command newRow \
+ panelMenuBar Command newTable \
+ panelMenuBar Command tclShell \
+ panelMenuBar Command quitButton
+
+
+ Tabdemo*background: grey
+ *Tabdemo.geometry: +0+0
+
+ *Group.shrinkToFit: True
+ *Command.height: 28
+ *Command.shadowWidth: 1
+ *Frame.frameWidth: 1
+ *Frame.innerOffset: 4
+ *Frame.highlightThickness: 0
+ *borderWidth: 0
+ *Scrollbar2.location: 0 0 17 17
+ *Scrollbar.beNiceToColormap: False
+
+ *panel.width: 600
+ *panel.height: 350
+ *panel.layout: vertical { \
+ panelMenuFrame < +inf -inf * > \
+ 5 < +inf > horizontal { 5 < +inf > }\
+ }
+
+ *panelMenuBar.layout: horizontal { \
+ 2 newRow 1 newCol 1 newTable 1 tclShell 2 < +inf > quitButton 2 \
+ }
+ *newCol.label: New Col
+ *newRow.label: New Row
+ *newTable.label: New Table
+ *tclShell.label: TclShell
+ *quitButton.label: Quit
+
+} ; createObjects demoObjects
+
+send quitButton addCallback "send client gkey q ; deactivate unmap"
+
+# Utility procedure to test True/False strings in resources.
+proc true {v} {expr {$v == "true" || $v == "True" || $v == "TRUE"}}
+
+# Utility functions.
+proc min {a b} { expr {($a < $b) ? $a : $b} }
+proc max {a b} { expr {($a > $b) ? $a : $b} }
+
+# Create the Table objects in the OBM.
+
+set tabnumber 0 ;# initialize table counter
+
+proc doTable args {
+ global tabnumber
+
+ set tab [ format "tab%d" $tabnumber ]
+ set objs [ tableBuildObjects panel $tab ]
+
+# tableSetOption $tab DefLabels no
+# tableSetOption $tab RowLabels no
+# tableSetOption $tab ColLabels no
+# tableSetOption $tab Tracking no
+# tableSetOption $tab RowScroll no
+# tableSetOption $tab ColScroll no
+# tableSetOption $tab DefaultTranslations no
+ tableSetOption $tab RowMultiSelect no
+ tableSetOption $tab ColMultiSelect no
+# tableSetOption $tab RowLabelCols 2
+# tableSetOption $tab ColLabelRows 2
+ tableSetOption $tab Background bisque3
+
+ # Now create the new objects.
+ appExtend $objs
+ createObjects ${tab}Objects
+
+ # Now construct a layout for the new object.
+ set new ""
+ set panStart "vertical \{ panelMenuFrame < +inf -inf * > 5 < -5 >"
+ for {set i 0} {$i <= $tabnumber} {incr i} {
+
+ # Send the existing table a small height so they'll ajust to
+ # fit the new table.
+ if {$i < $tabnumber} { send tab${i}TableFrame set height 10 }
+
+ # Append a layout spec for the table.
+ set new \
+ [format "%s tab%dTableFrame < +inf -inf * +inf -inf > 5 < -5 >" \
+ $new $i]
+ }
+ set panEnd "\}"
+ set panelLayout [format "%s %s %s" $panStart $new $panEnd]
+
+ # Send the panel the new layout incorporating the newly created Table.
+ send panel set layout $panelLayout
+
+ # Now create the table itself, it should appear as if by magic.
+ tableCreate $tab 12 30 { }
+
+ # Apply some default test callbacks for selection/edit events.
+ tableAddSelectCallback $tab Row demoSelCB
+ tableAddSelectCallback $tab Col demoSelCB
+ tableAddSelectCallback $tab Cell demoSelCB
+ tableAddUnSelectCallback $tab Row demoUnSelCB
+ tableAddUnSelectCallback $tab Col demoUnSelCB
+ tableAddUnSelectCallback $tab Cell demoUnSelCB
+ tableAddEditCallback $tab demoEditCB
+
+ # Increment the global table counter.
+ incr tabnumber
+
+} ; send newTable addCallback doTable
+
+proc demoSelCB { name row col x y args } {
+ print "demoSelCB: name=$name r=$row c=$col x=$x y=$y args='$args'"
+}
+
+proc demoUnSelCB { name row col x y args } {
+ print "demoUnSelCB: name=$name r=$row c=$col x=$x y=$y args='$args'"
+}
+
+proc demoEditCB { name row col str args } {
+ print "demoEditCB: name=$name row=$row col=$col str='$str' args='$args'"
+}
+
+
+################################################################################
+
+################################################################################
+#
+# TABLE WIDGET PROCEDURES -- This interface provides simple access to a
+# named instance of a Table "meta-widget". The "widget" is actually a
+# number of widgets (Table, Scrollbars, etc) in a common layout to provide
+# row/col headings, scrollable data tables, and callbacks for [gs]etting
+# attributes. The meta-widget is created on-the-fly with a given named
+# and parent object, it is the callers responsibility to adjust the layout
+# of the parent to incorporate the new objects.
+#
+# The Table widget itself has various quirks and non-standard implem-
+# entations so features such as editing cells or access to certain callbacks
+# are not fully implemented in the OBM and hidden here. Most of what's
+# needed can be handled by these procedures, however these routines may be
+# used to manage multiple named tables in a GUI.
+#
+#
+# tableBuildObjects parent tab
+# tableSetOption tab option value
+# tableAddSelectCallback tab type cbname
+# tableAddEditCallback tab cbname
+# tableDestroyObjects tab
+#
+# tableCreate tab nrows ncols data
+# tableSetData tab data
+# tableSetColumnLabels tab labels
+# tableSetRowLabels tab labels
+#
+# tableSelectRow tab [ rownum | "all" ]
+# tableUnSelectRow tab [ rownum | "all" ]
+# tableSelectCol tab [ colnum | "all" ]
+# tableUnSelectCol tab [ colnum | "all" ]
+# tableSelectCell tab x y
+# tableUnSelectCell tab x y
+# list = tableGetSelected tab type
+#
+# tableSetRowLabelsAttr tab attr value
+# value = tableGetRowLabelsAttr tab attr
+# tableSetColLabelsAttr tab attr value
+# value = tableGetColLabelsAttr tab attr
+# tableSetRowLabelAttr tab row attr value
+# value = tableGetRowLabelAttr tab row attr
+# tableSetColLabelAttr tab col attr value
+# value = tableGetColLabelAttr tab col attr
+#
+# attr = tableGetCelllAttr tab row col attr
+# tableSetCelllAttr tab row col attr value
+# value = tableGetRowAttr tab row attr
+# tableSetRowAttr tab row attr value
+# value = tableGetColAttr tab col attr
+# tableSetColAttr tab col attr value
+#
+# tableDeleteCol tab col
+# tableDeleteRow tab row
+# tableAddCol tab col width [where]
+# tableAddRow tab row [where]
+#
+# nrows = tableGetNrows tab
+# ncols = tableGetNcols tab
+# height = tableGetHeight tab
+# width = tableGetWidth tab
+#
+# See obm$widget.c for a complete list of the OBM commands available
+# for this widget, and procedure header comments for details about the
+# interface here.
+#
+################################################################################
+
+set tabNrows(name) 0
+set tabNcols(name) 0
+set tabData(name) 0
+set tabColLabs(name) 0
+set tabRowHeights(name,j) 0
+set tabColWidths(name,i) 0
+
+set tabHeight(name) 0
+set tabWidth(name) 0
+set tabScrollSize(name,type) 0
+set tabScrollPos(name,type) 0
+
+# Meta-widget options, should be set before the tableCreate call.
+set tabOption(name,RowLabels) yes
+set tabOption(name,ColLabels) yes
+set tabOption(name,DefLabels) yes
+set tabOption(name,Tracking) yes
+set tabOption(name,RowScroll) yes
+set tabOption(name,ColScroll) yes
+set tabOption(name,Editable) yes
+set tabOption(name,RowSelect) yes
+set tabOption(name,ColSelect) no
+set tabOption(name,CellSelect) no
+set tabOption(name,DefaultTranslations) yes
+set tabOption(name,Background) grey
+set tabOption(name,Foreground) black
+set tabOption(name,HighlightColor) grey90
+set tabOption(name,RowLabelCols) 1
+set tabOption(name,ColLabelRows) 1
+
+# Selection lists.
+set tabSelected(name,Row) {}
+set tabSelected(name,Col) {}
+set tabSelected(name,Cell) {}
+set tabSelectionCB(name,Row) {}
+set tabSelectionCB(name,Col) {}
+set tabSelectionCB(name,Cell) {}
+set tabUnSelectionCB(name,Row) {}
+set tabUnSelectionCB(name,Col) {}
+set tabUnSelectionCB(name,Cell) {}
+set tabEditCB(name) {}
+
+
+# TABLEBUILDOBJECTS -- Utility routine to build the object list for the meta-
+# widget.
+#
+# Usage:
+# tableBuildObjects <parent> <tab>
+
+proc tableBuildObjects { parent tab } {
+
+ set objDef {
+ *TABObjects: \
+ PARENT Frame TABTableFrame \
+ TABTableFrame Layout TABFrameLayout \
+ TABFrameLayout Layout TABTableLayout \
+ TABTableLayout Viewport TABTabView \
+ TABTabView Table TABTab \
+ TABTableLayout Label TABSpacer1 \
+ TABTableLayout Viewport TABRowTabView \
+ TABRowTabView Table TABRowTab \
+ TABTableLayout Viewport TABColTabView \
+ TABColTabView Table TABColTab \
+ TABFrameLayout Label TABLabel \
+ TABFrameLayout Label TABSpacer2 \
+ TABFrameLayout Scrollbar TABColScroll \
+ TABFrameLayout Scrollbar TABRowScroll \
+\
+ toplevel TopLevelShell TABEditShell \
+ TABEditShell Layout TABEditLayout \
+ TABEditLayout Frame TABEditMenuFrame\
+ TABEditMenuFrame Layout TABEditMenuBar \
+ TABEditMenuBar Command TABEditApply \
+ TABEditMenuBar Command TABEditClear \
+ TABEditMenuBar Command TABEditCancel \
+ TABEditLayout Frame TABEditFrame \
+ TABEditFrame AsciiText TABEditText \
+
+
+
+
+ ! Global Table widget resources.
+ *Table.literalWidth: 20
+ *Table.rowHeight: 18
+ *Table.shadowWidth: 2
+ *Table.labelShadowWidth: 1
+ *Table.tableMargin: 0
+ *Table.columnMargin: 0
+ *Table.rowMargin: 0
+ *Table.internalHeight: 0
+ *Table.internalWidth: 0
+ *Table*font: 7x13bold
+
+ *TABTableFrame*Group.shrinkToFit: True
+ *TABTableFrame*Command.height: 28
+ *TABTableFrame*Command.shadowWidth: 1
+ *TABTableFrame*Frame.frameWidth: 1
+ *TABTableFrame*Frame.innerOffset: 4
+ *TABTableFrame*Frame.highlightThickness: 0
+ *TABTableFrame*Frame.borderWidth: 0
+ *TABTableFrame*Frame.shrinkToFit: True
+ *TABTableFrame*Table.borderWidth: 1
+ *TABTableFrame*Scrollbar.beNiceToColormap: False
+
+ *TABTableFrame.height: 10
+ *TABTableFrame.width: 10
+ *TABTableFrame*Layout.height: 10
+ *TABTableFrame*Layout.width: 10
+ *TABTableFrame*Label.height: 12
+ *TABTableFrame*Label.label:
+ *TABTableFrame*Label.font: 6x12
+
+ *TABFrameLayout.TABTableLayout.height: 10
+ *TABFrameLayout.TABTableLayout.width: 10
+ *TABFrameLayout.TABTableLayout*Layout.height: 10
+ *TABFrameLayout.TABTableLayout*Layout.width: 10
+ *TABFrameLayout.TABTableLayout*Viewport.height: 20
+ *TABFrameLayout.TABTableLayout*Viewport.width: 20
+ *TABFrameLayout.TABTableLayout*Table.height: 20
+ *TABFrameLayout.TABTableLayout*Table.width: 20
+
+
+ ! The following resources enable the scrollbars on the Viewport
+ ! widget but effectively hide them from display. This allows us
+ ! to control the viewport manually from the Table code, e.g. to
+ ! scroll both the column headings and data table.
+ *TABFrameLayout.TABTableLayout*Viewport.allowVert: True
+ *TABFrameLayout.TABTableLayout*Viewport.allowHoriz: True
+ *TABFrameLayout.TABTableLayout*Viewport.forceBars: True
+ *TABFrameLayout.TABTableLayout*Viewport.useBottom: True
+ *TABFrameLayout.TABTableLayout*Viewport.useRight: True
+ *TABFrameLayout.TABTableLayout*Viewport.borderWidth: 1
+
+ *TABTableLayout*TABRowTabView*vertical.thickness: 1
+ *TABTableLayout*TABRowTabView*horizontal.thickness: 1
+ *TABTableLayout*TABColTabView*vertical.thickness: 1
+ *TABTableLayout*TABColTabView*horizontal.thickness: 1
+ *TABTableLayout*TABTabView*vertical.thickness: 1
+ *TABTableLayout*TABTabView*horizontal.thickness: 1
+
+ *TABTableFrame.TABFrameLayout.TABRowScroll.thickness: 12
+ *TABTableFrame.TABFrameLayout.TABRowScroll.width: 12
+ *TABTableFrame.TABFrameLayout.TABRowScroll.height: 12
+ *TABTableFrame.TABFrameLayout.TABRowScroll.orientation: Vertical
+
+ *TABTableFrame.TABFrameLayout.TABColScroll.thickness: 12
+ *TABTableFrame.TABFrameLayout.TABColScroll.width: 12
+ *TABTableFrame.TABFrameLayout.TABColScroll.height: 12
+ *TABTableFrame.TABFrameLayout.TABColScroll.orientation: Horizontal
+
+ *TABFrameLayout.layout: horizontal { \
+ vertical { \
+ 2 < -2 > \
+ TABTableLayout < +inf -inf * +inf -inf > \
+ 2 < -2 > \
+ horizontal { \
+ TABLabel 1 < -1 > TABColScroll < +inf -inf * > \
+ } \
+ } \
+ vertical { \
+ TABSpacer2 1 < -1 > TABRowScroll < * +inf -inf > 22 < -22 > \
+ } \
+ }
+ *TABTableFrame.TABFrameLayout.TABLabel.label: ( 0, 0)
+ *TABTableFrame.TABFrameLayout.TABLabel.font: 6x12
+ *TABTableFrame.TABFrameLayout.TABLabel.width: 80
+ *TABTableFrame.TABFrameLayout.TABLabel.height: 12
+ *TABTableFrame.TABFrameLayout*TABColScroll.height: 12
+ *TABTableFrame.TABFrameLayout.TABSpacer2.height: 27
+ *TABTableFrame.TABFrameLayout.TABSpacer2.shadowWidth: 0
+
+ *TABTableLayout.layout: horizontal { \
+ vertical { \
+ TABSpacer1 1 < -1 > TABRowTabView < * +inf -inf > \
+ } \
+ 3 < -3 > \
+ vertical { \
+ TABColTabView < +inf -inf * > \
+ 3 < -3 > \
+ TABTabView < +inf -inf * +inf -inf > \
+ } \
+ 3 < -3 > \
+ }
+ *TABTableLayout.TABSpacer1.height: 27
+ *TABTableLayout.TABSpacer1.shadowWidth: 0
+
+ !---------------------------+
+ ! Set the editor resources. |
+ !---------------------------+
+ *TABEditShell.title: Table Value Editor
+ *TABEditShell.width: 275
+ *TABEditShell.height: 80
+ *TABEditLayout*borderWidth: 0
+ *TABEditLayout.layout: vertical { \
+ TABEditFrame < +inf -inf * +inf -inf > \
+ -2 \
+ TABEditMenuFrame < +inf -inf * > \
+ -2 \
+ }
+
+ *TABEditMenuBar.layout: horizontal { \
+ TABEditApply 5 \
+ 10 < +inf -inf > \
+ TABEditClear 5 \
+ 10 < +inf -inf > \
+ TABEditCancel 5 \
+ }
+ *TABEditMenuFrame.height: 80
+ *TABEditMenuFrame.outerOffset: 0
+ *TABEditMenuFrame.innerOffset: 5
+ *TABEditMenuFrame.frameType: chiseled
+ *TABEditMenuFrame.frameWidth: 2
+ *TABEditFrame.frameType: sunken
+ *TABEditFrame.frameWidth: 2
+ *TABEditFrame.outerOffset: 5
+ *TABEditText*scrollVertical: never
+ *TABEditText*scrollHorizontal: whenNeeded
+ *TABEditText*font: 7x13
+ *TABEditText*editType: edit
+ *TABEditApply.label: Apply
+ *TABEditApply.width: 150
+ *TABEditClear.label: Clear
+ *TABEditClear.width: 150
+ *TABEditCancel.label: Cancel
+ *TABEditCancel.width: 150
+
+ }
+
+ regsub -all TAB $objDef $tab tmp1
+ regsub -all PARENT $tmp1 $parent objs
+ set objs [format "{ %s }" $objs]
+
+ return $objs
+}
+
+
+# TABLEDESTROYOBJECTS -- Destroy the specified table and all it's objects.
+#
+# Usage:
+# tableDestroyObjects <tab>
+
+proc tableDestroyObjects { tab } {
+ destroyObject ${tab}TableFrame
+}
+
+
+# TABESETOPTION -- Set an option for the Table meta-widget.
+#
+# Usage:
+# tableSetOption <tab> <option> [yes|no]
+#
+# where <tab> is the table name given when the meta-widget was created, and
+# <option> is one of:
+#
+#
+# Option Name Type Default Description
+# ----------- ---- ------- -----------
+# RowLabels bool yes display a row label table
+# ColLabels bool yes display a column label table
+# DefLabels bool yes do default labels of rows/cols
+# Tracking bool yes do coord tracking in data table
+# RowScroll bool yes display row scrollbar
+# ColScroll bool yes display column scrollbar
+# Editable bool yes table is editable
+# RowSelect bool yes rows are selectable
+# ColSelect bool yes cols are selectable
+# CellSelect bool yes cells are selectable
+# RowMultiSelect bool yes multiple rows may be selected
+# ColMultiSelect bool yes multiple cols may be selected
+# CellMultiSelect bool yes multiple cells may be selected
+# DefaultTranslations bool yes use default table translations
+# Foreground color black meta-widget foreground color
+# Background color grey meta-widget background color
+# HighlightColor color grey90 selected item highlight color
+# RowLabelCols int 1 number of columns in row labels
+# ColLabelRows int 1 number of rows in column labels
+#
+
+proc tableSetOption { tab option value } {
+ global tabOption
+ set tabOption(${tab},${option}) $value
+
+ # Now handle the special cases where one option may disable some other.
+}
+
+
+# TABLEADDSELECTCALLBACK -- Add a user-defined callback to be executed
+# when there is a row, column, or cell selection event occurs.
+#
+# Usage:
+# tableAddSelectCallback <tab> <type> <cbname>
+#
+# where <type> is "Row", "Col", or "Cell" and <cbname> specifies a procedure
+# to be called whenever the specified <type> is selected. Procedures are
+# called as
+# <cbname> name row col x y
+#
+# where 'name' is the table name, 'row' and 'col' are the coordinates of the
+# selection and 'x' and 'y' are the raw event coordinates. Registered proc-
+# edures are required to declare all these arguments but do not need to use
+# them.
+
+proc tableAddSelectCallback { tab type cbname } {
+ global tabSelectionCB
+ lappend tabSelectionCB(${tab},${type}) $cbname
+}
+
+
+# TABLEADDUNSELECTCALLBACK -- Add a user-defined callback to be executed
+# when there is a row, column, or cell un-selection event occurs.
+#
+# Usage:
+# tableAddUnSelectCallback <tab> <type> <cbname>
+#
+# where <type> is "Row", "Col", or "Cell" and <cbname> specifies a procedure
+# to be called whenever the specified <type> is selected. Procedures are
+# called as
+# <cbname> name row col x y state
+#
+# where 'name' is the table name, 'row' and 'col' are the coordinates of the
+# selection and 'x' and 'y' are the raw event coordinates. Registered proc-
+# edures are required to declare all these arguments but do not need to use
+# them.
+
+proc tableAddUnSelectCallback { tab type cbname } {
+ global tabUnSelectionCB
+ lappend tabUnSelectionCB(${tab},${type}) $cbname
+}
+
+
+
+# TABLEADDEDITCALLBACK -- Add a user-defined callback to be executed
+# when there is an edit event.
+#
+# Usage:
+# tableAddEditCallback <tab> <cbname>
+#
+# <cbname> specifies a procedure to be called whenever the table editor
+# Apply button has been pressed. Procedures are called as
+#
+# <cbname> name row col new_string
+#
+# where 'name' is the table name, 'row' and 'col' are the coordinates of the
+# edited cell and 'new_string' is the new value inserted in the table. Reg-
+# istered procedures are required to declare all these arguments but do not
+# need to use them.
+
+proc tableAddEditCallback { tab cbname } {
+ global tabEditCB
+ lappend tabEditCB(${tab}) $cbname
+}
+
+
+# TABLECREATE -- Create a named instance of the Table meta-widget. The
+# individual objects in the meta-widget are created dynamically and the
+# entire thing is created as a child of the named parent object. The
+# standard callbacks are assigned and the table is initialized, however
+# it is the callers responsibility to adjust the parent's layout to make
+# the meta-widget visible and assign any constraint callbacks.
+#
+# Usage:
+# tableCreate <tab> <nrows> <ncols> <data>
+#
+# The <data> is specified as a Tcl list of the form:
+#
+# { {r1c1 r1c2 ... r1cN}
+# {r2c1 r2c2 ... r2cN}
+# :
+# {rNc1 rNc2 ... rNcN} }
+#
+# String values must be quoted, rows/cols will be truncated or cleared if
+# the specified table size does not agree with the size of the data table
+# being loaded.
+
+set tabBGWidgets { \
+ TABTab TABRowTab TABColTab TABLabel TABColScroll \
+ TABRowScroll TABEditApply TABEditClear TABEditCancel \
+ TABEditApply TABEditClear TABEditCancel TABEditText \
+ TABEditFrame TABEditMenuBar TABEditMenuFrame \
+}
+set tabFGWidgets { \
+ TABTab TABRowTab TABColTab TABLabel TABColScroll \
+ TABRowScroll TABEditApply TABEditClear TABEditCancel \
+ TABEditApply TABEditClear TABEditCancel TABEditText \
+}
+
+proc tableCreate { tab nrows ncols data } {
+ global tabNrows tabNcols tabRowHeights tabColWidths
+ global tabHeight tabWidth tabDebug tabOption
+ global tabEditCB tabSelectionCB tabUnSelectionCB
+ global tabSelected tabBGWidgets tabFGWidgets
+
+ set err ""
+ catch {
+ if { ![info exists tabOption(${tab},RowLabelCols)] } {
+ set tabOption(${tab},RowLabelCols) $tabOption(name,RowLabelCols)
+ }
+ } err
+ if {$err != ""} {
+ set tabOption(${tab},RowLabelCols) $tabOption(name,RowLabelCols)
+ }
+ set err ""
+ catch {
+ if { ![info exists tabOption(${tab},ColLabelRows)] } {
+ set tabOption(${tab},ColLabelRows) $tabOption(name,ColLabelRows)
+ }
+ } err
+ if {$err != ""} {
+ set tabOption(${tab},ColLabelRows) $tabOption(name,ColLabelRows)
+ }
+
+
+ set tabNrows(${tab},data) $nrows
+ set tabNcols(${tab},data) $ncols
+ set tabNrows(${tab},rows) $nrows
+ set tabNcols(${tab},rows) $tabOption(${tab},RowLabelCols)
+ set tabNrows(${tab},cols) $tabOption(${tab},ColLabelRows)
+ set tabNcols(${tab},cols) $ncols
+ set tabData($tab) $data
+
+ # Initialize with a default row height.
+ set rh [send ${tab}Tab get rowHeight]
+ set tabRowHeights($tab,default) $rh
+ for {set i 1} {$i <= $nrows} {incr i} {
+ set tabRowHeights($tab,$i) $rh
+ }
+
+ # Initialize with a default column width.
+ set cw [send ${tab}Tab get defaultWidth]
+ for {set i 1} {$i <= $ncols} {incr i} {
+ set tabColWidths($tab,$i) $cw
+ }
+
+ # Initialize the table.
+ send ${tab}Tab setTable $nrows $ncols $data
+
+ # Initialize the labels.
+ tableSetDefaultLabels $tab
+
+ # Save the table dimensions.
+ set tabHeight($tab) [ tableGetHeight $tab ]
+ set tabWidth($tab) [ tableGetWidth $tab ]
+
+ # Set the default table translations.
+ tableSetDefaultTranslations $tab
+
+ # Attach the default-callbacks to the new Table.
+ tableAddCallbacks $tab
+
+ # Set Default Scrollbars for the table.
+ tableSetDefaultScrollbars $tab yes
+
+ # Default the colors.
+ set err ""
+ catch {
+ if { ![info exists tabOption(${tab},HighlightColor)] != 0 } {
+ set tabOption(${tab},HighlightColor) $tabOption(name,HighlightColor)
+ }
+ } err
+ if {$err != ""} {
+ set tabOption(${tab},HighlightColor) $tabOption(name,HighlightColor)
+ }
+ set err ""
+ catch {
+ if { ![info exists tabOption(${tab},Background)] != 0 } {
+ set tabOption(${tab},Background) $tabOption(name,Background)
+ }
+ } err
+ if {$err != ""} {
+ set tabOption(${tab},Background) $tabOption(name,Background)
+ }
+ set err ""
+ catch {
+ if { ![info exists tabOption(${tab},Foreground)] != 0 } {
+ set tabOption(${tab},Foreground) $tabOption(name,Foreground)
+ }
+ } err
+ if {$err != ""} {
+ set tabOption(${tab},Foreground) $tabOption(name,Foreground)
+ }
+
+ regsub -all TAB $tabBGWidgets $tab bgwidgets
+ foreach w $bgwidgets {
+ send $w set background $tabOption(${tab},Background)
+ }
+ regsub -all TAB $tabFGWidgets $tab fgwidgets
+ foreach w $fgwidgets {
+ send $w set foreground $tabOption(${tab},Foreground)
+ }
+
+ # Default selections.
+ set tabSelected(${tab},Row) {}
+ set tabSelected(${tab},Col) {}
+ set tabSelected(${tab},Cell) {}
+
+ set tabSelectionCB(${tab},Row) {}
+ set tabSelectionCB(${tab},Col) {}
+ set tabSelectionCB(${tab},Cell) {}
+ set tabUnSelectionCB(${tab},Row) {}
+ set tabUnSelectionCB(${tab},Col) {}
+ set tabUnSelectionCB(${tab},Cell) {}
+ set tabEditCB(${tab}) {}
+}
+
+
+# TABLESETDATA -- Set the data elements of a table meta-widget.
+#
+# Usage:
+# tableSetData <tab> <data>
+#
+# where <tab> is the table name given when the meta-widget was created, and
+# <data> is of the form:
+#
+# { {r1c1 r1c2 ... r1cN}
+# {r2c1 r2c2 ... r2cN}
+# :
+# {rNc1 rNc2 ... rNcN} }
+
+proc tableSetData { tab data } {
+ global tabNrows tabNcols
+
+ send ${tab}Tab setTable $tabNrows(${tab},data) $tabNcols(${tab},data) $data
+
+# send ${tab}Tab setTable \
+# [expr ($tabNrows(${tab},data) + 20)] \
+# [expr ($tabNcols(${tab},data) + 20)] \
+# $data
+}
+
+
+# TABLESETSIZE -- Set the size of a table meta-widget.
+#
+# Usage:
+# tableSetSize <tab> <nrows> <ncols>
+#
+
+proc tableSetSize { tab nrows ncols } {
+ global tabNrows tabNcols tabOption
+ global tabHeight tabWidth tabRowHeights
+
+ set tabNrows(${tab},data) $nrows
+ set tabNcols(${tab},data) $ncols
+
+ set tabNrows(${tab},rows) $nrows
+ set tabNcols(${tab},rows) $tabOption(${tab},RowLabelCols)
+ set tabNrows(${tab},cols) $tabOption(${tab},ColLabelRows)
+ set tabNcols(${tab},cols) $ncols
+
+ send ${tab}Tab setTableSize $nrows $ncols
+ send ${tab}RowTab setTableSize $tabNrows(${tab},rows) $tabNcols(${tab},rows)
+ send ${tab}ColTab setTableSize $tabNrows(${tab},cols) $tabNcols(${tab},cols)
+
+ set rh [send ${tab}Tab get rowHeight]
+ set tabRowHeights($tab,default) $rh
+ for {set i 1} {$i <= $nrows} {incr i} {
+ set tabRowHeights($tab,$i) $rh
+ }
+
+ # Save the table dimensions.
+ set tabHeight($tab) [ tableGetHeight $tab ]
+ set tabWidth($tab) [ tableGetWidth $tab ]
+
+ #tableSetDefaultScrollbars $tab yes
+}
+
+
+# TABLESETCOLUMNLABELS -- Set the column header labels for a table.
+# meta-widget.
+#
+# Usage:
+# tableSetColumnLabels <tab> <column_labs>
+#
+# where <tab> is the table name given when the meta-widget was created, and
+# <data> is of the form:
+#
+# { { r1c1 } { r1c2 } ... { r1cN } }
+
+proc tableSetColumnLabels { tab col_labs } {
+ global tabNrows tabNcols
+ send ${tab}ColTab \
+ setTable $tabNrows(${tab},cols) $tabNcols(${tab},cols) $col_labs
+}
+
+
+# TABLESETROWLABELS -- Set the row header labels for a table.
+# meta-widget.
+#
+# Usage:
+# tableSetColumnLabels <tab> <row_labs>
+#
+# where <tab> is the table name given when the meta-widget was created, and
+# <data> is of the form:
+#
+# { {r1c1 r1c2 ... r1cN} }
+
+proc tableSetRowLabels { tab row_labs } {
+ global tabNrows tabNcols
+ send ${tab}RowTab \
+ setTable $tabNrows(${tab},rows) $tabNcols(${tab},rows) $row_labs
+}
+
+
+# TABLESETCOLLABELSATTR -- Set the column header labels for a table
+# meta-widget.
+#
+# Usage:
+# tableSetColumnLabels <tab> <attr> <value> [<row>]
+#
+# where <attr> is one of
+#
+# background background color
+# foreground foreground color
+# width column width
+# justify label justification
+
+proc tableSetColLabelsAttr { tab attr value args } {
+ if {$args != ""} {
+ send ${tab}ColTab setRowAttr $args $attr $value
+ } else {
+ send ${tab}ColTab setRowAttr 1 $attr $value
+ }
+}
+
+
+# TABLESETROWLABELSATTR -- Set the row header labels for a table meta-widget.
+#
+# Usage:
+# tableSetRowLabelsAttr <tab> <attr> <value> [<col>]
+#
+# where <attr> is one of
+#
+# background background color
+# foreground foreground color
+# width column width
+# justify label justification
+
+proc tableSetRowLabelsAttr { tab attr value args } {
+ if {$args != ""} {
+ send ${tab}RowTab setColAttr $args $attr $value
+ } else {
+ send ${tab}RowTab setColAttr 1 $attr $value
+ }
+}
+
+
+# TABLEGETROWLABELSATTR -- Get the row header labels for a table meta-widget.
+#
+# Usage:
+# value = tableGetRowLabelsAttr <tab> <attr> [<col>]
+#
+# where <attr> is one of
+#
+# background background color
+# foreground foreground color
+# width column width
+# justify label justification
+
+proc tableGetRowLabelsAttr { tab attr args } {
+ if {$args != ""} {
+ return [ send ${tab}RowTab getColAttr $args $attr ]
+ } else {
+ return [ send ${tab}RowTab getColAttr 1 $attr ]
+ }
+}
+
+
+# TABLEGETCOLLABELSATTR -- Get the column header labels for a table.
+# meta-widget.
+#
+# Usage:
+# value = tableGetColLabelsAttr <tab> <attr> [<row>]
+#
+# where <attr> is one of
+#
+# background background color
+# foreground foreground color
+# width column width
+# justify label justification
+
+proc tableGetColLabelsAttr { tab attr args } {
+ if {$args != ""} {
+ return [ send ${tab}ColTab getRowAttr $args $attr ]
+ } else {
+ return [ send ${tab}ColTab getRowAttr 1 $attr ]
+ }
+}
+
+
+# TABLESETROWLABELATTR -- Set the specified attribute for the row label table.
+#
+# Usage:
+# tableSetRowLabelAttr <tab> <row> <attr> <value> [<row>]
+#
+# The cell position is given as a 1-indexed array element where the UL
+# of the table is cell (1,1). Allowed attributes for a cell include:
+#
+# label label text (string)
+# background background color (string)
+# foreground foreground color (string)
+
+proc tableSetRowLabelAttr { tab row attr value args } {
+ if {$args != ""} {
+ send ${tab}RowTab setCellAttr $row $args $attr $value
+ } else {
+ send ${tab}RowTab setCellAttr $row 1 $attr $value
+ }
+}
+
+
+# TABLESETCOLLABELATTR -- Get the specified attribute for the col label table.
+#
+# Usage:
+# value = tableSetColLabelAttr <tab> <col> <attr> <value> [<row>]
+#
+# The cell position is given as a 1-indexed array element where the UL
+# of the table is cell (1,1). Allowed attributes for a cell include:
+#
+# label label text (string)
+# background background color (string)
+# foreground foreground color (string)
+
+proc tableSetColLabelAttr { tab col attr value args } {
+ if {$args != ""} {
+ send ${tab}ColTab setCellAttr $args $col $attr $value
+ } else {
+ send ${tab}ColTab setCellAttr 1 $col $attr $value
+ }
+}
+
+
+# TABLEGETCELLATTR -- Get the specified attribute for the cell.
+#
+# Usage:
+# value = tableGetCellAttr <tab> <row> <col> <attr>
+#
+# The cell position is given as a 1-indexed array element where the UL
+# of the table is cell (1,1). Allowed attributes for a cell include:
+#
+# label label text (string)
+# background background color (string)
+# foreground foreground color (string)
+
+proc tableGetCellAttr { tab row col attr } {
+ return [ send ${tab}Tab getCellAttr $row $col $attr ]
+}
+
+
+# TABLESETCELLATTR -- Set the specified attribute for the cell.
+#
+# Usage:
+# tableSetCellAttr <tab> <row> <col> <attr> <value>
+#
+# The cell position is given as a 1-indexed array element where the UL
+# of the table is cell (1,1). Allowed attributes for a cell include:
+#
+# label label text (string)
+# background background color (string)
+# foreground foreground color (string)
+
+proc tableSetCellAttr { tab row col attr value } {
+ send ${tab}Tab setCellAttr $row $col $attr $value
+}
+
+
+# TABLEGETROWATTR -- Get the specified attribute for the row.
+#
+# Usage:
+# value = tableGetCellAttr <tab> <row> <attr>
+#
+# The row position is given as a 1-indexed array element where the UL
+# of the table is cell (1,1). Allowed attributes for a row include:
+#
+# background background color
+# foreground foreground color
+
+proc tableGetRowAttr { tab row attr } {
+ return [ send ${tab}Tab getRowAttr $row $attr ]
+}
+
+
+# TABLESETROWATTR -- Set the specified attribute for the row.
+#
+# Usage:
+# tableSetRowAttr <tab> <row> <attr> <value>
+#
+# The row position is given as a 1-indexed array element where the UL
+# of the table is cell (1,1). Allowed attributes for a row include:
+#
+# background background color
+# foreground foreground color
+
+proc tableSetRowAttr { tab row attr value } {
+ send ${tab}Tab setRowAttr $row $attr $value
+}
+
+
+# TABLEGETCOLATTR -- Get the specified attribute for the column.
+#
+# Usage:
+# value = tableGetColAttr <tab> <col> <attr>
+#
+# The column position is given as a 1-indexed array element where the UL
+# of the table is cell (1,1). Allowed attributes for a column include:
+#
+# width column width (pixels)
+# background background color (string)
+# foreground foreground color (string)
+# justify text justification (string)
+
+proc tableGetColAttr { tab col attr } {
+ return [ send ${tab}Tab getColAttr $col $attr ]
+}
+
+
+# TABLESETCOLATTR -- Set the specified attribute for the column.
+#
+# Usage:
+# tableSetColAttr <tab> <col> <attr> <value>
+#
+# The column position is given as a 1-indexed array element where the UL
+# of the table is cell (1,1). Allowed attributes for a column include:
+#
+# width column width (pixels)
+# background background color (string)
+# foreground foreground color (string)
+# justify text justification (string)
+
+proc tableSetColAttr { tab col attr value } {
+ global tabColWidths tabNcols
+
+ send ${tab}Tab setColAttr $col $attr $value
+ if {$attr == "width"} {
+ set tabColWidths(${tab},$col) $value
+ }
+}
+
+
+# TABLEDELETECOL -- Delete the specified column from the named table.
+#
+# Usage:
+# tableDeleteCol <tab> <col>
+
+proc tableDeleteCol { tab col } {
+ global tabColWidths tabNcols
+
+ send ${tab}Tab deleteCol $col
+ send ${tab}ColTab deleteCol $col
+ incr tabNcols(${tab},data) -1
+ catch { unset tabColWidths(${tab},$col) } err
+}
+
+
+# TABLEDELETEROW -- Delete the specified row from the named table.
+#
+# Usage:
+# tableDeleteRow <tab> <row>
+
+proc tableDeleteRow { tab row } {
+ global tabRowHeights tabNrows
+
+ send ${tab}Tab deleteRow $row
+ send ${tab}RowTab deleteRow $row
+ incr tabNrows(${tab},data) -1
+ catch { unset tabRowHeights(${tab},$row) } err
+}
+
+
+# TABLEDADDCOL -- Add a column to the named table at the specified position.
+#
+# Usage:
+# tableAddCol <tab> <col> <width>
+
+proc tableAddCol { tab col width args} {
+ global tabColWidths tabNcols
+
+ send ${tab}Tab addCol $col $width $args
+ send ${tab}ColTab addCol $col $width $args
+ incr tabNcols(${tab},data)
+
+ set ncols $tabNcols(${tab},data)
+ if {$col == "first"} {
+ set colnum 1
+ } elseif {$col == "last"} {
+ set colnum $tabNcols(${tab},data)
+ } else {
+ set colnum $col
+ }
+
+ # Update the column widths.
+ for {set c $ncols} {$c > $colnum} {incr c -1} {
+ set tabColWidths(${tab},$c) $tabColWidths(${tab},[expr ($c - 1)])
+ }
+ set tabColWidths(${tab},$colnum) $width
+}
+
+
+# TABLEADDROW -- Add a rows to the named table at the specified position.
+#
+# Usage:
+# tableAddRow <tab> <row>
+
+proc tableAddRow { tab row args } {
+ global tabRowHeights tabNrows
+
+ send ${tab}Tab addRow $row $args
+ send ${tab}RowTab addRow $row $args
+ incr tabNrows(${tab},data)
+ set tabRowHeights(${tab},$row) $tabRowHeights(${tab},default)
+}
+
+
+# TABLEGETNROWS -- Return the number of rows in a named table.
+#
+# Usage:
+# nrows = tableGetNrows <tab>
+
+proc tableGetNrows { tab } {
+ global tabNrows
+ return $tabNrows(${tab},data)
+}
+
+
+# TABLEGETNCOLS -- Return the number of columns in a named table.
+#
+# Usage:
+# ncols = tableGetNcols <tab>
+
+proc tableGetNcols { tab } {
+ global tabNcols
+ return $tabNcols(${tab},data)
+}
+
+
+# TABLEGETHEIGHT -- Compute the height of the table given varying row heights.
+#
+# Usage:
+# height = tableGetHeight <tab>
+
+proc tableGetHeight { tab } {
+ return [ send ${tab}Tab get height ]
+}
+
+
+# TABLEGETWIDTH -- Compute the width of the table given varying column widths.
+#
+# Usage:
+# width = tableGetWidth <tab>
+
+proc tableGetWidth { tab } {
+ return [ send ${tab}Tab get width ]
+}
+
+
+# TABLEGETSELECTED -- Return a list of the selected items.
+#
+# Usage: list = tableGetSelected tab type
+#
+# where <type> is 'Row', 'Col', or 'Cell'.
+
+proc tableGetSelected { tab type } {
+ global tabSelected
+ return $tabSelected(${tab},${type})
+}
+
+
+
+# TABLESELECTROW -- User-selectable row procedure. Row may be the string
+# "all" in which case we select all rows in the table, otherwise may sure
+# selection is unique.
+
+proc tableSelectRow { tab row } {
+ global tabSelected tabOption tabNrows
+
+ set color $tabOption(${tab},HighlightColor)
+ if {$row == "all"} {
+ for {set i 0} {$i < $tabNrows(${tab},data)} {incr i} {
+ set index [lsearch $tabSelected(${tab},Row) $row ]
+ if {$index < 0} {
+ lappend tabSelected(${tab},Row) $i
+ tableSetRowAttr ${tab} $i background $color
+ tableSetRowAttr ${tab}Row $i background $color
+ }
+ }
+ } else {
+ set index [lsearch $tabSelected(${tab},Row) $row ]
+ if {$index < 0} {
+ lappend tabSelected(${tab},Row) $row
+ tableSetRowAttr ${tab} $row background $color
+ tableSetRowAttr ${tab}Row $row background $color
+ }
+ }
+}
+
+
+# TABLESELECTCOL -- User-selectable column procedure. Col may be the string
+# "all" in which case we select all cols in the table, otherwise may sure
+# selection is unique.
+
+proc tableSelectCol { tab col } {
+ global tabSelected tabOption tabNcols
+
+ set color $tabOption(${tab},HighlightColor)
+ if {$col == "all"} {
+ for {set i 0} {$i < $tabNcols(${tab},data)} {incr i} {
+ set index [lsearch $tabSelected(${tab},Col) $col ]
+ if {$index < 0} {
+ lappend tabSelected(${tab},Col) $i
+ tableSetColAttr ${tab} $i background $color
+ tableSetColAttr ${tab}Col $i background $color
+ }
+ }
+ } else {
+ set index [lsearch $tabSelected(${tab},Col) $col ]
+ if {$index < 0} {
+ lappend tabSelected(${tab},Col) $col
+ tableSetRowAttr ${tab} $col background $color
+ tableSetRowAttr ${tab}Col $col background $color
+ }
+ }
+}
+
+
+# TABLESELECTCELL -- User-callable cell selection procedure
+
+proc tableSelectCell { tab col row } {
+ global tabSelected tabOption
+
+ set color $tabOption(${tab},HighlightColor)
+ set index [lsearch $tabSelected(${tab},Col) [list $row $col] ]
+ if {$index < 0} {
+ lappend tabSelected(${tab},Cell) [list $row $col]
+ tableSetCellAttr ${tab} $row $col background $color
+ }
+}
+
+
+# TABLEUNSELECTROW -- Deselect the specified row.
+
+proc tableUnSelectRow { tab row } {
+ global tabSelected tabOption tabNrows
+
+ set color $tabOption(${tab},Background)
+ if {$row == "all"} {
+ for {set i 0} {$i < $tabNrows(${tab},data)} {incr i} {
+ set index [lsearch $tabSelected(${tab},Row) $i ]
+ if {$index >= 0} {
+ set tabSelected(${tab},Row) \
+ [ lreplace $tabSelected(${tab},Row) $index $index ]
+ tableSetRowAttr ${tab} $i background $color
+ tableSetRowAttr ${tab}Row $i background $color
+ }
+ }
+ } else {
+ # Delete it from the list.
+ set index [lsearch $tabSelected(${tab},Row) $row ]
+ if {$index >= 0} {
+ set tabSelected(${tab},Row) \
+ [ lreplace $tabSelected(${tab},Row) $index $index ]
+ tableSetRowAttr ${tab} $row background $color
+ tableSetRowAttr ${tab}Row $row background $color
+ }
+ }
+}
+
+
+# TABLEUNSELECTCOL -- Deselect the specified col.
+
+proc tableUnSelectCol { tab col } {
+ global tabSelected tabOption tabNrows
+
+ set color $tabOption(${tab},Background)
+ if {$col == "all"} {
+ for {set i 0} {$i < $tabNcols(${tab},data)} {incr i} {
+ set index [lsearch $tabSelected(${tab},Col) $i ]
+ if {$index >= 0} {
+ set tabSelected(${tab},Col) \
+ [ lreplace $tabSelected(${tab},Col) $index $index ]
+ tableSetColAttr ${tab} $i background $color
+ tableSetColAttr ${tab}Col $i background $color
+ }
+ }
+ } else {
+ # Delete it from the list.
+ set index [lsearch $tabSelected(${tab},Col) $col ]
+ if {$index >= 0} {
+ set tabSelected(${tab},Col) \
+ [ lreplace $tabSelected(${tab},Col) $index $index ]
+ tableSetColAttr ${tab} $col background $color
+ tableSetColAttr ${tab}Col $col background $color
+ }
+ }
+}
+
+
+# TABLEUNSELECTCELL -- Deselect the specified cell.
+
+proc tableUnSelectCell { tab col row } {
+ global tabSelected tabOption
+
+ set val [list $row $col]
+ set index [lsearch $tabSelected(${tab},Cell) $val ]
+ set color $tabOption(${tab},Background)
+
+ # Delete it from the list.
+ if {$index >= 0} {
+ set tabSelected(${tab},Cell) \
+ [ lreplace $tabSelected(${tab},Cell) $index $index ]
+ tableSetCellAttr ${tab} $row $col background $color
+ }
+}
+
+
+
+#==============================================================================
+# TABLEDIT -- Enable the cell editor
+#==============================================================================
+
+set tabEditRow 0
+set tabEditCol 0
+set tabEditValue ""
+
+set tableEditorUp 0
+
+proc tableEdit { name x y } {
+ global tabEditValue tabEditRow tabEditCol tableEditCB, tableEditorUp
+
+ regsub Tab $name "" tab
+
+ set ry [tablePos2CellY $tab $y]
+ set rx [tablePos2CellX $tab $x]
+
+ if {$rx < 0 || $ry < 0} \
+ return
+
+ set newcell 0
+ if {$tabEditRow != $rx || $tabEditCol != $ry} {
+ set newcell 1
+ }
+
+ set tabEditCol [tablePos2CellX $tab $x]
+ set tabEditRow [tablePos2CellY $tab $y]
+ set tabEditValue [tableGetCellAttr $tab $tabEditRow $tabEditCol label]
+
+ if {$tableEditorUp == 0 || $newcell == 1} {
+ send ${tab}EditApply addCallback tableEditApply
+ send ${tab}EditCancel addCallback tableEditCancel
+ send ${tab}EditClear addCallback tableEditClear
+ send ${tab}EditText addCallback tableEditLoad
+ send ${tab}EditText set string $tabEditValue
+ send ${tab}EditShell move $x [expr ($y + 50)]
+ send ${tab}EditShell map
+ set tableEditorUp 1
+ } else {
+ send ${tab}EditApply deleteCallback tableEditApply
+ send ${tab}EditCancel deleteCallback tableEditCancel
+ send ${tab}EditClear deleteCallback tableEditClear
+ send ${tab}EditText deleteCallback tableEditLoad
+ send ${tab}EditShell unmap
+ set tableEditorUp 0
+ }
+}
+
+proc tableEditApply { button args } {
+ global tabEditValue tabEditRow tabEditCol tabEditCB tabEditorUp
+ regsub EditApply $button "" tab
+
+ set str [send ${tab}EditText get string]
+
+ tableSetCellAttr $tab $tabEditRow $tabEditCol label $str
+ set tabEditValue $str
+
+ # Now do the user-defined selection callbacks.
+ if { [llength $tabEditCB(${tab})] > 0} {
+ foreach cb $tabEditCB(${tab}) {$cb $tab $tabEditRow $tabEditCol "$str"}
+ }
+
+ # Close the window.
+ send ${tab}EditApply deleteCallback tableEditApply
+ send ${tab}EditCancel deleteCallback tableEditCancel
+ send ${tab}EditClear deleteCallback tableEditClear
+ send ${tab}EditText deleteCallback tableEditLoad
+ send ${tab}EditShell unmap
+ set tableEditorUp 0
+}
+
+proc tableEditLoad { widget mode pattern args } {
+ regsub EditText $widget "" tab
+ tableEditApply ${tab}EditApply
+}
+
+proc tableEditClear { button args } {
+ global tabEditValue
+
+ regsub EditClear $button "" tab
+ send ${tab}EditText set string ""
+}
+
+proc tableEditCancel { button args } {
+ global tableEditValue tableEditorUp
+
+ regsub EditCancel $button "" tab
+ send ${tab}EditShell unmap
+ send ${tab}EditApply deleteCallback tableEditApply
+ send ${tab}EditCancel deleteCallback tableEditCancel
+ send ${tab}EditClear deleteCallback tableEditClear
+ send ${tab}EditText deleteCallback tableEditLoad
+ set tableEditorUp 0
+}
+
+
+###############################################################################
+#
+# Private Procedures
+#
+###############################################################################
+
+
+# TABLEADDCALLBACKS -- Add the default widget callbacks.
+
+proc tableAddCallbacks { tab } {
+
+ # Attach the scrollbars actions.
+ if {[ tableOption $tab RowScroll] == "yes"} {
+ send ${tab}RowScroll addCallback tableJumpScroll
+ } else {
+ send ${tab}RowScroll "unmap ; set width 0"
+ }
+
+ if {[ tableOption $tab ColScroll] == "yes"} {
+ send ${tab}ColScroll addCallback tableJumpScroll
+ } else {
+ send ${tab}Label set height 0
+ send ${tab}ColScroll "unmap ; set height 0"
+ }
+
+ if {[tableOption $tab Tracking] == "no"} {
+ send ${tab}Label set label ""
+ send ${tab}Label set width 50
+ }
+
+ # Setup a resize handler that will adjust the scrollbars/viewports.
+ send ${tab}TableFrame addEventHandler tableResizeHandler structureNotifyMask
+}
+
+
+# TABLERESIZEHANDLER -- Resize callbacks, called as an eventHandler when
+# the parent window or the table meta-widget changes size. All we need to
+# do here is reset the scrollbars to reflect the new size.
+
+proc tableResizeHandler { table args } {
+ regsub TableFrame $table "" tab
+ #tableSetDefaultScrollbars $tab no
+ tableSetDefaultScrollbars $tab yes
+}
+
+
+# TABLETRACK -- Track the motion in the table.
+
+proc tableTrack { name x y } {
+ regsub Tab $name "" tab
+ if {[ tableOption $tab Tracking] == "no"} {
+ return
+ }
+
+ set nr [tableGetNrows $tab]
+ set nc [tableGetNcols $tab]
+ set col [tablePos2CellX $tab $x]
+ set row [tablePos2CellY $tab $y]
+ if {$col < 0 || $row < 0} {
+ send ${tab}Label set label " "
+ } else {
+ send ${tab}Label set label [ format "(%3d,%3d)" $row $col ]
+ }
+}
+
+
+# TABLESELECT -- Do the default selection callback which applies to rows,
+# columns and cells.
+
+proc tableSelect { name type x y } {
+ global tabOption tabSelected tabSelectionCB tabUnSelectionCB
+
+
+ regsub Row $name "" rc
+ regsub Col $name "" cc
+
+ if {$type == "Row"} {
+ if {$rc == $name || [ tableOption $name RowSelect ] == "no"} \
+ return
+ regsub ${type}Tab $name "" tab
+ set col [tablePos2CellX $tab $x]
+ set row [tablePos2CellY $tab $y]
+ set val $row
+ } elseif {$type == "Col"} {
+ if {$cc == $name || [ tableOption $name ColSelect ] == "no"} \
+ return
+ regsub ${type}Tab $name "" tab
+ set col [tablePos2CellX $tab $x]
+ set row [tablePos2CellY $tab $y]
+ set val $col
+ } elseif {$type == "Cell"} {
+ if {$rc != $name && $cc != $name} \
+ return
+ if {[ tableOption $name CellSelect ] == "no"} \
+ return
+ regsub Tab $name "" tab
+ set col [tablePos2CellX $tab $x]
+ set row [tablePos2CellY $tab $y]
+ set val [list $row $col]
+ }
+
+ if {$col < 0 || $row < 0} \
+ return
+
+ set index [ lsearch $tabSelected(${tab},${type}) $val ]
+ set color $tabOption(${tab},HighlightColor)
+
+ # If we're doing a radio selection, turn off anything already selected.
+
+ if {[ tableOption $tab ${type}MultiSelect] == "no"} {
+ if { [llength $tabSelected(${tab},${type})] == 1} {
+ tableSet${type}Attr ${tab} \
+ [lindex $tabSelected(${tab},${type}) 0] \
+ background $tabOption(${tab},Background)
+ tableSet${type}Attr ${tab}${type} \
+ [lindex $tabSelected(${tab},${type}) 0] \
+ background $tabOption(${tab},Background)
+
+ # Now do the user-defined un-selection callbacks.
+ if { [llength $tabUnSelectionCB(${tab},${type})] > 0} {
+ foreach cb $tabUnSelectionCB(${tab},${type}) {
+ $cb $tab $row $col $x $y 0
+ }
+ }
+
+ set tabSelected(${tab},${type}) [list $val ]
+
+ if {$type == "Row"} {
+ foreach c $tabSelected(${tab},Col) {
+ tableSetColAttr ${tab} $c background $color
+ }
+ } elseif {$type == "Col"} {
+ foreach c $tabSelected(${tab},Row) {
+ tableSetRowAttr ${tab} $c background $color
+ }
+ }
+ } else {
+ lappend tabSelected(${tab},${type}) $val
+ }
+ } else {
+ if { $index < 0} {
+ lappend tabSelected(${tab},${type}) $val
+ }
+ }
+
+ # If this has already been selected, toggle it.
+ if { $index >= 0} {
+ if {$type != "Cell"} {
+ tableSet${type}Attr ${tab} \
+ [lindex $tabSelected(${tab},${type}) $index] \
+ background $tabOption(${tab},Background)
+ tableSet${type}Attr ${tab}${type} \
+ [lindex $tabSelected(${tab},${type}) $index] \
+ background $tabOption(${tab},Background)
+
+ # Now do the user-defined un-selection callbacks.
+ if { [llength $tabUnSelectionCB(${tab},${type})] > 0} {
+ foreach cb $tabUnSelectionCB(${tab},${type}) {
+ $cb $tab $row $col $x $y 0
+ }
+ }
+
+ } else {
+ tableSet${type}Attr ${tab} \
+ $row $col background $tabOption(${tab},Background)
+
+ # Now do the user-defined selection callbacks.
+ if { [llength $tabUnSelectionCB(${tab},${type})] > 0} {
+ foreach cb $tabUnSelectionCB(${tab},${type}) {
+ $cb $tab $row $col $x $y 0
+ }
+ }
+ }
+
+ # Delete it from the list
+ set tabSelected(${tab},${type}) \
+ [ lreplace $tabSelected(${tab},${type}) $index $index ]
+
+ # Go back and re-select the row/col intersection but don't
+ # generate an event for it, purely cosmetic.
+ if {$type == "Row"} {
+ foreach c $tabSelected(${tab},Col) {
+ tableSetColAttr ${tab} $c background $color
+ }
+ } elseif {$type == "Col"} {
+ foreach c $tabSelected(${tab},Row) {
+ tableSetRowAttr ${tab} $c background $color
+ }
+ }
+
+ } else {
+
+ # Highlight the selected item.
+ if {$type != "Cell"} {
+ tableSet${type}Attr ${tab} $val background $color
+ tableSet${type}Attr ${tab}${type} $val background $color
+ } else {
+ tableSet${type}Attr ${tab} $row $col background $color
+ }
+
+ # Now do the user-defined selection callbacks.
+ if { [llength $tabSelectionCB(${tab},${type})] > 0} {
+ foreach cb $tabSelectionCB(${tab},${type}) {
+ $cb $tab $row $col $x $y 1
+ }
+ }
+ }
+}
+
+
+# TABLESETDEFAULTLABELS -- Set the default labels for the table, i.e. letters
+# for columns headings and numbers for the row labels.
+#
+# Usage:
+# tableSetDefaultLabels <tab>
+
+proc tableSetDefaultLabels { tab } {
+ # Set the default Row labels, i.e numbers
+ tableSetDefaultRowLabels $tab
+
+ # Now set the default Column Labels, i.e. letters
+ tableSetDefaultColLabels $tab
+}
+
+
+# TABLESETDEFAULTTRANSLATIONS -- Set the default translations for the widget.
+
+proc tableSetDefaultTranslations { tab } {
+
+ if {[ tableOption $tab DefaultTranslations ] == "no"} {
+ return
+ }
+
+ # Set the coord tracking translations.
+ set trans1 ""
+ if {[ tableOption $tab Tracking ] == "yes"} {
+ set trans1 { \
+ <Motion>:call(tableTrack,$name,$x,$y)
+ }
+ }
+
+ set trans2 ""
+ if {[ tableOption $tab CellSelect ] == "yes"} {
+ set trans2 { \
+ <Btn1Down>:call(tableSelect,$name,Cell,$x,$y)
+ }
+ }
+
+ set trans3 ""
+ if {[ tableOption $tab Editable ] == "yes"} {
+ set trans3 { \
+ <Btn3Down>:call(tableEdit,$name,$x,$y)
+ }
+ }
+ set trans "$trans1 $trans2 $trans3"
+ send ${tab}Tab set translations $trans
+
+
+ # Set the row-selectable translations.
+ if {[ tableOption $tab RowSelect ] == "yes"} {
+ send ${tab}RowTab set translations \
+ "<Btn1Down>: call(tableSelect,\$name,Row,\$x,\$y)"
+ }
+
+ # Set the col-selectable translations.
+ if {[ tableOption $tab ColSelect ] == "yes"} {
+ send ${tab}ColTab set translations \
+ "<Btn1Down>: call(tableSelect,\$name,Col,\$x,\$y)"
+ }
+}
+
+
+# TABLESETDEFAULTSCROLLBARS -- Set the default scrollbar position and size
+# in the meta-widget.
+
+proc tableSetDefaultScrollbars { tab init } {
+ global tabHeight tabWidth tabScrollSize tabScrollPos tabDebug
+ global tabNcols tabNrows tabColWidths
+
+
+ set visW [ send ${tab}TabView get width]
+ set visH [ send ${tab}TabView get height]
+ set rh [ send ${tab}Tab get rowHeight]
+ set sw [ send ${tab}Tab get shadowWidth]
+ set th [expr ($tabNrows(${tab},data) * ($rh + (2 * $sw)) )]
+ set tw 0
+ for {set i 1} {$i <= $tabNcols(${tab},data)} {incr i} {
+ set w $tabColWidths(${tab},$i)
+ set tw [ expr ($tw + $w + (2 * $sw)) ]
+ }
+ set rowS [max 0.0 [min 1.0 [expr (double($visH)/double($th)) ]]]
+ set colS [max 0.0 [min 1.0 [expr (double($visW)/double($tw)) ]]]
+#print "defScroll: data visW=$visW visH=$visH th=$th tw=$tw"
+#print "defScroll: ($tab,$init) rowS = $rowS colS = $colS"
+
+ set tabScrollSize($tab,row) $rowS
+ set tabScrollSize($tab,col) $colS
+ set tabScrollPos($tab,row) 0.0
+ set tabScrollPos($tab,col) 0.0
+
+ if {[ tableOption $tab RowScroll] == "yes"} {
+ send ${tab}RowScroll setScrollbar 0.0 $tabScrollSize($tab,row)
+ }
+ if {[ tableOption $tab ColScroll] == "yes"} {
+ send ${tab}ColScroll setScrollbar 0.0 $tabScrollSize($tab,col)
+ }
+
+ if {$init == "yes"} {
+ send ${tab}TabView setLocation 0.0 0.0
+ send ${tab}ColTabView setLocation 0.0 0.0
+ send ${tab}RowTabView setLocation 0.0 0.0
+ }
+}
+
+
+# TABLEJUMPSCROLL -- Scroll the specified table. This scrolls both the
+# data and row/column label tables.
+
+proc tableJumpScroll { widget cbtype pos } {
+ global scrollHeight tabWidth tabHeight tabDebug
+ global tabScrollSize tabScrollPos tabDebug
+
+ if {$pos < 0.01} {
+ set pos 0.0
+ }
+
+ if { [string match *ColScroll $widget] } {
+ regsub ColScroll $widget "" tab
+ set y $tabScrollPos($tab,row)
+ send ${tab}TabView setLocation $pos $y
+ send ${tab}ColTabView setLocation $pos 0.0
+ set tabScrollPos($tab,col) $pos
+
+ } elseif { [string match *RowScroll $widget] } {
+ regsub RowScroll $widget "" tab
+ set x $tabScrollPos($tab,col)
+ send ${tab}TabView setLocation $x $pos
+ send ${tab}RowTabView setLocation 0.0 $pos
+ set tabScrollPos($tab,row) $pos
+ }
+}
+
+
+# TABLEOPTION -- Return any defined table option.
+
+proc tableOption { tab option } {
+ global tabOption
+
+ set val yes
+ catch {
+ if {[info exists tabOption(${tab},${option}) ]} {
+ if { $tabOption(${tab},${option}) } {
+ set val yes
+ } else {
+ set val no
+ }
+ }
+ } err
+
+ return $val
+}
+
+
+# TABLEPOS2CELLX -- Convert a widget position to a cell column number.
+
+proc tablePos2CellX { tab x } {
+ global tabColWidths tabNcols
+
+ set nc [ tableGetNcols $tab ]
+ set cellX 1
+ for {set w 0} {$w < $x && $cellX <= $nc} {incr cellX} {
+ set w [ expr ($w + $tabColWidths($tab,$cellX) + 3) ]
+ }
+ if {$x > $w} {
+ return -1
+ } else {
+ return [ min [incr cellX -1] $tabNcols(${tab},data) ]
+ }
+}
+
+# TABLEPOS2CELLY -- Convert a widget position to a cell row number.
+
+proc tablePos2CellY { tab y } {
+ global tabRowHeights tabNrows
+
+ set nr [ tableGetNrows $tab ]
+ set cellY 1
+ for {set h 0} {$h < $y && $cellY <= $nr} {incr cellY} {
+ set h [ expr ($h + $tabRowHeights($tab,$cellY)) + 2 ]
+ }
+ if {$y > $h} {
+ return -1
+ } else {
+ return [ min [incr cellY -1] $tabNrows(${tab},data) ]
+ }
+}
+
+
+# TABLESETDEFAULTROWLABELS -- Utility to set the default row labels.
+
+proc tableSetDefaultRowLabels { tab args } {
+ global tabNrows tabOption
+
+ # Set the default Row labels, i.e numbers
+ set rowlabs {}
+ for {set i 1} {$i <= $tabNrows(${tab},data)} {incr i} {
+ if {[ tableOption $tab DefLabels ] == "yes"} {
+ lappend rowlabs $i
+ } else {
+ lappend rowlabs {}
+ }
+ }
+ if {[ tableOption $tab RowLabels ] == "yes"} {
+ send ${tab}RowTab setTable $tabNrows(${tab},data) \
+ $tabOption(${tab},RowLabelCols) $rowlabs
+ set cw [send ${tab}RowTab get defaultWidth]
+ send ${tab}RowTabView set width \
+ [expr ($tabOption(${tab},RowLabelCols) * $cw)]
+ } else {
+ send ${tab}RowTab set width 0
+ }
+}
+
+
+# TABLESETDEFAULTCOLLABELS -- Utility to set the default columns labels.
+
+proc tableSetDefaultColLabels { tab args } {
+ global tabNcols tabOption
+
+ # Now set the default Column Labels, i.e. letters
+ set collabs ""
+ set j 65
+ for {set i 1} {$i <= $tabNcols(${tab},data)} {incr i} {
+ if {[ tableOption $tab DefLabels ] == "yes"} {
+ if {$j > 90} {
+ set j 97
+ set collabs [ format "%s { %c } " $collabs $j ]
+ } elseif {$j > 122} {
+ set j 1
+ set collabs [ format "%s { %d } " $collabs $j ]
+ } else {
+ set collabs [ format "%s { %c } " $collabs $j ]
+ }
+ incr j
+ } else {
+ lappend collabs {}
+ }
+ }
+ if {[ tableOption $tab ColLabels ] == "yes"} {
+ send ${tab}ColTab setTable $tabOption(${tab},ColLabelRows) \
+ $tabNcols(${tab},data) [ list $collabs ]
+ send ${tab}ColTabView set height \
+ [expr ($tabOption(${tab},ColLabelRows) * 21)]
+ send ${tab}Spacer1 set height \
+ [expr ($tabOption(${tab},ColLabelRows) * 24)]
+ send ${tab}Spacer2 set height \
+ [expr ($tabOption(${tab},ColLabelRows) * 24)]
+ } else {
+ send ${tab}ColTab set height 0
+ }
+}
+
+
+################################################################################
+
+
+################################################################################
+
+
+
+activate
+
+
+appExtend {
+ *tclObjects:\
+ toplevel TopLevelShell tcl_panel\
+ tcl_panel Layout tclLayout\
+ tclLayout Group tclCmdGroup\
+ tclCmdGroup Layout tclCmd\
+ tclCmd Command tclClear\
+ tclCmd Command tclExecute\
+ tclCmd Command tclDismiss\
+ tclLayout Frame tclFrame\
+ tclFrame AsciiText tclEntry
+
+
+ !--------------------------------
+ ! Define a debug Tcl shell.
+ !--------------------------------
+ *tcl_panel.width: 550
+ *tcl_panel.height: 180
+ *tcl_panel.title: Debug TCL Command Entry
+ *tclLayout*borderWidth: 0
+ *tclLayout*shrinkToFit: True
+ *tclLayout*Frame.frameType: sunken
+ *tclLayout*Frame.frameWidth: 2
+ *tclLayout.layout: vertical { \
+ tclCmdGroup < +inf -inf * > \
+ tclFrame < +inf -inf * +inf -inf> \
+ }
+ *tclEntry*foreground: black
+ *tclEntry*editType: edit
+ *tclEntry*type: string
+ *tclEntry*font: 7x13
+ *tclEntry*scrollVertical: Always
+ *tclEntry*scrollHorizontal: whenNeeded
+
+ *tclCmdGroup.label:
+ *tclCmdGroup.outerOffset: 0
+ *tclCmdGroup.innerOffset: 0
+ *tclCmd.layout: vertical { \
+ 5 \
+ horizontal { 5 tclClear 3 tclExecute 10 < +inf -10> tclDismiss 5 } \
+ 5 \
+ }
+ *tclClear.label: Clear
+ *tclExecute.label: Execute
+ *tclDismiss.label: Dismiss
+
+} ; createObjects tclObjects
+
+
+
+################################################
+# Define some TCL debug procedures.
+################################################
+
+proc tclCommandClear {widget args} {
+ send tclEntry set string ""
+} ; send tclClear addCallback tclCommandClear
+
+proc tclCommandExecute {widget args} {
+ send server [send tclEntry {get string}]
+} ; send tclExecute addCallback tclCommandExecute
+
+proc tclCommand {widget mode command args} {
+ send server $command
+} ; send tclEntry addCallback tclCommand
+
+proc tclClose {widget args} {
+ send tcl_panel unmap
+} ; send tclDismiss addCallback tclClose
+
+send tclShell addCallback "send tcl_panel map"
+