can't create procedure "tablelist::extendConfigSpecs": unknown namespace
while executing
"proc tablelist::extendConfigSpecs {} {
variable usingTile
variable helpLabel
variable configSpecs
variable winSys
#
# Extend ..."
(in namespace eval "::request" script line 12)
invoked from within
"namespace eval ::request $script"
("::try" body line 12)
OUTPUT BUFFER:
#==============================================================================
# Contains private configuration procedures for tablelist widgets.
#
# Copyright (c) 2000-2020 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================
#------------------------------------------------------------------------------
# tablelist::extendConfigSpecs
#
# Extends the elements of the array configSpecs.
#------------------------------------------------------------------------------
proc tablelist::extendConfigSpecs {} {
variable usingTile
variable helpLabel
variable configSpecs
variable winSys
#
# Extend some elements of the array configSpecs
#
lappend configSpecs(-acceptchildcommand) {}
lappend configSpecs(-acceptdropcommand) {}
lappend configSpecs(-activestyle) frame
lappend configSpecs(-autofinishediting) 0
lappend configSpecs(-autoscan) 1
lappend configSpecs(-collapsecommand) {}
lappend configSpecs(-colorizecommand) {}
lappend configSpecs(-columns) {}
lappend configSpecs(-columntitles) {}
lappend configSpecs(-customdragsource) 0
lappend configSpecs(-displayondemand) 1
lappend configSpecs(-editendcommand) {}
lappend configSpecs(-editselectedonly) 0
lappend configSpecs(-editstartcommand) {}
lappend configSpecs(-expandcommand) {}
lappend configSpecs(-forceeditendcommand) 0
lappend configSpecs(-fullseparators) 0
lappend configSpecs(-incrarrowtype) up
lappend configSpecs(-instanttoggle) 0
lappend configSpecs(-labelcommand) {}
lappend configSpecs(-labelcommand2) {}
lappend configSpecs(-labelrelief) raised
lappend configSpecs(-listvariable) {}
lappend configSpecs(-movablecolumns) 0
lappend configSpecs(-movablerows) 0
lappend configSpecs(-populatecommand) {}
lappend configSpecs(-protecttitlecolumns) 0
lappend configSpecs(-resizablecolumns) 1
lappend configSpecs(-selectfiltercommand) {}
lappend configSpecs(-selecttype) row
lappend configSpecs(-setfocus) 1
lappend configSpecs(-showarrow) 1
lappend configSpecs(-showbusycursor) 1
lappend configSpecs(-showeditcursor) 1
lappend configSpecs(-showhorizseparator) 1
lappend configSpecs(-showlabels) 1
lappend configSpecs(-showseparators) 0
lappend configSpecs(-snipstring) ...
lappend configSpecs(-sortcommand) {}
lappend configSpecs(-spacing) 0
lappend configSpecs(-stretch) {}
lappend configSpecs(-stripebackground) {}
lappend configSpecs(-stripeforeground) {}
lappend configSpecs(-stripeheight) 1
lappend configSpecs(-targetcolor) black
lappend configSpecs(-tight) 0
lappend configSpecs(-titlecolumns) 0
lappend configSpecs(-tooltipaddcommand) {}
lappend configSpecs(-tooltipdelcommand) {}
lappend configSpecs(-treecolumn) 0
lappend configSpecs(-xmousewheelwindow) {}
lappend configSpecs(-ymousewheelwindow) {}
#
# Append the default values of the configuration options
# of a temporary, invisible listbox widget to the values
# of the corresponding elements of the array configSpecs
#
set helpListbox .__helpListbox
for {set n 2} {[winfo exists $helpListbox]} {incr n} {
set helpListbox .__helpListbox$n
}
listbox $helpListbox
foreach configSet [$helpListbox configure] {
if {[llength $configSet] != 2} {
set opt [lindex $configSet 0]
if {[arrElemExists configSpecs $opt]} {
lappend configSpecs($opt) [lindex $configSet 3]
}
}
}
destroy $helpListbox
set helpLabel .__helpLabel
for {set n 2} {[winfo exists $helpLabel]} {incr n} {
set helpLabel .__helpLabel$n
}
if {$usingTile} {
foreach opt {-highlightbackground -highlightcolor -highlightthickness
-labelactivebackground -labelactiveforeground
-labelbackground -labelbg -labeldisabledforeground
-labelheight} {
unset configSpecs($opt)
}
#
# Append theme-specific values to some elements of the
# array configSpecs and initialize some tree resources
#
if {[string compare [mwutil::currentTheme] "tileqt"] == 0} {
tileqt_kdeStyleChangeNotification
}
setThemeDefaults
variable themeDefaults
set treeStyle $themeDefaults(-treestyle)
${treeStyle}TreeImgs
variable maxIndentDepths
set maxIndentDepths($treeStyle) 0
ttk::label $helpLabel -takefocus 0
#
# Define the header label layout
#
style theme settings "default" {
style layout TablelistHeader.TLabel {
Treeheading.cell
Treeheading.border -children {
Label.padding -children {
Label.label
}
}
}
}
if {[string length [package provide ttk::theme::aqua]] != 0 ||
[string length [package provide tile::theme::aqua]] != 0} {
style theme settings "aqua" {
if {[info exists ::tile::patchlevel] &&
[string compare $::tile::patchlevel "0.6.4"] < 0} {
style layout TablelistHeader.TLabel {
Treeheading.cell
Label.padding -children {
Label.label -side top
Separator.hseparator -side bottom
}
}
} else {
style layout TablelistHeader.TLabel {
Treeheading.cell
Label.padding -children {
Label.label -side top
}
}
}
style map TablelistHeader.TLabel -foreground [list \
{disabled background} #a3a3a3 disabled #a3a3a3 \
background black]
#
# Determine the value of the variable newAquaSupport
#
set helpHdrLabel .__helpHdrLabel
for {set n 2} {[winfo exists $helpHdrLabel]} {incr n} {
set helpHdrLabel .__helpHdrLabel$n
}
ttk::label $helpHdrLabel -style TablelistHeader.TLabel
variable newAquaSupport \
[expr {[winfo reqheight $helpHdrLabel] == 24}]
destroy $helpHdrLabel
}
}
} else {
if {$::tk_version < 8.3} {
unset configSpecs(-acceptchildcommand)
unset configSpecs(-collapsecommand)
unset configSpecs(-expandcommand)
unset configSpecs(-populatecommand)
unset configSpecs(-titlecolumns)
unset configSpecs(-treecolumn)
unset configSpecs(-treestyle)
}
#
# Append the default values of some configuration options
# of an invisible label widget to the values of the
# corresponding -label* elements of the array configSpecs
#
tk::label $helpLabel -takefocus 0
foreach optTail {font height} {
set configSet [$helpLabel configure -$optTail]
lappend configSpecs(-label$optTail) [lindex $configSet 3]
}
if {[catch {$helpLabel configure -activebackground} configSet1] == 0 &&
[catch {$helpLabel configure -activeforeground} configSet2] == 0} {
lappend configSpecs(-labelactivebackground) [lindex $configSet1 3]
lappend configSpecs(-labelactiveforeground) [lindex $configSet2 3]
} else {
unset configSpecs(-labelactivebackground)
unset configSpecs(-labelactiveforeground)
}
if {[catch {$helpLabel configure -disabledforeground} configSet] == 0} {
lappend configSpecs(-labeldisabledforeground) [lindex $configSet 3]
} else {
unset configSpecs(-labeldisabledforeground)
}
if {[string compare $winSys "win32"] == 0 &&
$::tcl_platform(osVersion) < 5.1} {
lappend configSpecs(-labelpady) 0
} else {
set configSet [$helpLabel configure -pady]
lappend configSpecs(-labelpady) [lindex $configSet 3]
}
#
# Steal the default values of some configuration
# options from a temporary, invisible button widget
#
set helpButton .__helpButton
for {set n 2} {[winfo exists $helpButton]} {incr n} {
set helpButton .__helpButton$n
}
button $helpButton
foreach opt {-disabledforeground -state} {
if {[llength $configSpecs($opt)] == 3} {
set configSet [$helpButton configure $opt]
lappend configSpecs($opt) [lindex $configSet 3]
}
}
foreach optTail {background foreground} {
set configSet [$helpButton configure -$optTail]
lappend configSpecs(-label$optTail) [lindex $configSet 3]
}
if {[string compare $winSys "classic"] == 0 ||
[string compare $winSys "aqua"] == 0} {
lappend configSpecs(-labelborderwidth) 1
} else {
set configSet [$helpButton configure -borderwidth]
lappend configSpecs(-labelborderwidth) [lindex $configSet 3]
}
destroy $helpButton
#
# Set the default values of the -arrowcolor,
# -arrowdisabledcolor, -arrowstyle, and -treestyle options
#
switch $winSys {
x11 {
set arrowColor black
set arrowDisabledColor #a3a3a3
set arrowStyle [defaultX11ArrowStyle]
set treeStyle gtk
}
win32 {
if {$::tcl_platform(osVersion) < 5.1} { ;# Win native
set arrowColor {}
set arrowDisabledColor {}
set arrowStyle sunken8x7
set treeStyle winnative
} elseif {$::tcl_platform(osVersion) == 5.1} { ;# Win XP
switch [winfo rgb . SystemHighlight] {
"12593 27242 50629" { ;# Win XP Blue
set arrowColor #aca899
set arrowStyle flat9x5
set treeStyle winxpBlue
}
"37779 41120 28784" { ;# Win XP Olive
set arrowColor #aca899
set arrowStyle flat9x5
set treeStyle winxpOlive
}
"45746 46260 49087" { ;# Win XP Silver
set arrowColor #aca899
set arrowStyle flat9x5
set treeStyle winxpSilver
}
default { ;# Win Classic
set arrowColor SystemButtonShadow
set arrowStyle flat7x4
set treeStyle winnative
}
}
set arrowDisabledColor SystemDisabledText
} elseif {$::tcl_platform(osVersion) == 6.0} { ;# Win Vista
switch [winfo rgb . SystemHighlight] {
"13107 39321 65535" { ;# Vista Aero
set arrowColor #569bc0
set arrowStyle photo[defaultWinArrowSize]
set treeStyle vistaAero
}
default { ;# Win Classic
set arrowColor SystemButtonShadow
set arrowStyle flat[defaultWinArrowSize]
set treeStyle vistaClassic
}
}
set arrowDisabledColor SystemDisabledText
} elseif {$::tcl_platform(osVersion) < 10.0} { ;# Win 7/8
switch [winfo rgb . SystemHighlight] {
"13107 39321 65535" { ;# Win 7/8 Aero
set arrowColor #569bc0
set arrowStyle photo[defaultWinArrowSize]
set treeStyle win7Aero
}
default { ;# Win Classic
set arrowColor SystemButtonShadow
set arrowStyle flat[defaultWinArrowSize]
set treeStyle win7Classic
}
}
set arrowDisabledColor SystemDisabledText
} else { ;# Win 10
set arrowColor #595959
set arrowDisabledColor SystemDisabledText
set arrowStyle flatAngle[defaultWinArrowSize]
set treeStyle win10
}
}
classic -
aqua {
scan $::tcl_platform(osVersion) "%d" majorOSVersion
if {$majorOSVersion >= 14} { ;# OS X 10.10 or higher
set arrowColor #404040
set arrowStyle flatAngle7x4
} else {
set arrowColor #777777
variable pngSupported
if {$pngSupported} {
set arrowStyle photo7x7
} else {
set arrowStyle flat7x7
}
}
set arrowDisabledColor #a3a3a3
set treeStyle aqua
}
}
lappend configSpecs(-arrowcolor) $arrowColor
lappend configSpecs(-arrowdisabledcolor) $arrowDisabledColor
lappend configSpecs(-arrowstyle) $arrowStyle
if {$::tk_version >= 8.3} {
lappend configSpecs(-treestyle) $treeStyle
${treeStyle}TreeImgs
variable maxIndentDepths
set maxIndentDepths($treeStyle) 0
}
}
#
# Set the default values of the -movecolumncursor,
# -movecursor, and -resizecursor options
#
switch $winSys {
aqua {
set movecolumnCursor closedhand
set moveCursor pointinghand
if {[catch {$helpLabel configure -cursor resizeleftright}] == 0} {
set resizeCursor resizeleftright
} else {
set resizeCursor sb_h_double_arrow
}
}
default {
set movecolumnCursor icon
set moveCursor hand2
set resizeCursor sb_h_double_arrow
}
}
lappend configSpecs(-movecolumncursor) $movecolumnCursor
lappend configSpecs(-movecursor) $moveCursor
lappend configSpecs(-resizecursor) $resizeCursor
variable centerArrows 0
if {[string compare $winSys "win32"] == 0 &&
($::tcl_platform(osVersion) >= 10.0 ||
($::tcl_platform(osVersion) >= 6.0 &&
[string compare [winfo rgb . SystemHighlight] \
"13107 39321 65535"] == 0))} { ;# Win 7/8 Aero
set centerArrows 1
}
}
#------------------------------------------------------------------------------
# tablelist::doConfig
#
# Applies the value val of the configuration option opt to the tablelist widget
# win.
#------------------------------------------------------------------------------
proc tablelist::doConfig {win opt val} {
variable usingTile
variable helpLabel
variable configSpecs
upvar ::tablelist::ns${win}::data data
#
# Apply the value to the widget(s) corresponding to the given option
#
switch [lindex $configSpecs($opt) 2] {
c {
#
# Apply the value to all children and save the
# properly formatted value of val in data($opt)
#
foreach w [winfo children $win] {
if {[regexp {^(body|hdr|.sep[0-9]*)$} [winfo name $w]]} {
$w configure $opt $val
}
}
foreach w [list $data(hdrTxt) $data(hdrFrmLbl) \
$data(cornerFrm-ne) $data(cornerLbl) \
$data(cornerFrm-sw)] {
$w configure $opt $val
}
foreach w [winfo children $data(hdrTxtFrm)] {
$w configure $opt $val
}
set data($opt) [$data(hdrFrmLbl) cget $opt]
}
b {
#
# Apply the value to both text widgets and save the
# properly formatted value of val in data($opt)
#
$data(hdrTxt) configure $opt $val
set w $data(body)
$w configure $opt $val
set data($opt) [$w cget $opt]
switch -- $opt {
-background {
#
# Apply the value to the frame (because of the shadow
# colors of its 3-D border), to the separators,
# to the header frame, and to the "disabled" tag
#
if {$usingTile} {
styleConfig Frame$win.TFrame $opt $val
styleConfig Seps$win.TSeparator $opt $val
} else {
$win configure $opt $val
foreach c [winfo children $win] {
if {[regexp {^(vsep[0-9]+|hsep2)$} \
[winfo name $c]]} {
$c configure $opt $val
}
}
}
$data(cornerFrm-ne) configure $opt $val
$data(hdr) configure $opt $val
$data(hdrTxt) tag configure disabled $opt $val
$w tag configure disabled $opt $val
hdr_updateColorsWhenIdle $win
updateColorsWhenIdle $win
}
-font {
#
# Apply the value to the listbox child, rebuild the lists
# of the column fonts and tag names, configure the edit
# window if present, set up and adjust the columns, and
# make sure the items will be redisplayed at idle time
#
$data(lb) configure $opt $val
set data(charWidth) [font measure $val -displayof $win 0]
makeColFontAndTagLists $win
if {$data(editRow) >= 0} {
setEditWinFont $win
}
for {set col 0} {$col < $data(colCount)} {incr col} {
if {$data($col-maxwidth) > 0} {
set data($col-maxPixels) \
[charsToPixels $win $val $data($col-maxwidth)]
}
}
setupColumns $win $data(-columns) 0
adjustColumns $win allCols 1
redisplayWhenIdle $win
updateViewWhenIdle $win
}
-foreground {
#
# Set the background color of the main separators
# (if any) to the specified value, and apply
# this value to the "disabled" tag if needed
#
if {$usingTile} {
styleConfig Main$win.TSeparator -background $val
} else {
if {[winfo exists $data(vsep)]} {
$data(vsep) configure -background $val
}
if {[winfo exists $data(hsep)1]} {
$data(hsep)1 configure -background $val
}
}
if {[string length $data(-disabledforeground)] == 0} {
$data(hdrTxt) tag configure disabled $opt $val
$w tag configure disabled $opt $val
}
hdr_updateColorsWhenIdle $win
updateColorsWhenIdle $win
}
}
}
l {
#
# Apply the value to all not individually configured labels
# and save the properly formatted value of val in data($opt)
#
set optTail [string range $opt 6 end] ;# remove the -label
configLabel $data(hdrFrmLbl) -$optTail $val
configLabel $data(cornerLbl) -$optTail $val
for {set col 0} {$col < $data(colCount)} {incr col} {
set w $data(hdrTxtFrmLbl)$col
if {![arrElemExists data $col$opt]} {
configLabel $w -$optTail $val
}
}
if {$usingTile && [string compare $opt "-labelpady"] == 0} {
set data($opt) $val
} else {
set data($opt) [$data(hdrFrmLbl) cget -$optTail]
}
switch -- $opt {
-labelbackground -
-labelforeground {
#
# Conditionally apply the value to the
# canvases displaying up- or down-arrows
#
$helpLabel configure -$optTail $val
set data($opt) [$helpLabel cget -$optTail]
foreach col $data(arrowColList) {
if {![arrElemExists data $col$opt]} {
configCanvas $win $col
}
}
}
-labelborderwidth {
#
# Adjust the columns (including
# the height of the header frame)
#
adjustColumns $win allLabels 1
updateViewWhenIdle $win
set borderWidth [winfo pixels $win $data($opt)]
if {$borderWidth < 0} {
set borderWidth 0
}
place configure $data(cornerLbl) -x -$borderWidth \
-width [expr {2*$borderWidth}]
}
-labeldisabledforeground {
#
# Conditionally apply the value to the
# canvases displaying up- or down-arrows
#
foreach col $data(arrowColList) {
if {![arrElemExists data $col$opt]} {
configCanvas $win $col
}
}
}
-labelfont -
-labelpady {
#
# Adjust the columns (including
# the height of the header frame)
#
adjustColumns $win allLabels 1
updateViewWhenIdle $win
}
-labelheight {
#
# Adjust the height of the header frame
#
adjustHeaderHeight $win
}
}
}
f {
#
# Apply the value to the frame and save the
# properly formatted value of val in data($opt)
#
$win configure $opt $val
set data($opt) [$win cget $opt]
}
w {
switch -- $opt {
-acceptchildcommand -
-acceptdropcommand -
-collapsecommand -
-colorizecommand -
-editendcommand -
-editstartcommand -
-expandcommand -
-labelcommand -
-labelcommand2 -
-populatecommand -
-selectfiltercommand -
-selectmode -
-sortcommand -
-tooltipaddcommand -
-tooltipdelcommand {
set data($opt) $val
}
-activestyle {
#
# Configure the "active" tag and save the
# properly formatted value of val in data($opt)
#
variable activeStyles
set val [mwutil::fullOpt "active style" $val $activeStyles]
set w $data(body)
switch $val {
frame {
$w tag configure active \
-borderwidth 1 -relief solid -underline ""
}
none {
$w tag configure active \
-borderwidth "" -relief "" -underline ""
}
underline {
$w tag configure active \
-borderwidth "" -relief "" -underline 1
}
}
set data($opt) $val
}
-arrowcolor -
-arrowdisabledcolor {
#
# Save the properly formatted value of val in data($opt)
# and set the color of the normal or disabled arrows
#
if {[string length $val] == 0} {
set data($opt) ""
} else {
$helpLabel configure -foreground $val
set data($opt) [$helpLabel cget -foreground]
}
if {([string compare $opt "-arrowcolor"] == 0 &&
!$data(isDisabled)) ||
([string compare $opt "-arrowdisabledcolor"] == 0 &&
$data(isDisabled))} {
foreach w [info commands $data(hdrTxtFrmCanv)*] {
fillArrows $w $val $data(-arrowstyle)
}
}
}
-arrowstyle {
#
# Save the properly formatted value of val in data($opt)
# and draw the corresponding arrows in the canvas widgets
#
variable arrowStyles
set data($opt) \
[mwutil::fullOpt "arrow style" $val $arrowStyles]
regexp {^(flat|flatAngle|sunken|photo)([0-9]+)x([0-9]+)$} \
$data($opt) dummy relief width height
set data(arrowWidth) $width
set data(arrowHeight) $height
foreach w [info commands $data(hdrTxtFrmCanv)*] {
createArrows $w $width $height $relief
if {$data(isDisabled)} {
fillArrows $w $data(-arrowdisabledcolor) $data($opt)
} else {
fillArrows $w $data(-arrowcolor) $data($opt)
}
}
if {[llength $data(arrowColList)] > 0} {
foreach col $data(arrowColList) {
raiseArrow $win $col
lappend whichWidths l$col
}
adjustColumns $win $whichWidths 1
updateViewWhenIdle $win
}
}
-autofinishediting -
-autoscan -
-customdragsource -
-displayondemand -
-forceeditendcommand -
-instanttoggle -
-movablecolumns -
-movablerows -
-protecttitlecolumns -
-resizablecolumns -
-setfocus -
-showbusycursor {
#
# Save the boolean value specified by val in data($opt)
#
set data($opt) [expr {$val ? 1 : 0}]
}
-columns {
#
# Set up and adjust the columns, rebuild
# the lists of the column fonts and tag
# names, and redisplay the items
#
setupColumns $win $val 1
adjustColumns $win allCols 1
adjustColIndex $win data(anchorCol) 1
adjustColIndex $win data(activeCol) 1
makeColFontAndTagLists $win
redisplay $win
updateViewWhenIdle $win
}
-columntitles {
set titleCount [llength $val]
set colCount $data(colCount)
if {$titleCount <= $colCount} {
#
# Update the first titleCount column
# titles and adjust the columns
#
set whichWidths {}
for {set col 0} {$col < $titleCount} {incr col} {
set idx [expr {3*$col + 1}]
set data(-columns) [lreplace $data(-columns) \
$idx $idx [lindex $val $col]]
lappend whichWidths l$col
}
adjustColumns $win $whichWidths 1
updateViewWhenIdle $win
} else {
#
# Update the titles of the current columns,
# extend the column list, and do nearly the
# same as in the case of the -columns option
#
set columns {}
set col 0
foreach {width title alignment} $data(-columns) {
lappend columns $width [lindex $val $col] $alignment
incr col
}
for {} {$col < $titleCount} {incr col} {
lappend columns 0 [lindex $val $col] left
}
setupColumns $win $columns 1
adjustColumns $win allCols 1
makeColFontAndTagLists $win
redisplay $win
updateViewWhenIdle $win
#
# If this option is being set at widget creation time
# then append "-columns" to the list of command line
# options processed by the caller proc, to make sure
# that the columns-related information produced by the
# setupColumns call above won't be overridden by the
# default -columns {} option that would otherwise
# be processed as a non-explicitly specified option
#
set callerProc [lindex [info level -1] 0]
if {[string compare $callerProc \
"mwutil::configureWidget"] == 0} {
uplevel 1 lappend cmdLineOpts "-columns"
}
}
}
-disabledforeground {
#
# Configure the "disabled" tag in both text widgets and
# save the properly formatted value of val in data($opt)
#
set w $data(body)
if {[string length $val] == 0} {
foreach w [list $data(hdrTxt) $data(body)] {
$w tag configure disabled -fgstipple gray50 \
-foreground $data(-foreground)
}
set data($opt) ""
} else {
foreach w [list $data(hdrTxt) $data(body)] {
$w tag configure disabled -fgstipple "" \
-foreground $val
}
set data($opt) [$w tag cget disabled -foreground]
}
if {$data(isDisabled)} {
hdr_updateColorsWhenIdle $win
updateColorsWhenIdle $win
}
}
-editselectedonly {
#
# Save the boolean value specified by val in data($opt)
# and invoke the motion handler if necessary
#
set data($opt) [expr {$val ? 1 : 0}]
if {$data(-showeditcursor)} {
invokeMotionHandler $win
}
}
-exportselection {
#
# Save the boolean value specified by val in
# data($opt). In addition, if the selection is
# exported and there are any selected rows in the
# widget then make win the new owner of the PRIMARY
# selection and register a callback to be invoked
# when it loses ownership of the PRIMARY selection
#
set data($opt) [expr {$val ? 1 : 0}]
upvar ::tablelist::ns${win}::selStates selStates
if {$val && $data(colCount) != 0 &&
[array size selStates] != 0} {
selection own -command \
[list ::tablelist::lostSelection $win] $win
}
}
-fullseparators -
-showhorizseparator {
#
# Save the boolean value specified by val
# in data($opt) and adjust the separators
#
set data($opt) [expr {$val ? 1 : 0}]
adjustSepsWhenIdle $win
}
-height {
#
# Adjust the heights of the body text widget
# and of the listbox child, and save the
# properly formatted value of val in data($opt)
#
set val [format "%d" $val] ;# integer check with error msg
if {$val <= 0} {
set viewableRowCount [expr \
{$data(itemCount) - $data(nonViewableRowCount)}]
$data(body) configure $opt $viewableRowCount
$data(lb) configure $opt $viewableRowCount
} else {
$data(body) configure $opt $val
$data(lb) configure $opt $val
}
set data($opt) $val
}
-incrarrowtype {
#
# Save the properly formatted value of val in
# data($opt) and raise the corresponding arrows
# if the currently mapped canvas widgets
#
variable arrowTypes
set data($opt) \
[mwutil::fullOpt "arrow type" $val $arrowTypes]
foreach col $data(arrowColList) {
raiseArrow $win $col
}
}
-listvariable {
#
# Associate val as list variable with the
# given widget and save it in data($opt)
#
makeListVar $win $val
set data($opt) $val
if {[string length $val] == 0} {
set data(hasListVar) 0
} else {
set data(hasListVar) 1
}
}
-movecolumncursor -
-movecursor -
-resizecursor {
#
# Save the properly formatted value of val in data($opt)
#
$helpLabel configure -cursor $val
set data($opt) [$helpLabel cget -cursor]
}
-selectbackground -
-selectforeground {
#
# Configure the "select" tag in the body text widget
# and save the properly formatted value of val in
# data($opt). Don't use the built-in "sel" tag
# because on Windows the selection in a text widget only
# becomes visible when the window gets the input focus.
#
set w $data(body)
set optTail [string range $opt 7 end] ;# remove the -select
$w tag configure select -$optTail $val
set data($opt) [$w tag cget select -$optTail]
if {!$data(isDisabled)} {
updateColorsWhenIdle $win
}
}
-selecttype {
#
# Save the properly formatted value of val in data($opt)
#
variable selectTypes
set val [mwutil::fullOpt "selection type" $val $selectTypes]
set data($opt) $val
}
-selectborderwidth {
#
# Configure the "select" tag in the body text widget
# and save the properly formatted value of val in
# data($opt). Don't use the built-in "sel" tag
# because on Windows the selection in a text widget only
# becomes visible when the window gets the input focus.
# In addition, adjust the line spacing accordingly and
# apply the value to the listbox child, too.
#
set w $data(body)
set optTail [string range $opt 7 end] ;# remove the -select
$w tag configure select -$optTail $val
set data($opt) [$w tag cget select -$optTail]
set pixVal [winfo pixels $w $val]
if {$pixVal < 0} {
set pixVal 0
}
set spacing [winfo pixels $w $data(-spacing)]
if {$spacing < 0} {
set spacing 0
}
set sp1 [expr {$spacing + $pixVal}]
set sp3 [expr {$spacing + $pixVal + !$data(-tight)}]
$data(hdrTxt) configure -spacing1 $sp1 -spacing3 $sp3
$w configure -spacing1 $sp1 -spacing3 $sp3
$data(lb) configure $opt $val
redisplayWhenIdle $win
updateViewWhenIdle $win
}
-setgrid {
#
# Apply the value to the listbox child and save
# the properly formatted value of val in data($opt)
#
$data(lb) configure $opt $val
set data($opt) [$data(lb) cget $opt]
updateListboxSetgridOpt $win
}
-showarrow {
#
# Save the boolean value specified by val in
# data($opt) and manage or unmanage the
# canvases displaying up- or down-arrows
#
set data($opt) [expr {$val ? 1 : 0}]
makeSortAndArrowColLists $win
adjustColumns $win allLabels 1
updateViewWhenIdle $win
}
-showeditcursor {
#
# Save the boolean value specified by val in
# data($opt) and invoke the motion handler
#
set data($opt) [expr {$val ? 1 : 0}]
invokeMotionHandler $win
}
-showlabels {
#
# Save the boolean value specified by val in data($opt)
# and adjust the height of the header frame
#
set data($opt) [expr {$val ? 1 : 0}]
adjustHeaderHeight $win
}
-showseparators {
#
# Save the boolean value specified by val in data($opt),
# and create or destroy the separators if needed
#
set oldVal $data($opt)
set data($opt) [expr {$val ? 1 : 0}]
if {!$oldVal && $data($opt)} {
createSeps $win
} elseif {$oldVal && !$data($opt)} {
foreach w [winfo children $win] {
if {[regexp {^(vsep[0-9]+|hsep2)$} \
[winfo name $w]]} {
destroy $w
}
}
}
}
-snipstring {
#
# Save val in data($opt), adjust the columns, and make
# sure the items will be redisplayed at idle time
#
set data($opt) $val
adjustColumns $win {} 0
redisplayWhenIdle $win
updateViewWhenIdle $win
}
-spacing {
#
# Adjust the line spacing and save val in data($opt)
#
set w $data(body)
set pixVal [winfo pixels $w $val]
if {$pixVal < 0} {
set pixVal 0
}
set selectBd [winfo pixels $w $data(-selectborderwidth)]
if {$selectBd < 0} {
set selectBd 0
}
set sp1 [expr {$pixVal + $selectBd}]
set sp3 [expr {$pixVal + $selectBd + !$data(-tight)}]
$data(hdrTxt) configure -spacing1 $sp1 -spacing3 $sp3
$w configure -spacing1 $sp1 -spacing3 $sp3
set data($opt) $val
redisplayWhenIdle $win
updateViewWhenIdle $win
}
-state {
#
# Apply the value to all labels and their sublabels
# (if any), as well as to the edit window (if present),
# add/remove the "disabled" tag to/from the contents
# of the text widgets, configure the borderwidth
# of the "active" and "select" tags, save the
# properly formatted value of val in data($opt),
# and raise the corresponding arrow in the canvas
#
variable states
set val [mwutil::fullOpt "state" $val $states]
catch {
configLabel $data(hdrFrmLbl) $opt $val
configLabel $data(cornerLbl) $opt $val
for {set col 0} {$col < $data(colCount)} {incr col} {
configLabel $data(hdrTxtFrmLbl)$col $opt $val
}
}
if {$data(editRow) >= 0} {
catch {$data(bodyFrmEd) configure $opt $val}
}
set w $data(body)
switch $val {
disabled {
$data(hdrTxt) tag add disabled 2.0 end
$w tag add disabled 1.0 end
$w tag configure select -relief flat
$w tag configure curRow -relief flat
set data(isDisabled) 1
}
normal {
$data(hdrTxt) tag remove disabled 2.0 end
$w tag remove disabled 1.0 end
$w tag configure select -relief raised
$w tag configure curRow -relief raised
set data(isDisabled) 0
}
}
set data($opt) $val
foreach col $data(arrowColList) {
configCanvas $win $col
raiseArrow $win $col
}
hdr_updateColorsWhenIdle $win
updateColorsWhenIdle $win
}
-stretch {
#
# Save the properly formatted value of val in
# data($opt) and stretch the stretchable columns
#
if {[string first $val "all"] == 0} {
set data($opt) all
} else {
set data($opt) $val
sortStretchableColList $win
}
updateListboxSetgridOpt $win
set data(forceAdjust) 1
stretchColumnsWhenIdle $win
}
-stripebackground -
-stripeforeground {
#
# Configure the "stripe" tag in the body text
# widget, save the properly formatted value of val
# in data($opt), and draw the stripes if necessary
#
set w $data(body)
set optTail [string range $opt 7 end] ;# remove the -stripe
$w tag configure stripe -$optTail $val
set data($opt) [$w tag cget stripe -$optTail]
makeStripesWhenIdle $win
}
-stripeheight {
#
# Save the properly formatted value of val in
# data($opt) and draw the stripes if necessary
#
set val [format "%d" $val] ;# integer check with error msg
set data($opt) $val
makeStripesWhenIdle $win
}
-targetcolor {
#
# Set the color of the row and column gaps, and save
# the properly formatted value of val in data($opt)
#
$data(rowGap) configure -background $val
$data(colGap) configure -background $val
set data($opt) [$data(rowGap) cget -background]
}
-tight {
#
# Save the boolean value specified by val
# in data($opt) and adjust the line spacing
#
set data($opt) [expr {$val ? 1 : 0}]
set w $data(body)
set sp1 [$w cget -spacing1]
set sp3 [expr {$sp1 + !$data($opt)}]
$data(hdrTxt) configure -spacing3 $sp3
$w configure -spacing3 $sp3
updateViewWhenIdle $win
}
-titlecolumns {
#
# Update the value of the -xscrollcommand option, save
# the properly formatted value of val in data($opt), and
# create or destroy the vertical main separator if needed
#
set oldVal $data($opt)
set val [format "%d" $val] ;# integer check with error msg
if {$val < 0} {
set val 0
}
xviewSubCmd $win 0
set w $data(vsep)
if {$val == 0} {
$data(hdrTxt) configure -xscrollcommand \
$data(-xscrollcommand)
if {$oldVal > 0} {
destroy $w
}
} else {
$data(hdrTxt) configure -xscrollcommand ""
if {$oldVal == 0} {
if {$usingTile} {
ttk::separator $w -style Main$win.TSeparator \
-cursor $data(-cursor) \
-orient vertical -takefocus 0
} else {
tk::frame $w -background $data(-foreground) \
-borderwidth 1 -container 0 \
-cursor $data(-cursor) \
-highlightthickness 0 \
-relief sunken -takefocus 0 \
-width 2
}
bindtags $w [lreplace [bindtags $w] 1 1 \
$data(bodyTag) TablelistBody]
}
adjustSepsWhenIdle $win
}
set data($opt) $val
set data(xView) {-1 -1}
updateHScrlbarWhenIdle $win
set titleColsWidth [getTitleColsWidth $win]
set cornerFrmWidth $titleColsWidth
if {$cornerFrmWidth == 0} {
set cornerFrmWidth 1
} else {
incr cornerFrmWidth -1
}
if {$cornerFrmWidth !=
[winfo reqwidth $data(cornerFrm-sw)]} {
$data(cornerFrm-sw) configure -width $cornerFrmWidth
genVirtualEvent $win \
<> $titleColsWidth
}
}
-treecolumn {
#
# Save the properly formatted value of val in
# data($opt), its adjusted value in data(treeCol),
# and move the tree images into the new tree column
#
set oldTreeCol $data(treeCol)
set newTreeCol [colIndex $win $val 0]
set data($opt) $newTreeCol
adjustColIndex $win newTreeCol
set data(treeCol) $newTreeCol
if {$data(colCount) != 0} {
set data($opt) $newTreeCol
}
if {$newTreeCol != $oldTreeCol} {
for {set row 0} {$row < $data(itemCount)} {incr row} {
doCellConfig $row $newTreeCol $win -indent \
[doCellCget $row $oldTreeCol $win -indent]
doCellConfig $row $oldTreeCol $win -indent ""
}
}
}
-treestyle {
#
# Update the tree images and save the properly
# formatted value of val in data($opt)
#
variable treeStyles
set newStyle [mwutil::fullOpt "tree style" $val $treeStyles]
set oldStyle $data($opt)
set treeCol $data(treeCol)
if {[string compare $newStyle $oldStyle] != 0} {
${newStyle}TreeImgs
variable maxIndentDepths
if {![arrElemExists maxIndentDepths $newStyle]} {
set maxIndentDepths($newStyle) 0
}
if {$data(colCount) != 0} {
for {set row 0} {$row < $data(itemCount)} \
{incr row} {
set oldImg \
[doCellCget $row $treeCol $win -indent]
set newImg [strMap \
[list $oldStyle $newStyle "Sel" ""] $oldImg]
if {[regexp {^.+Img([0-9]+)$} $newImg \
dummy depth]} {
if {$depth > $maxIndentDepths($newStyle)} {
createTreeImgs $newStyle $depth
set maxIndentDepths($newStyle) $depth
}
doCellConfig $row $treeCol $win \
-indent $newImg
}
}
}
}
set data($opt) $newStyle
switch -glob $newStyle {
baghira -
klearlooks -
oxygen? -
phase -
plastik -
vista* -
winnative -
winxp* { set data(protectIndents) 1 }
default { set data(protectIndents) 0 }
}
if {$data(ownsFocus) && ![arrElemExists data dispId]} {
addActiveTag $win
}
}
-width {
#
# Adjust the widths of the body text widget,
# header frame, and listbox child, and save the
# properly formatted value of val in data($opt)
#
set val [format "%d" $val] ;# integer check with error msg
$data(body) configure $opt $val
if {$val <= 0} {
$data(hdr) configure $opt $data(hdrWidth)
$data(lb) configure $opt \
[expr {$data(hdrWidth) / $data(charWidth)}]
} else {
$data(hdr) configure $opt 0
$data(lb) configure $opt $val
}
set data($opt) $val
updateListboxSetgridOpt $win
}
-xmousewheelwindow -
-ymousewheelwindow {
if {[string length $val] == 0 || [winfo exists $val]} {
set data($opt) $val
} else {
return -code error "bad window path name \"$val\""
}
}
-xscrollcommand {
#
# Save val in data($opt), and apply it to the header text
# widget if (and only if) no title columns are being used
#
set data($opt) $val
set data(xView) {-1 -1}
if {$data(-titlecolumns) == 0} {
$data(hdrTxt) configure $opt $val
} else {
$data(hdrTxt) configure $opt ""
}
}
-yscrollcommand {
set data($opt) $val
set data(yView) {-1 -1}
}
}
}
}
}
#------------------------------------------------------------------------------
# tablelist::doCget
#
# Returns the value of the configuration option opt for the tablelist widget
# win.
#------------------------------------------------------------------------------
proc tablelist::doCget {win opt} {
upvar ::tablelist::ns${win}::data data
if {[string compare $opt "-columntitles"] == 0} {
set colTitles {}
foreach {width title alignment} $data(-columns) {
lappend colTitles $title
}
return $colTitles
} else {
return $data($opt)
}
}
#------------------------------------------------------------------------------
# tablelist::doColConfig
#
# Applies the value val of the column configuration option opt to the col'th
# column of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::doColConfig {col win opt val} {
variable canElide
variable pu
upvar ::tablelist::ns${win}::data data
switch -- $opt {
-align {
#
# Set up and adjust the columns, and make sure the
# given column will be redisplayed at idle time
#
set idx [expr {3*$col + 2}]
setupColumns $win [lreplace $data(-columns) $idx $idx $val] 0
adjustColumns $win {} 0
redisplayColWhenIdle $win $col
}
-background -
-foreground {
set name $col$opt
if {[string length $val] == 0} {
arrayUnset data $name
} else {
#
# Configure the tag col$opt-$val in both text widgets
#
foreach w [list $data(hdrTxt) $data(body)] {
set tag col$opt-$val
$w tag configure $tag $opt $val
$w tag lower $tag
}
#
# Save val in data($name)
#
set data($name) $val
}
if {!$data(isDisabled)} {
hdr_updateColorsWhenIdle $win
updateColorsWhenIdle $win
}
}
-changesnipside -
-wrap {
#
# Save the boolean value specified by val in data($col$opt) and
# make sure the given column will be redisplayed at idle time
#
set data($col$opt) [expr {$val ? 1 : 0}]
if {[lindex $data(-columns) [expr {3*$col}]] != 0} {
redisplayColWhenIdle $win $col
updateViewWhenIdle $win
}
}
-changetitlesnipside {
#
# Save the boolean value specified by val in
# data($col$opt) and adjust the col'th label
#
set data($col$opt) [expr {$val ? 1 : 0}]
set pixels [lindex $data(colList) [expr {2*$col}]]
if {$pixels == 0} { ;# convention: dynamic width
if {$data($col-maxPixels) > 0} {
if {$data($col-reqPixels) > $data($col-maxPixels)} {
set pixels $data($col-maxPixels)
}
}
}
if {$pixels != 0} {
incr pixels $data($col-delta)
}
set alignment [lindex $data(colList) [expr {2*$col + 1}]]
adjustLabel $win $col $pixels $alignment
}
-editable {
#
# Save the boolean value specified by val in data($col$opt)
# and invoke the motion handler if necessary
#
set data($col$opt) [expr {$val ? 1 : 0}]
if {$data(-showeditcursor)} {
invokeMotionHandler $win
}
}
-editwindow {
variable editWin
if {[arrElemExists editWin $val-creationCmd]} {
set data($col$opt) $val
} else {
return -code error "name \"$val\" is not registered\
for interactive cell editing"
}
}
-font {
displayItems $win
set name $col$opt
if {[arrElemExists data $name] &&
(!$data($col-hide) || $canElide)} {
#
# Remove the tag col$opt-$data($name)
# from the elements of the given column
#
set tag col$opt-$data($name)
set maxHdrLine [expr {$data(hdr_itemCount) + 1}]
foreach w [list $data(hdrTxt) $data(body)] min {2 1} \
max [list $maxHdrLine $data(itemCount)] {
for {set line $min} {$line <= $max} {incr line} {
findTabs $win $w $line $col $col tabIdx1 tabIdx2
$w tag remove $tag $tabIdx1 $tabIdx2+1$pu
}
}
}
if {[string length $val] == 0} {
arrayUnset data $name
} else {
#
# Configure the tag col$opt-$val in both text widgets
#
set tag col$opt-$val
foreach w [list $data(hdrTxt) $data(body)] {
$w tag configure $tag $opt $val
$w tag lower $tag
}
if {!$data($col-hide) || $canElide} {
#
# Apply the tag to the elements of the given column
#
set maxHdrLine [expr {$data(hdr_itemCount) + 1}]
foreach w [list $data(hdrTxt) $data(body)] min {2 1} \
max [list $maxHdrLine $data(itemCount)] {
for {set line $min} {$line <= $max} {incr line} {
findTabs $win $w $line $col $col tabIdx1 tabIdx2
$w tag add $tag $tabIdx1 $tabIdx2+1$pu
}
}
}
#
# Save val in data($name)
#
set data($name) $val
}
#
# Rebuild the lists of the column fonts and tag names
#
makeColFontAndTagLists $win
#
# Adjust the columns, and make sure the specified
# column will be redisplayed at idle time
#
adjustColumns $win $col 1
redisplayColWhenIdle $win $col
updateViewWhenIdle $win
if {$col == $data(editCol)} {
#
# Configure the edit window
#
setEditWinFont $win
}
}
-formatcommand {
if {[string length $val] == 0} {
arrayUnset data $col$opt
set fmtCmdFlag 0
} else {
set data($col$opt) $val
set fmtCmdFlag 1
}
#
# Update the corresponding element of the list data(fmtCmdFlagList)
#
set data(fmtCmdFlagList) \
[lreplace $data(fmtCmdFlagList) $col $col $fmtCmdFlag]
set data(hasFmtCmds) \
[expr {[lsearch -exact $data(fmtCmdFlagList) 1] >= 0}]
#
# Adjust the columns and make sure the specified
# column will be redisplayed at idle time
#
adjustColumns $win $col 1
redisplayColWhenIdle $win $col
updateViewWhenIdle $win
}
-hide {
#
# Save the boolean value specified by val in data($col$opt),
# adjust the columns, and redisplay the items
#
set oldVal $data($col$opt)
set newVal [expr {$val ? 1 : 0}]
if {$newVal != $oldVal} {
set data($col$opt) $newVal
if {$newVal} { ;# hiding the column
incr data(hiddenColCount)
adjustColIndex $win data(anchorCol) 1
adjustColIndex $win data(activeCol) 1
if {$col == $data(editCol)} {
doCancelEditing $win
}
} else {
incr data(hiddenColCount) -1
}
makeColFontAndTagLists $win
adjustColumns $win $col 1
if {!$canElide} {
redisplay $win
}
updateViewWhenIdle $win
genVirtualEvent $win <> $col
}
}
-labelalign {
if {[string length $val] == 0} {
#
# Unset data($col$opt)
#
set alignment [lindex $data(colList) [expr {2*$col + 1}]]
arrayUnset data $col$opt
} else {
#
# Save the properly formatted value of val in data($col$opt)
#
variable alignments
set val [mwutil::fullOpt "label alignment" $val $alignments]
set alignment $val
set data($col$opt) $val
}
#
# Adjust the col'th label
#
set pixels [lindex $data(colList) [expr {2*$col}]]
if {$pixels == 0} { ;# convention: dynamic width
if {$data($col-maxPixels) > 0} {
if {$data($col-reqPixels) > $data($col-maxPixels)} {
set pixels $data($col-maxPixels)
}
}
}
if {$pixels != 0} {
incr pixels $data($col-delta)
}
adjustLabel $win $col $pixels $alignment
}
-labelbackground -
-labelforeground {
set w $data(hdrTxtFrmLbl)$col
set optTail [string range $opt 6 end] ;# remove the -label
if {[string length $val] == 0} {
#
# Apply the value of the corresponding widget
# configuration option to the col'th label and
# its sublabels (if any), and unset data($col$opt)
#
configLabel $w -$optTail $data($opt)
arrayUnset data $col$opt
} else {
#
# Apply the given value to the col'th label and
# its sublabels (if any), and save the properly
# formatted value of val in data($col$opt)
#
configLabel $w -$optTail $val
variable helpLabel
$helpLabel configure -$optTail $val
set data($col$opt) [$helpLabel cget -$optTail]
}
if {[lsearch -exact $data(arrowColList) $col] >= 0} {
configCanvas $win $col
}
}
-labelborderwidth {
set w $data(hdrTxtFrmLbl)$col
set optTail [string range $opt 6 end] ;# remove the -label
if {[string length $val] == 0} {
#
# Apply the value of the corresponding widget configuration
# option to the col'th label and unset data($col$opt)
#
configLabel $w -$optTail $data($opt)
arrayUnset data $col$opt
} else {
#
# Apply the given value to the col'th label and save the
# properly formatted value of val in data($col$opt)
#
configLabel $w -$optTail $val
set data($col$opt) [$w cget -$optTail]
}
#
# Adjust the columns (including the height of the header frame)
#
adjustColumns $win l$col 1
updateViewWhenIdle $win
}
-labelcommand -
-labelcommand2 -
-name -
-selectfiltercommand -
-sortcommand {
if {[string length $val] == 0} {
arrayUnset data $col$opt
} else {
set data($col$opt) $val
}
}
-labelfont {
set w $data(hdrTxtFrmLbl)$col
set optTail [string range $opt 6 end] ;# remove the -label
if {[string length $val] == 0} {
#
# Apply the value of the corresponding widget
# configuration option to the col'th label and
# its sublabels (if any), and unset data($col$opt)
#
configLabel $w -$optTail $data($opt)
arrayUnset data $col$opt
} else {
#
# Apply the given value to the col'th label and
# its sublabels (if any), and save the properly
# formatted value of val in data($col$opt)
#
configLabel $w -$optTail $val
set data($col$opt) [$w cget -$optTail]
}
#
# Adjust the columns (including the height of the header frame)
#
adjustColumns $win l$col 1
updateViewWhenIdle $win
}
-labelheight -
-labelpady {
set w $data(hdrTxtFrmLbl)$col
set optTail [string range $opt 6 end] ;# remove the -label
if {[string length $val] == 0} {
#
# Apply the value of the corresponding widget configuration
# option to the col'th label and unset data($col$opt)
#
configLabel $w -$optTail $data($opt)
arrayUnset data $col$opt
} else {
#
# Apply the given value to the col'th label and save the
# properly formatted value of val in data($col$opt)
#
configLabel $w -$optTail $val
variable usingTile
if {$usingTile} {
set data($col$opt) $val
} else {
set data($col$opt) [$w cget -$optTail]
}
}
if {[string compare $opt "-labelpady"] == 0} {
#
# Adjust the col'th label
#
set pixels [lindex $data(colList) [expr {2*$col}]]
if {$pixels == 0} { ;# convention: dynamic width
if {$data($col-maxPixels) > 0} {
if {$data($col-reqPixels) > $data($col-maxPixels)} {
set pixels $data($col-maxPixels)
}
}
}
if {$pixels != 0} {
incr pixels $data($col-delta)
}
set alignment [lindex $data(colList) [expr {2*$col + 1}]]
adjustLabel $win $col $pixels $alignment
}
#
# Adjust the height of the header frame
#
adjustHeaderHeight $win
}
-labelimage {
set w $data(hdrTxtFrmLbl)$col
if {[string length $val] == 0} {
foreach l [getSublabels $w] {
destroy $l
}
arrayUnset data $col$opt
} else {
if {![winfo exists $w-il]} {
variable configSpecs
variable configOpts
foreach l [list $w-il $w-tl] { ;# image and text labels
#
# Create the label $l
#
tk::label $l -borderwidth 0 -height 0 \
-highlightthickness 0 -padx 0 \
-pady 0 -takefocus 0 -width 0
#
# Apply to it the current configuration options
#
foreach opt2 $configOpts {
if {[string compare \
[lindex $configSpecs($opt2) 2] "c"] == 0} {
$l configure $opt2 $data($opt2)
}
}
if {[string compare [winfo class $w] "TLabel"] == 0} {
variable themeDefaults
$l configure -background \
$themeDefaults(-labelbackground)
} else {
$l configure -background [$w cget -background]
$l configure -foreground [$w cget -foreground]
}
$l configure -font [$w cget -font]
foreach opt2 {-activebackground -activeforeground
-disabledforeground -state} {
catch {$l configure $opt2 [$w cget $opt2]}
}
#
# Replace the binding tag Label with $w,
# $data(labelTag), and TablelistSubLabel in
# the list of binding tags of the label $l
#
bindtags $l [lreplace [bindtags $l] 1 1 \
$w $data(labelTag) TablelistSubLabel]
}
}
#
# Display the specified image in the label
# $w-il and save val in data($col$opt)
#
$w-il configure -image $val
set data($col$opt) $val
}
#
# Adjust the columns (including the height of the header frame)
#
adjustColumns $win l$col 1
updateViewWhenIdle $win
}
-labelrelief {
set w $data(hdrTxtFrmLbl)$col
set optTail [string range $opt 6 end] ;# remove the -label
if {[string length $val] == 0} {
#
# Apply the value of the corresponding widget configuration
# option to the col'th label and unset data($col$opt)
#
configLabel $w -$optTail $data($opt)
arrayUnset data $col$opt
} else {
#
# Apply the given value to the col'th label and save the
# properly formatted value of val in data($col$opt)
#
configLabel $w -$optTail $val
set data($col$opt) [$w cget -$optTail]
}
}
-labelvalign {
#
# Save the properly formatted value of val in
# data($col$opt) and adjust the col'th label
#
variable valignments
set val [mwutil::fullOpt "vertical alignment" $val $valignments]
if {[string compare $val $data($col$opt)] != 0} {
set data($col$opt) $val
set pixels [lindex $data(colList) [expr {2*$col}]]
if {$pixels == 0} { ;# convention: dynamic width
if {$data($col-maxPixels) > 0} {
if {$data($col-reqPixels) > $data($col-maxPixels)} {
set pixels $data($col-maxPixels)
}
}
}
if {$pixels != 0} {
incr pixels $data($col-delta)
}
set alignment [lindex $data(colList) [expr {2*$col + 1}]]
adjustLabel $win $col $pixels $alignment
}
}
-maxwidth {
#
# Save the properly formatted value of val in
# data($col$opt), adjust the columns, and make sure
# the specified column will be redisplayed at idle time
#
set val [format "%d" $val] ;# integer check with error message
set data($col$opt) $val
if {$val > 0} { ;# convention: max. width in characters
set pixels [charsToPixels $win $data(-font) $val]
} elseif {$val < 0} { ;# convention: max. width in pixels
set pixels [expr {(-1)*$val}]
} else { ;# convention: no max. width
set pixels 0
}
set data($col-maxPixels) $pixels
adjustColumns $win $col 1
redisplayColWhenIdle $win $col
updateViewWhenIdle $win
}
-resizable {
#
# Save the boolean value specified by val in data($col$opt)
#
set data($col$opt) [expr {$val ? 1 : 0}]
}
-selectbackground -
-selectforeground {
set w $data(body)
set name $col$opt
if {[string length $val] == 0} {
arrayUnset data $name
} else {
#
# Configure the tag col$opt-$val in the body text widget
#
set tag col$opt-$val
set optTail [string range $opt 7 end] ;# remove the -select
$w tag configure $tag -$optTail $val
$w tag raise $tag select
#
# Save val in data($name)
#
set data($name) $val
}
if {!$data(isDisabled)} {
updateColorsWhenIdle $win
}
}
-showarrow {
#
# Save the boolean value specified by val in data($col$opt) and
# manage or unmanage the canvas displaying an up- or down-arrow
#
set data($col$opt) [expr {$val ? 1 : 0}]
makeSortAndArrowColLists $win
adjustColumns $win l$col 1
updateViewWhenIdle $win
}
-showlinenumbers {
#
# Save the boolean value specified by val in
# data($col$opt), and make sure the line numbers
# will be redisplayed at idle time if needed
#
set val [expr {$val ? 1 : 0}]
if {!$data($col$opt) && $val} {
showLineNumbersWhenIdle $win
}
set data($col$opt) $val
}
-sortmode {
#
# Save the properly formatted value of val in data($col$opt)
#
variable sortModes
set data($col$opt) [mwutil::fullOpt "sort mode" $val $sortModes]
}
-stretchable {
set flag [expr {$val ? 1 : 0}]
if {$flag} {
if {[string compare $data(-stretch) "all"] != 0 &&
[lsearch -exact $data(-stretch) $col] < 0} {
#
# col was not found in data(-stretch): add it to the list
#
lappend data(-stretch) $col
sortStretchableColList $win
set data(forceAdjust) 1
stretchColumnsWhenIdle $win
}
} elseif {[string compare $data(-stretch) "all"] == 0} {
#
# Replace the value "all" of data(-stretch) with
# the list of all column indices different from col
#
set data(-stretch) {}
for {set n 0} {$n < $data(colCount)} {incr n} {
if {$n != $col} {
lappend data(-stretch) $n
}
}
set data(forceAdjust) 1
stretchColumnsWhenIdle $win
} else {
#
# If col is contained in data(-stretch)
# then remove it from the list
#
if {[set n [lsearch -exact $data(-stretch) $col]] >= 0} {
set data(-stretch) [lreplace $data(-stretch) $n $n]
set data(forceAdjust) 1
stretchColumnsWhenIdle $win
}
#
# If col indicates the last column and data(-stretch)
# contains "end" then remove "end" from the list
#
if {$col == $data(lastCol) &&
[string compare [lindex $data(-stretch) end] "end"] == 0} {
set data(-stretch) [lreplace $data(-stretch) end end]
set data(forceAdjust) 1
stretchColumnsWhenIdle $win
}
}
updateListboxSetgridOpt $win
}
-stripebackground -
-stripeforeground {
set w $data(body)
set name $col$opt
if {[string length $val] == 0} {
arrayUnset data $name
} else {
#
# Configure the tag col$opt-$val in the body text widget
#
set tag col$opt-$val
set optTail [string range $opt 7 end] ;# remove the -stripe
$w tag configure $tag -$optTail $val
$w tag raise $tag stripe
#
# Save val in data($name)
#
set data($name) $val
}
if {!$data(isDisabled)} {
updateColorsWhenIdle $win
}
}
-text {
if {$data(isDisabled) || $data($col-showlinenumbers)} {
return ""
}
#
# Replace the column's content in the internal list
#
set newItemList {}
set row 0
foreach item $data(itemList) text [lrange $val 0 $data(lastRow)] {
set item [lreplace $item $col $col $text]
lappend newItemList $item
}
set data(itemList) $newItemList
#
# Update the list variable if present
#
condUpdateListVar $win
#
# Adjust the columns and make sure the specified
# column will be redisplayed at idle time
#
adjustColumns $win $col 1
redisplayColWhenIdle $win $col
updateViewWhenIdle $win
}
-title {
#
# Save the given value in the corresponding
# element of data(-columns) and adjust the columns
#
set idx [expr {3*$col + 1}]
set data(-columns) [lreplace $data(-columns) $idx $idx $val]
adjustColumns $win l$col 1
updateViewWhenIdle $win
}
-valign {
#
# Save the properly formatted value of val in data($col$opt) and
# make sure the given column will be redisplayed at idle time
#
variable valignments
set val [mwutil::fullOpt "vertical alignment" $val $valignments]
if {[string compare $val $data($col$opt)] != 0} {
set data($col$opt) $val
redisplayColWhenIdle $win $col
}
}
-width {
#
# Set up and adjust the columns, and make sure the
# given column will be redisplayed at idle time
#
set idx [expr {3*$col}]
if {$val != [lindex $data(-columns) $idx]} {
setupColumns $win [lreplace $data(-columns) $idx $idx $val] 0
set callerProc [lindex [info level -1] 0]
if {[string match "tablelist::label*" $callerProc]} {
redisplayCol $win $col 0 last
} else {
redisplayColWhenIdle $win $col
}
adjustColumns $win $col 1
updateViewWhenIdle $win
}
}
}
}
#------------------------------------------------------------------------------
# tablelist::doColCget
#
# Returns the value of the column configuration option opt for the col'th
# column of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::doColCget {col win opt} {
upvar ::tablelist::ns${win}::data data
switch -- $opt {
-align {
return [lindex $data(-columns) [expr {3*$col + 2}]]
}
-stretchable {
return [expr {
[string compare $data(-stretch) "all"] == 0 ||
[lsearch -exact $data(-stretch) $col] >= 0 ||
($col == $data(lastCol) && \
[string compare [lindex $data(-stretch) end] "end"] == 0)
}]
}
-text {
set result {}
foreach item $data(itemList) {
lappend result [lindex $item $col]
}
return $result
}
-title {
return [lindex $data(-columns) [expr {3*$col + 1}]]
}
-width {
return [lindex $data(-columns) [expr {3*$col}]]
}
default {
if {[arrElemExists data $col$opt]} {
return $data($col$opt)
} else {
return ""
}
}
}
}
#------------------------------------------------------------------------------
# tablelist::doRowConfig
#
# Applies the value val of the row configuration option opt to the row'th row
# of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::doRowConfig {row win opt val} {
variable canElide
variable elide
variable snipSides
variable pu
upvar ::tablelist::ns${win}::data data
foreach {row p w inBody diff} [getConfigParams $win $row] {}
switch -- $opt {
-background -
-foreground {
set key [lindex $data(${p}keyList) $row]
set name $key$opt
if {[string length $val] == 0} {
arrayUnset data $name
} else {
#
# Configure the tag row$opt-$val in the text widget
#
set tag row$opt-$val
$w tag configure $tag $opt $val
$w tag lower $tag active
#
# Save val in data($name)
#
set data($name) $val
}
if {!$data(isDisabled)} {
${p}updateColorsWhenIdle $win
}
}
-elide {
displayItems $win
set val [expr {$val ? 1 : 0}]
set item [lindex $data(itemList) $row]
set key [lindex $item end]
set name $key$opt
set line [expr {$row + 1}]
set viewChanged 0
if {$val} { ;# eliding the row
if {![arrElemExists data $name]} {
set data($name) 1
$w tag add elidedRow $line.0 $line.end+1$pu
if {![arrElemExists data $key-hide]} {
incr data(nonViewableRowCount)
set viewChanged 1
if {$row == $data(editRow)} {
doCancelEditing $win
}
}
}
} else { ;# uneliding the row
if {[arrElemExists data $name]} {
unset data($name)
#
# Prevent any not yet created embeddded windows in this
# text widget line scheduled for creation via $w window
# create ... -create ... from being effectively created
#
$w tag add elidedWin $line.0 $line.end
$w tag remove elidedRow $line.0 $line.end+1$pu
if {![arrElemExists data $key-hide]} {
incr data(nonViewableRowCount) -1
set viewChanged 1
}
}
}
if {$viewChanged} {
#
# Adjust the heights of the body text widget
# and of the listbox child, if necessary
#
if {$data(-height) <= 0} {
set viewableRowCount \
[expr {$data(itemCount) - $data(nonViewableRowCount)}]
$w configure -height $viewableRowCount
$data(lb) configure -height $viewableRowCount
}
#
# Build the list of those dynamic-width columns
# whose widths are affected by (un)eliding the row
#
set colWidthsChanged 0
set colIdxList {}
set displayedItem [lrange $item 0 $data(lastCol)]
if {$data(hasFmtCmds)} {
set displayedItem [formatItem $win $key $row $displayedItem]
}
if {[string match "*\t*" $displayedItem]} {
set displayedItem [mapTabs $displayedItem]
}
set col 0
foreach text $displayedItem {pixels alignment} $data(colList) {
if {($data($col-hide) && !$canElide) || $pixels != 0} {
incr col
continue
}
getAuxData $win $key $col auxType auxWidth
getIndentData $win $key $col indentWidth
set cellFont [getCellFont $win $key $col]
set elemWidth [getElemWidth $win $text $auxWidth \
$indentWidth $cellFont]
if {$val} { ;# eliding the row
if {$elemWidth == $data($col-elemWidth) &&
[incr data($col-widestCount) -1] == 0} {
set colWidthsChanged 1
lappend colIdxList $col
}
} else { ;# uneliding the row
if {$elemWidth == $data($col-elemWidth)} {
incr data($col-widestCount)
} elseif {$elemWidth > $data($col-elemWidth)} {
set data($col-elemWidth) $elemWidth
set data($col-widestCount) 1
if {$elemWidth > $data($col-reqPixels)} {
set data($col-reqPixels) $elemWidth
set colWidthsChanged 1
}
}
}
incr col
}
#
# Invalidate the list of row indices indicating the
# viewable rows and adjust the columns if necessary
#
set data(viewableRowList) {-1}
if {$colWidthsChanged} {
adjustColumns $win $colIdxList 1
}
}
}
-font {
if {$inBody} {
displayItems $win
}
#
# Save the current cell fonts in a temporary array
#
set item [lindex $data(${p}itemList) $row]
set key [lindex $item end]
for {set col 0} {$col < $data(colCount)} {incr col} {
set oldCellFonts($col) [getCellFont $win $key $col]
}
set name $key$opt
if {[arrElemExists data $name]} {
#
# Remove the tag row$opt-$data($name) from the given row
#
set line [expr {$row + $diff}]
$w tag remove row$opt-$data($name) $line.0 $line.end
}
if {[string length $val] == 0} {
if {[arrElemExists data $name]} {
unset data($name)
if {$inBody} {
incr data(rowTagRefCount) -1
}
}
} else {
#
# Configure the tag row$opt-$val in the
# text widget and apply it to the given row
#
set tag row$opt-$val
$w tag configure $tag $opt $val
$w tag lower $tag active
set line [expr {$row + $diff}]
$w tag add $tag $line.0 $line.end
#
# Save val in data($name)
#
if {$inBody && ![arrElemExists data $name]} {
incr data(rowTagRefCount)
}
set data($name) $val
}
set displayedItem [lrange $item 0 $data(lastCol)]
if {$data(hasFmtCmds)} {
set displayedItem [formatItem $win $key $row $displayedItem]
}
if {[string match "*\t*" $displayedItem]} {
set displayedItem [mapTabs $displayedItem]
}
set colWidthsChanged 0
set colIdxList {}
set line [expr {$row + $diff}]
set textIdx1 $line.1
set col 0
foreach text $displayedItem {pixels alignment} $data(colList) {
if {$data($col-hide) && !$canElide} {
incr col
continue
}
#
# Adjust the cell text and the image or window width
#
set multiline [string match "*\n*" $text]
set cellFont [getCellFont $win $key $col]
set workPixels $pixels
if {$pixels == 0} { ;# convention: dynamic width
set textSav $text
getAuxData $win $key $col auxType auxWidthSav
getIndentData $win $key $col indentWidthSav
if {$data($col-maxPixels) > 0} {
set workPixels $data($col-maxPixels)
}
}
set aux [getAuxData $win $key $col auxType auxWidth $workPixels]
set indent [getIndentData $win $key $col indentWidth]
set maxTextWidth $workPixels
if {$workPixels != 0} {
incr workPixels $data($col-delta)
set maxTextWidth \
[getMaxTextWidth $workPixels $auxWidth $indentWidth]
if {$data($col-wrap) && !$multiline} {
if {[font measure $cellFont -displayof $win $text] >
$maxTextWidth} {
set multiline 1
}
}
}
set snipSide $snipSides($alignment,$data($col-changesnipside))
if {$multiline} {
set list [split $text "\n"]
if {$data($col-wrap)} {
set snipSide ""
}
adjustMlElem $win list auxWidth indentWidth $cellFont \
$workPixels $snipSide $data(-snipstring)
set msgScript [list ::tablelist::displayText $win $key \
$col [join $list "\n"] $cellFont \
$maxTextWidth $alignment]
} else {
adjustElem $win text auxWidth indentWidth $cellFont \
$workPixels $snipSide $data(-snipstring)
}
if {$inBody &&
$row == $data(editRow) && $col == $data(editCol)} {
#
# Configure the edit window
#
setEditWinFont $win
} else {
#
# Update the text widget's content between the two tabs
#
set textIdx2 [$w search $elide "\t" $textIdx1 $line.end]
if {$multiline} {
updateMlCell $w $textIdx1 $textIdx2 $msgScript $aux \
$auxType $auxWidth $indent $indentWidth \
$alignment [getVAlignment $win $key $col]
} else {
updateCell $w $textIdx1 $textIdx2 $text $aux \
$auxType $auxWidth $indent $indentWidth \
$alignment [getVAlignment $win $key $col]
}
}
if {$pixels == 0 && ![arrElemExists data $key-elide] &&
![arrElemExists data $key-hide]} {
#
# Check whether the width of the current column has changed
#
set text $textSav
set auxWidth $auxWidthSav
set indentWidth $indentWidthSav
set newElemWidth [getElemWidth $win $text $auxWidth \
$indentWidth $cellFont]
if {$newElemWidth > $data($col-elemWidth)} {
set data($col-elemWidth) $newElemWidth
set data($col-widestCount) 1
if {$newElemWidth > $data($col-reqPixels)} {
set data($col-reqPixels) $newElemWidth
set colWidthsChanged 1
}
} else {
set oldElemWidth [getElemWidth $win $text $auxWidth \
$indentWidth $oldCellFonts($col)]
if {$oldElemWidth < $data($col-elemWidth) &&
$newElemWidth == $data($col-elemWidth)} {
incr data($col-widestCount)
} elseif {$oldElemWidth == $data($col-elemWidth) &&
$newElemWidth < $oldElemWidth &&
[incr data($col-widestCount) -1] == 0} {
set colWidthsChanged 1
lappend colIdxList $col
}
}
}
set textIdx1 [$w search $elide "\t" $textIdx1 $line.end]+2$pu
incr col
}
#
# Adjust the columns if necessary and schedule
# some operations for execution at idle time
#
if {$colWidthsChanged} {
adjustColumns $win $colIdxList 1
}
updateViewWhenIdle $win
}
-hide {
displayItems $win
set val [expr {$val ? 1 : 0}]
set item [lindex $data(itemList) $row]
set key [lindex $item end]
set name $key$opt
set line [expr {$row + 1}]
set viewChanged 0
set callerProc [lindex [info level -1] 0]
if {$val} { ;# hiding the row
if {![arrElemExists data $name]} {
set data($name) 1
$w tag add hiddenRow $line.0 $line.end+1$pu
if {![arrElemExists data $key-elide]} {
incr data(nonViewableRowCount)
set viewChanged 1
#
# Elide the descendants of this item
#
set fromRow [expr {$row + 1}]
set toRow [nodeRow $win $key end]
for {set _row $fromRow} {$_row < $toRow} {incr _row} {
doRowConfig $_row $win -elide 1
}
if {[string match "*configureWidget" $callerProc]} {
adjustRowIndex $win data(anchorRow) 1
set activeRow $data(activeRow)
adjustRowIndex $win activeRow 1
set data(activeRow) $activeRow
}
if {$row == $data(editRow)} {
doCancelEditing $win
}
}
}
} else { ;# unhiding the row
if {[arrElemExists data $name]} {
unset data($name)
#
# Prevent any not yet created embeddded windows in this
# text widget line scheduled for creation via $w window
# create ... -create ... from being effectively created
#
$w tag add elidedWin $line.0 $line.end
$w tag remove hiddenRow $line.0 $line.end+1$pu
if {![arrElemExists data $key-elide]} {
incr data(nonViewableRowCount) -1
set viewChanged 1
if {[arrElemExists data $key,$data(treeCol)-indent] &&
[string match "*expanded*" \
$data($key,$data(treeCol)-indent)]} {
expandSubCmd $win [list $row -partly]
}
}
}
}
if {$viewChanged} {
#
# Adjust the heights of the body text widget
# and of the listbox child, if necessary
#
if {$data(-height) <= 0} {
set viewableRowCount \
[expr {$data(itemCount) - $data(nonViewableRowCount)}]
$w configure -height $viewableRowCount
$data(lb) configure -height $viewableRowCount
}
#
# Build the list of those dynamic-width columns
# whose widths are affected by (un)hiding the row
#
set colWidthsChanged 0
set colIdxList {}
set displayedItem [lrange $item 0 $data(lastCol)]
if {$data(hasFmtCmds)} {
set displayedItem [formatItem $win $key $row $displayedItem]
}
if {[string match "*\t*" $displayedItem]} {
set displayedItem [mapTabs $displayedItem]
}
set col 0
foreach text $displayedItem {pixels alignment} $data(colList) {
if {($data($col-hide) && !$canElide) || $pixels != 0} {
incr col
continue
}
getAuxData $win $key $col auxType auxWidth
getIndentData $win $key $col indentWidth
set cellFont [getCellFont $win $key $col]
set elemWidth [getElemWidth $win $text $auxWidth \
$indentWidth $cellFont]
if {$val} { ;# hiding the row
if {$elemWidth == $data($col-elemWidth) &&
[incr data($col-widestCount) -1] == 0} {
set colWidthsChanged 1
lappend colIdxList $col
}
} else { ;# unhiding the row
if {$elemWidth == $data($col-elemWidth)} {
incr data($col-widestCount)
} elseif {$elemWidth > $data($col-elemWidth)} {
set data($col-elemWidth) $elemWidth
set data($col-widestCount) 1
if {$elemWidth > $data($col-reqPixels)} {
set data($col-reqPixels) $elemWidth
set colWidthsChanged 1
}
}
}
incr col
}
#
# Invalidate the list of row indices indicating the
# viewable rows and adjust the columns if necessary
#
set data(viewableRowList) {-1}
if {$colWidthsChanged} {
adjustColumns $win $colIdxList 1
}
#
# Schedule some operations for execution at idle time
# and generate a virtual event only if the caller proc
# is configureWidget, in order to make sure that only
# one event per caller proc invocation will be generated
#
if {[string match "*configureWidget" $callerProc]} {
makeStripesWhenIdle $win
showLineNumbersWhenIdle $win
updateViewWhenIdle $win
genVirtualEvent $win <> $row
}
}
}
-name {
set key [lindex $data(${p}keyList) $row]
if {[string length $val] == 0} {
arrayUnset data $key$opt
} else {
set data($key$opt) $val
}
}
-selectable {
set val [expr {$val ? 1 : 0}]
set key [lindex $data(keyList) $row]
if {$val} {
arrayUnset data $key$opt
} else {
#
# Set data($key$opt) to 0 and deselect the row
#
set data($key$opt) 0
selectionSubCmd $win [list clear $row $row]
}
}
-selectbackground -
-selectforeground {
set key [lindex $data(keyList) $row]
set name $key$opt
if {[string length $val] == 0} {
arrayUnset data $name
} else {
#
# Configure the tag row$opt-$val in the body text widget
#
set tag row$opt-$val
set optTail [string range $opt 7 end] ;# remove the -select
$w tag configure $tag -$optTail $val
$w tag lower $tag active
#
# Save val in data($name)
#
set data($name) [$w tag cget $tag -$optTail]
}
if {!$data(isDisabled)} {
updateColorsWhenIdle $win
}
}
-text {
if {$data(isDisabled)} {
return ""
}
if {$inBody} {
displayItems $win
}
set colWidthsChanged 0
set colIdxList {}
set oldItem [lindex $data(${p}itemList) $row]
set key [lindex $oldItem end]
set newItem [adjustItem $val $data(colCount)]
if {$data(hasFmtCmds)} {
set displayedItem [formatItem $win $key $row $newItem]
} else {
set displayedItem $newItem
}
if {[string match "*\t*" $displayedItem]} {
set displayedItem [mapTabs $displayedItem]
}
set line [expr {$row + $diff}]
set textIdx1 $line.1
set col 0
foreach text $displayedItem {pixels alignment} $data(colList) {
if {$data($col-hide) && !$canElide} {
incr col
continue
}
#
# Adjust the cell text and the image or window width
#
set multiline [string match "*\n*" $text]
set cellFont [getCellFont $win $key $col]
set workPixels $pixels
if {$pixels == 0} { ;# convention: dynamic width
set textSav $text
getAuxData $win $key $col auxType auxWidthSav
getIndentData $win $key $col indentWidthSav
if {$data($col-maxPixels) > 0} {
set workPixels $data($col-maxPixels)
}
}
set aux [getAuxData $win $key $col auxType auxWidth $workPixels]
set indent [getIndentData $win $key $col indentWidth]
set maxTextWidth $workPixels
if {$workPixels != 0} {
incr workPixels $data($col-delta)
set maxTextWidth \
[getMaxTextWidth $workPixels $auxWidth $indentWidth]
if {$data($col-wrap) && !$multiline} {
if {[font measure $cellFont -displayof $win $text] >
$maxTextWidth} {
set multiline 1
}
}
}
set snipSide $snipSides($alignment,$data($col-changesnipside))
if {$multiline} {
set list [split $text "\n"]
if {$data($col-wrap)} {
set snipSide ""
}
adjustMlElem $win list auxWidth indentWidth $cellFont \
$workPixels $snipSide $data(-snipstring)
set msgScript [list ::tablelist::displayText $win $key \
$col [join $list "\n"] $cellFont \
$maxTextWidth $alignment]
} else {
adjustElem $win text auxWidth indentWidth $cellFont \
$workPixels $snipSide $data(-snipstring)
}
if {!$inBody ||
$row != $data(editRow) || $col != $data(editCol)} {
#
# Update the text widget's content between the two tabs
#
set textIdx2 [$w search $elide "\t" $textIdx1 $line.end]
if {$multiline} {
updateMlCell $w $textIdx1 $textIdx2 $msgScript $aux \
$auxType $auxWidth $indent $indentWidth \
$alignment [getVAlignment $win $key $col]
} else {
updateCell $w $textIdx1 $textIdx2 $text $aux \
$auxType $auxWidth $indent $indentWidth \
$alignment [getVAlignment $win $key $col]
}
}
if {$pixels == 0 && ![arrElemExists data $key-elide] &&
![arrElemExists data $key-hide]} {
#
# Check whether the width of the current column has changed
#
set text $textSav
set auxWidth $auxWidthSav
set indentWidth $indentWidthSav
set newElemWidth [getElemWidth $win $text $auxWidth \
$indentWidth $cellFont]
if {$newElemWidth > $data($col-elemWidth)} {
set data($col-elemWidth) $newElemWidth
set data($col-widestCount) 1
if {$newElemWidth > $data($col-reqPixels)} {
set data($col-reqPixels) $newElemWidth
set colWidthsChanged 1
}
} else {
set oldText [lindex $oldItem $col]
if {[lindex $data(fmtCmdFlagList) $col]} {
set oldText \
[formatElem $win $key $row $col $oldText]
}
if {[string match "*\t*" $oldText]} {
set oldText [mapTabs $oldText]
}
set oldElemWidth [getElemWidth $win $oldText $auxWidth \
$indentWidth $cellFont]
if {$oldElemWidth < $data($col-elemWidth) &&
$newElemWidth == $data($col-elemWidth)} {
incr data($col-widestCount)
} elseif {$oldElemWidth == $data($col-elemWidth) &&
$newElemWidth < $oldElemWidth &&
[incr data($col-widestCount) -1] == 0} {
set colWidthsChanged 1
lappend colIdxList $col
}
}
}
set textIdx1 [$w search $elide "\t" $textIdx1 $line.end]+2$pu
incr col
}
#
# Replace the row's content in the list variable if present
#
if {$inBody && $data(hasListVar) &&
[uplevel #0 [list info exists $data(-listvariable)]]} {
upvar #0 $data(-listvariable) var
trace vdelete var wu $data(listVarTraceCmd)
set var [lreplace $var $row $row $newItem]
trace variable var wu $data(listVarTraceCmd)
}
#
# Replace the row's content in the internal list
#
lappend newItem $key
set data(${p}itemList) \
[lreplace $data(${p}itemList) $row $row $newItem]
#
# Adjust the columns if necessary and schedule
# some operations for execution at idle time
#
if {$colWidthsChanged} {
adjustColumns $win $colIdxList 1
}
if {$inBody} {
showLineNumbersWhenIdle $win
}
updateViewWhenIdle $win
}
}
}
#------------------------------------------------------------------------------
# tablelist::doRowCget
#
# Returns the value of the row configuration option opt for the row'th row of
# the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::doRowCget {row win opt} {
upvar ::tablelist::ns${win}::data data
foreach {row p w inBody diff} [getConfigParams $win $row] {}
set item [lindex $data(${p}itemList) $row]
switch -- $opt {
-text {
return [lrange $item 0 $data(lastCol)]
}
-elide -
-hide {
set key [lindex $item end]
if {[arrElemExists data $key$opt]} {
return $data($key$opt)
} else {
return 0
}
}
-selectable {
set key [lindex $item end]
if {[arrElemExists data $key$opt]} {
return $data($key$opt)
} else {
return 1
}
}
default {
set key [lindex $item end]
if {[arrElemExists data $key$opt]} {
return $data($key$opt)
} else {
return ""
}
}
}
}
#------------------------------------------------------------------------------
# tablelist::doCellConfig
#
# Applies the value val of the cell configuration option opt to the cell
# row,col of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::doCellConfig {row col win opt val} {
variable canElide
variable snipSides
variable pu
upvar ::tablelist::ns${win}::data data
foreach {row p w inBody diff} [getConfigParams $win $row] {}
switch -- $opt {
-background -
-foreground {
set key [lindex $data(${p}keyList) $row]
set name $key,$col$opt
if {[string length $val] == 0} {
arrayUnset data $name
} else {
#
# Configure the tag cell$opt-$val in the text widget
#
set tag cell$opt-$val
$w tag configure $tag $opt $val
$w tag lower $tag disabled
#
# Save val in data($name)
#
set data($name) $val
}
if {!$data(isDisabled)} {
${p}updateColorsWhenIdle $win
}
}
-editable {
#
# Save the boolean value specified by val in data($key,$col$opt)
# and invoke the motion handler if necessary
#
set key [lindex $data(keyList) $row]
set data($key,$col$opt) [expr {$val ? 1 : 0}]
if {$data(-showeditcursor)} {
invokeMotionHandler $win
}
}
-editwindow {
variable editWin
if {[arrElemExists editWin $val-creationCmd]} {
set key [lindex $data(keyList) $row]
set data($key,$col$opt) $val
} else {
return -code error "name \"$val\" is not registered\
for interactive cell editing"
}
}
-font {
if {$inBody} {
displayItems $win
}
#
# Save the current cell font
#
set line [expr {$row + $diff}]
set item [lindex $data(${p}itemList) $row]
set key [lindex $item end]
set name $key,$col$opt
set oldCellFont [getCellFont $win $key $col]
if {[arrElemExists data $name] &&
(!$data($col-hide) || $canElide)} {
#
# Remove the tag cell$opt-$data($name) from the given cell
#
findTabs $win $w $line $col $col tabIdx1 tabIdx2
$w tag remove cell$opt-$data($name) $tabIdx1 $tabIdx2+1$pu
}
if {[string length $val] == 0} {
if {[arrElemExists data $name]} {
unset data($name)
if {$inBody} {
incr data(cellTagRefCount) -1
}
}
} else {
#
# Configure the tag cell$opt-$val in the text widget
#
set tag cell$opt-$val
$w tag configure $tag $opt $val
$w tag lower $tag disabled
if {!$data($col-hide) || $canElide} {
#
# Apply the tag to the given cell
#
findTabs $win $w $line $col $col tabIdx1 tabIdx2
$w tag add $tag $tabIdx1 $tabIdx2+1$pu
}
#
# Save val in data($name)
#
if {$inBody && ![arrElemExists data $name]} {
incr data(cellTagRefCount)
}
set data($name) $val
}
#
# Adjust the cell text and the image or window width
#
set text [lindex $item $col]
if {[lindex $data(fmtCmdFlagList) $col]} {
set text [formatElem $win $key $row $col $text]
}
if {[string match "*\t*" $text]} {
set text [mapTabs $text]
}
set multiline [string match "*\n*" $text]
set cellFont [getCellFont $win $key $col]
set pixels [lindex $data(colList) [expr {2*$col}]]
set workPixels $pixels
if {$pixels == 0} { ;# convention: dynamic width
set textSav $text
getAuxData $win $key $col auxType auxWidthSav
getIndentData $win $key $col indentWidthSav
if {$data($col-maxPixels) > 0} {
set workPixels $data($col-maxPixels)
}
}
set aux [getAuxData $win $key $col auxType auxWidth $workPixels]
set indent [getIndentData $win $key $col indentWidth]
set maxTextWidth $workPixels
if {$workPixels != 0} {
incr workPixels $data($col-delta)
set maxTextWidth \
[getMaxTextWidth $workPixels $auxWidth $indentWidth]
if {$data($col-wrap) && !$multiline} {
if {[font measure $cellFont -displayof $win $text] >
$maxTextWidth} {
set multiline 1
}
}
}
set alignment [lindex $data(colList) [expr {2*$col + 1}]]
set snipSide $snipSides($alignment,$data($col-changesnipside))
if {$multiline} {
set list [split $text "\n"]
if {$data($col-wrap)} {
set snipSide ""
}
adjustMlElem $win list auxWidth indentWidth $cellFont \
$workPixels $snipSide $data(-snipstring)
set msgScript [list ::tablelist::displayText $win $key \
$col [join $list "\n"] $cellFont \
$maxTextWidth $alignment]
} else {
adjustElem $win text auxWidth indentWidth $cellFont \
$workPixels $snipSide $data(-snipstring)
}
if {!$data($col-hide)} {
if {$inBody &&
$row == $data(editRow) && $col == $data(editCol)} {
#
# Configure the edit window
#
setEditWinFont $win
} else {
#
# Update the text widget's content between the two tabs
#
findTabs $win $w $line $col $col tabIdx1 tabIdx2
if {$multiline} {
updateMlCell $w $tabIdx1+1$pu $tabIdx2 $msgScript $aux \
$auxType $auxWidth $indent $indentWidth \
$alignment [getVAlignment $win $key $col]
} else {
updateCell $w $tabIdx1+1$pu $tabIdx2 $text $aux \
$auxType $auxWidth $indent $indentWidth \
$alignment [getVAlignment $win $key $col]
}
}
}
#
# Adjust the columns if necessary
#
if {$pixels == 0 && ![arrElemExists data $key-elide] &&
![arrElemExists data $key-hide]} {
set text $textSav
set auxWidth $auxWidthSav
set indentWidth $indentWidthSav
set newElemWidth [getElemWidth $win $text $auxWidth \
$indentWidth $cellFont]
if {$newElemWidth > $data($col-elemWidth)} {
set data($col-elemWidth) $newElemWidth
set data($col-widestCount) 1
if {$newElemWidth > $data($col-reqPixels)} {
set data($col-reqPixels) $newElemWidth
adjustColumns $win {} 1
}
} else {
set oldElemWidth [getElemWidth $win $text $auxWidth \
$indentWidth $oldCellFont]
if {$oldElemWidth < $data($col-elemWidth) &&
$newElemWidth == $data($col-elemWidth)} {
incr data($col-widestCount)
} elseif {$oldElemWidth == $data($col-elemWidth) &&
$newElemWidth < $oldElemWidth &&
[incr data($col-widestCount) -1] == 0} {
adjustColumns $win $col 1
}
}
}
updateViewWhenIdle $win
}
-image {
if {$data(isDisabled)} {
return ""
}
if {$inBody} {
displayItems $win
}
#
# Save the old image or window width
#
set item [lindex $data(${p}itemList) $row]
set key [lindex $item end]
set name $key,$col$opt
getAuxData $win $key $col oldAuxType oldAuxWidth
#
# Delete data($name) or save the specified value in it
#
set imgLabel $w.img_$key,$col
if {[string length $val] == 0} {
if {[arrElemExists data $name]} {
unset data($name)
if {$inBody} {
incr data(imgCount) -1
}
destroy $imgLabel
}
} else {
if {[catch {image type $val} result] != 0} {
return -code error $result
}
if {$inBody && ![arrElemExists data $name]} {
incr data(imgCount)
}
if {[winfo exists $imgLabel] &&
[string compare $val $data($name)] != 0} {
destroy $imgLabel
}
set data($name) $val
}
#
# Adjust the cell text and the image or window width
#
set pixels [lindex $data(colList) [expr {2*$col}]]
set workPixels $pixels
set text [lindex $item $col]
if {[lindex $data(fmtCmdFlagList) $col]} {
set text [formatElem $win $key $row $col $text]
}
if {[string match "*\t*" $text]} {
set text [mapTabs $text]
}
set oldText $text
set multiline [string match "*\n*" $text]
set cellFont [getCellFont $win $key $col]
if {$pixels == 0} { ;# convention: dynamic width
set textSav $text
getAuxData $win $key $col auxType auxWidthSav
getIndentData $win $key $col indentWidthSav
if {$data($col-maxPixels) > 0} {
set workPixels $data($col-maxPixels)
}
}
set aux [getAuxData $win $key $col auxType auxWidth $workPixels]
set indent [getIndentData $win $key $col indentWidth]
set maxTextWidth $workPixels
if {$workPixels != 0} {
incr workPixels $data($col-delta)
set maxTextWidth \
[getMaxTextWidth $workPixels $auxWidth $indentWidth]
if {$data($col-wrap) && !$multiline} {
if {[font measure $cellFont -displayof $win $text] >
$maxTextWidth} {
set multiline 1
}
}
}
set alignment [lindex $data(colList) [expr {2*$col + 1}]]
set snipSide $snipSides($alignment,$data($col-changesnipside))
if {$multiline} {
set list [split $text "\n"]
if {$data($col-wrap)} {
set snipSide ""
}
adjustMlElem $win list auxWidth indentWidth $cellFont \
$workPixels $snipSide $data(-snipstring)
set msgScript [list ::tablelist::displayText $win $key \
$col [join $list "\n"] $cellFont \
$maxTextWidth $alignment]
} else {
adjustElem $win text auxWidth indentWidth $cellFont \
$workPixels $snipSide $data(-snipstring)
}
if {(!$data($col-hide) || $canElide) && (!$inBody ||
$row != $data(editRow) || $col != $data(editCol))} {
#
# Delete the old cell content between the two tabs,
# and insert the text and the auxiliary object
#
findTabs $win $w [expr {$row + $diff}] $col $col tabIdx1 tabIdx2
if {$multiline} {
updateMlCell $w $tabIdx1+1$pu $tabIdx2 $msgScript $aux \
$auxType $auxWidth $indent $indentWidth \
$alignment [getVAlignment $win $key $col]
} else {
updateCell $w $tabIdx1+1$pu $tabIdx2 $text $aux \
$auxType $auxWidth $indent $indentWidth \
$alignment [getVAlignment $win $key $col]
}
}
#
# Adjust the columns if necessary
#
if {$pixels == 0 && ![arrElemExists data $key-elide] &&
![arrElemExists data $key-hide]} {
set text $textSav
set auxWidth $auxWidthSav
set indentWidth $indentWidthSav
set newElemWidth [getElemWidth $win $text $auxWidth \
$indentWidth $cellFont]
if {$newElemWidth > $data($col-elemWidth)} {
set data($col-elemWidth) $newElemWidth
set data($col-widestCount) 1
if {$newElemWidth > $data($col-reqPixels)} {
set data($col-reqPixels) $newElemWidth
adjustColumns $win {} 1
}
} else {
set oldElemWidth [getElemWidth $win $oldText $oldAuxWidth \
$indentWidth $cellFont]
if {$oldElemWidth < $data($col-elemWidth) &&
$newElemWidth == $data($col-elemWidth)} {
incr data($col-widestCount)
} elseif {$oldElemWidth == $data($col-elemWidth) &&
$newElemWidth < $oldElemWidth &&
[incr data($col-widestCount) -1] == 0} {
adjustColumns $win $col 1
}
}
}
updateViewWhenIdle $win
}
-imagebackground -
-windowupdate {
set key [lindex $data(${p}keyList) $row]
set name $key,$col$opt
#
# Delete data($name) or save the specified value in it
#
if {[string length $val] == 0} {
arrayUnset data $name
} else {
set data($name) $val
}
if {!$data(isDisabled)} {
${p}updateColorsWhenIdle $win
}
}
-indent {
if {$data(isDisabled)} {
return ""
}
displayItems $win
#
# Save the old indentation width
#
set item [lindex $data(itemList) $row]
set key [lindex $item end]
set name $key,$col$opt
getIndentData $win $key $col oldIndentWidth
#
# Delete data($name) or save the specified value in it
#
set indentLabel $w.ind_$key,$col
if {[string length $val] == 0} {
if {[arrElemExists data $name]} {
unset data($name)
incr data(indentCount) -1
destroy $indentLabel
}
} else {
if {![arrElemExists data $name]} {
incr data(indentCount)
}
if {[winfo exists $indentLabel] &&
[string compare $val $data($name)] != 0} {
destroy $indentLabel
}
set data($name) $val
}
#
# Adjust the cell text and the image or window width
#
set pixels [lindex $data(colList) [expr {2*$col}]]
set workPixels $pixels
set text [lindex $item $col]
if {[lindex $data(fmtCmdFlagList) $col]} {
set text [formatElem $win $key $row $col $text]
}
if {[string match "*\t*" $text]} {
set text [mapTabs $text]
}
set oldText $text
set multiline [string match "*\n*" $text]
set cellFont [getCellFont $win $key $col]
if {$pixels == 0} { ;# convention: dynamic width
set textSav $text
getAuxData $win $key $col auxType auxWidthSav
getIndentData $win $key $col indentWidthSav
if {$data($col-maxPixels) > 0} {
set workPixels $data($col-maxPixels)
}
}
set aux [getAuxData $win $key $col auxType auxWidth $workPixels]
set indent [getIndentData $win $key $col indentWidth]
set maxTextWidth $workPixels
if {$workPixels != 0} {
incr workPixels $data($col-delta)
set maxTextWidth \
[getMaxTextWidth $workPixels $auxWidth $indentWidth]
if {$data($col-wrap) && !$multiline} {
if {[font measure $cellFont -displayof $win $text] >
$maxTextWidth} {
set multiline 1
}
}
}
set alignment [lindex $data(colList) [expr {2*$col + 1}]]
set snipSide $snipSides($alignment,$data($col-changesnipside))
if {$multiline} {
set list [split $text "\n"]
if {$data($col-wrap)} {
set snipSide ""
}
adjustMlElem $win list auxWidth indentWidth $cellFont \
$workPixels $snipSide $data(-snipstring)
set msgScript [list ::tablelist::displayText $win $key \
$col [join $list "\n"] $cellFont \
$maxTextWidth $alignment]
} else {
adjustElem $win text auxWidth indentWidth $cellFont \
$workPixels $snipSide $data(-snipstring)
}
if {(!$data($col-hide) || $canElide) &&
($row != $data(editRow) || $col != $data(editCol))} {
#
# Delete the old cell content between the two tabs,
# and insert the text and the auxiliary object
#
findTabs $win $w [expr {$row + 1}] $col $col tabIdx1 tabIdx2
if {$multiline} {
updateMlCell $w $tabIdx1+1$pu $tabIdx2 $msgScript $aux \
$auxType $auxWidth $indent $indentWidth \
$alignment [getVAlignment $win $key $col]
} else {
updateCell $w $tabIdx1+1$pu $tabIdx2 $text $aux \
$auxType $auxWidth $indent $indentWidth \
$alignment [getVAlignment $win $key $col]
}
}
#
# Adjust the columns if necessary
#
if {$pixels == 0 && ![arrElemExists data $key-elide] &&
![arrElemExists data $key-hide]} {
set text $textSav
set auxWidth $auxWidthSav
set indentWidth $indentWidthSav
set newElemWidth [getElemWidth $win $text $auxWidth \
$indentWidth $cellFont]
if {$newElemWidth > $data($col-elemWidth)} {
set data($col-elemWidth) $newElemWidth
set data($col-widestCount) 1
if {$newElemWidth > $data($col-reqPixels)} {
set data($col-reqPixels) $newElemWidth
adjustColumns $win {} 1
}
} else {
set oldElemWidth [getElemWidth $win $oldText $auxWidth \
$oldIndentWidth $cellFont]
if {$oldElemWidth < $data($col-elemWidth) &&
$newElemWidth == $data($col-elemWidth)} {
incr data($col-widestCount)
} elseif {$oldElemWidth == $data($col-elemWidth) &&
$newElemWidth < $oldElemWidth &&
[incr data($col-widestCount) -1] == 0} {
adjustColumns $win $col 1
}
}
}
updateViewWhenIdle $win
}
-selectbackground -
-selectforeground {
set key [lindex $data(keyList) $row]
set name $key,$col$opt
if {[string length $val] == 0} {
arrayUnset data $name
} else {
#
# Configure the tag cell$opt-$val in the body text widget
#
set tag cell$opt-$val
set optTail [string range $opt 7 end] ;# remove the -select
$w tag configure $tag -$optTail $val
$w tag lower $tag disabled
#
# Save val in data($name)
#
set data($name) $val
}
if {!$data(isDisabled)} {
updateColorsWhenIdle $win
}
}
-stretchwindow {
#
# Save the boolean value specified by val in data($key,$col$opt)
#
set item [lindex $data(${p}itemList) $row]
set key [lindex $item end]
set name $key,$col$opt
if {$val} {
set data($name) 1
} else {
arrayUnset data $name
}
if {($data($col-hide) && !$canElide) ||
($inBody && $row == $data(editRow) && $col == $data(editCol))} {
return ""
}
set pixels [lindex $data(colList) [expr {2*$col}]]
set text [lindex $item $col]
if {[lindex $data(fmtCmdFlagList) $col]} {
set text [formatElem $win $key $row $col $text]
}
if {[string match "*\t*" $text]} {
set text [mapTabs $text]
}
set multiline [string match "*\n*" $text]
set cellFont [getCellFont $win $key $col]
if {$pixels == 0} { ;# convention: dynamic width
if {$data($col-maxPixels) > 0} {
if {$data($col-reqPixels) > $data($col-maxPixels)} {
set pixels $data($col-maxPixels)
}
}
}
set aux [getAuxData $win $key $col auxType auxWidth $pixels]
if {$auxType < 2} { ;# no window
return ""
}
if {$inBody} {
displayItems $win
}
set indent [getIndentData $win $key $col indentWidth]
set maxTextWidth $pixels
if {$pixels != 0} {
incr pixels $data($col-delta)
set maxTextWidth \
[getMaxTextWidth $pixels $auxWidth $indentWidth]
if {$data($col-wrap) && !$multiline} {
if {[font measure $cellFont -displayof $win $text] >
$maxTextWidth} {
set multiline 1
}
}
}
#
# Adjust the cell text and the window width
#
set alignment [lindex $data(colList) [expr {2*$col + 1}]]
set snipSide $snipSides($alignment,$data($col-changesnipside))
if {$multiline} {
set list [split $text "\n"]
if {$data($col-wrap)} {
set snipSide ""
}
adjustMlElem $win list auxWidth indentWidth $cellFont \
$pixels $snipSide $data(-snipstring)
set msgScript [list ::tablelist::displayText $win $key $row \
[join $list "\n"] $cellFont \
$maxTextWidth $alignment]
} else {
adjustElem $win text auxWidth indentWidth $cellFont \
$pixels $snipSide $data(-snipstring)
}
#
# Update the text widget's content between the two tabs
#
findTabs $win $w [expr {$row + $diff}] $col $col tabIdx1 tabIdx2
if {$multiline} {
updateMlCell $w $tabIdx1+1$pu $tabIdx2 $msgScript $aux \
$auxType $auxWidth $indent $indentWidth \
$alignment [getVAlignment $win $key $col]
} else {
updateCell $w $tabIdx1+1$pu $tabIdx2 $text $aux \
$auxType $auxWidth $indent $indentWidth \
$alignment [getVAlignment $win $key $col]
}
}
-text {
if {$data(isDisabled)} {
return ""
}
if {$inBody} {
displayItems $win
}
set pixels [lindex $data(colList) [expr {2*$col}]]
set workPixels $pixels
set text $val
set oldItem [lindex $data(${p}itemList) $row]
set key [lindex $oldItem end]
set fmtCmdFlag [lindex $data(fmtCmdFlagList) $col]
if {$fmtCmdFlag} {
set text [formatElem $win $key $row $col $text]
}
if {[string match "*\t*" $text]} {
set text [mapTabs $text]
}
set textSav $text
set multiline [string match "*\n*" $text]
set cellFont [getCellFont $win $key $col]
if {$pixels == 0} { ;# convention: dynamic width
getAuxData $win $key $col auxType auxWidthSav
getIndentData $win $key $col indentWidthSav
if {$data($col-maxPixels) > 0} {
set workPixels $data($col-maxPixels)
}
}
set aux [getAuxData $win $key $col auxType auxWidth $workPixels]
set indent [getIndentData $win $key $col indentWidth]
set maxTextWidth $workPixels
if {$workPixels != 0} {
incr workPixels $data($col-delta)
set maxTextWidth \
[getMaxTextWidth $workPixels $auxWidth $indentWidth]
if {$data($col-wrap) && !$multiline} {
if {[font measure $cellFont -displayof $win $text] >
$maxTextWidth} {
set multiline 1
}
}
}
set alignment [lindex $data(colList) [expr {2*$col + 1}]]
#
# Adjust the cell text and the image or window width
#
set snipSide $snipSides($alignment,$data($col-changesnipside))
if {$multiline} {
set list [split $text "\n"]
if {$data($col-wrap)} {
set snipSide ""
}
adjustMlElem $win list auxWidth indentWidth $cellFont \
$workPixels $snipSide $data(-snipstring)
set msgScript [list ::tablelist::displayText $win $key \
$col [join $list "\n"] $cellFont \
$maxTextWidth $alignment]
} else {
adjustElem $win text auxWidth indentWidth $cellFont \
$workPixels $snipSide $data(-snipstring)
}
if {(!$data($col-hide) || $canElide) && (!$inBody ||
$row != $data(editRow) || $col != $data(editCol))} {
#
# Update the text widget's content between the two tabs
#
findTabs $win $w [expr {$row + $diff}] $col $col tabIdx1 tabIdx2
if {$multiline} {
updateMlCell $w $tabIdx1+1$pu $tabIdx2 $msgScript $aux \
$auxType $auxWidth $indent $indentWidth \
$alignment [getVAlignment $win $key $col]
} else {
updateCell $w $tabIdx1+1$pu $tabIdx2 $text $aux \
$auxType $auxWidth $indent $indentWidth \
$alignment [getVAlignment $win $key $col]
}
}
#
# Replace the cell's content in the internal list
#
set newItem [lreplace $oldItem $col $col $val]
set data(${p}itemList) \
[lreplace $data(${p}itemList) $row $row $newItem]
#
# Replace the cell's content in the list variable if present
#
if {$inBody && $data(hasListVar) &&
[uplevel #0 [list info exists $data(-listvariable)]]} {
upvar #0 $data(-listvariable) var
trace vdelete var wu $data(listVarTraceCmd)
set var [lreplace $var $row $row \
[lrange $newItem 0 $data(lastCol)]]
trace variable var wu $data(listVarTraceCmd)
}
#
# Adjust the columns if necessary
#
if {$pixels == 0 && ![arrElemExists data $key-elide] &&
![arrElemExists data $key-hide]} {
set text $textSav
set auxWidth $auxWidthSav
set indentWidth $indentWidthSav
set newElemWidth [getElemWidth $win $text $auxWidth \
$indentWidth $cellFont]
if {$newElemWidth > $data($col-elemWidth)} {
set data($col-elemWidth) $newElemWidth
set data($col-widestCount) 1
if {$newElemWidth > $data($col-reqPixels)} {
set data($col-reqPixels) $newElemWidth
adjustColumns $win {} 1
}
} else {
set oldText [lindex $oldItem $col]
if {$fmtCmdFlag} {
set oldText [formatElem $win $key $row $col $oldText]
}
if {[string match "*\t*" $oldText]} {
set oldText [mapTabs $oldText]
}
set oldElemWidth [getElemWidth $win $oldText $auxWidth \
$indentWidth $cellFont]
if {$oldElemWidth < $data($col-elemWidth) &&
$newElemWidth == $data($col-elemWidth)} {
incr data($col-widestCount)
} elseif {$oldElemWidth == $data($col-elemWidth) &&
$newElemWidth < $oldElemWidth &&
[incr data($col-widestCount) -1] == 0} {
adjustColumns $win $col 1
}
}
}
if {$inBody} {
showLineNumbersWhenIdle $win
}
updateViewWhenIdle $win
}
-valign {
#
# Save the properly formatted value of val in
# data($key,$col$opt) and redisplay the cell
#
variable valignments
set val [mwutil::fullOpt "vertical alignment" $val $valignments]
set key [lindex $data(${p}keyList) $row]
set data($key,$col$opt) $val
redisplayCol $win $col $row $row $inBody
}
-window {
if {$data(isDisabled)} {
return ""
}
if {$inBody} {
displayItems $win
}
#
# Save the old image or window width
#
set item [lindex $data(${p}itemList) $row]
set key [lindex $item end]
set name $key,$col$opt
getAuxData $win $key $col oldAuxType oldAuxWidth
getIndentData $win $key $col oldIndentWidth
#
# Delete data($name) or save the specified value in it
#
set aux $w.frm_$key,$col
if {[string length $val] == 0} {
if {[arrElemExists data $name]} {
unset data($name)
unset data($key,$col-reqWidth)
unset data($key,$col-reqHeight)
#
# If the cell index is contained in the list
# data(${p}cellsToReconfig) then remove it from the list
#
set n [lsearch -exact $data(${p}cellsToReconfig) $row,$col]
if {$n >= 0} {
set data(${p}cellsToReconfig) \
[lreplace $data(${p}cellsToReconfig) $n $n]
}
if {$inBody} {
incr data(winCount) -1
}
destroy $aux
}
} else {
if {$inBody && ![arrElemExists data $name]} {
incr data(winCount)
}
if {[arrElemExists data $name] &&
[string compare $val $data($name)] != 0} {
destroy $aux
}
if {![winfo exists $aux]} {
#
# Create the frame and evaluate the specified script
# that creates a child widget within the frame
#
tk::frame $aux -borderwidth 0 -class TablelistWindow \
-container 0 -highlightthickness 0 \
-relief flat -takefocus 0
catch {$aux configure -padx 0 -pady 0}
if {$inBody} {
bindtags $aux [linsert [bindtags $aux] 1 \
$data(bodyTag) TablelistBody]
} else {
bindtags $aux [linsert [bindtags $aux] 1 \
$data(headerTag) TablelistHeader]
}
uplevel #0 $val [list $win $row $col $aux.w]
}
set data($name) $val
set data($key,$col-reqWidth) [winfo reqwidth $aux.w]
set data($key,$col-reqHeight) [winfo reqheight $aux.w]
$aux configure -height $data($key,$col-reqHeight)
#
# Add the cell index to the list data(${p}cellsToReconfig)
# if the window's requested width or height is not yet known
#
if {($data($key,$col-reqWidth) == 1 ||
$data($key,$col-reqHeight) == 1) &&
[lsearch -exact $data(${p}cellsToReconfig) $row,$col] < 0} {
lappend data(${p}cellsToReconfig) $row,$col
if {![arrElemExists data reconfigId]} {
set data(reconfigId) \
[after idle [list tablelist::reconfigWindows $win]]
}
}
}
#
# Adjust the cell text and the image or window width
#
set pixels [lindex $data(colList) [expr {2*$col}]]
set workPixels $pixels
set text [lindex $item $col]
if {[lindex $data(fmtCmdFlagList) $col]} {
set text [formatElem $win $key $row $col $text]
}
if {[string match "*\t*" $text]} {
set text [mapTabs $text]
}
set oldText $text
set multiline [string match "*\n*" $text]
set cellFont [getCellFont $win $key $col]
if {$pixels == 0} { ;# convention: dynamic width
set textSav $text
getAuxData $win $key $col auxType auxWidthSav
getIndentData $win $key $col indentWidthSav
if {$data($col-maxPixels) > 0} {
set workPixels $data($col-maxPixels)
}
}
set aux [getAuxData $win $key $col auxType auxWidth $workPixels]
set indent [getIndentData $win $key $col indentWidth]
set maxTextWidth $workPixels
if {$workPixels != 0} {
incr workPixels $data($col-delta)
set maxTextWidth \
[getMaxTextWidth $workPixels $auxWidth $indentWidth]
if {$data($col-wrap) && !$multiline} {
if {[font measure $cellFont -displayof $win $text] >
$maxTextWidth} {
set multiline 1
}
}
}
set alignment [lindex $data(colList) [expr {2*$col + 1}]]
set snipSide $snipSides($alignment,$data($col-changesnipside))
if {$multiline} {
set list [split $text "\n"]
if {$data($col-wrap)} {
set snipSide ""
}
adjustMlElem $win list auxWidth indentWidth $cellFont \
$workPixels $snipSide $data(-snipstring)
set msgScript [list ::tablelist::displayText $win $key \
$col [join $list "\n"] $cellFont \
$maxTextWidth $alignment]
} else {
adjustElem $win text auxWidth indentWidth $cellFont \
$workPixels $snipSide $data(-snipstring)
}
if {(!$data($col-hide) || $canElide) && (!$inBody ||
$row != $data(editRow) || $col != $data(editCol))} {
#
# Delete the old cell content between the two tabs,
# and insert the text and the auxiliary object
#
findTabs $win $w [expr {$row + $diff}] $col $col tabIdx1 tabIdx2
if {$multiline} {
updateMlCell $w $tabIdx1+1$pu $tabIdx2 $msgScript $aux \
$auxType $auxWidth $indent $indentWidth \
$alignment [getVAlignment $win $key $col]
} else {
updateCell $w $tabIdx1+1$pu $tabIdx2 $text $aux \
$auxType $auxWidth $indent $indentWidth \
$alignment [getVAlignment $win $key $col]
}
}
#
# Adjust the columns if necessary
#
if {$pixels == 0 && ![arrElemExists data $key-elide] &&
![arrElemExists data $key-hide]} {
set text $textSav
set auxWidth $auxWidthSav
set indentWidth $indentWidthSav
set newElemWidth [getElemWidth $win $text $auxWidth \
$indentWidth $cellFont]
if {$newElemWidth > $data($col-elemWidth)} {
set data($col-elemWidth) $newElemWidth
set data($col-widestCount) 1
if {$newElemWidth > $data($col-reqPixels)} {
set data($col-reqPixels) $newElemWidth
adjustColumns $win {} 1
}
} else {
set oldElemWidth [getElemWidth $win $oldText $oldAuxWidth \
$oldIndentWidth $cellFont]
if {$oldElemWidth < $data($col-elemWidth) &&
$newElemWidth == $data($col-elemWidth)} {
incr data($col-widestCount)
} elseif {$oldElemWidth == $data($col-elemWidth) &&
$newElemWidth < $oldElemWidth &&
[incr data($col-widestCount) -1] == 0} {
adjustColumns $win $col 1
}
}
}
updateViewWhenIdle $win
}
-windowdestroy {
set key [lindex $data(${p}keyList) $row]
set name $key,$col$opt
#
# Delete data($name) or save the specified value in it
#
if {[string length $val] == 0} {
arrayUnset data $name
} else {
set data($name) $val
}
}
}
}
#------------------------------------------------------------------------------
# tablelist::doCellCget
#
# Returns the value of the cell configuration option opt for the cell row,col
# of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::doCellCget {row col win opt} {
upvar ::tablelist::ns${win}::data data
foreach {row p w inBody diff} [getConfigParams $win $row] {}
switch -- $opt {
-editable {
return [isCellEditable $win $row $col]
}
-editwindow {
return [getEditWindow $win $row $col 0]
}
-stretchwindow {
set key [lindex $data(${p}keyList) $row]
if {[arrElemExists data $key,$col$opt]} {
return $data($key,$col$opt)
} else {
return 0
}
}
-text {
return [lindex [lindex $data(${p}itemList) $row] $col]
}
-valign {
set key [lindex $data(${p}keyList) $row]
return [getVAlignment $win $key $col]
}
default {
set key [lindex $data(${p}keyList) $row]
if {[arrElemExists data $key,$col$opt]} {
return $data($key,$col$opt)
} else {
return ""
}
}
}
}
#------------------------------------------------------------------------------
# tablelist::defaultX11ArrowStyle
#
# Returns the default sort arrow style on X11, corresponding to the display's
# scaling level.
#------------------------------------------------------------------------------
proc tablelist::defaultX11ArrowStyle {} {
variable scalingpct
array set arr {100 8x4 125 9x5 150 11x6 175 13x7 200 15x8}
return flat$arr($scalingpct)
}
#------------------------------------------------------------------------------
# tablelist::defaultWinArrowSize
#
# Returns the size (of the form "x") of the default sort arrow
# on Windows, corresponding to the display's scaling level.
#------------------------------------------------------------------------------
proc tablelist::defaultWinArrowSize {} {
variable scalingpct
array set arr {100 7x4 125 9x5 150 11x6 175 13x7 200 15x8}
return $arr($scalingpct)
}
#------------------------------------------------------------------------------
# tablelist::makeListVar
#
# Arranges for the global variable specified by varName to become the list
# variable associated with the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::makeListVar {win varName} {
upvar ::tablelist::ns${win}::data data
if {[string length $varName] == 0} {
#
# If there is an old list variable associated with the
# widget then remove the trace set on this variable
#
if {$data(hasListVar) &&
[uplevel #0 [list info exists $data(-listvariable)]]} {
synchronize $win
upvar #0 $data(-listvariable) oldVar
trace vdelete oldVar wu $data(listVarTraceCmd)
}
return ""
}
#
# The list variable may be an array element but must not be an array
#
upvar #0 $varName var
if {![regexp {^(.*)\((.*)\)$} $varName dummy name1 name2]} {
if {[array exists var]} {
return -code error "variable \"$varName\" is array"
}
set name1 $varName
set name2 ""
}
#
# The value of the list variable (if any) must be a list of lists
#
if {[info exists var]} {
if {[catch {foreach item $var {llength $item}} err] != 0} {
return -code error "value of variable \"$varName\" is not a list\
of lists ($err)"
}
}
#
# If there is an old list variable associated with the
# widget then remove the trace set on this variable
#
if {$data(hasListVar) &&
[uplevel #0 [list info exists $data(-listvariable)]]} {
synchronize $win
upvar #0 $data(-listvariable) oldVar
trace vdelete oldVar wu $data(listVarTraceCmd)
}
if {[info exists var]} {
#
# Invoke the trace procedure associated with the new list variable
#
listVarTrace $win $name1 $name2 w
} else {
#
# Set $varName according to the value of data(itemList)
#
set var {}
foreach item $data(itemList) {
lappend var [lrange $item 0 $data(lastCol)]
}
}
#
# Set a trace on the new list variable
#
trace variable var wu $data(listVarTraceCmd)
}
#------------------------------------------------------------------------------
# tablelist::updateListboxSetgridOpt
#
# Updates the -setgrid option of the listbox child of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::updateListboxSetgridOpt win {
upvar ::tablelist::ns${win}::data data
if {$data(-width) <= 0 && [llength $data(-stretch)] != 0} {
$data(lb) configure -setgrid 0
} else {
$data(lb) configure -setgrid $data(-setgrid)
}
}
#------------------------------------------------------------------------------
# tablelist::isRowViewable
#
# Checks whether the given row of the tablelist widget win is viewable.
#------------------------------------------------------------------------------
proc tablelist::isRowViewable {win row} {
upvar ::tablelist::ns${win}::data data
set key [lindex $data(keyList) $row]
return [expr {![arrElemExists data $key-elide] &&
![arrElemExists data $key-hide]}]
}
#------------------------------------------------------------------------------
# tablelist::getCellFont
#
# Returns the font to be used in the tablelist cell specified by win, key, and
# col.
#------------------------------------------------------------------------------
proc tablelist::getCellFont {win key col} {
upvar ::tablelist::ns${win}::data data
if {[arrElemExists data $key,$col-font]} {
return $data($key,$col-font)
} elseif {[arrElemExists data $key-font]} {
return $data($key-font)
} else {
return [lindex $data(colFontList) $col]
}
}
#------------------------------------------------------------------------------
# tablelist::reconfigWindows
#
# Invoked as an after idle callback, this procedure forces any geometry manager
# calculations to be completed and then applies the -window option a second
# time to those cells whose embedded windows' requested widths or heights were
# still unknown.
#------------------------------------------------------------------------------
proc tablelist::reconfigWindows win {
#
# Force any geometry manager calculations to be completed first
#
update idletasks
if {[destroyed $win]} {
return ""
}
#
# Reconfigure the cells specified in the list data(cellsToReconfig)
#
upvar ::tablelist::ns${win}::data data
foreach cellIdx $data(cellsToReconfig) {
foreach {row col} [split $cellIdx ","] {}
set key [lindex $data(keyList) $row]
if {[arrElemExists data $key,$col-window]} {
doCellConfig $row $col $win -window $data($key,$col-window)
}
}
#
# Reconfigure the cells specified in the list data(hdr_cellsToReconfig)
#
foreach cellIdx $data(hdr_cellsToReconfig) {
foreach {row col} [split $cellIdx ","] {}
set key [lindex $data(hdr_keyList) $row]
if {[arrElemExists data $key,$col-window]} {
doCellConfig h$row $col $win -window $data($key,$col-window)
}
}
unset data(reconfigId)
set data(cellsToReconfig) {}
set data(hdr_cellsToReconfig) {}
}
#------------------------------------------------------------------------------
# tablelist::isCellEditable
#
# Checks whether the given cell of the tablelist widget win is editable.
#------------------------------------------------------------------------------
proc tablelist::isCellEditable {win row col} {
upvar ::tablelist::ns${win}::data data
set key [lindex $data(keyList) $row]
if {[arrElemExists data $key,$col-editable]} {
return $data($key,$col-editable)
} else {
return $data($col-editable)
}
}
#------------------------------------------------------------------------------
# tablelist::getEditWindow
#
# Returns the value of the -editwindow option at cell or column level for the
# given cell of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::getEditWindow {win row col {skipLeadingColons 1}} {
upvar ::tablelist::ns${win}::data data
set key [lindex $data(keyList) $row]
if {[arrElemExists data $key,$col-editwindow]} {
set name $data($key,$col-editwindow)
} elseif {[arrElemExists data $col-editwindow]} {
set name $data($col-editwindow)
} else {
return "entry"
}
if {[regexp {^::ttk::(entry|spinbox|combobox|checkbutton|menubutton)$} \
$name] && $skipLeadingColons} {
set name [string range $name 2 end]
}
return $name
}
#------------------------------------------------------------------------------
# tablelist::getVAlignment
#
# Returns the value of the -valign option at cell or column level for the given
# cell of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::getVAlignment {win key col} {
upvar ::tablelist::ns${win}::data data
if {[arrElemExists data $key,$col-valign]} {
return $data($key,$col-valign)
} else {
return $data($col-valign)
}
}
#------------------------------------------------------------------------------
# tablelist::getConfigParams
#
# For a given row argument of the form h or , the procedure
# returns a list consisting of , the prefix "hdr_" or "" (for
# "keyList", "itemList", "cellsToReconfig", and "updateColorsWhenIdle"), the
# text widget path name $data(hdrTxt) or $data(body), 0 (false) or 1 (true)
# indicating whether this is the tablelist's body, and 2 or 1 (the difference
# between the text widget line number corresponding to and
# itself).
#------------------------------------------------------------------------------
proc tablelist::getConfigParams {win row} {
upvar ::tablelist::ns${win}::data data
if {[string match "h*" $row]} {
return [list [string range $row 1 end] "hdr_" $data(hdrTxt) 0 2]
} else {
return [list $row "" $data(body) 1 1]
}
}