From ea3ee543f5b86eba73205ebc6f1b6f01e931f766 Mon Sep 17 00:00:00 2001 From: markus Date: Fri, 26 May 2017 09:23:49 +0000 Subject: [PATCH 001/150] Update the rdial package in the controlwidgets module to version 0.7 - support for mouse wheels on Windows and Linux. OSX not tested yet. --- examples/controlwidget/demo-rdial.tcl | 2 +- modules/controlwidget/ChangeLog | 6 ++ modules/controlwidget/controlwidget.man | 6 ++ modules/controlwidget/pkgIndex.tcl | 2 +- modules/controlwidget/rdial.tcl | 131 +++++++++++++++++------- 5 files changed, 108 insertions(+), 39 deletions(-) diff --git a/examples/controlwidget/demo-rdial.tcl b/examples/controlwidget/demo-rdial.tcl index e8cc3df7..844241f1 100755 --- a/examples/controlwidget/demo-rdial.tcl +++ b/examples/controlwidget/demo-rdial.tcl @@ -37,7 +37,7 @@ proc show_value {which v} { } } } -label .lb -text "Use mouse button with Shift &\nControl for dragging the dials" +label .lb -text "Use mouse button with Shift &\nControl for dragging the dials\nwith Mousewheel support" label .lv -textvariable disp_value(rv) controlwidget::rdial .rv -callback {show_value rv} -value $disp_value(rv)\ -width 200 -step 5 -bg blue -fg white \ diff --git a/modules/controlwidget/ChangeLog b/modules/controlwidget/ChangeLog index 39e4a4a0..9d7366c8 100644 --- a/modules/controlwidget/ChangeLog +++ b/modules/controlwidget/ChangeLog @@ -1,3 +1,9 @@ +2017-05-22 Arjen Markus + * demo-rdial.tcl: Updated demo for the rdial widget + * rdial.tcl: Added support for mousewheel + * pkgIndex.tcl: Bumped verion of rdial to 0.7 + * controlwidget.man: Added description of new options and support of mousewheel + 2010-10-06 Arjen Markus * demo-*.tcl: Added shebang and package require statements as per ticket 19721eff15 * demo-meters.tcl: Changed line-endings to UNIX convention as per ticket af953d9fbf diff --git a/modules/controlwidget/controlwidget.man b/modules/controlwidget/controlwidget.man index 657de96d..836992e2 100755 --- a/modules/controlwidget/controlwidget.man +++ b/modules/controlwidget/controlwidget.man @@ -344,6 +344,10 @@ Color for the needle and the pin [call [cmd ::controlwidget::rdial] [arg w] [arg args]] Create a rotating dial. You can drag the dial to change the value. With the shift button depressed the value changes slowly, with the control button depressed it changes fast. +Similarly, you can control the dial via the mouse wheel, with the shift and control button +working in the same way as with the mouse pointer. + +[emph Note:] The shift and control buttons currently have no effect on Windows. [list_begin arguments] [arg_def widget w in] @@ -361,6 +365,8 @@ Value for the dial (if not associated with a variable) Whether a horizontal disk/dial is required ("horizontal") or a vertical one ("vertical") [opt_def step value] Initial step for incrementing or decrementing the value +[opt_def bindwheel value] +Step size for controlling the dial's value via the mouse wheel [opt_def slow value] Factor on the step size for incrementing or decrementing the value slowly [opt_def fast value] diff --git a/modules/controlwidget/pkgIndex.tcl b/modules/controlwidget/pkgIndex.tcl index aa4473a5..99c5f1e5 100755 --- a/modules/controlwidget/pkgIndex.tcl +++ b/modules/controlwidget/pkgIndex.tcl @@ -12,7 +12,7 @@ if {![package vsatisfies [package provide Tcl] 8.5]} { package ifneeded controlwidget 0.1 [list source [file join $dir controlwidget.tcl]] package ifneeded meter 1.0 [list source [file join $dir vertical_meter.tcl]] package ifneeded led 1.0 [list source [file join $dir led.tcl]] -package ifneeded rdial 0.3 [list source [file join $dir rdial.tcl]] +package ifneeded rdial 0.7 [list source [file join $dir rdial.tcl]] package ifneeded tachometer 0.1 [list source [file join $dir tachometer.tcl]] package ifneeded voltmeter 0.1 [list source [file join $dir voltmeter.tcl]] package ifneeded radioMatrix 1.0 [list source [file join $dir radioMatrix.tcl]] diff --git a/modules/controlwidget/rdial.tcl b/modules/controlwidget/rdial.tcl index bd7feec2..df7f8ab9 100755 --- a/modules/controlwidget/rdial.tcl +++ b/modules/controlwidget/rdial.tcl @@ -30,8 +30,8 @@ # # THE AUTHOR AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND -# NON-INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +# NON-INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, # AND THE AUTHOR AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE # MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. # @@ -41,12 +41,20 @@ # rdial::create w ?-width wid? ?-height hgt? ?-value floatval? # ?-bg|-background bcol? ?-fg|-foreground fcol? ?-step step? # ?-callback script? ?-scale "degrees"|"radians"|factor? -# ?-slow sfact? ?-fast ffact? ?-orient horizontal|vertical? +# ?-slow sfact? ?-fast ffact? ?-orient "horizontal"|"vertical"? +# ?-variable varname? ?-bindwheel step? # # History: # 20100526: -scale option added # 20100626: incorrect "rotation direction" in vertical mode repaired # 20100704: added -variable option and methods get and set (AM) +# 20101020: bug {[info exists ...]<0} => {![info exists ...]} repaired +# 20101112: drag: set opt(-value) depending on scale - thank's Manfred R. +# 20101118: -variable option added +# 20170518: -bindwheel option added for scrollwheel input +# 20170523: boolean variable buttonwheel controls Button/Wheel binding. +# if false the event is used (by default in Windows), +# the event if it is false (other systems). # # Todo: # option -variable -- conflicts with -value @@ -82,6 +90,7 @@ snit::widget controlwidget::rdial { option -fast -default 10 option -scale -default 1.0 -configuremethod SetOption option -variable -default {} -configuremethod VariableName + option -bindwheel -default 2.0 -configuremethod SetOption variable d2r variable sfact @@ -89,9 +98,17 @@ snit::widget controlwidget::rdial { variable ovalue variable sector 88 variable callback + variable buttonwheel 1 + variable wheelfactor 15.0 constructor args { + + # I did not find a platform independent method :-( + if {$::tcl_platform(platform) eq "windows"} { + set buttonwheel 0 + } + # # A few constants to reduce expr # @@ -108,8 +125,6 @@ snit::widget controlwidget::rdial { grid $win.c -sticky nsew - # just for laziness ;) - set nsc [namespace current] set wid $options(-width) set hgt $options(-height) set bgc $options(-background) @@ -119,30 +134,50 @@ snit::widget controlwidget::rdial { $win.c configure -width $wid -height $hgt # standard bindings bind $win.c [list $self SetVar ovalue %x] - bind $win.c [list $self drag %W %x] - bind $win.c [list $self drag %W %x] - # fine movement - bind $win.c [list $self SetVar ovalue %x] - bind $win.c [list $self drag %W %x -1] - bind $win.c [list $self drag %W %x -1] + bind $win.c [list $self drag %W %x 0] + bind $win.c [list $self drag %W %x 0] # course movement + bind $win.c [list $self SetVar ovalue %x] + bind $win.c [list $self drag %W %x 1] + bind $win.c [list $self drag %W %x 1] + # fine movement bind $win.c [list $self SetVar ovalue %x] - bind $win.c [list $self drag %W %x 1] - bind $win.c [list $self drag %W %x 1] + bind $win.c [list $self drag %W %x -1] + bind $win.c [list $self drag %W %x -1] } else { $win.c configure -width $hgt -height $wid - # standard bindings + # standard binding bind $win.c [list $self SetVar ovalue %y] - bind $win.c [list $self drag %W %y] - bind $win.c [list $self drag %W %y] - # fine movement - bind $win.c [list $self SetVar ovalue %y] - bind $win.c [list $self drag %W %y -1] - bind $win.c [list $self drag %W %y -1] + bind $win.c [list $self drag %W %y 0] + bind $win.c [list $self drag %W %y 0] # course movement + bind $win.c [list $self SetVar ovalue %y] + bind $win.c [list $self drag %W %y 1] + bind $win.c [list $self drag %W %y 1] + # fine movement bind $win.c [list $self SetVar ovalue %y] - bind $win.c [list $self drag %W %y 1] - bind $win.c [list $self drag %W %y 1] + bind $win.c [list $self drag %W %y -1] + bind $win.c [list $self drag %W %y -1] + } + if {$options(-bindwheel) != 0} { + if {$buttonwheel} { + set up $options(-bindwheel) + set dn [expr {0.0 - $up}] + # standard binding + bind $win.c [list $self roll %W $up 0] + bind $win.c [list $self roll %W $dn 0] + # course movement + bind $win.c [list $self roll %W $up 1] + bind $win.c [list $self roll %W $dn 1] + # fine movement + bind $win.c [list $self roll %W $up -1] + bind $win.c [list $self roll %W $dn -1] + } else { + # it seem that Shift+Control doesn't work :-( + bind $win.c [list $self roll %W %D 0] + bind $win.c [list $self roll %W %D 1] + bind $win.c [list $self roll %W %D -1] + } } if {$options(-variable) ne ""} { @@ -155,7 +190,6 @@ snit::widget controlwidget::rdial { trace add variable ::$options(-variable) write [mymethod variableChanged] } - # draw insides $self draw $win.c $options(-value) } @@ -269,7 +303,6 @@ snit::widget controlwidget::rdial { # draw the thumb wheel view method draw {w val} { - set stp $options(-step) set wid $options(-width) set hgt $options(-height) @@ -310,8 +343,22 @@ snit::widget controlwidget::rdial { set options(-value) $val } - method drag {w coord {mode 0}} { - variable opt + # update rdials after value change + method rdupdate {w diff} { + # calculate "new" calue + set options(-value) [expr {$options(-value)+$diff*$options(-scale)}] + + # call callback if defined... + if {$options(-callback) ne ""} { + {*}$options(-callback) $options(-value) + } + + # draw knob with new angle + $self draw $w $options(-value) + } + + # change by mouse dragging + method drag {w coord mode} { variable ovalue # calculate new value @@ -325,22 +372,29 @@ snit::widget controlwidget::rdial { } elseif {$mode>0} { set diff [expr {$diff*$options(-fast)}] } - set options(-value) [expr {$options(-value)+$diff}] - - # call callback if defined... - if {$options(-callback) ne ""} { - {*}$options(-callback) [expr {$options(-value)*$options(-scale)}] - } + $self rdupdate $w $diff - # draw knob with new angle - $self draw $win.c $options(-value) # store "old" value for diff set ovalue $coord } + + # change by mouse wheel + method roll {w diff mode} { + + if {! $buttonwheel} { + set diff [expr {$diff/$wheelfactor/$options(-bindwheel)}] + } + if {$mode<0} { + set diff [expr {$diff*$options(-slow)}] + } elseif {$mode>0} { + set diff [expr {$diff*$options(-fast)}] + } + $self rdupdate $w $diff + } } # Announce our presence -package provide rdial 0.3 +package provide rdial 0.7 #-------- test & demo ... disable it for package autoloading -> {0} if {0} { @@ -373,11 +427,14 @@ if {0} { } } } - label .lb -text "Use mouse button with Shift &\nControl for dragging the dials" + set help "Use mouse button with Shift &" + append help "\nControl for dragging the dials" + append help "\nwith Mouswheel support" + label .lb -text $help label .lv -textvariable disp_value(rv) controlwidget::rdial .rv -callback {show_value rv} -value $disp_value(rv)\ -width 200 -step 5 -bg blue -fg white \ - -variable score + -variable score -bindwheel -10.0 label .lh -textvariable disp_value(rh) controlwidget::rdial .rh -callback {show_value rh} -value $disp_value(rh)\ -width $disp_value(rh) -height 20 -fg blue -bg yellow -orient vertical From c0cf460ea63a483be71bdae04ea0fd7d83d5d9d3 Mon Sep 17 00:00:00 2001 From: csaba Date: Fri, 23 Jun 2017 19:23:40 +0000 Subject: [PATCH 002/150] * *.tcl: Bumped the version number to 5.18. * COPYRIGHT.txt: * README.txt: * CHANGES.txt: Updated to reflect the changes. * scripts/*.tcl: Improved the performance of the vertical scrolling; added the "-displayondemand" configuration option; added the "tablelist::delaySashPosUpdates" command; added support for the themes "Arc" and "clearlooks"; updated the support for a few other themes; fixed a bug related to retrieving the current cell selection; numerous further improvements. * scripts/tclIndex: Newly generated. * doc/*.html: Updated to reflect the changes; more on the "-formatcommand" column configuration option in connection with "-sortmode integer|real"; minor improvements. * doc/browse.png: Updated screenshots. * doc/browseTree.png: * doc/bwidget.png: * doc/config.png: * doc/dirViewer.png: * doc/embeddedWindows.png: * doc/embeddedWindows_tile.png: * doc/tileWidgets.png: * ../../examples/*.tcl: Bumped the version number to 5.18; minor improvements. --- modules/tablelist/ChangeLog | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/modules/tablelist/ChangeLog b/modules/tablelist/ChangeLog index 6aafc40e..c71376dd 100644 --- a/modules/tablelist/ChangeLog +++ b/modules/tablelist/ChangeLog @@ -1,3 +1,36 @@ +2017-06-23 Csaba Nemethi + + * *.tcl: Bumped the version number to 5.18. + * COPYRIGHT.txt: + * README.txt: + + * CHANGES.txt: Updated to reflect the changes. + + * scripts/*.tcl: Improved the performance of the vertical scrolling; + added the "-displayondemand" configuration option; added the + "tablelist::delaySashPosUpdates" command; added support for the + themes "Arc" and "clearlooks"; updated the support for a few other + themes; fixed a bug related to retrieving the current cell selection; + numerous further improvements. + + * scripts/tclIndex: Newly generated. + + * doc/*.html: Updated to reflect the changes; more on the + "-formatcommand" column configuration option in connection with + "-sortmode integer|real"; minor improvements. + + * doc/browse.png: Updated screenshots. + * doc/browseTree.png: + * doc/bwidget.png: + * doc/config.png: + * doc/dirViewer.png: + * doc/embeddedWindows.png: + * doc/embeddedWindows_tile.png: + * doc/tileWidgets.png: + + * ../../examples/*.tcl: Bumped the version number to 5.18; minor + improvements. + 2017-03-22 Csaba Nemethi * *.tcl: Bumped the version number to 5.17. From a43e1da7d07a608e3b844b9cb8f7af47f21e193d Mon Sep 17 00:00:00 2001 From: csaba Date: Fri, 23 Jun 2017 19:24:39 +0000 Subject: [PATCH 003/150] * *.tcl: Bumped the version number to 5.18. * COPYRIGHT.txt: * README.txt: --- modules/tablelist/COPYRIGHT.txt | 2 +- modules/tablelist/README.txt | 14 +++++++------- modules/tablelist/pkgIndex.tcl | 14 +++++++------- modules/tablelist/tablelist.tcl | 2 +- modules/tablelist/tablelistPublic.tcl | 2 +- modules/tablelist/tablelist_tile.tcl | 2 +- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/modules/tablelist/COPYRIGHT.txt b/modules/tablelist/COPYRIGHT.txt index f92b2874..c2871af4 100644 --- a/modules/tablelist/COPYRIGHT.txt +++ b/modules/tablelist/COPYRIGHT.txt @@ -1,4 +1,4 @@ -Multi-column listbox and tree widget package Tablelist, version 5.17 +Multi-column listbox and tree widget package Tablelist, version 5.18 Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) This library is free software; you can use, modify, and redistribute it diff --git a/modules/tablelist/README.txt b/modules/tablelist/README.txt index 268987a5..2b6eea90 100644 --- a/modules/tablelist/README.txt +++ b/modules/tablelist/README.txt @@ -88,8 +88,8 @@ How to Get It? -------------- Tablelist is available for free download from the same URL as Wcb. The -distribution file is "tablelist5.17.tar.gz" for UNIX and -"tablelist5_17.zip" for Windows. These files contain the same +distribution file is "tablelist5.18.tar.gz" for UNIX and +"tablelist5_18.zip" for Windows. These files contain the same information, except for the additional carriage return character preceding the linefeed at the end of each line in the text files for Windows. @@ -108,16 +108,16 @@ locations of these library directories are given by the "tcl_library" and "tk_library" variables, respectively. To install Tablelist on UNIX, "cd" to the desired directory and unpack -the distribution file "tablelist5.17.tar.gz": +the distribution file "tablelist5.18.tar.gz": - gunzip -c tablelist5.17.tar.gz | tar -xf - + gunzip -c tablelist5.18.tar.gz | tar -xf - -This command will create a directory named "tablelist5.17", with the +This command will create a directory named "tablelist5.18", with the subdirectories "demos", "doc", and "scripts". On Windows, use WinZip or some other program capable of unpacking the -distribution file "tablelist5_17.zip" into the directory -"tablelist5.17", with the subdirectories "demos", "doc", and "scripts". +distribution file "tablelist5_18.zip" into the directory +"tablelist5.18", with the subdirectories "demos", "doc", and "scripts". The file "tablelistEdit.tcl" in the "scripts" directory is only needed for applications making use of interactive cell editing. Similarly, the diff --git a/modules/tablelist/pkgIndex.tcl b/modules/tablelist/pkgIndex.tcl index 5da061d2..b8688e33 100644 --- a/modules/tablelist/pkgIndex.tcl +++ b/modules/tablelist/pkgIndex.tcl @@ -7,22 +7,22 @@ # # Regular packages: # -package ifneeded tablelist 5.17 \ +package ifneeded tablelist 5.18 \ [list source [file join $dir tablelist.tcl]] -package ifneeded tablelist_tile 5.17 \ +package ifneeded tablelist_tile 5.18 \ [list source [file join $dir tablelist_tile.tcl]] # # Aliases: # -package ifneeded Tablelist 5.17 \ - [list package require -exact tablelist 5.17] -package ifneeded Tablelist_tile 5.17 \ - [list package require -exact tablelist_tile 5.17] +package ifneeded Tablelist 5.18 \ + [list package require -exact tablelist 5.18] +package ifneeded Tablelist_tile 5.18 \ + [list package require -exact tablelist_tile 5.18] # # Code common to all packages: # -package ifneeded tablelist::common 5.17 \ +package ifneeded tablelist::common 5.18 \ "namespace eval ::tablelist { proc DIR {} {return [list $dir]} } ;\ source [list [file join $dir tablelistPublic.tcl]]" diff --git a/modules/tablelist/tablelist.tcl b/modules/tablelist/tablelist.tcl index bee080c3..52d9c98f 100644 --- a/modules/tablelist/tablelist.tcl +++ b/modules/tablelist/tablelist.tcl @@ -6,7 +6,7 @@ package require Tcl 8 package require Tk 8 -package require -exact tablelist::common 5.17 +package require -exact tablelist::common 5.18 package provide tablelist $::tablelist::version package provide Tablelist $::tablelist::version diff --git a/modules/tablelist/tablelistPublic.tcl b/modules/tablelist/tablelistPublic.tcl index fffa2746..8afe0820 100644 --- a/modules/tablelist/tablelistPublic.tcl +++ b/modules/tablelist/tablelistPublic.tcl @@ -24,7 +24,7 @@ namespace eval ::tablelist { # # Public variables: # - variable version 5.17 + variable version 5.18 variable library if {$tcl_version >= 8.4} { set library [file normalize [DIR]] diff --git a/modules/tablelist/tablelist_tile.tcl b/modules/tablelist/tablelist_tile.tcl index bf1786df..abee273c 100644 --- a/modules/tablelist/tablelist_tile.tcl +++ b/modules/tablelist/tablelist_tile.tcl @@ -9,7 +9,7 @@ package require Tk 8.4 if {$::tk_version < 8.5 || [regexp {^8\.5a[1-5]$} $::tk_patchLevel]} { package require tile 0.6 } -package require -exact tablelist::common 5.17 +package require -exact tablelist::common 5.18 package provide tablelist_tile $::tablelist::version package provide Tablelist_tile $::tablelist::version From f8d3bafaf31c1d79b19de5e13d35bb6fe620bc2c Mon Sep 17 00:00:00 2001 From: csaba Date: Fri, 23 Jun 2017 19:25:12 +0000 Subject: [PATCH 004/150] * CHANGES.txt: Updated to reflect the changes. --- modules/tablelist/CHANGES.txt | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/modules/tablelist/CHANGES.txt b/modules/tablelist/CHANGES.txt index 9a00399a..308c9aae 100644 --- a/modules/tablelist/CHANGES.txt +++ b/modules/tablelist/CHANGES.txt @@ -1,6 +1,37 @@ -What is new in Tablelist 5.17? +What is new in Tablelist 5.18? ------------------------------ +1. Improved the performance of the vertical scrolling (thanks to + Alexandru Dadalau and Olivier Jolet for discussions on this subject). + +2. Added the "-displayondemand" configuration option, which can be used + to speed up the scrolling even further. + +3. Added the "tablelist::delaySashPosUpdates" command (described in the + manual page "Commands Related to Binding Scripts"), designed to + control the frequency of the sash position updates for a given + panedwindow widget, which might be necessary to eliminate some + artifacts if some of the panes contain tablelist widgets with + embedded images (thanks to Nicolas Robert for his input). + +4. Added support for the themes "Arc" and "clearlooks"; updated the + support for the themes "Aquativo", "blue", "clam","keramik", + "keramik_alt", and "plastik". + +5. Extended the reference manual by the description of an important use + case for the "-formatcommand" column configuration option, related to + tablelist columns whose "-sortmode" option was set to "integer" or + "real" (thanks to Alexandru Dadalau for discussions on this subject). + +6. Fixed a bug related to retrieving the current cell selection (thanks + to Alexandru Dadalau for his bug report). + +7. Numerous further improvements in the code, demo scripts, and + documentation. + +What was new in Tablelist 5.17? +------------------------------- + 1. Added the tree styles "arc", "blueMenta", "menta", "ubuntuMate", and "ubuntu3", inspired by the Arc icon theme (of the GTK 2/3 theme Arc) and some GTK 3 themes of the latest versions of the MATE desktop and From 0163951637f6c7f42bdb1f2abf29d527e10995d7 Mon Sep 17 00:00:00 2001 From: csaba Date: Fri, 23 Jun 2017 19:25:54 +0000 Subject: [PATCH 005/150] * scripts/*.tcl: Improved the performance of the vertical scrolling; added the "-displayondemand" configuration option; added the "tablelist::delaySashPosUpdates" command; added support for the themes "Arc" and "clearlooks"; updated the support for a few other themes; fixed a bug related to retrieving the current cell selection; numerous further improvements. --- modules/tablelist/scripts/tablelistBind.tcl | 225 ++++++++--- modules/tablelist/scripts/tablelistConfig.tcl | 55 +-- modules/tablelist/scripts/tablelistEdit.tcl | 36 +- modules/tablelist/scripts/tablelistMove.tcl | 9 +- modules/tablelist/scripts/tablelistSort.tcl | 18 +- modules/tablelist/scripts/tablelistThemes.tcl | 84 +++- modules/tablelist/scripts/tablelistUtil.tcl | 363 +++++++++++------- modules/tablelist/scripts/tablelistWidget.tcl | 314 +++++++++------ 8 files changed, 727 insertions(+), 377 deletions(-) diff --git a/modules/tablelist/scripts/tablelistBind.tcl b/modules/tablelist/scripts/tablelistBind.tcl index 136edc36..1e8157e9 100644 --- a/modules/tablelist/scripts/tablelistBind.tcl +++ b/modules/tablelist/scripts/tablelistBind.tcl @@ -53,6 +53,158 @@ proc tablelist::convEventFields {w x y} { return [mwutil::convEventFields $w $x $y Tablelist] } +#------------------------------------------------------------------------------ +# tablelist::delaySashPosUpdates +# +# Overrides the Tk or Ttk library procedure ::tk::panedwindow::DragSash or +# ::ttk::panedwindow::Drag with a version in which the "sash place ..." or +# "sashpos ..." invocations for the (ttk::)panedwindow widget w are delayed by +# ms milliseconds. +#------------------------------------------------------------------------------ +proc tablelist::delaySashPosUpdates {w ms} { + # + # Check the first argument + # + if {![winfo exists $w]} { + return -code error "bad window path name \"$w\"" + } + set class [winfo class $w] + switch $class { + Panedwindow { + if {[llength [info commands ::tk::panedwindow::DragSash]] == 0} { + return -code error "window \"$w\" is not a panedwindow widget" + } + } + + TPanedwindow { + if {[llength [info commands ::ttk::panedwindow::Drag]] != 0} { + set namesp ::ttk::panedwindow + } else { + return -code error \ + "window \"$w\" is not a ttk::panedwindow widget" + } + } + + TPaned { + if {[llength [info commands ::ttk::paned::Drag]] != 0} { + set namesp ::ttk::paned + } elseif {[llength [info commands ::tile::paned::Drag]] != 0} { + set namesp ::tile::paned + } else { + return -code error "window \"$w\" is not a ttk::paned widget" + } + } + + default { + return -code error \ + "window \"$w\" is not a (ttk::)panewindow widget" + } + } + + # + # Check the second argument + # + if {[catch {format "%d" $ms} result] != 0} { ;# integer check with error msg + return -code error $result + } + set ms $result + if {$ms < 0} { + # + # Forget the sash position update delay for the given widget + # + if {[info exists ::tablelist::sashPosUpdateDelays($w)]} { + unset ::tablelist::sashPosUpdateDelays($w) + } + return "" + } + + # + # Remember the sash position update delay for the given widget + # + set ::tablelist::sashPosUpdateDelays($w) $ms + + bind $w {+ + # + # Forget the sash position update delay for the given widget + # + if {[info exists ::tablelist::sashPosUpdateDelays(%W)]} { + unset ::tablelist::sashPosUpdateDelays(%W) + } + } + + # + # Override the Tk or Ttk library procedure + # ::tk::panedwindow::DragSash or ${namesp}::Drag + # + if {[string compare [winfo class $w] "Panedwindow"] == 0} { + proc ::tk::panedwindow::DragSash {w x y proxy} { + variable ::tk::Priv + if {![info exists Priv(sash)]} { return } + + if {[$w cget -opaqueresize]} { + set proxy 0 + } + + if {$proxy} { + $w proxy place [expr {$x + $Priv(dx)}] [expr {$y + $Priv(dy)}] + } elseif {[info exists ::tablelist::sashPosUpdateDelays($w)]} { + set Priv(newSashX) [expr {$x + $Priv(dx)}] + set Priv(newSashY) [expr {$y + $Priv(dy)}] + + if {![info exists Priv(sashPosId)]} { + set Priv(sashPosId) \ + [after $::tablelist::sashPosUpdateDelays($w) \ + [list ::tk::panedwindow::UpdateSashPos $w $Priv(sash)]] + } + } else { + $w sash place $Priv(sash) \ + [expr {$x + $Priv(dx)}] [expr {$y + $Priv(dy)}] + } + } + + proc ::tk::panedwindow::UpdateSashPos {w index} { + variable ::tk::Priv + unset Priv(sashPosId) + + if {[winfo exists $w]} { + $w sash place $index $Priv(newSashX) $Priv(newSashY) + } + } + + } else { + proc ${namesp}::Drag {w x y} [format { + variable State + if {!$State(pressed)} { return } + + switch -- [$w cget -orient] { + horizontal { set delta [expr {$x - $State(pressX)}] } + vertical { set delta [expr {$y - $State(pressY)}] } + } + + if {[info exists ::tablelist::sashPosUpdateDelays($w)]} { + set State(newSashPos) [expr {$State(sashPos) + $delta}] + + if {![info exists State(sashPosId)]} { + set State(sashPosId) \ + [after $::tablelist::sashPosUpdateDelays($w) \ + [list %s::UpdateSashPos $w $State(sash)]] + } + } else { + $w sashpos $State(sash) [expr {$State(sashPos) + $delta}] + } + } $namesp] + + proc ${namesp}::UpdateSashPos {w index} { + variable State + unset State(sashPosId) + + if {[winfo exists $w]} { + $w sashpos $index $State(newSashPos) + } + } + } +} + # # Binding tag Tablelist # ===================== @@ -103,8 +255,9 @@ proc tablelist::cleanup win { # Cancel the execution of all delayed handleMotion, updateKeyToRowMap, # adjustSeps, makeStripes, showLineNumbers, stretchColumns, updateColors, # updateScrlColOffset, updateHScrlbar, updateVScrlbar, updateView, - # synchronize, displayItems, moveTo, autoScan, horizAutoScan, forceRedraw, - # doCellConfig, redisplay, redisplayCol, and destroyWidgets commands + # synchronize, displayItems, horizMoveTo, vertMoveTo, autoScan, + # horizAutoScan, forceRedraw, doCellConfig, redisplay, redisplayCol, and + # destroyWidgets commands # upvar ::tablelist::ns${win}::data data foreach id {motionId mapId sepsId stripesId lineNumsId stretchId colorsId @@ -153,7 +306,7 @@ proc tablelist::cleanup win { } set imgNames [image names] for {set col 0} {$col < $data(colCount)} {incr col} { - set w $data(hdrTxtFrCanv)$col + set w $data(hdrTxtFrmCanv)$col foreach shape {triangleUp darkLineUp lightLineUp triangleDn darkLineDn lightLineDn} { if {[lsearch -exact $imgNames $shape$w] >= 0} { @@ -253,7 +406,7 @@ proc tablelist::updateConfigSpecs win { if {[set editCol $data(editCol)] >= 0} { set editRow $data(editRow) saveEditData $win - destroy $data(bodyFr) + destroy $data(bodyFrm) doEditCell $win $editRow $editCol 1 } @@ -943,7 +1096,7 @@ proc tablelist::updateCursor {win row col} { # ComboBox. Oakley combobox, or Tk menubutton widgets # if {$data(editRow) >= 0 && $data(editCol) >= 0} { - foreach c [winfo children $data(bodyFrEd)] { + foreach c [winfo children $data(bodyFrmEd)] { set class [winfo class $c] if {([string compare $class "Toplevel"] == 0 || [string compare $class "Menu"] == 0) && @@ -1048,11 +1201,6 @@ proc tablelist::wasExpCollCtrlClicked {w x y} { return 0 } - # - # Save the current vertical position - # - set topRow [expr {int([$data(body) index @0,0]) - 1}] - # # Toggle the state of the expand/collapse control # @@ -1062,12 +1210,7 @@ proc tablelist::wasExpCollCtrlClicked {w x y} { ::$win collapse $row -partly } - # - # Restore the saved vertical position - # - $data(body) yview $topRow updateViewWhenIdle $win - return 1 } @@ -1572,7 +1715,7 @@ proc tablelist::condShowTarget {win y} { place $data(rowGap) -anchor w -y $gapY -height $lineHeight -width 6 } else { place $data(rowGap) -anchor w -y $gapY -height 4 \ - -width [winfo width $data(hdrTxtFr)] + -width [winfo width $data(hdrTxtFrm)] } raise $data(rowGap) } @@ -1735,7 +1878,7 @@ proc tablelist::condEvalInvokeCmd win { # and return if it is an editable combobox widget # set isCheckbtn 0 - set w $data(bodyFrEd) + set w $data(bodyFrmEd) switch [winfo class $w] { Checkbutton - TCheckbutton { @@ -1936,20 +2079,11 @@ proc tablelist::plusMinus {win keysym} { } if {[string length $op] != 0} { - # - # Save the current vertical position - # - set topRow [expr {int([$data(body) index @0,0]) - 1}] - # # Toggle the state of the expand/collapse control # ::$win $op $row -partly - # - # Restore the saved vertical position - # - $data(body) yview $topRow updateViewWhenIdle $win } } @@ -2093,20 +2227,11 @@ proc tablelist::leftRight {win amount} { } } } else { - # - # Save the current vertical position - # - set topRow [expr {int([$data(body) index @0,0]) - 1}] - # # Toggle the state of the expand/collapse control # ::$win $op $row -partly - # - # Restore the saved vertical position - # - $data(body) yview $topRow updateViewWhenIdle $win } } @@ -2817,7 +2942,7 @@ proc tablelist::labelB1Down {w x shiftPressed} { set data(topRow) [expr {int($topTextIdx) - 1}] set data(btmRow) [expr {int($btmTextIdx) - 1}] - set w $data(hdrTxtFrLbl)$col + set w $data(hdrTxtFrmLbl)$col set labelWidth [winfo width $w] set data(oldStretchedColWidth) [expr {$labelWidth - 2*$data(charWidth)}] set data(oldColDelta) $data($col-delta) @@ -2911,7 +3036,7 @@ proc tablelist::labelB1Motion {w X x y} { set btmRow $data(lastRow) } while {$btmRow > $data(btmRow)} { - $b tag add visibleLines [expr {double($data(btmRow) + 2)}] \ + $b tag add visibleLines [expr {$data(btmRow) + 2}].0 \ "$btmTextIdx lineend" incr data(btmRow) redisplayCol $win $col $data(btmRow) $btmRow @@ -2932,7 +3057,7 @@ proc tablelist::labelB1Motion {w X x y} { set topRow [expr {int($topTextIdx) - 1}] while {$topRow < $data(topRow)} { $b tag add visibleLines "$topTextIdx linestart" \ - "[expr {double($data(topRow))}] lineend" + $data(topRow).end incr data(topRow) -1 redisplayCol $win $col $topRow $data(topRow) set data(topRow) $topRow @@ -2952,10 +3077,10 @@ proc tablelist::labelB1Motion {w X x y} { # Scroll the window horizontally if needed # set hdrX [winfo rootx $data(hdr)] - if {$data(-titlecolumns) == 0 || ![winfo viewable $data(sep)]} { + if {$data(-titlecolumns) == 0 || ![winfo viewable $data(vsep)]} { set leftX $hdrX } else { - set leftX [expr {[winfo rootx $data(sep)] + 1}] + set leftX [expr {[winfo rootx $data(vsep)] + 1}] } set rightX [expr {$hdrX + [winfo width $data(hdr)]}] set scroll 0 @@ -2980,7 +3105,7 @@ proc tablelist::labelB1Motion {w X x y} { # set data(inClickedLabel) 1 configLabel $w -cursor $data(-cursor) - $data(hdrTxtFrCanv)$col configure -cursor $data(-cursor) + $data(hdrTxtFrmCanv)$col configure -cursor $data(-cursor) if {$data(changeRelief)} { configLabel $w -relief sunken -pressed 1 } @@ -3019,7 +3144,7 @@ proc tablelist::labelB1Motion {w X x y} { } } incr targetCol - set master $data(hdrTxtFr) + set master $data(hdrTxtFrm) set relx 1.0 } else { for {set targetCol 0} {$targetCol < $data(colCount)} \ @@ -3028,7 +3153,7 @@ proc tablelist::labelB1Motion {w X x y} { break } } - set master $data(hdrTxtFr) + set master $data(hdrTxtFrm) set relx 0.0 } @@ -3046,14 +3171,14 @@ proc tablelist::labelB1Motion {w X x y} { unset data(targetCol) } configLabel $w -cursor $data(-cursor) - $data(hdrTxtFrCanv)$col configure -cursor $data(-cursor) + $data(hdrTxtFrmCanv)$col configure -cursor $data(-cursor) place forget $data(colGap) } else { set data(targetCol) $targetCol set data(master) $master set data(relx) $relx configLabel $w -cursor $data(-movecolumncursor) - $data(hdrTxtFrCanv)$col configure -cursor \ + $data(hdrTxtFrmCanv)$col configure -cursor \ $data(-movecolumncursor) place $data(colGap) -in $master -anchor n \ -bordermode outside \ @@ -3243,7 +3368,7 @@ proc tablelist::labelB1Up {w X} { } } } elseif {$data(-movablecolumns)} { - $data(hdrTxtFrCanv)$col configure -cursor $data(-cursor) + $data(hdrTxtFrmCanv)$col configure -cursor $data(-cursor) if {[info exists data(targetCol)]} { set sourceColName [doColCget $col $win -name] set targetColName [doColCget $data(targetCol) $win -name] @@ -3324,7 +3449,7 @@ proc tablelist::labelDblB1 {w x shiftPressed} { #------------------------------------------------------------------------------ proc tablelist::escape {win col} { upvar ::tablelist::ns${win}::data data - set w $data(hdrTxtFrLbl)$col + set w $data(hdrTxtFrmLbl)$col if {[info exists data(colBeingResized)]} { ;# resize operation in progress configLabel $w -cursor $data(-cursor) update idletasks @@ -3348,7 +3473,7 @@ proc tablelist::escape {win col} { updateColors $win } elseif {!$data(inClickedLabel)} { configLabel $w -cursor $data(-cursor) - $data(hdrTxtFrCanv)$col configure -cursor $data(-cursor) + $data(hdrTxtFrmCanv)$col configure -cursor $data(-cursor) if {[winfo exists $data(focus)]} { focus $data(focus) } @@ -3387,10 +3512,10 @@ proc tablelist::horizAutoScan win { set X $data(X) set hdrX [winfo rootx $data(hdr)] - if {$data(-titlecolumns) == 0 || ![winfo viewable $data(sep)]} { + if {$data(-titlecolumns) == 0 || ![winfo viewable $data(vsep)]} { set leftX $hdrX } else { - set leftX [expr {[winfo rootx $data(sep)] + 1}] + set leftX [expr {[winfo rootx $data(vsep)] + 1}] } set rightX [expr {$hdrX + [winfo width $data(hdr)]}] if {$data(-titlecolumns) == 0} { diff --git a/modules/tablelist/scripts/tablelistConfig.tcl b/modules/tablelist/scripts/tablelistConfig.tcl index cfee2209..5cfe2740 100644 --- a/modules/tablelist/scripts/tablelistConfig.tcl +++ b/modules/tablelist/scripts/tablelistConfig.tcl @@ -28,6 +28,7 @@ proc tablelist::extendConfigSpecs {} { lappend configSpecs(-columns) {} lappend configSpecs(-columntitles) {} lappend configSpecs(-customdragsource) 0 + lappend configSpecs(-displayondemand) 1 lappend configSpecs(-editendcommand) {} lappend configSpecs(-editselectedonly) 0 lappend configSpecs(-editstartcommand) {} @@ -424,17 +425,17 @@ proc tablelist::doConfig {win opt val} { # properly formatted value of val in data($opt) # foreach w [winfo children $win] { - if {[regexp {^(body|hdr|h?sep[0-9]*)$} [winfo name $w]]} { + if {[regexp {^(body|hdr|.sep[0-9]*)$} [winfo name $w]]} { $w configure $opt $val } } $data(hdrTxt) configure $opt $val - $data(hdrFrLbl) configure $opt $val + $data(hdrFrmLbl) configure $opt $val $data(cornerLbl) configure $opt $val - foreach w [winfo children $data(hdrTxtFr)] { + foreach w [winfo children $data(hdrTxtFrm)] { $w configure $opt $val } - set data($opt) [$data(hdrFrLbl) cget $opt] + set data($opt) [$data(hdrFrmLbl) cget $opt] } b { @@ -459,7 +460,8 @@ proc tablelist::doConfig {win opt val} { } else { $win configure $opt $val foreach c [winfo children $win] { - if {[regexp {^(sep[0-9]+|hsep)$} [winfo name $c]]} { + if {[regexp {^(vsep[0-9]+|hsep)$} \ + [winfo name $c]]} { $c configure $opt $val } } @@ -501,8 +503,8 @@ proc tablelist::doConfig {win opt val} { if {$usingTile} { styleConfig Sep$win.TSeparator -background $val } else { - if {[winfo exists $data(sep)]} { - $data(sep) configure -background $val + if {[winfo exists $data(vsep)]} { + $data(vsep) configure -background $val } } if {[string length $data(-disabledforeground)] == 0} { @@ -519,10 +521,10 @@ proc tablelist::doConfig {win opt val} { # and save the properly formatted value of val in data($opt) # set optTail [string range $opt 6 end] ;# remove the -label - configLabel $data(hdrFrLbl) -$optTail $val + configLabel $data(hdrFrmLbl) -$optTail $val configLabel $data(cornerLbl) -$optTail $val for {set col 0} {$col < $data(colCount)} {incr col} { - set w $data(hdrTxtFrLbl)$col + set w $data(hdrTxtFrmLbl)$col if {![info exists data($col$opt)]} { configLabel $w -$optTail $val } @@ -530,7 +532,7 @@ proc tablelist::doConfig {win opt val} { if {$usingTile && [string compare $opt "-labelpady"] == 0} { set data($opt) $val } else { - set data($opt) [$data(hdrFrLbl) cget -$optTail] + set data($opt) [$data(hdrFrmLbl) cget -$optTail] } switch -- $opt { @@ -660,7 +662,7 @@ proc tablelist::doConfig {win opt val} { !$data(isDisabled)) || ([string compare $opt "-arrowdisabledcolor"] == 0 && $data(isDisabled))} { - foreach w [info commands $data(hdrTxtFrCanv)*] { + foreach w [info commands $data(hdrTxtFrmCanv)*] { fillArrows $w $val $data(-arrowstyle) } } @@ -677,7 +679,7 @@ proc tablelist::doConfig {win opt val} { $data($opt) dummy relief width height set data(arrowWidth) $width set data(arrowHeight) $height - foreach w [info commands $data(hdrTxtFrCanv)*] { + foreach w [info commands $data(hdrTxtFrmCanv)*] { createArrows $w $width $height $relief if {$data(isDisabled)} { fillArrows $w $data(-arrowdisabledcolor) $data($opt) @@ -696,6 +698,7 @@ proc tablelist::doConfig {win opt val} { -autofinishediting - -autoscan - -customdragsource - + -displayondemand - -forceeditendcommand - -instanttoggle - -movablecolumns - @@ -982,7 +985,8 @@ proc tablelist::doConfig {win opt val} { createSeps $win } elseif {$oldVal && !$data($opt)} { foreach w [winfo children $win] { - if {[regexp {^(sep[0-9]+|hsep)$} [winfo name $w]]} { + if {[regexp {^(vsep[0-9]+|hsep)$} \ + [winfo name $w]]} { destroy $w } } @@ -1030,14 +1034,14 @@ proc tablelist::doConfig {win opt val} { variable states set val [mwutil::fullOpt "state" $val $states] catch { - configLabel $data(hdrFrLbl) $opt $val + configLabel $data(hdrFrmLbl) $opt $val configLabel $data(cornerLbl) $opt $val for {set col 0} {$col < $data(colCount)} {incr col} { - configLabel $data(hdrTxtFrLbl)$col $opt $val + configLabel $data(hdrTxtFrmLbl)$col $opt $val } } if {$data(editRow) >= 0} { - catch {$data(bodyFrEd) configure $opt $val} + catch {$data(bodyFrmEd) configure $opt $val} } set w $data(body) switch $val { @@ -1129,7 +1133,7 @@ proc tablelist::doConfig {win opt val} { set val 0 } xviewSubCmd $win 0 - set w $data(sep) + set w $data(vsep) if {$val == 0} { $data(hdrTxt) configure -xscrollcommand \ $data(-xscrollcommand) @@ -1141,8 +1145,8 @@ proc tablelist::doConfig {win opt val} { if {$oldVal == 0} { if {$usingTile} { ttk::separator $w -style Sep$win.TSeparator \ - -cursor $data(-cursor) \ - -orient vertical -takefocus 0 + -cursor $data(-cursor) \ + -orient vertical -takefocus 0 } else { tk::frame $w -background $data(-foreground) \ -borderwidth 1 -container 0 \ @@ -1157,7 +1161,6 @@ proc tablelist::doConfig {win opt val} { adjustSepsWhenIdle $win } set data($opt) $val - xviewSubCmd $win 0 updateHScrlbarWhenIdle $win } -treecolumn { @@ -1567,7 +1570,7 @@ proc tablelist::doColConfig {col win opt val} { -labelbackground - -labelforeground { - set w $data(hdrTxtFrLbl)$col + set w $data(hdrTxtFrmLbl)$col set optTail [string range $opt 6 end] ;# remove the -label if {[string length $val] == 0} { # @@ -1597,7 +1600,7 @@ proc tablelist::doColConfig {col win opt val} { } -labelborderwidth { - set w $data(hdrTxtFrLbl)$col + set w $data(hdrTxtFrmLbl)$col set optTail [string range $opt 6 end] ;# remove the -label if {[string length $val] == 0} { # @@ -1637,7 +1640,7 @@ proc tablelist::doColConfig {col win opt val} { } -labelfont { - set w $data(hdrTxtFrLbl)$col + set w $data(hdrTxtFrmLbl)$col set optTail [string range $opt 6 end] ;# remove the -label if {[string length $val] == 0} { # @@ -1667,7 +1670,7 @@ proc tablelist::doColConfig {col win opt val} { -labelheight - -labelpady { - set w $data(hdrTxtFrLbl)$col + set w $data(hdrTxtFrmLbl)$col set optTail [string range $opt 6 end] ;# remove the -label if {[string length $val] == 0} { # @@ -1699,7 +1702,7 @@ proc tablelist::doColConfig {col win opt val} { } -labelimage { - set w $data(hdrTxtFrLbl)$col + set w $data(hdrTxtFrmLbl)$col if {[string length $val] == 0} { foreach l [getSublabels $w] { destroy $l @@ -1767,7 +1770,7 @@ proc tablelist::doColConfig {col win opt val} { } -labelrelief { - set w $data(hdrTxtFrLbl)$col + set w $data(hdrTxtFrmLbl)$col set optTail [string range $opt 6 end] ;# remove the -label if {[string length $val] == 0} { # diff --git a/modules/tablelist/scripts/tablelistEdit.tcl b/modules/tablelist/scripts/tablelistEdit.tcl index d088e806..78f4ca39 100644 --- a/modules/tablelist/scripts/tablelistEdit.tcl +++ b/modules/tablelist/scripts/tablelistEdit.tcl @@ -1400,7 +1400,8 @@ proc tablelist::createTileCheckbutton {w args} { place $w -x -3 -y -3 } - Aquativo { + Aquativo - + Arc { [winfo parent $w] configure -width 14 -height 14 place $w -x -1 -y -1 } @@ -1417,6 +1418,11 @@ proc tablelist::createTileCheckbutton {w args} { place $w -x 0 } + clearlooks { + [winfo parent $w] configure -width 13 -height 13 + place $w -x -2 -y -2 + } + keramik - keramik_alt { [winfo parent $w] configure -width 16 -height 16 @@ -1649,7 +1655,7 @@ proc tablelist::doEditCell {win row col restore {cmd ""} {charPos -1}} { seeCell $win $row $col set netRowHeight [lindex [bboxSubCmd $win $row] 3] set frameHeight [expr {$netRowHeight + 6}] ;# because of the -pady -3 below - set f $data(bodyFr) + set f $data(bodyFrm) tk::frame $f -borderwidth 0 -container 0 -height $frameHeight \ -highlightthickness 0 -relief flat -takefocus 0 catch {$f configure -padx 0 -pady 0} @@ -1659,7 +1665,7 @@ proc tablelist::doEditCell {win row col restore {cmd ""} {charPos -1}} { set creationCmd [strMap {"%W" "$w"} $editWin($name-creationCmd)] append creationCmd { $editWin($name-fontOpt) [getCellFont $win $key $col]} \ { -state normal} - set w $data(bodyFrEd) + set w $data(bodyFrmEd) if {[catch {eval $creationCmd} result] != 0} { destroy $f return -code error $result @@ -2023,8 +2029,8 @@ proc tablelist::doCancelEditing win { [list $win $row $col $data(origEditText)] } - if {[winfo exists $data(bodyFr)]} { - destroy $data(bodyFr) + if {[winfo exists $data(bodyFrm)]} { + destroy $data(bodyFrm) set item [lindex $data(itemList) $row] set key [lindex $item end] foreach opt {-window -image} { @@ -2064,7 +2070,7 @@ proc tablelist::doFinishEditing win { # Get the edit window's text, and invoke the command # specified by the -editendcommand option if needed # - set w $data(bodyFrEd) + set w $data(bodyFrmEd) set name [getEditWindow $win $row $col] variable editWin set text [eval [strMap {"%W" "$w"} $editWin($name-getTextCmd)]] @@ -2089,7 +2095,7 @@ proc tablelist::doFinishEditing win { # statement or within the command specified by the -editendcommand option) # if {$data(rejected)} { - if {[winfo exists $data(bodyFr)]} { + if {[winfo exists $data(bodyFrm)]} { seeCell $win $row $col if {[string compare [winfo class $w] "Mentry"] != 0} { focus $data(editFocus) @@ -2101,8 +2107,8 @@ proc tablelist::doFinishEditing win { set data(rejected) 0 set result 0 } else { - if {[winfo exists $data(bodyFr)]} { - destroy $data(bodyFr) + if {[winfo exists $data(bodyFrm)]} { + destroy $data(bodyFrm) set key [lindex $item end] foreach opt {-window -image} { if {[info exists data($key,$col$opt)]} { @@ -2281,7 +2287,7 @@ proc tablelist::adjustEditWindow {win pixels} { set name [getEditWindow $win $data(editRow) $data(editCol)] variable editWin if {$editWin($name-useReqWidth) && - [set reqWidth [winfo reqwidth $data(bodyFrEd)]] <= + [set reqWidth [winfo reqwidth $data(bodyFrmEd)]] <= $pixels + 2*$data(charWidth)} { set width $reqWidth set padX [expr {$reqWidth <= $pixels ? -3 : ($pixels - $reqWidth) / 2}] @@ -2305,7 +2311,7 @@ proc tablelist::adjustEditWindow {win pixels} { set padX -$amount } - $data(bodyFr) configure -width $width + $data(bodyFrm) configure -width $width $data(body) window configure editMark -padx $padX } @@ -2325,9 +2331,9 @@ proc tablelist::setEditWinFont win { set key [lindex $data(keyList) $data(editRow)] set cellFont [getCellFont $win $key $data(editCol)] - $data(bodyFrEd) configure $editWin($name-fontOpt) $cellFont + $data(bodyFrmEd) configure $editWin($name-fontOpt) $cellFont - $data(bodyFr) configure -height [winfo reqheight $data(bodyFrEd)] + $data(bodyFrm) configure -height [winfo reqheight $data(bodyFrmEd)] } #------------------------------------------------------------------------------ @@ -2337,7 +2343,7 @@ proc tablelist::setEditWinFont win { #------------------------------------------------------------------------------ proc tablelist::saveEditData win { upvar ::tablelist::ns${win}::data data - set w $data(bodyFrEd) + set w $data(bodyFrmEd) set entry $data(editFocus) set class [winfo class $w] set isText [expr {[string compare $class "Text"] == 0 || @@ -2445,7 +2451,7 @@ proc tablelist::saveEditConfigOpts w { #------------------------------------------------------------------------------ proc tablelist::restoreEditData win { upvar ::tablelist::ns${win}::data data - set w $data(bodyFrEd) + set w $data(bodyFrmEd) set entry $data(editFocus) set class [winfo class $w] set isText [expr {[string compare $class "Text"] == 0 || diff --git a/modules/tablelist/scripts/tablelistMove.tcl b/modules/tablelist/scripts/tablelistMove.tcl index d8a559ff..e23f044b 100644 --- a/modules/tablelist/scripts/tablelistMove.tcl +++ b/modules/tablelist/scripts/tablelistMove.tcl @@ -105,10 +105,10 @@ proc tablelist::moveNode {win source targetParentKey targetChildIdx \ set w $data(body) if {$data(anchorRow) != $source} { - $w mark set anchorRowMark [expr {double($data(anchorRow) + 1)}] + $w mark set anchorRowMark [expr {$data(anchorRow) + 1}].0 } if {$data(activeRow) != $source} { - $w mark set activeRowMark [expr {double($data(activeRow) + 1)}] + $w mark set activeRowMark [expr {$data(activeRow) + 1}].0 } # @@ -126,7 +126,7 @@ proc tablelist::moveNode {win source targetParentKey targetChildIdx \ # set selectedCols {} set line [expr {$source + 1}] - set textIdx [expr {double($line)}] + set textIdx $line.0 variable canElide variable elide for {set col 0} {$col < $data(colCount)} {incr col} { @@ -144,7 +144,7 @@ proc tablelist::moveNode {win source targetParentKey targetChildIdx \ set textIdx $textIdx+1c } - $w delete [expr {double($source + 1)}] [expr {double($source + 2)}] + $w delete [expr {$source + 1}].0 [expr {$source + 2}].0 # # Insert the source item before the target one @@ -417,7 +417,6 @@ proc tablelist::moveNode {win source targetParentKey targetChildIdx \ redisplayVisibleItems $win makeStripes $win showLineNumbersWhenIdle $win - updateColorsWhenIdle $win adjustSepsWhenIdle $win updateVScrlbarWhenIdle $win } diff --git a/modules/tablelist/scripts/tablelistSort.tcl b/modules/tablelist/scripts/tablelistSort.tcl index ed6baa0e..9ce90bac 100644 --- a/modules/tablelist/scripts/tablelistSort.tcl +++ b/modules/tablelist/scripts/tablelistSort.tcl @@ -367,8 +367,8 @@ proc tablelist::sortItems {win parentKey sortColList sortOrderList} { # to empty each line individually than to invoke a global delete command. # set w $data(body) - $w tag remove hiddenRow $firstDescLine.0 $lastDescLine.end+1c $w tag remove elidedRow $firstDescLine.0 $lastDescLine.end+1c + $w tag remove hiddenRow $firstDescLine.0 $lastDescLine.end+1c for {set line $firstDescLine} {$line <= $lastDescLine} {incr line} { $w delete $line.0 $line.end } @@ -452,22 +452,29 @@ proc tablelist::sortItems {win parentKey sortColList sortOrderList} { } } + set snipSide \ + $snipSides($alignment,$data($col-changesnipside)) if {$multiline} { set list [split $text "\n"] - set snipSide \ - $snipSides($alignment,$data($col-changesnipside)) if {$data($col-wrap)} { set snipSide "" } set text [joinList $win $list $cellFont \ $pixels $snipSide $snipStr] + } elseif {$data(-displayondemand)} { + set text "" + } else { + set text [strRange $win $text $cellFont \ + $pixels $snipSide $snipStr] } } - lappend insertArgs "\t\t" $cellTags if {$multiline} { + lappend insertArgs "\t\t" $cellTags lappend multilineData $col $text $cellFont $pixels \ $alignment + } else { + lappend insertArgs "\t$text\t" $cellTags } incr col @@ -621,7 +628,6 @@ proc tablelist::sortItems {win parentKey sortColList sortOrderList} { adjustElidedText $win redisplayVisibleItems $win makeStripes $win - updateColorsWhenIdle $win adjustSepsWhenIdle $win updateVScrlbarWhenIdle $win @@ -631,7 +637,7 @@ proc tablelist::sortItems {win parentKey sortColList sortOrderList} { variable winSys if {[string compare $winSys "aqua"] == 0} { foreach col $data(arrowColList) { - set canvas [list $data(hdrTxtFrCanv)$col] + set canvas [list $data(hdrTxtFrmCanv)$col] after idle [list lower $canvas] after idle [list raise $canvas] } diff --git a/modules/tablelist/scripts/tablelistThemes.tcl b/modules/tablelist/scripts/tablelistThemes.tcl index f963176f..54fbe0af 100644 --- a/modules/tablelist/scripts/tablelistThemes.tcl +++ b/modules/tablelist/scripts/tablelistThemes.tcl @@ -254,7 +254,7 @@ proc tablelist::AquativoTheme {} { -background white \ -foreground black \ -disabledforeground black \ - -stripebackground "" \ + -stripebackground #edf3fe \ -selectbackground #000000 \ -selectforeground #ffffff \ -selectborderwidth 0 \ @@ -272,11 +272,43 @@ proc tablelist::AquativoTheme {} { -labelborderwidth 2 \ -labelpady 1 \ -arrowcolor #717171 \ - -arrowstyle flat8x5 \ + -arrowstyle flat7x7 \ -treestyle aqua \ ] } +#------------------------------------------------------------------------------ +# tablelist::ArcTheme +#------------------------------------------------------------------------------ +proc tablelist::ArcTheme {} { + variable themeDefaults + array set themeDefaults [list \ + -background white \ + -foreground #5c616c \ + -disabledforeground #a9acb2 \ + -stripebackground "" \ + -selectbackground #5294e2 \ + -selectforeground #ffffff \ + -selectborderwidth 0 \ + -font TkTextFont \ + -labelbackground #f5f6f7 \ + -labeldeactivatedBg #f5f6f7 \ + -labeldisabledBg #fbfcfc \ + -labelactiveBg #f5f6f7 \ + -labelpressedBg #f5f6f7 \ + -labelforeground #5c616c \ + -labeldisabledFg #a9acb2 \ + -labelactiveFg #5c616c \ + -labelpressedFg #5c616c \ + -labelfont TkDefaultFont \ + -labelborderwidth 0 \ + -labelpady 0 \ + -arrowcolor #5c616c \ + -arrowstyle flatAngle10x6 \ + -treestyle arc \ + ] +} + #------------------------------------------------------------------------------ # tablelist::blueTheme #------------------------------------------------------------------------------ @@ -301,7 +333,7 @@ proc tablelist::blueTheme {} { -labelactiveFg black \ -labelpressedFg black \ -labelfont TkDefaultFont \ - -labelborderwidth 2 \ + -labelborderwidth 1 \ -labelpady 1 \ -arrowcolor #2d2d66 \ -arrowstyle flat9x5 \ @@ -334,7 +366,7 @@ proc tablelist::clamTheme {} { -labelpressedFg black \ -labelfont TkDefaultFont \ -labelborderwidth 2 \ - -labelpady 1 \ + -labelpady 3 \ -arrowcolor black \ -arrowstyle flat7x5 \ -treestyle gtk \ @@ -379,6 +411,38 @@ proc tablelist::classicTheme {} { } } +#------------------------------------------------------------------------------ +# tablelist::clearlooksTheme +#------------------------------------------------------------------------------ +proc tablelist::clearlooksTheme {} { + variable themeDefaults + array set themeDefaults [list \ + -background white \ + -foreground black \ + -disabledforeground #b5b3ac \ + -stripebackground "" \ + -selectbackground #71869e \ + -selectforeground #ffffff \ + -selectborderwidth 0 \ + -font TkTextFont \ + -labelbackground #efeae6 \ + -labeldeactivatedBg #efeae6 \ + -labeldisabledBg #eee9e4 \ + -labelactiveBg #f4f2ee \ + -labelpressedBg #d4cfca \ + -labelforeground black \ + -labeldisabledFg #b5b3ac \ + -labelactiveFg black \ + -labelpressedFg black \ + -labelfont TkDefaultFont \ + -labelborderwidth 0 \ + -labelpady 1 \ + -arrowcolor black \ + -arrowstyle flatAngle9x6 \ + -treestyle gtk \ + ] +} + #------------------------------------------------------------------------------ # tablelist::defaultTheme #------------------------------------------------------------------------------ @@ -435,7 +499,7 @@ proc tablelist::keramikTheme {} { -labelactiveFg black \ -labelpressedFg black \ -labelfont TkDefaultFont \ - -labelborderwidth 2 \ + -labelborderwidth 0 \ -labelpady 1 \ -arrowcolor black \ -arrowstyle flat8x5 \ @@ -467,7 +531,7 @@ proc tablelist::keramik_altTheme {} { -labelactiveFg black \ -labelpressedFg black \ -labelfont TkDefaultFont \ - -labelborderwidth 2 \ + -labelborderwidth 0 \ -labelpady 1 \ -arrowcolor black \ -arrowstyle flat8x5 \ @@ -531,7 +595,7 @@ proc tablelist::plastikTheme {} { -labelactiveFg black \ -labelpressedFg black \ -labelfont TkDefaultFont \ - -labelborderwidth 2 \ + -labelborderwidth 0 \ -labelpady 1 \ -arrowcolor black \ -arrowstyle flat7x4 \ @@ -1818,9 +1882,9 @@ proc tablelist::rgb2hsv {r g b} { # # Compute the value component # - set sortedLst [lsort -real [list $r $g $b]] - set v [lindex $sortedLst end] - set dist [expr {$v - [lindex $sortedLst 0]}] + set sortedList [lsort -real [list $r $g $b]] + set v [lindex $sortedList end] + set dist [expr {$v - [lindex $sortedList 0]}] # # Compute the saturation component diff --git a/modules/tablelist/scripts/tablelistUtil.tcl b/modules/tablelist/scripts/tablelistUtil.tcl index e47dc045..418312ba 100644 --- a/modules/tablelist/scripts/tablelistUtil.tcl +++ b/modules/tablelist/scripts/tablelistUtil.tcl @@ -93,7 +93,8 @@ proc tablelist::rowIndex {win idx endIsSize {checkRange 0}} { set index $data(activeRow) } elseif {[string first $idx "anchor"] == 0 && [string length $idx] >= 2} { set index $data(anchorRow) - } elseif {[scan $idx "@%d,%d" x y] == 2} { + } elseif {[scan $idx "@%d,%d%n" x y count] == 3 && + $count == [string length $idx]} { displayItems $win incr x -[winfo x $data(body)] incr y -[winfo y $data(body)] @@ -102,7 +103,8 @@ proc tablelist::rowIndex {win idx endIsSize {checkRange 0}} { if {$index > $data(lastRow)} { ;# text widget bug set index $data(lastRow) } - } elseif {[scan $idx "k%d" num] == 1} { + } elseif {[scan $idx "k%d%n" num count] == 2 && + $count == [string length $idx]} { set index [keyToRow $win k$num] } else { set idxIsEmpty [expr {[string length $idx] == 0}] @@ -153,7 +155,8 @@ proc tablelist::colIndex {win idx checkRange {decrX 1}} { set index $data(activeCol) } elseif {[string first $idx "anchor"] == 0 && [string length $idx] >= 2} { set index $data(anchorCol) - } elseif {[scan $idx "@%d,%d" x y] == 2} { + } elseif {[scan $idx "@%d,%d%n" x y count] == 3 && + $count == [string length $idx]} { synchronize $win displayItems $win if {$decrX} { @@ -164,17 +167,23 @@ proc tablelist::colIndex {win idx checkRange {decrX 1}} { set x 0 } } - set x [expr {$x + [winfo rootx $data(body)]}] + incr x [winfo rootx $data(body)] + + # + # Get the (scheduled) root X coordinate of $data(hdrTxtFrm) + # + set baseX [winfo rootx $data(hdrTxt)] + incr baseX [lindex [$data(hdrTxt) bbox 1.0] 0] set lastVisibleCol -1 for {set col 0} {$col < $data(colCount)} {incr col} { - if {$data($col-hide) || $data($col-elide)} { + if {$data($col-elide) || $data($col-hide)} { continue } set lastVisibleCol $col - set w $data(hdrTxtFrLbl)$col - set wX [winfo rootx $w] + set w $data(hdrTxtFrmLbl)$col + set wX [expr {$baseX + [lindex [place configure $w -x] 4]}] if {$x >= $wX && $x < $wX + [winfo width $w]} { return $col } @@ -511,37 +520,48 @@ proc tablelist::updateKeyToRowMap win { #------------------------------------------------------------------------------ proc tablelist::findTabs {win line firstCol lastCol idx1Name idx2Name} { upvar ::tablelist::ns${win}::data data $idx1Name idx1 $idx2Name idx2 - set w $data(body) - set endIdx $line.end - variable canElide - variable elide - set idx $line.1 - for {set col 0} {$col < $firstCol} {incr col} { - if {!$data($col-hide) || $canElide} { - set idx [$w search $elide "\t" $idx $endIdx]+2c - if {[string compare $idx "+2c"] == 0} { - return 0 + if {$::tk_version >= 8.5} { + set idxList [$w search -all -elide "\t" $line.0 $line.end] + if {[llength $idxList] == 0} { + return 0 + } + + set idx1 [lindex $idxList [expr {2*$firstCol}]] + set idx2 [lindex $idxList [expr {2*$lastCol + 1}]] + return 1 + } else { + variable canElide + variable elide + set endIdx $line.end + + set idx $line.1 + for {set col 0} {$col < $firstCol} {incr col} { + if {!$data($col-hide) || $canElide} { + set idx [$w search $elide "\t" $idx $endIdx]+2c + if {[string compare $idx "+2c"] == 0} { + return 0 + } } } - } - set idx1 [$w index $idx-1c] + set idx1 [$w index $idx-1c] - for {} {$col < $lastCol} {incr col} { - if {!$data($col-hide) || $canElide} { - set idx [$w search $elide "\t" $idx $endIdx]+2c - if {[string compare $idx "+2c"] == 0} { - return 0 + for {} {$col < $lastCol} {incr col} { + if {!$data($col-hide) || $canElide} { + set idx [$w search $elide "\t" $idx $endIdx]+2c + if {[string compare $idx "+2c"] == 0} { + return 0 + } } } - } - set idx2 [$w search $elide "\t" $idx $endIdx] - if {[string length $idx2] == 0} { - return 0 - } + set idx2 [$w search $elide "\t" $idx $endIdx] + if {[string length $idx2] == 0} { + return 0 + } - return 1 + return 1 + } } #------------------------------------------------------------------------------ @@ -676,7 +696,7 @@ proc tablelist::moveColData {oldArrName newArrName imgArrName oldCol newCol} { } if {$newCol < $newArr(colCount)} { - foreach l [getSublabels $newArr(hdrTxtFrLbl)$newCol] { + foreach l [getSublabels $newArr(hdrTxtFrmLbl)$newCol] { destroy $l } set newArr(fmtCmdFlagList) \ @@ -2037,13 +2057,13 @@ proc tablelist::makeSortAndArrowColLists win { if {$specialAquaHandling && [string compare [getCurrentTheme] "aqua"] == 0} { for {set col 0} {$col < $data(colCount)} {incr col} { - configLabel $data(hdrTxtFrLbl)$col -selected 0 + configLabel $data(hdrTxtFrmLbl)$col -selected 0 } if {[llength $data(sortColList)] != 0} { set col [lindex $data(sortColList) 0] - configLabel $data(hdrTxtFrLbl)$col -selected 1 - raise $data(hdrTxtFrLbl)$col + configLabel $data(hdrTxtFrmLbl)$col -selected 1 + raise $data(hdrTxtFrmLbl)$col } } } @@ -2113,11 +2133,11 @@ proc tablelist::setupColumns {win columns createLabels} { # Delete the labels, canvases, and separators if requested # if {$createLabels} { - foreach w [winfo children $data(hdrTxtFr)] { + foreach w [winfo children $data(hdrTxtFrm)] { destroy $w } foreach w [winfo children $win] { - if {[regexp {^(sep[0-9]+|hsep)$} [winfo name $w]]} { + if {[regexp {^(vsep[0-9]+|hsep)$} [winfo name $w]]} { destroy $w } } @@ -2174,7 +2194,7 @@ proc tablelist::setupColumns {win columns createLabels} { # # Create the label # - set w $data(hdrTxtFrLbl)$col + set w $data(hdrTxtFrmLbl)$col if {$usingTile} { ttk::label $w -style TablelistHeader.TLabel -image "" \ -padding {1 1 1 1} -takefocus 0 -text "" \ @@ -2213,7 +2233,7 @@ proc tablelist::setupColumns {win columns createLabels} { # # Create a canvas containing the sort arrows # - set w $data(hdrTxtFrCanv)$col + set w $data(hdrTxtFrmCanv)$col canvas $w -borderwidth 0 -highlightthickness 0 \ -relief flat -takefocus 0 createArrows $w $arrowWidth $arrowHeight $arrowRelief @@ -2243,8 +2263,8 @@ proc tablelist::setupColumns {win columns createLabels} { # Configure the edit window if present # if {$col == $data(editCol) && - [string compare [winfo class $data(bodyFrEd)] "Mentry"] != 0} { - catch {$data(bodyFrEd) configure -justify $alignment} + [string compare [winfo class $data(bodyFrmEd)] "Mentry"] != 0} { + catch {$data(bodyFrmEd) configure -justify $alignment} } incr col @@ -2257,7 +2277,7 @@ proc tablelist::setupColumns {win columns createLabels} { # set imgNames [image names] for {set col $data(colCount)} {$col < $oldColCount} {incr col} { - set w $data(hdrTxtFrCanv)$col + set w $data(hdrTxtFrmCanv)$col foreach shape {triangleUp darkLineUp lightLineUp triangleDn darkLineDn lightLineDn} { if {[lsearch -exact $imgNames $shape$w] >= 0} { @@ -2304,7 +2324,7 @@ proc tablelist::createSeps win { # Create the col'th separator and attach it to # the right edge of the col'th header label # - set w $data(sep)$col + set w $data(vsep)$col if {$usingTile} { ttk::separator $w -style Seps$win.TSeparator \ -cursor $data(-cursor) -orient vertical \ @@ -2315,7 +2335,7 @@ proc tablelist::createSeps win { -highlightthickness 0 -relief sunken \ -takefocus 0 -width 2 } - place $w -in $data(hdrTxtFrLbl)$col -anchor ne -bordermode outside \ + place $w -in $data(hdrTxtFrmLbl)$col -anchor ne -bordermode outside \ -relx 1.0 -x $sepX # @@ -2365,8 +2385,7 @@ proc tablelist::adjustSepsWhenIdle win { #------------------------------------------------------------------------------ # tablelist::adjustSeps # -# Adjusts the height and vertical position of each separator in the tablelist -# widget win. +# Adjusts the height and position of each separator in the tablelist widget win. #------------------------------------------------------------------------------ proc tablelist::adjustSeps win { upvar ::tablelist::ns${win}::data data @@ -2396,7 +2415,7 @@ proc tablelist::adjustSeps win { set btmLine [expr {int($btmTextIdx)}] if {$btmLine > $data(itemCount)} { ;# text widget bug set btmLine $data(itemCount) - set btmTextIdx [expr {double($btmLine)}] + set btmTextIdx $btmLine.0 } set dlineinfo [$w dlineinfo $btmTextIdx] if {$data(itemCount) == 0 || [llength $dlineinfo] == 0} { @@ -2408,7 +2427,7 @@ proc tablelist::adjustSeps win { if {$data(-showhorizseparator) && $data(-showseparators) && $sepHeight > 0 && $sepHeight < [winfo height $w]} { - set width [expr {[winfo reqwidth $data(hdrTxtFr)] + $sepX - + set width [expr {[winfo reqwidth $data(hdrTxtFrm)] + $sepX - [winfo reqheight $data(hsep)] + 1}] if {$onWindows && !$usingTile} { incr width @@ -2433,7 +2452,7 @@ proc tablelist::adjustSeps win { } } set mainSepHeight [expr {$sepHeight + [winfo height $data(hdr)] - 1}] - set w $data(sep) + set w $data(vsep) if {$col < 0 || $mainSepHeight == 0} { if {[winfo exists $w]} { place forget $w @@ -2442,7 +2461,7 @@ proc tablelist::adjustSeps win { if {!$data(-showlabels)} { incr mainSepHeight } - place $w -in $data(hdrTxtFrLbl)$col -anchor ne -bordermode outside \ + place $w -in $data(hdrTxtFrmLbl)$col -anchor ne -bordermode outside \ -height $mainSepHeight -relx 1.0 -x $sepX -y 1 raise $w } @@ -2473,7 +2492,7 @@ proc tablelist::adjustSeps win { } } foreach w [winfo children $win] { - if {[regexp {^sep[0-9]+$} [winfo name $w]]} { + if {[regexp {^vsep[0-9]+$} [winfo name $w]]} { place configure $w -height $sepHeight -rely $relY -y $y } } @@ -2538,7 +2557,7 @@ proc tablelist::adjustColumns {win whichWidths stretchCols} { set col 0 set x 0 foreach {pixels alignment} $data(colList) { - set w $data(hdrTxtFrLbl)$col + set w $data(hdrTxtFrmLbl)$col if {$data($col-hide) && !$canElide} { place forget $w incr col @@ -2580,11 +2599,11 @@ proc tablelist::adjustColumns {win whichWidths stretchCols} { } if {$col == $data(editCol) && - ![string match "*Checkbutton" [winfo class $data(bodyFrEd)]]} { + ![string match "*Checkbutton" [winfo class $data(bodyFrmEd)]]} { adjustEditWindow $win $pixels } - set canvas $data(hdrTxtFrCanv)$col + set canvas $data(hdrTxtFrmCanv)$col if {[lsearch -exact $data(arrowColList) $col] >= 0 && !$data($col-elide) && !$data($col-hide)} { # @@ -2664,7 +2683,7 @@ proc tablelist::adjustColumns {win whichWidths stretchCols} { incr col } - place configure $data(hdrFr) -x $x + place configure $data(hdrFrm) -x $x # # Apply the value of tabs to the body text widget @@ -2676,9 +2695,9 @@ proc tablelist::adjustColumns {win whichWidths stretchCols} { } # - # Adjust the width and height of the frames data(hdrTxtFr) and data(hdr) + # Adjust the width and height of the frames data(hdrTxtFrm) and data(hdr) # - $data(hdrTxtFr) configure -width $x + $data(hdrTxtFrm) configure -width $x if {$data(-width) <= 0} { if {$stretchCols} { $data(hdr) configure -width $x @@ -2719,7 +2738,7 @@ proc tablelist::adjustLabel {win col pixels alignment} { # Apply some configuration options to the label and its sublabels (if any) # upvar ::tablelist::ns${win}::data data - set w $data(hdrTxtFrLbl)$col + set w $data(hdrTxtFrmLbl)$col variable anchors set anchor $anchors($alignment) set borderWidth [winfo pixels $w [$w cget -borderwidth]] @@ -2763,7 +2782,7 @@ proc tablelist::adjustLabel {win col pixels alignment} { set spaces "" set spacePixels 0 if {[lsearch -exact $data(arrowColList) $col] >= 0} { - set canvas $data(hdrTxtFrCanv)$col + set canvas $data(hdrTxtFrmCanv)$col set canvasWidth $data(arrowWidth) if {[llength $data(arrowColList)] > 1} { incr canvasWidth 6 @@ -3038,7 +3057,7 @@ proc tablelist::computeColWidth {win col} { #------------------------------------------------------------------------------ proc tablelist::computeLabelWidth {win col} { upvar ::tablelist::ns${win}::data data - set w $data(hdrTxtFrLbl)$col + set w $data(hdrTxtFrmLbl)$col if {[info exists data($col-labelimage)]} { variable usingTile if {$usingTile} { @@ -3069,9 +3088,9 @@ proc tablelist::adjustHeaderHeight win { # Compute the max. label height # upvar ::tablelist::ns${win}::data data - set maxLabelHeight [winfo reqheight $data(hdrFrLbl)] + set maxLabelHeight [winfo reqheight $data(hdrFrmLbl)] for {set col 0} {$col < $data(colCount)} {incr col} { - set w $data(hdrTxtFrLbl)$col + set w $data(hdrTxtFrmLbl)$col if {[string length [winfo manager $w]] == 0} { continue } @@ -3100,18 +3119,18 @@ proc tablelist::adjustHeaderHeight win { # # Set the height of the header frame and adjust the separators # - $data(hdrTxtFr) configure -height $maxLabelHeight + $data(hdrTxtFrm) configure -height $maxLabelHeight if {$data(-showlabels)} { $data(hdr) configure -height $maxLabelHeight place configure $data(hdrTxt) -y 0 - place configure $data(hdrFr) -y 0 + place configure $data(hdrFrm) -y 0 $data(corner) configure -height $maxLabelHeight place configure $data(cornerLbl) -y 0 } else { $data(hdr) configure -height 1 place configure $data(hdrTxt) -y -1 - place configure $data(hdrFr) -y -1 + place configure $data(hdrFrm) -y -1 $data(corner) configure -height 1 place configure $data(cornerLbl) -y -1 @@ -3317,15 +3336,7 @@ proc tablelist::updateColorsWhenIdle win { #------------------------------------------------------------------------------ proc tablelist::updateColors {win {fromTextIdx ""} {toTextIdx ""}} { upvar ::tablelist::ns${win}::data data - if {$data(itemCount) == 0 || $data(colCount) == 0 || - [info exists data(dispId)]} { - return "" - } - - set w $data(body) if {[string length $fromTextIdx] == 0} { - set fromTextIdx "[$w index @0,0] linestart" - set toTextIdx "[$w index @0,$data(btmY)] lineend" set updateAll 1 if {[info exists data(colorsId)]} { @@ -3336,7 +3347,22 @@ proc tablelist::updateColors {win {fromTextIdx ""} {toTextIdx ""}} { set updateAll 0 } + if {$data(itemCount) == 0 || [info exists data(dispId)]} { + return "" + } + + set leftCol [colIndex $win @0,0 0 0] + if {$leftCol < 0} { + return "" + } + + set w $data(body) if {$updateAll} { + set topTextIdx [$w index @0,0] + set btmTextIdx [$w index @0,$data(btmY)] + set fromTextIdx "$topTextIdx linestart" + set toTextIdx "$btmTextIdx lineend" + if {$data(isDisabled)} { $w tag add disabled $fromTextIdx $toTextIdx } @@ -3350,8 +3376,9 @@ proc tablelist::updateColors {win {fromTextIdx ""} {toTextIdx ""}} { variable canElide variable elide - set topLine [expr {int([$w index @0,0])}] - set btmLine [expr {int([$w index @0,$data(btmY)])}] + set rightCol [colIndex $win @$data(rightX),0 0 0] + set topLine [expr {int($topTextIdx)}] + set btmLine [expr {int($btmTextIdx)}] if {$btmLine > $data(itemCount)} { ;# text widget bug set btmLine $data(itemCount) } @@ -3369,24 +3396,20 @@ proc tablelist::updateColors {win {fromTextIdx ""} {toTextIdx ""}} { # -(select)background and -(select)foreground column, # row, and cell configuration options in this row # - set textIdx1 $line.0 - set lineTagNames [$w tag names $textIdx1] + findTabs $win $line $leftCol $leftCol tabIdx1 tabIdx2 + set lineTagNames [$w tag names $tabIdx1] set inStripe [expr {[lsearch -exact $lineTagNames stripe] >= 0}] - for {set col 0} {$col < $data(colCount)} {incr col} { + for {set col $leftCol} {$col <= $rightCol} {incr col} { if {$data($col-hide) && !$canElide} { continue } - set tabIdx2 [$w search $elide "\t" $textIdx1+1c $line.end] - if {[string length $tabIdx2] == 0} { - break - } - set textIdx2 $tabIdx2+1c + set textIdx2 [$w index $tabIdx2+1c] set cellTagNames [$w tag names $tabIdx2] foreach tag $cellTagNames { if {[string match "*-*ground-*" $tag]} { - $w tag remove $tag $textIdx1 $textIdx2 + $w tag remove $tag $tabIdx1 $textIdx2 } } @@ -3394,7 +3417,7 @@ proc tablelist::updateColors {win {fromTextIdx ""} {toTextIdx ""}} { foreach opt {-stripebackground -stripeforeground} { set name $col$opt if {[info exists data($name)]} { - $w tag add col$opt-$data($name) $textIdx1 $textIdx2 + $w tag add col$opt-$data($name) $tabIdx1 $textIdx2 } } } @@ -3411,24 +3434,24 @@ proc tablelist::updateColors {win {fromTextIdx ""} {toTextIdx ""}} { if {$selected} { if {[info exists data($selectName)]} { $w tag add $level$selectOpt-$data($selectName) \ - $textIdx1 $textIdx2 + $tabIdx1 $textIdx2 } } else { if {[info exists data($normalName)]} { $w tag add $level$normalOpt-$data($normalName) \ - $textIdx1 $textIdx2 + $tabIdx1 $textIdx2 } } } } if {$hasColorizeCmd} { - set tabIdx1 [$w index $textIdx1] uplevel #0 $colorizeCmd [list $win $w $key $row $col \ $tabIdx1 $tabIdx2 $inStripe $selected] } - set textIdx1 $textIdx2 + set tabIdx1 $textIdx2 + set tabIdx2 [$w search $elide "\t" $tabIdx1+1c $line.end] } } } @@ -3707,8 +3730,8 @@ proc tablelist::updateVScrlbar win { set data(redrawId) [after 50 [list tablelist::forceRedraw $win]] } - if {$data(gotConfigureEvent)} { - set data(gotConfigureEvent) 0 + if {$data(gotResizeEvent)} { + set data(gotResizeEvent) 0 } else { purgeWidgets $win } @@ -3741,9 +3764,9 @@ proc tablelist::forceRedraw win { # raise $w lower $w - if {[winfo exists $data(bodyFr)]} { - lower $data(bodyFr) - raise $data(bodyFr) + if {[winfo exists $data(bodyFrm)]} { + lower $data(bodyFrm) + raise $data(bodyFrm) } } } @@ -3934,8 +3957,7 @@ proc tablelist::adjustElidedText win { } # - # Update btmLine because it may - # change due to the "elidedCol" tag + # Update btmLine because it may change due to the "elidedCol" tag # set btmLine [expr {int([$w index @0,$data(btmY)])}] if {$btmLine > $data(itemCount)} { ;# text widget bug @@ -4113,22 +4135,29 @@ proc tablelist::redisplay {win {getSelCells 1} {selCells {}}} { } } + set snipSide \ + $snipSides($alignment,$data($col-changesnipside)) if {$multiline} { set list [split $text "\n"] - set snipSide \ - $snipSides($alignment,$data($col-changesnipside)) if {$data($col-wrap)} { set snipSide "" } set text [joinList $win $list $cellFont \ $pixels $snipSide $snipStr] + } elseif {$data(-displayondemand)} { + set text "" + } else { + set text [strRange $win $text $cellFont \ + $pixels $snipSide $snipStr] } } - lappend insertArgs "\t\t" $cellTags if {$multiline} { + lappend insertArgs "\t\t" $cellTags lappend multilineData $col $text $cellFont $pixels \ $alignment + } else { + lappend insertArgs "\t$text\t" $cellTags } incr col @@ -4266,7 +4295,12 @@ proc tablelist::redisplay {win {getSelCells 1} {selCells {}}} { #------------------------------------------------------------------------------ proc tablelist::redisplayVisibleItems win { upvar ::tablelist::ns${win}::data data - if {$data(itemCount) == 0} { + if {!$data(-displayondemand) || $data(itemCount) == 0} { + return "" + } + + set leftCol [colIndex $win @0,0 0 0] + if {$leftCol < 0} { return "" } @@ -4277,12 +4311,15 @@ proc tablelist::redisplayVisibleItems win { displayItems $win set w $data(body) - set fromTextIdx "[$w index @0,0] linestart" - set toTextIdx "[$w index @0,$data(btmY)] lineend" + set topTextIdx [$w index @0,0] + set btmTextIdx [$w index @0,$data(btmY)] + set fromTextIdx "$topTextIdx linestart" + set toTextIdx "$btmTextIdx lineend" $w tag remove elidedWin $fromTextIdx $toTextIdx - set topLine [expr {int([$w index @0,0])}] - set btmLine [expr {int([$w index @0,$data(btmY)])}] + set rightCol [colIndex $win @$data(rightX),0 0 0] + set topLine [expr {int($topTextIdx)}] + set btmLine [expr {int($btmTextIdx)}] if {$btmLine > $data(itemCount)} { ;# text widget bug set btmLine $data(itemCount) } @@ -4307,31 +4344,27 @@ proc tablelist::redisplayVisibleItems win { set dispItem [mapTabs $dispItem] } - set tabIdx1 $line.0 - set col 0 - foreach text $dispItem \ - colFont $data(colFontList) \ - colTags $data(colTagsList) \ - {pixels alignment} $data(colList) { + findTabs $win $line $leftCol $leftCol tabIdx1 tabIdx2 + set textIdx1 [$w index $tabIdx1+1c] + for {set col $leftCol} {$col <= $rightCol} {incr col} { if {$data($col-hide) && !$canElide} { - incr col continue } - set tabIdx2 [$w search $elide "\t" $tabIdx1+1c $line.end] - # # Nothing to do if the text is empty or is already displayed, # or interactive editing for this cell is in progress # + set text [lindex $dispItem $col] if {[string length $text] == 0 || - [string length [$w get $tabIdx1+1c $tabIdx2]] != 0 || + [string length [$w get $textIdx1 $tabIdx2]] != 0 || ($row == $data(editRow) && $col == $data(editCol))} { - set tabIdx1 [$w index $tabIdx2+1c] - incr col + set textIdx1 [$w index $tabIdx2+2c] + set tabIdx2 [$w search $elide "\t" $textIdx1 $line.end] continue } + 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)} { @@ -4351,8 +4384,8 @@ proc tablelist::redisplayVisibleItems win { set indent [getIndentData $win $key $col indentWidth] set multiline [string match "*\n*" $text] if {$auxWidth != 0 || $indentWidth != 0 || $multiline} { - set tabIdx1 [$w index $tabIdx2+1c] - incr col + set textIdx1 [$w index $tabIdx2+2c] + set tabIdx2 [$w search $elide "\t" $textIdx1 $line.end] continue } @@ -4365,7 +4398,7 @@ proc tablelist::redisplayVisibleItems win { } elseif {[info exists data($key-font)]} { set cellFont $data($key-font) } else { - set cellFont $colFont + set cellFont [lindex $data(colFontList) $col] } if {$pixels != 0} { set maxTextWidth \ @@ -4377,12 +4410,13 @@ proc tablelist::redisplayVisibleItems win { # # The element is displayed as multiline text # - set tabIdx1 [$w index $tabIdx2+1c] - incr col + set textIdx1 [$w index $tabIdx2+2c] + set tabIdx2 [$w search $elide "\t" $textIdx1 $line.end] continue } } } + set alignment [lindex $data(colList) [expr {2*$col + 1}]] set snipSide $snipSides($alignment,$data($col-changesnipside)) adjustElem $win text auxWidth indentWidth $cellFont $pixels \ $snipSide $snipStr @@ -4391,11 +4425,11 @@ proc tablelist::redisplayVisibleItems win { # Update the text widget's contents between the two tabs # $w mark set tabMark2 [$w index $tabIdx2] - updateCell $w $tabIdx1+1c $tabIdx2 $text $aux $auxType $auxWidth \ + updateCell $w $textIdx1 $tabIdx2 $text $aux $auxType $auxWidth \ $indent $indentWidth $alignment "" - set tabIdx1 [$w index tabMark2+1c] - incr col + set textIdx1 [$w index tabMark2+2c] + set tabIdx2 [$w search $elide "\t" $textIdx1 $line.end] } } } @@ -4468,8 +4502,9 @@ proc tablelist::redisplayCol {win col first last} { set item [lindex $data(itemList) $row] set key [lindex $item end] - if {!$allRows && ([info exists data($key-elide)] || - [info exists data($key-hide)])} { + if {!$allRows && + ([info exists data($key-elide)] || + [info exists data($key-hide)])} { continue } @@ -5106,7 +5141,7 @@ proc tablelist::createArrows {w width height relief} { #------------------------------------------------------------------------------ proc tablelist::configCanvas {win col} { upvar ::tablelist::ns${win}::data data - set w $data(hdrTxtFrLbl)$col + set w $data(hdrTxtFrmLbl)$col if {[string compare [winfo class $w] "TLabel"] == 0} { variable themeDefaults @@ -5158,7 +5193,7 @@ proc tablelist::configCanvas {win col} { } } - set canvas $data(hdrTxtFrCanv)$col + set canvas $data(hdrTxtFrmCanv)$col $canvas configure -background $labelBg sortRank$data($col-sortRank)$win configure -foreground $labelFg @@ -5274,7 +5309,7 @@ proc tablelist::getShadows {w color darkColorName lightColorName} { #------------------------------------------------------------------------------ proc tablelist::raiseArrow {win col} { upvar ::tablelist::ns${win}::data data - set w $data(hdrTxtFrCanv)$col + set w $data(hdrTxtFrmCanv)$col variable directions set dir $directions($data(-incrarrowtype),$data($col-sortOrder)) @@ -5463,6 +5498,52 @@ proc tablelist::scrlColOffsetToXOffset {win scrlColOffset} { return $scrlXOffset } +#------------------------------------------------------------------------------ +# tablelist::getVertComplTopRow +# +# Returns the row number of the topmost vertically complete item visible in the +# tablelist window win. +#------------------------------------------------------------------------------ +proc tablelist::getVertComplTopRow win { + upvar ::tablelist::ns${win}::data data + set w $data(body) + + set topTextIdx [$w index @0,0] + set topRow [expr {int($topTextIdx) - 1}] + + foreach {x y width height baselinePos} [$w dlineinfo $topTextIdx] {} + if {$y < 0} { + incr topRow ;# top row incomplete in vertical direction + } + + return $topRow +} + +#------------------------------------------------------------------------------ +# tablelist::getVertComplBtmRow +# +# Returns the row number of the bottommost vertically complete item visible in +# the tablelist window win. +#------------------------------------------------------------------------------ +proc tablelist::getVertComplBtmRow win { + upvar ::tablelist::ns${win}::data data + set w $data(body) + + set btmTextIdx [$w index @0,$data(btmY)] + set btmRow [expr {int($btmTextIdx) - 1}] + if {$btmRow > $data(lastRow)} { ;# text widget bug + set btmRow $data(lastRow) + } + + foreach {x y width height baselinePos} [$w dlineinfo $btmTextIdx] {} + set y2 [expr {$y + $height}] + if {[$w compare [$w index @0,$y] == [$w index @0,$y2]]} { + incr btmRow -1 ;# btm row incomplete in vertical direction + } + + return $btmRow +} + #------------------------------------------------------------------------------ # tablelist::getViewableRowCount # @@ -5471,10 +5552,21 @@ proc tablelist::scrlColOffsetToXOffset {win scrlColOffset} { #------------------------------------------------------------------------------ proc tablelist::getViewableRowCount {win first last} { upvar ::tablelist::ns${win}::data data - if {$first == 0 && $last == $data(lastRow)} { + if {$data(nonViewableRowCount) == 0} { + # + # Speed optimization + # + set count [expr {$last - $first + 1}] + if {$count < 0} { + return 0 + } else { + return $count + } + } elseif {$first == 0 && $last == $data(lastRow)} { + # + # Speed optimization + # return [expr {$data(itemCount) - $data(nonViewableRowCount)}] - } elseif {$data(nonViewableRowCount) == 0} { - return [expr {$last - $first + 1}] } else { set count 0 for {set row $first} {$row <= $last} {incr row} { @@ -5484,7 +5576,6 @@ proc tablelist::getViewableRowCount {win first last} { incr count } } - return $count } } @@ -5515,13 +5606,9 @@ proc tablelist::viewableRowOffsetToRowIndex {win offset} { } } - set viewableCount [llength $data(viewableRowList)] - if {$viewableCount == 0} { - return 0 + if {$offset >= [llength $data(viewableRowList)]} { + return $data(itemCount) ;# this is out of range } else { - if {$offset >= $viewableCount} { - set offset [expr {$viewableCount - 1}] - } if {$offset < 0} { set offset 0 } diff --git a/modules/tablelist/scripts/tablelistWidget.tcl b/modules/tablelist/scripts/tablelistWidget.tcl index 590ec7e2..53ca4e0a 100644 --- a/modules/tablelist/scripts/tablelistWidget.tcl +++ b/modules/tablelist/scripts/tablelistWidget.tcl @@ -37,7 +37,7 @@ namespace eval tablelist { return "" } - if {[string length [info commands ::ttk::style]] == 0} { + if {[llength [info commands ::ttk::style]] == 0} { interp alias {} ::tablelist::style {} ::style if {[string compare $::tile::version "0.7"] >= 0} { interp alias {} ::tablelist::styleConfig {} ::style configure @@ -112,6 +112,7 @@ namespace eval tablelist { -cursor {cursor Cursor c} -customdragsource {customDragSource CustomDragSource w} -disabledforeground {disabledForeground DisabledForeground w} + -displayondemand {displayOnDemand DisplayOnDemand w} -editendcommand {editEndCommand EditEndCommand w} -editselectedonly {editSelectedOnly EditSelectedOnly w} -editstartcommand {editStartCommand EditStartCommand w} @@ -686,7 +687,7 @@ proc tablelist::tablelist args { colCount 0 lastCol -1 treeCol 0 - gotConfigureEvent 0 + gotResizeEvent 0 rightX 0 btmY 0 rowTagRefCount 0 @@ -768,19 +769,19 @@ proc tablelist::tablelist args { set data(labelTag) label$win set data(editwinTag) editwin$win set data(body) $win.body - set data(bodyFr) $data(body).f - set data(bodyFrEd) $data(bodyFr).e + set data(bodyFrm) $data(body).f + set data(bodyFrmEd) $data(bodyFrm).e set data(rowGap) $data(body).g set data(hdr) $win.hdr set data(hdrTxt) $data(hdr).t - set data(hdrTxtFr) $data(hdrTxt).f - set data(hdrTxtFrCanv) $data(hdrTxtFr).c - set data(hdrTxtFrLbl) $data(hdrTxtFr).l - set data(hdrFr) $data(hdr).f - set data(hdrFrLbl) $data(hdrFr).l + set data(hdrTxtFrm) $data(hdrTxt).f + set data(hdrTxtFrmCanv) $data(hdrTxtFrm).c + set data(hdrTxtFrmLbl) $data(hdrTxtFrm).l + set data(hdrFrm) $data(hdr).f + set data(hdrFrmLbl) $data(hdrFrm).l set data(colGap) $data(hdr).g set data(lb) $win.lb - set data(sep) $win.sep + set data(vsep) $win.vsep set data(hsep) $win.hsep # @@ -794,7 +795,7 @@ proc tablelist::tablelist args { # # Create a child hierarchy used to hold the column labels. The - # labels will be created as children of the frame data(hdrTxtFr), + # labels will be created as children of the frame data(hdrTxtFrm), # which is embedded into the text widget data(hdrTxt) (in order # to make it scrollable), which in turn fills the frame data(hdr) # (whose width and height can be set arbitrarily in pixels). @@ -804,12 +805,7 @@ proc tablelist::tablelist args { tk::frame $w -borderwidth 0 -container 0 -height 0 -highlightthickness 0 \ -relief flat -takefocus 0 -width 0 catch {$w configure -padx 0 -pady 0} - bind $w { - set tablelist::W [winfo parent %W] - tablelist::stretchColumnsWhenIdle $tablelist::W - tablelist::updateScrlColOffsetWhenIdle $tablelist::W - tablelist::updateHScrlbarWhenIdle $tablelist::W - } + bind $w { tablelist::hdrConfigure %W %w } pack $w -fill x set w $data(hdrTxt) ;# text widget within the header frame @@ -817,19 +813,19 @@ proc tablelist::tablelist args { -padx 0 -pady 0 -state normal -takefocus 0 -wrap none place $w -relheight 1.0 -relwidth 1.0 bindtags $w [lreplace [bindtags $w] 1 1] - tk::frame $data(hdrTxtFr) -borderwidth 0 -container 0 -height 0 \ + tk::frame $data(hdrTxtFrm) -borderwidth 0 -container 0 -height 0 \ -highlightthickness 0 -relief flat \ -takefocus 0 -width 0 - catch {$data(hdrTxtFr) configure -padx 0 -pady 0} - $w window create 1.0 -window $data(hdrTxtFr) + catch {$data(hdrTxtFrm) configure -padx 0 -pady 0} + $w window create 1.0 -window $data(hdrTxtFrm) - set w $data(hdrFr) ;# filler frame within the header frame + set w $data(hdrFrm) ;# filler frame within the header frame tk::frame $w -borderwidth 0 -container 0 -height 0 -highlightthickness 0 \ -relief flat -takefocus 0 -width 0 catch {$w configure -padx 0 -pady 0} place $w -relheight 1.0 -relwidth 1.0 - set w $data(hdrFrLbl) ;# label within the filler frame + set w $data(hdrFrmLbl) ;# label within the filler frame set x 0 if {$usingTile} { ttk::label $w -style TablelistHeader.TLabel -image "" \ @@ -869,14 +865,7 @@ proc tablelist::tablelist args { text $w -borderwidth 0 -exportselection 0 -highlightthickness 0 \ -insertwidth 0 -padx 0 -pady 0 -state normal -takefocus 0 -wrap none catch {$w configure -undo 0}; # because of a text widget issue in Tk 8.6.6 - bind $w { - set tablelist::W [winfo parent %W] - set tablelist::ns${tablelist::W}::data(gotConfigureEvent) 1 - set tablelist::ns${tablelist::W}::data(rightX) [expr {%w - 1}] - set tablelist::ns${tablelist::W}::data(btmY) [expr {%h - 1}] - tablelist::makeColFontAndTagLists $tablelist::W - tablelist::updateViewWhenIdle $tablelist::W - } + bind $w { tablelist::bodyConfigure %W %w %h } pack $w -expand 1 -fill both # @@ -886,7 +875,7 @@ proc tablelist::tablelist args { TablelistKeyNav all] # - # Create the "stripe", "select", "active", "disabled", "redraw", + # Create the "stripe", "select", "curRow", "active", "disabled", "redraw", # "hiddenRow", "elidedRow", "hiddenCol", and "elidedCol" tags in the body # text widget. Don't use the built-in "sel" tag because on Windows the # selection in a text widget only becomes visible when the window gets @@ -900,7 +889,7 @@ proc tablelist::tablelist args { $w tag configure redraw -relief sunken if {$canElide} { $w tag configure hiddenRow -elide 1 ;# used for hiding a row - $w tag configure elidedRow -elide 1 ;# used when collapsing a row + $w tag configure elidedRow -elide 1 ;# used when collapsing a node $w tag configure hiddenCol -elide 1 ;# used for hiding a column $w tag configure elidedCol -elide 1 ;# used for horizontal scrolling } @@ -1087,7 +1076,7 @@ proc tablelist::bboxSubCmd {win argList} { upvar ::tablelist::ns${win}::data data set w $data(body) - set dlineinfo [$w dlineinfo [expr {double($index + 1)}]] + set dlineinfo [$w dlineinfo [expr {$index + 1}].0] if {$data(itemCount) == 0 || [llength $dlineinfo] == 0} { return {} } @@ -1184,7 +1173,7 @@ proc tablelist::cellbboxSubCmd {win argList} { } foreach {x y width height} [bboxSubCmd $win $row] {} - set w $data(hdrTxtFrLbl)$col + set w $data(hdrTxtFrmLbl)$col return [list [expr {[winfo rootx $w] - [winfo rootx $win]}] $y \ [winfo width $w] $height] } @@ -1424,8 +1413,8 @@ proc tablelist::collapseSubCmd {win argList} { # embedded into the descendants just elided # set widgets {} - set fromTextIdx [expr {double($fromRow + 1)}] - set toTextIdx [expr {double($toRow + 1)}] + set fromTextIdx [expr {$fromRow + 1}].0 + set toTextIdx [expr {$toRow + 1}].0 foreach {dummy path textIdx} \ [$data(body) dump -window $fromTextIdx $toTextIdx] { if {[string length $path] != 0} { @@ -1446,10 +1435,9 @@ proc tablelist::collapseSubCmd {win argList} { adjustRowIndex $win activeRow 1 set data(activeRow) $activeRow - makeStripes $win adjustElidedText $win redisplayVisibleItems $win - updateColors $win + makeStripes $win adjustSepsWhenIdle $win updateVScrlbarWhenIdle $win } @@ -1552,8 +1540,8 @@ proc tablelist::collapseallSubCmd {win argList} { # embedded into the descendants just elided # set widgets {} - set fromTextIdx [expr {double($fromRow + 1)}] - set toTextIdx [expr {double($toRow + 1)}] + set fromTextIdx [expr {$fromRow + 1}].0 + set toTextIdx [expr {$toRow + 1}].0 foreach {dummy path textIdx} \ [$data(body) dump -window $fromTextIdx $toTextIdx] { if {[string length $path] != 0} { @@ -1576,10 +1564,9 @@ proc tablelist::collapseallSubCmd {win argList} { adjustRowIndex $win activeRow 1 set data(activeRow) $activeRow - makeStripes $win adjustElidedText $win redisplayVisibleItems $win - updateColors $win + makeStripes $win adjustSepsWhenIdle $win updateVScrlbarWhenIdle $win return "" @@ -2127,8 +2114,8 @@ proc tablelist::editwinpathSubCmd {win argList} { } upvar ::tablelist::ns${win}::data data - if {[winfo exists $data(bodyFrEd)]} { - return $data(bodyFrEd) + if {[winfo exists $data(bodyFrmEd)]} { + return $data(bodyFrmEd) } else { return "" } @@ -2155,8 +2142,8 @@ proc tablelist::entrypathSubCmd {win argList} { } upvar ::tablelist::ns${win}::data data - if {[winfo exists $data(bodyFrEd)]} { - set class [winfo class $data(bodyFrEd)] + if {[winfo exists $data(bodyFrmEd)]} { + set class [winfo class $data(bodyFrmEd)] if {[regexp {^(Mentry|T?Checkbutton|T?Menubutton)$} $class]} { return "" } else { @@ -2238,10 +2225,9 @@ proc tablelist::expandSubCmd {win argList} { } if {![string match "expand*SubCmd" $callerProc]} { - makeStripes $win adjustElidedText $win redisplayVisibleItems $win - updateColors $win + makeStripes $win adjustSepsWhenIdle $win updateVScrlbarWhenIdle $win } @@ -2314,10 +2300,9 @@ proc tablelist::expandallSubCmd {win argList} { } } - makeStripes $win adjustElidedText $win redisplayVisibleItems $win - updateColors $win + makeStripes $win adjustSepsWhenIdle $win updateVScrlbarWhenIdle $win return "" @@ -3369,7 +3354,7 @@ proc tablelist::labelpathSubCmd {win argList} { set col [colIndex $win [lindex $argList 0] 1] upvar ::tablelist::ns${win}::data data - return $data(hdrTxtFrLbl)$col + return $data(hdrTxtFrmLbl)$col } #------------------------------------------------------------------------------ @@ -3383,7 +3368,7 @@ proc tablelist::labelsSubCmd {win argList} { upvar ::tablelist::ns${win}::data data set labelList {} for {set col 0} {$col < $data(colCount)} {incr col} { - lappend labelList $data(hdrTxtFrLbl)$col + lappend labelList $data(hdrTxtFrmLbl)$col } return $labelList @@ -3975,15 +3960,15 @@ proc tablelist::separatorpathSubCmd {win argList} { upvar ::tablelist::ns${win}::data data if {$argCount == 0} { - if {[winfo exists $data(sep)]} { - return $data(sep) + if {[winfo exists $data(vsep)]} { + return $data(vsep) } else { return "" } } else { set col [colIndex $win [lindex $argList 0] 1] if {$data(-showseparators)} { - return $data(sep)$col + return $data(vsep)$col } else { return "" } @@ -4000,7 +3985,7 @@ proc tablelist::separatorsSubCmd {win argList} { set sepList {} foreach w [winfo children $win] { - if {[regexp {^sep([0-9]+)?$} [winfo name $w]]} { + if {[regexp {^vsep([0-9]+)?$} [winfo name $w]]} { lappend sepList $w } } @@ -4029,7 +4014,7 @@ proc tablelist::showtargetmarkSubCmd {win argList} { if {$data(itemCount) == 0} { set y 0 } elseif {$row >= $data(itemCount)} { - set dlineinfo [$w dlineinfo [expr {double($data(itemCount))}]] + set dlineinfo [$w dlineinfo $data(itemCount).0] if {[llength $dlineinfo] == 0} { return "" } @@ -4041,7 +4026,7 @@ proc tablelist::showtargetmarkSubCmd {win argList} { if {$row < 0} { set row 0 } - set dlineinfo [$w dlineinfo [expr {double($row + 1)}]] + set dlineinfo [$w dlineinfo [expr {$row + 1}].0] if {[llength $dlineinfo] == 0} { return "" } @@ -4050,12 +4035,12 @@ proc tablelist::showtargetmarkSubCmd {win argList} { } place $data(rowGap) -anchor w -y $y -height 4 \ - -width [winfo width $data(hdrTxtFr)] + -width [winfo width $data(hdrTxtFrm)] } inside { set row [rowIndex $win $index 0 1] - set dlineinfo [$w dlineinfo [expr {double($row + 1)}]] + set dlineinfo [$w dlineinfo [expr {$row + 1}]].0 if {[llength $dlineinfo] == 0} { return "" } @@ -4616,10 +4601,11 @@ proc tablelist::xviewSubCmd {win argList} { $w xview moveto 0 $w xview scroll $units units } + redisplayVisibleItems $win } else { changeScrlColOffset $win $units - updateColors $win } + updateColors $win return "" } @@ -4630,8 +4616,25 @@ proc tablelist::xviewSubCmd {win argList} { # set argList [mwutil::getScrollInfo $argList] if {$data(-titlecolumns) == 0} { - foreach w [list $data(hdrTxt) $data(body)] { - eval [list $w xview] $argList + if {[string compare [lindex $argList 0] "moveto"] == 0} { + set data(fraction) [lindex $argList 1] + if {![info exists data(moveToId)]} { + variable winSys + if {[string compare $winSys "x11"] == 0} { + set delay [expr {($data(colCount) + 7) / 8}] + } else { + set delay [expr {($data(colCount) + 1) / 2}] + } + set data(moveToId) \ + [after $delay [list tablelist::horizMoveTo $win]] + } + return "" + } else { + foreach w [list $data(hdrTxt) $data(body)] { + eval [list $w xview] $argList + } + redisplayVisibleItems $win + updateColors $win } } else { if {[string compare [lindex $argList 0] "moveto"] == 0} { @@ -4697,9 +4700,9 @@ proc tablelist::xviewSubCmd {win argList} { # # Work around a Tk bug on Mac OS X Aqua # - if {[winfo exists $data(bodyFr)]} { - lower $data(bodyFr) - raise $data(bodyFr) + if {[winfo exists $data(bodyFrm)]} { + lower $data(bodyFrm) + raise $data(bodyFrm) } } return "" @@ -4724,27 +4727,12 @@ proc tablelist::yviewSubCmd {win argList} { # # Command: $win yview # - set totalViewableCount \ - [expr {$data(itemCount) - $data(nonViewableRowCount)}] + set totalViewableCount [getViewableRowCount $win 0 $data(lastRow)] if {$totalViewableCount == 0} { return [list 0 1] } - set topTextIdx [$w index @0,0] - set btmTextIdx [$w index @0,$data(btmY)] - set topRow [expr {int($topTextIdx) - 1}] - set btmRow [expr {int($btmTextIdx) - 1}] - if {$btmRow > $data(lastRow)} { ;# text widget bug - set btmRow $data(lastRow) - } - foreach {x y width height baselinePos} [$w dlineinfo $topTextIdx] {} - if {$y < 0} { - incr topRow ;# top row incomplete in vertical direction - } - foreach {x y width height baselinePos} [$w dlineinfo $btmTextIdx] {} - set y2 [expr {$y + $height}] - if {[string compare [$w index @0,$y] [$w index @0,$y2]] == 0} { - incr btmRow -1 ;# btm row incomplete in vertical direction - } + set topRow [getVertComplTopRow $win] + set btmRow [getVertComplBtmRow $win] set upperViewableCount \ [getViewableRowCount $win 0 [expr {$topRow - 1}]] set winViewableCount [getViewableRowCount $win $topRow $btmRow] @@ -4780,13 +4768,20 @@ proc tablelist::yviewSubCmd {win argList} { if {[string compare [lindex $argList 0] "moveto"] == 0} { set data(fraction) [lindex $argList 1] if {![info exists data(moveToId)]} { - set data(moveToId) [after 1 [list tablelist::moveTo $win]] + variable winSys + if {[string compare $winSys "x11"] == 0} { + set delay [expr {($data(colCount) + 3) / 4}] + } else { + set delay [expr {$data(colCount) * 2}] + } + set data(moveToId) \ + [after $delay [list tablelist::vertMoveTo $win]] } return "" } else { set number [lindex $argList 1] if {[string compare [lindex $argList 2] "units"] == 0} { - set topRow [expr {int([$w index @0,0]) - 1}] + set topRow [getVertComplTopRow $win] set upperViewableCount \ [getViewableRowCount $win 0 [expr {$topRow - 1}]] set offset [expr {$upperViewableCount + $number}] @@ -4795,16 +4790,16 @@ proc tablelist::yviewSubCmd {win argList} { } else { set absNumber [expr {abs($number)}] for {set n 0} {$n < $absNumber} {incr n} { - set topRow [expr {int([$w index @0,0]) - 1}] - set btmRow [expr {int([$w index @0,$data(btmY)]) - 1}] - if {$btmRow > $data(lastRow)} { ;# text widget bug - set btmRow $data(lastRow) - } + set topRow [getVertComplTopRow $win] + set btmRow [getVertComplBtmRow $win] set upperViewableCount \ [getViewableRowCount $win 0 [expr {$topRow - 1}]] set winViewableCount \ [getViewableRowCount $win $topRow $btmRow] set delta [expr {$winViewableCount - 2}] + if {$delta <= 0} { + set delta 1 + } if {$number < 0} { set delta [expr {(-1)*$delta}] } @@ -5055,7 +5050,7 @@ proc tablelist::containingRow {win y {relOffsetName ""}} { return -1 } - set dlineinfo [$w dlineinfo [expr {double($row + 1)}]] + set dlineinfo [$w dlineinfo [expr {$row + 1}].0] set lineY [lindex $dlineinfo 1] set lineHeight [lindex $dlineinfo 3] if {[llength $dlineinfo] != 0 && $y < $lineY + $lineHeight} { @@ -5089,7 +5084,7 @@ proc tablelist::containingCol {win x} { return -1 } - set lbl $data(hdrTxtFrLbl)$col + set lbl $data(hdrTxtFrmLbl)$col if {$x + [winfo rootx $win] < [winfo width $lbl] + [winfo rootx $lbl]} { return $col } else { @@ -5129,22 +5124,21 @@ proc tablelist::curCellSelection {win {getKeys 0} {constraint 0}} { } # - # Get the index of the column starting at the text position selStart + # Get the index of the column containing the text position selStart # - set textIdx $line.0 + set tabIdx1 $line.0 for {set col 0} {$col < $data(colCount)} {incr col} { if {$data($col-hide) && !$canElide} { continue } - if {[$w compare $selStart == $textIdx] || - [$w compare $selStart == $textIdx+1c] || - [$w compare $selStart == $textIdx+2c] && - [string compare [$w get $textIdx+2c] "\t"] != 0} { + set tabIdx2 [$w search $elide "\t" $tabIdx1+1c $selEnd] + if {[$w compare $selStart >= $tabIdx1] && + [$w compare $selStart <= $tabIdx2]} { set firstCol $col break } else { - set textIdx [$w search $elide "\t" $textIdx+1c $selEnd]+1c + set tabIdx1 [$w index $tabIdx2+1c] } } @@ -5152,7 +5146,7 @@ proc tablelist::curCellSelection {win {getKeys 0} {constraint 0}} { # Process the columns, starting at the found one # and ending just before the text position selEnd # - set textIdx [$w search $elide "\t" $textIdx+1c $selEnd]+1c + set textIdx $tabIdx2+1c for {set col $firstCol} {$col < $data(colCount)} {incr col} { if {$data($col-hide) && !$canElide} { continue @@ -5303,10 +5297,10 @@ proc tablelist::deleteRows {win first last updateListVar} { # for {set toLine [expr {$last + 2}]; set fromLine [expr {$toLine - 50}]} \ {$fromLine > $first} {set toLine $fromLine; incr fromLine -50} { - $w delete [expr {double($fromLine)}] [expr {double($toLine)}] + $w delete $fromLine.0 $toLine.0 } set rest [expr {$count % 50}] - $w delete [expr {double($first + 1)}] [expr {double($first + $rest + 1)}] + $w delete [expr {$first + 1}].0 [expr {$first + $rest + 1}].0 if {$last == $data(lastRow)} { # @@ -5320,7 +5314,7 @@ proc tablelist::deleteRows {win first last updateListVar} { # the newline character that ends the line preceding # the first deleted one if it was hidden before # - set textIdx [expr {double($first)}] + set textIdx $first.0 foreach tag {elidedRow hiddenRow} { if {[lsearch -exact [$w tag names $textIdx] $tag] >= 0} { $w tag add $tag $first.end @@ -5860,21 +5854,28 @@ proc tablelist::displayItems win { } } + set snipSide \ + $snipSides($alignment,$data($col-changesnipside)) if {$multiline} { set list [split $text "\n"] - set snipSide \ - $snipSides($alignment,$data($col-changesnipside)) if {$data($col-wrap)} { set snipSide "" } set text [joinList $win $list $colFont \ $pixels $snipSide $snipStr] + } elseif {$data(-displayondemand)} { + set text "" + } else { + set text [strRange $win $text $colFont \ + $pixels $snipSide $snipStr] } } - lappend insertArgs "\t\t" $colTags if {$multiline} { + lappend insertArgs "\t\t" $colTags lappend multilineData $col $text $colFont $pixels $alignment + } else { + lappend insertArgs "\t$text\t" $colTags } incr col } @@ -5928,22 +5929,29 @@ proc tablelist::displayItems win { } } + set snipSide \ + $snipSides($alignment,$data($col-changesnipside)) if {$multiline} { set list [split $text "\n"] - set snipSide \ - $snipSides($alignment,$data($col-changesnipside)) if {$data($col-wrap)} { set snipSide "" } set text [joinList $win $list $widgetFont \ $pixels $snipSide $snipStr] + } elseif {$data(-displayondemand)} { + set text "" + } else { + set text [strRange $win $text $widgetFont \ + $pixels $snipSide $snipStr] } } - append insertStr "\t\t" if {$multiline} { + append insertStr "\t\t" lappend multilineData $col $text $widgetFont \ $pixels $alignment + } else { + append insertStr "\t$text\t" } incr col } @@ -6308,7 +6316,7 @@ proc tablelist::seeRow {win index} { # Bring the given row into the window and restore # the horizontal view in the body text widget # - if {![seeTextIdx $win [expr {double($index + 1)}]]} { + if {![seeTextIdx $win [expr {$index + 1}].0]} { return "" } $data(body) xview moveto [lindex [$data(hdrTxt) xview] 0] @@ -6352,7 +6360,7 @@ proc tablelist::seeCell {win row col} { set b $data(body) if {$data(colCount) == 0} { - $b see [expr {double($row + 1)}] + $b see [expr {$row + 1}].0 return "" } @@ -6383,8 +6391,8 @@ proc tablelist::seeCell {win row col} { findTabs $win [expr {$row + 1}] $col $col tabIdx1 tabIdx2 set nextIdx [$b index $tabIdx2+1c] set alignment [lindex $data(colList) [expr {2*$col + 1}]] - set lX [winfo x $data(hdrTxtFrLbl)$col] - set rX [expr {$lX + [winfo width $data(hdrTxtFrLbl)$col] - 1}] + set lX [winfo x $data(hdrTxtFrmLbl)$col] + set rX [expr {$lX + [winfo width $data(hdrTxtFrmLbl)$col] - 1}] switch $alignment { left { @@ -6418,7 +6426,7 @@ proc tablelist::seeCell {win row col} { return "" } set winWidth [winfo width $h] - if {[winfo width $data(hdrTxtFrLbl)$col] > $winWidth} { + if {[winfo width $data(hdrTxtFrmLbl)$col] > $winWidth} { # # The cell doesn't fit into the window: Bring its # center into the window's middle horizontal position @@ -6467,7 +6475,7 @@ proc tablelist::seeCell {win row col} { # # Bring the cell's row into view # - if {![seeTextIdx $win [expr {double($row + 1)}]]} { + if {![seeTextIdx $win [expr {$row + 1}].0]} { return "" } @@ -6483,7 +6491,7 @@ proc tablelist::seeCell {win row col} { # $b xview moveto [lindex [$h xview] 0] } elseif {$data($col-elide) || - [winfo width $data(hdrTxtFrLbl)$col] > $scrlWindowWidth} { + [winfo width $data(hdrTxtFrmLbl)$col] > $scrlWindowWidth} { # # The given column index specifies either an elided column or one # that doesn't fit into the window; shift the horizontal view to @@ -6619,30 +6627,46 @@ proc tablelist::rowSelection {win opt first last} { } #------------------------------------------------------------------------------ -# tablelist::moveTo +# tablelist::horizMoveTo +# +# Adjusts the view in the tablelist window win so that data(fraction) of the +# horizontal span of the text is off-screen to the left. +#------------------------------------------------------------------------------ +proc tablelist::horizMoveTo win { + upvar ::tablelist::ns${win}::data data + if {[info exists data(moveToId)]} { + after cancel $data(moveToId) + unset data(moveToId) + } + + foreach w [list $data(hdrTxt) $data(body)] { + $w xview moveto $data(fraction) + } + + redisplayVisibleItems $win + updateColors $win + return "" +} + +#------------------------------------------------------------------------------ +# tablelist::vertMoveTo # # Adjusts the view in the tablelist window win so that the non-hidden item # given by data(fraction) appears at the top of the window. #------------------------------------------------------------------------------ -proc tablelist::moveTo win { +proc tablelist::vertMoveTo win { upvar ::tablelist::ns${win}::data data if {[info exists data(moveToId)]} { after cancel $data(moveToId) unset data(moveToId) } - set totalViewableCount \ - [expr {$data(itemCount) - $data(nonViewableRowCount)}] + set totalViewableCount [getViewableRowCount $win 0 $data(lastRow)] set offset [expr {int($data(fraction)*$totalViewableCount + 0.5)}] set row [viewableRowOffsetToRowIndex $win $offset] set w $data(body) - set topTextIdx [$w index @0,0] - set topRow [expr {int($topTextIdx) - 1}] - foreach {x y width height baselinePos} [$w dlineinfo $topTextIdx] {} - if {$y < 0} { - incr topRow ;# top row incomplete in vertical direction - } + set topRow [getVertComplTopRow $win] if {$row != $topRow} { $w yview $row @@ -6711,6 +6735,42 @@ proc tablelist::updateIdletasks {} { # =========================== # +#------------------------------------------------------------------------------ +# tablelist::hdrConfigure +# +# callback for the header component of a tablelist widget. +#------------------------------------------------------------------------------ +proc tablelist::hdrConfigure {w width} { + set win [winfo parent $w] + upvar ::tablelist::ns${win}::data data + + if {$width - 1 != $data(rightX)} { + stretchColumnsWhenIdle $win + updateScrlColOffsetWhenIdle $win + updateHScrlbarWhenIdle $win + } +} + +#------------------------------------------------------------------------------ +# tablelist::bodyConfigure +# +# callback for the body component of a tablelist widget. +#------------------------------------------------------------------------------ +proc tablelist::bodyConfigure {w width height} { + set win [winfo parent $w] + upvar ::tablelist::ns${win}::data data + + set rightX [expr {$width - 1}] + set btmY [expr {$height - 1}] + if {$rightX != $data(rightX) || $btmY != $data(btmY)} { + set data(gotResizeEvent) 1 + set data(rightX) $rightX + set data(btmY) $btmY + makeColFontAndTagLists $win + updateViewWhenIdle $win + } +} + #------------------------------------------------------------------------------ # tablelist::fetchSelection # From d9f6a7823f5fd592e66c2fdc13825cc0b3edc151 Mon Sep 17 00:00:00 2001 From: csaba Date: Fri, 23 Jun 2017 19:26:24 +0000 Subject: [PATCH 006/150] * scripts/tclIndex: Newly generated. --- modules/tablelist/scripts/tclIndex | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/modules/tablelist/scripts/tclIndex b/modules/tablelist/scripts/tclIndex index b1573dfb..e36e7073 100644 --- a/modules/tablelist/scripts/tclIndex +++ b/modules/tablelist/scripts/tclIndex @@ -67,9 +67,11 @@ set auto_index(::tablelist::setThemeDefaults) [list source [file join $dir table set auto_index(::tablelist::altTheme) [list source [file join $dir tablelistThemes.tcl]] set auto_index(::tablelist::aquaTheme) [list source [file join $dir tablelistThemes.tcl]] set auto_index(::tablelist::AquativoTheme) [list source [file join $dir tablelistThemes.tcl]] +set auto_index(::tablelist::ArcTheme) [list source [file join $dir tablelistThemes.tcl]] set auto_index(::tablelist::blueTheme) [list source [file join $dir tablelistThemes.tcl]] set auto_index(::tablelist::clamTheme) [list source [file join $dir tablelistThemes.tcl]] set auto_index(::tablelist::classicTheme) [list source [file join $dir tablelistThemes.tcl]] +set auto_index(::tablelist::clearlooksTheme) [list source [file join $dir tablelistThemes.tcl]] set auto_index(::tablelist::defaultTheme) [list source [file join $dir tablelistThemes.tcl]] set auto_index(::tablelist::keramikTheme) [list source [file join $dir tablelistThemes.tcl]] set auto_index(::tablelist::keramik_altTheme) [list source [file join $dir tablelistThemes.tcl]] @@ -215,11 +217,14 @@ set auto_index(::tablelist::getMaxScrlColOffset) [list source [file join $dir ta set auto_index(::tablelist::changeScrlColOffset) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::scrlXOffsetToColOffset) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::scrlColOffsetToXOffset) [list source [file join $dir tablelistUtil.tcl]] +set auto_index(::tablelist::getVertComplTopRow) [list source [file join $dir tablelistUtil.tcl]] +set auto_index(::tablelist::getVertComplBtmRow) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::getViewableRowCount) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::viewableRowOffsetToRowIndex) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::getTablelistColumn) [list source [file join $dir tablelistBind.tcl]] set auto_index(::tablelist::getTablelistPath) [list source [file join $dir tablelistBind.tcl]] set auto_index(::tablelist::convEventFields) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::delaySashPosUpdates) [list source [file join $dir tablelistBind.tcl]] set auto_index(::tablelist::addActiveTag) [list source [file join $dir tablelistBind.tcl]] set auto_index(::tablelist::removeActiveTag) [list source [file join $dir tablelistBind.tcl]] set auto_index(::tablelist::cleanup) [list source [file join $dir tablelistBind.tcl]] @@ -547,10 +552,13 @@ set auto_index(doesMatch) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::seeRow) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::seeCell) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::rowSelection) [list source [file join $dir tablelistWidget.tcl]] -set auto_index(::tablelist::moveTo) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::horizMoveTo) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::vertMoveTo) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::seeTextIdx) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::updateIdletasksDelayed) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::updateIdletasks) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::hdrConfigure) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::bodyConfigure) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::fetchSelection) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::lostSelection) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::activeTrace) [list source [file join $dir tablelistWidget.tcl]] From e22868af47556c7adb60ed2a51535d25ef64367e Mon Sep 17 00:00:00 2001 From: csaba Date: Fri, 23 Jun 2017 19:27:04 +0000 Subject: [PATCH 007/150] * doc/*.html: Updated to reflect the changes; more on the "-formatcommand" column configuration option in connection with "-sortmode integer|real"; minor improvements. --- modules/tablelist/doc/index.html | 10 +- modules/tablelist/doc/tablelist.html | 76 +++++----- modules/tablelist/doc/tablelistBWidget.html | 2 +- modules/tablelist/doc/tablelistBinding.html | 94 ++++++++++-- modules/tablelist/doc/tablelistColSort.html | 2 +- modules/tablelist/doc/tablelistCombobox.html | 2 +- modules/tablelist/doc/tablelistCtext.html | 2 +- modules/tablelist/doc/tablelistIwidgets.html | 2 +- modules/tablelist/doc/tablelistMentry.html | 2 +- modules/tablelist/doc/tablelistThemes.html | 2 +- modules/tablelist/doc/tablelistTile.html | 2 +- modules/tablelist/doc/tablelistTkCore.html | 2 +- modules/tablelist/doc/tablelistWidget.html | 145 ++++++++++++++++--- 13 files changed, 251 insertions(+), 92 deletions(-) diff --git a/modules/tablelist/doc/index.html b/modules/tablelist/doc/index.html index 5ed6c3e6..71c3de9e 100644 --- a/modules/tablelist/doc/index.html +++ b/modules/tablelist/doc/index.html @@ -1,7 +1,7 @@ The Multi-Column Listbox and Tree Widget Package Tablelist - 5.17 + 5.18
-

The Multi-Column Listbox and Tree Widget Package Tablelist 5.17

+

The Multi-Column Listbox and Tree Widget Package Tablelist 5.18

by

@@ -33,9 +33,11 @@

Contents

Commands for Interactive Sorting by One or More Columns

-

Helper Commands Used in Tablelist Binding +

Commands Related to Binding Scripts

+

Commands Related to Tile Themes

+

Interactive Tablelist Cell Editing Using Tk Core Widgets

@@ -56,7 +58,5 @@

Contents

Interactive Tablelist Cell Editing Using the Mentry Package

- -

Commands Related to Tile Themes

diff --git a/modules/tablelist/doc/tablelist.html b/modules/tablelist/doc/tablelist.html index a1f417bd..5771378d 100644 --- a/modules/tablelist/doc/tablelist.html +++ b/modules/tablelist/doc/tablelist.html @@ -13,7 +13,7 @@

Tablelist Programmer's Guide

-

For Tablelist Version 5.17

+

For Tablelist Version 5.18

by

@@ -170,8 +170,8 @@

What Is Tablelist?

How to Get It?

Tablelist is available for free download from the same URL as Wcb.  - The distribution file is tablelist5.17.tar.gz for UNIX and - tablelist5_17.zip for Windows.  These files contain the + The distribution file is tablelist5.18.tar.gz for UNIX and + tablelist5_18.zip for Windows.  These files contain the same information, except for the additional carriage return character preceding the linefeed at the end of each line in the text files for Windows.

@@ -195,21 +195,21 @@

How to Install It?

To install Tablelist on UNIX, cd to the desired directory and unpack the distribution file - tablelist5.17.tar.gz:

+ tablelist5.18.tar.gz:

-gunzip -c tablelist5.17.tar.gz | tar -xf -
+gunzip -c tablelist5.18.tar.gz | tar -xf -
 
-

This command will create a directory named tablelist5.17, +

This command will create a directory named tablelist5.18, with the subdirectories demos, doc, and scripts.

On Windows, use WinZip or some other program capable of unpacking - the distribution file tablelist5_17.zip into the directory - tablelist5.17, with the subdirectories demos, + the distribution file tablelist5_18.zip into the directory + tablelist5.18, with the subdirectories demos, doc, and scripts.

The file tablelistEdit.tcl in the scripts @@ -306,14 +306,14 @@

How to Use It?

tablelist and tablelist_tile.

REMARK:  If you have an earlier Tablelist version as part of - ActiveTcl 8.5 or above and the new Tablelist release 5.17, then it is highly - recommended to specify the version number 5.17 in the  + ActiveTcl 8.5 or above and the new Tablelist release 5.18, then it is highly + recommended to specify the version number 5.18 in the  package require  command, because otherwise the interpreter will load the old Tablelist version included in ActiveTcl as Tcl Module.  The examples below use the - statement  package require tablelist 5.17,  and their + statement  package require tablelist 5.18,  and their tile-based counterparts invoke the command  package require - tablelist_tile 5.17.

+ tablelist_tile 5.18.

Since the packages Tablelist and Tablelist_tile are implemented in the tablelist namespace, you must either invoke the

@@ -498,7 +498,7 @@

A tablelist Widget for Displaying and Editing
-package require tablelist 5.17
+package require tablelist 5.18
 source [file join $tablelist::library demos config.tcl]
 
@@ -540,8 +540,8 @@

A tablelist Widget for Displaying and Editing the following figure:

- Configuration Options + Configuration Options

It is assumed that the Tcl command associated with the widget specified by @@ -555,7 +555,7 @@

A tablelist Widget for Displaying and Editing
-package require tablelist 5.17
+package require tablelist 5.18
 
 namespace eval demo {
     #
@@ -588,12 +588,11 @@ 

A tablelist Widget for Displaying and Editing option add *DemoTop*Font TkDefaultFont option add *DemoTop*selectBackground #5294e2 option add *DemoTop*selectForeground white - } else { - option add *DemoTop.tf.borderWidth 1 - option add *DemoTop.tf.relief sunken - option add *DemoTop.tf.tbl.borderWidth 0 - option add *DemoTop.tf.tbl.highlightThickness 0 } + option add *DemoTop.tf.borderWidth 1 + option add *DemoTop.tf.relief sunken + option add *DemoTop.tf.tbl.borderWidth 0 + option add *DemoTop.tf.tbl.highlightThickness 0 option add *DemoTop.tf.tbl.background white option add *DemoTop.tf.tbl.stripeBackground #f0f0f0 option add *DemoTop.tf.tbl.setGrid yes @@ -1003,14 +1002,14 @@

Two Widget Browsers Based on a tablelist

in the file browse.tcl is a multi-column listbox:

- Widget Browser + Widget Browser

The tablelist created by the procedure of the same name in the file browseTree.tcl is a multi-column tree widget:

- Widget Browser + Widget Browser

The demo::displayChildren command inserts some data of the @@ -1034,7 +1033,7 @@

Two Widget Browsers Based on a tablelist

 package require Tk 8.3
-package require tablelist 5.17
+package require tablelist 5.18
 
 namespace eval demo {
     variable dir [file dirname [info script]]
@@ -1616,7 +1615,7 @@ 

A Directory Viewer Based on a tablelist

as multi-column tree widget:

- Directory Viewer + Directory Viewer

By double-clicking an item or invoking the single entry of a pop-up menu @@ -1632,7 +1631,7 @@

A Directory Viewer Based on a tablelist

 package require Tk 8.3
-package require tablelist 5.17
+package require tablelist 5.18
 
 #
 # Add some entries to the Tk option database
@@ -1698,15 +1697,10 @@ 

A Directory Viewer Based on a tablelist

-if {[string compare $winSys "x11"] == 0} {
-    . . .
-} else {
-    option add *ScrollArea.borderWidth                  1
-    option add *ScrollArea.relief                       sunken
-    option add *ScrollArea.Tablelist.borderWidth        0
-    option add *ScrollArea.Tablelist.highlightThickness 0
-    . . .
-}
+option add *ScrollArea.borderWidth                      1
+option add *ScrollArea.relief                           sunken
+option add *ScrollArea.Tablelist.borderWidth            0
+option add *ScrollArea.Tablelist.highlightThickness     0
 
@@ -2023,7 +2017,7 @@

Advanced Interactive tablelist Cell Editing

 package require Tk 8.4                          ;# because of "-compound"
-package require tablelist 5.17
+package require tablelist 5.18
 package require BWidget
 
 wm title . "Serial Line Configuration"
@@ -2356,15 +2350,15 @@ 

A tablelist Widget Containing Embedded Windows

active state:

- Embedded Windows + Embedded Windows

First, we create and populate the tablelist widget:

-package require tablelist 5.17
+package require tablelist 5.18
 
 wm title . "Tk Library Scripts"
 
@@ -2608,7 +2602,7 @@ 

Tile-Based Demo Scripts

 package require Tk 8.3                          ;# because of entry validation
-package require tablelist 5.17
+package require tablelist 5.18
 
@@ -2616,7 +2610,7 @@

Tile-Based Demo Scripts

-package require tablelist_tile 5.17
+package require tablelist_tile 5.18
 
diff --git a/modules/tablelist/doc/tablelistBWidget.html b/modules/tablelist/doc/tablelistBWidget.html index 86ef59ff..e96481a4 100644 --- a/modules/tablelist/doc/tablelistBWidget.html +++ b/modules/tablelist/doc/tablelistBWidget.html @@ -12,7 +12,7 @@

Interactive Tablelist Cell Editing Using the BWidget Package

-

For Tablelist Version 5.17

+

For Tablelist Version 5.18

by

diff --git a/modules/tablelist/doc/tablelistBinding.html b/modules/tablelist/doc/tablelistBinding.html index a6210b3a..2899fbfc 100644 --- a/modules/tablelist/doc/tablelistBinding.html +++ b/modules/tablelist/doc/tablelistBinding.html @@ -1,6 +1,6 @@ - Helper Commands Used in Tablelist Binding Scripts + Commands Related to Binding Scripts @@ -10,9 +10,9 @@
-

Helper Commands Used in Tablelist Binding Scripts

+

Commands Related to Binding Scripts

-

For Tablelist Version 5.17

+

For Tablelist Version 5.18

by

@@ -37,6 +37,9 @@

Contents

  • The tablelist::getTablelistColumn Command
  • + +
  • The + tablelist::delaySashPosUpdates Command
  • @@ -46,17 +49,24 @@

    Contents

    Overview

    -

    The commands described in this reference page are designed to be used in - binding scripts associated with the binding tags whose names are returned by - the bodytag - and labeltag - subcommands of the Tcl command associated with a tablelist widget.  The - first two of these commands are also used in the default binding scripts - associated with the binding tag TablelistBody.  For - details and examples see the sections DEFAULT AND INDIVIDUAL BINDINGS FOR THE - TABLELIST BODY and DEFAULT - AND INDIVIDUAL BINDINGS FOR THE HEADER LABELS.

    +

    The first three commands described in this reference page are designed to + be used in binding scripts associated with the binding tags whose names are + returned by the bodytag and labeltag subcommands of the + Tcl command associated with a tablelist widget.  The first two of these + commands are also used in the default binding scripts associated with the + binding tag TablelistBody.  For details and examples + see the sections DEFAULT AND + INDIVIDUAL BINDINGS FOR THE TABLELIST BODY and DEFAULT AND INDIVIDUAL BINDINGS FOR THE + HEADER LABELS.

    + +

    The last command is related to the default binding scripts for Tk core + panedwindow and ttk::panedwindow widgets.  It can be used to control the + frequency of the sash position updates, which might be necessary to eliminate + some artifacts caused by dragging a sash if one or more of the panes contains + a tablelist widget with embedded images.

    Contents     The

    tablelist, path name, binding script
    + +
    + +

    The + tablelist::delaySashPosUpdates Command

    + +
    +
    NAME
    + +
    tablelist::delaySashPosUpdates – Set a delay for the + panedwindow sash position updates
    + +
    SYNOPSIS
    + +
    +
    +tablelist::delaySashPosUpdates panedwindowPathName ms
    +
    +
    + +
    DESCRIPTION
    + +
    This command sets a delay for the updates of the sash position caused + by dragging a sash of the panedwindow widget specified by the first + argument, which must be the path name of a Tk core panedwindow or + ttk::panedwindow widget.  ms must be an integer + giving the delay in milliseconds.  If this number is non-negative then + the sash position updates via  sash place ...  + (for a Tk core panedwindow widget) or  sashpos + ...  (for a ttk::panedwindow widget) will be scheduled for + execution ms milliseconds later, in such a way that, + until the time for an already scheduled update expires, new drag events + won't schedule new update operations (only their data will be + remembered).  This will reduce the frequency of the sash position + updates caused by dragging a sash of the specified widget, depending on the + value of ms.  If this number is negative then any + dragging of a sash of the specified widget will immediately trigger an + update of the sash position, as implemented in the default binding scripts + for Tk core panedwindow and ttk::panedwindow widgets.
    + +
    This command can be used to control the frequency of the + sash position updates for a given panedwindow widget, which might be + necessary to eliminate some artifacts caused by dragging a sash if one or + more of the panes contains a tablelist widget with embedded images.  + The value of ms (typically a number between 10 and 100) + is application- and platform-specific (on Windows and Mac OS X Aqua you + will need a higher value than on X11).
    + +
    KEYWORDS
    + +
    panedwindow, tablelist, path name, binding script
    +
    +

    Contents     Start page

    diff --git a/modules/tablelist/doc/tablelistColSort.html b/modules/tablelist/doc/tablelistColSort.html index 82e87f22..78ff717d 100644 --- a/modules/tablelist/doc/tablelistColSort.html +++ b/modules/tablelist/doc/tablelistColSort.html @@ -12,7 +12,7 @@

    Commands for Interactive Sorting by One or More Columns

    -

    For Tablelist Version 5.17

    +

    For Tablelist Version 5.18

    by

    diff --git a/modules/tablelist/doc/tablelistCombobox.html b/modules/tablelist/doc/tablelistCombobox.html index 9799ea84..f8c00836 100644 --- a/modules/tablelist/doc/tablelistCombobox.html +++ b/modules/tablelist/doc/tablelistCombobox.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using the combobox Package

    -

    For Tablelist Version 5.17

    +

    For Tablelist Version 5.18

    by

    diff --git a/modules/tablelist/doc/tablelistCtext.html b/modules/tablelist/doc/tablelistCtext.html index 1dcb21ce..689517d9 100644 --- a/modules/tablelist/doc/tablelistCtext.html +++ b/modules/tablelist/doc/tablelistCtext.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using the ctext Package

    -

    For Tablelist Version 5.17

    +

    For Tablelist Version 5.18

    by

    diff --git a/modules/tablelist/doc/tablelistIwidgets.html b/modules/tablelist/doc/tablelistIwidgets.html index cd952373..168f7576 100644 --- a/modules/tablelist/doc/tablelistIwidgets.html +++ b/modules/tablelist/doc/tablelistIwidgets.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using the Iwidgets Package

    -

    For Tablelist Version 5.17

    +

    For Tablelist Version 5.18

    by

    diff --git a/modules/tablelist/doc/tablelistMentry.html b/modules/tablelist/doc/tablelistMentry.html index 37df8880..573cdb40 100644 --- a/modules/tablelist/doc/tablelistMentry.html +++ b/modules/tablelist/doc/tablelistMentry.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using the Mentry Package

    -

    For Tablelist Version 5.17

    +

    For Tablelist Version 5.18

    by

    diff --git a/modules/tablelist/doc/tablelistThemes.html b/modules/tablelist/doc/tablelistThemes.html index cfca980d..1b2be7d3 100644 --- a/modules/tablelist/doc/tablelistThemes.html +++ b/modules/tablelist/doc/tablelistThemes.html @@ -12,7 +12,7 @@

    Commands Related to Tile Themes

    -

    For Tablelist Version 5.17

    +

    For Tablelist Version 5.18

    by

    diff --git a/modules/tablelist/doc/tablelistTile.html b/modules/tablelist/doc/tablelistTile.html index 622999cf..685b12b6 100644 --- a/modules/tablelist/doc/tablelistTile.html +++ b/modules/tablelist/doc/tablelistTile.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using Tile Widgets

    -

    For Tablelist Version 5.17

    +

    For Tablelist Version 5.18

    by

    diff --git a/modules/tablelist/doc/tablelistTkCore.html b/modules/tablelist/doc/tablelistTkCore.html index 297c3bfc..142ea259 100644 --- a/modules/tablelist/doc/tablelistTkCore.html +++ b/modules/tablelist/doc/tablelistTkCore.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using Tk Core Widgets

    -

    For Tablelist Version 5.17

    +

    For Tablelist Version 5.18

    by

    diff --git a/modules/tablelist/doc/tablelistWidget.html b/modules/tablelist/doc/tablelistWidget.html index 6fcf9945..a8b516a2 100644 --- a/modules/tablelist/doc/tablelistWidget.html +++ b/modules/tablelist/doc/tablelistWidget.html @@ -13,7 +13,7 @@

    The tablelist::tablelist Command

    -

    For Tablelist Version 5.17

    +

    For Tablelist Version 5.18

    by

    @@ -122,6 +122,9 @@

    Quick Reference

    -customdragsource boolean
    +
    -displayondemand + boolean
    +
    -editendcommand command
    @@ -1761,11 +1764,11 @@

    Detailed Reference

    called dynamic-width columns.  In general, they are more user-friendly than their static-width counterparts, being that their widths are automatically adapted to their contents.  On the - other hand, the static-width columns perform significantly better on - item insertion and sorting than the dynamic-width ones, due to some - optimizations introduced in Tablelist version 5.6.  (Prior to that - release, the above-mentioned operations were faster with dynamic-width - columns than with static-width ones.)

    + other hand, if the -displayondemand option is true + (which is the default) then the static-width columns perform + significantly better on item insertion and sorting than the + dynamic-width ones.

    @@ -1860,6 +1863,48 @@

    Detailed Reference

    +
    + + + + + + + + + + + + + + + + + + +
    Command-Line Name: -displayondemand
    Database Name: displayOnDemand
    Database Class: DisplayOnDemand
    + +
    +

    Specifies a boolean value that controls the way the texts of newly + inserted rows will be displayed in the underlying text widget.  + If true then the texts of the new rows won't be inserted into the body + text widget until the corresponding cells become visible (e.g., as a + result of horizontal or vertical scrolling).  Otherwise the texts + of the new rows will be displayed in the underlying text widget + immediately after inserting the rows.  The default is + 1.

    + +

    REMARK:  The default value true of this option makes the + item insertion and sorting significantly faster, especially in the + presence of static-width columns, because the snipping of elements that + don't fit into their cells will be postponed to the time when they get + displayed in the body text widget.  On the other hand, this + display on demand imposes some performance penalty on the scrolling, + especially if the tablelist widget has many columns.  To speed up + the scrolling, you might consider setting this option to false.

    +
    +
    +
    @@ -4680,7 +4725,7 @@

    Detailed Reference

    "51"> + earlier than 15.04 of the Ubuntu Linux distribution. @@ -4699,8 +4744,8 @@

    Detailed Reference

    - + @@ -4710,7 +4755,7 @@

    Detailed Reference

    "51"> + with versions 16.10 and later of the Ubuntu MATE distribution. @@ -5156,7 +5201,54 @@

    Detailed Reference

    strings because they are needed for other purposes (like sorting or editing).  In such cases, a procedure returning an empty string can be used as the option's value, thus making sure that the textual - information contained in that column remains hidden. + information contained in that column remains hidden: + +
    +
    +
    +proc emptyStr val { return "" }
    +
    +
    +
    + +
    Another important use case is related to tablelist + columns whose -sortmode + option was set to integer or + real.  If some of the cells of such a column + are empty then an attempt to sort the items by that column via + sortbycolumn or + sortbycolumnlist + would generate an error, because the  + lsort -integer  or  + lsort -real  invocation made by Tablelist + would complain about getting an unexpected empty string instead of an + integer or floating-point number.  To avoid this, make sure that + the cells intended to display an empty string have as internal value a + number that is either strictly less or strictly greater than all the + other integer or real numbers contained in the column in question, and + use the -formatcommand option to control what will + be displayed in the column's cells.  For example, if all the + elements of the column are non-negative values then you can use the + number -1 as internal value for the cells that should + display an empty string, and set the value of the + -formatcommand option to formatNumber, + where formatNumber is the procedure implemented as + follows: + +
    +
    +
    +proc formatNumber val { return [expr {$val == -1 ? "" : $val}] }
    +
    +
    +
    + +
    This will make the cells displaying an empty string + appear before all the others when sorting the column in increasing + order.  To achieve the opposite effect, you will have to replace + the -1 with an application-specific value that is strictly + greater than all the other numbers contained in the column in + question.
    The demo scripts included in the Tablelist distribution contain further examples demonstrating the use of this option.  @@ -5431,14 +5523,24 @@

    Detailed Reference

    + comparison.  If any of the elements cannot be converted to + an integer (e.g., because it is an empty string) then a sort + attempt will generate an error.  See the description of the + -formatcommand option for the + recommended way to avoid this problem. + floating-point comparison.  If any of the elements cannot be + converted to a floating-point value (e.g., because it is an empty + string) then a sort attempt will generate an error.  See the + description of the -formatcommand option for the + recommended way to avoid this problem.
    Inspired by a couple of GTK 3 themes bundled with versions - earlier than 15.4 of the Ubuntu Linux distribution.
    ubuntu3Inspired by a couple of GTK 3 themes bundled with version - 16.10 of the Ubuntu Linux distribution.Inspired by a couple of GTK 3 themes bundled with versions + 16.10 and later of the Ubuntu Linux distribution.
    Inspired by the themes Ambiant-MATE and Radiant-MATE bundled - with version 16.10 of the Ubuntu MATE distribution.
    integer Convert the elements to integers and use integer - comparison.
    real Convert the elements to floating-point values and use - floating-point comparison.
    @@ -7577,13 +7679,10 @@

    Detailed Reference

     # Add some entries to the Tk option database
    -set winSys [tk windowingsystem]
    -if {[string compare $winSys "x11"] != 0} {
    -    option add *ScrollArea.borderWidth                  1
    -    option add *ScrollArea.relief                       sunken
    -    option add *ScrollArea.Tablelist.borderWidth        0
    -    option add *ScrollArea.Tablelist.highlightThickness 0
    -}
    +option add *ScrollArea.borderWidth                      1
    +option add *ScrollArea.relief                           sunken
    +option add *ScrollArea.Tablelist.borderWidth            0
    +option add *ScrollArea.Tablelist.highlightThickness     0
     
     . . .
     
    @@ -7602,7 +7701,7 @@ 

    Detailed Reference

    # Manage the widgets within the frame grid $tbl -row 0 -rowspan 2 -column 0 -sticky news -if {[string compare $winSys "aqua"] == 0} { +if {[string compare [tk windowingsystem] "aqua"] == 0} { grid [$tbl cornerpath] -row 0 -column 1 -sticky ew grid $vsb -row 1 -column 1 -sticky ns } else { @@ -9814,8 +9913,8 @@

    Detailed Reference

    Tk fails to recognize the Control-backslash key sequence (for which one has to press Control, AltGr, and a third key: _ on a French and ß - on a German keyboard).  Moreover, on many keyboards it is quite - difficult (if not even impossible) to generate the + on a German keyboard).  Moreover, on many keyboards it is quite + difficult (if not even impossible) to generate the Control-backslash key sequence, fact which makes the support for this alternative shortcut even more useful on both X11 and Windows.

    From 5c397527cf1f97883957443c6c6d564e07c224e4 Mon Sep 17 00:00:00 2001 From: csaba Date: Fri, 23 Jun 2017 19:28:24 +0000 Subject: [PATCH 008/150] * doc/browse.png: Updated screenshots. * doc/browseTree.png: * doc/bwidget.png: * doc/config.png: * doc/dirViewer.png: * doc/embeddedWindows.png: * doc/embeddedWindows_tile.png: * doc/tileWidgets.png: --- modules/tablelist/doc/browse.png | Bin 6071 -> 6064 bytes modules/tablelist/doc/browseTree.png | Bin 9543 -> 9360 bytes modules/tablelist/doc/bwidget.png | Bin 11922 -> 12149 bytes modules/tablelist/doc/config.png | Bin 13183 -> 13531 bytes modules/tablelist/doc/dirViewer.png | Bin 12994 -> 13004 bytes modules/tablelist/doc/embeddedWindows.png | Bin 6603 -> 6608 bytes .../tablelist/doc/embeddedWindows_tile.png | Bin 6882 -> 6893 bytes modules/tablelist/doc/tileWidgets.png | Bin 11730 -> 12034 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/modules/tablelist/doc/browse.png b/modules/tablelist/doc/browse.png index 763197090cabe7e7972fab1d359ae06270d70ae0..0b2407eb6893bd9626f7cf3ac8823ecc79609b92 100644 GIT binary patch literal 6064 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 diff --git a/modules/tablelist/doc/browseTree.png b/modules/tablelist/doc/browseTree.png index 505e42ee79fb088f14ff7bb9dc815249b34b06e3..f94fe97df10677fddd250e184a53e208b6750986 100644 GIT binary patch literal 9360 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 G@BbexY#~zs literal 9543 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 GKKp;!w3j^q diff --git a/modules/tablelist/doc/bwidget.png b/modules/tablelist/doc/bwidget.png index 8a2ab5a3015a023b22c6f7f1de18922f41ed9338..e5fb7844e5bba9a92f669da3c5326a1e9d97e8f9 100644 GIT binary patch literal 12149 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 n0ewgtg#Vy(0VR$Xd+ZK+m# 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

    WRrU4U!+V|;!q4ABGWGS;@ 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 diff --git a/modules/tablelist/doc/config.png b/modules/tablelist/doc/config.png index 4fd0fb63640f9e189ba750e4fb9eef69e2f82c1a..a0cf6e9cfc03b7bd12d7a9287740c4c66d33d873 100644 GIT binary patch literal 13531 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 z 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 M%36<$9$LQsUzUJUMF0Q* literal 12994 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 A7XSbN diff --git a/modules/tablelist/doc/embeddedWindows.png b/modules/tablelist/doc/embeddedWindows.png index 34f29db07b7be319d9ffc7a07be096cc4472cd54..17b00be1a92dac7629bd844e513ba7ea8fafc0d5 100644 GIT binary patch delta 6489 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 EA7>HE9smFU delta 6484 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 diff --git a/modules/tablelist/doc/embeddedWindows_tile.png b/modules/tablelist/doc/embeddedWindows_tile.png index 78a87fdaeee2d425165be20a8378e302bb611bbb..b6d2aab3e83a8d40c9c55f93d84e13f79c325f8b 100644 GIT binary patch delta 6738 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 diff --git a/modules/tablelist/doc/tileWidgets.png b/modules/tablelist/doc/tileWidgets.png index 87cb23405706c2c01eb043833741a177dc642a91..472eb0a2949fa231f33c37ffb3f9e02aaacea811 100644 GIT binary patch literal 12034 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 literal 11730 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 K3Wajd0{#z$(TI2e From 79315a677c171c7ec47103ed9282ca0b265d0805 Mon Sep 17 00:00:00 2001 From: csaba Date: Fri, 23 Jun 2017 19:29:58 +0000 Subject: [PATCH 009/150] * ../../examples/*.tcl: Bumped the version number to 5.18; minor improvements. --- examples/tablelist/browse.tcl | 4 ++-- examples/tablelist/browseTree.tcl | 4 ++-- examples/tablelist/browseTree_tile.tcl | 2 +- examples/tablelist/browse_tile.tcl | 2 +- examples/tablelist/bwidget.tcl | 2 +- examples/tablelist/bwidget_tile.tcl | 2 +- examples/tablelist/config.tcl | 11 +++++------ examples/tablelist/config_tile.tcl | 9 ++++----- examples/tablelist/dirViewer.tcl | 4 ++-- examples/tablelist/dirViewer_tile.tcl | 2 +- examples/tablelist/embeddedWindows.tcl | 4 ++-- examples/tablelist/embeddedWindows_tile.tcl | 2 +- examples/tablelist/images.tcl | 4 ++-- examples/tablelist/iwidgets.tcl | 2 +- examples/tablelist/iwidgets_tile.tcl | 2 +- examples/tablelist/miscWidgets.tcl | 2 +- examples/tablelist/miscWidgets_tile.tcl | 2 +- examples/tablelist/option.tcl | 13 ++++++------- examples/tablelist/option_tile.tcl | 11 +++++------ examples/tablelist/styles.tcl | 2 +- examples/tablelist/styles_tile.tcl | 2 +- examples/tablelist/tileWidgets.tcl | 2 +- 22 files changed, 43 insertions(+), 47 deletions(-) diff --git a/examples/tablelist/browse.tcl b/examples/tablelist/browse.tcl index 575db39d..4887a038 100644 --- a/examples/tablelist/browse.tcl +++ b/examples/tablelist/browse.tcl @@ -5,7 +5,7 @@ # Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist 5.17 +package require tablelist 5.18 namespace eval demo { variable dir [file dirname [info script]] @@ -119,7 +119,7 @@ proc demo::displayChildren w { # Manage the widgets # grid $tbl -row 0 -rowspan 2 -column 0 -sticky news - variable winSys + variable winSys ;# see config.tcl if {[string compare $winSys "aqua"] == 0} { grid [$tbl cornerpath] -row 0 -column 1 -sticky ew grid $vsb -row 1 -column 1 -sticky ns diff --git a/examples/tablelist/browseTree.tcl b/examples/tablelist/browseTree.tcl index 2e99d9cb..897ac4fe 100644 --- a/examples/tablelist/browseTree.tcl +++ b/examples/tablelist/browseTree.tcl @@ -6,7 +6,7 @@ #============================================================================== package require Tk 8.3 -package require tablelist 5.17 +package require tablelist 5.18 namespace eval demo { variable dir [file dirname [info script]] @@ -121,7 +121,7 @@ proc demo::displayChildren w { # Manage the widgets # grid $tbl -row 0 -rowspan 2 -column 0 -sticky news - variable winSys + variable winSys ;# see config.tcl if {[string compare $winSys "aqua"] == 0} { grid [$tbl cornerpath] -row 0 -column 1 -sticky ew grid $vsb -row 1 -column 1 -sticky ns diff --git a/examples/tablelist/browseTree_tile.tcl b/examples/tablelist/browseTree_tile.tcl index 93def871..cb6f67b6 100644 --- a/examples/tablelist/browseTree_tile.tcl +++ b/examples/tablelist/browseTree_tile.tcl @@ -5,7 +5,7 @@ # Copyright (c) 2010-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 5.17 +package require tablelist_tile 5.18 namespace eval demo { variable dir [file dirname [info script]] diff --git a/examples/tablelist/browse_tile.tcl b/examples/tablelist/browse_tile.tcl index 6910b56c..27b1ccc1 100644 --- a/examples/tablelist/browse_tile.tcl +++ b/examples/tablelist/browse_tile.tcl @@ -5,7 +5,7 @@ # Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 5.17 +package require tablelist_tile 5.18 namespace eval demo { variable dir [file dirname [info script]] diff --git a/examples/tablelist/bwidget.tcl b/examples/tablelist/bwidget.tcl index d8acf1d1..551b3488 100755 --- a/examples/tablelist/bwidget.tcl +++ b/examples/tablelist/bwidget.tcl @@ -9,7 +9,7 @@ #============================================================================== package require Tk 8.4 ;# because of "-compound" -package require tablelist 5.17 +package require tablelist 5.18 package require BWidget wm title . "Serial Line Configuration" diff --git a/examples/tablelist/bwidget_tile.tcl b/examples/tablelist/bwidget_tile.tcl index be7a1a96..59ee3d0f 100755 --- a/examples/tablelist/bwidget_tile.tcl +++ b/examples/tablelist/bwidget_tile.tcl @@ -8,7 +8,7 @@ # Copyright (c) 2004-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 5.17 +package require tablelist_tile 5.18 package require BWidget wm title . "Serial Line Configuration" diff --git a/examples/tablelist/config.tcl b/examples/tablelist/config.tcl index 8712a79b..c2e38cac 100644 --- a/examples/tablelist/config.tcl +++ b/examples/tablelist/config.tcl @@ -5,7 +5,7 @@ # Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist 5.17 +package require tablelist 5.18 namespace eval demo { # @@ -38,12 +38,11 @@ namespace eval demo { option add *DemoTop*Font TkDefaultFont option add *DemoTop*selectBackground #5294e2 option add *DemoTop*selectForeground white - } else { - option add *DemoTop.tf.borderWidth 1 - option add *DemoTop.tf.relief sunken - option add *DemoTop.tf.tbl.borderWidth 0 - option add *DemoTop.tf.tbl.highlightThickness 0 } + option add *DemoTop.tf.borderWidth 1 + option add *DemoTop.tf.relief sunken + option add *DemoTop.tf.tbl.borderWidth 0 + option add *DemoTop.tf.tbl.highlightThickness 0 option add *DemoTop.tf.tbl.background white option add *DemoTop.tf.tbl.stripeBackground #f0f0f0 option add *DemoTop.tf.tbl.setGrid yes diff --git a/examples/tablelist/config_tile.tcl b/examples/tablelist/config_tile.tcl index 94b58878..ab916182 100644 --- a/examples/tablelist/config_tile.tcl +++ b/examples/tablelist/config_tile.tcl @@ -5,7 +5,7 @@ # Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 5.17 +package require tablelist_tile 5.18 namespace eval demo { # @@ -23,10 +23,6 @@ namespace eval demo { # if {[tk windowingsystem] eq "x11"} { option add *DemoTop*Font TkDefaultFont - } else { - option add *DemoTop.tf.borderWidth 1 - option add *DemoTop.tf.relief sunken - option add *DemoTop.tf.tbl.borderWidth 0 } tablelist::setThemeDefaults set foreground [winfo rgb . $tablelist::themeDefaults(-foreground)] @@ -41,6 +37,9 @@ namespace eval demo { option add *DemoTop*selectBorderWidth \ $tablelist::themeDefaults(-selectborderwidth) } + option add *DemoTop.tf.borderWidth 1 + option add *DemoTop.tf.relief sunken + option add *DemoTop.tf.tbl.borderWidth 0 option add *DemoTop.tf.tbl.background white option add *DemoTop.tf.tbl.stripeBackground #f0f0f0 option add *DemoTop.tf.tbl.setGrid yes diff --git a/examples/tablelist/dirViewer.tcl b/examples/tablelist/dirViewer.tcl index 6604ade4..45a3fc48 100755 --- a/examples/tablelist/dirViewer.tcl +++ b/examples/tablelist/dirViewer.tcl @@ -8,7 +8,7 @@ #============================================================================== package require Tk 8.3 -package require tablelist 5.17 +package require tablelist 5.18 # # Add some entries to the Tk option database @@ -84,7 +84,7 @@ proc displayContents dir { # Manage the widgets # grid $tbl -row 0 -rowspan 2 -column 0 -sticky news - global winSys + global winSys ;# see option.tcl if {[string compare $winSys "aqua"] == 0} { grid [$tbl cornerpath] -row 0 -column 1 -sticky ew grid $vsb -row 1 -column 1 -sticky ns diff --git a/examples/tablelist/dirViewer_tile.tcl b/examples/tablelist/dirViewer_tile.tcl index dca277fe..52da886e 100755 --- a/examples/tablelist/dirViewer_tile.tcl +++ b/examples/tablelist/dirViewer_tile.tcl @@ -7,7 +7,7 @@ # Copyright (c) 2010-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 5.17 +package require tablelist_tile 5.18 # # Add some entries to the Tk option database diff --git a/examples/tablelist/embeddedWindows.tcl b/examples/tablelist/embeddedWindows.tcl index 7b08698e..ceb3b90f 100755 --- a/examples/tablelist/embeddedWindows.tcl +++ b/examples/tablelist/embeddedWindows.tcl @@ -6,7 +6,7 @@ # Copyright (c) 2004-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist 5.17 +package require tablelist 5.18 wm title . "Tk Library Scripts" @@ -190,7 +190,7 @@ set btn [button .btn -text "Close" -command exit] # Manage the widgets # grid $tbl -row 0 -rowspan 2 -column 0 -sticky news -if {[string compare $winSys "aqua"] == 0} { +if {[string compare $winSys "aqua"] == 0} { ;# see option.tcl grid [$tbl cornerpath] -row 0 -column 1 -sticky ew grid $vsb -row 1 -column 1 -sticky ns } else { diff --git a/examples/tablelist/embeddedWindows_tile.tcl b/examples/tablelist/embeddedWindows_tile.tcl index 2eb39561..3f389457 100755 --- a/examples/tablelist/embeddedWindows_tile.tcl +++ b/examples/tablelist/embeddedWindows_tile.tcl @@ -6,7 +6,7 @@ # Copyright (c) 2004-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 5.17 +package require tablelist_tile 5.18 wm title . "Tile Library Scripts" diff --git a/examples/tablelist/images.tcl b/examples/tablelist/images.tcl index c0c1cfb3..cf1616df 100644 --- a/examples/tablelist/images.tcl +++ b/examples/tablelist/images.tcl @@ -15,13 +15,13 @@ image create photo uncheckedImg -file [file join $dir unchecked.gif] # set colorNames { "red" "green" "blue" "magenta" - "yellow" "cyan" "white" "light gray" + "yellow" "cyan" "light gray" "white" "dark red" "dark green" "dark blue" "dark magenta" "dark yellow" "dark cyan" "dark gray" "black" } set colorValues { #FF0000 #00FF00 #0000FF #FF00FF - #FFFF00 #00FFFF #FFFFFF #C0C0C0 + #FFFF00 #00FFFF #C0C0C0 #FFFFFF #800000 #008000 #000080 #800080 #808000 #008080 #808080 #000000 } diff --git a/examples/tablelist/iwidgets.tcl b/examples/tablelist/iwidgets.tcl index 2b0eec8b..0d4f0f29 100755 --- a/examples/tablelist/iwidgets.tcl +++ b/examples/tablelist/iwidgets.tcl @@ -9,7 +9,7 @@ #============================================================================== package require Tk 8.4 ;# because of "-compound" -package require tablelist 5.17 +package require tablelist 5.18 package require Iwidgets wm title . "Serial Line Configuration" diff --git a/examples/tablelist/iwidgets_tile.tcl b/examples/tablelist/iwidgets_tile.tcl index 3a49e673..c20db84c 100755 --- a/examples/tablelist/iwidgets_tile.tcl +++ b/examples/tablelist/iwidgets_tile.tcl @@ -8,7 +8,7 @@ # Copyright (c) 2004-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 5.17 +package require tablelist_tile 5.18 package require Iwidgets wm title . "Serial Line Configuration" diff --git a/examples/tablelist/miscWidgets.tcl b/examples/tablelist/miscWidgets.tcl index c8da1632..7626d656 100755 --- a/examples/tablelist/miscWidgets.tcl +++ b/examples/tablelist/miscWidgets.tcl @@ -9,7 +9,7 @@ #============================================================================== package require Tk 8.4 ;# because of "-compound" and the spinbox widget -package require tablelist 5.17 +package require tablelist 5.18 package require combobox package require mentry diff --git a/examples/tablelist/miscWidgets_tile.tcl b/examples/tablelist/miscWidgets_tile.tcl index 75208061..ed6f0cb1 100755 --- a/examples/tablelist/miscWidgets_tile.tcl +++ b/examples/tablelist/miscWidgets_tile.tcl @@ -8,7 +8,7 @@ # Copyright (c) 2004-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 5.17 +package require tablelist_tile 5.18 package require combobox package require mentry diff --git a/examples/tablelist/option.tcl b/examples/tablelist/option.tcl index 272a4164..8c9aa406 100644 --- a/examples/tablelist/option.tcl +++ b/examples/tablelist/option.tcl @@ -27,13 +27,6 @@ if {[string compare $winSys "x11"] == 0} { option add *Font TkDefaultFont option add *selectBackground #5294e2 option add *selectForeground white -} else { - option add *ScrollArea.borderWidth 1 - option add *ScrollArea.relief sunken - option add *ScrollArea.Tablelist.borderWidth 0 - option add *ScrollArea.Tablelist.highlightThickness 0 - option add *ScrollArea.Text.borderWidth 0 - option add *ScrollArea.Text.highlightThickness 0 } option add *Tablelist.background white option add *Tablelist.stripeBackground #f0f0f0 @@ -41,3 +34,9 @@ option add *Tablelist.setGrid yes option add *Tablelist.movableColumns yes option add *Tablelist.labelCommand tablelist::sortByColumn option add *Tablelist.labelCommand2 tablelist::addToSortColumns +option add *ScrollArea.borderWidth 1 +option add *ScrollArea.relief sunken +option add *ScrollArea.Tablelist.borderWidth 0 +option add *ScrollArea.Tablelist.highlightThickness 0 +option add *ScrollArea.Text.borderWidth 0 +option add *ScrollArea.Text.highlightThickness 0 diff --git a/examples/tablelist/option_tile.tcl b/examples/tablelist/option_tile.tcl index a33c1bf4..32b84c62 100644 --- a/examples/tablelist/option_tile.tcl +++ b/examples/tablelist/option_tile.tcl @@ -10,12 +10,6 @@ # if {[tk windowingsystem] eq "x11"} { option add *Font TkDefaultFont -} else { - option add *ScrollArea.borderWidth 1 - option add *ScrollArea.relief sunken - option add *ScrollArea.Tablelist.borderWidth 0 - option add *ScrollArea.Text.borderWidth 0 - option add *ScrollArea.Text.highlightThickness 0 } tablelist::setThemeDefaults if {[tablelist::getCurrentTheme] eq "aqua"} { @@ -34,3 +28,8 @@ option add *Tablelist.setGrid yes option add *Tablelist.movableColumns yes option add *Tablelist.labelCommand tablelist::sortByColumn option add *Tablelist.labelCommand2 tablelist::addToSortColumns +option add *ScrollArea.borderWidth 1 +option add *ScrollArea.relief sunken +option add *ScrollArea.Tablelist.borderWidth 0 +option add *ScrollArea.Text.borderWidth 0 +option add *ScrollArea.Text.highlightThickness 0 diff --git a/examples/tablelist/styles.tcl b/examples/tablelist/styles.tcl index 96467a68..a3f20b2c 100755 --- a/examples/tablelist/styles.tcl +++ b/examples/tablelist/styles.tcl @@ -6,7 +6,7 @@ # Copyright (c) 2002-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist 5.17 +package require tablelist 5.18 wm title . "Tablelist Styles" diff --git a/examples/tablelist/styles_tile.tcl b/examples/tablelist/styles_tile.tcl index f0abebf7..08d0aa0b 100755 --- a/examples/tablelist/styles_tile.tcl +++ b/examples/tablelist/styles_tile.tcl @@ -6,7 +6,7 @@ # Copyright (c) 2002-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 5.17 +package require tablelist_tile 5.18 wm title . "Tablelist Styles" diff --git a/examples/tablelist/tileWidgets.tcl b/examples/tablelist/tileWidgets.tcl index cafc90af..dfbe898f 100755 --- a/examples/tablelist/tileWidgets.tcl +++ b/examples/tablelist/tileWidgets.tcl @@ -7,7 +7,7 @@ # Copyright (c) 2005-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 5.17 +package require tablelist_tile 5.18 wm title . "Serial Line Configuration" From 2ff2d2f7eff95f647f0819c32cd68dcbf56e422c Mon Sep 17 00:00:00 2001 From: csaba Date: Fri, 23 Jun 2017 20:19:12 +0000 Subject: [PATCH 010/150] * scripts/tablelistWidget.tcl: Corrected a typo. --- modules/tablelist/ChangeLog | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/tablelist/ChangeLog b/modules/tablelist/ChangeLog index c71376dd..52d089ac 100644 --- a/modules/tablelist/ChangeLog +++ b/modules/tablelist/ChangeLog @@ -1,3 +1,7 @@ +2017-06-23 Csaba Nemethi + + * scripts/tablelistWidget.tcl: Corrected a typo. + 2017-06-23 Csaba Nemethi * *.tcl: Bumped the version number to 5.18. From f33cc2d8350c50d0705e8af219de53288a3e8466 Mon Sep 17 00:00:00 2001 From: csaba Date: Fri, 23 Jun 2017 20:20:44 +0000 Subject: [PATCH 011/150] * scripts/tablelistWidget.tcl: Corrected a typo. --- modules/tablelist/scripts/tablelistWidget.tcl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tablelist/scripts/tablelistWidget.tcl b/modules/tablelist/scripts/tablelistWidget.tcl index 53ca4e0a..02d357cf 100644 --- a/modules/tablelist/scripts/tablelistWidget.tcl +++ b/modules/tablelist/scripts/tablelistWidget.tcl @@ -4040,7 +4040,7 @@ proc tablelist::showtargetmarkSubCmd {win argList} { inside { set row [rowIndex $win $index 0 1] - set dlineinfo [$w dlineinfo [expr {$row + 1}]].0 + set dlineinfo [$w dlineinfo [expr {$row + 1}].0] if {[llength $dlineinfo] == 0} { return "" } From bc3d31d45ab41fa1e6e3abe4331bc7b62151ce0f Mon Sep 17 00:00:00 2001 From: csaba Date: Sat, 24 Jun 2017 15:26:35 +0000 Subject: [PATCH 012/150] * scripts/tablelistWidget.tcl: Minor cleanup. --- modules/tablelist/ChangeLog | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/tablelist/ChangeLog b/modules/tablelist/ChangeLog index 52d089ac..0e61c78a 100644 --- a/modules/tablelist/ChangeLog +++ b/modules/tablelist/ChangeLog @@ -1,3 +1,7 @@ +2017-06-23 Csaba Nemethi + + * scripts/tablelistWidget.tcl: Minor cleanup. + 2017-06-23 Csaba Nemethi * scripts/tablelistWidget.tcl: Corrected a typo. From c6b07ef38b3d83d1afabfaa15e6d30faa4168648 Mon Sep 17 00:00:00 2001 From: csaba Date: Sat, 24 Jun 2017 15:27:22 +0000 Subject: [PATCH 013/150] * scripts/tablelistWidget.tcl: Minor cleanup. --- modules/tablelist/scripts/tablelistWidget.tcl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/tablelist/scripts/tablelistWidget.tcl b/modules/tablelist/scripts/tablelistWidget.tcl index 02d357cf..9cc5c46c 100644 --- a/modules/tablelist/scripts/tablelistWidget.tcl +++ b/modules/tablelist/scripts/tablelistWidget.tcl @@ -3855,7 +3855,7 @@ proc tablelist::seeSubCmd {win argList} { displayItems $win set index [rowIndex $win [lindex $argList 0] 0] if {[winfo viewable $win] || - [llength [$win.body tag nextrange elidedWin 1.0 end]] == 0} { + [llength [$win.body tag nextrange elidedWin 1.0]] == 0} { return [seeRow $win $index] } else { after 0 [list tablelist::seeRow $win $index] @@ -3875,7 +3875,7 @@ proc tablelist::seecellSubCmd {win argList} { displayItems $win foreach {row col} [cellIndex $win [lindex $argList 0] 0] {} if {[winfo viewable $win] && - [llength [$win.body tag nextrange elidedWin 1.0 end]] == 0} { + [llength [$win.body tag nextrange elidedWin 1.0]] == 0} { return [seeCell $win $row $col] } else { after 0 [list tablelist::seeCell $win $row $col] @@ -3895,7 +3895,7 @@ proc tablelist::seecolumnSubCmd {win argList} { displayItems $win set col [colIndex $win [lindex $argList 0] 0] if {[winfo viewable $win] && - [llength [$win.body tag nextrange elidedWin 1.0 end]] == 0} { + [llength [$win.body tag nextrange elidedWin 1.0]] == 0} { return [seeCell $win [rowIndex $win @0,0 0] $col] } else { after 0 [list tablelist::seeCell $win [rowIndex $win @0,0 0] $col] @@ -6687,7 +6687,7 @@ proc tablelist::seeTextIdx {win textIdx} { set w $data(body) $w see $textIdx - if {[llength [$w tag nextrange elidedWin 1.0 end]] == 0} { + if {[llength [$w tag nextrange elidedWin 1.0]] == 0} { return 1 } From 87c86883e3a7c8fe006829e13ccf82fd6403bc41 Mon Sep 17 00:00:00 2001 From: csaba Date: Sat, 24 Jun 2017 19:22:58 +0000 Subject: [PATCH 014/150] * scripts/tablelistWdget.tcl: Fixed a bug related to excluding the "dicttoitem" and "itemtodict" subcommands for Tk 8.4 and earlier. * CHANGES.txt: Updated to reflect the changes. --- modules/tablelist/ChangeLog | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/tablelist/ChangeLog b/modules/tablelist/ChangeLog index 0e61c78a..a683aab7 100644 --- a/modules/tablelist/ChangeLog +++ b/modules/tablelist/ChangeLog @@ -1,3 +1,10 @@ +2017-06-24 Csaba Nemethi + + * scripts/tablelistWdget.tcl: Fixed a bug related to excluding the + "dicttoitem" and "itemtodict" subcommands for Tk 8.4 and earlier. + + * CHANGES.txt: Updated to reflect the changes. + 2017-06-23 Csaba Nemethi * scripts/tablelistWidget.tcl: Minor cleanup. From 32e639aeec02f8618cee934931e2d43a3268c01f Mon Sep 17 00:00:00 2001 From: csaba Date: Sat, 24 Jun 2017 19:23:23 +0000 Subject: [PATCH 015/150] * scripts/tablelistWdget.tcl: Fixed a bug related to excluding the "dicttoitem" and "itemtodict" subcommands for Tk 8.4 and earlier. --- modules/tablelist/scripts/tablelistWidget.tcl | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/tablelist/scripts/tablelistWidget.tcl b/modules/tablelist/scripts/tablelistWidget.tcl index 9cc5c46c..a94c6887 100644 --- a/modules/tablelist/scripts/tablelistWidget.tcl +++ b/modules/tablelist/scripts/tablelistWidget.tcl @@ -393,8 +393,8 @@ namespace eval tablelist { proc restrictCmdOpts {} { variable canElide + variable cmdOpts if {!$canElide} { - variable cmdOpts foreach opt [list collapse collapseall expand expandall \ insertchild insertchildlist insertchildren \ togglerowhide] { @@ -404,8 +404,10 @@ namespace eval tablelist { } if {$::tk_version < 8.5} { - set idx [lsearch -exact $cmdOpts "dicttoitem"] - set cmdOpts [lreplace $cmdOpts $idx $idx] + foreach opt [list dicttoitem itemtodict] { + set idx [lsearch -exact $cmdOpts $opt] + set cmdOpts [lreplace $cmdOpts $idx $idx] + } } } restrictCmdOpts From 06b54311ec846e4c6625c6e6013e38e891d2af3c Mon Sep 17 00:00:00 2001 From: csaba Date: Sat, 24 Jun 2017 19:24:05 +0000 Subject: [PATCH 016/150] * CHANGES.txt: Updated to reflect the changes. --- modules/tablelist/CHANGES.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/tablelist/CHANGES.txt b/modules/tablelist/CHANGES.txt index 308c9aae..20817915 100644 --- a/modules/tablelist/CHANGES.txt +++ b/modules/tablelist/CHANGES.txt @@ -26,7 +26,11 @@ What is new in Tablelist 5.18? 6. Fixed a bug related to retrieving the current cell selection (thanks to Alexandru Dadalau for his bug report). -7. Numerous further improvements in the code, demo scripts, and +7. Fixed a bug related to excluding the "dicttoitem" and "itemtodict" + subcommands for Tk 8.4 and earlier (thanks to Andy Goth for his bug + report). + +8. Numerous further improvements in the code, demo scripts, and documentation. What was new in Tablelist 5.17? From 468a8515388d8023697f8cfca3b6f2c2f5414425 Mon Sep 17 00:00:00 2001 From: tdc7675 Date: Tue, 8 Aug 2017 21:13:13 +0000 Subject: [PATCH 017/150] Correct UTF-8 encoding --- modules/ctext/README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ctext/README b/modules/ctext/README index 3cbd1d41..11444791 100644 --- a/modules/ctext/README +++ b/modules/ctext/README @@ -151,5 +151,5 @@ o Thanks Kevin Kenny, Neil Madden, Jeffrey Hobbs, Richard Suchenwirth, - Johan Bengtsson, Mac Cody, Günther, Andreas Sievers, and + Johan Bengtsson, Mac Cody, Gűnther, Andreas Sievers, and Michael Schlenker From e08b3d48dbc1b84f7ca739f3c7ef761fca4947b6 Mon Sep 17 00:00:00 2001 From: tdc7675 Date: Tue, 8 Aug 2017 21:17:11 +0000 Subject: [PATCH 018/150] Remove one unnecessary execute bit. Note: this check-in failed to actually do anything, apparently due to a Fossil bug concerning delta manifests. Fossil should have emitted an F card for modules/ctext/REGRESSION with the same checksum as in the baseline, but taking away the "x" permission. Probably the reason it didn't is because the checksum didn't change. From cc368f4a251c385bced2896487ec4e8dcbae4718 Mon Sep 17 00:00:00 2001 From: markus Date: Sun, 17 Sep 2017 08:37:40 +0000 Subject: [PATCH 019/150] Add documentation for the "createNormalPlot" command and its subcommands. As the implementation was already there, the version number needed no change. --- modules/plotchart/ChangeLog | 4 +++ modules/plotchart/plotchart.man | 61 +++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/modules/plotchart/ChangeLog b/modules/plotchart/ChangeLog index 5a98d654..10d87211 100644 --- a/modules/plotchart/ChangeLog +++ b/modules/plotchart/ChangeLog @@ -1,3 +1,7 @@ +2017-09-16 Arjen Markus + * plotchart.man: Added description of the normal plot and associated commands. The implementation was + already available, so no change in version number. + 2017-03-30 Arjen Markus * plotannot.tcl: Correct handling of the -textcolour option for plaintext (reported by Nick Matthews) diff --git a/modules/plotchart/plotchart.man b/modules/plotchart/plotchart.man index 99646669..64eec26e 100755 --- a/modules/plotchart/plotchart.man +++ b/modules/plotchart/plotchart.man @@ -294,6 +294,7 @@ Zero or more options - see the XY-plot for more information. [list_end] [para] + [call [cmd ::Plotchart::createPolarPlot] [arg w] [arg radius_data] [arg args]] Create a new polar plot (configuration type: polarplot). @@ -788,6 +789,36 @@ to influence the number of labels along the three sides. [para] +[call [cmd ::Plotchart::createNormalPlot] [arg w] [arg xscale] [arg args]] + +Create a command to draw a normal plot - useful to investigate whether a data set is normally +distributed or not. In that case the data will fall on or near the diagonal. As such, it is a +specialised plotting procedure. +[para] +The details of the plotting procedure have been adopted from the [term qqnorm] in the "R" [term stats] +package and described on Wikipedia. +[para] +As the implementation of this plot type relies on the [term math::statistics] package, it is only +available if that package can be loaded. + +[list_begin arguments] +[arg_def widget w in] +Name of the canvas widget to hold the normal plot. + +[arg_def list xscale in] +A 3-element list containing minimum, maximum and stepsize for the x-axis +in this order. The scaling of the y-axis is determined from that. [emph Important:] the scale +is to be given in terms of the normalised data, that is: 0 represents the mean of the data, +1 one standard deviation away from the mean etc. + +[arg_def list args in] +Zero or more option-value pairs to influence the position and the appearance of the +plot - see the XY-plot for more details. + +[list_end] +[para] + + [call [cmd ::Plotchart::createStatusTimeline] [arg w] [arg xaxis] [arg ylabel] [arg args]] Create a command to draw a so-called status timeline. Its layout is similar to a horizontal @@ -1344,6 +1375,36 @@ Y-coordinate of the new point. [list_end] [para] +For [emph {normal plots}]: + +[list_begin definitions] +[call [cmd \$normalplot] plot [arg series] [arg mean] [arg stdev] [arg data]] + +Plot the data set using the given mean and stanard deviation. +[para] +As you give the mean and standard deviation separately, the plot can be used for several data series +or for adding to an existing data series. + +[list_begin arguments] +[arg_def string series in] +Name of the data series - used to determine the appearance + +[arg_def float mean in] +Assumed mean of the data set. + +[arg_def float stdev in] +Assumed standard deviation of the data set. + +[arg_def list data in] +List of the data comprising the data set +[list_end] + +[call [cmd \$normalplot] diagonal] + +Draw a diagonal line, indicating the ideal normally distributed data set. +[list_end] +[para] + For [emph "xy, x-log y, log-x-y, log-x-log-y plots"] there is the additional command [emph plotlist], which is useful for plotting a large amount of data: From b6b4062f920aee82bb713e4378f4dbcab032923c Mon Sep 17 00:00:00 2001 From: csaba Date: Wed, 6 Dec 2017 16:06:56 +0000 Subject: [PATCH 020/150] * *.tcl: Bumped the version number to 6.0. * COPYRIGHT.txt: * README.txt: * CHANGES.txt: Updated to reflect the changes. * scripts/*.tcl: Added support for header items (aka title rows), added the "embed(ttk)checkbutton" and "embed(ttk)checkbuttons" subcommands; compatibility with the revised implementation of the text widget; support for Tcl-only "dict" implementations; deleting all items has become by orders of magnitude faster; guarded against invocations of the "update" command when displaying the tooltip; "xview" and "yview" now work as expected even if the decimal point is different from "."; numerous further improvements. * scripts/tclIndex: Newly generated. * doc/*.html: Updated to reflect the changes. * doc/dirViewer.png: Updated screenshots * doc/embeddedWindows.png: * doc/embeddedWindows_tile.png: * ../../examples/*.tcl: Bumped the version number to 6.0; updates and minor improvements. --- modules/tablelist/ChangeLog | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/modules/tablelist/ChangeLog b/modules/tablelist/ChangeLog index a683aab7..103f7b5b 100644 --- a/modules/tablelist/ChangeLog +++ b/modules/tablelist/ChangeLog @@ -1,3 +1,31 @@ +2017-12-R06 Csaba Nemethi + + * *.tcl: Bumped the version number to 6.0. + * COPYRIGHT.txt: + * README.txt: + + * CHANGES.txt: Updated to reflect the changes. + + * scripts/*.tcl: Added support for header items (aka title rows), added + the "embed(ttk)checkbutton" and "embed(ttk)checkbuttons" subcommands; + compatibility with the revised implementation of the text widget; + support for Tcl-only "dict" implementations; deleting all items has + become by orders of magnitude faster; guarded against invocations of + the "update" command when displaying the tooltip; "xview" and "yview" + now work as expected even if the decimal point is different from "."; + numerous further improvements. + + * scripts/tclIndex: Newly generated. + + * doc/*.html: Updated to reflect the changes. + + * doc/dirViewer.png: Updated screenshots + * doc/embeddedWindows.png: + * doc/embeddedWindows_tile.png: + + * ../../examples/*.tcl: Bumped the version number to 6.0; updates and + minor improvements. + 2017-06-24 Csaba Nemethi * scripts/tablelistWdget.tcl: Fixed a bug related to excluding the From 74b2d6956705106396c56bba4432c3a931cd047d Mon Sep 17 00:00:00 2001 From: csaba Date: Wed, 6 Dec 2017 16:10:23 +0000 Subject: [PATCH 021/150] * *.tcl: Bumped the version number to 6.0. * COPYRIGHT.txt: * README.txt: --- modules/tablelist/COPYRIGHT.txt | 2 +- modules/tablelist/README.txt | 20 ++++++++++---------- modules/tablelist/pkgIndex.tcl | 14 +++++++------- modules/tablelist/tablelist.tcl | 2 +- modules/tablelist/tablelistPublic.tcl | 5 +++-- modules/tablelist/tablelist_tile.tcl | 2 +- 6 files changed, 23 insertions(+), 22 deletions(-) diff --git a/modules/tablelist/COPYRIGHT.txt b/modules/tablelist/COPYRIGHT.txt index c2871af4..80d6eb72 100644 --- a/modules/tablelist/COPYRIGHT.txt +++ b/modules/tablelist/COPYRIGHT.txt @@ -1,4 +1,4 @@ -Multi-column listbox and tree widget package Tablelist, version 5.18 +Multi-column listbox and tree widget package Tablelist, version 6.0 Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) This library is free software; you can use, modify, and redistribute it diff --git a/modules/tablelist/README.txt b/modules/tablelist/README.txt index 2b6eea90..b6918185 100644 --- a/modules/tablelist/README.txt +++ b/modules/tablelist/README.txt @@ -43,11 +43,11 @@ pixels). The columns are, per default, resizable. The alignment of each column can be specified as "left", "right", or "center". The columns, rows, and cells can be configured individually. Several -of the global and column-specific options refer to the headers, +of the global and column-specific options refer to the header titles, implemented as label widgets. For instance, the "-labelcommand" option specifies a Tcl command to be invoked when mouse button 1 is released -over a label. The most common value of this option sorts the items -based on the respective column. +over a header label. The most common value of this option sorts the +items based on the respective column. The Tablelist package provides a great variety of tree styles controlling the look & feel of the column that displays the tree @@ -88,8 +88,8 @@ How to Get It? -------------- Tablelist is available for free download from the same URL as Wcb. The -distribution file is "tablelist5.18.tar.gz" for UNIX and -"tablelist5_18.zip" for Windows. These files contain the same +distribution file is "tablelist6.0.tar.gz" for UNIX and +"tablelist6_0.zip" for Windows. These files contain the same information, except for the additional carriage return character preceding the linefeed at the end of each line in the text files for Windows. @@ -108,16 +108,16 @@ locations of these library directories are given by the "tcl_library" and "tk_library" variables, respectively. To install Tablelist on UNIX, "cd" to the desired directory and unpack -the distribution file "tablelist5.18.tar.gz": +the distribution file "tablelist6.0ar.gz": - gunzip -c tablelist5.18.tar.gz | tar -xf - + gunzip -c tablelist6.0ar.gz | tar -xf - -This command will create a directory named "tablelist5.18", with the +This command will create a directory named "tablelist6.0 with the subdirectories "demos", "doc", and "scripts". On Windows, use WinZip or some other program capable of unpacking the -distribution file "tablelist5_18.zip" into the directory -"tablelist5.18", with the subdirectories "demos", "doc", and "scripts". +distribution file "tablelist6_0.zip" into the directory "tablelist6.0", +with the subdirectories "demos", "doc", and "scripts". The file "tablelistEdit.tcl" in the "scripts" directory is only needed for applications making use of interactive cell editing. Similarly, the diff --git a/modules/tablelist/pkgIndex.tcl b/modules/tablelist/pkgIndex.tcl index b8688e33..e64dffef 100644 --- a/modules/tablelist/pkgIndex.tcl +++ b/modules/tablelist/pkgIndex.tcl @@ -7,22 +7,22 @@ # # Regular packages: # -package ifneeded tablelist 5.18 \ +package ifneeded tablelist 6.0 \ [list source [file join $dir tablelist.tcl]] -package ifneeded tablelist_tile 5.18 \ +package ifneeded tablelist_tile 6.0 \ [list source [file join $dir tablelist_tile.tcl]] # # Aliases: # -package ifneeded Tablelist 5.18 \ - [list package require -exact tablelist 5.18] -package ifneeded Tablelist_tile 5.18 \ - [list package require -exact tablelist_tile 5.18] +package ifneeded Tablelist 6.0 \ + [list package require -exact tablelist 6.0] +package ifneeded Tablelist_tile 6.0 \ + [list package require -exact tablelist_tile 6.0] # # Code common to all packages: # -package ifneeded tablelist::common 5.18 \ +package ifneeded tablelist::common 6.0 \ "namespace eval ::tablelist { proc DIR {} {return [list $dir]} } ;\ source [list [file join $dir tablelistPublic.tcl]]" diff --git a/modules/tablelist/tablelist.tcl b/modules/tablelist/tablelist.tcl index 52d9c98f..d3c0b306 100644 --- a/modules/tablelist/tablelist.tcl +++ b/modules/tablelist/tablelist.tcl @@ -6,7 +6,7 @@ package require Tcl 8 package require Tk 8 -package require -exact tablelist::common 5.18 +package require -exact tablelist::common 6.0 package provide tablelist $::tablelist::version package provide Tablelist $::tablelist::version diff --git a/modules/tablelist/tablelistPublic.tcl b/modules/tablelist/tablelistPublic.tcl index 8afe0820..2644d381 100644 --- a/modules/tablelist/tablelistPublic.tcl +++ b/modules/tablelist/tablelistPublic.tcl @@ -24,7 +24,7 @@ namespace eval ::tablelist { # # Public variables: # - variable version 5.18 + variable version 6.0 variable library if {$tcl_version >= 8.4} { set library [file normalize [DIR]] @@ -46,7 +46,8 @@ namespace eval ::tablelist { # # Helper procedures used in binding scripts: # - namespace export convEventFields getTablelistPath getTablelistColumn + namespace export convEventFields getTablelistPath getTablelistColumn \ + delaySashPosUpdates # # Register various widgets for interactive cell editing: diff --git a/modules/tablelist/tablelist_tile.tcl b/modules/tablelist/tablelist_tile.tcl index abee273c..91231ae5 100644 --- a/modules/tablelist/tablelist_tile.tcl +++ b/modules/tablelist/tablelist_tile.tcl @@ -9,7 +9,7 @@ package require Tk 8.4 if {$::tk_version < 8.5 || [regexp {^8\.5a[1-5]$} $::tk_patchLevel]} { package require tile 0.6 } -package require -exact tablelist::common 5.18 +package require -exact tablelist::common 6.0 package provide tablelist_tile $::tablelist::version package provide Tablelist_tile $::tablelist::version From 3bbbe5ce20a0442286cb9d2ac0f0e0d85f340e6c Mon Sep 17 00:00:00 2001 From: csaba Date: Wed, 6 Dec 2017 16:11:48 +0000 Subject: [PATCH 022/150] * CHANGES.txt: Updated to reflect the changes. --- modules/tablelist/CHANGES.txt | 46 +++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/modules/tablelist/CHANGES.txt b/modules/tablelist/CHANGES.txt index 20817915..c957cead 100644 --- a/modules/tablelist/CHANGES.txt +++ b/modules/tablelist/CHANGES.txt @@ -1,5 +1,47 @@ -What is new in Tablelist 5.18? ------------------------------- +What is new in Tablelist 6.0? +----------------------------- + +1. Added support for header items (aka title rows) with the aid of the + new "header", "headerpath", and "headertag" subcommands. The first + one supports a great number of subcommands itself, like + "insert(list)", "delete", "size", "rowconfigure", "cellconfigure", + "get(formatted)", "get(formatted)cells", etc. (thanks to Hemang + Lavana, Kenneth Green, and Ralf Fassel for their proposals). The + demo scripts "embeddedWindows.tcl" and "embeddedWindows_tile.tcl" now + contain invocations of "header insert" and "header rowconfigure". + +2. Added the "embed(ttk)checkbutton" and "embed(ttk)checkbuttons" + subcommands, which provide interactive cell editing with the aid of + persistently embedded checkbuttons (thanks to Mark Garvey and Holger + Jakobs for their proposal). The Tablelist Programmer's Guide now + contains an example of usage of the "embedcheckbuttons" subcommand. + +3. Compatibility with the revised implementation of the text widget, + which will be contained in Tk 8.7 (thanks to Brad Lanam, Gregor + Cramer, and Francois Vogel for their valuable assistance). + +4. The "dicttoitem" and "itemtodict" subcommands are now supported in + the presence of alternative, Tcl-only "dict" implementations, too + (thanks to Andy Goth for his proposal). + +5. Deleting all items has become by orders of magnitude faster (thanks + to Martin Lemburg for requesting this performance improvement). + +6. Guarded against invocations of the "update" command from within the + command specified as the value of the "-tooltipaddcommand" option + (thanks to Alexandru Dadalau for his bug report and discussions on + this subject). + +7. Made sure that the "xview" and "yview" subcommands work as expected + even if the script was started from wthin a C application in which + the decimal point is different from "." (thanks to Paul Obermeier for + his bug report). + +8. Numerous further improvements in the code, demo scripts, and + documentation. + +What was new in Tablelist 5.18? +------------------------------- 1. Improved the performance of the vertical scrolling (thanks to Alexandru Dadalau and Olivier Jolet for discussions on this subject). From 93224788bf582d128542c429c992cffd6b5f61bf Mon Sep 17 00:00:00 2001 From: csaba Date: Wed, 6 Dec 2017 16:12:53 +0000 Subject: [PATCH 023/150] * scripts/*.tcl: Added support for header items (aka title rows), added the "embed(ttk)checkbutton" and "embed(ttk)checkbuttons" subcommands; compatibility with the revised implementation of the text widget; support for Tcl-only "dict" implementations; deleting all items has become by orders of magnitude faster; guarded against invocations of the "update" command when displaying the tooltip; "xview" and "yview" now work as expected even if the decimal point is different from "."; numerous further improvements. --- modules/tablelist/scripts/mwutil.tcl | 5 +- modules/tablelist/scripts/tablelistBind.tcl | 340 ++- modules/tablelist/scripts/tablelistConfig.tcl | 422 +-- modules/tablelist/scripts/tablelistEdit.tcl | 261 +- modules/tablelist/scripts/tablelistImages.tcl | 20 +- modules/tablelist/scripts/tablelistMove.tcl | 31 +- modules/tablelist/scripts/tablelistSort.tcl | 23 +- modules/tablelist/scripts/tablelistThemes.tcl | 71 +- modules/tablelist/scripts/tablelistUtil.tcl | 1489 +++++++++-- modules/tablelist/scripts/tablelistWidget.tcl | 2361 +++++++++++++++-- 10 files changed, 4021 insertions(+), 1002 deletions(-) diff --git a/modules/tablelist/scripts/mwutil.tcl b/modules/tablelist/scripts/mwutil.tcl index 109efb84..704f9345 100644 --- a/modules/tablelist/scripts/mwutil.tcl +++ b/modules/tablelist/scripts/mwutil.tcl @@ -20,7 +20,7 @@ namespace eval mwutil { # # Public variables: # - variable version 2.8 + variable version 2.9 variable library [file dirname [info script]] # @@ -491,7 +491,8 @@ proc mwutil::getScrollInfo argList { wrongNumArgs "moveto fraction" } - set fraction [format "%f" [lindex $argList 1]] + set fraction [lindex $argList 1] + format "%f" $fraction ;# floating-point number check with error message return [list moveto $fraction] } elseif {[string first $opt "scroll"] == 0} { if {$argCount != 3} { diff --git a/modules/tablelist/scripts/tablelistBind.tcl b/modules/tablelist/scripts/tablelistBind.tcl index 1e8157e9..8430e6bb 100644 --- a/modules/tablelist/scripts/tablelistBind.tcl +++ b/modules/tablelist/scripts/tablelistBind.tcl @@ -6,6 +6,7 @@ # - Binding tag Tablelist # - Binding tag TablelistWindow # - Binding tag TablelistBody +# - Binding tag TablelistHeader # - Binding tags TablelistLabel, TablelistSubLabel, and TablelistArrow # # Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) @@ -252,17 +253,17 @@ proc tablelist::removeActiveTag win { #------------------------------------------------------------------------------ proc tablelist::cleanup win { # - # Cancel the execution of all delayed handleMotion, updateKeyToRowMap, - # adjustSeps, makeStripes, showLineNumbers, stretchColumns, updateColors, - # updateScrlColOffset, updateHScrlbar, updateVScrlbar, updateView, - # synchronize, displayItems, horizMoveTo, vertMoveTo, autoScan, - # horizAutoScan, forceRedraw, doCellConfig, redisplay, redisplayCol, and + # Cancel the execution of all delayed (hdr_)handleMotion, updateKeyToRowMap, + # adjustSeps, makeStripes, showLineNumbers, stretchColumns, + # (hdr_)updateColors, updateScrlColOffset, updateHScrlbar, updateVScrlbar, + # updateView, synchronize, displayItems, horizMoveTo, vertMoveTo, autoScan, + # horizAutoScan, forceRedraw, reconfigWindows, redisplay, redisplayCol, and # destroyWidgets commands # upvar ::tablelist::ns${win}::data data - foreach id {motionId mapId sepsId stripesId lineNumsId stretchId colorsId - offsetId hScrlbarId vScrlbarId viewId syncId dispId moveToId - afterId redrawId reconfigId} { + foreach id {motionId hdr_motionId mapId sepsId stripesId lineNumsId + stretchId colorsId hdr_colorsId offsetId hScrlbarId vScrlbarId + viewId syncId dispId moveToId afterId redrawId reconfigId} { if {[info exists data($id)]} { after cancel $data($id) } @@ -284,17 +285,14 @@ proc tablelist::cleanup win { } # - # Destroy any existing bindings for data(bodyTag), - # data(labelTag), and data(editwinTag) + # Destroy any existing bindings for the tags data(bodyTag), + # data(headerTag), data(labelTag), and data(editwinTag) # - foreach event [bind $data(bodyTag)] { - bind $data(bodyTag) $event "" - } - foreach event [bind $data(labelTag)] { - bind $data(labelTag) $event "" - } - foreach event [bind $data(editwinTag)] { - bind $data(editwinTag) $event "" + foreach tag [list $data(bodyTag) $data(headerTag) \ + $data(labelTag) $data(editwinTag)] { + foreach event [bind $tag] { + bind $tag $event "" + } } # @@ -345,7 +343,7 @@ proc tablelist::updateConfigSpecs win { # # This might be an "after idle" callback; check whether the window exists # - if {![array exists ::tablelist::ns${win}::data]} { + if {[destroyed $win]} { return "" } @@ -369,36 +367,39 @@ proc tablelist::updateConfigSpecs win { } } - # - # Populate the array tmp with values corresponding to the old theme - # and the array themeDefaults with values corresponding to the new one - # - array set tmp $data(themeDefaults) - setThemeDefaults + variable usingTile + if {$usingTile} { + # + # Populate the array tmp with values corresponding to the old theme + # and the array themeDefaults with values corresponding to the new one + # + array set tmp $data(themeDefaults) + setThemeDefaults - # - # Set those configuration options whose values equal the old - # theme-specific defaults to the new theme-specific ones - # - variable themeDefaults - foreach opt {-background -foreground -disabledforeground -stripebackground - -selectbackground -selectforeground -selectborderwidth -font - -labelforeground -labelfont -labelborderwidth -labelpady - -treestyle} { - if {[string compare $data($opt) $tmp($opt)] == 0} { - doConfig $win $opt $themeDefaults($opt) + # + # Set those configuration options whose values equal the old + # theme-specific defaults to the new theme-specific ones + # + variable themeDefaults + foreach opt {-background -foreground -disabledforeground + -stripebackground -selectbackground -selectforeground + -selectborderwidth -font -labelforeground -labelfont + -labelborderwidth -labelpady -treestyle} { + if {[string compare $data($opt) $tmp($opt)] == 0} { + doConfig $win $opt $themeDefaults($opt) + } } - } - if {[string compare $data(-arrowcolor) $tmp(-arrowcolor)] == 0 && - [string compare $data(-arrowstyle) $tmp(-arrowstyle)] == 0} { - foreach opt {-arrowcolor -arrowdisabledcolor -arrowstyle} { - doConfig $win $opt $themeDefaults($opt) + if {[string compare $data(-arrowcolor) $tmp(-arrowcolor)] == 0 && + [string compare $data(-arrowstyle) $tmp(-arrowstyle)] == 0} { + foreach opt {-arrowcolor -arrowdisabledcolor -arrowstyle} { + doConfig $win $opt $themeDefaults($opt) + } } + foreach opt {-background -foreground} { + doConfig $win $opt $data($opt) ;# sets the bg color of the seps + } + updateCanvases $win } - foreach opt {-background -foreground} { - doConfig $win $opt $data($opt) ;# sets the bg color of the separators - } - updateCanvases $win # # Destroy and recreate the edit window if present @@ -413,6 +414,16 @@ proc tablelist::updateConfigSpecs win { # # Destroy and recreate the embedded windows # + for {set row 0} {$row < $data(hdr_itemCount)} {incr row} { + for {set col 0} {$col < $data(colCount)} {incr col} { + set key [lindex $data(hdr_keyList) $row] + if {[info exists data($key,$col-window)]} { + set val $data($key,$col-window) + doCellConfig h$row $col $win -window "" + doCellConfig h$row $col $win -window $val + } + } + } if {$data(winCount) != 0} { for {set row 0} {$row < $data(itemCount)} {incr row} { for {set col 0} {$col < $data(colCount)} {incr col} { @@ -427,7 +438,6 @@ proc tablelist::updateConfigSpecs win { } set data(currentTheme) $currentTheme - set data(themeDefaults) [array get themeDefaults] if {[string compare $currentTheme "tileqt"] == 0} { set data(widgetStyle) [tileqt_currentThemeName] if {[info exists ::env(KDE_SESSION_VERSION)] && @@ -440,6 +450,9 @@ proc tablelist::updateConfigSpecs win { set data(widgetStyle) "" set data(colorScheme) "" } + if {$usingTile} { + set data(themeDefaults) [array get themeDefaults] + } } # @@ -450,17 +463,24 @@ proc tablelist::updateConfigSpecs win { #------------------------------------------------------------------------------ # tablelist::cleanupWindow # -# This procedure is invoked when a window aux embedded into a tablelist widget -# is destroyed. It invokes the cleanup script associated with the cell -# containing the window, if any. +# This procedure is invoked when a window embedded into a tablelist widget is +# destroyed. It invokes the cleanup script associated with the cell containing +# the window, if any. #------------------------------------------------------------------------------ proc tablelist::cleanupWindow aux { - regexp {^(.+)\.body\.frm_(k[0-9]+),([0-9]+)$} $aux dummy win key col - upvar ::tablelist::ns${win}::data data + regexp {^(.+)\.(hdr\.t|body)\.frm_(h?k[0-9]+),([0-9]+)$} $aux \ + dummy win textWidget key col + upvar ::tablelist::ns${win}::data data \ + ::tablelist::ns${win}::checkStates checkStates + if {[info exists data($key,$col-windowdestroy)]} { set row [keyToRow $win $key] uplevel #0 $data($key,$col-windowdestroy) [list $win $row $col $aux.w] } + + if {[info exists checkStates($key,$col)]} { + unset checkStates($key,$col) + } } # @@ -500,6 +520,9 @@ proc tablelist::defineTablelistBody {} { if {[winfo exists %W]} { foreach {tablelist::W tablelist::x tablelist::y} \ [tablelist::convEventFields %W %x %y] {} + if {$tablelist::y < [winfo y [$tablelist::W bodypath]]} { + continue + } set tablelist::priv(x) $tablelist::x set tablelist::priv(y) $tablelist::y @@ -534,6 +557,9 @@ proc tablelist::defineTablelistBody {} { if {[winfo exists %W]} { foreach {tablelist::W tablelist::x tablelist::y} \ [tablelist::convEventFields %W %x %y] {} + if {$tablelist::y < [winfo y [$tablelist::W bodypath]]} { + continue + } if {[$tablelist::W cget -editselectedonly]} { tablelist::condEditContainingCell $tablelist::W \ @@ -570,6 +596,10 @@ proc tablelist::defineTablelistBody {} { if {[winfo exists %W]} { foreach {tablelist::W tablelist::x tablelist::y} \ [tablelist::convEventFields %W %x %y] {} + if {$tablelist::y < [winfo y [$tablelist::W bodypath]] && + [string length $tablelist::priv(afterId)] == 0} { ;# no autoscan + continue + } set tablelist::priv(x) "" set tablelist::priv(y) "" @@ -599,6 +629,9 @@ proc tablelist::defineTablelistBody {} { bind TablelistBody { foreach {tablelist::W tablelist::x tablelist::y} \ [tablelist::convEventFields %W %x %y] {} + if {$tablelist::y < [winfo y [$tablelist::W bodypath]]} { + continue + } tablelist::beginExtend $tablelist::W \ [$tablelist::W nearest $tablelist::y] \ @@ -607,6 +640,9 @@ proc tablelist::defineTablelistBody {} { bind TablelistBody { foreach {tablelist::W tablelist::x tablelist::y} \ [tablelist::convEventFields %W %x %y] {} + if {$tablelist::y < [winfo y [$tablelist::W bodypath]]} { + continue + } tablelist::beginToggle $tablelist::W \ [$tablelist::W nearest $tablelist::y] \ @@ -888,12 +924,16 @@ proc tablelist::invokeMotionHandler win { # tablelist::handleMotionDelayed # # This procedure is invoked when the mouse pointer enters or leaves the body of -# a tablelist widget or one of its separators, or is moving within it. It -# schedules the execution of the handleMotion procedure 100 ms later. +# a tablelist widget or is moving within it. It schedules the execution of the +# handleMotion procedure 100 ms later. #------------------------------------------------------------------------------ proc tablelist::handleMotionDelayed {w x y X Y mode event} { set win [getTablelistPath $w] upvar ::tablelist::ns${win}::data data + if {[regexp {^vsep([0-9]+)?$} [winfo name $w]]} { + return "" + } + set data(motionData) [list $w $x $y $X $Y $event] if {![info exists data(motionId)]} { set data(motionId) [after 100 [list tablelist::handleMotion $win]] @@ -933,6 +973,9 @@ proc tablelist::handleMotion win { set col [containingCol $win $_x] showOrHideTooltip $win $row $col $X $Y + if {[destroyed $win]} { + return "" + } updateExpCollCtrl $win $w $row $col $x # @@ -968,6 +1011,9 @@ proc tablelist::showOrHideTooltip {win row col X Y} { # event generate $win catch {uplevel #0 $data(-tooltipdelcommand) [list $win]} + if {[destroyed $win]} { + return "" + } set data(prevCell) $row,$col if {$row >= 0 && $col >= 0} { set focus [focus -displayof $win] @@ -975,6 +1021,9 @@ proc tablelist::showOrHideTooltip {win row col X Y} { [string compare [winfo toplevel $focus] \ [winfo toplevel $win]] == 0} { uplevel #0 $data(-tooltipaddcommand) [list $win $row $col] + if {[destroyed $win]} { + return "" + } event generate $win -rootx $X -rooty $Y } } @@ -1210,7 +1259,6 @@ proc tablelist::wasExpCollCtrlClicked {w x y} { ::$win collapse $row -partly } - updateViewWhenIdle $win return 1 } @@ -1417,7 +1465,7 @@ proc tablelist::condAutoScan win { # the window or the mouse button is released. #------------------------------------------------------------------------------ proc tablelist::autoScan win { - if {![array exists ::tablelist::ns${win}::data] || [isDragSrc $win] || + if {[destroyed $win] || [isDragSrc $win] || [string length [::$win editwinpath]] != 0} { return "" } @@ -1849,7 +1897,7 @@ proc tablelist::condEvalInvokeCmd win { # # This is an "after 100" callback; check whether the window exists # - if {![array exists ::tablelist::ns${win}::data]} { + if {[destroyed $win]} { return "" } @@ -2083,8 +2131,6 @@ proc tablelist::plusMinus {win keysym} { # Toggle the state of the expand/collapse control # ::$win $op $row -partly - - updateViewWhenIdle $win } } @@ -2231,8 +2277,6 @@ proc tablelist::leftRight {win amount} { # Toggle the state of the expand/collapse control # ::$win $op $row -partly - - updateViewWhenIdle $win } } @@ -2760,11 +2804,159 @@ proc tablelist::changeSelection {win row col} { event generate $win <> } +# +# Binding tag TablelistHeader +# =========================== +# + +#------------------------------------------------------------------------------ +# tablelist::defineTablelistHeader +# +# Defines the bindings for the binding tag TablelistHeader. +#------------------------------------------------------------------------------ +proc tablelist::defineTablelistHeader {} { + foreach event { } { + bind TablelistHeader $event { + tablelist::hdr_handleMotionDelayed %W %x %y %X %Y + } + } +} + +#------------------------------------------------------------------------------ +# tablelist::hdr_handleMotionDelayed +# +# This procedure is invoked when the mouse pointer enters or leaves the header +# text widget of a tablelist widget or is moving within it. It schedules the +# execution of the hdr_handleMotion procedure 100 ms later. +#------------------------------------------------------------------------------ +proc tablelist::hdr_handleMotionDelayed {w x y X Y} { + set win [getTablelistPath $w] + upvar ::tablelist::ns${win}::data data + if {[regexp {^vsep([0-9]+)?$} [winfo name $w]]} { + return "" + } + + set data(hdr_motionData) [list $w $x $y $X $Y] + if {![info exists data(hdr_motionId)]} { + set data(hdr_motionId) \ + [after 100 [list tablelist::hdr_handleMotion $win]] + } +} + +#------------------------------------------------------------------------------ +# tablelist::hdr_handleMotion +# +# Invokes the procedure hdr_showOrHideTooltip. +#------------------------------------------------------------------------------ +proc tablelist::hdr_handleMotion win { + upvar ::tablelist::ns${win}::data data + if {[info exists data(hdr_motionId)]} { + after cancel $data(hdr_motionId) + unset data(hdr_motionId) + } + + # + # Get the containing header cell from the + # coordinates relative to the tablelist + # + foreach {w x y X Y} $data(hdr_motionData) {} + foreach {win _x _y} [convEventFields $w $x $y] {} + set row [hdr_containingRow $win $_y] + set col [containingCol $win $_x] + + hdr_showOrHideTooltip $win $row $col $X $Y +} + +#------------------------------------------------------------------------------ +# tablelist::hdr_showOrHideTooltip +# +# If the pointer has crossed a header cell boundary then the procedure removes +# the old tooltip and displays the one corresponding to the new cell. +#------------------------------------------------------------------------------ +proc tablelist::hdr_showOrHideTooltip {win row col X Y} { + upvar ::tablelist::ns${win}::data data + if {[string length $data(-tooltipaddcommand)] == 0 || + [string length $data(-tooltipdelcommand)] == 0 || + [string compare $row,$col $data(hdr_prevCell)] == 0} { + return "" + } + + # + # Remove the old tooltip, if any. Then, if we are within a + # cell, display the new tooltip corresponding to that cell. + # + event generate $win + catch {uplevel #0 $data(-tooltipdelcommand) [list $win]} + if {[destroyed $win]} { + return "" + } + set data(hdr_prevCell) $row,$col + if {$row >= 0 && $col >= 0} { + set focus [focus -displayof $win] + if {[string length $focus] == 0 || [string first $win $focus] != 0 || + [string compare [winfo toplevel $focus] \ + [winfo toplevel $win]] == 0} { + uplevel #0 $data(-tooltipaddcommand) [list $win h$row $col] + if {[destroyed $win]} { + return "" + } + event generate $win -rootx $X -rooty $Y + } + } +} + # # Binding tags TablelistLabel, TablelistSubLabel, and TablelistArrow # ================================================================== # +#------------------------------------------------------------------------------ +# tablelist::defineTablelistLabel +# +# Defines the bindings for the binding tag TablelistLabel. +#------------------------------------------------------------------------------ +proc tablelist::defineTablelistLabel {} { + bind TablelistLabel { + tablelist::labelEnter %W %X %Y %x + } + bind TablelistLabel { + tablelist::labelEnter %W %X %Y %x + } + bind TablelistLabel { + tablelist::labelLeave %W %X %x %y + } + bind TablelistLabel { + tablelist::labelB1Down %W %x 0 + } + bind TablelistLabel { + tablelist::labelB1Down %W %x 1 + } + bind TablelistLabel { + tablelist::labelB1Motion %W %X %x %y + } + bind TablelistLabel { + tablelist::labelB1Enter %W + } + bind TablelistLabel { + tablelist::labelB1Leave %W %x %y + } + bind TablelistLabel { + tablelist::labelB1Up %W %X + } + bind TablelistLabel <> { + tablelist::labelB3Down %W 0 + } + bind TablelistLabel <> { + tablelist::labelB3Down %W 1 + } + bind TablelistLabel { + tablelist::labelDblB1 %W %x 0 + } + bind TablelistLabel { + tablelist::labelDblB1 %W %x 1 + } +} + #------------------------------------------------------------------------------ # tablelist::defineTablelistSubLabel # @@ -2841,6 +3033,11 @@ proc tablelist::labelEnter {w X Y x} { # # Display the tooltip corresponding to this label # + event generate $win + catch {uplevel #0 $data(-tooltipdelcommand) [list $win]} + if {[destroyed $win]} { + return "" + } set data(prevCol) $col set focus [focus -displayof $win] if {[string length $focus] == 0 || @@ -2848,7 +3045,9 @@ proc tablelist::labelEnter {w X Y x} { [string compare [winfo toplevel $focus] \ [winfo toplevel $win]] == 0} { uplevel #0 $data(-tooltipaddcommand) [list $win -1 $col] - event generate $win + if {[destroyed $win]} { + return "" + } event generate $win -rootx $X -rooty $Y } } @@ -2882,6 +3081,7 @@ proc tablelist::labelLeave {w X x y} { # can also occur in a widget placed into the label # upvar ::tablelist::ns${win}::data data + set data(hdr_prevCell) -1,-1 set hdrX [winfo rootx $data(hdr)] if {$X >= $hdrX && $X < $hdrX + [winfo width $data(hdr)] && $x >= 1 && $x < [winfo width $w] - 1 && @@ -2896,6 +3096,9 @@ proc tablelist::labelLeave {w X x y} { # event generate $win catch {uplevel #0 $data(-tooltipdelcommand) [list $win]} + if {[destroyed $win]} { + return "" + } set data(prevCol) -1 } @@ -3032,7 +3235,7 @@ proc tablelist::labelB1Motion {w X x y} { set b $data(body) set btmTextIdx [$b index @0,$data(btmY)] set btmRow [expr {int($btmTextIdx) - 1}] - if {$btmRow > $data(lastRow)} { ;# text widget bug + if {$btmRow > $data(lastRow)} { set btmRow $data(lastRow) } while {$btmRow > $data(btmRow)} { @@ -3044,7 +3247,7 @@ proc tablelist::labelB1Motion {w X x y} { set btmTextIdx [$b index @0,$data(btmY)] set btmRow [expr {int($btmTextIdx) - 1}] - if {$btmRow > $data(lastRow)} { ;# text widget bug + if {$btmRow > $data(lastRow)} { set btmRow $data(lastRow) } } @@ -3286,9 +3489,9 @@ proc tablelist::labelB1Up {w X} { set col $data(colBeingResized) if {$data(colResized)} { if {$data(-width) <= 0} { - $data(hdr) configure -width $data(hdrPixels) + $data(hdr) configure -width $data(hdrWidth) $data(lb) configure -width \ - [expr {$data(hdrPixels) / $data(charWidth)}] + [expr {$data(hdrWidth) / $data(charWidth)}] } elseif {[info exists data(stretchableCols)] && [lsearch -exact $data(stretchableCols) $col] >= 0} { set oldColWidth \ @@ -3367,6 +3570,9 @@ proc tablelist::labelB1Up {w X} { uplevel #0 $data(-labelcommand) [list $win $col] } } + if {[destroyed $win]} { + return "" + } } elseif {$data(-movablecolumns)} { $data(hdrTxtFrmCanv)$col configure -cursor $data(-cursor) if {[info exists data(targetCol)]} { @@ -3453,7 +3659,7 @@ proc tablelist::escape {win col} { if {[info exists data(colBeingResized)]} { ;# resize operation in progress configLabel $w -cursor $data(-cursor) update idletasks - if {![array exists ::tablelist::ns${win}::data]} { + if {[destroyed $win]} { return "" } if {[winfo exists $data(focus)]} { @@ -3501,7 +3707,7 @@ proc tablelist::escape {win col} { # button is released. #------------------------------------------------------------------------------ proc tablelist::horizAutoScan win { - if {![array exists ::tablelist::ns${win}::data]} { + if {[destroyed $win]} { return "" } diff --git a/modules/tablelist/scripts/tablelistConfig.tcl b/modules/tablelist/scripts/tablelistConfig.tcl index 5cfe2740..aad37ec3 100644 --- a/modules/tablelist/scripts/tablelistConfig.tcl +++ b/modules/tablelist/scripts/tablelistConfig.tcl @@ -440,9 +440,10 @@ proc tablelist::doConfig {win opt val} { b { # - # Apply the value to the body text widget and save - # the properly formatted value of val in data($opt) + # 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] @@ -460,14 +461,16 @@ proc tablelist::doConfig {win opt val} { } else { $win configure $opt $val foreach c [winfo children $win] { - if {[regexp {^(vsep[0-9]+|hsep)$} \ + if {[regexp {^(vsep[0-9]+|hsep2)$} \ [winfo name $c]]} { $c 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 { @@ -496,20 +499,25 @@ proc tablelist::doConfig {win opt val} { } -foreground { # - # Set the background color of the main separator + # 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 Sep$win.TSeparator -background $val + 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 } } @@ -539,12 +547,11 @@ proc tablelist::doConfig {win opt val} { -labelbackground - -labelforeground { # - # Apply the value to $data(hdrTxt) and conditionally - # to the canvases displaying up- or down-arrows + # Conditionally apply the value to the + # canvases displaying up- or down-arrows # $helpLabel configure -$optTail $val set data($opt) [$helpLabel cget -$optTail] - $data(hdrTxt) configure -$optTail $data($opt) foreach col $data(arrowColList) { if {![info exists data($col$opt)]} { configCanvas $win $col @@ -557,6 +564,7 @@ proc tablelist::doConfig {win opt val} { # the height of the header frame) # adjustColumns $win allLabels 1 + updateViewWhenIdle $win set borderWidth [winfo pixels $win $data($opt)] if {$borderWidth < 0} { @@ -576,14 +584,6 @@ proc tablelist::doConfig {win opt val} { } } } - -labelfont { - # - # Apply the value to $data(hdrTxt) and adjust the - # columns (including the height of the header frame) - # - $data(hdrTxt) configure -$optTail $data($opt) - adjustColumns $win allLabels 1 - } -labelheight - -labelpady { # @@ -693,6 +693,7 @@ proc tablelist::doConfig {win opt val} { lappend whichWidths l$col } adjustColumns $win $whichWidths 1 + updateViewWhenIdle $win } } -autofinishediting - @@ -742,6 +743,7 @@ proc tablelist::doConfig {win opt val} { lappend whichWidths l$col } adjustColumns $win $whichWidths 1 + updateViewWhenIdle $win } else { # # Update the titles of the current columns, @@ -782,20 +784,25 @@ proc tablelist::doConfig {win opt val} { } -disabledforeground { # - # Configure the "disabled" tag in the body text widget and + # 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} { - $w tag configure disabled -fgstipple gray50 \ + foreach w [list $data(hdrTxt) $data(body)] { + $w tag configure disabled -fgstipple gray50 \ -foreground $data(-foreground) + } set data($opt) "" } else { - $w tag configure disabled -fgstipple "" \ + 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 } } @@ -934,8 +941,10 @@ proc tablelist::doConfig {win opt val} { if {$spacing < 0} { set spacing 0 } - $w configure -spacing1 [expr {$spacing + $pixVal}] \ - -spacing3 [expr {$spacing + $pixVal + !$data(-tight)}] + 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 @@ -957,6 +966,7 @@ proc tablelist::doConfig {win opt val} { set data($opt) [expr {$val ? 1 : 0}] makeSortAndArrowColLists $win adjustColumns $win allLabels 1 + updateViewWhenIdle $win } -showeditcursor { # @@ -985,7 +995,7 @@ proc tablelist::doConfig {win opt val} { createSeps $win } elseif {$oldVal && !$data($opt)} { foreach w [winfo children $win] { - if {[regexp {^(vsep[0-9]+|hsep)$} \ + if {[regexp {^(vsep[0-9]+|hsep2)$} \ [winfo name $w]]} { destroy $w } @@ -1015,8 +1025,10 @@ proc tablelist::doConfig {win opt val} { if {$selectBd < 0} { set selectBd 0 } - $w configure -spacing1 [expr {$pixVal + $selectBd}] \ - -spacing3 [expr {$pixVal + $selectBd + !$data(-tight)}] + 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 @@ -1026,7 +1038,7 @@ proc tablelist::doConfig {win opt val} { # 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 body text widget, configure the borderwidth + # 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 @@ -1046,12 +1058,14 @@ proc tablelist::doConfig {win 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 @@ -1063,6 +1077,7 @@ proc tablelist::doConfig {win opt val} { configCanvas $win $col raiseArrow $win $col } + hdr_updateColorsWhenIdle $win updateColorsWhenIdle $win } -stretch { @@ -1117,15 +1132,17 @@ proc tablelist::doConfig {win opt val} { # set data($opt) [expr {$val ? 1 : 0}] set w $data(body) - set spacing1 [$w cget -spacing1] - $w configure -spacing3 [expr {$spacing1 + !$data($opt)}] + 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 main separator if needed + # 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 @@ -1144,7 +1161,7 @@ proc tablelist::doConfig {win opt val} { $data(hdrTxt) configure -xscrollcommand "" if {$oldVal == 0} { if {$usingTile} { - ttk::separator $w -style Sep$win.TSeparator \ + ttk::separator $w -style Main$win.TSeparator \ -cursor $data(-cursor) \ -orient vertical -takefocus 0 } else { @@ -1249,9 +1266,9 @@ proc tablelist::doConfig {win opt val} { set val [format "%d" $val] ;# integer check with error msg $data(body) configure $opt $val if {$val <= 0} { - $data(hdr) configure $opt $data(hdrPixels) + $data(hdr) configure $opt $data(hdrWidth) $data(lb) configure $opt \ - [expr {$data(hdrPixels) / $data(charWidth)}] + [expr {$data(hdrWidth) / $data(charWidth)}] } else { $data(hdr) configure $opt 0 $data(lb) configure $opt $val @@ -1302,6 +1319,7 @@ proc tablelist::doCget {win opt} { #------------------------------------------------------------------------------ proc tablelist::doColConfig {col win opt val} { variable canElide + variable pu upvar ::tablelist::ns${win}::data data switch -- $opt { @@ -1318,7 +1336,6 @@ proc tablelist::doColConfig {col win opt val} { -background - -foreground { - set w $data(body) set name $col$opt if {[string length $val] == 0} { @@ -1327,11 +1344,13 @@ proc tablelist::doColConfig {col win opt val} { } } else { # - # Configure the tag col$opt-$val in the body text widget + # Configure the tag col$opt-$val in both text widgets # - set tag col$opt-$val - $w tag configure $tag $opt $val - $w tag lower $tag + 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) @@ -1340,6 +1359,7 @@ proc tablelist::doColConfig {col win opt val} { } if {!$data(isDisabled)} { + hdr_updateColorsWhenIdle $win updateColorsWhenIdle $win } } @@ -1400,7 +1420,6 @@ proc tablelist::doColConfig {col win opt val} { } -font { - set w $data(body) set name $col$opt if {[info exists data($name)] && @@ -1410,9 +1429,13 @@ proc tablelist::doColConfig {col win opt val} { # from the elements of the given column # set tag col$opt-$data($name) - for {set line 1} {$line <= $data(itemCount)} {incr line} { - findTabs $win $line $col $col tabIdx1 tabIdx2 - $w tag remove $tag $tabIdx1 $tabIdx2+1c + 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 + } } } @@ -1422,19 +1445,25 @@ proc tablelist::doColConfig {col win opt val} { } } else { # - # Configure the tag col$opt-$val in the body text widget + # Configure the tag col$opt-$val in both text widgets # set tag col$opt-$val - $w tag configure $tag $opt $val - $w tag lower $tag + 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 # - for {set line 1} {$line <= $data(itemCount)} {incr line} { - findTabs $win $line $col $col tabIdx1 tabIdx2 - $w tag add $tag $tabIdx1 $tabIdx2+1c + 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 + } } } @@ -1624,6 +1653,7 @@ proc tablelist::doColConfig {col win opt val} { # Adjust the columns (including the height of the header frame) # adjustColumns $win l$col 1 + updateViewWhenIdle $win } -labelcommand - @@ -1666,6 +1696,7 @@ proc tablelist::doColConfig {col win opt val} { # Adjust the columns (including the height of the header frame) # adjustColumns $win l$col 1 + updateViewWhenIdle $win } -labelheight - @@ -1767,6 +1798,7 @@ proc tablelist::doColConfig {col win opt val} { # Adjust the columns (including the height of the header frame) # adjustColumns $win l$col 1 + updateViewWhenIdle $win } -labelrelief { @@ -1856,6 +1888,7 @@ proc tablelist::doColConfig {col win opt val} { set data($col$opt) [expr {$val ? 1 : 0}] makeSortAndArrowColLists $win adjustColumns $win l$col 1 + updateViewWhenIdle $win } -showlinenumbers { @@ -1964,7 +1997,7 @@ proc tablelist::doColConfig {col win opt val} { } # - # Replace the column's contents in the internal list + # Replace the column's content in the internal list # set newItemList {} set row 0 @@ -1996,6 +2029,7 @@ proc tablelist::doColConfig {col win opt val} { set idx [expr {3*$col + 1}] set data(-columns) [lreplace $data(-columns) $idx $idx $val] adjustColumns $win l$col 1 + updateViewWhenIdle $win } -valign { @@ -2086,14 +2120,14 @@ proc tablelist::doRowConfig {row win opt val} { variable canElide variable elide variable snipSides + variable pu upvar ::tablelist::ns${win}::data data - - set w $data(body) + foreach {row p w inBody diff} [getConfigParams $win $row] {} switch -- $opt { -background - -foreground { - set key [lindex $data(keyList) $row] + set key [lindex $data(${p}keyList) $row] set name $key$opt if {[string length $val] == 0} { @@ -2102,11 +2136,11 @@ proc tablelist::doRowConfig {row win opt val} { } } else { # - # Configure the tag row$opt-$val in the body text widget + # 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 + $w tag lower $tag disabled # # Save val in data($name) @@ -2115,7 +2149,7 @@ proc tablelist::doRowConfig {row win opt val} { } if {!$data(isDisabled)} { - updateColorsWhenIdle $win + ${p}updateColorsWhenIdle $win } } @@ -2130,7 +2164,7 @@ proc tablelist::doRowConfig {row win opt val} { if {$val} { ;# eliding the row if {![info exists data($name)]} { set data($name) 1 - $w tag add elidedRow $line.0 $line.end+1c + $w tag add elidedRow $line.0 $line.end+1$pu if {![info exists data($key-hide)]} { incr data(nonViewableRowCount) @@ -2144,7 +2178,7 @@ proc tablelist::doRowConfig {row win opt val} { } else { ;# uneliding the row if {[info exists data($name)]} { unset data($name) - $w tag remove elidedRow $line.0 $line.end+1c + $w tag remove elidedRow $line.0 $line.end+1$pu if {![info exists data($key-hide)]} { incr data(nonViewableRowCount) -1 @@ -2227,7 +2261,7 @@ proc tablelist::doRowConfig {row win opt val} { # # Save the current cell fonts in a temporary array # - set item [lindex $data(itemList) $row] + 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] @@ -2238,30 +2272,32 @@ proc tablelist::doRowConfig {row win opt val} { # # Remove the tag row$opt-$data($name) from the given row # - set line [expr {$row + 1}] + set line [expr {$row + $diff}] $w tag remove row$opt-$data($name) $line.0 $line.end } if {[string length $val] == 0} { if {[info exists data($name)]} { unset data($name) - incr data(rowTagRefCount) -1 + if {$inBody} { + incr data(rowTagRefCount) -1 + } } } else { # - # Configure the tag row$opt-$val in the body + # 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 + 1}] + $w tag lower $tag disabled + set line [expr {$row + $diff}] $w tag add $tag $line.0 $line.end # # Save val in data($name) # - if {![info exists data($name)]} { + if {$inBody && ![info exists data($name)]} { incr data(rowTagRefCount) } set data($name) $val @@ -2276,7 +2312,7 @@ proc tablelist::doRowConfig {row win opt val} { } set colWidthsChanged 0 set colIdxList {} - set line [expr {$row + 1}] + set line [expr {$row + $diff}] set textIdx1 $line.1 set col 0 foreach text $displayedItem {pixels alignment} $data(colList) { @@ -2333,14 +2369,15 @@ proc tablelist::doRowConfig {row win opt val} { $workPixels $snipSide $data(-snipstring) } - if {$row == $data(editRow) && $col == $data(editCol)} { + if {$inBody && + $row == $data(editRow) && $col == $data(editCol)} { # # Configure the edit window # setEditWinFont $win } else { # - # Update the text widget's contents between the two tabs + # Update the text widget's content between the two tabs # set textIdx2 [$w search $elide "\t" $textIdx1 $line.end] if {$multiline} { @@ -2386,7 +2423,7 @@ proc tablelist::doRowConfig {row win opt val} { } } - set textIdx1 [$w search $elide "\t" $textIdx1 $line.end]+2c + set textIdx1 [$w search $elide "\t" $textIdx1 $line.end]+2$pu incr col } @@ -2412,7 +2449,7 @@ proc tablelist::doRowConfig {row win opt val} { if {$val} { ;# hiding the row if {![info exists data($name)]} { set data($name) 1 - $w tag add hiddenRow $line.0 $line.end+1c + $w tag add hiddenRow $line.0 $line.end+1$pu if {![info exists data($key-elide)]} { incr data(nonViewableRowCount) @@ -2443,7 +2480,7 @@ proc tablelist::doRowConfig {row win opt val} { } else { ;# unhiding the row if {[info exists data($name)]} { unset data($name) - $w tag remove hiddenRow $line.0 $line.end+1c + $w tag remove hiddenRow $line.0 $line.end+1$pu if {![info exists data($key-elide)]} { incr data(nonViewableRowCount) -1 @@ -2543,7 +2580,7 @@ proc tablelist::doRowConfig {row win opt val} { } -name { - set key [lindex $data(keyList) $row] + set key [lindex $data(${p}keyList) $row] if {[string length $val] == 0} { if {[info exists data($key$opt)]} { unset data($key$opt) @@ -2586,7 +2623,7 @@ proc tablelist::doRowConfig {row win opt val} { 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 + $w tag lower $tag disabled # # Save val in data($name) @@ -2606,7 +2643,7 @@ proc tablelist::doRowConfig {row win opt val} { set colWidthsChanged 0 set colIdxList {} - set oldItem [lindex $data(itemList) $row] + set oldItem [lindex $data(${p}itemList) $row] set key [lindex $oldItem end] set newItem [adjustItem $val $data(colCount)] if {$data(hasFmtCmds)} { @@ -2617,7 +2654,7 @@ proc tablelist::doRowConfig {row win opt val} { if {[string match "*\t*" $displayedItem]} { set displayedItem [mapTabs $displayedItem] } - set line [expr {$row + 1}] + set line [expr {$row + $diff}] set textIdx1 $line.1 set col 0 foreach text $displayedItem {pixels alignment} $data(colList) { @@ -2674,9 +2711,10 @@ proc tablelist::doRowConfig {row win opt val} { $workPixels $snipSide $data(-snipstring) } - if {$row != $data(editRow) || $col != $data(editCol)} { + if {!$inBody || + $row != $data(editRow) || $col != $data(editCol)} { # - # Update the text widget's contents between the two tabs + # Update the text widget's content between the two tabs # set textIdx2 [$w search $elide "\t" $textIdx1 $line.end] if {$multiline} { @@ -2730,14 +2768,14 @@ proc tablelist::doRowConfig {row win opt val} { } } - set textIdx1 [$w search $elide "\t" $textIdx1 $line.end]+2c + set textIdx1 [$w search $elide "\t" $textIdx1 $line.end]+2$pu incr col } # - # Replace the row contents in the list variable if present + # Replace the row's content in the list variable if present # - if {$data(hasListVar)} { + if {$inBody && $data(hasListVar)} { upvar #0 $data(-listvariable) var trace vdelete var wu $data(listVarTraceCmd) set var [lreplace $var $row $row $newItem] @@ -2745,10 +2783,11 @@ proc tablelist::doRowConfig {row win opt val} { } # - # Replace the row contents in the internal list + # Replace the row's content in the internal list # lappend newItem $key - set data(itemList) [lreplace $data(itemList) $row $row $newItem] + set data(${p}itemList) \ + [lreplace $data(${p}itemList) $row $row $newItem] # # Adjust the columns if necessary and schedule @@ -2757,7 +2796,9 @@ proc tablelist::doRowConfig {row win opt val} { if {$colWidthsChanged} { adjustColumns $win $colIdxList 1 } - showLineNumbersWhenIdle $win + if {$inBody} { + showLineNumbersWhenIdle $win + } updateViewWhenIdle $win } } @@ -2771,7 +2812,8 @@ proc tablelist::doRowConfig {row win opt val} { #------------------------------------------------------------------------------ proc tablelist::doRowCget {row win opt} { upvar ::tablelist::ns${win}::data data - set item [lindex $data(itemList) $row] + foreach {row p w inBody diff} [getConfigParams $win $row] {} + set item [lindex $data(${p}itemList) $row] switch -- $opt { -text { @@ -2817,14 +2859,14 @@ proc tablelist::doRowCget {row win opt} { proc tablelist::doCellConfig {row col win opt val} { variable canElide variable snipSides + variable pu upvar ::tablelist::ns${win}::data data - - set w $data(body) + foreach {row p w inBody diff} [getConfigParams $win $row] {} switch -- $opt { -background - -foreground { - set key [lindex $data(keyList) $row] + set key [lindex $data(${p}keyList) $row] set name $key,$col$opt if {[string length $val] == 0} { @@ -2833,7 +2875,7 @@ proc tablelist::doCellConfig {row col win opt val} { } } else { # - # Configure the tag cell$opt-$val in the body text widget + # Configure the tag cell$opt-$val in the text widget # set tag cell$opt-$val $w tag configure $tag $opt $val @@ -2846,7 +2888,7 @@ proc tablelist::doCellConfig {row col win opt val} { } if {!$data(isDisabled)} { - updateColorsWhenIdle $win + ${p}updateColorsWhenIdle $win } } @@ -2877,7 +2919,7 @@ proc tablelist::doCellConfig {row col win opt val} { # # Save the current cell font # - set item [lindex $data(itemList) $row] + set item [lindex $data(${p}itemList) $row] set key [lindex $item end] set name $key,$col$opt set oldCellFont [getCellFont $win $key $col] @@ -2887,18 +2929,20 @@ proc tablelist::doCellConfig {row col win opt val} { # # Remove the tag cell$opt-$data($name) from the given cell # - findTabs $win [expr {$row + 1}] $col $col tabIdx1 tabIdx2 - $w tag remove cell$opt-$data($name) $tabIdx1 $tabIdx2+1c + findTabs $win $w [expr {$row + $diff}] $col $col tabIdx1 tabIdx2 + $w tag remove cell$opt-$data($name) $tabIdx1 $tabIdx2+1$pu } if {[string length $val] == 0} { if {[info exists data($name)]} { unset data($name) - incr data(cellTagRefCount) -1 + if {$inBody} { + incr data(cellTagRefCount) -1 + } } } else { # - # Configure the tag cell$opt-$val in the body text widget + # Configure the tag cell$opt-$val in the text widget # set tag cell$opt-$val $w tag configure $tag $opt $val @@ -2908,14 +2952,15 @@ proc tablelist::doCellConfig {row col win opt val} { # # Apply the tag to the given cell # - findTabs $win [expr {$row + 1}] $col $col tabIdx1 tabIdx2 - $w tag add $tag $tabIdx1 $tabIdx2+1c + findTabs $win $w [expr {$row + $diff}] $col $col \ + tabIdx1 tabIdx2 + $w tag add $tag $tabIdx1 $tabIdx2+1$pu } # # Save val in data($name) # - if {![info exists data($name)]} { + if {$inBody && ![info exists data($name)]} { incr data(cellTagRefCount) } set data($name) $val @@ -2979,22 +3024,24 @@ proc tablelist::doCellConfig {row col win opt val} { } if {!$data($col-hide)} { - if {$row == $data(editRow) && $col == $data(editCol)} { + if {$inBody && + $row == $data(editRow) && $col == $data(editCol)} { # # Configure the edit window # setEditWinFont $win } else { # - # Update the text widget's contents between the two tabs + # Update the text widget's content between the two tabs # - findTabs $win [expr {$row + 1}] $col $col tabIdx1 tabIdx2 + findTabs $win $w [expr {$row + $diff}] $col $col \ + tabIdx1 tabIdx2 if {$multiline} { - updateMlCell $w $tabIdx1+1c $tabIdx2 $msgScript $aux \ + updateMlCell $w $tabIdx1+1$pu $tabIdx2 $msgScript $aux \ $auxType $auxWidth $indent $indentWidth \ $alignment [getVAlignment $win $key $col] } else { - updateCell $w $tabIdx1+1c $tabIdx2 $text $aux \ + updateCell $w $tabIdx1+1$pu $tabIdx2 $text $aux \ $auxType $auxWidth $indent $indentWidth \ $alignment [getVAlignment $win $key $col] } @@ -3043,7 +3090,7 @@ proc tablelist::doCellConfig {row col win opt val} { # # Save the old image or window width # - set item [lindex $data(itemList) $row] + set item [lindex $data(${p}itemList) $row] set key [lindex $item end] set name $key,$col$opt getAuxData $win $key $col oldAuxType oldAuxWidth @@ -3055,11 +3102,13 @@ proc tablelist::doCellConfig {row col win opt val} { if {[string length $val] == 0} { if {[info exists data($name)]} { unset data($name) - incr data(imgCount) -1 + if {$inBody} { + incr data(imgCount) -1 + } destroy $imgLabel } } else { - if {![info exists data($name)]} { + if {$inBody && ![info exists data($name)]} { incr data(imgCount) } if {[winfo exists $imgLabel] && @@ -3127,19 +3176,19 @@ proc tablelist::doCellConfig {row col win opt val} { $workPixels $snipSide $data(-snipstring) } - if {(!$data($col-hide) || $canElide) && - !($row == $data(editRow) && $col == $data(editCol))} { + if {(!$data($col-hide) || $canElide) && (!$inBody || + $row != $data(editRow) || $col != $data(editCol))} { # - # Delete the old cell contents between the two tabs, + # Delete the old cell content between the two tabs, # and insert the text and the auxiliary object # - findTabs $win [expr {$row + 1}] $col $col tabIdx1 tabIdx2 + findTabs $win $w [expr {$row + 1}] $col $col tabIdx1 tabIdx2 if {$multiline} { - updateMlCell $w $tabIdx1+1c $tabIdx2 $msgScript $aux \ + updateMlCell $w $tabIdx1+1$pu $tabIdx2 $msgScript $aux \ $auxType $auxWidth $indent $indentWidth \ $alignment [getVAlignment $win $key $col] } else { - updateCell $w $tabIdx1+1c $tabIdx2 $text $aux \ + updateCell $w $tabIdx1+1$pu $tabIdx2 $text $aux \ $auxType $auxWidth $indent $indentWidth \ $alignment [getVAlignment $win $key $col] } @@ -3272,18 +3321,18 @@ proc tablelist::doCellConfig {row col win opt val} { } if {(!$data($col-hide) || $canElide) && - !($row == $data(editRow) && $col == $data(editCol))} { + ($row != $data(editRow) || $col != $data(editCol))} { # - # Delete the old cell contents between the two tabs, + # Delete the old cell content between the two tabs, # and insert the text and the auxiliary object # - findTabs $win [expr {$row + 1}] $col $col tabIdx1 tabIdx2 + findTabs $win $w [expr {$row + 1}] $col $col tabIdx1 tabIdx2 if {$multiline} { - updateMlCell $w $tabIdx1+1c $tabIdx2 $msgScript $aux \ + updateMlCell $w $tabIdx1+1$pu $tabIdx2 $msgScript $aux \ $auxType $auxWidth $indent $indentWidth \ $alignment [getVAlignment $win $key $col] } else { - updateCell $w $tabIdx1+1c $tabIdx2 $text $aux \ + updateCell $w $tabIdx1+1$pu $tabIdx2 $text $aux \ $auxType $auxWidth $indent $indentWidth \ $alignment [getVAlignment $win $key $col] } @@ -3356,7 +3405,7 @@ proc tablelist::doCellConfig {row col win opt val} { # # Save the boolean value specified by val in data($key,$col$opt) # - set item [lindex $data(itemList) $row] + set item [lindex $data(${p}itemList) $row] set key [lindex $item end] set name $key,$col$opt if {$val} { @@ -3366,7 +3415,7 @@ proc tablelist::doCellConfig {row col win opt val} { } if {($data($col-hide) && !$canElide) || - ($row == $data(editRow) && $col == $data(editCol))} { + ($inBody && $row == $data(editRow) && $col == $data(editCol))} { return "" } @@ -3388,6 +3437,10 @@ proc tablelist::doCellConfig {row col win opt val} { } } set aux [getAuxData $win $key $col auxType auxWidth $pixels] + if {$auxType < 2} { ;# no window + return "" + } + set indent [getIndentData $win $key $col indentWidth] set maxTextWidth $pixels if {$pixels != 0} { @@ -3402,9 +3455,6 @@ proc tablelist::doCellConfig {row col win opt val} { } } } - if {$auxType < 2} { ;# no window - return "" - } # # Adjust the cell text and the window width @@ -3427,15 +3477,15 @@ proc tablelist::doCellConfig {row col win opt val} { } # - # Update the text widget's contents between the two tabs + # Update the text widget's content between the two tabs # - findTabs $win [expr {$row + 1}] $col $col tabIdx1 tabIdx2 + findTabs $win $w [expr {$row + $diff}] $col $col tabIdx1 tabIdx2 if {$multiline} { - updateMlCell $w $tabIdx1+1c $tabIdx2 $msgScript $aux \ + updateMlCell $w $tabIdx1+1$pu $tabIdx2 $msgScript $aux \ $auxType $auxWidth $indent $indentWidth \ $alignment [getVAlignment $win $key $col] } else { - updateCell $w $tabIdx1+1c $tabIdx2 $text $aux \ + updateCell $w $tabIdx1+1$pu $tabIdx2 $text $aux \ $auxType $auxWidth $indent $indentWidth \ $alignment [getVAlignment $win $key $col] } @@ -3449,7 +3499,7 @@ proc tablelist::doCellConfig {row col win opt val} { set pixels [lindex $data(colList) [expr {2*$col}]] set workPixels $pixels set text $val - set oldItem [lindex $data(itemList) $row] + set oldItem [lindex $data(${p}itemList) $row] set key [lindex $oldItem end] set fmtCmdFlag [lindex $data(fmtCmdFlagList) $col] if {$fmtCmdFlag} { @@ -3507,33 +3557,34 @@ proc tablelist::doCellConfig {row col win opt val} { $workPixels $snipSide $data(-snipstring) } - if {(!$data($col-hide) || $canElide) && - !($row == $data(editRow) && $col == $data(editCol))} { + if {(!$data($col-hide) || $canElide) && (!$inBody || + $row != $data(editRow) || $col != $data(editCol))} { # - # Update the text widget's contents between the two tabs + # Update the text widget's content between the two tabs # - findTabs $win [expr {$row + 1}] $col $col tabIdx1 tabIdx2 + findTabs $win $w [expr {$row + $diff}] $col $col tabIdx1 tabIdx2 if {$multiline} { - updateMlCell $w $tabIdx1+1c $tabIdx2 $msgScript $aux \ + updateMlCell $w $tabIdx1+1$pu $tabIdx2 $msgScript $aux \ $auxType $auxWidth $indent $indentWidth \ $alignment [getVAlignment $win $key $col] } else { - updateCell $w $tabIdx1+1c $tabIdx2 $text $aux \ + updateCell $w $tabIdx1+1$pu $tabIdx2 $text $aux \ $auxType $auxWidth $indent $indentWidth \ $alignment [getVAlignment $win $key $col] } } # - # Replace the cell contents in the internal list + # Replace the cell's content in the internal list # set newItem [lreplace $oldItem $col $col $val] - set data(itemList) [lreplace $data(itemList) $row $row $newItem] + set data(${p}itemList) \ + [lreplace $data(${p}itemList) $row $row $newItem] # - # Replace the cell contents in the list variable if present + # Replace the cell's content in the list variable if present # - if {$data(hasListVar)} { + if {$inBody && $data(hasListVar)} { upvar #0 $data(-listvariable) var trace vdelete var wu $data(listVarTraceCmd) set var [lreplace $var $row $row \ @@ -3579,7 +3630,9 @@ proc tablelist::doCellConfig {row col win opt val} { } } - showLineNumbersWhenIdle $win + if {$inBody} { + showLineNumbersWhenIdle $win + } updateViewWhenIdle $win } @@ -3590,7 +3643,7 @@ proc tablelist::doCellConfig {row col win opt val} { # variable valignments set val [mwutil::fullOpt "vertical alignment" $val $valignments] - set key [lindex $data(keyList) $row] + set key [lindex $data(${p}keyList) $row] set data($key,$col$opt) $val redisplayCol $win $col $row $row } @@ -3603,7 +3656,7 @@ proc tablelist::doCellConfig {row col win opt val} { # # Save the old image or window width # - set item [lindex $data(itemList) $row] + set item [lindex $data(${p}itemList) $row] set key [lindex $item end] set name $key,$col$opt getAuxData $win $key $col oldAuxType oldAuxWidth @@ -3621,18 +3674,20 @@ proc tablelist::doCellConfig {row col win opt val} { # # If the cell index is contained in the list - # data(cellsToReconfig) then remove it from the list + # data(${p}cellsToReconfig) then remove it from the list # - set n [lsearch -exact $data(cellsToReconfig) $row,$col] + set n [lsearch -exact $data(${p}cellsToReconfig) $row,$col] if {$n >= 0} { - set data(cellsToReconfig) \ - [lreplace $data(cellsToReconfig) $n $n] + set data(${p}cellsToReconfig) \ + [lreplace $data(${p}cellsToReconfig) $n $n] + } + if {$inBody} { + incr data(winCount) -1 } - incr data(winCount) -1 destroy $aux } } else { - if {![info exists data($name)]} { + if {$inBody && ![info exists data($name)]} { incr data(winCount) } if {[info exists data($name)] && @@ -3648,8 +3703,13 @@ proc tablelist::doCellConfig {row col win opt val} { -container 0 -highlightthickness 0 \ -relief flat -takefocus 0 catch {$aux configure -padx 0 -pady 0} - bindtags $aux [linsert [bindtags $aux] 1 \ - $data(bodyTag) TablelistBody] + 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 @@ -3658,13 +3718,13 @@ proc tablelist::doCellConfig {row col win opt val} { $aux configure -height $data($key,$col-reqHeight) # - # Add the cell index to the list data(cellsToReconfig) if - # the window's requested width or height is not yet known + # 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(cellsToReconfig) $row,$col] < 0} { - lappend data(cellsToReconfig) $row,$col + [lsearch -exact $data(${p}cellsToReconfig) $row,$col] < 0} { + lappend data(${p}cellsToReconfig) $row,$col if {![info exists data(reconfigId)]} { set data(reconfigId) \ [after idle [list tablelist::reconfigWindows $win]] @@ -3730,19 +3790,19 @@ proc tablelist::doCellConfig {row col win opt val} { $workPixels $snipSide $data(-snipstring) } - if {(!$data($col-hide) || $canElide) && - !($row == $data(editRow) && $col == $data(editCol))} { + if {(!$data($col-hide) || $canElide) && (!$inBody || + $row != $data(editRow) || $col != $data(editCol))} { # - # Delete the old cell contents between the two tabs, + # Delete the old cell content between the two tabs, # and insert the text and the auxiliary object # - findTabs $win [expr {$row + 1}] $col $col tabIdx1 tabIdx2 + findTabs $win $w [expr {$row + $diff}] $col $col tabIdx1 tabIdx2 if {$multiline} { - updateMlCell $w $tabIdx1+1c $tabIdx2 $msgScript $aux \ + updateMlCell $w $tabIdx1+1$pu $tabIdx2 $msgScript $aux \ $auxType $auxWidth $indent $indentWidth \ $alignment [getVAlignment $win $key $col] } else { - updateCell $w $tabIdx1+1c $tabIdx2 $text $aux \ + updateCell $w $tabIdx1+1$pu $tabIdx2 $text $aux \ $auxType $auxWidth $indent $indentWidth \ $alignment [getVAlignment $win $key $col] } @@ -3784,7 +3844,7 @@ proc tablelist::doCellConfig {row col win opt val} { -windowdestroy - -windowupdate { - set key [lindex $data(keyList) $row] + set key [lindex $data(${p}keyList) $row] set name $key,$col$opt # @@ -3808,6 +3868,9 @@ proc tablelist::doCellConfig {row col win opt val} { # 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] @@ -3818,8 +3881,7 @@ proc tablelist::doCellCget {row col win opt} { } -stretchwindow { - upvar ::tablelist::ns${win}::data data - set key [lindex $data(keyList) $row] + set key [lindex $data(${p}keyList) $row] if {[info exists data($key,$col$opt)]} { return $data($key,$col$opt) } else { @@ -3828,19 +3890,16 @@ proc tablelist::doCellCget {row col win opt} { } -text { - upvar ::tablelist::ns${win}::data data - return [lindex [lindex $data(itemList) $row] $col] + return [lindex [lindex $data(${p}itemList) $row] $col] } -valign { - upvar ::tablelist::ns${win}::data data - set key [lindex $data(keyList) $row] + set key [lindex $data(${p}keyList) $row] return [getVAlignment $win $key $col] } default { - upvar ::tablelist::ns${win}::data data - set key [lindex $data(keyList) $row] + set key [lindex $data(${p}keyList) $row] if {[info exists data($key,$col$opt)]} { return $data($key,$col$opt) } else { @@ -3956,7 +4015,7 @@ proc tablelist::reconfigWindows win { # Force any geometry manager calculations to be completed first # update idletasks - if {![array exists ::tablelist::ns${win}::data]} { + if {[destroyed $win]} { return "" } @@ -3972,8 +4031,20 @@ proc tablelist::reconfigWindows win { } } + # + # 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 {[info exists data($key,$col-window)]} { + doCellConfig h$row $col $win -window $data($key,$col-window) + } + } + unset data(reconfigId) set data(cellsToReconfig) {} + set data(hdr_cellsToReconfig) {} } #------------------------------------------------------------------------------ @@ -4030,3 +4101,24 @@ proc tablelist::getVAlignment {win key col} { 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] + } +} diff --git a/modules/tablelist/scripts/tablelistEdit.tcl b/modules/tablelist/scripts/tablelistEdit.tcl index 78f4ca39..7d7c30a7 100644 --- a/modules/tablelist/scripts/tablelistEdit.tcl +++ b/modules/tablelist/scripts/tablelistEdit.tcl @@ -22,6 +22,7 @@ namespace eval tablelist { # proc addTkCoreWidgets {} { variable editWin + variable pu set name entry array set editWin [list \ @@ -47,9 +48,9 @@ namespace eval tablelist { array set editWin [list \ $name-creationCmd "$name %W -padx 2 -pady 2 -wrap none" \ $name-putValueCmd "%W delete 1.0 end; %W insert 1.0 %T" \ - $name-getValueCmd "%W get 1.0 end-1c" \ + $name-getValueCmd "%W get 1.0 end-1$pu" \ $name-putTextCmd "%W delete 1.0 end; %W insert 1.0 %T" \ - $name-getTextCmd "%W get 1.0 end-1c" \ + $name-getTextCmd "%W get 1.0 end-1$pu" \ $name-putListCmd "" \ $name-getListCmd "" \ $name-selectCmd "" \ @@ -564,12 +565,13 @@ proc tablelist::addCtext {{name ctext}} { checkEditWinName $name variable editWin + variable pu array set editWin [list \ $name-creationCmd "ctext %W -padx 2 -pady 2 -wrap none" \ $name-putValueCmd "%W delete 1.0 end; %W insert 1.0 %T" \ - $name-getValueCmd "%W get 1.0 end-1c" \ + $name-getValueCmd "%W get 1.0 end-1$pu" \ $name-putTextCmd "%W delete 1.0 end; %W insert 1.0 %T" \ - $name-getTextCmd "%W get 1.0 end-1c" \ + $name-getTextCmd "%W get 1.0 end-1$pu" \ $name-putListCmd "" \ $name-getListCmd "" \ $name-selectCmd "" \ @@ -1075,54 +1077,11 @@ proc tablelist::checkEditWinName name { #------------------------------------------------------------------------------ # tablelist::createCheckbutton # -# Creates a checkbutton widget with the given path name for interactive cell +# Creates a checkbutton widget of the given path name for interactive cell # editing in a tablelist widget. #------------------------------------------------------------------------------ proc tablelist::createCheckbutton {w args} { - variable winSys - switch $winSys { - x11 { - variable checkedImg - variable uncheckedImg - if {![info exists checkedImg]} { - createCheckbuttonImgs - } - - checkbutton $w -borderwidth 2 -indicatoron 0 -image $uncheckedImg \ - -selectimage $checkedImg - if {$::tk_version >= 8.4} { - $w configure -offrelief sunken - } - pack $w - } - - win32 { - checkbutton $w -borderwidth 0 -font {"MS Sans Serif" 8} \ - -padx 0 -pady 0 - [winfo parent $w] configure -width 13 -height 13 - switch [winfo reqheight $w] { - 17 { set y -1 } - 20 { set y -3 } - 25 { set y -5 } - 30 - - 31 { set y -8 } - default { set y -1 } - } - place $w -x -1 -y $y - } - - classic { - checkbutton $w -borderwidth 0 -font "system" -padx 0 -pady 0 - [winfo parent $w] configure -width 16 -height 14 - place $w -x 0 -y -1 - } - - aqua { - checkbutton $w -borderwidth 0 -font "system" -padx 0 -pady 0 - [winfo parent $w] configure -width 16 -height 16 - place $w -x -4 -y -3 - } - } + makeCheckbutton $w foreach {opt val} $args { switch -- $opt { @@ -1138,7 +1097,7 @@ proc tablelist::createCheckbutton {w args} { #------------------------------------------------------------------------------ # tablelist::createMenubutton # -# Creates a menubutton widget with the given path name for interactive cell +# Creates a menubutton widget of the given path name for interactive cell # editing in a tablelist widget. #------------------------------------------------------------------------------ proc tablelist::createMenubutton {w args} { @@ -1223,7 +1182,7 @@ proc tablelist::postMenuCmd w { #------------------------------------------------------------------------------ # tablelist::createTileEntry # -# Creates a tile entry widget with the given path name for interactive cell +# Creates a tile entry widget of the given path name for interactive cell # editing in a tablelist widget. #------------------------------------------------------------------------------ proc tablelist::createTileEntry {w args} { @@ -1274,7 +1233,7 @@ proc tablelist::createTileEntry {w args} { #------------------------------------------------------------------------------ # tablelist::createTileSpinbox # -# Creates a tile spinbox widget with the given path name for interactive cell +# Creates a tile spinbox widget of the given path name for interactive cell # editing in a tablelist widget. #------------------------------------------------------------------------------ proc tablelist::createTileSpinbox {w args} { @@ -1332,7 +1291,7 @@ proc tablelist::createTileSpinbox {w args} { #------------------------------------------------------------------------------ # tablelist::createTileCombobox # -# Creates a tile combobox widget with the given path name for interactive cell +# Creates a tile combobox widget of the given path name for interactive cell # editing in a tablelist widget. #------------------------------------------------------------------------------ proc tablelist::createTileCombobox {w args} { @@ -1358,30 +1317,11 @@ proc tablelist::createTileCombobox {w args} { #------------------------------------------------------------------------------ # tablelist::createTileCheckbutton # -# Creates a tile checkbutton widget with the given path name for interactive -# cell editing in a tablelist widget. +# Creates a tile checkbutton widget of the given path name for interactive cell +# editing in a tablelist widget. #------------------------------------------------------------------------------ proc tablelist::createTileCheckbutton {w args} { - if {$::tk_version < 8.5 || [regexp {^8\.5a[1-5]$} $::tk_patchLevel]} { - package require tile 0.6 - } - createTileAliases - - # - # Define the checkbutton layout; use catch to suppress - # the error message in case the layout already exists - # - set currentTheme [getCurrentTheme] - if {[string compare $currentTheme "aqua"] == 0} { - catch {style layout Tablelist.TCheckbutton { Checkbutton.button }} - } else { - catch {style layout Tablelist.TCheckbutton { Checkbutton.indicator }} - styleConfig Tablelist.TCheckbutton -indicatormargin 0 - } - - set win [getTablelistPath $w] - ttk::checkbutton $w -style Tablelist.TCheckbutton \ - -variable ::tablelist::ns${win}::data(editText) + makeTileCheckbutton $w foreach {opt val} $args { switch -- $opt { @@ -1390,127 +1330,15 @@ proc tablelist::createTileCheckbutton {w args} { } } - # - # Adjust the dimensions of the tile checkbutton's parent - # and manage the checkbutton, depending on the current theme - # - switch -- $currentTheme { - aqua { - [winfo parent $w] configure -width 16 -height 16 - place $w -x -3 -y -3 - } - - Aquativo - - Arc { - [winfo parent $w] configure -width 14 -height 14 - place $w -x -1 -y -1 - } - - blue - - winxpblue { - set height [winfo reqheight $w] - [winfo parent $w] configure -width $height -height $height - place $w -x 0 - } - - clam { - [winfo parent $w] configure -width 11 -height 11 - place $w -x 0 - } - - clearlooks { - [winfo parent $w] configure -width 13 -height 13 - place $w -x -2 -y -2 - } - - keramik - - keramik_alt { - [winfo parent $w] configure -width 16 -height 16 - place $w -x -1 -y -1 - } - - plastik { - [winfo parent $w] configure -width 15 -height 15 - place $w -x -2 -y 1 - } - - sriv - - srivlg { - [winfo parent $w] configure -width 15 -height 16 - place $w -x -1 - } - - tileqt { - switch -- [string tolower [tileqt_currentThemeName]] { - acqua { - [winfo parent $w] configure -width 17 -height 18 - place $w -x -1 -y -2 - } - cde - - cleanlooks - - motif { - [winfo parent $w] configure -width 13 -height 13 - if {[info exists ::env(KDE_SESSION_VERSION)] && - [string length $::env(KDE_SESSION_VERSION)] != 0} { - place $w -x -2 - } else { - place $w -x 0 - } - } - gtk+ { - [winfo parent $w] configure -width 15 -height 15 - place $w -x -1 -y -1 - } - kde_xp { - [winfo parent $w] configure -width 13 -height 13 - place $w -x 0 - } - keramik - - thinkeramik { - [winfo parent $w] configure -width 16 -height 16 - place $w -x 0 - } - oxygen { - [winfo parent $w] configure -width 17 -height 17 - place $w -x -2 -y -1 - } - default { - set height [winfo reqheight $w] - [winfo parent $w] configure -width $height -height $height - place $w -x 0 - } - } - } - - vista { - set height [winfo reqheight $w] - [winfo parent $w] configure -width $height -height $height - place $w -x 0 - } - - winnative - - xpnative { - set height [winfo reqheight $w] - [winfo parent $w] configure -width $height -height $height - if {[info exists tile::patchlevel] && - [string compare $tile::patchlevel "0.8.0"] < 0} { - place $w -x -2 - } else { - place $w -x 0 - } - } - - default { - pack $w - } - } + set win [getTablelistPath $w] + $w configure -variable ::tablelist::ns${win}::data(editText) } #------------------------------------------------------------------------------ # tablelist::createTileMenubutton # -# Creates a tile menubutton widget with the given path name for interactive -# cell editing in a tablelist widget. +# Creates a tile menubutton widget of the given path name for interactive cell +# editing in a tablelist widget. #------------------------------------------------------------------------------ proc tablelist::createTileMenubutton {w args} { if {$::tk_version < 8.5 || [regexp {^8\.5a[1-5]$} $::tk_patchLevel]} { @@ -1557,8 +1385,8 @@ proc tablelist::createTileMenubutton {w args} { #------------------------------------------------------------------------------ # tablelist::createBWidgetComboBox # -# Creates a BWidget ComboBox widget with the given path name for interactive -# cell editing in a tablelist widget. +# Creates a BWidget ComboBox widget of the given path name for interactive cell +# editing in a tablelist widget. #------------------------------------------------------------------------------ proc tablelist::createBWidgetComboBox {w args} { eval [list ComboBox $w -editable 1 -width 0] $args @@ -1574,7 +1402,7 @@ proc tablelist::createBWidgetComboBox {w args} { #------------------------------------------------------------------------------ # tablelist::createIncrCombobox # -# Creates an [incr Widgets] combobox with the given path name for interactive +# Creates an [incr Widgets] combobox of the given path name for interactive # cell editing in a tablelist widget. #------------------------------------------------------------------------------ proc tablelist::createIncrCombobox {w args} { @@ -1596,8 +1424,8 @@ proc tablelist::createIncrCombobox {w args} { #------------------------------------------------------------------------------ # tablelist::createOakleyCombobox # -# Creates an Oakley combobox widget with the given path name for interactive -# cell editing in a tablelist widget. +# Creates an Oakley combobox widget of the given path name for interactive cell +# editing in a tablelist widget. #------------------------------------------------------------------------------ proc tablelist::createOakleyCombobox {w args} { eval [list combobox::combobox $w -editable 1 -width 0] $args @@ -1718,17 +1546,18 @@ proc tablelist::doEditCell {win row col restore {cmd ""} {charPos -1}} { } # - # Replace the cell's contents between the two tabs with the above frame + # Replace the cell's content between the two tabs with the above frame # array set data [list editKey $key editRow $row editCol $col] - findTabs $win [expr {$row + 1}] $col $col tabIdx1 tabIdx2 set b $data(body) + findTabs $win $b [expr {$row + 1}] $col $col tabIdx1 tabIdx2 getIndentData $win $data(editKey) $data(editCol) indentWidth + variable pu if {$indentWidth == 0} { - set textIdx [$b index $tabIdx1+1c] + set textIdx [$b index $tabIdx1+1$pu] } else { - $b mark set editIndentMark [$b index $tabIdx1+1c] - set textIdx [$b index $tabIdx1+2c] + $b mark set editIndentMark [$b index $tabIdx1+1$pu] + set textIdx [$b index $tabIdx1+2$pu] } if {$isCheckbtn} { set editIdx $textIdx @@ -1739,12 +1568,12 @@ proc tablelist::doEditCell {win row col restore {cmd ""} {charPos -1}} { set editIdx $textIdx $b delete $editIdx $tabIdx2 } elseif {[string compare $alignment "right"] == 0} { - $b mark set editAuxMark $tabIdx2-1c + $b mark set editAuxMark $tabIdx2-1$pu set editIdx $textIdx - $b delete $editIdx $tabIdx2-1c + $b delete $editIdx $tabIdx2-1$pu } else { $b mark set editAuxMark $textIdx - set editIdx [$b index $textIdx+1c] + set editIdx [$b index $textIdx+1$pu] $b delete $editIdx $tabIdx2 } } @@ -1776,7 +1605,7 @@ proc tablelist::doEditCell {win row col restore {cmd ""} {charPos -1}} { restoreEditData $win } else { # - # Put the cell's contents to the edit window + # Put the cell's content to the edit window # set data(canceled) 0 set data(invoked) 0 @@ -1797,6 +1626,9 @@ proc tablelist::doEditCell {win row col restore {cmd ""} {charPos -1}} { if {[string length $data(-editstartcommand)] != 0} { set text [uplevel #0 $data(-editstartcommand) \ [list $win $row $col $text]] + if {[destroyed $win]} { + return "" + } variable winSys if {[string compare $winSys "aqua"] == 0} { @@ -1964,10 +1796,10 @@ proc tablelist::doEditCell {win row col restore {cmd ""} {charPos -1}} { if {$isText} { if {[string compare [$w cget -wrap] "none"] == 0 || $::tk_version < 8.5} { - set numLines [expr {int([$w index end-1c])}] + set numLines [expr {int([$w index end-1$pu])}] $w configure -height $numLines update idletasks ;# needed for ctext - if {![array exists ::tablelist::ns${win}::data]} { + if {[destroyed $win]} { return "" } $f configure -height [winfo reqheight $w] @@ -1983,7 +1815,7 @@ proc tablelist::doEditCell {win row col restore {cmd ""} {charPos -1}} { } } elseif {!$isCheckbtn} { update idletasks - if {![array exists ::tablelist::ns${win}::data]} { + if {[destroyed $win]} { return "" } $f configure -height [winfo reqheight $w] @@ -1996,7 +1828,7 @@ proc tablelist::doEditCell {win row col restore {cmd ""} {charPos -1}} { place $w -relwidth 1.0 -relheight 1.0 adjustEditWindow $win $pixels update idletasks - if {![array exists ::tablelist::ns${win}::data]} { + if {[destroyed $win]} { return "" } } @@ -2009,7 +1841,7 @@ proc tablelist::doEditCell {win row col restore {cmd ""} {charPos -1}} { # tablelist::doCancelEditing # # Processes the tablelist cancelediting subcommand. Aborts the interactive -# cell editing and restores the cell's contents after destroying the edit +# cell editing and restores the cell's content after destroying the edit # window. #------------------------------------------------------------------------------ proc tablelist::doCancelEditing win { @@ -2027,6 +1859,9 @@ proc tablelist::doCancelEditing win { [string length $data(-editendcommand)] != 0} { uplevel #0 $data(-editendcommand) \ [list $win $row $col $data(origEditText)] + if {[destroyed $win]} { + return "" + } } if {[winfo exists $data(bodyFrm)]} { @@ -2087,6 +1922,9 @@ proc tablelist::doFinishEditing win { if {[string length $data(-editendcommand)] != 0} { set text \ [uplevel #0 $data(-editendcommand) [list $win $row $col $text]] + if {[destroyed $win]} { + return 0 + } } } @@ -2162,7 +2000,8 @@ proc tablelist::adjustTextHeight {w args} { # # We can only count the logical lines (irrespective of wrapping) # - set numLines [expr {int([$w index end-1c])}] + variable pu + set numLines [expr {int([$w index end-1$pu])}] } $w configure -height $numLines diff --git a/modules/tablelist/scripts/tablelistImages.tcl b/modules/tablelist/scripts/tablelistImages.tcl index cea95d47..cd29d3ce 100644 --- a/modules/tablelist/scripts/tablelistImages.tcl +++ b/modules/tablelist/scripts/tablelistImages.tcl @@ -1111,8 +1111,8 @@ proc tablelist::bicolor2TreeImgs {} { variable pngSupported if {$pngSupported} { tablelist_bicolor2_collapsedImg put " -iVBORw0KGgoAAAANSUhEUgAAAA4AAAAMCAYAAABSgIzaAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI -WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AUKEwwFv3J4nAAAADJJREFUKM9jYKASaCJWIRO5mpnI +iVBORw0KGgoAAAANSUhEUgAAAA4AAAAMCAYAAABSgIzaAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI +WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AUKEwwFv3J4nAAAADJJREFUKM9jYKASaCJWIRO5mpnI tZmJXGczketnJnIDjBiNdeRorCPHqXXkBE4dzVIOAPKWBZkKDbb3AAAAAElFTkSuQmCC " tablelist_bicolor2_expandedImg put " @@ -1248,8 +1248,8 @@ LjEwMPRyoQAAAEJJREFUKFNj+P//P1EYwWBgEEeWQMcIBgNDMhBnIksiYwQDovASLsUIBkIhVsW4 FIKwGTEKiTKRKDcS5Ws84fifAQDpge0RK469/gAAAABJRU5ErkJggg== " tablelist_blueMenta_expandedImg put " -iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAAARnQU1BAACx -jwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41 +iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAAARnQU1BAACx +jwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41 LjEwMPRyoQAAAEtJREFUKFONjNEJACAIBZ3EKRqqvtq1hcwkDPMRBQd5HpKIfAElAkrEeqz0B2zh rqsyAM0v+ifHHoXQhhOHyHZJEJXbmUcSAWVGaALoU+1uRfEIrwAAAABJRU5ErkJggg== " @@ -1272,8 +1272,8 @@ LjEwMPRyoQAAAEJJREFUKFNj+P//P1EYwWBgEEeWQMcIBgNDMhBnIksiYwQDovASLsUIBkIhVsW4 FIKwGTEKiTKRKDcS5Ws84fifAQDpge0RK469/gAAAABJRU5ErkJggg== " tablelist_blueMenta_expandedActImg put " -iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAAARnQU1BAACx -jwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41 +iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAAARnQU1BAACx +jwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41 LjEwMPRyoQAAAEtJREFUKFONjNEJACAIBZ3EKRqqvtq1hcwkDPMRBQd5HpKIfAElAkrEeqz0B2zh rqsyAM0v+ifHHoXQhhOHyHZJEJXbmUcSAWVGaALoU+1uRfEIrwAAAABJRU5ErkJggg== " @@ -1284,8 +1284,8 @@ LjEwMPRyoQAAAEJJREFUKFNj+P//P1EYwWBgEEeWQMcIBgNDMhBnIksiYwQDovASLsUIBkIhVsW4 FIKwGTEKiTKRKDcS5Ws84fifAQDpge0RK469/gAAAABJRU5ErkJggg== " tablelist_blueMenta_expandedSelActImg put " -iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAAARnQU1BAACx -jwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41 +iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAAARnQU1BAACx +jwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41 LjEwMPRyoQAAAEtJREFUKFONjNEJACAIBZ3EKRqqvtq1hcwkDPMRBQd5HpKIfAElAkrEeqz0B2zh rqsyAM0v+ifHHoXQhhOHyHZJEJXbmUcSAWVGaALoU+1uRfEIrwAAAABJRU5ErkJggg== " @@ -1602,8 +1602,8 @@ LjEwMPRyoQAAAEJJREFUKFNj+P//P1EYwWBgEEeWQMcIBgNDMhBnIksiYwQDovASLsUIBkIhVsW4 FIKwGTEKiTKRKDcS5Ws84fifAQDpge0RK469/gAAAABJRU5ErkJggg== " tablelist_menta_expandedImg put " -iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAAARnQU1BAACx -jwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41 +iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAAARnQU1BAACx +jwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41 LjEwMPRyoQAAAEtJREFUKFONjNEJACAIBZ3EKRqqvtq1hcwkDPMRBQd5HpKIfAElAkrEeqz0B2zh rqsyAM0v+ifHHoXQhhOHyHZJEJXbmUcSAWVGaALoU+1uRfEIrwAAAABJRU5ErkJggg== " diff --git a/modules/tablelist/scripts/tablelistMove.tcl b/modules/tablelist/scripts/tablelistMove.tcl index e23f044b..174b3dc3 100644 --- a/modules/tablelist/scripts/tablelistMove.tcl +++ b/modules/tablelist/scripts/tablelistMove.tcl @@ -129,6 +129,7 @@ proc tablelist::moveNode {win source targetParentKey targetChildIdx \ set textIdx $line.0 variable canElide variable elide + variable pu for {set col 0} {$col < $data(colCount)} {incr col} { if {$data($col-hide) && !$canElide} { continue @@ -137,12 +138,12 @@ proc tablelist::moveNode {win source targetParentKey targetChildIdx \ # # Check whether the 2nd tab character of the cell is selected # - set textIdx [$w search $elide "\t" $textIdx+1c $line.end] + set textIdx [$w search $elide "\t" $textIdx+1$pu $line.end] if {[lsearch -exact [$w tag names $textIdx] select] >= 0} { lappend selectedCols $col } - set textIdx $textIdx+1c + set textIdx $textIdx+1$pu } $w delete [expr {$source + 1}].0 [expr {$source + 2}].0 @@ -193,10 +194,10 @@ proc tablelist::moveNode {win source targetParentKey targetChildIdx \ $w tag add row-font-$data($sourceKey-font) $targetLine.0 $targetLine.end } if {[info exists data($sourceKey-elide)]} { - $w tag add elidedRow $targetLine.0 $targetLine.end+1c + $w tag add elidedRow $targetLine.0 $targetLine.end+1$pu } if {[info exists data($sourceKey-hide)]} { - $w tag add hiddenRow $targetLine.0 $targetLine.end+1c + $w tag add hiddenRow $targetLine.0 $targetLine.end+1$pu } set treeCol $data(treeCol) @@ -427,9 +428,9 @@ proc tablelist::moveNode {win source targetParentKey targetChildIdx \ # foreach tag {elidedRow hiddenRow} { if {[lsearch -exact [$w tag names end-1l] $tag] >= 0} { - $w tag add $tag end-1c + $w tag add $tag end-1$pu } else { - $w tag remove $tag end-1c + $w tag remove $tag end-1$pu } } @@ -458,7 +459,7 @@ proc tablelist::moveCol {win source target} { if {[winfo viewable $win]} { purgeWidgets $win update idletasks - if {![array exists ::tablelist::ns${win}::data]} { + if {[destroyed $win]} { return "" } } @@ -481,6 +482,7 @@ proc tablelist::moveCol {win source target} { # Save some elements of data and attribs corresponding to source # array set tmpData [array get data $source-*] + array set tmpData [array get data hk*,$source-*] array set tmpData [array get data k*,$source-*] foreach specialCol {activeCol anchorCol editCol -treecolumn treeCol} { set tmpData($specialCol) $data($specialCol) @@ -561,7 +563,19 @@ proc tablelist::moveCol {win source target} { } # - # Update the item list + # Update the item list in the header text widget + # + set hdr_newItemList {} + foreach item $data(hdr_itemList) { + set sourceText [lindex $item $source] + set item [lreplace $item $source $source] + set item [linsert $item $target1 $sourceText] + lappend hdr_newItemList $item + } + set data(hdr_itemList) $hdr_newItemList + + # + # Update the item list in the body text widget # set newItemList {} foreach item $data(itemList) { @@ -590,6 +604,7 @@ proc tablelist::moveCol {win source target} { # Redisplay the items # redisplay $win 0 $selCells + hdr_updateColorsWhenIdle $win updateColorsWhenIdle $win # diff --git a/modules/tablelist/scripts/tablelistSort.tcl b/modules/tablelist/scripts/tablelistSort.tcl index 9ce90bac..d07fe0fb 100644 --- a/modules/tablelist/scripts/tablelistSort.tcl +++ b/modules/tablelist/scripts/tablelistSort.tcl @@ -18,7 +18,7 @@ #------------------------------------------------------------------------------ # tablelist::sortByColumn # -# Sorts the contents of the tablelist widget win by its col'th column. Returns +# Sorts the content of the tablelist widget win by its col'th column. Returns # the sort order (increasing or decreasing). #------------------------------------------------------------------------------ proc tablelist::sortByColumn {win col} { @@ -54,7 +54,7 @@ proc tablelist::sortByColumn {win col} { } # - # Sort the widget's contents based on the given column + # Sort the widget's content based on the given column # if {[catch {::$win sortbycolumn $col -$sortOrder} result] == 0} { set userData [list $col $sortOrder] @@ -70,7 +70,7 @@ proc tablelist::sortByColumn {win col} { # tablelist::addToSortColumns # # Adds the col'th column of the tablelist widget win to the latter's list of -# sort columns and sorts the contents of the widget by the modified column +# sort columns and sorts the content of the widget by the modified column # list. Returns the specified column's sort order (increasing or decreasing). #------------------------------------------------------------------------------ proc tablelist::addToSortColumns {win col} { @@ -113,7 +113,7 @@ proc tablelist::addToSortColumns {win col} { } # - # Sort the widget's contents according to the + # Sort the widget's content according to the # modified lists of sort columns and orders # if {[catch {::$win sortbycolumnlist $sortColList $sortOrderList} result] @@ -146,7 +146,7 @@ proc tablelist::sortItems {win parentKey sortColList sortOrderList} { if {[winfo viewable $win] && $sortAllItems} { purgeWidgets $win update idletasks - if {![array exists ::tablelist::ns${win}::data]} { + if {[destroyed $win]} { return "" } } @@ -357,7 +357,7 @@ proc tablelist::sortItems {win parentKey sortColList sortOrderList} { $firstDescRow $lastDescRow] $descItemList] # - # Replace the contents of the list variable if present + # Replace the content of the list variable if present # condUpdateListVar $win @@ -366,9 +366,10 @@ proc tablelist::sortItems {win parentKey sortColList sortOrderList} { # Interestingly, for a large number of items it is much more efficient # to empty each line individually than to invoke a global delete command. # + variable pu set w $data(body) - $w tag remove elidedRow $firstDescLine.0 $lastDescLine.end+1c - $w tag remove hiddenRow $firstDescLine.0 $lastDescLine.end+1c + $w tag remove elidedRow $firstDescLine.0 $lastDescLine.end+1$pu + $w tag remove hiddenRow $firstDescLine.0 $lastDescLine.end+1$pu for {set line $firstDescLine} {$line <= $lastDescLine} {incr line} { $w delete $line.0 $line.end } @@ -491,7 +492,7 @@ proc tablelist::sortItems {win parentKey sortColList sortOrderList} { # Embed the message widgets displaying multiline elements # foreach {col text font pixels alignment} $multilineData { - findTabs $win $line $col $col tabIdx1 tabIdx2 + findTabs $win $w $line $col $col tabIdx1 tabIdx2 set msgScript [list ::tablelist::displayText $win $key \ $col $text $font $pixels $alignment] $w window create $tabIdx2 \ @@ -543,10 +544,10 @@ proc tablelist::sortItems {win parentKey sortColList sortOrderList} { } if {[info exists data($key-elide)]} { - $w tag add elidedRow $line.0 $line.end+1c + $w tag add elidedRow $line.0 $line.end+1$pu } if {[info exists data($key-hide)]} { - $w tag add hiddenRow $line.0 $line.end+1c + $w tag add hiddenRow $line.0 $line.end+1$pu } } diff --git a/modules/tablelist/scripts/tablelistThemes.tcl b/modules/tablelist/scripts/tablelistThemes.tcl index 54fbe0af..4b0bc4f0 100644 --- a/modules/tablelist/scripts/tablelistThemes.tcl +++ b/modules/tablelist/scripts/tablelistThemes.tcl @@ -16,19 +16,6 @@ # ======================================== # -#------------------------------------------------------------------------------ -# tablelist::getCurrentTheme -# -# Returns the current tile theme. -#------------------------------------------------------------------------------ -proc tablelist::getCurrentTheme {} { - if {[info exists ttk::currentTheme]} { - return $ttk::currentTheme - } else { - return $tile::currentTheme - } -} - #------------------------------------------------------------------------------ # tablelist::setThemeDefaults # @@ -277,6 +264,38 @@ proc tablelist::AquativoTheme {} { ] } +#------------------------------------------------------------------------------ +# tablelist::aquativoTheme +#------------------------------------------------------------------------------ +proc tablelist::aquativoTheme {} { + variable themeDefaults + array set themeDefaults [list \ + -background white \ + -foreground black \ + -disabledforeground #565248 \ + -stripebackground #edf3fe \ + -selectbackground #000000 \ + -selectforeground #ffffff \ + -selectborderwidth 0 \ + -font TkTextFont \ + -labelbackground #fafafa \ + -labeldeactivatedBg #fafafa \ + -labeldisabledBg #e3e1dd\ + -labelactiveBg #c1d2ee \ + -labelpressedBg #bab5ab \ + -labelforeground black \ + -labeldisabledFg #565248 \ + -labelactiveFg black \ + -labelpressedFg black \ + -labelfont TkDefaultFont \ + -labelborderwidth 2 \ + -labelpady 1 \ + -arrowcolor #777777 \ + -arrowstyle flat7x7 \ + -treestyle aqua \ + ] +} + #------------------------------------------------------------------------------ # tablelist::ArcTheme #------------------------------------------------------------------------------ @@ -754,7 +773,7 @@ proc tablelist::tileqtTheme {} { # switch "$bg $labelBg" { "#fafafa #6188d7" { ;# color scheme "Aqua Blue" - switch -- $style { + switch -- $style { "light, 3rd revision" { set pressedBg #ffffff } "platinum" { set pressedBg #d0d0d0 } "baghira" { set labelBg #f5f5f5; set pressedBg #9ec2fa } @@ -768,7 +787,7 @@ proc tablelist::tileqtTheme {} { } "#ffffff #89919b" { ;# color scheme "Aqua Graphite" - switch -- $style { + switch -- $style { "light, 3rd revision" { set pressedBg #ffffff } "platinum" { set pressedBg #d4d4d4 } "baghira" { set labelBg #f5f5f5; set pressedBg #c3c7cd } @@ -782,7 +801,7 @@ proc tablelist::tileqtTheme {} { } "#afb49f #afb49f" { ;# color scheme "Atlas Green" - switch -- $style { + switch -- $style { "light, 3rd revision" { set pressedBg #c1c6af } "platinum" { set pressedBg #929684 } "baghira" { set labelBg #e5e8dc; set pressedBg #dadcd0 } @@ -796,7 +815,7 @@ proc tablelist::tileqtTheme {} { } "#d9d9d9 #d9d9d9" { ;# color scheme "BeOS" - switch -- $style { + switch -- $style { "light, 3rd revision" { set pressedBg #eeeeee } "platinum" { set pressedBg #b4b4b4 } "baghira" { set labelBg #f2f2f2; set pressedBg #e9e9e9 } @@ -810,7 +829,7 @@ proc tablelist::tileqtTheme {} { } "#9db9c8 #9db9c8" { ;# color scheme "Blue Slate" - switch -- $style { + switch -- $style { "light, 3rd revision" { set pressedBg #adcbdc } "platinum" { set pressedBg #8299a6 } "baghira" { set labelBg #ddeff6; set pressedBg #d0e1ea } @@ -824,7 +843,7 @@ proc tablelist::tileqtTheme {} { } "#999999 #999999" { ;# color scheme "CDE" - switch -- $style { + switch -- $style { "light, 3rd revision" { set pressedBg #a8a8a8 } "platinum" { set pressedBg #7f7f7f } "baghira" { set labelBg #d5d5d5; set pressedBg #cccccc } @@ -838,7 +857,7 @@ proc tablelist::tileqtTheme {} { } "#426794 #426794" { ;# color scheme "Dark Blue" - switch -- $style { + switch -- $style { "light, 3rd revision" { set pressedBg #4871a2 } "platinum" { set pressedBg #37567b } "baghira" { set labelBg #8aafdc; set pressedBg #82a3cc } @@ -852,7 +871,7 @@ proc tablelist::tileqtTheme {} { } "#d6cdbb #d6cdbb" { ;# color scheme "Desert Red" - switch -- $style { + switch -- $style { "light, 3rd revision" { set pressedBg #ebe1ce } "platinum" { set pressedBg #b2ab9c } "baghira" { set labelBg #f7f4ec; set pressedBg #edeae0 } @@ -866,7 +885,7 @@ proc tablelist::tileqtTheme {} { } "#4b7b82 #4b7b82" { ;# color scheme "Digital CDE" - switch -- $style { + switch -- $style { "light, 3rd revision" { set pressedBg #52878f } "platinum" { set pressedBg #3e666c } "baghira" { set labelBg #97c3c9; set pressedBg #8eb6bc } @@ -880,7 +899,7 @@ proc tablelist::tileqtTheme {} { } "#e6dedc #e4e4e4" { ;# color scheme "EveX" - switch -- $style { + switch -- $style { "light, 3rd revision" { set pressedBg #fdf4f2 } "platinum" { set pressedBg #bfb8b7 } "baghira" { set labelBg #f6f5f5; set pressedBg #ededed } @@ -894,7 +913,7 @@ proc tablelist::tileqtTheme {} { } "#ffffff #ffffff" { ;# color scheme "High Contrast Black Text" - switch -- $style { + switch -- $style { "light, 3rd revision" { set pressedBg #ffffff } "platinum" { set pressedBg #d4d4d4 } "baghira" { set labelBg #f5f5f5; set pressedBg #f2f2f2 } @@ -908,7 +927,7 @@ proc tablelist::tileqtTheme {} { } "#0000ff #0000ff" { ;# color scheme "High Contrast Yellow on Blue" - switch -- $style { + switch -- $style { "light, 3rd revision" { set pressedBg #1919ff } "platinum" { set pressedBg #0000d4 } "baghira" { set labelBg #4848ff; set pressedBg #4646ff } @@ -922,7 +941,7 @@ proc tablelist::tileqtTheme {} { } "#000000 #000000" { ;# color scheme "High Contrast White Text" - switch -- $style { + switch -- $style { "light, 3rd revision" { set pressedBg #000000 } "platinum" { set pressedBg #000000 } "baghira" { set labelBg #818181; set pressedBg #7f7f7f } diff --git a/modules/tablelist/scripts/tablelistUtil.tcl b/modules/tablelist/scripts/tablelistUtil.tcl index 418312ba..a8040f27 100644 --- a/modules/tablelist/scripts/tablelistUtil.tcl +++ b/modules/tablelist/scripts/tablelistUtil.tcl @@ -3,6 +3,7 @@ # # Structure of the module: # - Namespace initialization +# - Public utility procedure # - Private utility procedures # # Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) @@ -49,18 +50,51 @@ namespace eval tablelist { } } +# +# Public utility procedure +# ======================== +# + +#------------------------------------------------------------------------------ +# tablelist::getCurrentTheme +# +# Returns the current tile theme. +#------------------------------------------------------------------------------ +proc tablelist::getCurrentTheme {} { + if {[info exists ttk::currentTheme]} { + return $ttk::currentTheme + } elseif {[info exists tile::currentTheme]} { + return $tile::currentTheme + } else { + return "" + } +} + # # Private utility procedures # ========================== # +#------------------------------------------------------------------------------ +# tablelist::destroyed +# +# Checks whether the tablelist widget win got destroyed by some custom script. +#------------------------------------------------------------------------------ +proc tablelist::destroyed win { + # + # A bit safer than using "winfo exists", because the widget might have + # been destroyed and its name reused for a new non-tablelist widget: + # + return [expr {![array exists ::tablelist::ns${win}::data]}] +} + #------------------------------------------------------------------------------ # tablelist::rowIndex # # Checks the row index idx and returns either its numerical value or an error. # endIsSize must be a boolean value: if true, end refers to the number of items -# in the tablelist, i.e., to the element just after the last one; if false, end -# refers to 1 less than the number of items, i.e., to the last element in the +# in the tablelist, i.e., to the item just after the last one; if false, end +# refers to 1 less than the number of items, i.e., to the last item in the # tablelist. checkRange must be a boolean value: if true, it is additionally # checked whether the numerical value corresponding to idx is within the # allowed range. @@ -86,7 +120,7 @@ proc tablelist::rowIndex {win idx endIsSize {checkRange 0}} { displayItems $win set textIdx [$data(body) index @0,$data(btmY)] set index [expr {int($textIdx) - 1}] - if {$index > $data(lastRow)} { ;# text widget bug + if {$index > $data(lastRow)} { set index $data(lastRow) } } elseif {[string first $idx "active"] == 0 && [string length $idx] >= 2} { @@ -100,7 +134,7 @@ proc tablelist::rowIndex {win idx endIsSize {checkRange 0}} { incr y -[winfo y $data(body)] set textIdx [$data(body) index @$x,$y] set index [expr {int($textIdx) - 1}] - if {$index > $data(lastRow)} { ;# text widget bug + if {$index > $data(lastRow)} { set index $data(lastRow) } } elseif {[scan $idx "k%d%n" num count] == 2 && @@ -131,6 +165,73 @@ proc tablelist::rowIndex {win idx endIsSize {checkRange 0}} { } } +#------------------------------------------------------------------------------ +# tablelist::hdr_rowIndex +# +# Checks the header row index idx and returns either its numerical value or an +# error. endIsSize must be a boolean value: if true, end refers to the number +# of header items in the tablelist, i.e., to the header item just after the +# last one; if false, end refers to 1 less than the number of header items, +# i.e., to the last header item in the tablelist. checkRange must be a boolean +# value: if true, it is additionally checked whether the numerical value +# corresponding to idx is within the allowed range. +#------------------------------------------------------------------------------ +proc tablelist::hdr_rowIndex {win idx endIsSize {checkRange 0}} { + upvar ::tablelist::ns${win}::data data + + if {[isInteger $idx]} { + set index [expr {int($idx)}] + } elseif {[string first $idx "end"] == 0} { + if {$endIsSize} { + set index $data(hdr_itemCount) + } else { + set index $data(hdr_lastRow) + } + } elseif {[string first $idx "last"] == 0} { + set index $data(hdr_lastRow) + } elseif {[scan $idx "@%d,%d%n" x y count] == 3 && + $count == [string length $idx]} { + incr x -[winfo x $data(hdr)] + incr y -[winfo y $data(hdr)] + if {!$data(-showlabels)} { + incr y + } + set textIdx [$data(hdrTxt) index @$x,$y] + set index [expr {int($textIdx) - 2}] + if {$index < 0} { + set index 0 + } + if {$index > $data(hdr_lastRow)} { + set index $data(hdr_lastRow) + } + } elseif {[scan $idx "hk%d%n" num count] == 2 && + $count == [string length $idx]} { + set index [hdr_keyToRow $win hk$num] + } else { + set idxIsEmpty [expr {[string length $idx] == 0}] + for {set row 0} {$row < $data(hdr_itemCount)} {incr row} { + set key [lindex $data(hdr_keyList) $row] + set hasName [info exists data($key-name)] + if {($hasName && [string compare $idx $data($key-name)] == 0) || + (!$hasName && $idxIsEmpty)} { + set index $row + break + } + } + if {$row == $data(hdr_itemCount)} { + return -code error \ + "bad header row index \"$idx\": must be end, last, @x,y,\ + a number, a full header key, or a name" + } + } + + if {$checkRange && ($index < 0 || $index > $data(hdr_lastRow))} { + return -code error "header row index \"$idx\" out of range" + } else { + return $index + } +} + #------------------------------------------------------------------------------ # tablelist::colIndex # @@ -259,6 +360,46 @@ proc tablelist::cellIndex {win idx checkRange} { } } +#------------------------------------------------------------------------------ +# tablelist::hdr_cellIndex +# +# Checks the header cell index idx and returns either a list of the form {row +# col} or an error. checkRange must be a boolean value: if true, it is +# additionally checked whether the two numerical values corresponding to idx +# are within the respective allowed ranges. +#------------------------------------------------------------------------------ +proc tablelist::hdr_cellIndex {win idx checkRange} { + upvar ::tablelist::ns${win}::data data + + set lst [split $idx ","] + if {[llength $lst] == 2 && + [catch {hdr_rowIndex $win [lindex $lst 0] 0} row] == 0 && + [catch {colIndex $win [lindex $lst 1] 0} col] == 0} { + # nothing + } elseif {[string first $idx "end"] == 0 || + [string first $idx "last"] == 0} { + set row [hdr_rowIndex $win $idx 0] + set col [colIndex $win $idx 0] + } elseif {[string compare [string index $idx 0] "@"] == 0 && + [catch {hdr_rowIndex $win $idx 0} row] == 0 && + [catch {colIndex $win $idx 0} col] == 0} { + # nothing + } else { + return -code error \ + "bad header cell index \"$idx\": must be end, last, @x,y, or\ + row,col, where row must be end, last, a number, a full header\ + key, or a name, and col must be active, anchor, end, last,\ + left, right, a number, or a name" + } + + if {$checkRange && ($row < 0 || $row > $data(hdr_lastRow) || + $col < 0 || $col > $data(lastCol))} { + return -code error "header cell index \"$idx\" out of range" + } else { + return [list $row $col] + } +} + #------------------------------------------------------------------------------ # tablelist::adjustRowIndex # @@ -488,6 +629,17 @@ proc tablelist::keyToRow {win key} { } } +#------------------------------------------------------------------------------ +# tablelist::hdr_keyToRow +# +# Returns the header row corresponding to the given full header key within the +# tablelist widget win. +#------------------------------------------------------------------------------ +proc tablelist::hdr_keyToRow {win key} { + upvar ::tablelist::ns${win}::data data + return [lsearch -exact $data(hdr_keyList) $key] +} + #------------------------------------------------------------------------------ # tablelist::updateKeyToRowMap # @@ -513,14 +665,13 @@ proc tablelist::updateKeyToRowMap win { # tablelist::findTabs # # Searches for the first and last occurrences of the tab character in the cell -# range specified by firstCol and lastCol in the given line of the body text -# child of the tablelist widget win. Assigns the index of the first tab to -# $idx1Name and the index of the last tab to $idx2Name. It is assumed that +# range specified by firstCol and lastCol in the given line of the text widget +# descendant w of the tablelist widget win. Assigns the index of the first tab +# to $idx1Name and the index of the last tab to $idx2Name. It is assumed that # both columns are non-hidden (but there may be hidden ones between them). #------------------------------------------------------------------------------ -proc tablelist::findTabs {win line firstCol lastCol idx1Name idx2Name} { +proc tablelist::findTabs {win w line firstCol lastCol idx1Name idx2Name} { upvar ::tablelist::ns${win}::data data $idx1Name idx1 $idx2Name idx2 - set w $data(body) if {$::tk_version >= 8.5} { set idxList [$w search -all -elide "\t" $line.0 $line.end] @@ -534,23 +685,24 @@ proc tablelist::findTabs {win line firstCol lastCol idx1Name idx2Name} { } else { variable canElide variable elide + variable pu set endIdx $line.end set idx $line.1 for {set col 0} {$col < $firstCol} {incr col} { if {!$data($col-hide) || $canElide} { - set idx [$w search $elide "\t" $idx $endIdx]+2c - if {[string compare $idx "+2c"] == 0} { + set idx [$w search $elide "\t" $idx $endIdx]+2$pu + if {[string compare $idx "+2$pu"] == 0} { return 0 } } } - set idx1 [$w index $idx-1c] + set idx1 [$w index $idx-1$pu] for {} {$col < $lastCol} {incr col} { if {!$data($col-hide) || $canElide} { - set idx [$w search $elide "\t" $idx $endIdx]+2c - if {[string compare $idx "+2c"] == 0} { + set idx [$w search $elide "\t" $idx $endIdx]+2$pu + if {[string compare $idx "+2$pu"] == 0} { return 0 } } @@ -617,6 +769,13 @@ proc tablelist::deleteColData {win col} { unset data($name) } + # + # Remove the elements with names of the form hk*,$col-* + # + foreach name [array names data hk*,$col-*] { + unset data($name) + } + # # Remove the elements with names of the form k*,$col-* # @@ -663,6 +822,13 @@ proc tablelist::deleteColAttribs {win col} { unset attribs($name) } + # + # Remove the elements with names of the form hk*,$col-* + # + foreach name [array names attribs hk*,$col-*] { + unset attribs($name) + } + # # Remove the elements with names of the form k*,$col-* # @@ -730,6 +896,19 @@ proc tablelist::moveColData {oldArrName newArrName imgArrName oldCol newCol} { } } + # + # Move the elements of oldArr with names of the form hk*,$oldCol-* + # to those of newArr with names of the form hk*,$newCol-* + # + foreach newName [array names newArr hk*,$newCol-*] { + unset newArr($newName) + } + foreach oldName [array names oldArr hk*,$oldCol-*] { + regsub -- ",$oldCol-" $oldName ",$newCol-" newName + set newArr($newName) $oldArr($oldName) + unset oldArr($oldName) + } + # # Move the elements of oldArr with names of the form k*,$oldCol-* # to those of newArr with names of the form k*,$newCol-* @@ -783,6 +962,19 @@ proc tablelist::moveColAttribs {oldArrName newArrName oldCol newCol} { unset oldArr($oldName) } + # + # Move the elements of oldArr with names of the form hk*,$oldCol-* + # to those of newArr with names of the form hk*,$newCol-* + # + foreach newName [array names newArr hk*,$newCol-*] { + unset newArr($newName) + } + foreach oldName [array names oldArr hk*,$oldCol-*] { + regsub -- ",$oldCol-" $oldName ",$newCol-" newName + set newArr($newName) $oldArr($oldName) + unset oldArr($oldName) + } + # # Move the elements of oldArr with names of the form k*,$oldCol-* # to those of newArr with names of the form k*,$newCol-* @@ -907,13 +1099,7 @@ proc tablelist::reconfigColLabels {win imgArrName col} { # characters. #------------------------------------------------------------------------------ proc tablelist::charsToPixels {win font charCount} { - ### set str [string repeat "0" $charCount] - set str "" - for {set n 0} {$n < $charCount} {incr n} { - append str 0 - } - - return [font measure $font -displayof $win $str] + return [expr {[font measure $font -displayof $win "0"] * $charCount}] } #------------------------------------------------------------------------------ @@ -1100,7 +1286,7 @@ proc tablelist::getListWidth {win list font} { #------------------------------------------------------------------------------ # tablelist::joinList # -# Returns the string formed by joining together with "\n" the strings obtained +# Returns the string formed by joining together with "\n" the strings obtained # by applying strRange to the elements of the given list, with the specified # arguments. #------------------------------------------------------------------------------ @@ -1120,13 +1306,14 @@ proc tablelist::joinList {win list font pixels snipSide snipStr} { # specified cell of the tablelist widget win. #------------------------------------------------------------------------------ proc tablelist::displayIndent {win key col width} { - # - # Create a label widget and replace the binding tag Label with - # $data(bodyTag) and TablelistBody in the list of its binding tags - # upvar ::tablelist::ns${win}::data data set w $data(body).ind_$key,$col + if {![winfo exists $w]} { + # + # Create a label widget and replace the binding tag Label with + # $data(bodyTag) and TablelistBody in the list of its binding tags + # tk::label $w -anchor w -borderwidth 0 -height 0 -highlightthickness 0 \ -image $data($key,$col-indent) -padx 0 -pady 0 \ -relief flat -takefocus 0 -width $width @@ -1144,20 +1331,37 @@ proc tablelist::displayIndent {win key col width} { # the tablelist widget win. #------------------------------------------------------------------------------ proc tablelist::displayImage {win key col anchor width} { - # - # Create a label widget and replace the binding tag Label with - # $data(bodyTag) and TablelistBody in the list of its binding tags - # upvar ::tablelist::ns${win}::data data - set w $data(body).img_$key,$col + set inBody [string match "k*" $key] + if {$inBody} { + set w $data(body).img_$key,$col + } else { + set w $data(hdrTxt).img_$key,$col + } + if {![winfo exists $w]} { + # + # Create a label widget and replace the binding tag + # Label with either $data(bodyTag) and TablelistBody + # or data(headerTag) in the list of its binding tags + # tk::label $w -anchor $anchor -borderwidth 0 -height 0 \ -highlightthickness 0 -image $data($key,$col-image) \ -padx 0 -pady 0 -relief flat -takefocus 0 -width $width - bindtags $w [lreplace [bindtags $w] 1 1 $data(bodyTag) TablelistBody] + if {$inBody} { + bindtags $w [lreplace [bindtags $w] 1 1 $data(bodyTag) \ + TablelistBody] + } else { + bindtags $w [lreplace [bindtags $w] 1 1 $data(headerTag) \ + TablelistHeader] + } } - updateColorsWhenIdle $win + if {$inBody} { + updateColorsWhenIdle $win + } else { + hdr_updateColorsWhenIdle $win + } return $w } @@ -1169,15 +1373,28 @@ proc tablelist::displayImage {win key col anchor width} { #------------------------------------------------------------------------------ proc tablelist::displayText {win key col text font pixels alignment} { upvar ::tablelist::ns${win}::data data - set w $data(body).msg_$key,$col + set inBody [string match "k*" $key] + if {$inBody} { + set w $data(body).msg_$key,$col + } else { + set w $data(hdrTxt).msg_$key,$col + } + if {![winfo exists $w]} { # - # Create a message widget and replace the binding tag Message with - # $data(bodyTag) and TablelistBody in the list of its binding tags + # Create a message widget and replace the binding tag + # Message with either $data(bodyTag) and TablelistBody + # or data(headerTag) in the list of its binding tags # message $w -borderwidth 0 -highlightthickness 0 -padx 0 -pady 0 \ -relief flat -takefocus 0 - bindtags $w [lreplace [bindtags $w] 1 1 $data(bodyTag) TablelistBody] + if {$inBody} { + bindtags $w [lreplace [bindtags $w] 1 1 $data(bodyTag) \ + TablelistBody] + } else { + bindtags $w [lreplace [bindtags $w] 1 1 $data(headerTag) \ + TablelistHeader] + } } variable anchors @@ -1188,7 +1405,11 @@ proc tablelist::displayText {win key col text font pixels alignment} { $w configure -anchor $anchors($alignment) -font $font \ -justify $alignment -text $text -width $width - updateColorsWhenIdle $win + if {$inBody} { + updateColorsWhenIdle $win + } else { + hdr_updateColorsWhenIdle $win + } return $w } @@ -1210,7 +1431,12 @@ proc tablelist::getAuxData {win key col auxTypeName auxWidthName {pixels 0}} { set auxType 2 ;# static-width window set auxWidth $data($key,$col-reqWidth) } - return $data(body).frm_$key,$col + + if {[string match "k*" $key]} { + return $data(body).frm_$key,$col + } else { + return $data(hdrTxt).frm_$key,$col + } } elseif {[info exists data($key,$col-image)]} { set auxType 1 ;# image set auxWidth [image width $data($key,$col-image)] @@ -1527,7 +1753,7 @@ proc tablelist::insertMlElem {w index msgScript aux auxType alignment #------------------------------------------------------------------------------ # tablelist::updateCell # -# Updates the contents of the text widget w starting at index1 and ending just +# Updates the content of the text widget w starting at index1 and ending just # before index2 by keeping the auxiliary object (image or window) (if any) and # replacing only the text between the two character positions. #------------------------------------------------------------------------------ @@ -1538,11 +1764,12 @@ proc tablelist::updateCell {w index1 index2 text aux auxType auxWidth $w tag add select $index1 $index2 } + variable pu if {$indentWidth != 0} { if {[insertOrUpdateIndent $w $index1 $indent $indentWidth]} { - set index2 $index2+1c + set index2 $index2+1$pu } - set index1 $index1+1c + set index1 $index1+1$pu } if {$auxWidth == 0} { ;# no image or window @@ -1571,12 +1798,12 @@ proc tablelist::updateCell {w index1 index2 text aux auxType auxWidth if {$auxType == 1} { ;# image if {[setImgLabelWidth $w $index1 $auxWidth]} { set auxFound 1 - set fromIdx $index1+1c + set fromIdx $index1+1$pu set toIdx $index2 - } elseif {[setImgLabelWidth $w $index2-1c $auxWidth]} { + } elseif {[setImgLabelWidth $w $index2-1$pu $auxWidth]} { set auxFound 1 set fromIdx $index1 - set toIdx $index2-1c + set toIdx $index2-1$pu } else { set auxFound 0 set fromIdx $index1 @@ -1590,13 +1817,13 @@ proc tablelist::updateCell {w index1 index2 text aux auxType auxWidth if {[string compare [lindex [$w dump -window $index1] 1] \ $aux] == 0} { set auxFound 1 - set fromIdx $index1+1c + set fromIdx $index1+1$pu set toIdx $index2 - } elseif {[string compare [lindex [$w dump -window $index2-1c] 1] \ - $aux] == 0} { + } elseif {[string compare \ + [lindex [$w dump -window $index2-1$pu] 1] $aux] == 0} { set auxFound 1 set fromIdx $index1 - set toIdx $index2-1c + set toIdx $index2-1$pu } else { set auxFound 0 set fromIdx $index1 @@ -1642,7 +1869,7 @@ proc tablelist::updateCell {w index1 index2 text aux auxType auxWidth place $aux.w -anchor nw -relwidth 1.0 -relx 0.0 } } - set index $index1+1c + set index $index1+1$pu } if {[string compare $valignment [$w window cget $index1 -align]] != 0} { @@ -1668,7 +1895,7 @@ proc tablelist::updateCell {w index1 index2 text aux auxType auxWidth #------------------------------------------------------------------------------ # tablelist::updateMlCell # -# Updates the contents of the text widget w starting at index1 and ending just +# Updates the content of the text widget w starting at index1 and ending just # before index2 by keeping the auxiliary object (image or window) (if any) and # replacing only the multiline text between the two character positions. #------------------------------------------------------------------------------ @@ -1679,16 +1906,17 @@ proc tablelist::updateMlCell {w index1 index2 msgScript aux auxType auxWidth $w tag add select $index1 $index2 } + variable pu if {$indentWidth != 0} { if {[insertOrUpdateIndent $w $index1 $indent $indentWidth]} { - set index2 $index2+1c + set index2 $index2+1$pu } - set index1 $index1+1c + set index1 $index1+1$pu } if {$auxWidth == 0} { ;# no image or window set areEqual [$w compare $index1 == $index2] - $w delete $index1+1c $index2 + $w delete $index1+1$pu $index2 set padY [expr {[$w cget -spacing1] == 0}] if {[catch {$w window cget $index1 -create} script] == 0 && [string match "::tablelist::displayText*" $script]} { @@ -1717,12 +1945,12 @@ proc tablelist::updateMlCell {w index1 index2 msgScript aux auxType auxWidth if {[setImgLabelWidth $w $index1 $auxWidth]} { set auxFound 1 if {[string compare $alignment "right"] == 0} { - $w delete $index1+1c $index2 + $w delete $index1+1$pu $index2 } - } elseif {[setImgLabelWidth $w $index2-1c $auxWidth]} { + } elseif {[setImgLabelWidth $w $index2-1$pu $auxWidth]} { set auxFound 1 if {[string compare $alignment "right"] != 0} { - $w delete $index1 $index2-1c + $w delete $index1 $index2-1$pu } } else { set auxFound 0 @@ -1737,13 +1965,13 @@ proc tablelist::updateMlCell {w index1 index2 msgScript aux auxType auxWidth $aux] == 0} { set auxFound 1 if {[string compare $alignment "right"] == 0} { - $w delete $index1+1c $index2 + $w delete $index1+1$pu $index2 } - } elseif {[string compare [lindex [$w dump -window $index2-1c] 1] \ - $aux] == 0} { + } elseif {[string compare \ + [lindex [$w dump -window $index2-1$pu] 1] $aux] == 0} { set auxFound 1 if {[string compare $alignment "right"] != 0} { - $w delete $index1 $index2-1c + $w delete $index1 $index2-1$pu } } else { set auxFound 0 @@ -1757,7 +1985,7 @@ proc tablelist::updateMlCell {w index1 index2 msgScript aux auxType auxWidth # if {[string compare $alignment "right"] == 0} { if {$auxType == 1} { ;# image - setImgLabelAnchor $w index2Mark-1c e + setImgLabelAnchor $w index2Mark-1$pu e } else { ;# window if {$auxType == 2} { ;# static width place $aux.w -anchor ne -relwidth "" -relx 1.0 @@ -1765,8 +1993,8 @@ proc tablelist::updateMlCell {w index1 index2 msgScript aux auxType auxWidth place $aux.w -anchor ne -relwidth 1.0 -relx 1.0 } } - set auxIdx index2Mark-1c - set msgIdx index2Mark-2c + set auxIdx index2Mark-1$pu + set msgIdx index2Mark-2$pu } else { if {$auxType == 1} { ;# image setImgLabelAnchor $w $index1 w @@ -1778,7 +2006,7 @@ proc tablelist::updateMlCell {w index1 index2 msgScript aux auxType auxWidth } } set auxIdx $index1 - set msgIdx $index1+1c + set msgIdx $index1+1$pu } if {[string compare $valignment [$w window cget $auxIdx -align]] != 0} { @@ -1797,15 +2025,15 @@ proc tablelist::updateMlCell {w index1 index2 msgScript aux auxType auxWidth eval $msgScript } } elseif {[string compare $alignment "right"] == 0} { - $w window create index2Mark-1c \ + $w window create index2Mark-1$pu \ -align top -pady $padY -create $msgScript - $w tag add elidedWin index2Mark-1c - $w delete $index1 index2Mark-2c + $w tag add elidedWin index2Mark-1$pu + $w delete $index1 index2Mark-2$pu } else { - $w window create $index1+1c \ + $w window create $index1+1$pu \ -align top -pady $padY -create $msgScript - $w tag add elidedWin $index1+1c - $w delete $index1+2c index2Mark + $w tag add elidedWin $index1+1$pu + $w delete $index1+2$pu index2Mark } } else { # @@ -1925,15 +2153,17 @@ proc tablelist::appendComplexElem {win key row col text pixels alignment # # Insert the text and the auxiliary object (if any) just before the newline # - set w $data(body) + set inBody [string match "k*" $key] + set w [expr {$inBody ? $data(body) : $data(hdrTxt)}] set idx [$w index $line.end] + variable pu if {$auxWidth == 0} { ;# no image or window if {$multiline} { $w insert $line.end "\t\t" $cellTags set padY [expr {[$w cget -spacing1] == 0}] - $w window create $line.end-1c \ + $w window create $line.end-1$pu \ -align top -pady $padY -create $msgScript - $w tag add elidedWin $line.end-1c + $w tag add elidedWin $line.end-1$pu } else { $w insert $line.end "\t$text\t" $cellTags } @@ -1954,16 +2184,21 @@ proc tablelist::appendComplexElem {win key row col text pixels alignment -highlightthickness 0 -relief flat \ -takefocus 0 -width $auxWidth catch {$aux configure -padx 0 -pady 0} - bindtags $aux [linsert [bindtags $aux] 1 \ - $data(bodyTag) TablelistBody] + if {$inBody} { + bindtags $aux [linsert [bindtags $aux] 1 \ + $data(bodyTag) TablelistBody] + } else { + bindtags $aux [linsert [bindtags $aux] 1 \ + $data(headerTag) TablelistHeader] + } uplevel #0 $data($key,$col-window) [list $win $row $col $aux.w] } if {$multiline} { - insertMlElem $w $line.end-1c $msgScript $aux $auxType $alignment \ - [getVAlignment $win $key $col] + insertMlElem $w $line.end-1$pu $msgScript $aux $auxType \ + $alignment [getVAlignment $win $key $col] } else { - insertElem $w $line.end-1c $text $aux $auxType $alignment \ - [getVAlignment $win $key $col] + insertElem $w $line.end-1$pu $text $aux $auxType \ + $alignment [getVAlignment $win $key $col] } } @@ -1971,7 +2206,8 @@ proc tablelist::appendComplexElem {win key row col text pixels alignment # Insert the indentation image, if any # if {$indentWidth != 0} { - insertOrUpdateIndent $w $idx+1c $indent $indentWidth + variable pu + insertOrUpdateIndent $w $idx+1$pu $indent $indentWidth } } @@ -2137,7 +2373,7 @@ proc tablelist::setupColumns {win columns createLabels} { destroy $w } foreach w [winfo children $win] { - if {[regexp {^(vsep[0-9]+|hsep)$} [winfo name $w]]} { + if {[regexp {^(vsep[0-9]+|hsep2)$} [winfo name $w]]} { destroy $w } } @@ -2296,7 +2532,7 @@ proc tablelist::setupColumns {win columns createLabels} { set treeCol $data(-treecolumn) adjustColIndex $win treeCol set data(treeCol) $treeCol - if {$data(colCount) != 0} { + if {$data(colCount) != 0} { set data(-treecolumn) $treeCol } } @@ -2346,9 +2582,9 @@ proc tablelist::createSeps win { } # - # Create the horizontal separator + # Create the lower horizontal separator # - set w $data(hsep) + set w $data(hsep)2 if {$usingTile} { ttk::separator $w -style Seps$win.TSeparator -cursor $data(-cursor) \ -takefocus 0 @@ -2363,7 +2599,7 @@ proc tablelist::createSeps win { # TablelistBody in the list of binding tags of the horizontal separator # bindtags $w [lreplace [bindtags $w] 1 1 $data(bodyTag) TablelistBody] - + adjustSepsWhenIdle $win } @@ -2401,19 +2637,19 @@ proc tablelist::adjustSeps win { # # Get the height to be applied to the column separators - # and place or unmanage the horizontal separator + # and place or unmanage the lower horizontal separator # set w $data(body) if {$data(-fullseparators)} { set sepHeight [winfo height $w] - if {[winfo exists $data(hsep)]} { - place forget $data(hsep) + if {[winfo exists $data(hsep)2]} { + place forget $data(hsep)2 } } else { set btmTextIdx [$w index @0,$data(btmY)] set btmLine [expr {int($btmTextIdx)}] - if {$btmLine > $data(itemCount)} { ;# text widget bug + if {$btmLine > $data(itemCount)} { set btmLine $data(itemCount) set btmTextIdx $btmLine.0 } @@ -2428,19 +2664,19 @@ proc tablelist::adjustSeps win { if {$data(-showhorizseparator) && $data(-showseparators) && $sepHeight > 0 && $sepHeight < [winfo height $w]} { set width [expr {[winfo reqwidth $data(hdrTxtFrm)] + $sepX - - [winfo reqheight $data(hsep)] + 1}] + [winfo reqheight $data(hsep)2] + 1}] if {$onWindows && !$usingTile} { incr width } - place $data(hsep) -in $w -y $sepHeight -width $width - } elseif {[winfo exists $data(hsep)]} { - place forget $data(hsep) + place $data(hsep)2 -in $w -y $sepHeight -width $width + } elseif {[winfo exists $data(hsep)2]} { + place forget $data(hsep)2 } } # - # Set the height of the main separator (if any) and attach the - # latter to the right edge of the last non-hidden title column + # Set the height of the vertical main separator (if any) and attach + # the latter to the right edge of the last non-hidden title column # set startCol [expr {$data(-titlecolumns) - 1}] if {$startCol > $data(lastCol)} { @@ -2466,10 +2702,28 @@ proc tablelist::adjustSeps win { raise $w } + # + # Place or unmanage the upper horizontal separator (if any) + # + set w $data(hsep)1 + if {[winfo exists $w]} { + if {$data(hdr_itemCount) == 0} { + place forget $w + } else { + set width [expr {[winfo reqwidth $data(hdrTxtFrm)] + $sepX - + [winfo reqheight $data(hsep)1] + 1}] + if {$onWindows && !$usingTile} { + incr width + } + place $w -in $data(hdr) -anchor sw -rely 1.0 -width $width + raise $w + } + } + # # Set the height and vertical position of the other column separators # - if {$sepHeight == 0} { + if {$sepHeight == 0 && $data(hdr_itemCount) == 0} { set relY 0.0 set y -10 } elseif {$data(-showlabels)} { @@ -2491,6 +2745,11 @@ proc tablelist::adjustSeps win { incr sepHeight 3 } } + incr sepHeight [expr {[winfo reqheight $data(hdr)] - + [winfo reqheight $data(hdrTxtFrm)]}] + if {!$data(-showlabels)} { + incr sepHeight -1 + } foreach w [winfo children $win] { if {[regexp {^vsep[0-9]+$} [winfo name $w]]} { place configure $w -height $sepHeight -rely $relY -y $y @@ -2530,8 +2789,8 @@ proc tablelist::getSepX {} { # tablelist::adjustColumns # # Applies some configuration options to the labels of the tablelist widget win, -# places them in the header frame, computes and sets the tab stops for the body -# text widget, and adjusts the width and height of the header frame. The +# places them in the header frame, computes and sets the tab stops for both +# text widgets, and adjusts the width and height of the header frame. The # whichWidths argument specifies the dynamic-width columns or labels whose # widths are to be computed when performing these operations. The stretchCols # argument specifies whether to stretch the stretchable columns. @@ -2546,11 +2805,11 @@ proc tablelist::adjustColumns {win whichWidths stretchCols} { [expr {$usingTile && [string compare [getCurrentTheme] "aqua"] == 0}] # - # Configure the labels and compute the positions of - # the tab stops to be set in the body text widget + # Configure the labels and compute the positions + # of the tab stops to be set in both text widgets # upvar ::tablelist::ns${win}::data data - set data(hdrPixels) 0 + set data(hdrWidth) 0 variable canElide variable centerArrows set tabs {} @@ -2686,8 +2945,9 @@ proc tablelist::adjustColumns {win whichWidths stretchCols} { place configure $data(hdrFrm) -x $x # - # Apply the value of tabs to the body text widget + # Apply the value of tabs to both text widgets # + $data(hdrTxt) configure -tabs $tabs if {[info exists data(colBeingResized)]} { $data(body) tag configure visibleLines -tabs $tabs } else { @@ -2706,7 +2966,7 @@ proc tablelist::adjustColumns {win whichWidths stretchCols} { } else { $data(hdr) configure -width 0 } - set data(hdrPixels) $x + set data(hdrWidth) $x adjustHeaderHeight $win # @@ -3008,7 +3268,38 @@ proc tablelist::computeColWidth {win col} { set data($col-widestCount) 0 # - # Column elements + # Column elements in the header text widget + # + set row -1 + foreach item $data(hdr_itemList) { + incr row + + if {$col >= [llength $item] - 1} { + continue + } + + set key [lindex $item end] + + set text [lindex $item $col] + if {$fmtCmdFlag} { + set text [formatElem $win $key $row $col $text] + } + if {[string match "*\t*" $text]} { + set text [mapTabs $text] + } + getAuxData $win $key $col auxType auxWidth + set cellFont [getCellFont $win $key $col] + set elemWidth [getElemWidth $win $text $auxWidth 0 $cellFont] + if {$elemWidth == $data($col-elemWidth)} { + incr data($col-widestCount) + } elseif {$elemWidth > $data($col-elemWidth)} { + set data($col-elemWidth) $elemWidth + set data($col-widestCount) 1 + } + } + + # + # Column elements in the body text widget # set row -1 foreach item $data(itemList) { @@ -3041,6 +3332,7 @@ proc tablelist::computeColWidth {win col} { set data($col-widestCount) 1 } } + set data($col-reqPixels) $data($col-elemWidth) # @@ -3084,57 +3376,78 @@ proc tablelist::computeLabelWidth {win col} { # height of its children. #------------------------------------------------------------------------------ proc tablelist::adjustHeaderHeight win { - # - # Compute the max. label height - # upvar ::tablelist::ns${win}::data data - set maxLabelHeight [winfo reqheight $data(hdrFrmLbl)] - for {set col 0} {$col < $data(colCount)} {incr col} { - set w $data(hdrTxtFrmLbl)$col - if {[string length [winfo manager $w]] == 0} { - continue - } - set reqHeight [winfo reqheight $w] - if {$reqHeight > $maxLabelHeight} { - set maxLabelHeight $reqHeight - } - - foreach l [getSublabels $w] { - if {[string length [winfo manager $l]] == 0} { + # + # Set the height of the header frame and some of its descendants + # + $data(hdrTxt) tag raise tinyFont + $data(hdrTxt) tag remove tinyFont 2.0 end + if {$data(-showlabels)} { + # + # Compute the max. label height + # + set maxLabelHeight [winfo reqheight $data(hdrFrmLbl)] + for {set col 0} {$col < $data(colCount)} {incr col} { + set w $data(hdrTxtFrmLbl)$col + if {[string length [winfo manager $w]] == 0} { continue } - set borderWidth [winfo pixels $w [$w cget -borderwidth]] - if {$borderWidth < 0} { - set borderWidth 0 - } - set reqHeight [expr {[winfo reqheight $l] + 2*$borderWidth}] + set reqHeight [winfo reqheight $w] if {$reqHeight > $maxLabelHeight} { set maxLabelHeight $reqHeight } + + foreach l [getSublabels $w] { + if {[string length [winfo manager $l]] == 0} { + continue + } + + set borderWidth [winfo pixels $w [$w cget -borderwidth]] + if {$borderWidth < 0} { + set borderWidth 0 + } + set reqHeight [expr {[winfo reqheight $l] + 2*$borderWidth}] + if {$reqHeight > $maxLabelHeight} { + set maxLabelHeight $reqHeight + } + } } - } - # - # Set the height of the header frame and adjust the separators - # - $data(hdrTxtFrm) configure -height $maxLabelHeight - if {$data(-showlabels)} { - $data(hdr) configure -height $maxLabelHeight + $data(hdrTxtFrm) configure -height $maxLabelHeight + if {$data(hdr_itemCount) == 0} { + set hdrHeight $maxLabelHeight + } else { + set hdrHeight [$data(hdrTxt) count -update -ypixels 1.0 end] + incr hdrHeight 2 + } + $data(hdr) configure -height $hdrHeight + $data(hdrFrm) configure -height $maxLabelHeight + place configure $data(hdrTxt) -y 0 place configure $data(hdrFrm) -y 0 $data(corner) configure -height $maxLabelHeight place configure $data(cornerLbl) -y 0 } else { - $data(hdr) configure -height 1 + $data(hdrTxtFrm) configure -height 1 + if {$data(hdr_itemCount) == 0} { + set hdrHeight 1 + } else { + set hdrHeight [$data(hdrTxt) count -update -ypixels 1.0 end] + incr hdrHeight 2 + } + $data(hdr) configure -height $hdrHeight + $data(hdrFrm) configure -height 1 + place configure $data(hdrTxt) -y -1 place configure $data(hdrFrm) -y -1 $data(corner) configure -height 1 place configure $data(cornerLbl) -y -1 } + adjustSepsWhenIdle $win } @@ -3170,7 +3483,7 @@ proc tablelist::stretchColumns {win colOfFixedDelta} { set forceAdjust $data(forceAdjust) set data(forceAdjust) 0 - if {$data(hdrPixels) == 0 || $data(-width) <= 0} { + if {$data(hdrWidth) == 0 || $data(-width) <= 0} { return "" } @@ -3304,8 +3617,9 @@ proc tablelist::moveActiveTag win { } elseif {$activeLine > 0 && $activeCol < $data(colCount) && !$data($activeCol-hide)} { $w tag add curRow $activeLine.0 $activeLine.end - findTabs $win $activeLine $activeCol $activeCol tabIdx1 tabIdx2 - $w tag add active $tabIdx1 $tabIdx2+1c + findTabs $win $w $activeLine $activeCol $activeCol tabIdx1 tabIdx2 + variable pu + $w tag add active $tabIdx1 $tabIdx2+1$pu updateColors $win $activeLine.0 $activeLine.end } } @@ -3315,8 +3629,8 @@ proc tablelist::moveActiveTag win { # # Arranges for the background and foreground colors of the label, frame, and # message widgets containing the currently visible images, embedded windows, -# and multiline elements of the tablelist widget win to be updated at idle -# time. +# and multiline elements in the body text widget of the tablelist widget win to +# be updated at idle time. #------------------------------------------------------------------------------ proc tablelist::updateColorsWhenIdle win { upvar ::tablelist::ns${win}::data data @@ -3332,7 +3646,7 @@ proc tablelist::updateColorsWhenIdle win { # # Updates the background and foreground colors of the label, frame, and message # widgets containing the currently visible images, embedded windows, and -# multiline elements of the tablelist widget win. +# multiline elements in the body text widget of the tablelist widget win. #------------------------------------------------------------------------------ proc tablelist::updateColors {win {fromTextIdx ""} {toTextIdx ""}} { upvar ::tablelist::ns${win}::data data @@ -3356,6 +3670,7 @@ proc tablelist::updateColors {win {fromTextIdx ""} {toTextIdx ""}} { return "" } + variable pu set w $data(body) if {$updateAll} { set topTextIdx [$w index @0,0] @@ -3379,7 +3694,7 @@ proc tablelist::updateColors {win {fromTextIdx ""} {toTextIdx ""}} { set rightCol [colIndex $win @$data(rightX),0 0 0] set topLine [expr {int($topTextIdx)}] set btmLine [expr {int($btmTextIdx)}] - if {$btmLine > $data(itemCount)} { ;# text widget bug + if {$btmLine > $data(itemCount)} { set btmLine $data(itemCount) } for {set line $topLine; set row [expr {$line - 1}]} \ @@ -3396,7 +3711,7 @@ proc tablelist::updateColors {win {fromTextIdx ""} {toTextIdx ""}} { # -(select)background and -(select)foreground column, # row, and cell configuration options in this row # - findTabs $win $line $leftCol $leftCol tabIdx1 tabIdx2 + findTabs $win $w $line $leftCol $leftCol tabIdx1 tabIdx2 set lineTagNames [$w tag names $tabIdx1] set inStripe [expr {[lsearch -exact $lineTagNames stripe] >= 0}] for {set col $leftCol} {$col <= $rightCol} {incr col} { @@ -3404,7 +3719,7 @@ proc tablelist::updateColors {win {fromTextIdx ""} {toTextIdx ""}} { continue } - set textIdx2 [$w index $tabIdx2+1c] + set textIdx2 [$w index $tabIdx2+1$pu] set cellTagNames [$w tag names $tabIdx2] foreach tag $cellTagNames { @@ -3451,7 +3766,7 @@ proc tablelist::updateColors {win {fromTextIdx ""} {toTextIdx ""}} { } set tabIdx1 $textIdx2 - set tabIdx2 [$w search $elide "\t" $tabIdx1+1c $line.end] + set tabIdx2 [$w search $elide "\t" $tabIdx1+1$pu $line.end] } } } @@ -3488,8 +3803,8 @@ proc tablelist::updateColors {win {fromTextIdx ""} {toTextIdx ""}} { # if {[string compare $path $w.ind_$key,$col] == 0} { if {$data(protectIndents)} { - set fromTextIdx [$w index $textIdx-1c] - set toTextIdx [$w index $textIdx+1c] + set fromTextIdx [$w index $textIdx-1$pu] + set toTextIdx [$w index $textIdx+1$pu] $w tag remove curRow $fromTextIdx $toTextIdx $w tag remove active $fromTextIdx $toTextIdx @@ -3624,37 +3939,192 @@ proc tablelist::updateColors {win {fromTextIdx ""} {toTextIdx ""}} { } #------------------------------------------------------------------------------ -# tablelist::updateScrlColOffsetWhenIdle +# tablelist::hdr_updateColorsWhenIdle # -# Arranges for the scrolled column offset of the tablelist widget win to be -# updated at idle time. +# Arranges for the background and foreground colors of the label, frame, and +# message widgets containing the currently visible images, embedded windows, +# and multiline elements in the header text widget of the tablelist widget win +# to be updated at idle time. #------------------------------------------------------------------------------ -proc tablelist::updateScrlColOffsetWhenIdle win { +proc tablelist::hdr_updateColorsWhenIdle win { upvar ::tablelist::ns${win}::data data - if {[info exists data(offsetId)]} { + if {[info exists data(hdr_colorsId)]} { return "" } - set data(offsetId) [after idle [list tablelist::updateScrlColOffset $win]] + set data(hdr_colorsId) [after idle [list tablelist::hdr_updateColors $win]] } #------------------------------------------------------------------------------ -# tablelist::updateScrlColOffset +# tablelist::hdr_updateColors # -# Updates the scrolled column offset of the tablelist widget win to fit into -# the allowed range. +# Updates the background and foreground colors of the label, frame, and message +# widgets containing the currently visible images, embedded windows, and +# multiline elements in the header text widget of the tablelist widget win. #------------------------------------------------------------------------------ -proc tablelist::updateScrlColOffset win { +proc tablelist::hdr_updateColors win { upvar ::tablelist::ns${win}::data data - if {[info exists data(offsetId)]} { - after cancel $data(offsetId) - unset data(offsetId) + if {[info exists data(hdr_colorsId)]} { + after cancel $data(hdr_colorsId) + unset data(hdr_colorsId) } - set maxScrlColOffset [getMaxScrlColOffset $win] - if {$data(scrlColOffset) > $maxScrlColOffset} { - set data(scrlColOffset) $maxScrlColOffset - adjustElidedText $win + set leftCol [colIndex $win @0,0 0 0] + if {$leftCol < 0} { + return "" + } + + set w $data(hdrTxt) + if {$data(isDisabled)} { + $w tag add disabled 2.0 end + } + + if {[string length $data(-colorizecommand)] == 0} { + set hasColorizeCmd 0 + } else { + set hasColorizeCmd 1 + set colorizeCmd $data(-colorizecommand) + } + + variable canElide + variable elide + variable pu + set rightCol [colIndex $win @$data(rightX),0 0 0] + for {set row 0; set line 2} {$row < $data(hdr_itemCount)} \ + {incr row; incr line} { + set key [lindex $data(hdr_keyList) $row] + + findTabs $win $w $line $leftCol $leftCol tabIdx1 tabIdx2 + for {set col $leftCol} {$col <= $rightCol} {incr col} { + if {$data($col-hide) && !$canElide} { + continue + } + + set textIdx2 [$w index $tabIdx2+1$pu] + + set cellTagNames [$w tag names $tabIdx2] + foreach tag $cellTagNames { + if {[string match "*-*ground-*" $tag]} { + $w tag remove $tag $tabIdx1 $textIdx2 + } + } + + foreach opt {-background -foreground} { + foreach level [list col row cell] \ + name [list $col$opt $key$opt $key,$col$opt] { + if {[info exists data($name)]} { + $w tag add $level$opt-$data($name) $tabIdx1 $textIdx2 + } + } + } + + if {$hasColorizeCmd} { + uplevel #0 $colorizeCmd [list $win $w $key $row $col \ + $tabIdx1 $tabIdx2 0 0] + } + + set tabIdx1 $textIdx2 + set tabIdx2 [$w search $elide "\t" $tabIdx1+1$pu $line.end] + } + } + + foreach {dummy path textIdx} [$w dump -window 2.0 end] { + if {[string length $path] == 0} { + continue + } + + set class [winfo class $path] + set isLabel [expr {[string compare $class "Label"] == 0}] + set isTblWin [expr {[string compare $class "TablelistWindow"] == 0}] + set isMessage [expr {[string compare $class "Message"] == 0}] + if {!$isLabel && !$isTblWin && !$isMessage} { + continue + } + + set name [winfo name $path] + foreach {key col} [split [string range $name 4 end] ","] {} + + # + # Set the widget's background and foreground + # colors to those of the containing cell + # + if {$data(isDisabled)} { + set bg $data(-background) + set fg $data(-disabledforeground) + } else { + if {[info exists data($key,$col-background)]} { + set bg $data($key,$col-background) + } elseif {[info exists data($key-background)]} { + set bg $data($key-background) + } else { + if {[info exists data($col-background)]} { + set bg $data($col-background) + } else { + set bg $data(-background) + } + } + + if {$isMessage || $isTblWin} { + if {[info exists data($key,$col-foreground)]} { + set fg $data($key,$col-foreground) + } elseif {[info exists data($key-foreground)]} { + set fg $data($key-foreground) + } else { + if {[info exists data($col-foreground)]} { + set fg $data($col-foreground) + } else { + set fg $data(-foreground) + } + } + } + } + if {[string compare [$path cget -background] $bg] != 0} { + $path configure -background $bg + } + if {$isMessage && [string compare [$path cget -foreground] $fg] != 0} { + $path configure -foreground $fg + } + if {$isTblWin && [info exists data($key,$col-windowupdate)]} { + uplevel #0 $data($key,$col-windowupdate) [list \ + $win [hdr_keyToRow $win $key] $col $path.w \ + -background $bg -foreground $fg] + } + } +} + +#------------------------------------------------------------------------------ +# tablelist::updateScrlColOffsetWhenIdle +# +# Arranges for the scrolled column offset of the tablelist widget win to be +# updated at idle time. +#------------------------------------------------------------------------------ +proc tablelist::updateScrlColOffsetWhenIdle win { + upvar ::tablelist::ns${win}::data data + if {[info exists data(offsetId)]} { + return "" + } + + set data(offsetId) [after idle [list tablelist::updateScrlColOffset $win]] +} + +#------------------------------------------------------------------------------ +# tablelist::updateScrlColOffset +# +# Updates the scrolled column offset of the tablelist widget win to fit into +# the allowed range. +#------------------------------------------------------------------------------ +proc tablelist::updateScrlColOffset win { + upvar ::tablelist::ns${win}::data data + if {[info exists data(offsetId)]} { + after cancel $data(offsetId) + unset data(offsetId) + } + + set maxScrlColOffset [getMaxScrlColOffset $win] + if {$data(scrlColOffset) > $maxScrlColOffset} { + set data(scrlColOffset) $maxScrlColOffset + hdr_adjustElidedText $win + adjustElidedText $win redisplayVisibleItems $win } } @@ -3803,8 +4273,8 @@ proc tablelist::purgeWidgets win { #------------------------------------------------------------------------------ # tablelist::adjustElidedText # -# Updates the elided text ranges of the body text child of the tablelist widget -# win. +# Updates the elided text ranges of the body text widget of the tablelist +# widget win. #------------------------------------------------------------------------------ proc tablelist::adjustElidedText win { upvar ::tablelist::ns${win}::data data @@ -3824,10 +4294,11 @@ proc tablelist::adjustElidedText win { # variable canElide variable elide + variable pu if {$canElide && $data(hiddenColCount) > 0 && $data(itemCount) > 0} { set topLine [expr {int([$w index @0,0])}] set btmLine [expr {int([$w index @0,$data(btmY)])}] - if {$btmLine > $data(itemCount)} { ;# text widget bug + if {$btmLine > $data(itemCount)} { set btmLine $data(itemCount) } for {set line $topLine; set row [expr {$line - 1}]} \ @@ -3843,8 +4314,8 @@ proc tablelist::adjustElidedText win { {$col < $data(colCount) && $count < $data(hiddenColCount)} \ {incr col} { set textIdx2 \ - [$w search $elide "\t" $textIdx1+1c $line.end]+1c - if {[string compare $textIdx2 "+1c"] == 0} { + [$w search $elide "\t" $textIdx1+1$pu $line.end]+1$pu + if {[string compare $textIdx2 "+1$pu"] == 0} { break } if {$data($col-hide)} { @@ -3859,7 +4330,7 @@ proc tablelist::adjustElidedText win { # change due to the "hiddenCol" tag # set btmLine [expr {int([$w index @0,$data(btmY)])}] - if {$btmLine > $data(itemCount)} { ;# text widget bug + if {$btmLine > $data(itemCount)} { set btmLine $data(itemCount) } } @@ -3878,8 +4349,8 @@ proc tablelist::adjustElidedText win { {$col < $data(colCount) && $count < $data(hiddenColCount)} \ {incr col} { set textIdx2 \ - [$w search $elide "\t" $textIdx1+1c $line.end]+1c - if {[string compare $textIdx2 "+1c"] == 0} { + [$w search $elide "\t" $textIdx1+1$pu $line.end]+1$pu + if {[string compare $textIdx2 "+1$pu"] == 0} { break } if {$data($col-hide)} { @@ -3943,7 +4414,7 @@ proc tablelist::adjustElidedText win { if {$data(itemCount) > 0} { set topLine [expr {int([$w index @0,0])}] set btmLine [expr {int([$w index @0,$data(btmY)])}] - if {$btmLine > $data(itemCount)} { ;# text widget bug + if {$btmLine > $data(itemCount)} { set btmLine $data(itemCount) } for {set line $topLine; set row [expr {$line - 1}]} \ @@ -3951,8 +4422,9 @@ proc tablelist::adjustElidedText win { set key [lindex $data(keyList) $row] if {![info exists data($key-elide)] && ![info exists data($key-hide)]} { - if {[findTabs $win $line $firstCol $lastCol tabIdx1 tabIdx2]} { - $w tag add elidedCol $tabIdx1 $tabIdx2+1c + if {[findTabs $win $w $line $firstCol $lastCol \ + tabIdx1 tabIdx2]} { + $w tag add elidedCol $tabIdx1 $tabIdx2+1$pu } } @@ -3960,7 +4432,7 @@ proc tablelist::adjustElidedText win { # Update btmLine because it may change due to the "elidedCol" tag # set btmLine [expr {int([$w index @0,$data(btmY)])}] - if {$btmLine > $data(itemCount)} { ;# text widget bug + if {$btmLine > $data(itemCount)} { set btmLine $data(itemCount) } } @@ -3971,9 +4443,9 @@ proc tablelist::adjustElidedText win { set key [lindex $data(keyList) $row] if {![info exists data($key-elide)] && ![info exists data($key-hide)]} { - if {[findTabs $win $line $firstCol $lastCol \ + if {[findTabs $win $w $line $firstCol $lastCol \ tabIdx1 tabIdx2]} { - $w tag add elidedCol $tabIdx1 $tabIdx2+1c + $w tag add elidedCol $tabIdx1 $tabIdx2+1$pu } } @@ -3995,6 +4467,105 @@ proc tablelist::adjustElidedText win { adjustColumns $win {} 0 } +#------------------------------------------------------------------------------ +# tablelist::hdr_adjustElidedText +# +# Updates the elided text ranges of the header text widget of the tablelist +# widget win. +#------------------------------------------------------------------------------ +proc tablelist::hdr_adjustElidedText win { + # + # Remove the "hiddenCol" tag + # + upvar ::tablelist::ns${win}::data data + set w $data(hdrTxt) + $w tag remove hiddenCol 1.0 end + + # + # Add the "hiddenCol" tag to the contents of the hidden columns + # + variable canElide + variable elide + variable pu + if {$canElide && $data(hiddenColCount) > 0} { + for {set row 0; set line 2} {$row < $data(hdr_itemCount)} \ + {incr row; incr line} { + set textIdx1 $line.0 + for {set col 0; set count 0} \ + {$col < $data(colCount) && $count < $data(hiddenColCount)} \ + {incr col} { + set textIdx2 \ + [$w search $elide "\t" $textIdx1+1$pu $line.end]+1$pu + if {[string compare $textIdx2 "+1$pu"] == 0} { + break + } + if {$data($col-hide)} { + incr count + $w tag add hiddenCol $textIdx1 $textIdx2 + } + set textIdx1 $textIdx2 + } + } + } + + if {$data(-titlecolumns) == 0} { + return "" + } + + # + # Remove the "elidedCol" tag + # + $w tag remove elidedCol 1.0 end + for {set col 0} {$col < $data(colCount)} {incr col} { + set data($col-elide) 0 + } + + if {$data(scrlColOffset) == 0} { + adjustColumns $win {} 0 + return "" + } + + # + # Find max. $data(scrlColOffset) non-hidden columns with indices >= + # $data(-titlecolumns) and retain the first and last of these indices + # + set firstCol $data(-titlecolumns) + while {$firstCol < $data(colCount) && $data($firstCol-hide)} { + incr firstCol + } + if {$firstCol >= $data(colCount)} { + return "" + } + set lastCol $firstCol + set nonHiddenCount 1 + while {$nonHiddenCount < $data(scrlColOffset) && + $lastCol < $data(colCount)} { + incr lastCol + if {!$data($lastCol-hide)} { + incr nonHiddenCount + } + } + + # + # Add the "elidedCol" tag to the contents of these columns + # + for {set row 0; set line 2} {$row < $data(hdr_itemCount)} \ + {incr row; incr line} { + if {[findTabs $win $w $line $firstCol $lastCol \ + tabIdx1 tabIdx2]} { + $w tag add elidedCol $tabIdx1 $tabIdx2+1$pu + } + } + + # + # Adjust the columns + # + for {set col $firstCol} {$col <= $lastCol} {incr col} { + set data($col-elide) 1 + } + adjustColumns $win {} 0 +} + #------------------------------------------------------------------------------ # tablelist::redisplayWhenIdle # @@ -4030,6 +4601,86 @@ proc tablelist::redisplay {win {getSelCells 1} {selCells {}}} { unset data(redispId) } + set snipStr $data(-snipstring) + variable canElide + variable snipSides + + set w $data(hdrTxt) + set padY [expr {[$w cget -spacing1] == 0}] + set hdr_newItemList {} + set row 0 + set line 2 + foreach item $data(hdr_itemList) { + # + # Empty the line, clip the elements if necessary, + # and insert them with the corresponding tags + # + $w delete $line.0 $line.end + set keyIdx [expr {[llength $item] - 1}] + set key [lindex $item end] + set hasRowFont [info exists data($key-font)] + set newItem {} + set col 0 + foreach fmtCmdFlag $data(fmtCmdFlagList) \ + colFont $data(colFontList) \ + colTags $data(colTagsList) \ + {pixels alignment} $data(colList) { + if {$col < $keyIdx} { + set text [lindex $item $col] + } else { + set text "" + } + lappend newItem $text + + if {$data($col-hide) && !$canElide} { + incr col + continue + } + + if {$fmtCmdFlag} { + set text [formatElem $win $key $row $col $text] + } + if {[string match "*\t*" $text]} { + set text [mapTabs $text] + } + + # + # Build the list of tags to be applied to the cell + # + if {$hasRowFont} { + set cellFont $data($key-font) + } else { + set cellFont $colFont + } + set cellTags $colTags + if {[info exists data($key,$col-font)]} { + set cellFont $data($key,$col-font) + lappend cellTags cell-font-$data($key,$col-font) + } + + # + # Insert the text and the label or window + # (if any) into the header text widget + # + appendComplexElem $win $key $row $col $text $pixels \ + $alignment $snipStr $cellFont $cellTags $line + + incr col + } + + if {[info exists data($key-font)]} { + $w tag add row-font-$data($key-font) $line.0 $line.end + } + + lappend newItem $key + lappend hdr_newItemList $newItem + + incr row + incr line + } + + set data(hdr_itemList) $hdr_newItemList + # # Save the indices of the selected cells # @@ -4045,15 +4696,13 @@ proc tablelist::redisplay {win {getSelCells 1} {selCells {}}} { saveEditData $win } - set w $data(body) - set snipStr $data(-snipstring) + variable pu set rowTagRefCount $data(rowTagRefCount) set cellTagRefCount $data(cellTagRefCount) set isSimple [expr {$data(imgCount) == 0 && $data(winCount) == 0 && $data(indentCount) == 0}] + set w $data(body) set padY [expr {[$w cget -spacing1] == 0}] - variable canElide - variable snipSides set newItemList {} set row 0 set line 1 @@ -4174,7 +4823,7 @@ proc tablelist::redisplay {win {getSelCells 1} {selCells {}}} { # Embed the message widgets displaying multiline elements # foreach {col text font pixels alignment} $multilineData { - if {[findTabs $win $line $col $col tabIdx1 tabIdx2]} { + if {[findTabs $win $w $line $col $col tabIdx1 tabIdx2]} { set msgScript [list ::tablelist::displayText $win $key \ $col $text $font $pixels $alignment] $w window create $tabIdx2 \ @@ -4241,10 +4890,10 @@ proc tablelist::redisplay {win {getSelCells 1} {selCells {}}} { } if {[info exists data($key-elide)]} { - $w tag add elidedRow $line.0 $line.end+1c + $w tag add elidedRow $line.0 $line.end+1$pu } if {[info exists data($key-hide)]} { - $w tag add hiddenRow $line.0 $line.end+1c + $w tag add hiddenRow $line.0 $line.end+1$pu } lappend newItem $key @@ -4276,6 +4925,7 @@ proc tablelist::redisplay {win {getSelCells 1} {selCells {}}} { # # Adjust the elided text and restore the stripes in the body text widget # + hdr_adjustElidedText $win adjustElidedText $win redisplayVisibleItems $win makeStripes $win @@ -4307,6 +4957,7 @@ proc tablelist::redisplayVisibleItems win { variable canElide variable elide variable snipSides + variable pu displayItems $win set w $data(body) @@ -4320,7 +4971,7 @@ proc tablelist::redisplayVisibleItems win { set rightCol [colIndex $win @$data(rightX),0 0 0] set topLine [expr {int($topTextIdx)}] set btmLine [expr {int($btmTextIdx)}] - if {$btmLine > $data(itemCount)} { ;# text widget bug + if {$btmLine > $data(itemCount)} { set btmLine $data(itemCount) } set snipStr $data(-snipstring) @@ -4344,8 +4995,8 @@ proc tablelist::redisplayVisibleItems win { set dispItem [mapTabs $dispItem] } - findTabs $win $line $leftCol $leftCol tabIdx1 tabIdx2 - set textIdx1 [$w index $tabIdx1+1c] + findTabs $win $w $line $leftCol $leftCol tabIdx1 tabIdx2 + set textIdx1 [$w index $tabIdx1+1$pu] for {set col $leftCol} {$col <= $rightCol} {incr col} { if {$data($col-hide) && !$canElide} { continue @@ -4359,7 +5010,7 @@ proc tablelist::redisplayVisibleItems win { if {[string length $text] == 0 || [string length [$w get $textIdx1 $tabIdx2]] != 0 || ($row == $data(editRow) && $col == $data(editCol))} { - set textIdx1 [$w index $tabIdx2+2c] + set textIdx1 [$w index $tabIdx2+2$pu] set tabIdx2 [$w search $elide "\t" $textIdx1 $line.end] continue } @@ -4384,7 +5035,7 @@ proc tablelist::redisplayVisibleItems win { set indent [getIndentData $win $key $col indentWidth] set multiline [string match "*\n*" $text] if {$auxWidth != 0 || $indentWidth != 0 || $multiline} { - set textIdx1 [$w index $tabIdx2+2c] + set textIdx1 [$w index $tabIdx2+2$pu] set tabIdx2 [$w search $elide "\t" $textIdx1 $line.end] continue } @@ -4410,7 +5061,7 @@ proc tablelist::redisplayVisibleItems win { # # The element is displayed as multiline text # - set textIdx1 [$w index $tabIdx2+2c] + set textIdx1 [$w index $tabIdx2+2$pu] set tabIdx2 [$w search $elide "\t" $textIdx1 $line.end] continue } @@ -4422,13 +5073,13 @@ proc tablelist::redisplayVisibleItems win { $snipSide $snipStr # - # Update the text widget's contents between the two tabs + # Update the text widget's content between the two tabs # $w mark set tabMark2 [$w index $tabIdx2] updateCell $w $textIdx1 $tabIdx2 $text $aux $auxType $auxWidth \ $indent $indentWidth $alignment "" - set textIdx1 [$w index tabMark2+2c] + set textIdx1 [$w index tabMark2+2$pu] set tabIdx2 [$w search $elide "\t" $textIdx1 $line.end] } } @@ -4442,8 +5093,7 @@ proc tablelist::redisplayVisibleItems win { #------------------------------------------------------------------------------ proc tablelist::redisplayColWhenIdle {win col} { upvar ::tablelist::ns${win}::data data - if {[info exists data($col-redispId)] || [info exists data(redispId)] || - $data(itemCount) == 0} { + if {[info exists data($col-redispId)] || [info exists data(redispId)]} { return "" } @@ -4455,7 +5105,8 @@ proc tablelist::redisplayColWhenIdle {win col} { # tablelist::redisplayCol # # Redisplays the elements of the col'th column of the tablelist widget win, in -# the range specified by first and last. +# the range specified by first and last. Prior to that, it redisplays the +# elements of the specified column in the header text widget. #------------------------------------------------------------------------------ proc tablelist::redisplayCol {win col first last} { upvar ::tablelist::ns${win}::data data @@ -4465,20 +5116,15 @@ proc tablelist::redisplayCol {win col first last} { unset data($col-redispId) } - if {$data(itemCount) == 0 || $first < 0 || - $col > $data(lastCol) || $data($col-hide)} { + if {$col > $data(lastCol) || $data($col-hide)} { return "" } - if {[string compare $last "last"] == 0} { - set last $data(lastRow) - } displayItems $win set fmtCmdFlag [lindex $data(fmtCmdFlagList) $col] set colFont [lindex $data(colFontList) $col] set snipStr $data(-snipstring) - set w $data(body) set pixels [lindex $data(colList) [expr {2*$col}]] if {$pixels == 0} { ;# convention: dynamic width if {$data($col-maxPixels) > 0} { @@ -4493,7 +5139,99 @@ proc tablelist::redisplayCol {win col first last} { set alignment [lindex $data(colList) [expr {2*$col + 1}]] variable snipSides set snipSide $snipSides($alignment,$data($col-changesnipside)) + variable pu + + set w $data(hdrTxt) + for {set row 0; set line 2} {$row < $data(hdr_itemCount)} \ + {incr row; incr line} { + set item [lindex $data(hdr_itemList) $row] + set key [lindex $item end] + # + # Adjust the cell text and the image or window width + # + set text [lindex $item $col] + if {$fmtCmdFlag} { + set text [formatElem $win $key $row $col $text] + } + if {[string match "*\t*" $text]} { + set text [mapTabs $text] + } + set multiline [string match "*\n*" $text] + set aux [getAuxData $win $key $col auxType auxWidth $pixels] + set indentWidth 0 + set maxTextWidth $pixels + if {[info exists data($key,$col-font)]} { + set cellFont $data($key,$col-font) + } elseif {[info exists data($key-font)]} { + set cellFont $data($key-font) + } else { + set cellFont $colFont + } + if {$pixels != 0} { + set maxTextWidth [getMaxTextWidth $pixels $auxWidth 0] + + if {$data($col-wrap) && !$multiline} { + if {[font measure $cellFont -displayof $win $text] > + $maxTextWidth} { + set multiline 1 + } + } + } + if {$multiline} { + set list [split $text "\n"] + set snipSide2 $snipSide + if {$data($col-wrap)} { + set snipSide2 "" + } + adjustMlElem $win list auxWidth indentWidth $cellFont \ + $pixels $snipSide2 $snipStr + set msgScript [list ::tablelist::displayText $win $key $col \ + [join $list "\n"] $cellFont $maxTextWidth $alignment] + } else { + adjustElem $win text auxWidth indentWidth $cellFont \ + $pixels $snipSide $snipStr + } + + # + # Update the text widget's content between the two tabs + # + if {[findTabs $win $w $line $col $col tabIdx1 tabIdx2]} { + if {$auxType > 1 && $auxWidth > 0 && ![winfo exists $aux]} { + # + # Create a frame and evaluate the script that + # creates a child window within the frame + # + tk::frame $aux -borderwidth 0 -class TablelistWindow \ + -container 0 -height $data($key,$col-reqHeight) \ + -highlightthickness 0 -relief flat \ + -takefocus 0 -width $auxWidth + catch {$aux configure -padx 0 -pady 0} + bindtags $aux [linsert [bindtags $aux] 1 \ + $data(bodyTag) TablelistBody] + uplevel #0 $data($key,$col-window) [list $win $row $col $aux.w] + } + + if {$multiline} { + updateMlCell $w $tabIdx1+1$pu $tabIdx2 $msgScript $aux \ + $auxType $auxWidth "" 0 $alignment \ + [getVAlignment $win $key $col] + } else { + updateCell $w $tabIdx1+1$pu $tabIdx2 $text $aux \ + $auxType $auxWidth "" 0 $alignment \ + [getVAlignment $win $key $col] + } + } + } + + if {$first < 0} { + return "" + } + if {[string compare $last "last"] == 0} { + set last $data(lastRow) + } + + set w $data(body) for {set row $first; set line [expr {$first + 1}]} {$row <= $last} \ {set row $line; incr line} { if {$row == $data(editRow) && $col == $data(editCol)} { @@ -4555,9 +5293,9 @@ proc tablelist::redisplayCol {win col first last} { } # - # Update the text widget's contents between the two tabs + # Update the text widget's content between the two tabs # - if {[findTabs $win $line $col $col tabIdx1 tabIdx2]} { + if {[findTabs $win $w $line $col $col tabIdx1 tabIdx2]} { if {$auxType > 1 && $auxWidth > 0 && ![winfo exists $aux]} { # # Create a frame and evaluate the script that @@ -4574,13 +5312,13 @@ proc tablelist::redisplayCol {win col first last} { } if {$multiline} { - updateMlCell $w $tabIdx1+1c $tabIdx2 $msgScript $aux $auxType \ - $auxWidth $indent $indentWidth $alignment \ - [getVAlignment $win $key $col] + updateMlCell $w $tabIdx1+1$pu $tabIdx2 $msgScript $aux \ + $auxType $auxWidth $indent $indentWidth \ + $alignment [getVAlignment $win $key $col] } else { - updateCell $w $tabIdx1+1c $tabIdx2 $text $aux $auxType \ - $auxWidth $indent $indentWidth $alignment \ - [getVAlignment $win $key $col] + updateCell $w $tabIdx1+1$pu $tabIdx2 $text $aux \ + $auxType $auxWidth $indent $indentWidth \ + $alignment [getVAlignment $win $key $col] } } } @@ -4711,8 +5449,8 @@ proc tablelist::showLineNumbers win { #------------------------------------------------------------------------------ # tablelist::updateViewWhenIdle # -# Arranges for the visible part of the tablelist widget win to be updated -# at idle time. +# Arranges for the visible part of the body text widget of the tablelist widget +# win to be updated at idle time. #------------------------------------------------------------------------------ proc tablelist::updateViewWhenIdle {win {reschedule 0}} { upvar ::tablelist::ns${win}::data data @@ -4730,13 +5468,17 @@ proc tablelist::updateViewWhenIdle {win {reschedule 0}} { #------------------------------------------------------------------------------ # tablelist::updateView # -# Updates the visible part of the tablelist widget win. +# Updates the visible part of the body text widget of the tablelist widget win. #------------------------------------------------------------------------------ proc tablelist::updateView win { upvar ::tablelist::ns${win}::data data if {[info exists data(viewId)]} { after cancel $data(viewId) unset data(viewId) + + hdr_adjustElidedText $win + hdr_updateColors $win + adjustHeaderHeight $win } adjustElidedText $win @@ -5327,14 +6069,14 @@ proc tablelist::raiseArrow {win col} { #------------------------------------------------------------------------------ # tablelist::isHdrTxtFrXPosVisible # -# Checks whether the given x position in the header text child of the tablelist -# widget win is visible. +# Checks whether the given x position in the header text widget component of +# the tablelist widget win is visible. #------------------------------------------------------------------------------ proc tablelist::isHdrTxtFrXPosVisible {win x} { upvar ::tablelist::ns${win}::data data foreach {fraction1 fraction2} [$data(hdrTxt) xview] {} - return [expr {$x >= $fraction1 * $data(hdrPixels) && - $x < $fraction2 * $data(hdrPixels)}] + return [expr {$x >= $fraction1 * $data(hdrWidth) && + $x < $fraction2 * $data(hdrWidth)}] } #------------------------------------------------------------------------------ @@ -5442,6 +6184,7 @@ proc tablelist::changeScrlColOffset {win scrlColOffset} { upvar ::tablelist::ns${win}::data data if {$scrlColOffset != $data(scrlColOffset)} { set data(scrlColOffset) $scrlColOffset + hdr_adjustElidedText $win adjustElidedText $win redisplayVisibleItems $win } @@ -5531,7 +6274,7 @@ proc tablelist::getVertComplBtmRow win { set btmTextIdx [$w index @0,$data(btmY)] set btmRow [expr {int($btmTextIdx) - 1}] - if {$btmRow > $data(lastRow)} { ;# text widget bug + if {$btmRow > $data(lastRow)} { set btmRow $data(lastRow) } @@ -5616,3 +6359,315 @@ proc tablelist::viewableRowOffsetToRowIndex {win offset} { } } } + +#------------------------------------------------------------------------------ +# tablelist::createFrameWithCheckbutton +# +# Creates a frame widget w to be embedded into the specified cell of the +# tablelist widget win, along with a checkbutton child. +#------------------------------------------------------------------------------ +proc tablelist::createFrameWithCheckbutton {cmd win row col w} { + upvar ::tablelist::ns${win}::data data \ + ::tablelist::ns${win}::checkStates checkStates + set item [lindex $data(itemList) $row] + set key [lindex $item end] + set checkStates($key,$col) [lindex $item $col] + + frame $w + makeCheckbutton $w.ckbtn + $w.ckbtn configure -variable ::tablelist::ns${win}::checkStates($key,$col) + + if {[string length $cmd] != 0} { + $w.ckbtn configure -command [format { + after idle [list %s %s %d %d] + } $cmd $win $row $col] + } +} + +#------------------------------------------------------------------------------ +# tablelist::hdr_createFrameWithCheckbutton +# +# Creates a frame widget w to be embedded into the specified cell of the +# tablelist widget win, along with a checkbutton child. +#------------------------------------------------------------------------------ +proc tablelist::hdr_createFrameWithCheckbutton {cmd win row col w} { + upvar ::tablelist::ns${win}::data data \ + ::tablelist::ns${win}::checkStates checkStates + set item [lindex $data(hdr_itemList) $row] + set key [lindex $item end] + set checkStates($key,$col) [lindex $item $col] + + frame $w + makeCheckbutton $w.ckbtn + $w.ckbtn configure -variable ::tablelist::ns${win}::checkStates($key,$col) + + if {[string length $cmd] != 0} { + $w.ckbtn configure -command [format { + after idle [list %s %s %d %d] + } $cmd $win $row $col] + } +} + +#------------------------------------------------------------------------------ +# tablelist::makeCheckbutton +# +# Creates a checkbutton widget of the given path name and manages it in its +# parent, which is supposed to be a frame widget. +#------------------------------------------------------------------------------ +proc tablelist::makeCheckbutton w { + checkbutton $w -activebackground white -background white \ + -highlightthickness 0 -padx 0 -pady 0 -selectcolor white -takefocus 0 + + set frm [winfo parent $w] + variable winSys + switch $winSys { + x11 { + if {$::tk_version > 8.4} { + $frm configure -width 11 -height 11 + $w configure -borderwidth 0 -font "Helvetica -12" + place $w -x -5 -y -3 + } else { + variable checkedImg + variable uncheckedImg + if {![info exists checkedImg]} { + createCheckbuttonImgs + } + + $w configure -borderwidth 2 -indicatoron 0 \ + -image $uncheckedImg -selectimage $checkedImg + if {$::tk_version == 8.4} { + $w configure -offrelief sunken ;# -offrelief added in Tk8.4 + } + pack $w + } + } + + win32 { + $frm configure -width 13 -height 13 + $w configure -borderwidth 0 -font {"MS Sans Serif" 8} + switch [winfo reqheight $w { + 17 { set y -1 } + 20 { set y -3 } + 25 { set y -5 } + 30 - + 31 { set y -8 } + default { set y -1 } + } + place $w -x -1 -y $y + } + + classic { + $frm configure -width 16 -height 14 + $w configure -borderwidth 0 -font "system" + place $w -x 0 -y -1 + } + + aqua { + $w configure -borderwidth 0 -font "system" + if {$::tk_version > 8.4} { + $frm configure -width 12 -height 12 + place $w -x -1 -y -3 + } else { + $frm configure -width 14 -height 14 + place $w -x -4 -y -3 + } + } + } +} + +#------------------------------------------------------------------------------ +# tablelist::createFrameWithTileCheckbutton +# +# Creates a frame widget w to be embedded into the specified cell of the +# tablelist widget win, along with a tile checkbutton child. +#------------------------------------------------------------------------------ +proc tablelist::createFrameWithTileCheckbutton {cmd win row col w} { + upvar ::tablelist::ns${win}::data data \ + ::tablelist::ns${win}::checkStates checkStates + set item [lindex $data(itemList) $row] + set key [lindex $item end] + set checkStates($key,$col) [lindex $item $col] + + frame $w + makeTileCheckbutton $w.ckbtn + $w.ckbtn configure -variable ::tablelist::ns${win}::checkStates($key,$col) + + if {[string length $cmd] != 0} { + $w.ckbtn configure -command [format { + after idle [list %s %s %d %d] + } $cmd $win $row $col] + } +} + +#------------------------------------------------------------------------------ +# tablelist::hdr_createFrameWithTileCheckbutton +# +# Creates a frame widget w to be embedded into the specified cell of the +# tablelist widget win, along with a tile checkbutton child. +#------------------------------------------------------------------------------ +proc tablelist::hdr_createFrameWithTileCheckbutton {cmd win row col w} { + upvar ::tablelist::ns${win}::data data \ + ::tablelist::ns${win}::checkStates checkStates + set item [lindex $data(hdr_itemList) $row] + set key [lindex $item end] + set checkStates($key,$col) [lindex $item $col] + + frame $w + makeTileCheckbutton $w.ckbtn + $w.ckbtn configure -variable ::tablelist::ns${win}::checkStates($key,$col) + + if {[string length $cmd] != 0} { + $w.ckbtn configure -command [format { + after idle [list %s %s %d %d] + } $cmd $win $row $col] + } +} + +#------------------------------------------------------------------------------ +# tablelist::makeTileCheckbutton +# +# Creates a tile checkbutton widget of the given path name and manages it in +# its parent, which is supposed to be a frame widget. +#------------------------------------------------------------------------------ +proc tablelist::makeTileCheckbutton w { + if {$::tk_version < 8.5 || [regexp {^8\.5a[1-5]$} $::tk_patchLevel]} { + package require tile 0.6 + } + createTileAliases + + # + # Define the checkbutton layout; use catch to suppress + # the error message in case the layout already exists + # + set currentTheme [getCurrentTheme] + if {[string compare $currentTheme "aqua"] == 0} { + catch {style layout Tablelist.TCheckbutton { Checkbutton.button }} + } else { + catch {style layout Tablelist.TCheckbutton { Checkbutton.indicator }} + styleConfig Tablelist.TCheckbutton -indicatormargin 0 + } + + ttk::checkbutton $w -style Tablelist.TCheckbutton -takefocus 0 + + # + # Adjust the dimensions of the tile checkbutton's parent + # and manage the checkbutton, depending on the current theme + # + set frm [winfo parent $w] + switch -- $currentTheme { + aqua { + $frm configure -width 16 -height 16 + place $w -x -3 -y -3 + } + + Aquativo - + aquativo - + Arc { + $frm configure -width 14 -height 14 + place $w -x -1 -y -1 + } + + blue - + winxpblue { + set height [winfo reqheight $w] + $frm configure -width $height -height $height + place $w -x 0 + } + + clam { + $frm configure -width 11 -height 11 + place $w -x 0 + } + + classic - + default { + styleConfig Tablelist.TCheckbutton -background white + pack $w + } + + clearlooks { + $frm configure -width 13 -height 13 + place $w -x -2 -y -2 + } + + keramik - + keramik_alt { + $frm configure -width 16 -height 16 + place $w -x -1 -y -1 + } + + plastik { + $frm configure -width 15 -height 15 + place $w -x -2 -y 1 + } + + sriv - + srivlg { + $frm configure -width 15 -height 17 + place $w -x -1 + } + + tileqt { + switch -- [string tolower [tileqt_currentThemeName]] { + acqua { + $frm configure -width 17 -height 18 + place $w -x -1 -y -2 + } + cde - + cleanlooks - + motif { + $frm configure -width 13 -height 13 + if {[info exists ::env(KDE_SESSION_VERSION)] && + [string length $::env(KDE_SESSION_VERSION)] != 0} { + place $w -x -2 + } else { + place $w -x 0 + } + } + gtk+ { + $frm configure -width 15 -height 15 + place $w -x -1 -y -1 + } + kde_xp { + $frm configure -width 13 -height 13 + place $w -x 0 + } + keramik - + thinkeramik { + $frm configure -width 16 -height 16 + place $w -x 0 + } + oxygen { + $frm configure -width 17 -height 17 + place $w -x -2 -y -1 + } + default { + set height [winfo reqheight $w] + $frm configure -width $height -height $height + place $w -x 0 + } + } + } + + vista { + set height [winfo reqheight $w] + $frm configure -width $height -height $height + place $w -x 0 + } + + winnative - + xpnative { + set height [winfo reqheight $w] + $frm configure -width $height -height $height + if {[info exists tile::version]} { + place $w -x -2 + } else { + place $w -x 0 + } + } + + default { + pack $w + } + } +} diff --git a/modules/tablelist/scripts/tablelistWidget.tcl b/modules/tablelist/scripts/tablelistWidget.tcl index a94c6887..4f699622 100644 --- a/modules/tablelist/scripts/tablelistWidget.tcl +++ b/modules/tablelist/scripts/tablelistWidget.tcl @@ -324,6 +324,26 @@ namespace eval tablelist { } lappend rowConfigSpecs(-selectable) - 1 + # + # The array hdr_rowConfigSpecs is used to handle header row configuration + # options. The names of its elements are the header row configuration + # options for the Tablelist widget class. The value of an array element is + # either an alias name or a list containing the database name and class. + # + # Command-Line Name {Database Name Database Class } + # ----------------------------------------------------------------- + # + variable hdr_rowConfigSpecs + array set hdr_rowConfigSpecs { + -background {background Background } + -bg -background + -font {font Font } + -foreground {foreground Foreground } + -fg -foreground + -name {name Name } + -text {text Text } + } + # # The array cellConfigSpecs is used to handle cell configuration options. # The names of its elements are the cell configuration options for the @@ -362,7 +382,38 @@ namespace eval tablelist { lappend cellConfigSpecs(-valign) - center # - # Use a list to facilitate the handling of the command options + # The array hdr_cellConfigSpecs is used to handle header cell configuration + # options. The names of its elements are the header cell configuration + # options for the Tablelist widget class. The value of an array element is + # either an alias name or a list containing the database name and class. + # + # Command-Line Name {Database Name Database Class } + # ----------------------------------------------------------------- + # + variable hdr_cellConfigSpecs + array set hdr_cellConfigSpecs { + -background {background Background } + -bg -background + -font {font Font } + -foreground {foreground Foreground } + -fg -foreground + -image {image Image } + -stretchwindow {stretchWindow StretchWindow } + -text {text Text } + -valign {valign Valign } + -window {window Window } + -windowdestroy {windowDestroy WindowDestroy } + -windowupdate {windowUpdate WindowUpdate } + } + + # + # Extend some elements of the array hdr_cellConfigSpecs + # + lappend hdr_cellConfigSpecs(-stretchwindow) - 0 + lappend hdr_cellConfigSpecs(-valign) - center + + # + # Use a list to facilitate the handling of the command options # variable cmdOpts [list \ activate activatecell applysorting attrib bbox bodypath bodytag \ @@ -374,22 +425,24 @@ namespace eval tablelist { configrowlist configrows configure containing containingcell \ containingcolumn cornerlabelpath cornerpath curcellselection \ curselection depth delete deletecolumns descendantcount dicttoitem \ - editcell editinfo editwinpath editwintag entrypath expand expandall \ - expandedkeys fillcolumn findcolumnname findrowname finishediting \ - formatinfo get getcells getcolumns getformatted getformattedcells \ - getformattedcolumns getfullkeys getkeys hasattrib hascellattrib \ - hascolumnattrib hasrowattrib hidetargetmark imagelabelpath index \ - insert insertchild insertchildlist insertchildren insertcolumnlist \ - insertcolumns insertlist iselemsnipped isexpanded istitlesnipped \ - isviewable itemlistvar itemtodict labelpath labels labeltag move \ - movecolumn nearest nearestcell nearestcolumn noderow parentkey \ - refreshsorting rejectinput resetsortinfo rowattrib rowcget \ - rowconfigure scan searchcolumn see seecell seecolumn selection \ - separatorpath separators showtargetmark size sort sortbycolumn \ - sortbycolumnlist sortcolumn sortcolumnlist sortorder sortorderlist \ - targetmarkpath targetmarkpos togglecolumnhide togglerowhide \ - toplevelkey unsetattrib unsetcellattrib unsetcolumnattrib \ - unsetrowattrib viewablerowcount windowpath xview yview] + editcell editinfo editwinpath editwintag embedcheckbutton \ + embedcheckbuttons embedttkcheckbutton embedttkcheckbuttons entrypath \ + expand expandall expandedkeys fillcolumn findcolumnname findrowname \ + finishediting formatinfo get getcells getcolumns getformatted \ + getformattedcells getformattedcolumns getfullkeys getkeys hasattrib \ + hascellattrib hascolumnattrib hasrowattrib header headerpath \ + headertag hidetargetmark imagelabelpath index insert insertchild \ + insertchildlist insertchildren insertcolumnlist insertcolumns \ + insertlist iselemsnipped isexpanded istitlesnipped isviewable \ + itemlistvar itemtodict labelpath labels labeltag move movecolumn \ + nearest nearestcell nearestcolumn noderow parentkey refreshsorting \ + rejectinput resetsortinfo rowattrib rowcget rowconfigure scan \ + searchcolumn see seecell seecolumn selection separatorpath separators \ + showtargetmark size sort sortbycolumn sortbycolumnlist sortcolumn \ + sortcolumnlist sortorder sortorderlist targetmarkpath targetmarkpos \ + togglecolumnhide togglerowhide toplevelkey unsetattrib \ + unsetcellattrib unsetcolumnattrib unsetrowattrib viewablerowcount \ + windowpath xview yview] proc restrictCmdOpts {} { variable canElide @@ -403,12 +456,19 @@ namespace eval tablelist { } } - if {$::tk_version < 8.5} { + if {[llength [info commands ::dict]] == 0} { foreach opt [list dicttoitem itemtodict] { set idx [lsearch -exact $cmdOpts $opt] set cmdOpts [lreplace $cmdOpts $idx $idx] } } + + if {$::tk_version < 8.5} { + foreach opt [list header headerpath headertag] { + set idx [lsearch -exact $cmdOpts $opt] + set cmdOpts [lreplace $cmdOpts $idx $idx] + } + } } restrictCmdOpts @@ -431,6 +491,20 @@ namespace eval tablelist { variable expCollOpts [list -fully -partly] variable findOpts [list -descend -parent] variable gapTypeOpts [list -any -horizontal -vertical] + variable headerOpts [list bbox cellattrib cellbbox cellcget \ + cellconfigure cellindex configcelllist \ + configcells configrowlist configrows \ + containing containingcell delete \ + embedcheckbutton embedcheckbuttons \ + embedttkcheckbutton embedttkcheckbuttons \ + fillcolumn findrowname get getcells \ + getcolumns getformatted getformattedcells \ + getformattedcolumns getfullkeys getkeys \ + hascellattrib hasrowattrib imagelabelpath \ + index insert insertlist iselemsnipped \ + itemlistvar nearest nearestcell rowattrib \ + rowcget rowconfigure size unsetcellattrib \ + unsetrowattrib windowpath] variable scanOpts [list mark dragto] variable searchOpts [list -all -backwards -check -descend -exact \ -formatted -glob -nocase -not -numeric \ @@ -524,6 +598,17 @@ namespace eval tablelist { } } + # + # Define the variable pu holding the position unit "indices" or "chars" + # to be used in text widget indices of the form (+|-)$pu + # + variable pu + if {$::tk_version >= 8.5} { + set pu indices + } else { + set pu chars + } + interp alias {} ::tablelist::configSubCmd \ {} ::tablelist::configureSubCmd interp alias {} ::tablelist::insertchildSubCmd \ @@ -560,25 +645,27 @@ proc tablelist::createBindings {} { bind Tablelist { tablelist::removeActiveTag %W } bind Tablelist <> { event generate %W <> } bind Tablelist { tablelist::cleanup %W } + bind Tablelist <> { + after idle [list tablelist::updateConfigSpecs %W] + } variable usingTile if {$usingTile} { bind Tablelist { tablelist::updateCanvases %W } bind Tablelist { tablelist::updateCanvases %W } - bind Tablelist <> { - after idle [list tablelist::updateConfigSpecs %W] - } } # - # Define some TablelistWindow class bindings + # Define a TablelistWindow class binding # bind TablelistWindow { tablelist::cleanupWindow %W } # - # Define the binding tags TablelistKeyNav and TablelistBody + # Define the binding tags TablelistKeyNav, + # TablelistBody, and TablelistHeader # mwutil::defineKeyNav Tablelist defineTablelistBody + defineTablelistHeader # # Define the virtual events <> and <> @@ -593,25 +680,10 @@ proc tablelist::createBindings {} { } # - # Define some mouse bindings for the binding tag TablelistLabel - # - bind TablelistLabel { tablelist::labelEnter %W %X %Y %x } - bind TablelistLabel { tablelist::labelEnter %W %X %Y %x } - bind TablelistLabel { tablelist::labelLeave %W %X %x %y } - bind TablelistLabel { tablelist::labelB1Down %W %x 0 } - bind TablelistLabel { tablelist::labelB1Down %W %x 1 } - bind TablelistLabel { tablelist::labelB1Motion %W %X %x %y } - bind TablelistLabel { tablelist::labelB1Enter %W } - bind TablelistLabel { tablelist::labelB1Leave %W %x %y } - bind TablelistLabel { tablelist::labelB1Up %W %X} - bind TablelistLabel <> { tablelist::labelB3Down %W 0 } - bind TablelistLabel <> { tablelist::labelB3Down %W 1 } - bind TablelistLabel { tablelist::labelDblB1 %W %x 0} - bind TablelistLabel { tablelist::labelDblB1 %W %x 1} - - # - # Define the binding tags TablelistSubLabel and TablelistArrow + # Define the binding tags TablelistLabel, + # TablelistSubLabel, and TablelistArrow # + defineTablelistLabel defineTablelistSubLabel defineTablelistArrow @@ -674,17 +746,22 @@ proc tablelist::tablelist args { isDisabled 0 ownsFocus 0 charWidth 1 - hdrPixels 0 + hdrWidth 0 activeRow 0 activeCol 0 anchorRow 0 anchorCol 0 seqNum -1 + hdr_seqNum -1 freeKeyList {} keyList {} + hdr_keyList {} itemList {} + hdr_itemList {} itemCount 0 + hdr_itemCount 0 lastRow -1 + hdr_lastRow -1 colList {} colCount 0 lastCol -1 @@ -710,12 +787,14 @@ proc tablelist::tablelist args { fmtRow -1 fmtCol -1 prevCell "" + hdr_prevCell "" prevCol -1 forceAdjust 0 fmtCmdFlagList {} hasFmtCmds 0 scrlColOffset 0 cellsToReconfig {} + hdr_cellsToReconfig {} nonViewableRowCount 0 viewableRowList {-1} hiddenColCount 0 @@ -735,6 +814,13 @@ proc tablelist::tablelist args { # attributes and their values for this widget # variable attribs + + # + # The following array is used to hold the selection + # state of embedded checkbutton windows created via + # createTkCheckbutton and createTtkCheckbutton + # + variable checkStates } # @@ -744,23 +830,23 @@ proc tablelist::tablelist args { foreach opt $configOpts { set data($opt) [lindex $configSpecs($opt) 3] } + set data(currentTheme) [getCurrentTheme] + if {[string compare $data(currentTheme) "tileqt"] == 0} { + set data(widgetStyle) [tileqt_currentThemeName] + if {[info exists ::env(KDE_SESSION_VERSION)] && + [string length $::env(KDE_SESSION_VERSION)] != 0} { + set data(colorScheme) [getKdeConfigVal "General" "ColorScheme"] + } else { + set data(colorScheme) [getKdeConfigVal "KDE" "colorScheme"] + } + } else { + set data(widgetStyle) "" + set data(colorScheme) "" + } if {$usingTile} { - setThemeDefaults + setThemeDefaults variable themeDefaults - set data(currentTheme) [getCurrentTheme] set data(themeDefaults) [array get themeDefaults] - if {[string compare $data(currentTheme) "tileqt"] == 0} { - set data(widgetStyle) [tileqt_currentThemeName] - if {[info exists ::env(KDE_SESSION_VERSION)] && - [string length $::env(KDE_SESSION_VERSION)] != 0} { - set data(colorScheme) [getKdeConfigVal "General" "ColorScheme"] - } else { - set data(colorScheme) [getKdeConfigVal "KDE" "colorScheme"] - } - } else { - set data(widgetStyle) "" - set data(colorScheme) "" - } } set data(-titlecolumns) 0 ;# for Tk versions < 8.3 set data(-treecolumn) 0 ;# for Tk versions < 8.3 @@ -768,6 +854,7 @@ proc tablelist::tablelist args { set data(colFontList) [list $data(-font)] set data(listVarTraceCmd) [list tablelist::listVarTrace $win] set data(bodyTag) body$win + set data(headerTag) header$win set data(labelTag) label$win set data(editwinTag) editwin$win set data(body) $win.body @@ -813,19 +900,28 @@ proc tablelist::tablelist args { set w $data(hdrTxt) ;# text widget within the header frame text $w -borderwidth 0 -highlightthickness 0 -insertwidth 0 \ -padx 0 -pady 0 -state normal -takefocus 0 -wrap none + catch {$w configure -undo 0}; # because of a text widget issue in Tk 8.6.6 place $w -relheight 1.0 -relwidth 1.0 - bindtags $w [lreplace [bindtags $w] 1 1] + bindtags $w [list $w $data(headerTag) TablelistHeader [winfo toplevel $w] \ + all] tk::frame $data(hdrTxtFrm) -borderwidth 0 -container 0 -height 0 \ - -highlightthickness 0 -relief flat \ - -takefocus 0 -width 0 + -highlightthickness 0 -relief flat \ + -takefocus 0 -width 0 catch {$data(hdrTxtFrm) configure -padx 0 -pady 0} - $w window create 1.0 -window $data(hdrTxtFrm) + $w window create 1.0 -window $data(hdrTxtFrm) -align top + $w tag configure noSpacings -spacing1 0 -spacing3 0 + $w tag add noSpacings 1.0 + $w tag configure tinyFont -font "Courier -1" + $w tag add tinyFont 1.0 end + $w tag configure disabled -foreground "" ;# will be changed + $w tag configure hiddenCol -elide 1 ;# used for hiding a column + $w tag configure elidedCol -elide 1 ;# used for horizontal scrolling set w $data(hdrFrm) ;# filler frame within the header frame tk::frame $w -borderwidth 0 -container 0 -height 0 -highlightthickness 0 \ -relief flat -takefocus 0 -width 0 catch {$w configure -padx 0 -pady 0} - place $w -relheight 1.0 -relwidth 1.0 + place $w -relwidth 1.0 set w $data(hdrFrmLbl) ;# label within the filler frame set x 0 @@ -860,6 +956,22 @@ proc tablelist::tablelist args { } place $w -relheight 1.0 -relwidth 1.0 + if {$::tk_version >= 8.5} { + # + # Create the upper horizontal separator + # (to be placed just below the header rows) + # + set w $data(hsep)1 + if {$usingTile} { + ttk::separator $w -style Main$win.TSeparator \ + -cursor $data(-cursor) -takefocus 0 + } else { + tk::frame $w -background $data(-foreground) -borderwidth 1 \ + -container 0 -cursor $data(-cursor) -height 2 \ + -highlightthickness 0 -relief sunken -takefocus 0 + } + } + # # Create the body text widget within the main frame # @@ -869,10 +981,6 @@ proc tablelist::tablelist args { catch {$w configure -undo 0}; # because of a text widget issue in Tk 8.6.6 bind $w { tablelist::bodyConfigure %W %w %h } pack $w -expand 1 -fill both - - # - # Modify the list of binding tags of the body text widget - # bindtags $w [list $w $data(bodyTag) TablelistBody [winfo toplevel $w] \ TablelistKeyNav all] @@ -968,6 +1076,9 @@ proc tablelist::tablelist args { trace variable data($name) w [list tablelist::activeTrace $win] } + trace variable ::tablelist::ns${win}::checkStates w \ + [list tablelist::checkStatesTrace $win] + return $win } @@ -1147,8 +1258,8 @@ proc tablelist::canceleditingSubCmd {win argList} { #------------------------------------------------------------------------------ proc tablelist::cellattribSubCmd {win argList} { if {[llength $argList] < 1} { - mwutil::wrongNumArgs "$win cellattrib cellIndex ?name? ?value\ - name value ...?" + mwutil::wrongNumArgs \ + "$win cellattrib cellIndex ?name? ?value name value ...?" } synchronize $win @@ -1200,8 +1311,8 @@ proc tablelist::cellcgetSubCmd {win argList} { #------------------------------------------------------------------------------ proc tablelist::cellconfigureSubCmd {win argList} { if {[llength $argList] < 1} { - mwutil::wrongNumArgs "$win cellconfigure cellIndex ?option? ?value\ - option value ...?" + mwutil::wrongNumArgs \ + "$win cellconfigure cellIndex ?option? ?value option value ...?" } synchronize $win @@ -1437,8 +1548,11 @@ proc tablelist::collapseSubCmd {win argList} { adjustRowIndex $win activeRow 1 set data(activeRow) $activeRow + hdr_adjustElidedText $win + hdr_updateColors $win adjustElidedText $win redisplayVisibleItems $win + updateColors $win makeStripes $win adjustSepsWhenIdle $win updateVScrlbarWhenIdle $win @@ -1473,7 +1587,7 @@ proc tablelist::collapseallSubCmd {win argList} { if {[winfo viewable $win]} { purgeWidgets $win update idletasks - if {![array exists ::tablelist::ns${win}::data]} { + if {[destroyed $win]} { return "" } } @@ -1566,8 +1680,11 @@ proc tablelist::collapseallSubCmd {win argList} { adjustRowIndex $win activeRow 1 set data(activeRow) $activeRow + hdr_adjustElidedText $win + hdr_updateColors $win adjustElidedText $win redisplayVisibleItems $win + updateColors $win makeStripes $win adjustSepsWhenIdle $win updateVScrlbarWhenIdle $win @@ -1579,8 +1696,8 @@ proc tablelist::collapseallSubCmd {win argList} { #------------------------------------------------------------------------------ proc tablelist::columnattribSubCmd {win argList} { if {[llength $argList] < 1} { - mwutil::wrongNumArgs "$win columnattrib columnIndex ?name? ?value\ - name value ...?" + mwutil::wrongNumArgs \ + "$win columnattrib columnIndex ?name? ?value name value ...?" } set col [colIndex $win [lindex $argList 0] 1] @@ -1606,8 +1723,9 @@ proc tablelist::columncgetSubCmd {win argList} { #------------------------------------------------------------------------------ proc tablelist::columnconfigureSubCmd {win argList} { if {[llength $argList] < 1} { - mwutil::wrongNumArgs "$win columnconfigure columnIndex ?option? ?value\ - option value ...?" + mwutil::wrongNumArgs \ + "$win columnconfigure columnIndex ?option? ?value\ + option value ...?" } synchronize $win @@ -1648,8 +1766,8 @@ proc tablelist::columnindexSubCmd {win argList} { proc tablelist::columnwidthSubCmd {win argList} { set argCount [llength $argList] if {$argCount < 1 || $argCount > 2} { - mwutil::wrongNumArgs "$win columnwidth columnIndex\ - ?-requested|-stretched|-total?" + mwutil::wrongNumArgs \ + "$win columnwidth columnIndex ?-requested|-stretched|-total?" } synchronize $win @@ -1660,7 +1778,6 @@ proc tablelist::columnwidthSubCmd {win argList} { variable colWidthOpts set opt [mwutil::fullOpt "option" [lindex $argList 1] $colWidthOpts] } - return [colWidth $win $col $opt] } @@ -1854,8 +1971,8 @@ proc tablelist::cornerpathSubCmd {win argList} { proc tablelist::curcellselectionSubCmd {win argList} { set argCount [llength $argList] if {$argCount > 1} { - mwutil::wrongNumArgs "$win curcellselection\ - ?-all|-nonhidden||-viewable?" + mwutil::wrongNumArgs \ + "$win curcellselection ?-all|-nonhidden||-viewable?" } if {$argCount == 0} { @@ -1865,7 +1982,7 @@ proc tablelist::curcellselectionSubCmd {win argList} { set opt [mwutil::fullOpt "option" [lindex $argList 0] $curSelOpts] set constraint [lsearch -exact $curSelOpts $opt] } - + synchronize $win displayItems $win @@ -1878,8 +1995,8 @@ proc tablelist::curcellselectionSubCmd {win argList} { proc tablelist::curselectionSubCmd {win argList} { set argCount [llength $argList] if {$argCount > 1} { - mwutil::wrongNumArgs "$win curselection\ - ?-all|-nonhidden||-viewable?" + mwutil::wrongNumArgs \ + "$win curselection ?-all|-nonhidden||-viewable?" } if {$argCount == 0} { @@ -1901,8 +2018,8 @@ proc tablelist::curselectionSubCmd {win argList} { proc tablelist::deleteSubCmd {win argList} { set argCount [llength $argList] if {$argCount < 1 || $argCount > 2} { - mwutil::wrongNumArgs "$win delete firstIndex lastIndex" \ - "$win delete indexList" + mwutil::wrongNumArgs \ + "$win delete firstIndex lastIndex" "$win delete indexList" } upvar ::tablelist::ns${win}::data data @@ -1963,7 +2080,7 @@ proc tablelist::deletecolumnsSubCmd {win argList} { set argCount [llength $argList] if {$argCount < 1 || $argCount > 2} { mwutil::wrongNumArgs \ - "$win deletecolumns firstColumnIndex lastColumnIndex" \ + "$win deletecolumns firstColumn lastColumn" \ "$win deletecolumns columnIndexList" } @@ -2077,7 +2194,6 @@ proc tablelist::dicttoitemSubCmd {win argList} { } lappend item $elem } - return $item } @@ -2135,6 +2251,110 @@ proc tablelist::editwintagSubCmd {win argList} { return $data(editwinTag) } +#------------------------------------------------------------------------------ +# tablelist::embedcheckbuttonSubCmd +#------------------------------------------------------------------------------ +proc tablelist::embedcheckbuttonSubCmd {win argList} { + set argCount [llength $argList] + if {$argCount < 1 || $argCount > 2} { + mwutil::wrongNumArgs "$win embedcheckbutton cellIndex ?command?" + } + + synchronize $win + displayItems $win + foreach {row col} [cellIndex $win [lindex $argList 0] 1] {} + + if {$argCount == 1} { + set cmd "" + } else { + set cmd [lindex $argList 1] + } + + doCellConfig $row $col $win -window \ + [list ::tablelist::createFrameWithCheckbutton $cmd] + return "" +} + +#------------------------------------------------------------------------------ +# tablelist::embedcheckbuttonsSubCmd +#------------------------------------------------------------------------------ +proc tablelist::embedcheckbuttonsSubCmd {win argList} { + set argCount [llength $argList] + if {$argCount < 1 || $argCount > 2} { + mwutil::wrongNumArgs "$win embedcheckbuttons columnIndex ?command?" + } + + synchronize $win + displayItems $win + set col [colIndex $win [lindex $argList 0] 1] + + if {$argCount == 1} { + set cmd "" + } else { + set cmd [lindex $argList 1] + } + + upvar ::tablelist::ns${win}::data data + for {set row 0} {$row < $data(itemCount)} {incr row} { + doCellConfig $row $col $win -window \ + [list ::tablelist::createFrameWithCheckbutton $cmd] + } + + return "" +} + +#------------------------------------------------------------------------------ +# tablelist::embedttkcheckbuttonSubCmd +#------------------------------------------------------------------------------ +proc tablelist::embedttkcheckbuttonSubCmd {win argList} { + set argCount [llength $argList] + if {$argCount < 1 || $argCount > 2} { + mwutil::wrongNumArgs "$win embedttkcheckbutton cellIndex ?command?" + } + + synchronize $win + displayItems $win + foreach {row col} [cellIndex $win [lindex $argList 0] 1] {} + + if {$argCount == 1} { + set cmd "" + } else { + set cmd [lindex $argList 1] + } + + doCellConfig $row $col $win -window \ + [list ::tablelist::createFrameWithTileCheckbutton $cmd] + return "" +} + +#------------------------------------------------------------------------------ +# tablelist::embedttkcheckbuttonsSubCmd +#------------------------------------------------------------------------------ +proc tablelist::embedttkcheckbuttonsSubCmd {win argList} { + set argCount [llength $argList] + if {$argCount < 1 || $argCount > 2} { + mwutil::wrongNumArgs "$win embedttkcheckbuttons columnIndex ?command?" + } + + synchronize $win + displayItems $win + set col [colIndex $win [lindex $argList 0] 1] + + if {$argCount == 1} { + set cmd "" + } else { + set cmd [lindex $argList 1] + } + + upvar ::tablelist::ns${win}::data data + for {set row 0} {$row < $data(itemCount)} {incr row} { + doCellConfig $row $col $win -window \ + [list ::tablelist::createFrameWithTileCheckbutton $cmd] + } + + return "" +} + #------------------------------------------------------------------------------ # tablelist::entrypathSubCmd #------------------------------------------------------------------------------ @@ -2227,8 +2447,11 @@ proc tablelist::expandSubCmd {win argList} { } if {![string match "expand*SubCmd" $callerProc]} { + hdr_adjustElidedText $win + hdr_updateColors $win adjustElidedText $win redisplayVisibleItems $win + updateColors $win makeStripes $win adjustSepsWhenIdle $win updateVScrlbarWhenIdle $win @@ -2302,8 +2525,11 @@ proc tablelist::expandallSubCmd {win argList} { } } + hdr_adjustElidedText $win + hdr_updateColors $win adjustElidedText $win redisplayVisibleItems $win + updateColors $win makeStripes $win adjustSepsWhenIdle $win updateVScrlbarWhenIdle $win @@ -2344,7 +2570,7 @@ proc tablelist::fillcolumnSubCmd {win argList} { synchronize $win displayItems $win - set colIdx [colIndex $win [lindex $argList 0] 1] + set col [colIndex $win [lindex $argList 0] 1] set text [lindex $argList 1] # @@ -2352,7 +2578,7 @@ proc tablelist::fillcolumnSubCmd {win argList} { # set newItemList {} foreach item $data(itemList) { - set item [lreplace $item $colIdx $colIdx $text] + set item [lreplace $item $col $col $text] lappend newItemList $item } set data(itemList) $newItemList @@ -2366,8 +2592,8 @@ proc tablelist::fillcolumnSubCmd {win argList} { # Adjust the columns and make sure the specified # column will be redisplayed at idle time # - adjustColumns $win $colIdx 1 - redisplayColWhenIdle $win $colIdx + adjustColumns $win $col 1 + redisplayColWhenIdle $win $col updateViewWhenIdle $win return "" } @@ -2391,7 +2617,6 @@ proc tablelist::findcolumnnameSubCmd {win argList} { return $col } } - return -1 } @@ -2401,8 +2626,8 @@ proc tablelist::findcolumnnameSubCmd {win argList} { proc tablelist::findrownameSubCmd {win argList} { set argCount [llength $argList] if {$argCount < 1} { - mwutil::wrongNumArgs "$win findrowname name ?-descend?\ - ?-parent nodeIndex?" + mwutil::wrongNumArgs \ + "$win findrowname name ?-descend? ?-parent nodeIndex?" } synchronize $win @@ -2463,7 +2688,6 @@ proc tablelist::findrownameSubCmd {win argList} { } } } - return -1 } @@ -2497,8 +2721,8 @@ proc tablelist::formatinfoSubCmd {win argList} { proc tablelist::getSubCmd {win argList} { set argCount [llength $argList] if {$argCount < 1 || $argCount > 2} { - mwutil::wrongNumArgs "$win get firstIndex lastIndex" \ - "$win get indexList" + mwutil::wrongNumArgs \ + "$win get firstIndex lastIndex" "$win get indexList" } synchronize $win @@ -2553,8 +2777,9 @@ proc tablelist::getSubCmd {win argList} { proc tablelist::getcellsSubCmd {win argList} { set argCount [llength $argList] if {$argCount < 1 || $argCount > 2} { - mwutil::wrongNumArgs "$win getcells firstCellIndex lastCellIndex" \ - "$win getcells cellIndexList" + mwutil::wrongNumArgs \ + "$win getcells firstCellIndex lastCellIndex" \ + "$win getcells cellIndexList" } synchronize $win @@ -2596,7 +2821,7 @@ proc tablelist::getcolumnsSubCmd {win argList} { set argCount [llength $argList] if {$argCount < 1 || $argCount > 2} { mwutil::wrongNumArgs \ - "$win getcolumns firstColumnIndex lastColumnIndex" \ + "$win getcolumns firstColumn lastColumn" \ "$win getcolumns columnIndexList" } @@ -2644,8 +2869,9 @@ proc tablelist::getcolumnsSubCmd {win argList} { proc tablelist::getformattedSubCmd {win argList} { set argCount [llength $argList] if {$argCount < 1 || $argCount > 2} { - mwutil::wrongNumArgs "$win getformatted firstIndex lastIndex" \ - "$win getformatted indexList" + mwutil::wrongNumArgs \ + "$win getformatted firstIndex lastIndex" \ + "$win getformatted indexList" } synchronize $win @@ -2764,7 +2990,7 @@ proc tablelist::getformattedcolumnsSubCmd {win argList} { set argCount [llength $argList] if {$argCount < 1 || $argCount > 2} { mwutil::wrongNumArgs \ - "$win getformattedcolumns firstColumnIndex lastColumnIndex" \ + "$win getformattedcolumns firstColumn lastColumn" \ "$win getformattedcolumns columnIndexList" } @@ -2828,8 +3054,9 @@ proc tablelist::getformattedcolumnsSubCmd {win argList} { proc tablelist::getfullkeysSubCmd {win argList} { set argCount [llength $argList] if {$argCount < 1 || $argCount > 2} { - mwutil::wrongNumArgs "$win getfullkeys firstIndex lastIndex" \ - "$win getfullkeys indexList" + mwutil::wrongNumArgs \ + "$win getfullkeys firstIndex lastIndex" \ + "$win getfullkeys indexList" } synchronize $win @@ -2883,8 +3110,8 @@ proc tablelist::getfullkeysSubCmd {win argList} { proc tablelist::getkeysSubCmd {win argList} { set argCount [llength $argList] if {$argCount < 1 || $argCount > 2} { - mwutil::wrongNumArgs "$win getkeys firstIndex lastIndex" \ - "$win getkeys indexList" + mwutil::wrongNumArgs \ + "$win getkeys firstIndex lastIndex" "$win getkeys indexList" } synchronize $win @@ -2987,93 +3214,1275 @@ proc tablelist::hasrowattribSubCmd {win argList} { } #------------------------------------------------------------------------------ -# tablelist::hidetargetmarkSubCmd +# tablelist::headerSubCmd #------------------------------------------------------------------------------ -proc tablelist::hidetargetmarkSubCmd {win argList} { - if {[llength $argList] != 0} { - mwutil::wrongNumArgs "$win hidetargetmark" +proc tablelist::headerSubCmd {win argList} { + if {[llength $argList] == 0} { + mwutil::wrongNumArgs "$win header option ?arg arg ...?" } - upvar ::tablelist::ns${win}::data data - place forget $data(rowGap) - return "" + variable headerOpts + set opt [mwutil::fullOpt "option" [lindex $argList 0] $headerOpts] + return [header_${opt}SubCmd $win [lrange $argList 1 end]] } #------------------------------------------------------------------------------ -# tablelist::imagelabelpathSubCmd +# tablelist::header_bboxSubCmd #------------------------------------------------------------------------------ -proc tablelist::imagelabelpathSubCmd {win argList} { +proc tablelist::header_bboxSubCmd {win argList} { if {[llength $argList] != 1} { - mwutil::wrongNumArgs "$win imagelabelpath cellIndex" + mwutil::wrongNumArgs "$win header bbox headerIndex" } - synchronize $win - foreach {row col} [cellIndex $win [lindex $argList 0] 1] {} + set index [hdr_rowIndex $win [lindex $argList 0] 0] + upvar ::tablelist::ns${win}::data data - set key [lindex $data(keyList) $row] - set w $data(body).img_$key,$col - if {[winfo exists $w]} { - return $w - } else { - return "" + set w $data(hdrTxt) + set dlineinfo [$w dlineinfo [expr {$index + 2}].0] + if {$data(hdr_itemCount) == 0 || [llength $dlineinfo] == 0} { + return {} + } + + set spacing1 [$w cget -spacing1] + set spacing3 [$w cget -spacing3] + foreach {x y width height baselinePos} $dlineinfo {} + incr height -[expr {$spacing1 + $spacing3}] + if {$height < 0} { + set height 0 } + return [list [expr {$x + [winfo x $w]}] \ + [expr {$y + [winfo y $w] + $spacing1}] $width $height] } #------------------------------------------------------------------------------ -# tablelist::indexSubCmd +# tablelist::header_cellattribSubCmd #------------------------------------------------------------------------------ -proc tablelist::indexSubCmd {win argList} { - if {[llength $argList] != 1} { - mwutil::wrongNumArgs "$win index index" +proc tablelist::header_cellattribSubCmd {win argList} { + if {[llength $argList] < 1} { + mwutil::wrongNumArgs \ + "$win header cellattrib headerCellIndex ?name? ?value\ + name value ...?" } - synchronize $win - return [rowIndex $win [lindex $argList 0] 1] + foreach {row col} [hdr_cellIndex $win [lindex $argList 0] 1] {} + upvar ::tablelist::ns${win}::data data + set key [lindex $data(hdr_keyList) $row] + return [mwutil::attribSubCmd $win $key,$col [lrange $argList 1 end]] } #------------------------------------------------------------------------------ -# tablelist::insertSubCmd +# tablelist::header_cellbboxSubCmd #------------------------------------------------------------------------------ -proc tablelist::insertSubCmd {win argList} { - if {[llength $argList] < 1} { - mwutil::wrongNumArgs "$win insert index ?item item ...?" +proc tablelist::header_cellbboxSubCmd {win argList} { + if {[llength $argList] != 1} { + mwutil::wrongNumArgs "$win header cellbbox headerCellIndex" } + foreach {row col} [hdr_cellIndex $win [lindex $argList 0] 0] {} upvar ::tablelist::ns${win}::data data - if {$data(isDisabled)} { - return "" + if {$row < 0 || $row > $data(hdr_lastRow) || + $col < 0 || $col > $data(lastCol)} { + return {} } - synchronize $win - set index [rowIndex $win [lindex $argList 0] 1] - return [insertRows $win $index [lrange $argList 1 end] \ - $data(hasListVar) root $index] + foreach {x y width height} [header_bboxSubCmd $win $row] {} + set w $data(hdrTxtFrmLbl)$col + return [list [expr {[winfo rootx $w] - [winfo rootx $win]}] $y \ + [winfo width $w] $height] } #------------------------------------------------------------------------------ -# tablelist::insertchildlistSubCmd +# tablelist::header_cellcgetSubCmd #------------------------------------------------------------------------------ -proc tablelist::insertchildlistSubCmd {win argList} { - if {[llength $argList] != 3} { - mwutil::wrongNumArgs "$win insertchildlist parentNodeIndex childIndex\ - itemList" - } - - upvar ::tablelist::ns${win}::data data - if {$data(isDisabled)} { - return "" +proc tablelist::header_cellcgetSubCmd {win argList} { + if {[llength $argList] != 2} { + mwutil::wrongNumArgs "$win header cellcget headerCellIndex option" } - synchronize $win - set parentKey [nodeIndexToKey $win [lindex $argList 0]] - set childIdx [lindex $argList 1] - set listIdx [nodeRow $win $parentKey $childIdx] - set itemList [lindex $argList 2] - set result [insertRows $win $listIdx $itemList $data(hasListVar) \ - $parentKey $childIdx] + foreach {row col} [hdr_cellIndex $win [lindex $argList 0] 1] {} + variable hdr_cellConfigSpecs + set opt [mwutil::fullConfigOpt [lindex $argList 1] hdr_cellConfigSpecs] + return [doCellCget h$row $col $win $opt] +} - if {$data(colCount) == 0} { - return $result +#------------------------------------------------------------------------------ +# tablelist::header_cellconfigureSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_cellconfigureSubCmd {win argList} { + if {[llength $argList] < 1} { + mwutil::wrongNumArgs \ + "$win header cellconfigure headerCellIndex ?option? ?value\ + option value ...?" + } + + variable hdr_cellConfigSpecs + foreach {row col} [hdr_cellIndex $win [lindex $argList 0] 1] {} + return [mwutil::configureSubCmd $win hdr_cellConfigSpecs \ + "tablelist::doCellConfig h$row $col" \ + "tablelist::doCellCget h$row $col" [lrange $argList 1 end]] +} + +#------------------------------------------------------------------------------ +# tablelist::header_cellindexSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_cellindexSubCmd {win argList} { + if {[llength $argList] != 1} { + mwutil::wrongNumArgs "$win header cellindex headerCellIndex" + } + + return [join [hdr_cellIndex $win [lindex $argList 0] 0] ","] +} + +#------------------------------------------------------------------------------ +# tablelist::header_configcelllistSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_configcelllistSubCmd {win argList} { + if {[llength $argList] != 1} { + mwutil::wrongNumArgs \ + "$win header configcelllist headerCellConfigSpecList" + } + + return [header_configcellsSubCmd $win [lindex $argList 0]] +} + +#------------------------------------------------------------------------------ +# tablelist::header_configcellsSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_configcellsSubCmd {win argList} { + variable hdr_cellConfigSpecs + + set argCount [llength $argList] + foreach {cell opt val} $argList { + if {$argCount == 1} { + return -code error "option and value for \"$cell\" missing" + } elseif {$argCount == 2} { + return -code error "value for \"$opt\" missing" + } + foreach {row col} [hdr_cellIndex $win $cell 1] {} + mwutil::configureWidget $win hdr_cellConfigSpecs \ + "tablelist::doCellConfig h$row $col" \ + "tablelist::doCellCget h$row $col" [list $opt $val] 0 + incr argCount -3 + } + + return "" +} + +#------------------------------------------------------------------------------ +# tablelist::header_configrowlistSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_configrowlistSubCmd {win argList} { + if {[llength $argList] != 1} { + mwutil::wrongNumArgs "$win header configrowlist headerRowConfigSpecList" + } + + return [header_configrowsSubCmd $win [lindex $argList 0]] +} + +#------------------------------------------------------------------------------ +# tablelist::header_configrowsSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_configrowsSubCmd {win argList} { + variable hdr_rowConfigSpecs + + set argCount [llength $argList] + foreach {rowSpec opt val} $argList { + if {$argCount == 1} { + return -code error "option and value for \"$rowSpec\" missing" + } elseif {$argCount == 2} { + return -code error "value for \"$opt\" missing" + } + set row [hdr_rowIndex $win $rowSpec 0 1] + mwutil::configureWidget $win hdr_rowConfigSpecs \ + "tablelist::doRowConfig h$row" "tablelist::doRowCget $row" \ + [list $opt $val] 0 + incr argCount -3 + } + + return "" +} + +#------------------------------------------------------------------------------ +# tablelist::header_containingSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_containingSubCmd {win argList} { + if {[llength $argList] != 1} { + mwutil::wrongNumArgs "$win header containing y" + } + + set y [format "%d" [lindex $argList 0]] + return [hdr_containingRow $win $y] +} + +#------------------------------------------------------------------------------ +# tablelist::header_containingcellSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_containingcellSubCmd {win argList} { + if {[llength $argList] != 2} { + mwutil::wrongNumArgs "$win header containingcell x y" + } + + set x [format "%d" [lindex $argList 0]] + set y [format "%d" [lindex $argList 1]] + return [hdr_containingRow $win $y],[containingCol $win $x] +} + +#------------------------------------------------------------------------------ +# tablelist::header_deleteSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_deleteSubCmd {win argList} { + set argCount [llength $argList] + if {$argCount < 1 || $argCount > 2} { + mwutil::wrongNumArgs \ + "$win header delete firstHeaderIndex lastHeaderIndex" \ + "$win header delete headerIndexList" + } + + upvar ::tablelist::ns${win}::data data + if {$data(isDisabled)} { + return "" + } + + set first [lindex $argList 0] + + if {$argCount == 1} { + if {[llength $first] == 1} { ;# just to save time + set index [hdr_rowIndex $win [lindex $first 0] 0] + return [hdr_deleteRows $win $index $index] + } elseif {$data(hdr_itemCount) == 0} { ;# no header items present + return "" + } else { ;# a bit more work + # + # Sort the numerical equivalents of the + # specified indices in decreasing order + # + set indexList {} + foreach elem $first { + set index [hdr_rowIndex $win $elem 0] + if {$index < 0} { + set index 0 + } elseif {$index > $data(hdr_lastRow)} { + set index $data(hdr_lastRow) + } + lappend indexList $index + } + set indexList [lsort -integer -decreasing $indexList] + + # + # Traverse the sorted index list and ignore any duplicates + # + set prevIndex -1 + foreach index $indexList { + if {$index != $prevIndex} { + hdr_deleteRows $win $index $index + set prevIndex $index + } + } + return "" + } + } else { + set first [hdr_rowIndex $win $first 0] + set last [hdr_rowIndex $win [lindex $argList 1] 0] + return [hdr_deleteRows $win $first $last] + } +} + +#------------------------------------------------------------------------------ +# tablelist::header_embedcheckbuttonSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_embedcheckbuttonSubCmd {win argList} { + set argCount [llength $argList] + if {$argCount < 1 || $argCount > 2} { + mwutil::wrongNumArgs \ + "$win header embedcheckbutton headerCellIndex ?command?" + } + + foreach {row col} [hdr_cellIndex $win [lindex $argList 0] 1] {} + + if {$argCount == 1} { + set cmd "" + } else { + set cmd [lindex $argList 1] + } + + doCellConfig h$row $col $win -window \ + [list ::tablelist::hdr_createFrameWithCheckbutton $cmd] + return "" +} + +#------------------------------------------------------------------------------ +# tablelist::header_embedcheckbuttonsSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_embedcheckbuttonsSubCmd {win argList} { + set argCount [llength $argList] + if {$argCount < 1 || $argCount > 2} { + mwutil::wrongNumArgs \ + "$win header embedcheckbuttons columnIndex ?command?" + } + + set col [colIndex $win [lindex $argList 0] 1] + + if {$argCount == 1} { + set cmd "" + } else { + set cmd [lindex $argList 1] + } + + upvar ::tablelist::ns${win}::data data + for {set row 0} {$row < $data(hdr_itemCount)} {incr row} { + doCellConfig h$row $col $win -window \ + [list ::tablelist::hdr_createFrameWithCheckbutton $cmd] + } + + return "" +} + +#------------------------------------------------------------------------------ +# tablelist::header_embedttkcheckbuttonSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_embedttkcheckbuttonSubCmd {win argList} { + set argCount [llength $argList] + if {$argCount < 1 || $argCount > 2} { + mwutil::wrongNumArgs \ + "$win header embedttkcheckbutton headerCellIndex ?command?" + } + + foreach {row col} [hdr_cellIndex $win [lindex $argList 0] 1] {} + + if {$argCount == 1} { + set cmd "" + } else { + set cmd [lindex $argList 1] + } + + doCellConfig h$row $col $win -window \ + [list ::tablelist::hdr_createFrameWithTileCheckbutton $cmd] + return "" +} + +#------------------------------------------------------------------------------ +# tablelist::header_embedttkcheckbuttonsSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_embedttkcheckbuttonsSubCmd {win argList} { + set argCount [llength $argList] + if {$argCount < 1 || $argCount > 2} { + mwutil::wrongNumArgs \ + "$win header embedttkcheckbuttons columnIndex ?command?" + } + + set col [colIndex $win [lindex $argList 0] 1] + + if {$argCount == 1} { + set cmd "" + } else { + set cmd [lindex $argList 1] + } + + upvar ::tablelist::ns${win}::data data + for {set row 0} {$row < $data(hdr_itemCount)} {incr row} { + doCellConfig h$row $col $win -window \ + [list ::tablelist::hdr_createFrameWithTileCheckbutton $cmd] + } + + return "" +} + +#------------------------------------------------------------------------------ +# tablelist::header_fillcolumnSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_fillcolumnSubCmd {win argList} { + if {[llength $argList] != 2} { + mwutil::wrongNumArgs "$win header fillcolumn columnIndex text" + } + + upvar ::tablelist::ns${win}::data data + if {$data(isDisabled)} { + return "" + } + + set col [colIndex $win [lindex $argList 0] 1] + set text [lindex $argList 1] + + # + # Update the item list + # + set hdr_newItemList {} + foreach item $data(hdr_itemList) { + set item [lreplace $item $col $col $text] + lappend hdr_newItemList $item + } + set data(hdr_itemList) $hdr_newItemList + + # + # Adjust the columns and make sure the specified + # column will be redisplayed at idle time + # + adjustColumns $win $col 1 + redisplayColWhenIdle $win $col + updateViewWhenIdle $win + return "" +} + +#------------------------------------------------------------------------------ +# tablelist::header_findrownameSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_findrownameSubCmd {win argList} { + if {[llength $argList] != 1} { + mwutil::wrongNumArgs "$win header findrowname name" + } + + set name [lindex $argList 0] + set nameIsEmpty [expr {[string length $name] == 0}] + + upvar ::tablelist::ns${win}::data data + for {set row 0} {$row < $data(hdr_itemCount)} {incr row} { + set key [lindex $data(hdr_keyList) $row] + set hasName [info exists data($key-name)] + if {($hasName && [string compare $name $data($key-name)] == 0) || + (!$hasName && $nameIsEmpty)} { + return $row + } + } + return -1 +} + +#------------------------------------------------------------------------------ +# tablelist::header_getSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_getSubCmd {win argList} { + set argCount [llength $argList] + if {$argCount < 1 || $argCount > 2} { + mwutil::wrongNumArgs \ + "$win header get firstHeaderIndex lastHeaderIndex" \ + "$win header get headerIndexList" + } + + set first [lindex $argList 0] + + # + # Get the specified items from the internal list + # + upvar ::tablelist::ns${win}::data data + set result {} + if {$argCount == 1} { + foreach elem $first { + set row [hdr_rowIndex $win $elem 0] + if {$row >= 0 && $row < $data(hdr_itemCount)} { + set item [lindex $data(hdr_itemList) $row] + lappend result [lrange $item 0 $data(lastCol)] + } + } + + if {[llength $first] == 1} { + return [lindex $result 0] + } else { + return $result + } + } else { + set first [hdr_rowIndex $win $first 0] + set last [hdr_rowIndex $win [lindex $argList 1] 0] + if {$last < $first} { + return {} + } + + # + # Adjust the range to fit within the existing items + # + if {$first < 0} { + set first 0 + } + if {$last > $data(hdr_lastRow)} { + set last $data(hdr_lastRow) + } + + foreach item [lrange $data(hdr_itemList) $first $last] { + lappend result [lrange $item 0 $data(lastCol)] + } + return $result + } +} + +#------------------------------------------------------------------------------ +# tablelist::header_getcellsSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_getcellsSubCmd {win argList} { + set argCount [llength $argList] + if {$argCount < 1 || $argCount > 2} { + mwutil::wrongNumArgs \ + "$win header getcells firstHeaderCell lastHeaderCell" \ + "$win header getcells headerCellIndexList" + } + + set first [lindex $argList 0] + + # + # Get the specified elements from the internal list + # + upvar ::tablelist::ns${win}::data data + set result {} + if {$argCount == 1} { + foreach elem $first { + foreach {row col} [hdr_cellIndex $win $elem 1] {} + lappend result [lindex [lindex $data(hdr_itemList) $row] $col] + } + + if {[llength $first] == 1} { + return [lindex $result 0] + } else { + return $result + } + } else { + foreach {firstRow firstCol} [hdr_cellIndex $win $first 1] {} + foreach {lastRow lastCol} [hdr_cellIndex $win [lindex $argList 1] 1] {} + + foreach item [lrange $data(hdr_itemList) $firstRow $lastRow] { + foreach elem [lrange $item $firstCol $lastCol] { + lappend result $elem + } + } + return $result + } +} + +#------------------------------------------------------------------------------ +# tablelist::header_getcolumnsSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_getcolumnsSubCmd {win argList} { + set argCount [llength $argList] + if {$argCount < 1 || $argCount > 2} { + mwutil::wrongNumArgs \ + "$win header getcolumns firstColumn lastColumn" \ + "$win header getcolumns columnIndexList" + } + + set first [lindex $argList 0] + + # + # Get the specified columns from the internal list + # + upvar ::tablelist::ns${win}::data data + set result {} + if {$argCount == 1} { + foreach elem $first { + set col [colIndex $win $elem 1] + set colResult {} + foreach item $data(hdr_itemList) { + lappend colResult [lindex $item $col] + } + lappend result $colResult + } + + if {[llength $first] == 1} { + return [lindex $result 0] + } else { + return $result + } + } else { + set first [colIndex $win $first 1] + set last [colIndex $win [lindex $argList 1] 1] + + for {set col $first} {$col <= $last} {incr col} { + set colResult {} + foreach item $data(hdr_itemList) { + lappend colResult [lindex $item $col] + } + lappend result $colResult + } + return $result + } +} + +#------------------------------------------------------------------------------ +# tablelist::header_getformattedSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_getformattedSubCmd {win argList} { + set argCount [llength $argList] + if {$argCount < 1 || $argCount > 2} { + mwutil::wrongNumArgs \ + "$win header getformatted firstHeaderIndex lastHeaderIndex" \ + "$win header getformatted headerIndexList" + } + + set first [lindex $argList 0] + + # + # Get the specified items from the internal list + # + upvar ::tablelist::ns${win}::data data + set result {} + if {$argCount == 1} { + foreach elem $first { + set row [hdr_rowIndex $win $elem 0] + if {$row >= 0 && $row < $data(hdr_itemCount)} { + set item [lindex $data(hdr_itemList) $row] + set key [lindex $item end] + set item [lrange $item 0 $data(lastCol)] + lappend result [formatItem $win $key $row $item] + } + } + + if {[llength $first] == 1} { + return [lindex $result 0] + } else { + return $result + } + } else { + set first [hdr_rowIndex $win $first 0] + set last [hdr_rowIndex $win [lindex $argList 1] 0] + if {$last < $first} { + return {} + } + + # + # Adjust the range to fit within the existing items + # + if {$first < 0} { + set first 0 + } + if {$last > $data(hdr_lastRow)} { + set last $data(hdr_lastRow) + } + + set row $first + foreach item [lrange $data(hdr_itemList) $first $last] { + set key [lindex $item end] + set item [lrange $item 0 $data(lastCol)] + lappend result [formatItem $win $key $row $item] + incr row + } + return $result + } +} + +#------------------------------------------------------------------------------ +# tablelist::header_getformattedcellsSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_getformattedcellsSubCmd {win argList} { + set argCount [llength $argList] + if {$argCount < 1 || $argCount > 2} { + mwutil::wrongNumArgs \ + "$win header getformattedcells firstHeaderCell lastHeaderCell" \ + "$win header getformattedcells headerCellIndexList" + } + + set first [lindex $argList 0] + + # + # Get the specified elements from the internal list + # + upvar ::tablelist::ns${win}::data data + set result {} + if {$argCount == 1} { + foreach elem $first { + foreach {row col} [hdr_cellIndex $win $elem 1] {} + set item [lindex $data(hdr_itemList) $row] + set key [lindex $item end] + set text [lindex $item $col] + if {[lindex $data(fmtCmdFlagList) $col]} { + set text [formatElem $win $key $row $col $text] + } + lappend result $text + } + + if {[llength $first] == 1} { + return [lindex $result 0] + } else { + return $result + } + } else { + foreach {firstRow firstCol} [hdr_cellIndex $win $first 1] {} + foreach {lastRow lastCol} [hdr_cellIndex $win [lindex $argList 1] 1] {} + + set row $firstRow + foreach item [lrange $data(hdr_itemList) $firstRow $lastRow] { + set key [lindex $item end] + set col $firstCol + foreach text [lrange $item $firstCol $lastCol] { + if {[lindex $data(fmtCmdFlagList) $col]} { + set text [formatElem $win $key $row $col $text] + } + lappend result $text + incr col + } + incr row + } + return $result + } +} + +#------------------------------------------------------------------------------ +# tablelist::header_getformattedcolumnsSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_getformattedcolumnsSubCmd {win argList} { + set argCount [llength $argList] + if {$argCount < 1 || $argCount > 2} { + mwutil::wrongNumArgs \ + "$win header getformattedcolumns firstColumn lastColumn" \ + "$win header getformattedcolumns columnIndexList" + } + + set first [lindex $argList 0] + + # + # Get the specified columns from the internal list + # + upvar ::tablelist::ns${win}::data data + set result {} + if {$argCount == 1} { + foreach elem $first { + set col [colIndex $win $elem 1] + set fmtCmdFlag [lindex $data(fmtCmdFlagList) $col] + set colResult {} + set row 0 + foreach item $data(hdr_itemList) { + set key [lindex $item end] + set text [lindex $item $col] + if {$fmtCmdFlag} { + set text [formatElem $win $key $row $col $text] + } + lappend colResult $text + incr row + } + lappend result $colResult + } + + if {[llength $first] == 1} { + return [lindex $result 0] + } else { + return $result + } + } else { + set first [colIndex $win $first 1] + set last [colIndex $win [lindex $argList 1] 1] + + for {set col $first} {$col <= $last} {incr col} { + set fmtCmdFlag [lindex $data(fmtCmdFlagList) $col] + set colResult {} + set row 0 + foreach item $data(hdr_itemList) { + set key [lindex $item end] + set text [lindex $item $col] + if {$fmtCmdFlag} { + set text [formatElem $win $key $row $col $text] + } + lappend colResult $text + incr row + } + lappend result $colResult + } + return $result + } +} + +#------------------------------------------------------------------------------ +# tablelist::header_getfullkeysSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_getfullkeysSubCmd {win argList} { + set argCount [llength $argList] + if {$argCount < 1 || $argCount > 2} { + mwutil::wrongNumArgs \ + "$win header getfullkeys firstHeaderIndex lastHeaderIndex" \ + "$win header getfullkeys headerIndexList" + } + + set first [lindex $argList 0] + + # + # Get the specified keys from the internal list + # + upvar ::tablelist::ns${win}::data data + set result {} + if {$argCount == 1} { + foreach elem $first { + set row [hdr_rowIndex $win $elem 0] + if {$row >= 0 && $row < $data(hdr_itemCount)} { + lappend result [lindex [lindex $data(hdr_itemList) $row] end] + } + } + + if {[llength $first] == 1} { + return [lindex $result 0] + } else { + return $result + } + } else { + set first [hdr_rowIndex $win $first 0] + set last [hdr_rowIndex $win [lindex $argList 1] 0] + if {$last < $first} { + return {} + } + + # + # Adjust the range to fit within the existing items + # + if {$first < 0} { + set first 0 + } + if {$last > $data(hdr_lastRow)} { + set last $data(hdr_lastRow) + } + + foreach item [lrange $data(hdr_itemList) $first $last] { + lappend result [lindex $item end] + } + return $result + } +} + +#------------------------------------------------------------------------------ +# tablelist::header_getkeysSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_getkeysSubCmd {win argList} { + set argCount [llength $argList] + if {$argCount < 1 || $argCount > 2} { + mwutil::wrongNumArgs \ + "$win header getkeys firstHeaderIndex lastHeaderIndex" \ + "$win header getkeys headerIndexList" + } + + set first [lindex $argList 0] + + # + # Get the specified keys from the internal list + # + upvar ::tablelist::ns${win}::data data + set result {} + if {$argCount == 1} { + foreach elem $first { + set row [hdr_rowIndex $win $elem 0] + if {$row >= 0 && $row < $data(hdr_itemCount)} { + set item [lindex $data(hdr_itemList) $row] + lappend result [string range [lindex $item end] 2 end] + } + } + + if {[llength $first] == 1} { + return [lindex $result 0] + } else { + return $result + } + } else { + set first [hdr_rowIndex $win $first 0] + set last [hdr_rowIndex $win [lindex $argList 1] 0] + if {$last < $first} { + return {} + } + + # + # Adjust the range to fit within the existing items + # + if {$first < 0} { + set first 0 + } + if {$last > $data(hdr_lastRow)} { + set last $data(hdr_lastRow) + } + + foreach item [lrange $data(hdr_itemList) $first $last] { + lappend result [string range [lindex $item end] 2 end] + } + return $result + } +} + +#------------------------------------------------------------------------------ +# tablelist::header_hascellattribSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_hascellattribSubCmd {win argList} { + if {[llength $argList] != 2} { + mwutil::wrongNumArgs "$win header hascellattrib headerCellIndex name" + } + + foreach {row col} [hdr_cellIndex $win [lindex $argList 0] 1] {} + upvar ::tablelist::ns${win}::data data + set key [lindex $data(hdr_keyList) $row] + return [mwutil::hasattribSubCmd $win $key,$col [lindex $argList 1]] +} + +#------------------------------------------------------------------------------ +# tablelist::header_hasrowattribSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_hasrowattribSubCmd {win argList} { + if {[llength $argList] != 2} { + mwutil::wrongNumArgs "$win header hasrowattrib headerIndex name" + } + + set row [hdr_rowIndex $win [lindex $argList 0] 0 1] + upvar ::tablelist::ns${win}::data data + set key [lindex $data(hdr_keyList) $row] + return [mwutil::hasattribSubCmd $win $key [lindex $argList 1]] +} + +#------------------------------------------------------------------------------ +# tablelist::header_imagelabelpathSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_imagelabelpathSubCmd {win argList} { + if {[llength $argList] != 1} { + mwutil::wrongNumArgs "$win header imagelabelpath headerCellIndex" + } + + foreach {row col} [hdr_cellIndex $win [lindex $argList 0] 1] {} + upvar ::tablelist::ns${win}::data data + set key [lindex $data(hdr_keyList) $row] + set w $data(hdrTxt).img_$key,$col + if {[winfo exists $w]} { + return $w + } else { + return "" + } +} + +#------------------------------------------------------------------------------ +# tablelist::header_indexSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_indexSubCmd {win argList} { + if {[llength $argList] != 1} { + mwutil::wrongNumArgs "$win header index headerIndex" + } + + return [hdr_rowIndex $win [lindex $argList 0] 1] +} + +#------------------------------------------------------------------------------ +# tablelist::header_insertSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_insertSubCmd {win argList} { + if {[llength $argList] < 1} { + mwutil::wrongNumArgs "$win header insert headerIndex ?item item ...?" + } + + upvar ::tablelist::ns${win}::data data + if {$data(isDisabled)} { + return "" + } + + set index [hdr_rowIndex $win [lindex $argList 0] 1] + return [hdr_insertRows $win $index [lrange $argList 1 end]] +} + +#------------------------------------------------------------------------------ +# tablelist::header_insertlistSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_insertlistSubCmd {win argList} { + if {[llength $argList] != 2} { + mwutil::wrongNumArgs "$win header insertlist headerIndex itemList" + } + + upvar ::tablelist::ns${win}::data data + if {$data(isDisabled)} { + return "" + } + + set index [hdr_rowIndex $win [lindex $argList 0] 1] + return [hdr_insertRows $win $index [lindex $argList 1]] +} + +#------------------------------------------------------------------------------ +# tablelist::header_iselemsnippedSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_iselemsnippedSubCmd {win argList} { + if {[llength $argList] != 2} { + mwutil::wrongNumArgs \ + "$win header iselemsnipped headerCellIndex fullTextName" + } + + foreach {row col} [hdr_cellIndex $win [lindex $argList 0] 1] {} + set fullTextName [lindex $argList 1] + upvar 3 $fullTextName fullText + + upvar ::tablelist::ns${win}::data data + set item [lindex $data(hdr_itemList) $row] + set key [lindex $item end] + set fullText [lindex $item $col] + if {[lindex $data(fmtCmdFlagList) $col]} { + set fullText [formatElem $win $key $row $col $fullText] + } + if {[string match "*\t*" $fullText]} { + set fullText [mapTabs $fullText] + } + + set pixels [lindex $data(colList) [expr {2*$col}]] + if {$pixels == 0} { ;# convention: dynamic width + if {$data($col-maxPixels) > 0 && + $data($col-reqPixels) > $data($col-maxPixels)} { + set pixels $data($col-maxPixels) + } + } + if {$pixels == 0 || $data($col-wrap)} { + return 0 + } + + set text $fullText + getAuxData $win $key $col auxType auxWidth $pixels + set indentWidth 0 + set cellFont [getCellFont $win $key $col] + incr pixels $data($col-delta) + + if {[string match "*\n*" $text]} { + set list [split $text "\n"] + adjustMlElem $win list auxWidth indentWidth $cellFont $pixels "r" "" + set text [join $list "\n"] + } else { + adjustElem $win text auxWidth indentWidth $cellFont $pixels "r" "" + } + + return [expr {[string compare $text $fullText] != 0}] +} + +#------------------------------------------------------------------------------ +# tablelist::header_itemlistvarSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_itemlistvarSubCmd {win argList} { + if {[llength $argList] != 0} { + mwutil::wrongNumArgs "$win header itemlistvar" + } + + return ::tablelist::ns${win}::data(hdr_itemList) +} + +#------------------------------------------------------------------------------ +# tablelist::header_nearestSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_nearestSubCmd {win argList} { + if {[llength $argList] != 1} { + mwutil::wrongNumArgs "$win header nearest y" + } + + set y [format "%d" [lindex $argList 0]] + return [hdr_rowIndex $win @0,$y 0] +} + +#------------------------------------------------------------------------------ +# tablelist::header_nearestcellSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_nearestcellSubCmd {win argList} { + if {[llength $argList] != 2} { + mwutil::wrongNumArgs "$win header nearestcell x y" + } + + set x [format "%d" [lindex $argList 0]] + set y [format "%d" [lindex $argList 1]] + return [join [hdr_cellIndex $win @$x,$y 0] ","] +} + +#------------------------------------------------------------------------------ +# tablelist::header_rowattribSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_rowattribSubCmd {win argList} { + if {[llength $argList] < 1} { + mwutil::wrongNumArgs \ + "$win header rowattrib headerIndex ?name? ?value\ + name value ...?" + } + + set row [hdr_rowIndex $win [lindex $argList 0] 0 1] + upvar ::tablelist::ns${win}::data data + set key [lindex $data(hdr_keyList) $row] + return [mwutil::attribSubCmd $win $key [lrange $argList 1 end]] +} + +#------------------------------------------------------------------------------ +# tablelist::header_rowcgetSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_rowcgetSubCmd {win argList} { + if {[llength $argList] != 2} { + mwutil::wrongNumArgs "$win header rowcget headerIndex option" + } + + set row [hdr_rowIndex $win [lindex $argList 0] 0 1] + variable hdr_rowConfigSpecs + set opt [mwutil::fullConfigOpt [lindex $argList 1] hdr_rowConfigSpecs] + return [doRowCget h$row $win $opt] +} + +#------------------------------------------------------------------------------ +# tablelist::header_rowconfigureSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_rowconfigureSubCmd {win argList} { + if {[llength $argList] < 1} { + mwutil::wrongNumArgs \ + "$win header rowconfigure headerIndex ?option? ?value\ + option value ...?" + } + + variable hdr_rowConfigSpecs + set row [hdr_rowIndex $win [lindex $argList 0] 0 1] + return [mwutil::configureSubCmd $win hdr_rowConfigSpecs \ + "tablelist::doRowConfig h$row" "tablelist::doRowCget h$row" \ + [lrange $argList 1 end]] +} + +#------------------------------------------------------------------------------ +# tablelist::header_sizeSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_sizeSubCmd {win argList} { + if {[llength $argList] != 0} { + mwutil::wrongNumArgs "$win header size" + } + + upvar ::tablelist::ns${win}::data data + return $data(hdr_itemCount) +} + +#------------------------------------------------------------------------------ +# tablelist::header_unsetcellattribSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_unsetcellattribSubCmd {win argList} { + if {[llength $argList] != 2} { + mwutil::wrongNumArgs "$win header unsetcellattrib headerCellIndex name" + } + + foreach {row col} [hdr_cellIndex $win [lindex $argList 0] 1] {} + upvar ::tablelist::ns${win}::data data + set key [lindex $data(hdr_keyList) $row] + return [mwutil::unsetattribSubCmd $win $key,$col [lindex $argList 1]] +} + +#------------------------------------------------------------------------------ +# tablelist::header_unsetrowattribSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_unsetrowattribSubCmd {win argList} { + if {[llength $argList] != 2} { + mwutil::wrongNumArgs "$win header unsetrowattrib headerIndex name" + } + + set row [hdr_rowIndex $win [lindex $argList 0] 0] + upvar ::tablelist::ns${win}::data data + set key [lindex $data(hdr_keyList) $row] + return [mwutil::unsetattribSubCmd $win $key [lindex $argList 1]] +} + +#------------------------------------------------------------------------------ +# tablelist::header_windowpathSubCmd +#------------------------------------------------------------------------------ +proc tablelist::header_windowpathSubCmd {win argList} { + if {[llength $argList] != 1} { + mwutil::wrongNumArgs "$win header windowpath headerCellIndex" + } + + foreach {row col} [hdr_cellIndex $win [lindex $argList 0] 1] {} + upvar ::tablelist::ns${win}::data data + set key [lindex $data(hdr_keyList) $row] + set w $data(hdrTxt).frm_$key,$col.w + if {[winfo exists $w]} { + return $w + } else { + return "" + } +} + +#------------------------------------------------------------------------------ +# tablelist::headerpathSubCmd +#------------------------------------------------------------------------------ +proc tablelist::headerpathSubCmd {win argList} { + if {[llength $argList] != 0} { + mwutil::wrongNumArgs "$win headerpath" + } + + upvar ::tablelist::ns${win}::data data + return $data(hdrTxt) +} + +#------------------------------------------------------------------------------ +# tablelist::headertagSubCmd +#------------------------------------------------------------------------------ +proc tablelist::headertagSubCmd {win argList} { + if {[llength $argList] != 0} { + mwutil::wrongNumArgs "$win headertag" + } + + upvar ::tablelist::ns${win}::data data + return $data(headerTag) +} + +#------------------------------------------------------------------------------ +# tablelist::hidetargetmarkSubCmd +#------------------------------------------------------------------------------ +proc tablelist::hidetargetmarkSubCmd {win argList} { + if {[llength $argList] != 0} { + mwutil::wrongNumArgs "$win hidetargetmark" + } + + upvar ::tablelist::ns${win}::data data + place forget $data(rowGap) + return "" +} + +#------------------------------------------------------------------------------ +# tablelist::imagelabelpathSubCmd +#------------------------------------------------------------------------------ +proc tablelist::imagelabelpathSubCmd {win argList} { + if {[llength $argList] != 1} { + mwutil::wrongNumArgs "$win imagelabelpath cellIndex" + } + + synchronize $win + foreach {row col} [cellIndex $win [lindex $argList 0] 1] {} + upvar ::tablelist::ns${win}::data data + set key [lindex $data(keyList) $row] + set w $data(body).img_$key,$col + if {[winfo exists $w]} { + return $w + } else { + return "" + } +} + +#------------------------------------------------------------------------------ +# tablelist::indexSubCmd +#------------------------------------------------------------------------------ +proc tablelist::indexSubCmd {win argList} { + if {[llength $argList] != 1} { + mwutil::wrongNumArgs "$win index index" + } + + synchronize $win + return [rowIndex $win [lindex $argList 0] 1] +} + +#------------------------------------------------------------------------------ +# tablelist::insertSubCmd +#------------------------------------------------------------------------------ +proc tablelist::insertSubCmd {win argList} { + if {[llength $argList] < 1} { + mwutil::wrongNumArgs "$win insert index ?item item ...?" + } + + upvar ::tablelist::ns${win}::data data + if {$data(isDisabled)} { + return "" + } + + synchronize $win + set index [rowIndex $win [lindex $argList 0] 1] + return [insertRows $win $index [lrange $argList 1 end] \ + $data(hasListVar) root $index] +} + +#------------------------------------------------------------------------------ +# tablelist::insertchildlistSubCmd +#------------------------------------------------------------------------------ +proc tablelist::insertchildlistSubCmd {win argList} { + if {[llength $argList] != 3} { + mwutil::wrongNumArgs \ + "$win insertchildlist parentNodeIndex childIndex itemList" + } + + upvar ::tablelist::ns${win}::data data + if {$data(isDisabled)} { + return "" + } + + synchronize $win + set parentKey [nodeIndexToKey $win [lindex $argList 0]] + set childIdx [lindex $argList 1] + set listIdx [nodeRow $win $parentKey $childIdx] + set itemList [lindex $argList 2] + set result [insertRows $win $listIdx $itemList $data(hasListVar) \ + $parentKey $childIdx] + + if {$data(colCount) == 0} { + return $result } displayItems $win @@ -3132,8 +4541,8 @@ proc tablelist::insertchildlistSubCmd {win argList} { #------------------------------------------------------------------------------ proc tablelist::insertchildrenSubCmd {win argList} { if {[llength $argList] < 2} { - mwutil::wrongNumArgs "$win insertchildren parentNodeIndex childIndex\ - ?item item ...?" + mwutil::wrongNumArgs \ + "$win insertchildren parentNodeIndex childIndex ?item item ...?" } return [insertchildlistSubCmd $win [list [lindex $argList 0] \ @@ -3170,8 +4579,9 @@ proc tablelist::insertcolumnlistSubCmd {win argList} { #------------------------------------------------------------------------------ proc tablelist::insertcolumnsSubCmd {win argList} { if {[llength $argList] < 1} { - mwutil::wrongNumArgs "$win insertcolumns columnIndex\ - ?width title ?alignment? width title ?alignment? ...?" + mwutil::wrongNumArgs \ + "$win insertcolumns columnIndex ?width title ?alignment?\ + width title ?alignment? ...?" } upvar ::tablelist::ns${win}::data data @@ -3342,7 +4752,6 @@ proc tablelist::itemtodictSubCmd {win argList} { } dict set dictionary $key [lindex $item $col] } - return $dictionary } @@ -3372,7 +4781,6 @@ proc tablelist::labelsSubCmd {win argList} { for {set col 0} {$col < $data(colCount)} {incr col} { lappend labelList $data(hdrTxtFrmLbl)$col } - return $labelList } @@ -3417,8 +4825,8 @@ proc tablelist::moveSubCmd {win argList} { #------------------------------------------------------------------------------ proc tablelist::movecolumnSubCmd {win argList} { if {[llength $argList] != 2} { - mwutil::wrongNumArgs "$win movecolumn sourceColumnIndex\ - targetColumnIndex" + mwutil::wrongNumArgs \ + "$win movecolumn sourceColumnIndex targetColumnIndex" } synchronize $win @@ -3582,8 +4990,8 @@ proc tablelist::resetsortinfoSubCmd {win argList} { #------------------------------------------------------------------------------ proc tablelist::rowattribSubCmd {win argList} { if {[llength $argList] < 1} { - mwutil::wrongNumArgs "$win rowattrib index ?name? ?value\ - name value ...?" + mwutil::wrongNumArgs \ + "$win rowattrib index ?name? ?value name value ...?" } synchronize $win @@ -3613,8 +5021,8 @@ proc tablelist::rowcgetSubCmd {win argList} { #------------------------------------------------------------------------------ proc tablelist::rowconfigureSubCmd {win argList} { if {[llength $argList] < 1} { - mwutil::wrongNumArgs "$win rowconfigure index ?option? ?value\ - option value ...?" + mwutil::wrongNumArgs \ + "$win rowconfigure index ?option? ?value option value ...?" } synchronize $win @@ -3911,8 +5319,9 @@ proc tablelist::seecolumnSubCmd {win argList} { proc tablelist::selectionSubCmd {win argList} { set argCount [llength $argList] if {$argCount < 2 || $argCount > 3} { - mwutil::wrongNumArgs "$win selection option firstIndex lastIndex" \ - "$win selection option indexList" + mwutil::wrongNumArgs \ + "$win selection option firstIndex lastIndex" \ + "$win selection option indexList" } synchronize $win @@ -3991,7 +5400,6 @@ proc tablelist::separatorsSubCmd {win argList} { lappend sepList $w } } - return [lsort -dictionary $sepList] } @@ -4099,8 +5507,8 @@ proc tablelist::sortSubCmd {win argList} { proc tablelist::sortbycolumnSubCmd {win argList} { set argCount [llength $argList] if {$argCount < 1 || $argCount > 2} { - mwutil::wrongNumArgs "$win sortbycolumn columnIndex\ - ?-increasing|-decreasing?" + mwutil::wrongNumArgs \ + "$win sortbycolumn columnIndex ?-increasing|-decreasing?" } synchronize $win @@ -4112,7 +5520,6 @@ proc tablelist::sortbycolumnSubCmd {win argList} { variable sortOpts set order [mwutil::fullOpt "option" [lindex $argList 1] $sortOpts] } - return [sortItems $win root $col [string range $order 1 end]] } @@ -4122,8 +5529,8 @@ proc tablelist::sortbycolumnSubCmd {win argList} { proc tablelist::sortbycolumnlistSubCmd {win argList} { set argCount [llength $argList] if {$argCount < 1 || $argCount > 2} { - mwutil::wrongNumArgs "$win sortbycolumnlist columnIndexList\ - ?sortOrderList?" + mwutil::wrongNumArgs \ + "$win sortbycolumnlist columnIndexList ?sortOrderList?" } synchronize $win @@ -4206,7 +5613,6 @@ proc tablelist::sortorderlistSubCmd {win argList} { foreach col $data(sortColList) { lappend sortOrderList $data($col-sortOrder) } - return $sortOrderList } @@ -4309,7 +5715,7 @@ proc tablelist::togglecolumnhideSubCmd {win argList} { set argCount [llength $argList] if {$argCount < 1 || $argCount > 2} { mwutil::wrongNumArgs \ - "$win togglecolumnhide firstColumnIndex lastColumnIndex" \ + "$win togglecolumnhide firstColumn lastColumn" \ "$win togglecolumnhide columnIndexList" } @@ -4389,8 +5795,9 @@ proc tablelist::togglecolumnhideSubCmd {win argList} { proc tablelist::togglerowhideSubCmd {win argList} { set argCount [llength $argList] if {$argCount < 1 || $argCount > 2} { - mwutil::wrongNumArgs "$win togglerowhide firstIndex lastIndex" \ - "$win togglerowhide indexList" + mwutil::wrongNumArgs \ + "$win togglerowhide firstIndex lastIndex" \ + "$win togglerowhide indexList" } synchronize $win @@ -4589,7 +5996,7 @@ proc tablelist::xviewSubCmd {win argList} { if {$fraction2 > 1.0} { set fraction2 1.0 } - return [list [format "%g" $fraction1] [format "%g" $fraction2]] + return [list $fraction1 $fraction2] } } @@ -4607,6 +6014,7 @@ proc tablelist::xviewSubCmd {win argList} { } else { changeScrlColOffset $win $units } + hdr_updateColors $win updateColors $win return "" } @@ -4636,6 +6044,7 @@ proc tablelist::xviewSubCmd {win argList} { eval [list $w xview] $argList } redisplayVisibleItems $win + hdr_updateColors $win updateColors $win } } else { @@ -4695,6 +6104,7 @@ proc tablelist::xviewSubCmd {win argList} { changeScrlColOffset $win $scrlColOffset } } + hdr_updateColors $win updateColors $win } variable winSys @@ -4742,7 +6152,7 @@ proc tablelist::yviewSubCmd {win argList} { double($totalViewableCount)}] set fraction2 [expr {($upperViewableCount + $winViewableCount)/ double($totalViewableCount)}] - return [list [format "%g" $fraction1] [format "%g" $fraction2]] + return [list $fraction1 $fraction2] } 1 { @@ -4885,6 +6295,7 @@ proc tablelist::cellSelection {win opt firstRow firstCol lastRow lastCol} { set w $data(body) variable canElide variable elide + variable pu set selRange [$w tag nextrange select $fromTextIdx $toTextIdx] while {[llength $selRange] != 0} { set selStart [lindex $selRange 0] @@ -4895,15 +6306,15 @@ proc tablelist::cellSelection {win opt firstRow firstCol lastRow lastCol} { # # Deselect the relevant elements of the row # - findTabs $win $line $firstCol $lastCol firstTabIdx lastTabIdx + findTabs $win $w $line $firstCol $lastCol firstTabIdx lastTabIdx set textIdx1 $firstTabIdx for {set col $firstCol} {$col <= $lastCol} {incr col} { if {$data($col-hide) && !$canElide} { continue } - set textIdx2 \ - [$w search $elide "\t" $textIdx1+1c $lastTabIdx+1c]+1c + set textIdx2 [$w search $elide "\t" $textIdx1+1$pu \ + $lastTabIdx+1$pu]+1$pu $w tag remove select $textIdx1 $textIdx2 set textIdx1 $textIdx2 } @@ -4924,8 +6335,8 @@ proc tablelist::cellSelection {win opt firstRow firstCol lastRow lastCol} { return 0 } - findTabs $win [expr {$firstRow + 1}] $firstCol $firstCol \ - tabIdx1 tabIdx2 + findTabs $win $data(body) [expr {$firstRow + 1}] \ + $firstCol $firstCol tabIdx1 tabIdx2 if {[lsearch -exact [$data(body) tag names $tabIdx2] select] < 0} { return 0 } else { @@ -4963,6 +6374,7 @@ proc tablelist::cellSelection {win opt firstRow firstCol lastRow lastCol} { set w $data(body) variable canElide variable elide + variable pu for {set row $firstRow; set line [expr {$firstRow + 1}]} \ {$row <= $lastRow} {set row $line; incr line} { # @@ -4976,15 +6388,15 @@ proc tablelist::cellSelection {win opt firstRow firstCol lastRow lastCol} { # # Select the relevant elements of the row # - findTabs $win $line $firstCol $lastCol firstTabIdx lastTabIdx + findTabs $win $w $line $firstCol $lastCol firstTabIdx lastTabIdx set textIdx1 $firstTabIdx for {set col $firstCol} {$col <= $lastCol} {incr col} { if {$data($col-hide) && !$canElide} { continue } - set textIdx2 \ - [$w search $elide "\t" $textIdx1+1c $lastTabIdx+1c]+1c + set textIdx2 [$w search $elide "\t" $textIdx1+1$pu \ + $lastTabIdx+1$pu]+1$pu $w tag add select $textIdx1 $textIdx2 set textIdx1 $textIdx2 } @@ -4999,7 +6411,7 @@ proc tablelist::cellSelection {win opt firstRow firstCol lastRow lastCol} { if {$data(-exportselection) && [llength [$w tag nextrange select 1.0]] != 0} { selection own -command \ - [list ::tablelist::lostSelection $win] $win + [list ::tablelist::lostSelection $win] $win } updateColorsWhenIdle $win @@ -5045,7 +6457,7 @@ proc tablelist::containingRow {win y {relOffsetName ""}} { return -1 } - set row [rowIndex $win @0,$y 0] + set row [rowIndex $win @0,$y 0] ;# before decrementing y !!! set w $data(body) incr y -[winfo y $w] if {$y < 0} { @@ -5070,6 +6482,41 @@ proc tablelist::containingRow {win y {relOffsetName ""}} { } } +#------------------------------------------------------------------------------ +# tablelist::hdr_containingRow +# +# Processes the tablelist header containing subcommand. +#------------------------------------------------------------------------------ +proc tablelist::hdr_containingRow {win y} { + upvar ::tablelist::ns${win}::data data + if {$data(hdr_itemCount) == 0} { + return -1 + } + + set row [hdr_rowIndex $win @0,$y 0] ;# before decrementing y !!! + if {$row < 0} { + return -1 + } + + incr y -[winfo y $data(hdr)] + if {!$data(-showlabels)} { + incr y + } + if {$y < 0} { + return -1 + } + + set dlineinfo [$data(hdrTxt) dlineinfo [expr {$row + 2}].0] + set lineY [lindex $dlineinfo 1] + set lineHeight [lindex $dlineinfo 3] + if {[llength $dlineinfo] != 0 && $y >= $lineY && + $y < $lineY + $lineHeight} { + return $row + } else { + return -1 + } +} + #------------------------------------------------------------------------------ # tablelist::containingCol # @@ -5103,6 +6550,7 @@ proc tablelist::containingCol {win x} { proc tablelist::curCellSelection {win {getKeys 0} {constraint 0}} { variable canElide variable elide + variable pu upvar ::tablelist::ns${win}::data data # @@ -5134,13 +6582,13 @@ proc tablelist::curCellSelection {win {getKeys 0} {constraint 0}} { continue } - set tabIdx2 [$w search $elide "\t" $tabIdx1+1c $selEnd] + set tabIdx2 [$w search $elide "\t" $tabIdx1+1$pu $selEnd] if {[$w compare $selStart >= $tabIdx1] && [$w compare $selStart <= $tabIdx2]} { set firstCol $col break } else { - set tabIdx1 [$w index $tabIdx2+1c] + set tabIdx1 [$w index $tabIdx2+1$pu] } } @@ -5148,7 +6596,7 @@ proc tablelist::curCellSelection {win {getKeys 0} {constraint 0}} { # Process the columns, starting at the found one # and ending just before the text position selEnd # - set textIdx $tabIdx2+1c + set textIdx $tabIdx2+1$pu for {set col $firstCol} {$col < $data(colCount)} {incr col} { if {$data($col-hide) && !$canElide} { continue @@ -5164,7 +6612,7 @@ proc tablelist::curCellSelection {win {getKeys 0} {constraint 0}} { if {[$w compare $textIdx == $selEnd]} { break } else { - set textIdx [$w search $elide "\t" $textIdx+1c $selEnd]+1c + set textIdx [$w search $elide "\t" $textIdx+1$pu $selEnd]+1$pu } } } @@ -5327,38 +6775,47 @@ proc tablelist::deleteRows {win first last updateListVar} { # # Unset the elements of data corresponding to the deleted items # - for {set row $first} {$row <= $last} {incr row} { - set item [lindex $data(itemList) $row] - set key [lindex $item end] - if {$count != $data(itemCount)} { - lappend data(freeKeyList) $key + if {$count == $data(itemCount)} { + foreach name [array names data {k[0-9]*}] { + unset data($name) } + array set data {rowTagRefCount 0 nonViewableRowCount 0 + cellTagRefCount 0 imgCount 0 winCount 0 indentCount 0 + root-children {}} - foreach opt {-background -foreground -name -selectable - -selectbackground -selectforeground} { - if {[info exists data($key$opt)]} { - unset data($key$opt) - } + foreach name [array names attrib {k[0-9]*}] { + unset attrib($name) } + } else { + for {set row $first} {$row <= $last} {incr row} { + set item [lindex $data(itemList) $row] + set key [lindex $item end] + lappend data(freeKeyList) $key - if {[info exists data($key-font)]} { - unset data($key-font) - incr data(rowTagRefCount) -1 - } + foreach opt {-background -foreground -name -selectable + -selectbackground -selectforeground} { + if {[info exists data($key$opt)]} { + unset data($key$opt) + } + } - set isElided [info exists data($key-elide)] - set isHidden [info exists data($key-hide)] - if {$isElided} { - unset data($key-elide) - } - if {$isHidden} { - unset data($key-hide) - } - if {$isElided || $isHidden} { - incr data(nonViewableRowCount) -1 - } + if {[info exists data($key-font)]} { + unset data($key-font) + incr data(rowTagRefCount) -1 + } + + set isElided [info exists data($key-elide)] + set isHidden [info exists data($key-hide)] + if {$isElided} { + unset data($key-elide) + } + if {$isHidden} { + unset data($key-hide) + } + if {$isElided || $isHidden} { + incr data(nonViewableRowCount) -1 + } - if {$count != $data(itemCount)} { # # Remove the key from the list of children of its parent # @@ -5385,55 +6842,51 @@ proc tablelist::deleteRows {win first last updateListVar} { } } } - } - foreach prop {-row -parent -children} { - unset data($key$prop) - } + foreach prop {-row -parent -children} { + unset data($key$prop) + } - foreach name [array names attribs $key-*] { - unset attribs($name) - } + foreach name [array names attribs $key-*] { + unset attribs($name) + } - for {set col 0} {$col < $data(colCount)} {incr col} { - foreach opt {-background -foreground -editable -editwindow - -selectbackground -selectforeground -valign - -windowdestroy -windowupdate} { - if {[info exists data($key,$col$opt)]} { - unset data($key,$col$opt) + for {set col 0} {$col < $data(colCount)} {incr col} { + foreach opt {-background -foreground -editable -editwindow + -selectbackground -selectforeground -valign + -windowdestroy -windowupdate} { + if {[info exists data($key,$col$opt)]} { + unset data($key,$col$opt) + } + } + + if {[info exists data($key,$col-font)]} { + unset data($key,$col-font) + incr data(cellTagRefCount) -1 } - } - if {[info exists data($key,$col-font)]} { - unset data($key,$col-font) - incr data(cellTagRefCount) -1 - } + if {[info exists data($key,$col-image)]} { + unset data($key,$col-image) + incr data(imgCount) -1 + } - if {[info exists data($key,$col-image)]} { - unset data($key,$col-image) - incr data(imgCount) -1 - } + if {[info exists data($key,$col-window)]} { + unset data($key,$col-window) + unset data($key,$col-reqWidth) + unset data($key,$col-reqHeight) + incr data(winCount) -1 + } - if {[info exists data($key,$col-window)]} { - unset data($key,$col-window) - unset data($key,$col-reqWidth) - unset data($key,$col-reqHeight) - incr data(winCount) -1 + if {[info exists data($key,$col-indent)]} { + unset data($key,$col-indent) + incr data(indentCount) -1 + } } - if {[info exists data($key,$col-indent)]} { - unset data($key,$col-indent) - incr data(indentCount) -1 + foreach name [array names attribs $key,*-*] { + unset attribs($name) } } - - foreach name [array names attribs $key,*-*] { - unset attribs($name) - } - } - - if {$count == $data(itemCount)} { - set data(root-children) {} } # @@ -5517,7 +6970,152 @@ proc tablelist::deleteRows {win first last updateListVar} { makeStripesWhenIdle $win showLineNumbersWhenIdle $win updateViewWhenIdle $win + return "" +} + +#------------------------------------------------------------------------------ +# tablelist::hdr_deleteRows +# +# Processes the tablelist header delete subcommand. +#------------------------------------------------------------------------------ +proc tablelist::hdr_deleteRows {win first last} { + # + # Adjust the range to fit within the existing items + # + if {$first < 0} { + set first 0 + } + upvar ::tablelist::ns${win}::data data \ + ::tablelist::ns${win}::attribs attribs + if {$last > $data(hdr_lastRow)} { + set last $data(hdr_lastRow) + } + if {$last < $first} { + return "" + } + + set count [expr {$last - $first + 1}] + + # + # Check whether the width of any dynamic-width + # column might be affected by the deletion + # + set w $data(hdrTxt) + if {$count == $data(hdr_itemCount)} { + set colWidthsChanged 1 ;# just to save time + set data(hdr_seqNum) -1 + } else { + variable canElide + set colWidthsChanged 0 + set snipStr $data(-snipstring) + set row 0 + set hdr_itemList [lrange $data(hdr_itemList) $first $last] + foreach item $hdr_itemList { + # + # Format the item + # + set key [lindex $item end] + set dispItem [lrange $item 0 $data(lastCol)] + if {$data(hasFmtCmds)} { + set dispItem [formatItem $win $key $row $dispItem] + } + if {[string match "*\t*" $dispItem]} { + set dispItem [mapTabs $dispItem] + } + + set col 0 + foreach text $dispItem {pixels alignment} $data(colList) { + if {($data($col-hide) && !$canElide) || $pixels != 0} { + incr col + continue + } + + getAuxData $win $key $col auxType auxWidth + set cellFont [getCellFont $win $key $col] + set elemWidth [getElemWidth $win $text $auxWidth 0 $cellFont] + if {$elemWidth == $data($col-elemWidth) && + [incr data($col-widestCount) -1] == 0} { + set colWidthsChanged 1 + break + } + + incr col + } + + if {$colWidthsChanged} { + break + } + + incr row + } + } + + # + # Delete the given items from the header text widget. + # + $w delete [expr {$first + 2}].0 [expr {$last + 3}].0 + + if {$last == $data(hdr_lastRow)} { + # + # Delete the newline character that ends + # the line preceding the first deleted one + # + $w delete [expr {$first + 1}].end + } + + # + # Unset the elements of data corresponding to the deleted items + # + for {set row $first} {$row <= $last} {incr row} { + set item [lindex $data(hdr_itemList) $row] + set key [lindex $item end] + + foreach opt {-background -foreground -font -name} { + if {[info exists data($key$opt)]} { + unset data($key$opt) + } + } + + foreach name [array names attribs $key-*] { + unset attribs($name) + } + + for {set col 0} {$col < $data(colCount)} {incr col} { + foreach opt {-background -foreground -font -image + -valign -windowdestroy -windowupdate} { + if {[info exists data($key,$col$opt)]} { + unset data($key,$col$opt) + } + } + + if {[info exists data($key,$col-window)]} { + unset data($key,$col-window) + unset data($key,$col-reqWidth) + unset data($key,$col-reqHeight) + } + } + + foreach name [array names attribs $key,*-*] { + unset attribs($name) + } + } + + # + # Delete the given items from the internal list + # + set data(hdr_itemList) [lreplace $data(hdr_itemList) $first $last] + set data(hdr_keyList) [lreplace $data(hdr_keyList) $first $last] + incr data(hdr_itemCount) -$count + incr data(hdr_lastRow) -$count + # + # Adjust the columns if necessary and schedule + # some operations for execution at idle time + # + if {$colWidthsChanged} { + adjustColumns $win allCols 1 + } + updateViewWhenIdle $win return "" } @@ -5685,7 +7283,7 @@ proc tablelist::insertRows {win index argList updateListVar parentKey \ } array set data \ - [list $key-row $row $key-parent $parentKey $key-children {}] + [list $key-row $row $key-parent $parentKey $key-children {}] # # Insert the key into the parent's list of children @@ -5748,6 +7346,179 @@ proc tablelist::insertRows {win index argList updateListVar parentKey \ return $result } +#------------------------------------------------------------------------------ +# tablelist::hdr_insertRows +# +# Processes the tablelist header insert and insertlist subcommands. +#------------------------------------------------------------------------------ +proc tablelist::hdr_insertRows {win index argList} { + set argCount [llength $argList] + if {$argCount == 0} { + return {} + } + + upvar ::tablelist::ns${win}::data data + if {$index < 0} { + set index 0 + } elseif {$index > $data(hdr_itemCount)} { + set index $data(hdr_itemCount) + } + + # + # Insert the items into the internal list and the header text widget + # + set result {} + variable canElide + variable snipSides + set w $data(hdrTxt) + set widgetFont $data(-font) + set snipStr $data(-snipstring) + set padY [expr {[$w cget -spacing1] == 0}] + set row $index + set line [expr {$index + 2}] + foreach item $argList { + # + # Adjust and extend the item, and insert + # the extended item into the internal list + # + set item [adjustItem $item $data(colCount)] + set key hk[incr data(hdr_seqNum)] + set extItem $item + lappend extItem $key + set data(hdr_itemList) [linsert $data(hdr_itemList) $row $extItem] + set data(hdr_keyList) [linsert $data(hdr_keyList) $row $key] + + if {$data(hasFmtCmds)} { + set item [formatItem $win $key $row $item] + } + if {[string match "*\t*" $item]} { + set item [mapTabs $item] + } + + $w insert $line.0 "\n" + + set multilineData {} + set col 0 + set insertArgs {} + foreach text $item \ + colFont $data(colFontList) \ + colTags $data(colTagsList) \ + {pixels alignment} $data(colList) { + if {$data($col-hide) && !$canElide} { + incr col + continue + } + + # + # Update the column width or clip the element if necessary + # + set multiline [string match "*\n*" $text] + if {$pixels == 0} { ;# convention: dynamic width + if {$multiline} { + set list [split $text "\n"] + set textWidth [getListWidth $win $list $colFont] + } else { + set textWidth \ + [font measure $colFont -displayof $win $text] + } + if {$data($col-maxPixels) > 0} { + if {$textWidth > $data($col-maxPixels)} { + set pixels $data($col-maxPixels) + } + } + if {$textWidth == $data($col-elemWidth)} { + incr data($col-widestCount) + } elseif {$textWidth > $data($col-elemWidth)} { + set data($col-elemWidth) $textWidth + set data($col-widestCount) 1 + } + } + if {$pixels != 0} { + incr pixels $data($col-delta) + + if {$data($col-wrap) && !$multiline} { + if {[font measure $colFont -displayof $win $text] > + $pixels} { + set multiline 1 + } + } + + set snipSide \ + $snipSides($alignment,$data($col-changesnipside)) + if {$multiline} { + set list [split $text "\n"] + if {$data($col-wrap)} { + set snipSide "" + } + set text [joinList $win $list $colFont \ + $pixels $snipSide $snipStr] + } else { + set text [strRange $win $text $colFont \ + $pixels $snipSide $snipStr] + } + } + + if {$multiline} { + lappend insertArgs "\t\t" $colTags + lappend multilineData $col $text $colFont $pixels $alignment + } else { + lappend insertArgs "\t$text\t" $colTags + } + incr col + } + + # + # Insert the item into the header text widget + # + if {[llength $insertArgs] != 0} { + eval [list $w insert $line.0] $insertArgs + } + + # + # Embed the message widgets displaying multiline elements + # + foreach {col text font pixels alignment} $multilineData { + findTabs $w $win $win $line $col $col tabIdx1 tabIdx2 + set msgScript [list ::tablelist::displayText $win $key \ + $col $text $font $pixels $alignment] + $w window create $tabIdx2 -align top -pady $padY -create $msgScript + } + + lappend result $key + + incr row + incr line + } + incr data(hdr_itemCount) $argCount + set data(hdr_lastRow) [expr {$data(hdr_itemCount) - 1}] + + # + # Check whether the width of any column has changed + # + set colWidthsChanged 0 + set col 0 + foreach {pixels alignment} $data(colList) { + if {$pixels == 0} { ;# convention: dynamic width + if {$data($col-elemWidth) > $data($col-reqPixels)} { + set data($col-reqPixels) $data($col-elemWidth) + set colWidthsChanged 1 + } + } + incr col + } + + # + # Adjust the columns if necessary and schedule + # some operations for execution at idle time + # + if {$colWidthsChanged} { + adjustColumns $win {} 1 + } + updateViewWhenIdle $win + + return $result +} + #------------------------------------------------------------------------------ # tablelist::displayItems # @@ -5968,7 +7739,7 @@ proc tablelist::displayItems win { # Embed the message widgets displaying multiline elements # foreach {col text font pixels alignment} $multilineData { - findTabs $win $line $col $col tabIdx1 tabIdx2 + findTabs $win $w $line $col $col tabIdx1 tabIdx2 set msgScript [list ::tablelist::displayText $win $key \ $col $text $font $pixels $alignment] $w window create $tabIdx2 -align top -pady $padY -create $msgScript @@ -6160,6 +7931,8 @@ proc tablelist::doScan {win opt x y} { $data(hdrTxt) scan $opt $x 0 if {[string compare $opt "dragto"] == 0} { + hdr_adjustElidedText $win + hdr_updateColors $win adjustElidedText $win redisplayVisibleItems $win updateColors $win @@ -6201,6 +7974,8 @@ proc tablelist::doScan {win opt x y} { # Change the scrolled column offset and adjust the elided text # changeScrlColOffset $win [scrlXOffsetToColOffset $win $scrlXOffset] + hdr_adjustElidedText $win + hdr_updateColors $win adjustElidedText $win redisplayVisibleItems $win updateColors $win @@ -6238,8 +8013,6 @@ proc tablelist::populate {win index fully} { populate $win [keyToRow $win $childKey] 1 } } - - return "" } #------------------------------------------------------------------------------ @@ -6292,7 +8065,7 @@ proc tablelist::seeRow {win index} { # # This might be an "after 0" callback; check whether the window exists # - if {![array exists ::tablelist::ns${win}::data]} { + if {[destroyed $win]} { return "" } @@ -6336,7 +8109,7 @@ proc tablelist::seeCell {win row col} { # # This might be an "after 0" callback; check whether the window exists # - if {![array exists ::tablelist::ns${win}::data]} { + if {[destroyed $win]} { return "" } @@ -6370,7 +8143,7 @@ proc tablelist::seeCell {win row col} { # Force any geometry manager calculations to be completed first # update idletasks - if {![array exists ::tablelist::ns${win}::data]} { + if {[destroyed $win]} { return "" } @@ -6390,8 +8163,9 @@ proc tablelist::seeCell {win row col} { } if {$data(-titlecolumns) == 0} { - findTabs $win [expr {$row + 1}] $col $col tabIdx1 tabIdx2 - set nextIdx [$b index $tabIdx2+1c] + findTabs $win $b [expr {$row + 1}] $col $col tabIdx1 tabIdx2 + variable pu + set nextIdx [$b index $tabIdx2+1$pu] set alignment [lindex $data(colList) [expr {2*$col + 1}]] set lX [winfo x $data(hdrTxtFrmLbl)$col] set rX [expr {$lX + [winfo width $data(hdrTxtFrmLbl)$col] - 1}] @@ -6434,7 +8208,7 @@ proc tablelist::seeCell {win row col} { # center into the window's middle horizontal position # $h xview moveto \ - [expr {double($lX + $rX - $winWidth)/2/$data(hdrPixels)}] + [expr {double($lX + $rX - $winWidth)/2/$data(hdrWidth)}] } else { # # Shift the view in the header text widget until @@ -6619,7 +8393,7 @@ proc tablelist::rowSelection {win opt first last} { if {$data(-exportselection) && [llength [$w tag nextrange select 1.0]] != 0} { selection own -command \ - [list ::tablelist::lostSelection $win] $win + [list ::tablelist::lostSelection $win] $win } updateColorsWhenIdle $win @@ -6647,14 +8421,13 @@ proc tablelist::horizMoveTo win { redisplayVisibleItems $win updateColors $win - return "" } #------------------------------------------------------------------------------ # tablelist::vertMoveTo # # Adjusts the view in the tablelist window win so that the non-hidden item -# given by data(fraction) appears at the top of the window. +# given by data(fraction) appears at the top of the window. #------------------------------------------------------------------------------ proc tablelist::vertMoveTo win { upvar ::tablelist::ns${win}::data data @@ -6675,8 +8448,6 @@ proc tablelist::vertMoveTo win { updateView $win updateIdletasksDelayed } - - return "" } #------------------------------------------------------------------------------ @@ -6697,7 +8468,7 @@ proc tablelist::seeTextIdx {win textIdx} { set toTextIdx "[$w index @0,$data(btmY)] lineend" $w tag remove elidedWin $fromTextIdx $toTextIdx update idletasks - if {![array exists ::tablelist::ns${win}::data]} { + if {[destroyed $win]} { return 0 } @@ -6768,6 +8539,7 @@ proc tablelist::bodyConfigure {w width height} { set data(gotResizeEvent) 1 set data(rightX) $rightX set data(btmY) $btmY + makeColFontAndTagLists $win updateViewWhenIdle $win } @@ -6843,7 +8615,7 @@ proc tablelist::lostSelection win { # to the line or cell that displays the active item or element of the widget in # its body text child if the latter has the keyboard focus. #------------------------------------------------------------------------------ -proc tablelist::activeTrace {win varName index op} { +proc tablelist::activeTrace {win varName arrIndex op} { # # Conditionally move the "active" tag to the line # or cell that displays the active item or element @@ -6858,17 +8630,17 @@ proc tablelist::activeTrace {win varName index op} { # tablelist::listVarTrace # # This procedure is executed whenever the global variable specified by varName -# is written or unset. It makes sure that the contents of the widget will be +# is written or unset. It makes sure that the content of the widget will be # synchronized with the value of the variable at idle time, and that the # variable is recreated if it was unset. #------------------------------------------------------------------------------ -proc tablelist::listVarTrace {win varName index op} { +proc tablelist::listVarTrace {win varName arrIndex op} { upvar ::tablelist::ns${win}::data data switch $op { w { if {![info exists data(syncId)]} { # - # Arrange for the contents of the widget to be synchronized + # Arrange for the content of the widget to be synchronized # with the value of the variable ::$varName at idle time # set data(syncId) [after idle [list tablelist::synchronize $win]] @@ -6880,8 +8652,8 @@ proc tablelist::listVarTrace {win varName index op} { # Recreate the variable ::$varName by setting it according to # the value of data(itemList), and set the trace on it again # - if {[string length $index] != 0} { - set varName ${varName}($index) + if {[string length $arrIndex] != 0} { + set varName ${varName}($arrIndex) } set ::$varName {} foreach item $data(itemList) { @@ -6891,3 +8663,22 @@ proc tablelist::listVarTrace {win varName index op} { } } } + +#------------------------------------------------------------------------------ +# tablelist::checkStatesTrace +# +# This procedure is executed whenever an element of the array checkStates is +# written. It updates the corresponding tablelist element at idle time. +#------------------------------------------------------------------------------ +proc tablelist::checkStatesTrace {win varName arrIndex op} { + # + # $arrIndex is is a cell index of the form , + # + upvar $varName var + if {[string match "h*" $arrIndex]} { + after idle \ + [list ::$win header cellconfigure $arrIndex -text $var($arrIndex)] + } else { + after idle [list ::$win cellconfigure $arrIndex -text $var($arrIndex)] + } +} From 5487381c103dcebea842af92386a7ed2a177a86b Mon Sep 17 00:00:00 2001 From: csaba Date: Wed, 6 Dec 2017 16:14:04 +0000 Subject: [PATCH 024/150] * scripts/tclIndex: Newly generated. --- modules/tablelist/scripts/tclIndex | 77 +++++++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 1 deletion(-) diff --git a/modules/tablelist/scripts/tclIndex b/modules/tablelist/scripts/tclIndex index e36e7073..9f07d392 100644 --- a/modules/tablelist/scripts/tclIndex +++ b/modules/tablelist/scripts/tclIndex @@ -62,11 +62,11 @@ set auto_index(::tablelist::genOptionMouseWheelEvent) [list source [file join $d set auto_index(::tablelist::isKeyReserved) [list source [file join $dir tablelistEdit.tcl]] set auto_index(::tablelist::hasMouseWheelBindings) [list source [file join $dir tablelistEdit.tcl]] set auto_index(::tablelist::isComboTopMapped) [list source [file join $dir tablelistEdit.tcl]] -set auto_index(::tablelist::getCurrentTheme) [list source [file join $dir tablelistThemes.tcl]] set auto_index(::tablelist::setThemeDefaults) [list source [file join $dir tablelistThemes.tcl]] set auto_index(::tablelist::altTheme) [list source [file join $dir tablelistThemes.tcl]] set auto_index(::tablelist::aquaTheme) [list source [file join $dir tablelistThemes.tcl]] set auto_index(::tablelist::AquativoTheme) [list source [file join $dir tablelistThemes.tcl]] +set auto_index(::tablelist::aquativoTheme) [list source [file join $dir tablelistThemes.tcl]] set auto_index(::tablelist::ArcTheme) [list source [file join $dir tablelistThemes.tcl]] set auto_index(::tablelist::blueTheme) [list source [file join $dir tablelistThemes.tcl]] set auto_index(::tablelist::clamTheme) [list source [file join $dir tablelistThemes.tcl]] @@ -115,9 +115,13 @@ set auto_index(::mwutil::attribSubCmd) [list source [file join $dir mwutil.tcl]] set auto_index(::mwutil::hasattribSubCmd) [list source [file join $dir mwutil.tcl]] set auto_index(::mwutil::unsetattribSubCmd) [list source [file join $dir mwutil.tcl]] set auto_index(::mwutil::getScrollInfo) [list source [file join $dir mwutil.tcl]] +set auto_index(::tablelist::getCurrentTheme) [list source [file join $dir tablelistUtil.tcl]] +set auto_index(::tablelist::destroyed) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::rowIndex) [list source [file join $dir tablelistUtil.tcl]] +set auto_index(::tablelist::hdr_rowIndex) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::colIndex) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::cellIndex) [list source [file join $dir tablelistUtil.tcl]] +set auto_index(::tablelist::hdr_cellIndex) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::adjustRowIndex) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::adjustColIndex) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::nodeIndexToKey) [list source [file join $dir tablelistUtil.tcl]] @@ -126,6 +130,7 @@ set auto_index(::tablelist::topLevelKey) [list source [file join $dir tablelistU set auto_index(::tablelist::descCount) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::nodeRow) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::keyToRow) [list source [file join $dir tablelistUtil.tcl]] +set auto_index(::tablelist::hdr_keyToRow) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::updateKeyToRowMap) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::findTabs) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::sortStretchableColList) [list source [file join $dir tablelistUtil.tcl]] @@ -180,6 +185,8 @@ set auto_index(::tablelist::stretchColumns) [list source [file join $dir tableli set auto_index(::tablelist::moveActiveTag) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::updateColorsWhenIdle) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::updateColors) [list source [file join $dir tablelistUtil.tcl]] +set auto_index(::tablelist::hdr_updateColorsWhenIdle) [list source [file join $dir tablelistUtil.tcl]] +set auto_index(::tablelist::hdr_updateColors) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::updateScrlColOffsetWhenIdle) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::updateScrlColOffset) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::updateHScrlbarWhenIdle) [list source [file join $dir tablelistUtil.tcl]] @@ -189,6 +196,7 @@ set auto_index(::tablelist::updateVScrlbar) [list source [file join $dir tableli set auto_index(::tablelist::forceRedraw) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::purgeWidgets) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::adjustElidedText) [list source [file join $dir tablelistUtil.tcl]] +set auto_index(::tablelist::hdr_adjustElidedText) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::redisplayWhenIdle) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::redisplay) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::redisplayVisibleItems) [list source [file join $dir tablelistUtil.tcl]] @@ -221,6 +229,12 @@ set auto_index(::tablelist::getVertComplTopRow) [list source [file join $dir tab set auto_index(::tablelist::getVertComplBtmRow) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::getViewableRowCount) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::viewableRowOffsetToRowIndex) [list source [file join $dir tablelistUtil.tcl]] +set auto_index(::tablelist::createFrameWithCheckbutton) [list source [file join $dir tablelistUtil.tcl]] +set auto_index(::tablelist::hdr_createFrameWithCheckbutton) [list source [file join $dir tablelistUtil.tcl]] +set auto_index(::tablelist::makeCheckbutton) [list source [file join $dir tablelistUtil.tcl]] +set auto_index(::tablelist::createFrameWithTileCheckbutton) [list source [file join $dir tablelistUtil.tcl]] +set auto_index(::tablelist::hdr_createFrameWithTileCheckbutton) [list source [file join $dir tablelistUtil.tcl]] +set auto_index(::tablelist::makeTileCheckbutton) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::getTablelistColumn) [list source [file join $dir tablelistBind.tcl]] set auto_index(::tablelist::getTablelistPath) [list source [file join $dir tablelistBind.tcl]] set auto_index(::tablelist::convEventFields) [list source [file join $dir tablelistBind.tcl]] @@ -276,6 +290,11 @@ set auto_index(::tablelist::firstViewableCol) [list source [file join $dir table set auto_index(::tablelist::lastViewableCol) [list source [file join $dir tablelistBind.tcl]] set auto_index(::tablelist::condChangeSelection) [list source [file join $dir tablelistBind.tcl]] set auto_index(::tablelist::changeSelection) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::defineTablelistHeader) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::hdr_handleMotionDelayed) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::hdr_handleMotion) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::hdr_showOrHideTooltip) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::defineTablelistLabel) [list source [file join $dir tablelistBind.tcl]] set auto_index(::tablelist::defineTablelistSubLabel) [list source [file join $dir tablelistBind.tcl]] set auto_index(::tablelist::defineTablelistArrow) [list source [file join $dir tablelistBind.tcl]] set auto_index(::tablelist::labelEnter) [list source [file join $dir tablelistBind.tcl]] @@ -306,6 +325,7 @@ set auto_index(::tablelist::reconfigWindows) [list source [file join $dir tablel set auto_index(::tablelist::isCellEditable) [list source [file join $dir tablelistConfig.tcl]] set auto_index(::tablelist::getEditWindow) [list source [file join $dir tablelistConfig.tcl]] set auto_index(::tablelist::getVAlignment) [list source [file join $dir tablelistConfig.tcl]] +set auto_index(::tablelist::getConfigParams) [list source [file join $dir tablelistConfig.tcl]] set auto_index(::tablelist::flat5x3Arrows) [list source [file join $dir tablelistImages.tcl]] set auto_index(::tablelist::flat5x4Arrows) [list source [file join $dir tablelistImages.tcl]] set auto_index(::tablelist::flat6x4Arrows) [list source [file join $dir tablelistImages.tcl]] @@ -453,6 +473,10 @@ set auto_index(::tablelist::editcellSubCmd) [list source [file join $dir tableli set auto_index(::tablelist::editinfoSubCmd) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::editwinpathSubCmd) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::editwintagSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::embedcheckbuttonSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::embedcheckbuttonsSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::embedttkcheckbuttonSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::embedttkcheckbuttonsSubCmd) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::entrypathSubCmd) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::expandSubCmd) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::expandallSubCmd) [list source [file join $dir tablelistWidget.tcl]] @@ -474,6 +498,53 @@ set auto_index(::tablelist::hasattribSubCmd) [list source [file join $dir tablel set auto_index(::tablelist::hascellattribSubCmd) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::hascolumnattribSubCmd) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::hasrowattribSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::headerSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_bboxSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_cellattribSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_cellbboxSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_cellcgetSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_cellconfigureSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_cellindexSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_configcelllistSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_configcellsSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_configrowlistSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_configrowsSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_containingSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_containingcellSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_deleteSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_embedcheckbuttonSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_embedcheckbuttonsSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_embedttkcheckbuttonSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_embedttkcheckbuttonsSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_fillcolumnSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_findrownameSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_getSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_getcellsSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_getcolumnsSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_getformattedSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_getformattedcellsSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_getformattedcolumnsSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_getfullkeysSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_getkeysSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_hascellattribSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_hasrowattribSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_imagelabelpathSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_indexSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_insertSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_insertlistSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_iselemsnippedSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_itemlistvarSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_nearestSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_nearestcellSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_rowattribSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_rowcgetSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_rowconfigureSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_sizeSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_unsetcellattribSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_unsetrowattribSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::header_windowpathSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::headerpathSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::headertagSubCmd) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::hidetargetmarkSubCmd) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::imagelabelpathSubCmd) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::indexSubCmd) [list source [file join $dir tablelistWidget.tcl]] @@ -538,12 +609,15 @@ set auto_index(::tablelist::yviewSubCmd) [list source [file join $dir tablelistW set auto_index(::tablelist::cellSelection) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::colWidth) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::containingRow) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::hdr_containingRow) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::containingCol) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::curCellSelection) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::curSelection) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::deleteRows) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::hdr_deleteRows) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::deleteCols) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::insertRows) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::hdr_insertRows) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::displayItems) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::insertCols) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::doScan) [list source [file join $dir tablelistWidget.tcl]] @@ -563,3 +637,4 @@ set auto_index(::tablelist::fetchSelection) [list source [file join $dir tableli set auto_index(::tablelist::lostSelection) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::activeTrace) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::listVarTrace) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::checkStatesTrace) [list source [file join $dir tablelistWidget.tcl]] From e9d10eec4d8724639d01c13e1bcd84056fba36ed Mon Sep 17 00:00:00 2001 From: csaba Date: Wed, 6 Dec 2017 16:15:39 +0000 Subject: [PATCH 025/150] * doc/*.html: Updated to reflect the changes. --- modules/tablelist/doc/index.html | 5 +- modules/tablelist/doc/tablelist.html | 198 +- modules/tablelist/doc/tablelistBWidget.html | 2 +- modules/tablelist/doc/tablelistBinding.html | 2 +- modules/tablelist/doc/tablelistColSort.html | 2 +- modules/tablelist/doc/tablelistCombobox.html | 2 +- modules/tablelist/doc/tablelistCtext.html | 2 +- modules/tablelist/doc/tablelistIwidgets.html | 4 +- modules/tablelist/doc/tablelistMentry.html | 26 +- modules/tablelist/doc/tablelistThemes.html | 2 +- modules/tablelist/doc/tablelistTile.html | 2 +- modules/tablelist/doc/tablelistTkCore.html | 2 +- modules/tablelist/doc/tablelistWidget.html | 2689 +++++++++++++----- 13 files changed, 2107 insertions(+), 831 deletions(-) diff --git a/modules/tablelist/doc/index.html b/modules/tablelist/doc/index.html index 71c3de9e..10872710 100644 --- a/modules/tablelist/doc/index.html +++ b/modules/tablelist/doc/index.html @@ -1,7 +1,6 @@ - The Multi-Column Listbox and Tree Widget Package Tablelist - 5.18 + The Multi-Column Listbox and Tree Widget Package Tablelist 6.0

    -

    The Multi-Column Listbox and Tree Widget Package Tablelist 5.18

    +

    The Multi-Column Listbox and Tree Widget Package Tablelist 6.0

    by

    diff --git a/modules/tablelist/doc/tablelist.html b/modules/tablelist/doc/tablelist.html index 5771378d..9c71ab9e 100644 --- a/modules/tablelist/doc/tablelist.html +++ b/modules/tablelist/doc/tablelist.html @@ -13,7 +13,7 @@

    Tablelist Programmer's Guide

    -

    For Tablelist Version 5.18

    +

    For Tablelist Version 6.0

    by

    @@ -119,11 +119,11 @@

    What Is Tablelist?

    center.

    The columns, rows, and cells can be configured individually.  Several - of the global and column-specific options refer to the headers, implemented - as label widgets.  For instance, the -labelcommand option - specifies a Tcl command to be invoked when mouse button 1 is released over a - label.  The most common value of this option sorts the items based on - the respective column.

    + of the global and column-specific options refer to the header titles, + implemented as label widgets.  For instance, the + -labelcommand option specifies a Tcl command to be invoked when + mouse button 1 is released over a header label.  The most common value + of this option sorts the items based on the respective column.

    The Tablelist package provides a great variety of tree styles controlling the look & feel of the column that displays the tree hierarchy with the @@ -170,11 +170,10 @@

    What Is Tablelist?

    How to Get It?

    Tablelist is available for free download from the same URL as Wcb.  - The distribution file is tablelist5.18.tar.gz for UNIX and - tablelist5_18.zip for Windows.  These files contain the - same information, except for the additional carriage return character - preceding the linefeed at the end of each line in the text files for - Windows.

    + The distribution file is tablelist6.0.tar.gz for UNIX and + tablelist6_0.zip for Windows.  These files contain the same + information, except for the additional carriage return character preceding + the linefeed at the end of each line in the text files for Windows.

    Tablelist is also included in tklib, which has the address

    @@ -195,21 +194,21 @@

    How to Install It?

    To install Tablelist on UNIX, cd to the desired directory and unpack the distribution file - tablelist5.18.tar.gz:

    + tablelist6.0.tar.gz:

    -gunzip -c tablelist5.18.tar.gz | tar -xf -
    +gunzip -c tablelist6.0.tar.gz | tar -xf -
     
    -

    This command will create a directory named tablelist5.18, - with the subdirectories demos, doc, and +

    This command will create a directory named tablelist6.0, with + the subdirectories demos, doc, and scripts.

    On Windows, use WinZip or some other program capable of unpacking - the distribution file tablelist5_18.zip into the directory - tablelist5.18, with the subdirectories demos, + the distribution file tablelist6_0ip into the directory + tablelist6.0, with the subdirectories demos, doc, and scripts.

    The file tablelistEdit.tcl in the scripts @@ -306,14 +305,14 @@

    How to Use It?

    tablelist and tablelist_tile.

    REMARK:  If you have an earlier Tablelist version as part of - ActiveTcl 8.5 or above and the new Tablelist release 5.18, then it is highly - recommended to specify the version number 5.18 in the  + ActiveTcl 8.5 or above and the new Tablelist release 6.0, then it is highly + recommended to specify the version number 6.0 in the  package require  command, because otherwise the interpreter will load the old Tablelist version included in ActiveTcl as Tcl Module.  The examples below use the - statement  package require tablelist 5.18,  and their + statement  package require tablelist 6.0,  and their tile-based counterparts invoke the command  package require - tablelist_tile 5.18.

    + tablelist_tile 6.0.

    Since the packages Tablelist and Tablelist_tile are implemented in the tablelist namespace, you must either invoke the

    @@ -342,7 +341,7 @@

    How to Use It?

  • The variable tablelist::scalingpct holds the scaling percentage used by Tablelist when adapting the sizes of the tree styles - vistaAero, vistaClassic, win7Aero, + vistaAero, vistaClassic, win7Aero, win7Classic, and win10 to the display's DPI scaling level.  The currently supported values are 100, 125, 150, and 200.  You can use @@ -354,7 +353,7 @@

    How to Use It?

  • The boolean variable tablelist::strictTk (having the default value 0) controls the strict listbox-compatibility of - the default bindings. + the default bindings.
  • The read-only boolean variable tablelist::usingTile has the value 0 in the package Tablelist and the value @@ -368,14 +367,14 @@

    How to Use It?

    More on Tablelist_tile

    A tablelist widget consists of a body (containing the items) and a header - (displaying the column titles).  Both components are contained in a - hull, implemented as a frame.  The header has a rather complex - structure, consisting mainly of frame and label widgets.  While in the - Tablelist package all of these components are Tk widgets, the Tablelist_tile - package uses both Tk and tile frame and label widgets.  Due to several - incompatibilities between Tk and tile, it is currently not possible to - replace all Tk widgets making up a tablelist with their tile - counterparts.

    + (displaying the column titles and optional header items).  Both + components are contained in a hull, implemented as a frame.  The header + has a rather complex structure, consisting, among others, of frame and label + widgets.  While in the Tablelist package all of these components are Tk + widgets, the Tablelist_tile package uses both Tk and tile frame and label + widgets.  Due to several incompatibilities between Tk and tile, it is + currently not possible to replace all Tk widgets making up a tablelist with + their tile counterparts.

    From the above it follows that the package Tablelist_tile will only work as expected if the Tk frame and label commands @@ -480,8 +479,9 @@

    A tablelist Widget for Displaying and Editing by using the source command as follows:

      -
    • If wish was started in the demos directory - then it is sufficient to enter +
    • + If wish was started in the demos directory then + it is sufficient to enter
      @@ -490,15 +490,16 @@ 

      A tablelist Widget for Displaying and Editing

    • -
    • If wish was started in some other directory then you can - use the tablelist::library variable to find the location of - the file.  For example, assuming that your Tablelist installation has - the directory structure described in the How to - install it? section, the required commands are: +
    • + If wish was started in some other directory then you can use + the tablelist::library variable to find the location of the + file.  For example, assuming that your Tablelist installation has + the directory structure described in the How to + install it? section, the required commands are:
      -package require tablelist 5.18
      +package require tablelist 6.0
       source [file join $tablelist::library demos config.tcl]
       
      @@ -540,8 +541,7 @@

      A tablelist Widget for Displaying and Editing the following figure:

      - Configuration Options + Configuration Options

      It is assumed that the Tcl command associated with the widget specified by @@ -555,7 +555,7 @@

      A tablelist Widget for Displaying and Editing
      -package require tablelist 5.18
      +package require tablelist 6.0
       
       namespace eval demo {
           #
      @@ -741,7 +741,7 @@ 

      A tablelist Widget for Displaying and Editing

      The -editendcommand option specifies the command to be invoked automatically whenever the interactive - editing of a cell's contents is finished and the final contents of the + editing of a cell's content is finished and the final content of the temporary embedded entry widget used for the editing are different from its original one.  Per default, the elements of a tablelist widget can only be edited programmatically, but we enable the interactive editing for the @@ -963,7 +963,7 @@

      A tablelist Widget for Displaying and Editing with 1 or 0, even if the entry contains the string yes or no.  The procedure returns this canonical option value, thus making sure that the latter will become the new - contents of the cell that was just edited.

      + content of the cell that was just edited.

      Two Widget Browsers Based on a tablelist

      @@ -1033,7 +1033,7 @@

      Two Widget Browsers Based on a tablelist

       package require Tk 8.3
      -package require tablelist 5.18
      +package require tablelist 6.0
       
       namespace eval demo {
           variable dir [file dirname [info script]]
      @@ -1334,7 +1334,7 @@ 

      Two Widget Browsers Based on a tablelist

      We mark every newly created row corresponding to a child widget that has children itself as collapsed by invoking the collapse subcommand.  This - will prepend an expand/collapse control to the contents of the first column, + will prepend an expand/collapse control to the content of the first column, whose column index 0 is the default value of the -treecolumn configuration option.

      @@ -1399,7 +1399,7 @@

      Two Widget Browsers Based on a tablelist

      #------------------------------------------------------------------------------ # demo::labelCmd # -# Sorts the contents of the tablelist widget tbl by its col'th column and makes +# Sorts the content of the tablelist widget tbl by its col'th column and makes # sure the items will be updated 500 ms later (because one of the items might # refer to a canvas containing the arrow that displays the sorting order). #------------------------------------------------------------------------------ @@ -1565,7 +1565,7 @@

      Two Widget Browsers Based on a tablelist

      -

      Before redisplaying the tablelist's contents via +

      Before redisplaying the tablelist's content via demo::putChildren, we get the full keys of the currently expanded items with the aid of the expandedkeys tablelist @@ -1619,7 +1619,7 @@

      A Directory Viewer Based on a tablelist

      By double-clicking an item or invoking the single entry of a pop-up menu - within the body of the tablelist, you can display the contents of the folder + within the body of the tablelist, you can display the content of the folder corresponding to the selected item.  To go one level up, click on the Parent button.

      @@ -1631,7 +1631,7 @@

      A Directory Viewer Based on a tablelist

       package require Tk 8.3
      -package require tablelist 5.18
      +package require tablelist 6.0
       
       #
       # Add some entries to the Tk option database
      @@ -1649,7 +1649,7 @@ 

      A Directory Viewer Based on a tablelist

      #------------------------------------------------------------------------------ # displayContents # -# Displays the contents of the directory dir in a tablelist widget. +# Displays the content of the directory dir in a tablelist widget. #------------------------------------------------------------------------------ proc displayContents dir { # @@ -1680,7 +1680,7 @@

      A Directory Viewer Based on a tablelist

      . . . # - # Populate the tablelist with the contents of the given directory + # Populate the tablelist with the content of the given directory # $tbl sortbycolumn 0 putContents $dir $tbl root @@ -1716,7 +1716,7 @@

      A Directory Viewer Based on a tablelist

      #------------------------------------------------------------------------------ # putContents # -# Outputs the contents of the directory dir into the tablelist widget tbl, as +# Outputs the content of the directory dir into the tablelist widget tbl, as # child items of the one identified by nodeIdx. #------------------------------------------------------------------------------ proc putContents {dir tbl nodeIdx} { @@ -1877,7 +1877,7 @@

      A Directory Viewer Based on a tablelist

      #------------------------------------------------------------------------------ # expandCmd # -# Outputs the contents of the directory whose leaf name is displayed in the +# Outputs the content of the directory whose leaf name is displayed in the # first cell of the specified row of the tablelist widget tbl, as child items # of the one identified by row, and updates the image displayed in that cell. #------------------------------------------------------------------------------ @@ -2003,7 +2003,7 @@

      Advanced Interactive tablelist Cell Editing

      from the Tk core and from the packages tile, BWidget, Iwidgets, combobox (by Bryan Oakley), ctext, and Mentry (or Mentry_tile) for interactive cell editing.  The following figure shows the tablelist widget, together with - a BWidget ComboBox used to edit the contents of one of its cells:

      + a BWidget ComboBox used to edit the content of one of its cells:

      Serial Line ConfigurationAdvanced Interactive tablelist Cell Editing

    Here is the relevant code segment from the script bwidget.tcl (the scripts tileWidgets.tcl, iwidgets.tcl, and - miscWidgets.tcl are similar):

    + miscWidgets.tcl are similar).  A few parts of the code are + shown in red color – we will return to this towards the + end of the section.

     package require Tk 8.4                          ;# because of "-compound"
    -package require tablelist 5.18
    +package require tablelist 6.0
     package require BWidget
     
     wm title . "Serial Line Configuration"
    @@ -2027,9 +2029,7 @@ 

    Advanced Interactive tablelist Cell Editing

    # set dir [file dirname [info script]] source [file join $dir option.tcl] -option add *Tablelist*Checkbutton.background white -option add *Tablelist*Checkbutton.activeBackground white -option add *Tablelist*Entry.background white +option add *Tablelist*Entry.background white # # Register some widgets from the BWidget package for interactive cell editing @@ -2066,7 +2066,7 @@

    Advanced Interactive tablelist Cell Editing

    $tbl configure -spacing 1 } $tbl columnconfigure 0 -sortmode integer -$tbl columnconfigure 1 -name available -editable yes -editwindow checkbutton \ +$tbl columnconfigure 1 -name available -editable yes -editwindow checkbutton \ -formatcommand emptyStr $tbl columnconfigure 2 -name lineName -editable yes -editwindow Entry \ -sortmode dictionary @@ -2096,8 +2096,8 @@

    Advanced Interactive tablelist Cell Editing

    $tbl insert end [list $n [expr {$i < 8}] "Line $n" 9600 8 None 1 XON/XOFF \ $clock $clock [lindex $colorNames $i]] - set availImg [expr {($i < 8) ? "checkedImg" : "uncheckedImg"}] - $tbl cellconfigure end,available -image $availImg + set availImg [expr {($i < 8) ? "checkedImg" : "uncheckedImg"}] + $tbl cellconfigure end,available -image $availImg $tbl cellconfigure end,color -image img[lindex $colorValues $i] } @@ -2244,9 +2244,9 @@

    Advanced Interactive tablelist Cell Editing

    "tablelistWidget.html#editendcommand">-editendcommand configuration option, is responsible for a final validation of the edit window's text.  Another purpose of this command is to convert the text - contained in the edit window to the cell's new internal contents, - which is necessary because the internal value of the activation date and time - is a clock value in seconds:

    + contained in the edit window to the cell's new internal content, which + is necessary because the internal value of the activation date and time is a + clock value in seconds:

    @@ -2254,17 +2254,17 @@ 

    Advanced Interactive tablelist Cell Editing

    # editEndCmd # # Performs a final validation of the text contained in the edit window and gets -# the cell's internal contents. +# the cell's internal content. #------------------------------------------------------------------------------ proc editEndCmd {tbl row col text} { switch [$tbl columncget $col -name] { - available { + available { # # Update the image contained in the cell # set img [expr {$text ? "checkedImg" : "uncheckedImg"}] $tbl cellconfigure $row,$col -image $img - } + } baudRate { # @@ -2322,6 +2322,31 @@

    Advanced Interactive tablelist Cell Editing

    +

    Instead of making the "Available" column editable via a + temporary checkbutton and displaying the images + "checkedImg" and "uncheckedImg" in its cells, we + can use the embedcheckbuttons + subcommand to populate the column with persistently embedded + checkbuttons.  The necessary changes are as follows:

    + +
      +
    • Remove those parts of the code above that are shown in + red color.
    • + +
    • + Invoke + +
      +
      +$tbl embedcheckbuttons 1
      +
      +
      + + after populating the tablelist widget. +
    • +
    +

    As mentioned above, the scripts tileWidgets.tcl, iwidgets.tcl, and miscWidgets.tcl are similar to bwidget.tcl.  The first one makes use of the tile entry, @@ -2351,14 +2376,14 @@

    A tablelist Widget Containing Embedded Windows

    Embedded Windows + "303">

    First, we create and populate the tablelist widget:

    -package require tablelist 5.18
    +package require tablelist 6.0
     
     wm title . "Tk Library Scripts"
     
    @@ -2418,25 +2443,36 @@ 

    A tablelist Widget Containing Embedded Windows

    # Populate the tablelist widget # cd $tk_library -set maxFileSize 0 +set totalSize 0 +set maxSize 0 foreach fileName [lsort [glob *.tcl]] { set fileSize [file size $fileName] $tbl insert end [list $fileName $fileSize $fileSize "" no] - if {$fileSize > $maxFileSize} { - set maxFileSize $fileSize + incr totalSize $fileSize + if {$fileSize > $maxSize} { + set maxSize $fileSize } } +$tbl header insert 0 [list "[$tbl size] *.tcl files" "" $totalSize "" ""] +$tbl header rowconfigure 0 -foreground blue

    We insert the size of each file not only into the column with the - title  "File Size" , but also into the column  + title  "File Size",  but also into the column  "Bar Chart".  Since we configured this column with  -formatcommand emptyStr,  the text will remain hidden in it.  It will, however, be needed when sorting the items by that column.

    +

    After populating the tablelist's body, we create a header item displaying + the total number and size of the library files, by invoking the  + header + insert  subcommand, and change its foreground color with the + aid of the  header + rowconfigure  subcommand.

    +

    To be able to create the embedded windows, we have first to implement the creation scripts for them, as specified in the description of the -window cell @@ -2472,7 +2508,7 @@

    A tablelist Widget Containing Embedded Windows

    # Manage the child frame # set fileSize [$tbl cellcget $row,fileSize -text] - place $w.f -relwidth [expr {double($fileSize) / $::maxFileSize}] + place $w.f -relwidth [expr {double($fileSize) / $::maxSize}] }
    @@ -2510,7 +2546,7 @@

    A tablelist Widget Containing Embedded Windows

    #------------------------------------------------------------------------------ # viewFile # -# Displays the contents of the file whose name is contained in the row with the +# Displays the content of the file whose name is contained in the row with the # given key of the tablelist widget tbl. #------------------------------------------------------------------------------ proc viewFile {tbl key} { @@ -2537,7 +2573,7 @@

    A tablelist Widget Containing Embedded Windows

    scrollbar $vsb -orient vertical -command [list $txt yview] # - # Insert the file's contents into the text widget + # Insert the file's content into the text widget # set chan [open $fileName] $txt insert end [read $chan] @@ -2602,7 +2638,7 @@

    Tile-Based Demo Scripts

     package require Tk 8.3                          ;# because of entry validation
    -package require tablelist 5.18
    +package require tablelist 6.0
     
    @@ -2610,7 +2646,7 @@

    Tile-Based Demo Scripts

    -package require tablelist_tile 5.18
    +package require tablelist_tile 6.0
     
    @@ -2727,7 +2763,7 @@

    Tile-Based Demo Scripts

    Embedded Windows + height="299">
    diff --git a/modules/tablelist/doc/tablelistBWidget.html b/modules/tablelist/doc/tablelistBWidget.html index e96481a4..7b60f92a 100644 --- a/modules/tablelist/doc/tablelistBWidget.html +++ b/modules/tablelist/doc/tablelistBWidget.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using the BWidget Package

    -

    For Tablelist Version 5.18

    +

    For Tablelist Version 6.0

    by

    diff --git a/modules/tablelist/doc/tablelistBinding.html b/modules/tablelist/doc/tablelistBinding.html index 2899fbfc..272c7ca4 100644 --- a/modules/tablelist/doc/tablelistBinding.html +++ b/modules/tablelist/doc/tablelistBinding.html @@ -12,7 +12,7 @@

    Commands Related to Binding Scripts

    -

    For Tablelist Version 5.18

    +

    For Tablelist Version 6.0

    by

    diff --git a/modules/tablelist/doc/tablelistColSort.html b/modules/tablelist/doc/tablelistColSort.html index 78ff717d..3c5588cf 100644 --- a/modules/tablelist/doc/tablelistColSort.html +++ b/modules/tablelist/doc/tablelistColSort.html @@ -12,7 +12,7 @@

    Commands for Interactive Sorting by One or More Columns

    -

    For Tablelist Version 5.18

    +

    For Tablelist Version 6.0

    by

    diff --git a/modules/tablelist/doc/tablelistCombobox.html b/modules/tablelist/doc/tablelistCombobox.html index f8c00836..c28b57e8 100644 --- a/modules/tablelist/doc/tablelistCombobox.html +++ b/modules/tablelist/doc/tablelistCombobox.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using the combobox Package

    -

    For Tablelist Version 5.18

    +

    For Tablelist Version 6.0

    by

    diff --git a/modules/tablelist/doc/tablelistCtext.html b/modules/tablelist/doc/tablelistCtext.html index 689517d9..fe5953c1 100644 --- a/modules/tablelist/doc/tablelistCtext.html +++ b/modules/tablelist/doc/tablelistCtext.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using the ctext Package

    -

    For Tablelist Version 5.18

    +

    For Tablelist Version 6.0

    by

    diff --git a/modules/tablelist/doc/tablelistIwidgets.html b/modules/tablelist/doc/tablelistIwidgets.html index 168f7576..bfc4cc5c 100644 --- a/modules/tablelist/doc/tablelistIwidgets.html +++ b/modules/tablelist/doc/tablelistIwidgets.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using the Iwidgets Package

    -

    For Tablelist Version 5.18

    +

    For Tablelist Version 6.0

    by

    @@ -161,7 +161,7 @@

    The tablelist::addIncrDateTimeWidget present then the finishediting subcommand of the Tcl command associated with the tablelist widget will - retrieve the contents of the embedded window used for interactive cell + retrieve the content of the embedded window used for interactive cell editing as an integer clock value (in seconds), otherwise as a string.  Use this option for tablelist widgets whose internal list contains date or time information in seconds (displayed with the aid of diff --git a/modules/tablelist/doc/tablelistMentry.html b/modules/tablelist/doc/tablelistMentry.html index 573cdb40..a0309e05 100644 --- a/modules/tablelist/doc/tablelistMentry.html +++ b/modules/tablelist/doc/tablelistMentry.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using the Mentry Package

    -

    For Tablelist Version 5.18

    +

    For Tablelist Version 6.0

    by

    @@ -142,7 +142,7 @@

    The tablelist::addDateMentry Command

    column configuration option).  The finishediting subcommand of the Tcl command associated with the tablelist widget will - retrieve the contents of the embedded window used for interactive cell + retrieve the content of the embedded window used for interactive cell editing by invoking the mentry::getClockVal command.  The value returned by this command (a clock value in seconds or one of the error strings "EMPTY", "BAD", @@ -151,7 +151,7 @@

    The tablelist::addDateMentry Command

    "tablelistWidget.html#editendcommand">-editendcommand tablelist configuration option (if any), as its last argument.  If this value is one of the above error strings then the script should reject - the mentry's contents by invoking the rejectinput subcommand. @@ -210,7 +210,7 @@

    The tablelist::addTimeMentry Command

    column configuration option).  The finishediting subcommand of the Tcl command associated with the tablelist widget will - retrieve the contents of the embedded window used for interactive cell + retrieve the content of the embedded window used for interactive cell editing by invoking the mentry::getClockVal command.  The value returned by this command (a clock value in seconds or one of the error strings "EMPTY" or "BAD") @@ -218,7 +218,7 @@

    The tablelist::addTimeMentry Command

    "tablelistWidget.html#editendcommand">-editendcommand
    tablelist configuration option (if any), as its last argument.  If this value is one of the above error strings then the script should reject - the mentry's contents by invoking the rejectinput subcommand. @@ -279,7 +279,7 @@

    The tablelist::addDateTimeMentry column configuration option).  The finishediting subcommand of the Tcl command associated with the tablelist widget will - retrieve the contents of the embedded window used for interactive cell + retrieve the content of the embedded window used for interactive cell editing by invoking the mentry::getClockVal command.  The value returned by this command (a clock value in seconds or one of the error strings "EMPTY", "BAD", @@ -288,7 +288,7 @@

    The tablelist::addDateTimeMentry "tablelistWidget.html#editendcommand">-editendcommand tablelist configuration option (if any), as its last argument.  If this value is one of the above error strings then the script should reject - the mentry's contents by invoking the rejectinput subcommand. @@ -346,7 +346,7 @@

    The tablelist::addFixedPointMentry real numbers as internal cell values.  The finishediting subcommand of the Tcl command associated with the tablelist widget will - retrieve the contents of the embedded window used for interactive cell + retrieve the content of the embedded window used for interactive cell editing by invoking the mentry::getReal command.  The value returned by this command (a real number or the error string "EMPTY") will be passed to the script corresponding to the @@ -354,7 +354,7 @@

    The tablelist::addFixedPointMentry "tablelistWidget.html#editendcommand">-editendcommand tablelist configuration option (if any), as its last argument.  If this value is the above error string then the script should reject the - mentry's contents by invoking the rejectinput subcommand. @@ -405,7 +405,7 @@

    The tablelist::addIPAddrMentry addresses as internal cell values.  The finishediting subcommand of the Tcl command associated with the tablelist widget will - retrieve the contents of the embedded window used for interactive cell + retrieve the content of the embedded window used for interactive cell editing by invoking the mentry::getIPAddr command.  The value returned by this command (an IP address or the error string "EMPTY") will be passed to the script @@ -413,7 +413,7 @@

    The tablelist::addIPAddrMentry "tablelistWidget.html#editendcommand">-editendcommand tablelist configuration option (if any), as its last argument.  If this value is the above error string then the script should reject the - mentry's contents by invoking the rejectinput subcommand. @@ -464,7 +464,7 @@

    The tablelist::addIPv6AddrMentry IPv6 addresses as internal cell values.  The finishediting subcommand of the Tcl command associated with the tablelist widget will - retrieve the contents of the embedded window used for interactive cell + retrieve the content of the embedded window used for interactive cell editing by invoking the mentry::getIPv6Addr command.  The value returned by this command (an IPv6 address or the error string "EMPTY") will be passed to the script @@ -472,7 +472,7 @@

    The tablelist::addIPv6AddrMentry "tablelistWidget.html#editendcommand">-editendcommand tablelist configuration option (if any), as its last argument.  If this value is the above error string then the script should reject the - mentry's contents by invoking the rejectinput subcommand. diff --git a/modules/tablelist/doc/tablelistThemes.html b/modules/tablelist/doc/tablelistThemes.html index 1b2be7d3..6ad8ecd5 100644 --- a/modules/tablelist/doc/tablelistThemes.html +++ b/modules/tablelist/doc/tablelistThemes.html @@ -12,7 +12,7 @@

    Commands Related to Tile Themes

    -

    For Tablelist Version 5.18

    +

    For Tablelist Version 6.0

    by

    diff --git a/modules/tablelist/doc/tablelistTile.html b/modules/tablelist/doc/tablelistTile.html index 685b12b6..0fae1092 100644 --- a/modules/tablelist/doc/tablelistTile.html +++ b/modules/tablelist/doc/tablelistTile.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using Tile Widgets

    -

    For Tablelist Version 5.18

    +

    For Tablelist Version 6.0

    by

    diff --git a/modules/tablelist/doc/tablelistTkCore.html b/modules/tablelist/doc/tablelistTkCore.html index 142ea259..ce9855b1 100644 --- a/modules/tablelist/doc/tablelistTkCore.html +++ b/modules/tablelist/doc/tablelistTkCore.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using Tk Core Widgets

    -

    For Tablelist Version 5.18

    +

    For Tablelist Version 6.0

    by

    diff --git a/modules/tablelist/doc/tablelistWidget.html b/modules/tablelist/doc/tablelistWidget.html index a8b516a2..8b0504f8 100644 --- a/modules/tablelist/doc/tablelistWidget.html +++ b/modules/tablelist/doc/tablelistWidget.html @@ -13,7 +13,7 @@

    The tablelist::tablelist Command

    -

    For Tablelist Version 5.18

    +

    For Tablelist Version 6.0

    by

    @@ -54,7 +54,9 @@

    Quick Reference

  • -
    STANDARD OPTIONS
    +
    DESCRIPTION
    + +
    STANDARD OPTIONS
    @@ -66,8 +68,8 @@ 

    Quick Reference

    -
    OPTIONS FOR THE BODY COMPONENT OF THE - WIDGET
    +
    OPTIONS FOR THE BODY AND HEADER COMPONENTS OF + THE WIDGET
    @@ -414,7 +416,8 @@ 

    Quick Reference

    -wrap boolean
    -
    ROW CONFIGURATION OPTIONS
    +
    ROW CONFIGURATION OPTIONS IN THE + TABLELIST BODY
    -background color  or  -bg @@ -441,7 +444,25 @@

    Quick Reference

    -text list
    -
    CELL CONFIGURATION OPTIONS
    +
    ROW CONFIGURATION OPTIONS IN THE + TABLELIST HEADER
    + +
    -background + color  or  -bg + color
    + +
    -font font
    + +
    -foreground + color  or  -fg + color
    + +
    -name name
    + +
    -text list
    + +
    CELL CONFIGURATION OPTIONS IN THE + TABLELIST BODY
    -background color  or  -bg @@ -484,7 +505,38 @@

    Quick Reference

    -windowupdate command
    -
    DESCRIPTION
    +
    CELL CONFIGURATION OPTIONS IN + THE TABLELIST HEADER
    + +
    -background + color  or  -bg + color
    + +
    -font font
    + +
    -foreground + color  or  -fg + color
    + +
    -image + image
    + +
    -stretchwindow + boolean
    + +
    -text text
    + +
    -valign + center|top|bottom
    + +
    -window + command
    + +
    -windowdestroy + command
    + +
    -windowupdate + command
    COLORS AND FONTS
    @@ -533,6 +585,25 @@

    Quick Reference

    +
    HEADER ROW INDICES
    + +
    +
    +number  hknumber  end  last  @x,y  name
    +
    +
    + +
    HEADER CELL INDICES
    + +
    +
    +headerRow,col  end  last  @x,y
    +
    +    headerRow: number  hknumber  end  last  name
    +    col:       number  active  anchor  end  last  left  right  name
    +
    +
    +
    WIDGET COMMAND
    pathName activate @@ -583,22 +654,22 @@

    Quick Reference

    option args
    -
    pathName cellselection anchor +
    pathName cellselection anchor cellIndex
    -
    pathName cellselection clear - firstCell lastCell
    +
    pathName cellselection clear firstCell + lastCell
    -
    pathName cellselection clear +
    pathName cellselection clear cellIndexList
    -
    pathName cellselection includes +
    pathName cellselection includes cellIndex
    -
    pathName cellselection set - firstCell lastCell
    +
    pathName cellselection set firstCell + lastCell
    -
    pathName cellselection set +
    pathName cellselection set cellIndexList
    @@ -689,12 +760,11 @@

    Quick Reference

    "#curcellselection">curcellselection
    ?-all|-nonhidden|-viewable? -
    pathName curselection +
    pathName curselection ?-all|-nonhidden|-viewable?
    -
    pathName delete first - last
    +
    pathName delete + firstIndex lastIndex
    pathName delete indexList
    @@ -711,8 +781,8 @@

    Quick Reference

    pathName descendantcount nodeIndex
    -
    pathName dicttoitem dictionary
    +
    pathName dicttoitem + dictionary
    pathName editcell cellIndex
    @@ -726,6 +796,22 @@

    Quick Reference

    pathName editwintag
    +
    pathName embedcheckbutton cellIndex + ?command?
    + +
    pathName embedcheckbuttons columnIndex + ?command?
    + +
    pathName embedttkcheckbutton cellIndex + ?command?
    + +
    pathName embedttkcheckbuttons columnIndex + ?command?
    +
    pathName entrypath
    @@ -753,8 +839,8 @@

    Quick Reference

    pathName formatinfo
    -
    pathName get first - last
    +
    pathName get firstIndex + lastIndex
    pathName get indexList
    @@ -772,7 +858,7 @@

    Quick Reference

    columnIndexList
    pathName getformatted - first last
    + firstIndex lastIndex
    pathName getformatted indexList
    @@ -794,13 +880,13 @@

    Quick Reference

    columnIndexList
    pathName getfullkeys - first last
    + firstIndex lastIndex
    pathName getfullkeys indexList
    pathName getkeys - first last
    + firstIndex lastIndex
    pathName getkeys indexList
    @@ -818,6 +904,15 @@

    Quick Reference

    pathName hasrowattrib index name
    +
    pathName header option + args
    + +
    pathName headerpath
    + +
    pathName headertag
    +
    pathName hidetargetmark
    @@ -868,8 +963,8 @@

    Quick Reference

    pathName itemlistvar
    -
    pathName itemtodict item
    +
    pathName itemtodict + item
    pathName labelpath columnIndex
    @@ -945,22 +1040,22 @@

    Quick Reference

    option args
    -
    pathName selection anchor +
    pathName selection anchor index
    -
    pathName selection clear first - last
    +
    pathName selection clear firstIndex + lastIndex
    -
    pathName selection clear +
    pathName selection clear indexList
    -
    pathName selection includes +
    pathName selection includes index
    -
    pathName selection set first - last
    +
    pathName selection set firstIndex + lastIndex
    -
    pathName selection set +
    pathName selection set indexList
    @@ -1014,7 +1109,7 @@

    Quick Reference

    columnIndexList
    pathName togglerowhide - first last
    + firstIndex lastIndex
    pathName togglerowhide indexList
    @@ -1038,8 +1133,8 @@

    Quick Reference

    name
    pathName viewablerowcount ?first - last?
    + "#viewablerowcount">viewablerowcount
    ?firstIndex + lastIndex?
    pathName windowpath cellIndex
    @@ -1053,10 +1148,10 @@

    Quick Reference

    pathName xview units
    -
    pathName xview moveto +
    pathName xview moveto fraction
    -
    pathName xview scroll number +
    pathName xview scroll number units|pages
    @@ -1070,17 +1165,198 @@

    Quick Reference

    pathName yview units
    -
    pathName yview moveto +
    pathName yview moveto fraction
    -
    pathName yview scroll number +
    pathName yview scroll number units|pages
    +
    HEADER-RELATED + SUBCOMMANDS
    + +
    pathName header bbox + headerIndex
    + +
    pathName header + cellattrib headerCellIndex ?name? ?value + name value ...?
    + +
    pathName header + cellbbox headerCellIndex
    + +
    pathName header + cellcget headerCellIndex option
    + +
    pathName header + cellconfigure headerCellIndex ?option? ?value + option value ...?
    + +
    pathName header + cellindex headerCellIndex
    + +
    pathName header + configcelllist {headerCellIndex option value + headerCellIndex option value ...}
    + +
    pathName header + configcells ?headerCellIndex option value + headerCellIndex option value ...?
    + +
    pathName header + configrowlist {headerIndex option value + headerIndex option value ...}
    + +
    pathName header + configrows ?headerIndex option value + headerIndex option value ...?
    + +
    pathName header + containing y
    + +
    pathName header + containingcell x y
    + +
    pathName header delete + firstHeaderIndex lastHeaderIndex
    + +
    pathName header delete + headerIndexList
    + +
    pathName header + embedcheckbutton headerCellIndex + ?command?
    + +
    pathName header + embedcheckbuttons columnIndex ?command?
    + +
    pathName header + embedttkcheckbutton headerCellIndex + ?command?
    + +
    pathName header + embedttkcheckbuttons columnIndex + ?command?
    + +
    pathName header + fillcolumn columnIndex text
    + +
    pathName header + findrowname name
    + +
    pathName header get + firstHeaderIndex lastHeaderIndex
    + +
    pathName header get + headerIndexList
    + +
    pathName header + getcells firstHeaderCell lastHeaderCell
    + +
    pathName header + getcells headerCellIndexList
    + +
    pathName header + getcolumns firstColumn lastColumn
    + +
    pathName header + getcolumns columnIndexList
    + +
    pathName header + getformatted firstHeaderIndex + lastHeaderIndex
    + +
    pathName header + getformatted headerIndexList
    + +
    pathName header + getformattedcells firstHeaderCell + lastHeaderCell
    + +
    pathName header + getformattedcells headerCellIndexList
    + +
    pathName header + getformattedcolumns firstColumn + lastColumn
    + +
    pathName header + getformattedcolumns columnIndexList
    + +
    pathName header + getfullkeys firstHeaderIndex + lastHeaderIndex
    + +
    pathName header + getfullkeys headerIndexList
    + +
    pathName header getkeys + firstHeaderIndex lastHeaderIndex
    + +
    pathName header getkeys + headerIndexList
    + +
    pathName header + hascellattrib headerCellIndex name
    + +
    pathName header + hasrowattrib headerIndex name
    + +
    pathName header + imagelabelpath headerCellIndex
    + +
    pathName header index + headerIndex
    + +
    pathName header insert + headerIndex ?item item ...?
    + +
    pathName header + insertlist headerIndex itemList
    + +
    pathName header + iselemsnipped headerCellIndex + fullTextName
    + +
    pathName header + itemlistvar
    + +
    pathName header nearest + y
    + +
    pathName header + nearestcell x y
    + +
    pathName header + rowattrib headerIndex ?name? ?value + name value ...?
    + +
    pathName header rowcget + headerIndex option
    + +
    pathName header + rowconfigure headerIndex ?option? ?value + option value ...?
    + +
    pathName header + size
    + +
    pathName header + unsetcellattrib headerCellIndex name
    + +
    pathName header + unsetrowattrib headerIndex name
    + +
    pathName header + windowpath headerCellIndex
    +
    DEFAULT AND INDIVIDUAL BINDINGS FOR THE TABLELIST BODY
    +
    DEFAULT AND INDIVIDUAL BINDINGS + FOR THE HEADER ITEMS
    +
    DEFAULT AND INDIVIDUAL BINDINGS FOR THE HEADER LABELS
    @@ -1114,7 +1390,107 @@

    Detailed Reference

    -
    STANDARD OPTIONS
    +
    DESCRIPTION
    + +
    The tablelist::tablelist command creates a new + window named pathName and of the class + Tablelist, and makes it into a tablelist + widget.  Additional options, described below, may be specified on the + command line or in the option database to configure aspects of the + tablelist such as its colors, font, and columns.  The + tablelist::tablelist command returns its + pathName argument.  At the time this command is + invoked, there must not exist a window named pathName, + but pathName's parent must exist.
    + +
    A tablelist is a multi-column listbox and tree widget, + implemented as a mega-widget, consisting of a body and a + header.  The body displays a list of items, one per + line.  Each item is a list of elements, which are aligned in + columns.  In other words, an item is the content of a row, and an + element is the text contained in a cell.  The header consists of label + widgets displaying the column titles.  They can be used, among others, + for interactive column resizing and column-based sorting of the body items, + as described below.  For Tk versions 8.5 and higher, the header + component can also contain (a typically small number of) items, just like + the body.  The order of the header items is not affected by any + sorting-related commands or bindings.  The end of the header row area + is visualized with the aid of a horizontal separator, placed just below the + last header row (if any).
    + +
    The reason for restricting the support for header items to + Tk versions 8.5 and later is that the header's height is set to be just + large enough to hold all its items.  This is done with the aid of + the  count -ypixels  text widget command, + which was introduced in Tk 8.5.
    + +
    Each cell (in both the body and the header) and each header + label of a tablelist widget can also contain an image, which is placed to + the left or right of the text, depending on the column's alignment.  + Instead of an image, a tablelist cell (in both the body and the header) can + also contain an embedded window, placed to the left or right of the text, + just like an embedded image.
    + +
    When a tablelist is used as a tree widget, one of its + columns will display the tree hierarchy with the aid of indentations and + expand/collapse controls.  The Tablelist package provides a great + variety of tree styles controlling the look & feel of that column, and + chooses the correct default style depending on the windowing system, + operating system version, and tile theme.  In a tablelist used as a + multi-column tree widget, every row of its body (but not of its header) is + at the same time a tree node, having exactly one parent node + and any number of child nodes.  The tree's origin is the + invisible root node, which has no parent itself and whose children + are the top-level nodes.
    + +
    The elements of a tablelist widget can, per default, be only + edited programmatically.  However, interactive editing can be enabled + for individual cells and for entire columns of the widget's body.  Per + default, the interactive cell editing uses a temporary embedded entry + widget, thus making sure that all the validation facilities available for + entry widgets can be used during the editing process.  A great variety + of widgets from the packages BWidget, Iwidgets, combobox (by Bryan Oakley), + ctext, and Mentry (or Mentry_tile), as well as Tk core text, spinbox, + checkbutton, and menubutton widgets, along with tile entry, spinbox, + combobox, checkbutton, and menubutton widgets are also supported as + temporary embedded widgets used for cell editing.  In addition, a rich + set of keyboard bindings is provided for a comfortable navigation between + the editable cells.
    + +
    When first created, a new tablelist widget has no + items.  Items (in both the body and the header) may be added, deleted, + or updated using widget commands described below.  In addition, one or + more items or elements of the widget's body may be selected.  If a + tablelist widget is exporting its selection (see the + -exportselection option), then it will observe the + standard X11 protocols for handling the selection.  Tablelist widget + selections are available as types STRING and + UTF8_STRING; the value of the selection will be a text + built by taking all of the rows having at least one viewable selected element, joining these elements + together with tabs, and the resulting strings in turn with newlines.  + If a tablelist widget that is exporting its selection is the selection + owner and some other window claims ownership of the selection away from it, + then the virtual event + <<TablelistSelectionLost>> is + generated.
    + +
    It is not necessary for all the elements to be displayed in + the tablelist widget at once; commands described below may be used to + change the horizontal view in the window and the vertical view in the body + (but not in the header).  Tablelist widgets allow scrolling in both + directions (but no vertical scrolling in the header component), using the + standard -xscrollcommand and + -yscrollcommand options.  They also support + scanning in the widget's body (but not in its header), as described + below.
    + +
    Each tablelist widget, as well as each tablelist column, + row, and cell (in both the body and the header) may have any number of + attributes, which can be used in commands that create or manipulate + tablelist widgets for particular purposes.
    + +
    STANDARD OPTIONS
    @@ -1136,8 +1512,8 @@ 

    Detailed Reference

    -selectforeground have theme-specific default values.
    -
    OPTIONS FOR THE BODY COMPONENT OF THE - WIDGET
    +
    OPTIONS FOR THE BODY AND HEADER + COMPONENTS OF THE WIDGET
    @@ -1146,11 +1522,11 @@ 

    Detailed Reference

    These options (described in the options manual entry) are only - valid for the body component of the tablelist widget.  As discussed in - the next section, the colors and font used when drawing the header labels - can be different from those specified for the body.  When using the - package Tablelist_tile, these options have theme-specific default - values.
    + valid for the body and header components of the tablelist widget.  As + discussed in the next section, the colors and font used when drawing the + header labels can be different from those specified for the body and + header items.  When using the package Tablelist_tile, these + options have theme-specific default values.
    WIDGET-SPECIFIC OPTIONS
    @@ -1179,12 +1555,12 @@

    Detailed Reference

    Specifies a Tcl command used to decide whether a given tablelist node may accept a specified item being moved interactively as a child.  The - specified command is automatically concatenated with the name of the - tablelist widget, the node index of the would-be new parent node, and - the row index of the dragged item, the resulting script is evaluated in - the global scope, and the return value (which must be a boolean) will - determine whether to allow to move the source item to the current mouse - position as a child of the given parent node.

    + specified command is automatically concatenated with the path name of + the tablelist widget, the node index of the would-be new parent node, + and the row index of the dragged item, the resulting script is + evaluated in the global scope, and the return value (which must be a + boolean) will determine whether to allow to move the source item to the + current mouse position as a child of the given parent node.

    For example, in the case of a tablelist widget used as a file manager, in which the top-level items represent volumes mounted on the @@ -1237,8 +1613,8 @@

    Detailed Reference

    may accept a specified item being moved interactively to be dropped as a sibling just before that row.  The specified command is automatically concatenated with the - name of the tablelist widget, the row index of the would-be new target, - and the row index of the dragged item, the resulting script is + path name of the tablelist widget, the row index of the would-be new + target, and the row index of the dragged item, the resulting script is evaluated in the global scope, and the return value (which must be a boolean) will determine whether to allow to move the source item to the current mouse position, just before the given row.

    @@ -1469,17 +1845,18 @@

    Detailed Reference

    photo7x4, photo9x5, photo11x6, and photo15x8 use GIF images that look very close to the native sort arrows on Windows - Vista, 7, and 8.  When using one of these styles, the -arrowcolor and -arrowcolor and + -arrowdisabledcolor options have no effect.

    On Windows Vista, 7, 8, and 10, the sort arrows are shown horizontally centered in the header labels, just below their top - edges:

    + edges:

    Arrow Styles Vista

    + "638" height="123">

    The arrow style photo7x7 uses PNG images that look and behave very close to the native sort arrows on Mac OS X Aqua @@ -1601,8 +1978,8 @@

    Detailed Reference

    tablelist used as a tree widget (with the aid of the collapse or collapseall subcommand).  The - specified command is automatically concatenated with the name of the - tablelist widget and the row index, and the resulting script is + specified command is automatically concatenated with the path name of + the tablelist widget and the row index, and the resulting script is evaluated in the global scope, before hiding the descendants of the row in question.

    @@ -1638,26 +2015,28 @@

    Detailed Reference

    arbitrary character regions within the cells of the currently visible rows.  Whenever the Tablelist package needs to display the various foreground and background colors (including the stripe- and - selection-specific ones), it runs over the cells of the rows that are - currently visible in the tablelist window and displays the colors by - adding appropriate tags to the body text widget areas making up the - formatted contents of the cells.  After activating the colors for - a cell, the Tablelist code invokes the command specified as the value - of this configuration option (provided that it is a nonempty string), - in the global scope and with the following arguments specific to the - cell being processed:

    + selection-specific ones), it runs over the cells of the body and header + rows that are currently visible in the tablelist window and displays + the colors by adding appropriate tags to the body and header text + widget areas making up the formatted contents of the cells.  After + activating the colors for a cell, the Tablelist code invokes the + command specified as the value of this configuration option (provided + that it is a nonempty string), in the global scope and with the + following arguments specific to the body or header cell being + processed:

    • the path name of the tablelist widget;
    • -
    • the path name of the tablelist's body component;
    • +
    • the path name of the tablelist's body or header text widget;
    • -
    • the full key of the item containing the element being - processed;
    • +
    • the full key of the item containing the element being processed + (remember that this starts with the prefix k for + a body item and with hk for a header item);
    • -
    • the numerical row index of that item;
    • +
    • the numerical row or header row index of that item;
    • -
    • the numerical index of the cell's column;
    • +
    • the numerical index of the cell's column;
    • the text index (of the form line.char) of the first \t character delimiting the cell in the @@ -1682,7 +2061,7 @@

      Detailed Reference

      -proc myColorizeCmd {tbl body key row col tabIdx1 tabIdx2 inStripe selected} { ... }
      +proc myColorizeCmd {tbl textWidget key row col tabIdx1 tabIdx2 inStripe selected} { ... }
       
      @@ -1886,22 +2265,26 @@

      Detailed Reference

      Specifies a boolean value that controls the way the texts of newly - inserted rows will be displayed in the underlying text widget.  - If true then the texts of the new rows won't be inserted into the body - text widget until the corresponding cells become visible (e.g., as a - result of horizontal or vertical scrolling).  Otherwise the texts - of the new rows will be displayed in the underlying text widget - immediately after inserting the rows.  The default is - 1.

      - -

      REMARK:  The default value true of this option makes the - item insertion and sorting significantly faster, especially in the + inserted rows in the tablelist's body will be displayed in the + underlying text widget.  If true then the texts of the new rows + won't be inserted into the body text widget until the corresponding + cells become visible (e.g., as a result of horizontal or vertical + scrolling).  Otherwise the texts of the new rows will be displayed + in the underlying text widget immediately after inserting the + rows.  The default is 1.

      + +

      REMARK 1:  The default value true of this option makes + he item insertion and sorting significantly faster, especially in the presence of static-width columns, because the snipping of elements that don't fit into their cells will be postponed to the time when they get displayed in the body text widget.  On the other hand, this display on demand imposes some performance penalty on the scrolling, especially if the tablelist widget has many columns.  To speed up the scrolling, you might consider setting this option to false.

      + +

      REMARK 2:  Newly inserted header rows are displayed + immediately in the underlying text widget, independently of the value + of this option.

      @@ -1928,16 +2311,16 @@

      Detailed Reference

      Specifies a Tcl command to be invoked on normal termination of the - interactive editing of a cell's contents if the final text of the + interactive editing of a cell's content if the final text of the temporary embedded widget used for the editing is different from its initial one.  The command is automatically concatenated with the - name of the tablelist widget, the cell's row and column indices, as - well as the final contents of the edit window, the resulting script is - evaluated in the global scope, and the return value becomes the cell's - new contents after destroying the temporary embedded widget.  The - main purpose of this script is to perform a final validation of the - edit window's contents.  See the description of the - -forceeditendcommand option for more about the invocation of the command mentioned above, as well as the INTERACTIVE CELL EDITING section for @@ -2003,13 +2386,13 @@

      Detailed Reference

      Specifies a Tcl command to be invoked when the interactive editing - of a cell's contents is started.  The command is automatically - concatenated with the name of the tablelist widget, the cell's row and - column indices, as well as the text displayed in the cell, the + of a cell's content is started.  The command is automatically + concatenated with the path name of the tablelist widget, the cell's row + and column indices, as well as the text displayed in the cell, the resulting script is evaluated in the global scope, and the return value - becomes the initial contents of the temporary embedded widget used for + becomes the initial content of the temporary embedded widget used for the editing.  The main purpose of this script is to define - validations for the edit window's contents.  See the INTERACTIVE CELL EDITING section for details on the editing process.

      @@ -2041,10 +2424,10 @@

      Detailed Reference

      tablelist used as a tree widget (with the aid of the expand or expandall subcommand).  The specified - command is automatically concatenated with the name of the tablelist - widget and the row index, and the resulting script is evaluated in the - global scope, before displaying the children of the row in - question.

      + command is automatically concatenated with the path name of the + tablelist widget and the row index, and the resulting script is + evaluated in the global scope, before displaying the children of the + row in question.

      For technical reasons (the use of the -elide text widget tag option for collapsing a row), this option is not @@ -2064,7 +2447,7 @@

      Detailed Reference

      # displayed in the first cell of the specified row set dir [$tbl rowattrib $row pathName] - # Display the contents of the directory $dir + # Display the content of the directory $dir # as child items of the one identified by $row putContents $dir $tbl $row } @@ -2072,7 +2455,8 @@

      Detailed Reference

      # The rest is just eye candy: if {[$tbl childcount $row] != 0} { # Update the image displayed in the row's first cell - $tbl cellconfigure $row,0 -image openFolderImg + $tbl cellconfigure $row,0 -image openFolderImg } }
    @@ -2110,7 +2494,7 @@

    Detailed Reference

    widget used for the editing equals its initial one, and will also be invoked when the interactive cell editing is canceled (in the latter case, the text passed to it as last argument will be the cell's - original contents, not its final one).  The default value of this + original content, not its final one).  The default value of this option is 0, meaning that the command will only be invoked on normal termination of the editing process, if the final text of the temporary embedded widget is different from its initial one.  See @@ -2119,7 +2503,7 @@

    Detailed Reference

    If the option's value is true and no value for the -editendcommand option was specified, then on - normal termination of the editing process the cell's new contents will + normal termination of the editing process the cell's new content will be set to the text contained in the edit window, even if it has not been changed interactively (but might have been returned by the command given by the the Detailed Reference

    Specifies the Tcl command to be invoked when mouse button 1 is pressed over one of the header labels and later released over the same label.  When the <ButtonRelease-1> event - occurs, the command is automatically concatenated with the name of the - tablelist widget and the column index of the respective label, and the - resulting script is evaluated in the global scope.  If the + occurs, the command is automatically concatenated with the path name of + the tablelist widget and the column index of the respective label, and + the resulting script is evaluated in the global scope.  If the tablelist's state is disabled then this action will not take place.  The most common value of this option is Detailed Reference pressed together with the Shift key over one of the header labels and later released over the same label.  When the <ButtonRelease-1> event occurs, the command - is automatically concatenated with the name of the tablelist widget and - the column index of the respective label, and the resulting script is - evaluated in the global scope.  If the tablelist's + is automatically concatenated with the path name of the tablelist + widget and the column index of the respective label, and the resulting + script is evaluated in the global scope.  If the tablelist's state is disabled then this action will not take place.  The most common value of this option is Detailed Reference

    Specifies the name of a variable.  The value of the variable is - a list to be displayed inside the widget; if the variable value changes - then the widget will automatically update itself to reflect the new - value.  The value of the variable must be a valid list.  Each - list element corresponds to a row within the widget, and must be a - valid list itself; its elements correspond to the cells within the - respective row.  Attempts to assign a variable whose value does - not fulfil these conditions to -listvariable will - cause an error.  Attempts to unset a variable in use as a - -listvariable will fail but will not generate an - error.

    + a list to be displayed inside the widget's body; if the variable value + changes then the widget will automatically update itself to reflect the + new value.  The value of the variable must be a valid list.  + Each list element corresponds to a row within the widget's body, and + must be a valid list itself; its elements correspond to the cells + within the respective row.  Attempts to assign a variable whose + value does not fulfill these conditions to + -listvariable will cause an error.  Attempts + to unset a variable in use as a -listvariable will + fail but will not generate an error.

    REMARK 1:  For increased efficiency, updating the widget to reflect a changed value of the variable specified with this option @@ -2807,11 +3191,15 @@

    Detailed Reference

    -

    Specifies a boolean value that determines whether the rows can be - moved interactively.  See the DEFAULT AND - INDIVIDUAL BINDINGS FOR THE TABLELIST BODY section below for - information on moving a row interactively.  The default value is - 0.

    +

    Specifies a boolean value that determines whether the rows displayed + in the tablelist's body can be moved interactively.  See the + DEFAULT AND INDIVIDUAL BINDINGS FOR THE + TABLELIST BODY section below for information on moving a row + interactively.  The default value is 0.

    + +

    REMARK:  The support for moving a row is restricted to + the widget's body component.  Moving of header rows is not + supported.

    @@ -2904,8 +3292,8 @@

    Detailed Reference

    the children (or descendants, when used with the -descend option) of a tablelist row whose children have not been inserted yet.  The specified command is - automatically concatenated with the name of the tablelist widget and - the row index, and the resulting script is evaluated in the global + automatically concatenated with the path name of the tablelist widget + and the row index, and the resulting script is evaluated in the global scope.  It is expected that this script will insert the children of the row in question, without expanding the node or changing its appearance in any other way.

    @@ -2948,7 +3336,7 @@

    Detailed Reference

    # displayed in the first cell of the specified row
    set dir [$tbl rowattrib $row pathName] - # Display the contents of the directory $dir + # Display the content of the directory $dir # as child items of the one identified by $row putContents $dir $tbl $row } @@ -2969,7 +3357,8 @@

    Detailed Reference

    # The rest is just eye candy: if {[$tbl childcount $row] != 0} { # Update the image displayed in the row's first cell - $tbl cellconfigure $row,0 -image openFolderImg + $tbl cellconfigure $row,0 -image openFolderImg } } @@ -3350,9 +3739,10 @@

    Detailed Reference

    tablelist window.

    REMARK:  Tablelist doesn't support horizontal separators - (except for the one mentioned above), but a nice distinguishing effect - for the rows can be achieved with the aid of the -stripebackground option discussed + (except for the one mentioned above and another one placed just below + the last header row), but a nice distinguishing effect for the rows in + the widget's body can be achieved with the aid of the -stripebackground option described below.

    @@ -3442,9 +3832,10 @@

    Detailed Reference

    Specifies additional space to provide above and below each row of - the widget.  The option's value may have any of the standard forms - for screen distances.  It defaults to 0.  See - also the -tight option.

    + the widget, in both the body and the header.  The option's value + may have any of the standard forms for screen distances.  It + defaults to 0.  See also the -tight option.

    @@ -3556,19 +3947,19 @@

    Detailed Reference

    -

    Specifies the background color to use when displaying the items +

    Specifies the background color to use when displaying the body items belonging to a stripe.  Each stripe is composed of the same number - stripeHeight of consecutive stripeHeight of consecutive viewable items, according to the value of the -stripeheight - configuration option.  The first stripeHeight + configuration option.  The first stripeHeight viewable items are "normal" ones; they are followed by a stripe - composed of the next stripeHeight viewable items, which in - turn is followed by the same number of "normal" viewable items, and so - on.  In the Tablelist package and in most themes supported by - Tablelist_tile, the default value is an empty string, indicating that - the stripes will inherit the background color specified by the - -background + composed of the next stripeHeight viewable items, + which in turn is followed by the same number of "normal" viewable + items, and so on.  In the Tablelist package and in most themes + supported by Tablelist_tile, the default value is an empty string, + indicating that the stripes will inherit the background color specified + by the -background configuration option.  When using Tablelist_tile with the tileqt theme then the default value is given by the global KDE option alternateBackground, which in @@ -3606,18 +3997,18 @@

    Detailed Reference

    -

    Specifies the foreground color to use when displaying the items +

    Specifies the foreground color to use when displaying the body items belonging to a stripe.  Each stripe is composed of the same number - stripeHeight of consecutive stripeHeight of consecutive viewable items, according to the value of the -stripeheight - configuration option.  The first stripeHeight + configuration option.  The first stripeHeight viewable items are "normal" ones; they are followed by a stripe - composed of the next stripeHeight viewable items, which in - turn is followed by the same number of "normal" viewable items, and so - on.  The default value is an empty string, indicating that the - stripes will inherit the foreground color specified by the - -foreground + composed of the next stripeHeight viewable items, + which in turn is followed by the same number of "normal" viewable + items, and so on.  The default value is an empty string, + indicating that the stripes will inherit the foreground color specified + by the -foreground configuration option.  The -stripeforeground option has a higher priority than the -foreground column configuration option, but a lower priority than the @@ -3679,9 +4070,8 @@

    Detailed Reference

    keyboard traversal.  It is almost identical to the standard option of the same name (see the options manual entry for details).  The only difference is that not the widget itself but - its body child (containing the items) will receive the focus during - keyboard traversal with the standard keys (Tab and - Shift-Tab).

    + its body child will receive the focus during keyboard traversal with + the standard keys (Tab and Shift-Tab).

    @@ -3708,9 +4098,9 @@

    Detailed Reference

    Specifies the color of the gap displayed in the tablelist's body or - header to indicate the target position when moving a row or column - interactively.  The target indicator belonging to the tablelist's - body can also be displayed explicitly with the aid of the + header label area to indicate the target position when moving a row or + column interactively.  The target indicator belonging to the + tablelist's body can also be displayed explicitly with the aid of the showtargetmark subcommand, and its path name can be retrieved via targetmarkpath.  The default @@ -3742,9 +4132,9 @@

    Detailed Reference

    Specifies a boolean value that determines whether to eliminate the one-pixel additional space left below each tablelist row for Tk listbox - compatibility.  The default value is 0, which draws a - one-pixel additional space below each row, just like a Tk core - listbox.

    + compatibility, in both the body and the header.  The default value + is 0, which draws a one-pixel additional space below each + row, just like a Tk core listbox.

    REMARK:  You can set this option to true and at the same time provide additional space above and below each row with the aid of @@ -3828,18 +4218,23 @@

    Detailed Reference

    Specifies a Tcl command to be used for displaying cell- and column - label-specific balloon help.  When the mouse pointer enters a - cell, the command is automatically concatenated with the name of the - tablelist widget and the cell's row and column indices, and the - resulting script is evaluated in the global scope.  Similarly, - when the mouse pointer enters a header label, the command is - automatically concatenated with the name of the tablelist widget, the - number -1, and the column index of the respective label, - and the resulting script is evaluated in the global scope.  In - both cases, the action described above is only triggered if both the - value of this option and that of -tooltipdelcommand are nonempty - strings.

    + label-specific balloon help.  When the mouse pointer enters a cell + in the tablelist's body, the command is automatically concatenated with + the path name of the tablelist widget and the cell's row and column + indices, and the resulting script is evaluated in the global + scope.  Similarly, when the mouse pointer enters a header label, + the command is automatically concatenated with the path name of the + tablelist widget, the number -1, and the column index of + the respective label, and the resulting script is evaluated in the + global scope.  Finally, when the mouse pointer enters a cell in + the tablelist's header, the command is automatically concatenated with + the path name of the tablelist widget, the header cell's row index + prefixed by the letter h, as well as the cell's + column index, and the resulting script is evaluated in the global + scope.  In all three cases, the action described above is only + triggered if both the value of this option and that of + -tooltipdelcommand + are nonempty strings.

    For example, consider the procedure tooltipAddCmd shown below, which makes use of the DynamicHelp::add @@ -3860,6 +4255,30 @@

    Detailed Reference

    +

    If the widget can also contain header items then a slightly more + complicated procedure is needed:

    + +
    +
    +proc tooltipAddCmd {tbl row col} {
    +    if {[string is integer $row]} {
    +        if {($row >= 0 && [$tbl iselemsnipped $row,$col fullText]) ||
    +            ($row <  0 && [$tbl istitlesnipped $col fullText])} {
    +            DynamicHelp::add $tbl -text $fullText
    +        }
    +    } else {
    +        set row [string range $row 1 end]
    +        if {[$tbl header iselemsnipped $row,$col fullText]} {
    +            DynamicHelp::add $tbl -text $fullText
    +        }
    +    }
    +}
    +
    +
    +

    A tablelist widget can use this procedure by specifying

    @@ -3885,6 +4304,29 @@

    Detailed Reference

    +

    or, to cover also the case of header items:

    + +
    +
    +proc tooltipAddCmd {tbl row col} {
    +    if {[string is integer $row]} {
    +        if {($row >= 0 && [$tbl iselemsnipped $row,$col fullText]) ||
    +            ($row <  0 && [$tbl istitlesnipped $col fullText])} {
    +            tooltip::tooltip $tbl $fullText
    +        }
    +    } else {
    +        set row [string range $row 1 end]
    +        if {[$tbl header iselemsnipped $row,$col fullText]} {
    +            tooltip::tooltip $tbl $fullText
    +        }
    +    }
    +}
    +
    +
    +

    and can be used by specifying

    @@ -3907,10 +4349,12 @@

    Detailed Reference

    Both examples above make use of the iselemsnipped and istitlesnipped subcommands, to make - sure that the full cell and label texts will only be displayed for - those cells and header labels whose contents are snipped.

    + "#iselemsnipped">iselemsnipped
    header iselemsnipped,  and + istitlesnipped + subcommands, to make sure that the full cell and label texts will only + be displayed for those cells and header labels whose contents are + snipped.

    @@ -3939,8 +4383,8 @@

    Detailed Reference

    Specifies a Tcl command to be used for removing the cell- or column label-specific balloon help.  When the mouse pointer leaves a cell or a header label, the command specified by this option is - automatically concatenated with the name of the tablelist widget and - the resulting script is evaluated in the global scope.  This + automatically concatenated with the path name of the tablelist widget + and the resulting script is evaluated in the global scope.  This action is only triggered if both the value of this option and that of -tooltipaddcommand are nonempty strings.  Common values for this option are @@ -3974,9 +4418,9 @@

    Detailed Reference

    Specifies the column to contain the indentations and expand/collapse - controls for a tablelist used as a tree widget.  The option's - value may be a column index in any of the forms described in the - COLUMN INDICES section below.  The + controls in the body of a tablelist used as a tree widget.  The + option's value may be a column index in any of the forms described in + the COLUMN INDICES section below.  The specified column index is replaced with its numerical equivalent, and it will be updated automatically whenever columns are inserted, deleted, or moved.  The default value is 0.

    @@ -4015,14 +4459,14 @@

    Detailed Reference

    Specifies the look & feel of the column containing the - indentations and expand/collapse controls for a tablelist used as a - tree widget.  This includes, among others, the images used for - displaying the expand/collapse controls, the indentation width, and - whether expand/collapse controls and indentations are to be protected - when selecting a row or cell.  The currently supported values are - shown at a glance in the two tables below:

    + indentations and expand/collapse controls in the body of a a tablelist + used as a tree widget.  This includes, among others, the images + used for displaying the expand/collapse controls, the indentation + width, and whether expand/collapse controls and indentations are to be + protected when selecting a row or cell.  The currently supported + values are shown at a glance in the two tables below:

    -

    Tree styles for native look & feel:

    +

    Tree styles for native look & feel:

    @@ -4354,7 +4798,7 @@

    Detailed Reference

    If the tree style is gtk, - adwaita, blueMenta, + adwaita, blueMenta, ubuntu, ubuntu2, ubuntu3, mint, mint2, mate, @@ -4582,8 +5026,8 @@

    Detailed Reference

    menta - Inspired by the GTK 3 theme Menta of versions 1.14 and later - of the MATE desktop. + Inspired by the GTK 3 theme Menta of versions 1.14 and later of + the MATE desktop. @@ -4735,7 +5179,7 @@

    Detailed Reference

    "51"> Inspired by a couple of GTK 3 themes bundled with versions - 15.04 – 16.04 of the Ubuntu Linux distribution. + 15.04 – 16.04 of the Ubuntu Linux distribution. @@ -5050,10 +5494,10 @@

    Detailed Reference

    -align alignment
    -
    Specifies how to align the elements of the column.  It must be - one of left, right, or - center.  This option also refers to the - column's title if the Specifies how to align the body and header elements of the + column.  It must be one of left, + right, or center.  This + option also refers to the column's title if the -labelalign option hasn't been specified for the given column, or if its value is an empty string.  The -align option is tied to the @@ -5066,20 +5510,20 @@

    Detailed Reference

    color
    or -bg color
    Specifies the normal background color to use when displaying the - contents of the column.
    + content of the column in both the body and the header.
    -changesnipside boolean
    Specifies whether to override the alignment-specific default position of the snip indicator when - displaying the elements of the column (excluding its title).  The - default value is 0, meaning that the snip string will be - appended to the elements if the column's alignment is - left or center and prepended to - them in case the alignment is right.
    + displaying the body and header elements of the column (excluding its + title).  The default value is 0, meaning that the + snip string will be appended to the elements if the column's alignment + is left or center and prepended + to them in case the alignment is right. -
    +
    -changetitlesnipside boolean
    Specifies whether to override the alignment-specific default @@ -5093,23 +5537,26 @@

    Detailed Reference

    -editable boolean
    -
    Specifies whether the elements of the column can be edited - interactively.  The default value is 0.  The - value of this option can be overridden for individual cells by using - the cell configuration option of the same - name.
    +
    Specifies whether the elements of the column in the tablelist's + body can be edited interactively.  The default value is + 0.  The value of this option can be overridden for + individual cells by using the cell + configuration option of the same name.
    + +
    REMARK:  The support for interactive editing + is restricted to the widget's body component
    -editwindow name
    Specifies the type of the temporary embedded widget to be used for - interactive editing of the contents of the given column's cells.  - name may be one of entry (which - is the default), text, spinbox - (the latter for Tk versions 8.4 or higher), - checkbutton, menubutton, - ttk::entry, ttk::spinbox, - ttk::combobox, + interactive editing of the contents of the given column's body + cells.  name may be one of + entry (which is the default), + text, spinbox (the latter for + Tk versions 8.4 or higher), checkbutton, + menubutton, ttk::entry, + ttk::spinbox, ttk::combobox, ttk::checkbutton, or ttk::menubutton (the latter five only in the presence of the tile widget engine), or the value returned by one of @@ -5134,25 +5581,25 @@

    Detailed Reference

    -font font
    -
    Specifies the font to use when displaying the contents of the - column.
    +
    Specifies the font to use when displaying the content of the column + in both the body and the header.
    -foreground color or -fg color
    Specifies the normal foreground color to use when displaying the - contents of the column.
    + content of the column in both the body and the header.
    -formatcommand command
    Specifies a Tcl command to be invoked when displaying the content - of a cell within this column or adding it to the selection when the - latter is being exported.  If command is a - nonempty string, then it is automatically concatenated with the cell's - text, the resulting script is evaluated in the global scope, and the - return value is displayed in the cell or added to the selection instead - of the original data.
    + of a body or header cell within this column or adding a body cell's + content to the selection when the latter is being exported.  If + command is a nonempty string then it is + automatically concatenated with the cell's text, the resulting script + is evaluated in the global scope, and the return value is displayed in + the cell or added to the selection instead of the original data.
    For example, if a time value in seconds is being inserted into the cell and command is the procedure @@ -5176,15 +5623,17 @@

    Detailed Reference

    "#getformatted">getformatted
    , getformattedcolumns, and getformattedcells - subcommands, or searching for a text pattern passed to the - searchcolumn subcommand - with the -formatted option.  All the other - subcommands, notably get, - getcolumns, - getcells, rowcget, columncget, cellcget, searchcolumn subcommand with the + -formatted option.  All the other subcommands, + notably get, getcolumns, getcells, rowcget, along with their counterparts for + the header, columncget, + cellcget, along with the + latter's header-related counterpart, sort, sortbycolumn, sortbycolumnlist, and @@ -5211,29 +5660,28 @@

    Detailed Reference

    -
    Another important use case is related to tablelist - columns whose -sortmode - option was set to integer or - real.  If some of the cells of such a column - are empty then an attempt to sort the items by that column via - sortbycolumn or - sortbycolumnlist - would generate an error, because the  - lsort -integer  or  - lsort -real  invocation made by Tablelist - would complain about getting an unexpected empty string instead of an - integer or floating-point number.  To avoid this, make sure that - the cells intended to display an empty string have as internal value a - number that is either strictly less or strictly greater than all the - other integer or real numbers contained in the column in question, and - use the -formatcommand option to control what will - be displayed in the column's cells.  For example, if all the - elements of the column are non-negative values then you can use the - number -1 as internal value for the cells that should - display an empty string, and set the value of the +
    Another important use case is related to tablelist columns whose + -sortmode option was + set to integer or real.  + If some of the cells of such a column are empty then an attempt to sort + the items by that column via sortbycolumn or sortbycolumnlist would generate an + error, because the  lsort -integer  + or  lsort -real  invocation made by + Tablelist would complain about getting an unexpected empty string + instead of an integer or floating-point number.  To avoid this, + make sure that the cells intended to display an empty string have as + internal value a number that is either strictly less or strictly + greater than all the other integer or real numbers contained in the + column in question, and use the -formatcommand + option to control what will be displayed in the column's cells.  + For example, if all the elements of the column are non-negative values + then you can use the number -1 as internal value for the + cells that should display an empty string, and set the value of the -formatcommand option to formatNumber, where formatNumber is the procedure implemented as - follows: + follows:
    @@ -5243,12 +5691,12 @@

    Detailed Reference

    -
    This will make the cells displaying an empty string - appear before all the others when sorting the column in increasing - order.  To achieve the opposite effect, you will have to replace - the -1 with an application-specific value that is strictly +
    This will make the cells displaying an empty string appear before + all the others when sorting the column in increasing order.  To + achieve the opposite effect, you will have to replace the + -1 with an application-specific value that is strictly greater than all the other numbers contained in the column in - question. + question.
    The demo scripts included in the Tablelist distribution contain further examples demonstrating the use of this option.  @@ -5279,7 +5727,7 @@

    Detailed Reference

    0.  After toggling the hidden state of a column, the <<TablelistColHiddenStateChanged>> virtual event is generated, with its -data option - set to the numerical column index for Tk versions 8.5 or higher.
    + set to the numerical column index for Tk versions 8.5 and higher.
    -labelalign alignment
    @@ -5360,18 +5808,20 @@

    Detailed Reference

    moving columns, its name remains constant and can be used as a safe alternative column index (see the COLUMN INDICES section for details).  Similarly, it can also be used - as the second component of a cell index of the form - row,col, as described in the CELL INDICES section.  To avoid ambiguities, - column names should be different from any other forms of column indices - (like numbers, active, anchor, - end, last, - left, right, or any of their - abbreviations).  They should also be different from (any - abbreviations of) the string all, which may be - specified as the value of the -stretch configuration option.  The - default value is an empty string. + as the second component of a body cell index of the form + row,col or a header cell index of the + form headerRow,col, as described in + the CELL INDICES and HEADER CELL INDICES sections.  To avoid + ambiguities, column names should be different from any other forms of + column indices (like numbers, active, + anchor, end, + last, left, + right, or any of their abbreviations).  They + should also be different from (any abbreviations of) the string + all, which may be specified as the value of the + -stretch configuration + option.  The default value is an empty string.
    -resizable boolean
    @@ -5387,14 +5837,14 @@

    Detailed Reference

    -selectbackground color
    -
    Specifies the background color to use when displaying the contents - of a cell in the given column while the cell is selected.
    +
    Specifies the background color to use when displaying the content + of a body cell in the given column while the cell is selected.
    -selectforeground color
    -
    Specifies the foreground color to use when displaying the contents - of a cell in the given column while the cell is selected.
    +
    Specifies the foreground color to use when displaying the content + of a body cell in the given column while the cell is selected.
    -showarrow boolean
    @@ -5413,24 +5863,24 @@

    Detailed Reference

    -showlinenumbers boolean
    -
    Specifies whether the given column should display the line numbers - (starting with 1 and ending with the number of the non-hidden - rows).  The default value is 0.
    +
    Specifies whether the body part of the given column should display + the line numbers (starting with 1 and ending with the number of the + non-hidden rows).  The default value is 0.
    The following details assume that the given column's -showlinenumbers option was set to true:  Associating the line numbers with the non-hidden rows takes place - automatically whenever items are inserted, deleted, updated, moved, or - sorted, or their -hide - option is toggled.  For increased efficiency, this is done at idle - time.  For example, if several items are inserted into or deleted - from the tablelist widget, then the necessary renumbering of the - non-hidden rows will be performed as an idle callback, the next time - the event loop is entered and there are no events to process.  The - line numbers will override any previous contents of the column's - cells.  They are, per default, displayed without leading zeros, - but this (and the display format in general) can be changed with the - aid of the -hide option is toggled.  For increased + efficiency, this is done at idle time.  For example, if several + items are inserted into or deleted from the body of a tablelist widget, + then the necessary renumbering of the non-hidden rows will be performed + as an idle callback, the next time the event loop is entered and there + are no events to process.  The line numbers will override any + previous contents of the column's cells.  They are, per default, + displayed without leading zeros, but this (and the display format in + general) can be changed with the aid of the -formatcommand column configuration option.
    @@ -5557,33 +6007,34 @@

    Detailed Reference

    -stripebackground color
    -
    Specifies the background color to use when displaying the contents - of a cell in the given column if the cell's row belongs to a +
    Specifies the background color to use when displaying the content + of a body cell in the given column if the cell's row belongs to a stripe.
    -stripeforeground color
    -
    Specifies the foreground color to use when displaying the contents - of a cell in the given column if the cell's row belongs to a +
    Specifies the foreground color to use when displaying the content + of a body cell in the given column if the cell's row belongs to a stripe.
    -text list
    -
    Specifies a list of strings to be displayed in the cells of the - given column, i.e., updates the elements contained in the column.  - If the tablelist's state is - disabled then this option will be ignored.
    +
    Specifies a list of strings to be displayed in the body cells of + the given column, i.e., updates the elements contained in the column's + body part.  If the tablelist's state is disabled then this + option will be ignored.
    -title title
    -
    Specifies the text to be displayed in the column's header.  - This option is tied to the title element - corresponding to the given column in the list specifying the value of - the -columns option for the - tablelist widget; changes in either will automatically be reflected in - the other.
    +
    Specifies the text to be displayed in the column's header + label.  This option is tied to the title + element corresponding to the given column in the list specifying the + value of the -columns option + for the tablelist widget; changes in either will automatically be + reflected in the other.
    -valign verticalAlignment
    @@ -5620,20 +6071,20 @@

    Detailed Reference

    -wrap boolean
    -
    Specifies whether to display those elements of the given column - that don't fit into their cells in word-wrapped multi-line rather than - snipped form.  The default value is 0.  If the - specified column has static width or a nonzero -maxwidth value and the value of this - option is true, then elements of the column that are too long to be - displayed in a single line will be broken up into several lines.  - The same applies to the individual lines of the multi-line elements - (i.e., elements containing newline characters): they will also be - wrapped if necessary, thus giving rise to additional line breaks.  - In both cases, the line breaks are chosen at word boundaries wherever - possible, and they are only used for the external representation of the - strings contained in the given column, without affecting the internal - contents of the cells.
    +
    Specifies whether to display those body and header elements of the + given column that don't fit into their cells in word-wrapped multi-line + rather than snipped form.  The default value is + 0.  If the specified column has static width or a + nonzero -maxwidth value + and the value of this option is true, then elements of the column that + are too long to be displayed in a single line will be broken up into + several lines.  The same applies to the individual lines of the + multi-line elements (i.e., elements containing newline characters): + they will also be wrapped if necessary, thus giving rise to additional + line breaks.  In both cases, the line breaks are chosen at word + boundaries wherever possible, and they are only used for the external + representation of the strings contained in the given column, without + affecting the internal contents of the cells.
    @@ -5648,7 +6099,8 @@

    Detailed Reference

    the COLORS AND FONTS section for further details on these options. -
    ROW CONFIGURATION OPTIONS
    +
    ROW CONFIGURATION OPTIONS IN THE + TABLELIST BODY
    The following options are currently supported by the rowcget, Detailed Reference color or -bg color
    Specifies the normal background color to use when displaying the - contents of the row.
    + content of the row.
    -font font
    -
    Specifies the font to use when displaying the contents of the +
    Specifies the font to use when displaying the content of the row.
    -foreground color or -fg color
    Specifies the normal foreground color to use when displaying the - contents of the row.
    + content of the row.
    -hide boolean
    @@ -5683,7 +6135,7 @@

    Detailed Reference

    0.  After toggling the hidden state of a row, the <<TablelistRowHiddenStateChanged>> virtual event is generated, with its -data option - set to the numerical row index for Tk versions 8.5 or higher. + set to the numerical row index for Tk versions 8.5 and higher.
    For technical reasons (the use of the -elide option for a text widget tag), this option @@ -5730,13 +6182,13 @@

    Detailed Reference

    -selectbackground color
    -
    Specifies the background color to use when displaying the contents +
    Specifies the background color to use when displaying the content of a cell in the given row while the cell is selected.
    -selectforeground color
    -
    Specifies the foreground color to use when displaying the contents +
    Specifies the foreground color to use when displaying the content of a cell in the given row while the cell is selected.
    -text list
    @@ -5757,51 +6209,118 @@

    Detailed Reference

    string.  See the
    COLORS AND FONTS section for further details on these options. -
    CELL CONFIGURATION OPTIONS
    +
    ROW CONFIGURATION OPTIONS IN THE + TABLELIST HEADER
    -
    The following options are currently supported by the cellcget, cellconfigure, configcelllist, and configcells commands:
    +
    The following options are currently supported by the  + header rowcget,  + header + rowconfigureheader configrowlist,  and  + header configrows  + commands:
    -
    -background +
    -background color or -bg color
    -
    Specifies the normal background color to use when displaying the - contents of the cell.
    +
    Specifies the background color to use when displaying the content + of the header row.
    -
    -editable - boolean
    +
    -font + font
    -
    Specifies whether the contents of the cell can be edited - interactively.  The default value is 0.  This - option overrides the one of the same name - for the column containing the given cell.
    +
    Specifies the font to use when displaying the content of the header + row.
    -
    -editwindow - name
    +
    -foreground + color or -fg color
    -
    Specifies the type of the temporary embedded widget to be used for - interactive editing of the cell's contents.  The default value is - entry.  This option overrides the one of the same name for the column - containing the given cell, and may have the same values as its - column-related counterpart.
    +
    Specifies the foreground color to use when displaying the content + of the header row.
    -
    -font - font
    +
    -name + name
    -
    Specifies the font to use when displaying the contents of the +
    Specifies a name associated with the header row.  While the + numerical index of a header row might change by inserting or deleting + header rows, its name remains constant and can be used as a safe + alternative header row index (see the HEADER + ROW INDICES section for details).  Similarly, it can also be + used as the first component of a header cell index of the form + headerRow,col, as described in the + HEADER CELL INDICES section.  To + avoid ambiguities, header row names should be different from any other + forms of header row indices (like numbers, full keys, + end, last, or any of their + abbreviations).  The default value is an empty string.
    + +
    -text + list
    + +
    Specifies a list of strings to be displayed in the cells of the + given header row, i.e., updates the item contained in the header + row.  If the tablelist's state is disabled then this + option will be ignored.
    +
    +
    + +
    The -background, + -font, and -foreground header row + configuration options override the options of the same names set at column + or widget level (but not the ones set at header cell level) if the + specified value is not an empty string.  See the COLORS AND FONTS section for further details on + these options.
    + +
    CELL CONFIGURATION OPTIONS IN THE + TABLELIST BODY
    + +
    The following options are currently supported by the cellcget, cellconfigure, configcelllist, and configcells commands:
    + +
    +
    +
    -background + color or -bg color
    + +
    Specifies the normal background color to use when displaying the + content of the cell.
    + +
    -editable + boolean
    + +
    Specifies whether the content of the cell can be edited + interactively.  The default value is 0.  This + option overrides the one of the same name + for the column containing the given cell.
    + +
    -editwindow + name
    + +
    Specifies the type of the temporary embedded widget to be used for + interactive editing of the cell's content.  The default value is + entry.  This option overrides the one of the same name for the column + containing the given cell, and may have the same values as its + column-related counterpart.
    + +
    -font + font
    + +
    Specifies the font to use when displaying the content of the cell.
    -foreground color or -fg color
    Specifies the normal foreground color to use when displaying the - contents of the cell.
    + content of the cell.
    -image image
    @@ -5834,13 +6353,13 @@

    Detailed Reference

    -selectbackground color
    -
    Specifies the background color to use when displaying the contents +
    Specifies the background color to use when displaying the content of the cell while it is selected.
    -selectforeground color
    -
    Specifies the foreground color to use when displaying the contents +
    Specifies the foreground color to use when displaying the content of the cell while it is selected.
    -stretchwindow @@ -5886,10 +6405,10 @@

    Detailed Reference

    command
    Specifies a Tcl command creating the window to be embedded into the - cell.  The command is automatically concatenated with the name of - the tablelist widget, the cell's row and column indices, as well as the - path name of the embedded window to be created, and the resulting - script is evaluated in the global scope.  + cell.  The command is automatically concatenated with the path + name of the tablelist widget, the cell's row and column indices, as + well as the path name of the embedded window to be created, and the + resulting script is evaluated in the global scope.  command may also be an empty string, specifying that no embedded window is to be displayed.  If the column containing the cell is right-aligned then the window will be displayed @@ -5905,7 +6424,7 @@

    Detailed Reference

    the embedded window will be destroyed and later recreated by invoking the script mentioned above.  For example, when changing the value of some of the tablelist widget or column configuration options, - sorting the items, or moving a row or a column, the widget's contents + sorting the items, or moving a row or a column, the widget's content will be redisplayed, which makes it necessary to recreate the embedded windows.  This operation won't preserve the changes made on the embedded windows after their creation.  For this reason, you @@ -5917,7 +6436,7 @@

    Detailed Reference

    Specifies a Tcl command to be invoked when a window embedded into the cell is destroyed.  The command is automatically concatenated - with the name of the tablelist widget, the cell's row and column + with the path name of the tablelist widget, the cell's row and column indices, as well as the path name of the embedded window, and the resulting script is evaluated in the global scope.  This option provides an easy-to-use alternative to binding a script to the embedded @@ -5938,10 +6457,10 @@

    Detailed Reference

    "#stripebackground">-stripebackground
    and -stripeforeground widget or column configuration options.  The command is - automatically concatenated with the name of the tablelist widget, the - cell's row and column indices, the path name of the embedded window, - the option name -background and the cell's current - background color, as well as the option name + automatically concatenated with the path name of the tablelist widget, + the cell's row and column indices, the path name of the embedded + window, the option name -background and the cell's + current background color, as well as the option name -foreground and the cell's current foreground color.  The resulting script is then evaluated in the global scope.  The specified command can use the colors passed to it as @@ -5998,87 +6517,106 @@

    Detailed Reference

    "#colors_and_fonts">COLORS AND FONTS section for further details on these options.
    -
    DESCRIPTION
    +
    CELL CONFIGURATION OPTIONS IN THE + TABLELIST HEADER
    -
    The tablelist::tablelist command creates a new - window named pathName and of the class - Tablelist, and makes it into a tablelist - widget.  Additional options, described above, may be specified on the - command line or in the option database to configure aspects of the - tablelist such as its colors, font, and columns.  The - tablelist::tablelist command returns its - pathName argument.  At the time this command is - invoked, there must not exist a window named pathName, - but pathName's parent must exist.
    +
    The following options are currently supported by the  + header cellcget,  + header + cellconfigureheader configcelllist,  and  + header configcells  + commands:
    -
    A tablelist is a multi-column listbox and tree widget, - implemented as a mega-widget, consisting of a body and a - header.  The body displays a list of items, one per - line.  Each item is a list of elements, which are aligned in - columns.  In other words, an item is the contents of a row, and an - element is the text contained in a cell.  The header consists of label - widgets displaying the column titles.  The labels can be used, among - others, for interactive column resizing and column-based sorting of the - items, as described below.
    +
    +
    +
    -background + color or -bg color
    -
    Each cell and each header label of a tablelist widget can - also contain an image, which is placed to the left or right of the text, - depending on the column's alignment.  Instead of an image, a tablelist - cell can also contain an embedded window, placed to the left or right of - the text, just like an embedded image.
    +
    Specifies the normal background color to use when displaying the + content of the header cell.
    -
    When a tablelist is used as a tree widget, one of its - columns will display the tree hierarchy with the aid of indentations and - expand/collapse controls.  The Tablelist package provides a great - variety of tree styles controlling the look & feel of that column, and - chooses the correct default style depending on the windowing system, - operating system version, and tile theme.  In a tablelist used as a - multi-column tree widget, every row is at the same time a tree node, - having exactly one parent node and any number of child - nodes.  The tree's origin is the invisible root node, which has - no parent itself and whose children are the top-level nodes.
    +
    -font + font
    -
    The elements of a tablelist widget can, per default, be only - edited programmatically.  However, interactive editing can be enabled - for individual cells and for entire columns.  Per default, the - interactive cell editing uses a temporary embedded entry widget, thus - making sure that all the validation facilities available for entry widgets - can be used during the editing process.  A great variety of widgets - from the packages BWidget, Iwidgets, combobox (by Bryan Oakley), ctext, and - Mentry (or Mentry_tile), as well as Tk core text, spinbox, checkbutton, and - menubutton widgets, along with tile entry, spinbox, combobox, checkbutton, - and menubutton widgets are also supported as temporary embedded widgets - used for cell editing.  In addition, a rich set of keyboard bindings - is provided for a comfortable navigation between the editable cells.
    +
    Specifies the font to use when displaying the content of the header + cell.
    -
    When first created, a new tablelist widget has no - items.  Items may be added, deleted, or updated using widget commands - described below.  In addition, one or more items or elements may be - selected.  If a tablelist widget is exporting its selection (see the - -exportselection option), then it will observe the - standard X11 protocols for handling the selection.  Tablelist widget - selections are available as types STRING and - UTF8_STRING; the value of the selection will be a text - built by taking all of the rows having at least one viewable selected element, joining these elements - together with tabs, and the resulting strings in turn with newlines.  - If a tablelist widget that is exporting its selection is the selection - owner and some other window claims ownership of the selection away from it, - then the virtual event - <<TablelistSelectionLost>> is - generated.
    +
    -foreground + color or -fg color
    -
    It is not necessary for all the elements to be displayed in - the tablelist widget at once; commands described below may be used to - change the view in the window.  Tablelist widgets allow scrolling in - both directions using the standard -xscrollcommand and - -yscrollcommand options.  They also support - scanning, as described below.
    +
    Specifies the foreground color to use when displaying the content + of the header cell.
    -
    Each tablelist widget, as well as each tablelist column, - row, and cell may have any number of attributes, which can be used - in commands that create or manipulate tablelist widgets for particular - purposes.
    +
    -image + image
    + +
    Specifies the name of the Tk image to be displayed in the header + cell.  The details are the same as for a + cell in the tablelist body.
    + +
    -stretchwindow + boolean
    + +
    Specifies whether the width of the window embedded into the header + cell shall be adapted dynamically to the width of the cell's column if + the latter is non-zero (i.e., static).  The details are the same + as for a cell in the tablelist + body.
    + +
    -text + text
    + +
    Specifies the string to be displayed in the given header cell, + i.e., updates the element contained in the cell.  If the + tablelist's state is + disabled then this option will be ignored.
    + +
    -valign + verticalAlignment
    + +
    Specifies the vertical alignment of the embedded image or window + displayed in the header cell (if any).  The default value is + center.  This option overrides the one of the same name for the column containing + the given cell, and may have the same values as its column-related + counterpart.
    + +
    -window + command
    + +
    Specifies a Tcl command creating the window to be embedded into the + header cell.  The details are similar to those for a cell in the tablelist body.
    + +
    -windowdestroy + command
    + +
    Specifies a Tcl command to be invoked when a window embedded into + the header cell is destroyed.  The details are the same as + for a cell in the tablelist + body.
    + +
    -windowupdate + command
    + +
    Specifies a Tcl command responsible for adapting the background and + foreground colors of a window embedded into the header cell to the + current background and foreground colors of the cell itself.  The + current header cell colors depend on whether the tablelist widget's + state is + normal or disabled.  The + other details are the same as for a cell + in the tablelist body.
    +
    +
    + +
    The -background, + -font, and -foreground header cell + configuration options override the options of the same names set at header + row, column, or widget level if the specified value is not an empty + string.  See the COLORS AND FONTS + section for further details on these options.
    COLORS AND FONTS
    @@ -6095,7 +6633,18 @@

    Detailed Reference

    "#cellconfigure">cellconfigure
    (or configcelllist, or configcells) subcommands of the Tcl command - associated with the tablelist widget.  Likewise, the + associated with the tablelist widget.  Similarly, the first three of + these options can also be specified for the widget's header at row and cell + level, with the aid of the  header rowconfigure  (or  + header + configrowlist , or  header configrows)  and  + header + cellconfigure  (or  header configcelllist, or  + header + configcells)  subcommands.  Likewise, the -stripebackground and -stripeforeground options can also be specified at column level.  For this reason, a particular cell can have up to four @@ -6132,22 +6681,22 @@

    Detailed Reference

    "#insertchildlist">insertchildlist
    subcommand rather than insert or insertlist for inserting - new items into the widget. + new items into the widget's body.
    INTERACTIVE CELL EDITING
    -
    Whether or not the contents of a cell of a tablelist widget can be - edited interactively, depends on the -editable option - on both cell and Whether or not the content of a cell of a tablelist widget's body can + be edited interactively, depends on the -editable + option at both cell and column level.  If the cell-level option was set explicitly then its value determines the editability of the cell's - contents.  Otherwise the value of the column-level option is used to + content.  Otherwise the value of the column-level option is used to decide whether the cell can be edited interactively.  From this rule it follows that you can enable interactive cell editing for a whole column by setting its -editable option to true.  To - exclude some of the column's cells from interactive editing, set their + exclude some of the column's cells from interactive editing, just set their -editable option to false.
    The interactive cell editing is started by the @@ -6180,7 +6729,7 @@

    Detailed Reference

    In the simplest case, the text automatically inserted into the temporary embedded widget is the same as the text displayed in the - cell, which in turn can be the cell's contents or the string obtained from + cell, which in turn can be the cell's content or the string obtained from the latter by using the -formatcommand option of the cell's column.  However, if the value of the Detailed Reference command as its last argument (following the tablelist's path name as well as the cell's row and column indices), the resulting script is evaluated in the global scope, and the return value becomes the edit window's - contents.  From within this script you can invoke the - cancelediting subcommand, - which destroys the temporary embedded widget and cancels the editing of its - contents.  The main goal of this script is, however, to enable you to - define validations for the editing process.  This can be done either - with the aid of the options for entry validation, supported by Tk versions - 8.3 and higher (see the entry reference page), or by using the - widget callback package Wcb, available - for Tk versions 8.0 and higher.  The Iwidgets package (available for - Tk versions 8.0 or higher) provides its own validation facilities, which - can equally be used if the edit window is a widget belonging to that + content.  From within this script you can invoke the cancelediting subcommand, which destroys + the temporary embedded widget and cancels the editing of its content.  + The main goal of this script is, however, to enable you to define + validations for the editing process.  This can be done either with the + aid of the options for entry validation, supported by Tk versions 8.3 and + higher (see the entry reference page), or by using the widget + callback package Wcb, available for Tk + versions 8.0 and higher.  The Iwidgets package (available for Tk + versions 8.0 or higher) provides its own validation facilities, which can + equally be used if the edit window is a widget belonging to that extension.  In either case, you will need the path name of the temporary embedded widget or that of its entry or entry-like component; use the editwinpath and @@ -6254,7 +6803,7 @@

    Detailed Reference

    When normal termination of the editing process occurs, the Tcl command associated with the tablelist widget compares the edit window's - final contents to its original one.  If they are equal then the + final content with its original one.  If they are equal then the embedded widget is destroyed and the cell's original value is restored.  If the two strings are different and the value of the -editendcommand @@ -6262,16 +6811,16 @@

    Detailed Reference

    text is passed to that command as its last argument (following the tablelist's path name as well as the cell's row and column indices), the resulting script is evaluated in the global scope, and the return value - becomes the cell's new internal contents after destroying the temporary + becomes the cell's new internal content after destroying the temporary embedded widget.  The main goal of this script is to enable you to do - a final validation of the edit window's contents.  From within this + a final validation of the edit window's content.  From within this script you can invoke the rejectinput subcommand, which prevents the - script's return value from becoming the cell's new contents; this - subcommand also prevents the destruction of the temporary embedded - widget.  Another purpose of the command indicated by the + script's return value from becoming the cell's new content; this subcommand + also prevents the destruction of the temporary embedded widget.  + Another purpose of the command indicated by the -editendcommand option is to convert the edit window's - text to the cell's new internal contents, which is necessary if, due + text to the cell's new internal content, which is necessary if, due to the -formatcommand column configuration option, the cell's internal value is different from its external representation.  See the description of the @@ -6366,7 +6915,7 @@

    Detailed Reference

    -
    +
    BWidget EXAMPLE:  For an introduction to drag & drop with BWidget see the online tutorial BWidget example: Drag and Drop Demo by @@ -6390,11 +6939,14 @@

    Detailed Reference

    proc tblDropOverCmd {dropTarget dragSrc event rootX rootY op dataType data} { # $event may be "enter", "motion", or "leave" - set tbl [tablelist::getTablelistPath $dropTarget] + set tbl [tablelist::getTablelistPath $dropTarget] if {[string equal $event "leave"]} { set newWidget [winfo containing -displayof $dropTarget $rootX $rootY] - if {![string equal $newWidget [$tbl targetmarkpath]] && - ![string equal $newWidget [$tbl bodypath]]} { + if {![string equal $newWidget [$tbl targetmarkpath]] && + ![string equal $newWidget [$tbl bodypath]]} { $tbl hidetargetmark return 2 ;# refuse the drop and re-invoke the callback on motion events } @@ -6416,7 +6968,8 @@

    Detailed Reference

    } proc tblDropCmd {dropTarget dragSrc rootX rootY op dataType data} { - set tbl [tablelist::getTablelistPath $dropTarget] + set tbl [tablelist::getTablelistPath $dropTarget] handleTblDrop $tbl $data return 1 ;# accept the drop } @@ -6424,7 +6977,7 @@

    Detailed Reference

    -
    +
    In both examples above, you can restrict the type of the supported drop target indicator by appending the argument -horizontal or -vertical to the @@ -6455,13 +7008,16 @@

    Detailed Reference

    # Insert a sibling of the item indicated by $row, built from $data # (For a flat tablelist replace the following 2 lines with # "set key [$tbl insert $row ...]") - set key [$tbl insertchild [$tbl parentkey $row] \ + set key [$tbl insertchild [$tbl parentkey $row] \ [$tbl childindex $row] ...] } else { # Append a top-level item built from $data # (For a flat tablelist replace the following line with # "set key [$tbl insert end ...]") - set key [$tbl insertchild root end ...] + set key [$tbl insertchild root end ...] } } else { ;# "inside" # Insert a child of the item indicated by $row, built from $data @@ -6476,7 +7032,7 @@

    Detailed Reference

    -
    VIRTUAL EVENTS
    +
    VIRTUAL EVENTS
    Tablelist defines a few virtual events for the purposes of notification, and makes use of the  event @@ -6656,7 +7212,7 @@

    Detailed Reference

    Many of the widget commands for tablelist widgets take one or more row indices as arguments.  A row index specifies a particular item of the - tablelist, in any of the following ways:
    + tablelist's body component, in any of the following ways:
    @@ -6664,13 +7220,13 @@

    Detailed Reference

    + corresponds to the first item in the tablelist's body. - - + - - + elements in the tablelist's body. @@ -8947,7 +9749,7 @@

    Detailed Reference

    matching elements.  If an element of the specified column matches the given pattern and command is a nonempty string, then the latter is automatically concatenated with the - name of the tablelist widget, the element's row index, the + path name of the tablelist widget, the element's row index, the numerical equivalent of columnIndex, as well as the element itself or its formatted version (depending on the presence @@ -9060,7 +9862,7 @@

    Detailed Reference

    with the -descend option) of a row whose children have not been inserted yet, the command specified as the value of the -populatecommand - option (if any) is automatically concatenated with the name of the + option (if any) is automatically concatenated with the path name of the tablelist widget and the row index, and the resulting script is evaluated in the global scope.  This enables you to insert the children on demand, just before searching them for the specified @@ -9069,7 +9871,7 @@

    Detailed Reference

    pathName see index
    -
    Adjusts the view in the tablelist so that the item given by +
    Adjusts the view in the tablelist body so that the item given by index is visible.  If the item is already visible then the command has no effect; if the item is near one edge of the window then the tablelist scrolls to bring the item into view at @@ -9078,7 +9880,7 @@

    Detailed Reference

    pathName seecell cellIndex
    -
    Adjusts the view in the tablelist so that the cell given by +
    Adjusts the view in the tablelist body so that the cell given by cellIndex is visible.  If the cell is already visible then the command has no effect; if the cell is near one edge of the window then the tablelist scrolls to bring the cell into view at @@ -9107,13 +9909,13 @@

    Detailed Reference

    pathName selection option args
    -
    This command is used to adjust the selection within a tablelist - widget.  It has several forms, depending on +
    This command is used to adjust the selection within the body of a + tablelist widget.  It has several forms, depending on option:
    -
    pathName selection anchor +
    pathName selection anchor index
    Sets the selection anchor to the item given by @@ -9125,34 +9927,34 @@

    Detailed Reference

    row.  The index anchor may be used to refer to the anchor item.
    -
    pathName selection clear - first last
    - pathName selection clear +
    pathName selection clear + firstIndex lastIndex
    + pathName selection clear indexList
    -
    If any of the items between first and - last (inclusive) or corresponding to the +
    If any of the items between firstIndex and + lastIndex (inclusive) or corresponding to the indices specified by the list indexList contain at least one selected cell, they are deselected.  The selection state is not changed for items outside the range given in the first form of the command or different from those specified by the index list given in its second form.
    -
    pathName selection - includes index
    +
    pathName selection includes + index
    Returns 1 if the item indicated by index contains at least one selected cell, 0 if it doesn't.
    -
    pathName selection set - first last
    - pathName selection set +
    pathName selection set + firstIndex lastIndex
    + pathName selection set indexList
    Selects all of the selectable items in the range between - first and last, inclusive, - or corresponding to the indices specified by the list + firstIndex and lastIndex, + inclusive, or corresponding to the indices specified by the list indexList, without affecting the selection state of any other items.
    @@ -9214,13 +10016,13 @@

    Detailed Reference

    pathName size
    -
    Returns the total number of items in the tablelist widget.
    +
    Returns the total number of items in the tablelist body.
    pathName sort ?-increasing|-decreasing?
    -
    Sorts the items in increasing or decreasing order, as specified by - the optional argument.  The default is +
    Sorts the body items in increasing or decreasing order, as + specified by the optional argument.  The default is -increasing.  Uses the value of the -sortcommand widget configuration option as comparison command.  @@ -9240,7 +10042,7 @@

    Detailed Reference

    sortbycolumn columnIndex ?-increasing|-decreasing?
    -
    Sorts the items based on the elements of the column given by +
    Sorts the body items based on the elements of the column given by columnIndex, in increasing or decreasing order, as specified by the optional argument.  The default is -increasing.  The sorting process is @@ -9260,8 +10062,8 @@

    Detailed Reference

    side, with the exception of Windows Vista, 7, 8, and 10, where the arrow will be shown horizontally centered in the header label and attached to its top edge.  After sorting the items, the vertical - view is adjusted in the same way as in the case of the sort subcommand.
    + view is adjusted in the same way as in the case of the + sort subcommand.
    The actions described above are only performed if the specified column's Detailed Reference sortbycolumnlist columnIndexList ?sortOrderList? -
    Sorts the items based on the elements of the columns given by the - columnIndexList argument, which must be a list of - distinct column indices.  Only those elements of this list are +
    Sorts the body items based on the elements of the columns given by + the columnIndexList argument, which must be a list + of distinct column indices.  Only those elements of this list are considered significant that identify columns whose -showlinenumbers option hasn't been set to true.
    @@ -9410,10 +10212,11 @@

    Detailed Reference

    restrict the value of the first list element to before and inside, respectively.  If the option -vertical was - specified and no tablelist item contains the given y-position, then the - return value is the list  {inside -1}.  - The coordinate y is expected to be relative to the - tablelist window itself (not its body component). + specified and no item of the tablelist's body contains the given + y-position, then the return value is the list  + {inside -1}.  The coordinate + y is expected to be relative to the tablelist + window itself (not its body component).
    This command is designed to be used during a drag & drop operation for which the tablelist widget (or its body component) @@ -9436,30 +10239,30 @@

    Detailed Reference

    columns whose visibility is to be toggled.  Returns an empty string.  After toggling the hidden state of the specified columns, the <<TablelistColHiddenStateChanged>> - virtual event is generated.  For Tk versions 8.5 or higher, this + virtual event is generated.  For Tk versions 8.5 and higher, this virtual event is generated with its -data option set to a list consisting of the numerical column indices of the columns whose -hide option was toggled.  The main advantage of using this command instead of invoking columnconfigure for each of the specified columns is that it causes only one redisplay of the widget's - contents, thus being significantly faster.
    + content, thus being significantly faster.
    pathName - togglerowhide first last
    + togglerowhide firstIndex lastIndex

    pathName togglerowhide indexList
    Toggles the value of the -hide option for one or more rows of the - tablelist widget.  In the first form of the command, - first and last are indices - specifying the first and last rows in the range whose visibility is to - be toggled.  The command's second form accepts a list - indexList of indices specifying the rows whose + tablelist widget's body.  In the first form of the command, + firstIndex and lastIndex are + indices specifying the first and last rows in the range whose + visibility is to be toggled.  The command's second form accepts a + list indexList of indices specifying the rows whose visibility is to be toggled.  Returns an empty string.  After toggling the hidden state of the specified rows, the <<TablelistRowHiddenStateChanged>> - virtual event is generated.  For Tk versions 8.5 or higher, this + virtual event is generated.  For Tk versions 8.5 and higher, this virtual event is generated with its -data option set to a list consisting of the numerical row indices of the rows whose -hide option was toggled.  Just like the @@ -9507,14 +10310,16 @@

    Detailed Reference

    index.  Returns an empty string.
    pathName - viewablerowcount ?first last?
    + viewablerowcount ?firstIndex + lastIndex?
    Returns the number of viewable rows in - the index range given by first and - last.  If these optional indices are not - specified then first defaults to 0 and - last defaults to one less the total number of - items, i.e., the index range comprises all rows.
    + the index range given by firstIndex and + lastIndex.  If these optional indices are not + specified then firstIndex defaults to + 0 and lastIndex defaults to one less + the total number of body items, i.e., the index range comprises all + rows of the tablelist's body.
    pathName windowpath cellIndex
    @@ -9561,7 +10366,7 @@

    Detailed Reference

    window.  Character positions are defined by the width of the character 0. -
    pathName xview moveto +
    pathName xview moveto fraction
    Adjusts the view in the window so that @@ -9570,7 +10375,7 @@

    Detailed Reference

    fraction must be a fraction between 0 and 1.
    -
    pathName xview scroll +
    pathName xview scroll number what
    This command shifts the view in the window left or right @@ -9621,7 +10426,7 @@

    Detailed Reference

    equals units viewable rows is displayed at the top of the window.
    -
    pathName yview moveto +
    pathName yview moveto fraction
    Adjusts the view in the window so that the Detailed Reference the viewable item one-third the way through the tablelist, and so on.
    -
    pathName yview scroll +
    pathName yview scroll number what
    This command shifts the view in the window up or down according @@ -9653,6 +10458,406 @@

    Detailed Reference

    +
    HEADER-RELATED SUBCOMMANDS
    + +
    + The header tablelist command, used to invoke various + operations on the header items, has the following general form: + +
    +
    +pathName header option ?arg arg ...?
    +
    +
    +
    + +
    option and the args determine + the exact behavior of the command.  The following subcommands are + supported for the tablelist header:
    + +
    +
    +
    pathName header bbox + headerIndex
    + +
    Similar to the bbox command + for the tablelist body.
    + +
    pathName header + cellattrib headerCellIndex ?name? ?value + name value ...?
    + +
    Similar to the cellattrib command for the tablelist + body.
    + +
    pathName header + cellbbox headerCellIndex
    + +
    Similar to the cellbbox + command for the tablelist body.
    + +
    pathName header + cellcget headerCellIndex option
    + +
    Similar to the cellcget + command for the tablelist body.  option may + have any of the values accepted by the  header cellconfigure  + subcommand.
    + +
    pathName header + cellconfigure headerCellIndex ?option? value + option value ...?
    + +
    Similar to the cellconfigure command for the tablelist + body.  Each option may have any of the values + described in the CELL CONFIGURATION OPTIONS + IN THE TABLELIST HEADER section.
    + +
    pathName header + cellindex headerCellIndex
    + +
    Similar to the cellindex command for the tablelist + body.
    + +
    pathName header + configcelllist headerCellConfigSpecList
    + +
    + Similar to the configcelllist command for the + tablelist body.  The argument + headerCellConfigSpecList must be a list of the + form + +
    +
    +headerCellIndex option value headerCellIndex option value ...
    +
    +
    +
    + +
    where each option may have any of the values + described in the CELL CONFIGURATION OPTIONS + IN THE TABLELIST HEADER section.
    + +
    pathName header + configcells ?headerCellIndex option value + headerCellIndex option value ...?
    + +
    Similar to the configcells command for the tablelist + body.  Each option may have any of the values + described in the CELL CONFIGURATION OPTIONS + IN THE TABLELIST HEADER section.
    + +
    pathName header + configrowlist headerRowConfigSpecList
    + +
    + Similar to the configrowlist command for the + tablelist body.  The argument + headerRowConfigSpecList must be a list of the + form + +
    +
    +headerIndex option value headerIndex option value ...
    +
    +
    +
    + +
    where each option may have any of the values + described in the ROW CONFIGURATION OPTIONS + IN THE TABLELIST HEADER section.
    + +
    pathName header + configrows ?headerIndex option value + headerIndex option value ...?
    + +
    Similar to the configrows command for the tablelist + body.  Each option may have any of the values + described in the ROW CONFIGURATION OPTIONS + IN THE TABLELIST HEADER section.
    + +
    pathName header + containing y
    + +
    Similar to the containing command for the tablelist + body.
    + +
    pathName header + containingcell x y
    + +
    Similar to the containingcell command for the + tablelist body.
    + +
    pathName header + delete firstHeaderIndex lastHeaderIndex
    + pathName header delete + headerIndexList
    + +
    Similar to the delete + command for the tablelist body.
    + +
    pathName + header embedcheckbutton headerCellIndex + ?command?
    + +
    Similar to the embedcheckbutton command for the + tablelist body.
    + +
    pathName + header embedcheckbuttons columnIndex + ?command?
    + +
    Similar to the embedcheckbuttons command for the + tablelist body.  Logically equivalent to invoking  + header + embedcheckbutton  for all header cells of the + column specified by columnIndex.
    + +
    pathName + header embedttkcheckbutton headerCellIndex + ?command?
    + +
    Similar to the embedttkcheckbutton command for + the tablelist body.
    + +
    pathName + header embedttkcheckbuttons columnIndex + ?command?
    + +
    Similar to the embedttkcheckbutton command for + the tablelist body.  Logically equivalent to invoking  + header + embedttkcheckbutton  for all header cells of the + column specified by columnIndex.
    + +
    pathName header + fillcolumn columnIndex text
    + +
    Similar to the fillcolumn command for the tablelist + body.
    + +
    pathName header + findrowname name
    + +
    Similar to the findrowname command for the tablelist + body.  Returns the header row index of the first header item whose + name equals name.
    + +
    pathName header get + firstHeaderIndex lastHeaderIndex
    + pathName header get + headerIndexList
    + +
    Similar to the get command + for the tablelist body.
    + +
    pathName header + getcells firstHeaderCell lastHeaderCell
    + pathName header getcells + headerCellIndexList
    + +
    Similar to the getcells + command for the tablelist body.
    + +
    pathName header + getcolumns firstColumn lastColumn
    + pathName header getcolumns + columnIndexList
    + +
    Similar to the getcolumns command for the tablelist + body.
    + +
    pathName header + getformatted firstHeaderIndex + lastHeaderIndex
    + pathName header getformatted + headerIndexList
    + +
    Similar to the getformatted command for the tablelist + body.
    + +
    pathName + header getformattedcells firstHeaderCell + lastHeaderCell
    + pathName header getformattedcells + headerCellIndexList
    + +
    Similar to the getformattedcells command for the + tablelist body.
    + +
    pathName + header getformattedcolumns firstColumn + lastColumn
    + pathName header getformattedcolumns + columnIndexList
    + +
    Similar to the getformattedcolumns command for + the tablelist body.
    + +
    pathName header + getfullkeys firstHeaderIndex + lastHeaderIndex
    + pathName header getfullkeys + headerIndexList
    + +
    Similar to the getfullkeys command for the tablelist + body.  Remember that the full keys of the header items start with + hk.
    + +
    pathName header + getkeys firstHeaderIndex lastHeaderIndex
    + pathName header getkeys + headerIndexList
    + +
    Similar to the getkeys + command for the tablelist body.
    + +
    pathName header + hascellattrib headerCellIndex name
    + +
    Similar to the hascellattrib command for the tablelist + body.
    + +
    pathName header + hasrowattrib headerIndex name
    + +
    Similar to the hasrowattrib command for the tablelist + body.
    + +
    pathName header + imagelabelpath headerCellIndex
    + +
    Similar to the imagelabelpath command for the + tablelist body.
    + +
    pathName header index + headerIndex
    + +
    Similar to the index + command for the tablelist body.
    + +
    pathName header + insert headerIndex ?item item ...?
    + +
    Similar to the insert + command for the tablelist body.
    + +
    pathName header + insertlist headerIndex itemList
    + +
    Similar to the insertlist command for the tablelist + body.
    + +
    pathName header + iselemsnipped headerCellIndex + fullTextName
    + +
    Similar to the iselemsnipped command for the tablelist + body.
    + +
    pathName header + itemlistvar
    + +
    Similar to the itemlistvar command for the tablelist + body.
    + +
    pathName header + nearest y
    + +
    Similar to the nearest + command for the tablelist body.
    + +
    pathName header + nearestcell x y
    + +
    Similar to the nearestcell command for the tablelist + body.
    + +
    pathName header + rowattrib headerIndex ?name? ?value + name value ...?
    + +
    Similar to the rowattrib command for the tablelist + body.
    + +
    pathName header + rowcget index option
    + +
    Similar to the rowcget + command for the tablelist body.  option may + have any of the values accepted by the  header rowconfigure  + subcommand.
    + +
    pathName header + rowconfigure headerIndex ?option? ?value + option value ...?
    + +
    Similar to the rowconfigure command for the tablelist + body.  Each option may have any of the values + described in the ROW CONFIGURATION OPTIONS + IN THE TABLELIST HEADER section.
    + +
    pathName header + size
    + +
    Similar to the size command + for the tablelist body.
    + +
    pathName header + unsetcellattrib headerCellIndex name
    + +
    Similar to the unsetcellattrib command for the + tablelist body.
    + +
    pathName header + unsetrowattrib headerIndex name
    + +
    Similar to the unsetrowattrib command for the + tablelist body.
    + +
    pathName header + windowpath headerCellIndex
    + +
    Similar to the windowpath command for the tablelist + body.
    +
    +
    +
    DEFAULT AND INDIVIDUAL BINDINGS FOR THE TABLELIST BODY
    @@ -9722,11 +10927,13 @@

    Detailed Reference

    -bind [.tbl bodytag] <Button-1> {printClickedCell %W %x %y}
    +bind [.tbl bodytag] <Button-1> {printClickedCell %W %x %y}
    proc printClickedCell {w x y} { foreach {tbl x y} [tablelist::convEventFields $w $x $y] {} - puts "clicked on cell [$tbl containingcell $x $y]" + puts "clicked on cell [$tbl containingcell $x $y]"
    @@ -9761,7 +10968,7 @@

    Detailed Reference

    toggled with the aid of Control-Button-1, Control-space, and Control-Select (see below). - +
    BINDINGS FOR THE SELECTION TYPE @@ -9865,8 +11072,7 @@

    Detailed Reference

    mode is single or browse and the selection state of the element changes from unselected to selected then any other selected elements will be deselected, just as if button - 1 had been pressed without the Control key - down. + 1 had been pressed without the Control key down.
  • Again, if tablelist::strictTk is false, then Control-space and Control-Select @@ -9886,7 +11092,7 @@

    Detailed Reference

  • Control-a behaves the same as Control-slash, i.e., it selects everything in the - widget, except in single and + widget's body, except in single and browse modes, in which case it selects the active item or element (depending on the selection type) and deselects everything else. @@ -9960,7 +11166,7 @@

    Detailed Reference

    presence of a valid target, the source item is moved before the target row or just before the latter's first child, and the virtual event <<TablelistRowMoved>> is - generated.  For Tk versions 8.5 or higher, this virtual event is + generated.  For Tk versions 8.5 and higher, this virtual event is generated with its -data option set to a list of length 3, whose elements are derived from the arguments passed to the second form of the move @@ -9987,19 +11193,19 @@

    Detailed Reference

    and the command specified as the value of the -acceptchildcommand configuration option is a nonempty string, then this command is concatenated with the - name of the tablelist widget, the node index of the would-be new parent - node, and the row index of the dragged item, the resulting script is - evaluated in the global scope, and if the return value (which must be a - boolean) is false, then the source item will not be allowed to be moved - to the current mouse position.  Likewise, if the command specified - as the value of the -acceptdropcommand configuration option is a nonempty string, then this command is concatenated with the - name of the tablelist widget, the row index of the would-be new target - row, and the row index of the dragged item, the resulting script is - evaluated in the global scope, and if the return value (which must be a - boolean) is false, then the source item will not be allowed to be moved - to the current mouse position.

    + path name of the tablelist widget, the row index of the would-be new + target row, and the row index of the dragged item, the resulting script + is evaluated in the global scope, and if the return value (which must + be a boolean) is false, then the source item will not be allowed to be + moved to the current mouse position.

    Recall that if the selection mode is multiple then pressing mouse button 1 on a selected item or element @@ -10078,11 +11284,47 @@

    Detailed Reference

  • +
    DEFAULT AND INDIVIDUAL BINDINGS FOR + THE HEADER ITEMS
    + +
    The hedaer items are contained in a text widget whose binding tag + Text is replaced with a new binding tag called + TablelistHeader.  This tag replaces also the + binding tag Message of the message widgets used to + display multi-line header elements, as well as the binding tag + Label of the label widgets used to display embedded + images in the header cells.  This makes sure that the default handling + of the mouse events on the multi-line cells and embedded images in the + tablelist's header is the same as in the rest of the header text + widget.
    + +
    + Header items are designed for display purposes only, they are not + intended to be interactive.  For this reason, the only default + bindings associated with the binding tag + TablelistHeader are the ones used internally by + Tablelist for tooltip support.  You can, however, define individual + bindings for the header component, like in the following example (which + requires Tk 8.5 or later): + +
    +
    +bind [.tbl headertag] <Button-1> {printClickedCell %W %x %y}
    +proc printClickedCell {w x y} { + foreach {tbl x y} [tablelist::convEventFields $w $x $y] {} + puts "clicked on header cell [$tbl header containingcell $x $y]" +
    +
    +
    +
    DEFAULT AND INDIVIDUAL BINDINGS FOR THE HEADER LABELS
    -
    The tablelist::tablelist command automatically - creates the following bindings for the header labels:
    +
    Tablelist automatically creates the following bindings for the header + labels of a tablelist widget:
      @@ -10105,7 +11347,7 @@

      Detailed Reference

      finished, the virtual event <<TablelistColumnResized>> is generated, with its -data option set to the - numerical column index for Tk versions 8.5 or higher. + numerical column index for Tk versions 8.5 and higher.
    1. If mouse button 1 is pressed over a header label but outside the resize area described above and then dragged outside the @@ -10123,7 +11365,7 @@

      Detailed Reference

      mouse button 1, the source column is moved before the one indicated by the gap mentioned above and the virtual event <<TablelistColumnMoved>> is - generated.  For Tk versions 8.5 or higher, this virtual event is + generated.  For Tk versions 8.5 and higher, this virtual event is generated with its -data option set to a list of length 4, whose first two elements are identical to the two numerical column indices passed to the Detailed Reference outside the resize area described above and later released over the same label, and the command specified by the -labelcommand option is a nonempty - string, then this command is concatenated with the name of the + string, then this command is concatenated with the path name of the tablelist widget and the column index of the respective label, and the resulting script is evaluated in the global scope.  If another nonempty label command was specified at column level by using the @@ -10167,7 +11409,7 @@

      Detailed Reference

      and the virtual event <<TablelistColumnResized>> is generated, with its -data option set to the - numerical column index for Tk versions 8.5 or higher.  The same + numerical column index for Tk versions 8.5 and higher.  The same action is triggered by double-clicking the resize area of a header label.
    2. @@ -10184,7 +11426,7 @@

      Detailed Reference

      set to its last static width (if any) and the virtual event <<TablelistColumnResized>> is generated, with its -data option set to the - numerical column index for Tk versions 8.5 or higher.  The same + numerical column index for Tk versions 8.5 and higher.  The same action is triggered by double-clicking the resize area of a header label with the Shift key held down.
    @@ -10220,10 +11462,10 @@

    Detailed Reference

    DEFAULT BINDINGS FOR INTERACTIVE CELL EDITING
    -
    The tablelist::tablelist command extends and - partially redefines the bindings of some of the components of the temporary - embedded widget used for interactive cell editing, which is started by - pressing mouse button 1 in an editable cell (see the Tablelist extends and partially redefines the bindings of some of the + components of the temporary embedded widget used for interactive cell + editing, which is started by pressing mouse button 1 in an editable cell + (see the -editselectedonly option for details) or using keyboard navigation to move from one editable cell into another.  If the selection type is cell and the @@ -10278,10 +11520,10 @@

    Detailed Reference

    When editing a cell that is not the only editable cell of the tablelist widget, Tab and Shift-Tab terminate the editing in the current cell, move the edit window into - the next/previous editable cell of the tablelist, select the contents + the next/previous editable cell of the tablelist, select the content of the edit window's first entry or entry-like component (if any), and set the insertion cursor to its end.  If the new edit window - is a text or ctext widget then its contents are left unselected. + is a text or ctext widget then its content is left unselected.

    Notice that these bindings replace the common inter-widget navigation via Tab and Shift-Tab with @@ -10302,10 +11544,10 @@

    Detailed Reference

    (Command-Left/Command-Right on Mac OS Classic and Mac OS X Aqua) terminates the editing in the current cell, moves the edit window into the previous/next editable cell of the row, - selects the contents of the edit window's first entry or entry-like + selects the content of the edit window's first entry or entry-like component (if any), and sets the insertion cursor to its end.  If - the new edit window is a text or ctext widget then its contents are - left unselected.  The key sequence + the new edit window is a text or ctext widget then its content is left + unselected.  The key sequence Meta-Left/Meta-Right has the same effect as Alt-Left/Alt-Right.  If tk_strictMotif is false and the edit window is not @@ -10319,13 +11561,12 @@

    Detailed Reference

    cell within its column, Alt-Up/Alt-Down (Command-Up/Command-Down on Mac OS Classic and Mac OS X Aqua) terminates the editing in the current cell, moves - the edit window one line up/down within the column, selects the - contents of the edit window's first entry or entry-like component (if - any), and sets the insertion cursor to its end.  If the new edit - window is a text or ctext widget then its contents are left - unselected.  The key sequence - Meta-Up/Meta-Down has the same effect as - Alt-Up/Alt-Down.  If + the edit window one line up/down within the column, selects the content + of the edit window's first entry or entry-like component (if any), and + sets the insertion cursor to its end.  If the new edit window is a + text or ctext widget then its content is left unselected.  The key + sequence Meta-Up/Meta-Down has the same + effect as Alt-Up/Alt-Down.  If tk_strictMotif is false and the edit window is not a text or ctext widget or an Iwidgets combobox, then Control-p and Control-n behave the same as @@ -10341,9 +11582,9 @@

    Detailed Reference

    (Command-Prior/Command-Next on Mac OS Classic and Mac OS X Aqua) terminates the editing in the current cell, moves the edit window up/down by one page within the column, selects the - contents of the edit window's first entry or entry-like component (if + content of the edit window's first entry or entry-like component (if any), and sets the insertion cursor to its end.  If the new edit - window is a text or ctext widget then its contents are left + window is a text or ctext widget then its content is left unselected.  The key sequence Meta-Prior/Meta-Next has the same effect as Alt-Prior/Alt-Next.  If the edit window @@ -10358,10 +11599,10 @@

    Detailed Reference

    (Command-Home/Command-End on Mac OS Classic and Mac OS X Aqua) terminates the editing in the current cell, moves the edit window into the first/last editable cell of the tablelist, - selects the contents of the edit window's first entry or entry-like + selects the content of the edit window's first entry or entry-like component (if any), and sets the insertion cursor to its end.  If - the new edit window is a text or ctext widget then its contents are - left unselected.  The key sequence + the new edit window is a text or ctext widget then its content is left + unselected.  The key sequence Meta-Home/Meta-End has the same effect as Alt-Home/Alt-End.  If tk_strictMotif is false and the edit window is not From 2286aff628269de9035872a8e0e0cee4ee77c101 Mon Sep 17 00:00:00 2001 From: csaba Date: Wed, 6 Dec 2017 16:17:26 +0000 Subject: [PATCH 026/150] * doc/dirViewer.png: Updated screenshots * doc/embeddedWindows.png: * doc/embeddedWindows_tile.png: --- modules/tablelist/doc/dirViewer.png | Bin 13004 -> 10787 bytes modules/tablelist/doc/embeddedWindows.png | Bin 6608 -> 7411 bytes .../tablelist/doc/embeddedWindows_tile.png | Bin 6893 -> 7279 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/modules/tablelist/doc/dirViewer.png b/modules/tablelist/doc/dirViewer.png index 1d7f0f86bc03aee5ec99782173179b6df1ff41c9..9df9ea67d6c0f031052fdb8e159792361d2c6400 100644 GIT binary patch literal 10787 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 literal 13004 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 M%36<$9$LQsUzUJUMF0Q* diff --git a/modules/tablelist/doc/embeddedWindows.png b/modules/tablelist/doc/embeddedWindows.png index 17b00be1a92dac7629bd844e513ba7ea8fafc0d5..43e9df081712215878a819db505b2df84c105eeb 100644 GIT binary patch literal 7411 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 literal 6608 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 YIIc?)2XD8TL8L=h%TTlCCJ_05086|BmjD0& diff --git a/modules/tablelist/doc/embeddedWindows_tile.png b/modules/tablelist/doc/embeddedWindows_tile.png index b6d2aab3e83a8d40c9c55f93d84e13f79c325f8b..de8b92c29cb2a79e535b47240fa5e27fd3864b05 100644 GIT binary patch literal 7279 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 BkOu$& literal 6893 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 W9T6Nm`MD1uUfSyS)!wQiqyGnbdcP6? From ca3929712227511ec2ade3540e1121032a4f8baa Mon Sep 17 00:00:00 2001 From: csaba Date: Wed, 6 Dec 2017 16:20:14 +0000 Subject: [PATCH 027/150] * ../../examples/*.tcl: Bumped the version number to 6.0; updates and minor improvements. --- examples/tablelist/browse.tcl | 4 ++-- examples/tablelist/browseTree.tcl | 4 ++-- examples/tablelist/browseTree_tile.tcl | 4 ++-- examples/tablelist/browse_tile.tcl | 4 ++-- examples/tablelist/bwidget.tcl | 8 +++----- examples/tablelist/bwidget_tile.tcl | 8 +++----- examples/tablelist/config.tcl | 2 +- examples/tablelist/config_tile.tcl | 2 +- examples/tablelist/dirViewer.tcl | 18 +++++++++--------- examples/tablelist/dirViewer_tile.tcl | 18 +++++++++--------- examples/tablelist/embeddedWindows.tcl | 18 +++++++++++------- examples/tablelist/embeddedWindows_tile.tcl | 18 +++++++++++------- examples/tablelist/iwidgets.tcl | 11 ++++++----- examples/tablelist/iwidgets_tile.tcl | 11 ++++++----- examples/tablelist/miscWidgets.tcl | 6 ++---- examples/tablelist/miscWidgets_tile.tcl | 6 ++---- examples/tablelist/styles.tcl | 2 +- examples/tablelist/styles_tile.tcl | 2 +- examples/tablelist/tileWidgets.tcl | 4 ++-- 19 files changed, 76 insertions(+), 74 deletions(-) diff --git a/examples/tablelist/browse.tcl b/examples/tablelist/browse.tcl index 4887a038..1dbb8ca3 100644 --- a/examples/tablelist/browse.tcl +++ b/examples/tablelist/browse.tcl @@ -5,7 +5,7 @@ # Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist 5.18 +package require tablelist 6.0 namespace eval demo { variable dir [file dirname [info script]] @@ -226,7 +226,7 @@ proc demo::formatBoolean val { #------------------------------------------------------------------------------ # demo::labelCmd # -# Sorts the contents of the tablelist widget tbl by its col'th column and makes +# Sorts the content of the tablelist widget tbl by its col'th column and makes # sure the items will be updated 500 ms later (because one of the items might # refer to a canvas containing the arrow that displays the sort order). #------------------------------------------------------------------------------ diff --git a/examples/tablelist/browseTree.tcl b/examples/tablelist/browseTree.tcl index 897ac4fe..a7cefa3d 100644 --- a/examples/tablelist/browseTree.tcl +++ b/examples/tablelist/browseTree.tcl @@ -6,7 +6,7 @@ #============================================================================== package require Tk 8.3 -package require tablelist 5.18 +package require tablelist 6.0 namespace eval demo { variable dir [file dirname [info script]] @@ -266,7 +266,7 @@ proc demo::formatBoolean val { #------------------------------------------------------------------------------ # demo::labelCmd # -# Sorts the contents of the tablelist widget tbl by its col'th column and makes +# Sorts the content of the tablelist widget tbl by its col'th column and makes # sure the items will be updated 500 ms later (because one of the items might # refer to a canvas containing the arrow that displays the sort order). #------------------------------------------------------------------------------ diff --git a/examples/tablelist/browseTree_tile.tcl b/examples/tablelist/browseTree_tile.tcl index cb6f67b6..285355d9 100644 --- a/examples/tablelist/browseTree_tile.tcl +++ b/examples/tablelist/browseTree_tile.tcl @@ -5,7 +5,7 @@ # Copyright (c) 2010-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 5.18 +package require tablelist_tile 6.0 namespace eval demo { variable dir [file dirname [info script]] @@ -271,7 +271,7 @@ proc demo::formatBoolean val { #------------------------------------------------------------------------------ # demo::labelCmd # -# Sorts the contents of the tablelist widget tbl by its col'th column and makes +# Sorts the content of the tablelist widget tbl by its col'th column and makes # sure the items will be updated 500 ms later (because one of the items might # refer to a canvas containing the arrow that displays the sort order). #------------------------------------------------------------------------------ diff --git a/examples/tablelist/browse_tile.tcl b/examples/tablelist/browse_tile.tcl index 27b1ccc1..64a51fa1 100644 --- a/examples/tablelist/browse_tile.tcl +++ b/examples/tablelist/browse_tile.tcl @@ -5,7 +5,7 @@ # Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 5.18 +package require tablelist_tile 6.0 namespace eval demo { variable dir [file dirname [info script]] @@ -232,7 +232,7 @@ proc demo::formatBoolean val { #------------------------------------------------------------------------------ # demo::labelCmd # -# Sorts the contents of the tablelist widget tbl by its col'th column and makes +# Sorts the content of the tablelist widget tbl by its col'th column and makes # sure the items will be updated 500 ms later (because one of the items might # refer to a canvas containing the arrow that displays the sort order). #------------------------------------------------------------------------------ diff --git a/examples/tablelist/bwidget.tcl b/examples/tablelist/bwidget.tcl index 551b3488..2316edaf 100755 --- a/examples/tablelist/bwidget.tcl +++ b/examples/tablelist/bwidget.tcl @@ -9,7 +9,7 @@ #============================================================================== package require Tk 8.4 ;# because of "-compound" -package require tablelist 5.18 +package require tablelist 6.0 package require BWidget wm title . "Serial Line Configuration" @@ -19,9 +19,7 @@ wm title . "Serial Line Configuration" # set dir [file dirname [info script]] source [file join $dir option.tcl] -option add *Tablelist*Checkbutton.background white -option add *Tablelist*Checkbutton.activeBackground white -option add *Tablelist*Entry.background white +option add *Tablelist*Entry.background white # # Register some widgets from the BWidget package for interactive cell editing @@ -198,7 +196,7 @@ proc editStartCmd {tbl row col text} { # editEndCmd # # Performs a final validation of the text contained in the edit window and gets -# the cell's internal contents. +# the cell's internal content. #------------------------------------------------------------------------------ proc editEndCmd {tbl row col text} { switch [$tbl columncget $col -name] { diff --git a/examples/tablelist/bwidget_tile.tcl b/examples/tablelist/bwidget_tile.tcl index 59ee3d0f..302bc7f9 100755 --- a/examples/tablelist/bwidget_tile.tcl +++ b/examples/tablelist/bwidget_tile.tcl @@ -8,7 +8,7 @@ # Copyright (c) 2004-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 5.18 +package require tablelist_tile 6.0 package require BWidget wm title . "Serial Line Configuration" @@ -18,9 +18,7 @@ wm title . "Serial Line Configuration" # set dir [file dirname [info script]] source [file join $dir option_tile.tcl] -option add *Tablelist*Checkbutton.background white -option add *Tablelist*Checkbutton.activeBackground white -option add *Tablelist*Entry.background white +option add *Tablelist*Entry.background white # # Register some widgets from the BWidget package for interactive cell editing @@ -204,7 +202,7 @@ proc editStartCmd {tbl row col text} { # editEndCmd # # Performs a final validation of the text contained in the edit window and gets -# the cell's internal contents. +# the cell's internal content. #------------------------------------------------------------------------------ proc editEndCmd {tbl row col text} { switch [$tbl columncget $col -name] { diff --git a/examples/tablelist/config.tcl b/examples/tablelist/config.tcl index c2e38cac..ef3ba62d 100644 --- a/examples/tablelist/config.tcl +++ b/examples/tablelist/config.tcl @@ -5,7 +5,7 @@ # Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist 5.18 +package require tablelist 6.0 namespace eval demo { # diff --git a/examples/tablelist/config_tile.tcl b/examples/tablelist/config_tile.tcl index ab916182..64ccf105 100644 --- a/examples/tablelist/config_tile.tcl +++ b/examples/tablelist/config_tile.tcl @@ -5,7 +5,7 @@ # Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 5.18 +package require tablelist_tile 6.0 namespace eval demo { # diff --git a/examples/tablelist/dirViewer.tcl b/examples/tablelist/dirViewer.tcl index 45a3fc48..1da8ece7 100755 --- a/examples/tablelist/dirViewer.tcl +++ b/examples/tablelist/dirViewer.tcl @@ -1,14 +1,14 @@ #!/usr/bin/env wish #============================================================================== -# Demonstrates how to use a tablelist widget for displaying the contents of a +# Demonstrates how to use a tablelist widget for displaying the content of a # directory. # # Copyright (c) 2010-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== package require Tk 8.3 -package require tablelist 5.18 +package require tablelist 6.0 # # Add some entries to the Tk option database @@ -26,7 +26,7 @@ image create photo fileImg -file [file join $dir file.gif] #------------------------------------------------------------------------------ # displayContents # -# Displays the contents of the directory dir in a tablelist widget. +# Displays the content of the directory dir in a tablelist widget. #------------------------------------------------------------------------------ proc displayContents dir { # @@ -99,7 +99,7 @@ proc displayContents dir { pack $tf -side top -expand yes -fill both # - # Populate the tablelist with the contents of the given directory + # Populate the tablelist with the content of the given directory # $tbl sortbycolumn 0 putContents $dir $tbl root @@ -108,7 +108,7 @@ proc displayContents dir { #------------------------------------------------------------------------------ # putContents # -# Outputs the contents of the directory dir into the tablelist widget tbl, as +# Outputs the content of the directory dir into the tablelist widget tbl, as # child items of the one identified by nodeIdx. #------------------------------------------------------------------------------ proc putContents {dir tbl nodeIdx} { @@ -263,7 +263,7 @@ proc formatSize val { #------------------------------------------------------------------------------ # expandCmd # -# Outputs the contents of the directory whose leaf name is displayed in the +# Outputs the content of the directory whose leaf name is displayed in the # first cell of the specified row of the tablelist widget tbl, as child items # of the one identified by row, and updates the image displayed in that cell. #------------------------------------------------------------------------------ @@ -291,7 +291,7 @@ proc collapseCmd {tbl row} { #------------------------------------------------------------------------------ # putContentsOfSelFolder # -# Outputs the contents of the selected folder into the tablelist widget tbl. +# Outputs the content of the selected folder into the tablelist widget tbl. #------------------------------------------------------------------------------ proc putContentsOfSelFolder tbl { set row [$tbl curselection] @@ -351,7 +351,7 @@ proc postPopupMenu {rootX rootY} { #------------------------------------------------------------------------------ # refreshView # -# Redisplays the contents of the directory dir in the tablelist widget tbl and +# Redisplays the content of the directory dir in the tablelist widget tbl and # restores the expanded states of the folders as well as the vertical view. #------------------------------------------------------------------------------ proc refreshView {dir tbl} { @@ -366,7 +366,7 @@ proc refreshView {dir tbl} { } # - # Redisplay the directory's (possibly changed) contents and restore + # Redisplay the directory's (possibly changed) content and restore # the expanded states of the folders, along with the vertical view # putContents $dir $tbl root diff --git a/examples/tablelist/dirViewer_tile.tcl b/examples/tablelist/dirViewer_tile.tcl index 52da886e..3e12e318 100755 --- a/examples/tablelist/dirViewer_tile.tcl +++ b/examples/tablelist/dirViewer_tile.tcl @@ -1,13 +1,13 @@ #!/usr/bin/env wish #============================================================================== -# Demonstrates how to use a tablelist widget for displaying the contents of a +# Demonstrates how to use a tablelist widget for displaying the content of a # directory. # # Copyright (c) 2010-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 5.18 +package require tablelist_tile 6.0 # # Add some entries to the Tk option database @@ -32,7 +32,7 @@ if {[tablelist::getCurrentTheme] eq "aqua"} { #------------------------------------------------------------------------------ # displayContents # -# Displays the contents of the directory dir in a tablelist widget. +# Displays the content of the directory dir in a tablelist widget. #------------------------------------------------------------------------------ proc displayContents dir { # @@ -104,7 +104,7 @@ proc displayContents dir { pack $tf -side top -expand yes -fill both # - # Populate the tablelist with the contents of the given directory + # Populate the tablelist with the content of the given directory # $tbl sortbycolumn 0 putContents $dir $tbl root @@ -113,7 +113,7 @@ proc displayContents dir { #------------------------------------------------------------------------------ # putContents # -# Outputs the contents of the directory dir into the tablelist widget tbl, as +# Outputs the content of the directory dir into the tablelist widget tbl, as # child items of the one identified by nodeIdx. #------------------------------------------------------------------------------ proc putContents {dir tbl nodeIdx} { @@ -268,7 +268,7 @@ proc formatSize val { #------------------------------------------------------------------------------ # expandCmd # -# Outputs the contents of the directory whose leaf name is displayed in the +# Outputs the content of the directory whose leaf name is displayed in the # first cell of the specified row of the tablelist widget tbl, as child items # of the one identified by row, and updates the image displayed in that cell. #------------------------------------------------------------------------------ @@ -296,7 +296,7 @@ proc collapseCmd {tbl row} { #------------------------------------------------------------------------------ # putContentsOfSelFolder # -# Outputs the contents of the selected folder into the tablelist widget tbl. +# Outputs the content of the selected folder into the tablelist widget tbl. #------------------------------------------------------------------------------ proc putContentsOfSelFolder tbl { set row [$tbl curselection] @@ -356,7 +356,7 @@ proc postPopupMenu {rootX rootY} { #------------------------------------------------------------------------------ # refreshView # -# Redisplays the contents of the directory dir in the tablelist widget tbl and +# Redisplays the content of the directory dir in the tablelist widget tbl and # restores the expanded states of the folders as well as the vertical view. #------------------------------------------------------------------------------ proc refreshView {dir tbl} { @@ -371,7 +371,7 @@ proc refreshView {dir tbl} { } # - # Redisplay the directory's (possibly changed) contents and restore + # Redisplay the directory's (possibly changed) content and restore # the expanded states of the folders, along with the vertical view # putContents $dir $tbl root diff --git a/examples/tablelist/embeddedWindows.tcl b/examples/tablelist/embeddedWindows.tcl index ceb3b90f..8c23cb97 100755 --- a/examples/tablelist/embeddedWindows.tcl +++ b/examples/tablelist/embeddedWindows.tcl @@ -6,7 +6,7 @@ # Copyright (c) 2004-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist 5.18 +package require tablelist 6.0 wm title . "Tk Library Scripts" @@ -66,15 +66,19 @@ eval font create BoldFont [font actual $tblFont] -size $size -weight bold # Populate the tablelist widget # cd $tk_library -set maxFileSize 0 +set totalSize 0 +set maxSize 0 foreach fileName [lsort [glob *.tcl]] { set fileSize [file size $fileName] $tbl insert end [list $fileName $fileSize $fileSize "" no] - if {$fileSize > $maxFileSize} { - set maxFileSize $fileSize + incr totalSize $fileSize + if {$fileSize > $maxSize} { + set maxSize $fileSize } } +$tbl header insert 0 [list "[$tbl size] *.tcl files" "" $totalSize "" ""] +$tbl header rowconfigure 0 -foreground blue #------------------------------------------------------------------------------ # createFrame @@ -103,7 +107,7 @@ proc createFrame {tbl row col w} { # Manage the child frame # set fileSize [$tbl cellcget $row,fileSize -text] - place $w.f -relwidth [expr {double($fileSize) / $::maxFileSize}] + place $w.f -relwidth [expr {double($fileSize) / $::maxSize}] } #------------------------------------------------------------------------------ @@ -121,7 +125,7 @@ proc createButton {tbl row col w} { #------------------------------------------------------------------------------ # viewFile # -# Displays the contents of the file whose name is contained in the row with the +# Displays the content of the file whose name is contained in the row with the # given key of the tablelist widget tbl. #------------------------------------------------------------------------------ proc viewFile {tbl key} { @@ -148,7 +152,7 @@ proc viewFile {tbl key} { scrollbar $vsb -orient vertical -command [list $txt yview] # - # Insert the file's contents into the text widget + # Insert the file's content into the text widget # set chan [open $fileName] $txt insert end [read $chan] diff --git a/examples/tablelist/embeddedWindows_tile.tcl b/examples/tablelist/embeddedWindows_tile.tcl index 3f389457..c726269e 100755 --- a/examples/tablelist/embeddedWindows_tile.tcl +++ b/examples/tablelist/embeddedWindows_tile.tcl @@ -6,7 +6,7 @@ # Copyright (c) 2004-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 5.18 +package require tablelist_tile 6.0 wm title . "Tile Library Scripts" @@ -95,15 +95,19 @@ if {[info exists ttk::library]} { } else { cd $tile::library } -set maxFileSize 0 +set totalSize 0 +set maxSize 0 foreach fileName [lsort [glob *.tcl]] { set fileSize [file size $fileName] $tbl insert end [list $fileName $fileSize $fileSize "" no] - if {$fileSize > $maxFileSize} { - set maxFileSize $fileSize + incr totalSize $fileSize + if {$fileSize > $maxSize} { + set maxSize $fileSize } } +$tbl header insert 0 [list "[$tbl size] *.tcl files" "" $totalSize "" ""] +$tbl header rowconfigure 0 -foreground blue #------------------------------------------------------------------------------ # createFrame @@ -132,7 +136,7 @@ proc createFrame {tbl row col w} { # Manage the child frame # set fileSize [$tbl cellcget $row,fileSize -text] - place $w.f -relwidth [expr {double($fileSize) / $::maxFileSize}] + place $w.f -relwidth [expr {double($fileSize) / $::maxSize}] } #------------------------------------------------------------------------------ @@ -150,7 +154,7 @@ proc createButton {tbl row col w} { #------------------------------------------------------------------------------ # viewFile # -# Displays the contents of the file whose name is contained in the row with the +# Displays the content of the file whose name is contained in the row with the # given key of the tablelist widget tbl. #------------------------------------------------------------------------------ proc viewFile {tbl key} { @@ -177,7 +181,7 @@ proc viewFile {tbl key} { ttk::scrollbar $vsb -orient vertical -command [list $txt yview] # - # Insert the file's contents into the text widget + # Insert the file's content into the text widget # set chan [open $fileName] $txt insert end [read $chan] diff --git a/examples/tablelist/iwidgets.tcl b/examples/tablelist/iwidgets.tcl index 0d4f0f29..7e969bc0 100755 --- a/examples/tablelist/iwidgets.tcl +++ b/examples/tablelist/iwidgets.tcl @@ -9,8 +9,11 @@ #============================================================================== package require Tk 8.4 ;# because of "-compound" -package require tablelist 5.18 -package require Iwidgets +package require tablelist 6.0 +if {[catch {package require iwidgets} result1] != 0 && + [catch {package require Iwidgets} result2] != 0} { + error "$result1; $result2" +} wm title . "Serial Line Configuration" @@ -19,8 +22,6 @@ wm title . "Serial Line Configuration" # set dir [file dirname [info script]] source [file join $dir option.tcl] -option add *Tablelist*Checkbutton.background white -option add *Tablelist*Checkbutton.activeBackground white option add *Tablelist*textBackground white option add *Tablelist*Entry.disabledBackground white option add *Tablelist*Entry.disabledForeground black @@ -202,7 +203,7 @@ proc editStartCmd {tbl row col text} { # editEndCmd # # Performs a final validation of the text contained in the edit window and gets -# the cell's internal contents. +# the cell's internal content. #------------------------------------------------------------------------------ proc editEndCmd {tbl row col text} { switch [$tbl columncget $col -name] { diff --git a/examples/tablelist/iwidgets_tile.tcl b/examples/tablelist/iwidgets_tile.tcl index c20db84c..390a257e 100755 --- a/examples/tablelist/iwidgets_tile.tcl +++ b/examples/tablelist/iwidgets_tile.tcl @@ -8,8 +8,11 @@ # Copyright (c) 2004-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 5.18 -package require Iwidgets +package require tablelist_tile 6.0 +if {[catch {package require iwidgets} result1] != 0 && + [catch {package require Iwidgets} result2] != 0} { + error "$result1; $result2" +} wm title . "Serial Line Configuration" @@ -18,8 +21,6 @@ wm title . "Serial Line Configuration" # set dir [file dirname [info script]] source [file join $dir option_tile.tcl] -option add *Tablelist*Checkbutton.background white -option add *Tablelist*Checkbutton.activeBackground white option add *Tablelist*textBackground white option add *Tablelist*Entry.disabledBackground white option add *Tablelist*Entry.disabledForeground black @@ -208,7 +209,7 @@ proc editStartCmd {tbl row col text} { # editEndCmd # # Performs a final validation of the text contained in the edit window and gets -# the cell's internal contents. +# the cell's internal content. #------------------------------------------------------------------------------ proc editEndCmd {tbl row col text} { switch [$tbl columncget $col -name] { diff --git a/examples/tablelist/miscWidgets.tcl b/examples/tablelist/miscWidgets.tcl index 7626d656..ad0bc826 100755 --- a/examples/tablelist/miscWidgets.tcl +++ b/examples/tablelist/miscWidgets.tcl @@ -9,7 +9,7 @@ #============================================================================== package require Tk 8.4 ;# because of "-compound" and the spinbox widget -package require tablelist 5.18 +package require tablelist 6.0 package require combobox package require mentry @@ -20,8 +20,6 @@ wm title . "Serial Line Configuration" # set dir [file dirname [info script]] source [file join $dir option.tcl] -option add *Tablelist*Checkbutton.background white -option add *Tablelist*Checkbutton.activeBackground white option add *Tablelist*Entry.background white option add *Tablelist*Spinbox.background white option add *Tablelist*Spinbox.readonlyBackground white @@ -208,7 +206,7 @@ array set msgs { # editEndCmd # # Performs a final validation of the text contained in the edit window and gets -# the cell's internal contents. +# the cell's internal content. #------------------------------------------------------------------------------ proc editEndCmd {tbl row col text} { switch [$tbl columncget $col -name] { diff --git a/examples/tablelist/miscWidgets_tile.tcl b/examples/tablelist/miscWidgets_tile.tcl index ed6f0cb1..6eedbf9b 100755 --- a/examples/tablelist/miscWidgets_tile.tcl +++ b/examples/tablelist/miscWidgets_tile.tcl @@ -8,7 +8,7 @@ # Copyright (c) 2004-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 5.18 +package require tablelist_tile 6.0 package require combobox package require mentry @@ -19,8 +19,6 @@ wm title . "Serial Line Configuration" # set dir [file dirname [info script]] source [file join $dir option_tile.tcl] -option add *Tablelist*Checkbutton.background white -option add *Tablelist*Checkbutton.activeBackground white option add *Tablelist*Entry.background white option add *Tablelist*Spinbox.background white option add *Tablelist*Spinbox.readonlyBackground white @@ -214,7 +212,7 @@ array set msgs { # editEndCmd # # Performs a final validation of the text contained in the edit window and gets -# the cell's internal contents. +# the cell's internal content. #------------------------------------------------------------------------------ proc editEndCmd {tbl row col text} { switch [$tbl columncget $col -name] { diff --git a/examples/tablelist/styles.tcl b/examples/tablelist/styles.tcl index a3f20b2c..0d96ee1b 100755 --- a/examples/tablelist/styles.tcl +++ b/examples/tablelist/styles.tcl @@ -6,7 +6,7 @@ # Copyright (c) 2002-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist 5.18 +package require tablelist 6.0 wm title . "Tablelist Styles" diff --git a/examples/tablelist/styles_tile.tcl b/examples/tablelist/styles_tile.tcl index 08d0aa0b..d8869780 100755 --- a/examples/tablelist/styles_tile.tcl +++ b/examples/tablelist/styles_tile.tcl @@ -6,7 +6,7 @@ # Copyright (c) 2002-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 5.18 +package require tablelist_tile 6.0 wm title . "Tablelist Styles" diff --git a/examples/tablelist/tileWidgets.tcl b/examples/tablelist/tileWidgets.tcl index dfbe898f..d028dec0 100755 --- a/examples/tablelist/tileWidgets.tcl +++ b/examples/tablelist/tileWidgets.tcl @@ -7,7 +7,7 @@ # Copyright (c) 2005-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 5.18 +package require tablelist_tile 6.0 wm title . "Serial Line Configuration" @@ -205,7 +205,7 @@ proc editStartCmd {tbl row col text} { # editEndCmd # # Performs a final validation of the text contained in the edit window and gets -# the cell's internal contents. +# the cell's internal content. #------------------------------------------------------------------------------ proc editEndCmd {tbl row col text} { switch [$tbl columncget $col -name] { From 1ce2b3c23519d292081282ff222e44b549edfb52 Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 8 Jan 2018 20:57:10 +0000 Subject: [PATCH 028/150] * *.tcl: Bumped the version number to 6.0.1. * COPYRIGHT.txt: * README.txt: * doc/index.html: * doc/tablelist.html: * CHANGES.txt: Updated to reflect the changes. * scripts/tablelistUtil.tcl: Inserted the missing "]""in line #6448. --- modules/tablelist/ChangeLog | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/modules/tablelist/ChangeLog b/modules/tablelist/ChangeLog index 103f7b5b..0b180977 100644 --- a/modules/tablelist/ChangeLog +++ b/modules/tablelist/ChangeLog @@ -1,4 +1,16 @@ -2017-12-R06 Csaba Nemethi +2018-01-08 Csaba Nemethi + + * *.tcl: Bumped the version number to 6.0.1. + * COPYRIGHT.txt: + * README.txt: + * doc/index.html: + * doc/tablelist.html: + + * CHANGES.txt: Updated to reflect the changes. + + * scripts/tablelistUtil.tcl: Inserted the missing "]""in line #6448. + +2017-12-06 Csaba Nemethi * *.tcl: Bumped the version number to 6.0. * COPYRIGHT.txt: From 1c0970d7ec8bd5afa88c7ec376d6ec8d5f72f644 Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 8 Jan 2018 20:59:53 +0000 Subject: [PATCH 029/150] * *.tcl: Bumped the version number to 6.0.1. * COPYRIGHT.txt: * README.txt: * doc/index.html: * doc/tablelist.html: --- modules/tablelist/COPYRIGHT.txt | 4 ++-- modules/tablelist/README.txt | 14 +++++++------- modules/tablelist/doc/index.html | 5 +++-- modules/tablelist/doc/tablelist.html | 23 ++++++++++++----------- modules/tablelist/pkgIndex.tcl | 16 ++++++++-------- modules/tablelist/tablelist.tcl | 4 ++-- modules/tablelist/tablelistPublic.tcl | 4 ++-- modules/tablelist/tablelist_tile.tcl | 4 ++-- 8 files changed, 38 insertions(+), 36 deletions(-) diff --git a/modules/tablelist/COPYRIGHT.txt b/modules/tablelist/COPYRIGHT.txt index 80d6eb72..388575f1 100644 --- a/modules/tablelist/COPYRIGHT.txt +++ b/modules/tablelist/COPYRIGHT.txt @@ -1,5 +1,5 @@ -Multi-column listbox and tree widget package Tablelist, version 6.0 -Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +Multi-column listbox and tree widget package Tablelist, version 6.0.1 +Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) This library is free software; you can use, modify, and redistribute it for any purpose, provided that existing copyright notices are retained diff --git a/modules/tablelist/README.txt b/modules/tablelist/README.txt index b6918185..7a6b81f1 100644 --- a/modules/tablelist/README.txt +++ b/modules/tablelist/README.txt @@ -88,8 +88,8 @@ How to Get It? -------------- Tablelist is available for free download from the same URL as Wcb. The -distribution file is "tablelist6.0.tar.gz" for UNIX and -"tablelist6_0.zip" for Windows. These files contain the same +distribution file is "tablelist6.0.1.tar.gz" for UNIX and +"tablelist6_0_1.zip" for Windows. These files contain the same information, except for the additional carriage return character preceding the linefeed at the end of each line in the text files for Windows. @@ -108,16 +108,16 @@ locations of these library directories are given by the "tcl_library" and "tk_library" variables, respectively. To install Tablelist on UNIX, "cd" to the desired directory and unpack -the distribution file "tablelist6.0ar.gz": +the distribution file "tablelist6.0.1.tar.gz": - gunzip -c tablelist6.0ar.gz | tar -xf - + gunzip -c tablelist6.0.1.tar.gz | tar -xf - -This command will create a directory named "tablelist6.0 with the +This command will create a directory named "tablelist6.0.1 with the subdirectories "demos", "doc", and "scripts". On Windows, use WinZip or some other program capable of unpacking the -distribution file "tablelist6_0.zip" into the directory "tablelist6.0", -with the subdirectories "demos", "doc", and "scripts". +distribution file "tablelist6_0_1.zip" into the directory +"tablelist6.0.1", with the subdirectories "demos", "doc", and "scripts". The file "tablelistEdit.tcl" in the "scripts" directory is only needed for applications making use of interactive cell editing. Similarly, the diff --git a/modules/tablelist/doc/index.html b/modules/tablelist/doc/index.html index 10872710..bab5efde 100644 --- a/modules/tablelist/doc/index.html +++ b/modules/tablelist/doc/index.html @@ -1,6 +1,7 @@ - The Multi-Column Listbox and Tree Widget Package Tablelist 6.0 + The Multi-Column Listbox and Tree Widget Package Tablelist + 6.0.1
    -

    The Multi-Column Listbox and Tree Widget Package Tablelist 6.0

    +

    The Multi-Column Listbox and Tree Widget Package Tablelist 6.0.1

    by

    diff --git a/modules/tablelist/doc/tablelist.html b/modules/tablelist/doc/tablelist.html index 9c71ab9e..3237a6c6 100644 --- a/modules/tablelist/doc/tablelist.html +++ b/modules/tablelist/doc/tablelist.html @@ -13,7 +13,7 @@

    Tablelist Programmer's Guide

    -

    For Tablelist Version 6.0

    +

    For Tablelist Version 6.0.1

    by

    @@ -170,10 +170,11 @@

    What Is Tablelist?

    How to Get It?

    Tablelist is available for free download from the same URL as Wcb.  - The distribution file is tablelist6.0.tar.gz for UNIX and - tablelist6_0.zip for Windows.  These files contain the same - information, except for the additional carriage return character preceding - the linefeed at the end of each line in the text files for Windows.

    + The distribution file is tablelist6.0.1.tar.gz for UNIX and + tablelist6_0_1.zip for Windows.  These files contain the + same information, except for the additional carriage return character + preceding the linefeed at the end of each line in the text files for + Windows.

    Tablelist is also included in tklib, which has the address

    @@ -194,21 +195,21 @@

    How to Install It?

    To install Tablelist on UNIX, cd to the desired directory and unpack the distribution file - tablelist6.0.tar.gz:

    + tablelist6.0.1.tar.gz:

    -gunzip -c tablelist6.0.tar.gz | tar -xf -
    +gunzip -c tablelist6.0.1.tar.gz | tar -xf -
     
    -

    This command will create a directory named tablelist6.0, with - the subdirectories demos, doc, and +

    This command will create a directory named tablelist6.0.1, + with the subdirectories demos, doc, and scripts.

    On Windows, use WinZip or some other program capable of unpacking - the distribution file tablelist6_0ip into the directory - tablelist6.0, with the subdirectories demos, + the distribution file tablelist6_0_1.zip into the directory + tablelist6.0.1, with the subdirectories demos, doc, and scripts.

    The file tablelistEdit.tcl in the scripts diff --git a/modules/tablelist/pkgIndex.tcl b/modules/tablelist/pkgIndex.tcl index e64dffef..ae9883cf 100644 --- a/modules/tablelist/pkgIndex.tcl +++ b/modules/tablelist/pkgIndex.tcl @@ -1,28 +1,28 @@ #============================================================================== # Tablelist and Tablelist_tile package index file. # -# Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # # Regular packages: # -package ifneeded tablelist 6.0 \ +package ifneeded tablelist 6.0.1 \ [list source [file join $dir tablelist.tcl]] -package ifneeded tablelist_tile 6.0 \ +package ifneeded tablelist_tile 6.0.1 \ [list source [file join $dir tablelist_tile.tcl]] # # Aliases: # -package ifneeded Tablelist 6.0 \ - [list package require -exact tablelist 6.0] -package ifneeded Tablelist_tile 6.0 \ - [list package require -exact tablelist_tile 6.0] +package ifneeded Tablelist 6.0.1 \ + [list package require -exact tablelist 6.0.1] +package ifneeded Tablelist_tile 6.0.1 \ + [list package require -exact tablelist_tile 6.0.1] # # Code common to all packages: # -package ifneeded tablelist::common 6.0 \ +package ifneeded tablelist::common 6.0.1 \ "namespace eval ::tablelist { proc DIR {} {return [list $dir]} } ;\ source [list [file join $dir tablelistPublic.tcl]]" diff --git a/modules/tablelist/tablelist.tcl b/modules/tablelist/tablelist.tcl index d3c0b306..dd8784f7 100644 --- a/modules/tablelist/tablelist.tcl +++ b/modules/tablelist/tablelist.tcl @@ -1,12 +1,12 @@ #============================================================================== # Main Tablelist package module. # -# Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== package require Tcl 8 package require Tk 8 -package require -exact tablelist::common 6.0 +package require -exact tablelist::common 6.0.1 package provide tablelist $::tablelist::version package provide Tablelist $::tablelist::version diff --git a/modules/tablelist/tablelistPublic.tcl b/modules/tablelist/tablelistPublic.tcl index 2644d381..f64a735b 100644 --- a/modules/tablelist/tablelistPublic.tcl +++ b/modules/tablelist/tablelistPublic.tcl @@ -1,7 +1,7 @@ #============================================================================== # Main Tablelist and Tablelist_tile package module. # -# Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== namespace eval ::tablelist { @@ -24,7 +24,7 @@ namespace eval ::tablelist { # # Public variables: # - variable version 6.0 + variable version 6.0.1 variable library if {$tcl_version >= 8.4} { set library [file normalize [DIR]] diff --git a/modules/tablelist/tablelist_tile.tcl b/modules/tablelist/tablelist_tile.tcl index 91231ae5..8ef39fde 100644 --- a/modules/tablelist/tablelist_tile.tcl +++ b/modules/tablelist/tablelist_tile.tcl @@ -1,7 +1,7 @@ #============================================================================== # Main Tablelist_tile package module. # -# Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== package require Tcl 8.4 @@ -9,7 +9,7 @@ package require Tk 8.4 if {$::tk_version < 8.5 || [regexp {^8\.5a[1-5]$} $::tk_patchLevel]} { package require tile 0.6 } -package require -exact tablelist::common 6.0 +package require -exact tablelist::common 6.0.1 package provide tablelist_tile $::tablelist::version package provide Tablelist_tile $::tablelist::version From 38ce4376a2e5aeb7f03fc24653337ad1d0d54ed5 Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 8 Jan 2018 21:00:41 +0000 Subject: [PATCH 030/150] * CHANGES.txt: Updated to reflect the changes. --- modules/tablelist/CHANGES.txt | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/modules/tablelist/CHANGES.txt b/modules/tablelist/CHANGES.txt index c957cead..460d8128 100644 --- a/modules/tablelist/CHANGES.txt +++ b/modules/tablelist/CHANGES.txt @@ -1,5 +1,15 @@ -What is new in Tablelist 6.0? ------------------------------ +What is new in Tablelist 6.0.1? +------------------------------- + +This is a bugfix-only release. The only corrected file in the +"scripts" directory is "tablelistUtil.tcl": inserted the missing closed +bracket in line #6448. This fix eliminates a regression related to both +temporarily and persistently embedded Tk checkbuttons on Windows, +introduced in the previous Tablelist version (thanks to Johann +Oberdorfer for his bug report). + +What was new in Tablelist 6.0? +------------------------------ 1. Added support for header items (aka title rows) with the aid of the new "header", "headerpath", and "headertag" subcommands. The first From 00a1243e00e3c4e9885085faa97f563b62360c35 Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 8 Jan 2018 21:01:32 +0000 Subject: [PATCH 031/150] * scripts/tablelistUtil.tcl: Inserted the missing "]""in line #6448. --- modules/tablelist/scripts/tablelistUtil.tcl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/tablelist/scripts/tablelistUtil.tcl b/modules/tablelist/scripts/tablelistUtil.tcl index a8040f27..1e5b3a80 100644 --- a/modules/tablelist/scripts/tablelistUtil.tcl +++ b/modules/tablelist/scripts/tablelistUtil.tcl @@ -6,7 +6,7 @@ # - Public utility procedure # - Private utility procedures # -# Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # @@ -6445,7 +6445,7 @@ proc tablelist::makeCheckbutton w { win32 { $frm configure -width 13 -height 13 $w configure -borderwidth 0 -font {"MS Sans Serif" 8} - switch [winfo reqheight $w { + switch [winfo reqheight $w] { 17 { set y -1 } 20 { set y -3 } 25 { set y -5 } From 18d88b4f027278be1d80700af1272d06322d146a Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 8 Jan 2018 21:24:55 +0000 Subject: [PATCH 032/150] * *.tcl: Bumped the version number to 6.0.1. * COPYRIGHT.txt: * README.txt: * doc/index.html: * doc/tablelist.html: * CHANGES.txt: Updated to reflect the changes. * scripts/tablelistUtil.tcl: Inserted the missing "]" in line #6448. --- modules/tablelist/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tablelist/ChangeLog b/modules/tablelist/ChangeLog index 0b180977..944430b0 100644 --- a/modules/tablelist/ChangeLog +++ b/modules/tablelist/ChangeLog @@ -8,7 +8,7 @@ * CHANGES.txt: Updated to reflect the changes. - * scripts/tablelistUtil.tcl: Inserted the missing "]""in line #6448. + * scripts/tablelistUtil.tcl: Inserted the missing "]" in line #6448. 2017-12-06 Csaba Nemethi From 7bb9e94fe4632757e1e23468c59112a53f217861 Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 8 Jan 2018 21:27:25 +0000 Subject: [PATCH 033/150] * scripts/tablelistUtil.tcl: Inserted the missing "]" in line #6448. From c41fec5b1fce84b0cd5ae4c535d09ea52ff2ecf5 Mon Sep 17 00:00:00 2001 From: Keith Nash Date: Sat, 27 Jan 2018 15:51:08 +0000 Subject: [PATCH 034/150] Update ntext to 1.0b2. See modules/ntext/ChangeLog for details. --- examples/ntext/ntextDemoBindings.tcl | 3 +- examples/ntext/ntextDemoIndent.tcl | 62 +- examples/ntext/ntextDemoMacScrolling.tcl | 4 +- examples/ntext/ntextDemoScroll.tcl | 109 +++ examples/ntext/ntextExample.tcl | 3 +- modules/ntext/ChangeLog | 26 + modules/ntext/ntext.man | 43 +- modules/ntext/ntext.tcl | 1039 ++++++++++++++-------- modules/ntext/ntextBindings.man | 20 +- modules/ntext/ntextIndent.man | 54 +- modules/ntext/pkgIndex.tcl | 2 +- 11 files changed, 967 insertions(+), 398 deletions(-) create mode 100755 examples/ntext/ntextDemoScroll.tcl diff --git a/examples/ntext/ntextDemoBindings.tcl b/examples/ntext/ntextDemoBindings.tcl index b748df08..0ed827d9 100755 --- a/examples/ntext/ntextDemoBindings.tcl +++ b/examples/ntext/ntextDemoBindings.tcl @@ -4,7 +4,7 @@ exec tclsh "$0" "$@" package require Tk -# Copyright (c) 2005-2017 Keith Nash. +# Copyright (c) 2005-2018 Keith Nash. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. @@ -14,6 +14,7 @@ package require Tk ### For a short example, see ntextExample.tcl ### To explore ntext indentation, try ntextDemoIndent.tcl ### To explore vertical scrolling on the Mac, try ntextDemoMacScrolling.tcl +### For corner cases in scrolling, try ntextDemoScroll.tcl # This string defines the text that will be displayed in each widget: set message {QOTW: "C/C++, which is used by 16% of users, is the most popular programming language, but Tcl, used by 0%, seems to be the language of choice for the highest scoring users." diff --git a/examples/ntext/ntextDemoIndent.tcl b/examples/ntext/ntextDemoIndent.tcl index 9aa631a7..057d38a9 100755 --- a/examples/ntext/ntextDemoIndent.tcl +++ b/examples/ntext/ntextDemoIndent.tcl @@ -4,7 +4,7 @@ exec tclsh "$0" "$@" package require Tk -# Copyright (c) 2005-2017 Keith Nash. +# Copyright (c) 2005-2018 Keith Nash. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. @@ -14,20 +14,25 @@ package require Tk ### For a short example, see ntextExample.tcl ### To explore the ntext options, try ntextDemoBindings.tcl ### To explore vertical scrolling on the Mac, try ntextDemoMacScrolling.tcl +### For corner cases in scrolling, try ntextDemoScroll.tcl ### - Points to note when using ntext's indent facilities are commented and -### numbered (1) to (6). +### numbered (1) to (8). ### - If the text in your widget is manipulated only by the keyboard and mouse, ### then (1), (2) and (3) are all you need to do. ### - If the text or its layout are manipulated by the script, then you also -### need to call the function ::ntext::wrapIndent - see comments (4) to (6), +### need to call the function ::ntext::wrapIndent - see comments (4) to (8), ### and the man page for ntextIndent. # This string defines the text that will be displayed in each widget: -set message { This demo shows ntext's indentation facilities. These are switched off by default, but in this demo they have been switched on. +set message { This demo shows ntext's indentation facilities. These are switched off by default, but in this demo they have been switched on. To try the demo - place the cursor at the start of a paragraph and change the amount of initial space. The paragraph is a logical line of text; its first display line may have leading whitespace, and ntext indents any subsequent (wrapped) display lines to match the first. + This paragraph is indented by a tab. Again, the display lines are all indented to match the first. + + Colored indents are possible in Tk 8.6.6 and above. To remove coloring, set the color to the empty string. + Try any text-widget operation, and test whether ntext's handling of display line indentation is satisfactory. Ntext is part of Tklib - please report any bugs to: http://core.tcl.tk/tklib/reportlist @@ -53,7 +58,7 @@ bindtags .rhf.new {.rhf.new Ntext . all} ### (3) Set the widget to '-wrap word' mode: .rhf.new configure -wrap word -undo 1 -.rhf.new configure -width 42 -height 26 -font {{Courier} -15} -bg white +.rhf.new configure -width 42 -height 32 -font {{Courier} -15} -bg white .rhf.new insert end " I use the Ntext bindings.\n\n$message" .rhf.new edit separator @@ -66,7 +71,7 @@ bindtags .rhf.new {.rhf.new Ntext . all} pack [frame .lhf -bg $col] -side left -anchor ne pack [text .lhf.classic ] -padx 2 -.lhf.classic configure -width 42 -height 26 -wrap word -undo 1 -font {{Courier} -15} -bg #FFFFCC +.lhf.classic configure -width 42 -height 32 -wrap word -undo 1 -font {{Courier} -15} -bg #FFFFCC .lhf.classic insert end " I use the (default) Text bindings.\n\n$message" .lhf.classic edit separator pack [label .lhf.m -bg $col -text "(The radiobuttons and tab settings do not\napply to the left-hand text widget)"] @@ -79,18 +84,49 @@ pack [radiobutton .rhf.h.on -bg $col -text "Indent On" -variable ::ntext::clas pack [label .rhf.h.l -bg $col -text "Switch indentation on/off: "] -side right pack [frame .rhf.g -bg $col] -anchor ne -pack [label .rhf.g.l -bg $col -text " "] -side right -pack [entry .rhf.g.e -width 3] -side right -padx 5 -pack [button .rhf.g.b -bg $col -highlightbackground $col -text "Click to set tab spacing to value in box" -command changeTabs] -side right + +label .rhf.g.l1 -bg $col -text " " +entry .rhf.g.e1 -width 8 -bg white +button .rhf.g.b1 -bg $col -highlightbackground $col -text "Click to set indent color to value in box" -command changeColor + +grid .rhf.g.b1 .rhf.g.e1 .rhf.g.l1 -padx 3 -sticky w + +label .rhf.g.l2 -bg $col -text " " +entry .rhf.g.e2 -width 3 -bg white +button .rhf.g.b2 -bg $col -highlightbackground $col -text "Click to set tab spacing to value in box" -command changeTabs + +grid .rhf.g.b2 .rhf.g.e2 .rhf.g.l2 -padx 3 -sticky w + +.rhf.g.e2 insert end 8 +.rhf.g.e1 insert end $::ntext::indentColor + +proc changeColor {} { + set col [string trim [.rhf.g.e1 get]] + if {($col eq {}) || (![catch {winfo rgb .rhf.new $col}])} { + ### (6) Ensure future tags will use the new color: + set ::ntext::indentColor $col + + ### (7) Update existing tags to use the new color: + ::ntext::syncIndentColor .rhf.new + } else { + .rhf.g.e1 delete 0 end + .rhf.g.e1 insert end $::ntext::indentColor + } + return +} proc changeTabs {} { - set nTabs [.rhf.g.e get] - if {[string is integer -strict $nTabs] && $nTabs > 0} { - set font [lindex [.rhf.new configure -font] 4] + set nTabs [string trim [.rhf.g.e2 get]] + if {[string is integer -strict $nTabs] && ($nTabs > 0)} { + set font [.rhf.new cget -font] .rhf.new configure -tabs "[expr {$nTabs * [font measure $font 0]}] left" - ### (6) Changing the tabs may change the indentation of the first + ### (8) Changing the tabs may change the indentation of the first ### display line of a logical line; if so, the indentation of the ### other display lines must be recalculated: ::ntext::wrapIndent .rhf.new + } else { + .rhf.g.e2 delete 0 end + .rhf.g.e2 insert end [.rhf.new cget -tabs] } + return } diff --git a/examples/ntext/ntextDemoMacScrolling.tcl b/examples/ntext/ntextDemoMacScrolling.tcl index 648976f0..e8bfdd48 100755 --- a/examples/ntext/ntextDemoMacScrolling.tcl +++ b/examples/ntext/ntextDemoMacScrolling.tcl @@ -4,7 +4,7 @@ exec tclsh "$0" "$@" package require Tk -# Copyright (c) 2005-2017 Keith Nash. +# Copyright (c) 2005-2018 Keith Nash. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. @@ -14,6 +14,8 @@ package require Tk ### For a short example, see ntextExample.tcl ### To explore ntext indentation, try ntextDemoIndent.tcl ### To explore the ntext options, try ntextDemoBindings.tcl +### For corner cases in scrolling, try ntextDemoScroll.tcl + # This string defines the text that will be displayed in each widget: set message {Ntext tries to offer a user experience that is as close as possible to the native "look and feel" of each platform. diff --git a/examples/ntext/ntextDemoScroll.tcl b/examples/ntext/ntextDemoScroll.tcl new file mode 100755 index 00000000..f4c46513 --- /dev/null +++ b/examples/ntext/ntextDemoScroll.tcl @@ -0,0 +1,109 @@ +#!/bin/sh +# the next line restarts using tclsh \ +exec tclsh "$0" "$@" + +package require Tk + +# Copyright (c) 2005-2018 Keith Nash. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. + +### This demo explores corner cases in scrolling (with thanks to Gregor Cramer +### and Francois Vogel for revised_text). + +### For a short example, see ntextExample.tcl +### To explore the ntext options, try ntextDemoBindings.tcl +### To explore ntext indentation, try ntextDemoIndent.tcl +### To explore vertical scrolling on the Mac, try ntextDemoMacScrolling.tcl + +image create photo example -data { +R0lGODlhEAAQALMAAAAAAISEAMbGxv//AP////////////////////////////////////////// +/////yH5BAEAAAIALAAAAAAQABAAAAQ4UMhJq6Ug3wpm7xsHZqBFCsBADGTLrbCqllIaxzSKt3wm +A4GgUPhZAYfDEQuZ9ByZAVqPF6paLxEAOw== +} + +# This string defines the text that will be displayed in each widget: +set message1 { This demo tests scrolling with the scrollbars, keyboard or mousewheel. + + To allow lines to be partially visible, this line will use a different font size. + + Now show an embedded image. + + 1. Now some extra words to lengthen the text. + + 2. Now some extra words to lengthen the text.} +# End of string for widget text. + +set message2 { This demo has some very tall lines, and tests scrolling with the scrollbars, keyboard or mousewheel. + + To test scrolling with very tall lines, this line will use a huge font size. + + 1. Now some extra words to lengthen the text. + + 2. Now some extra words to lengthen the text. + + 3. Now some extra words to lengthen the text. + + 4. Now some extra words to lengthen the text. + + 5. Now some extra words to lengthen the text. + + Try any text-widget operation, and test whether ntext is satisfactory. Ntext is part of Tklib - please report any bugs to: + + http://core.tcl.tk/tklib/reportlist} +# End of string for widget text. + +package require ntext 1.0 + +### Indentation is disabled by default. Set this variable to 0 to enable it: +set ::ntext::classicWrap 0 + +# Activate the traditional "extra" bindings so these can be tested too: +set ::ntext::classicExtras 1 + +set col #e0dfde +. configure -bg $col + +proc textAndScroll {w col ht ft message bt {img {}}} { + frame $w -bg $col + pack [scrollbar $w.scroll -command [list $w.txt yview]] -fill y -side right + pack [text $w.txt -yscrollcommand [list $w.scroll set]] -fill both -side right -expand 1 + + bindtags $w.txt [list $w.txt $bt . all] + + if {$bt eq {Ntext}} { + set bg white + } else { + set bt Text + set bg #FFFFCC + } + + $w.txt configure -wrap word -undo 1 + $w.txt configure -width 42 -height $ht -font {{Courier} -15} -bg $bg + $w.txt insert end " I use the $bt bindings.\n\n$message" + $w.txt edit separator + + $w.txt tag add tall 5.0 6.0 + $w.txt tag configure tall -font $ft + + if {$img ne {}} { + $w.txt image create $img -image example + } + + if {$bt eq {Ntext}} { + ::ntext::wrapIndent $w.txt + } + return $w +} + +textAndScroll .topright $col 16 {{Courier} -17} $message1 Ntext 7.21 +textAndScroll .topleft $col 16 {{Courier} -17} $message1 Text 7.21 +textAndScroll .botright $col 10 {{Courier} -170} $message2 Ntext +textAndScroll .botleft $col 10 {{Courier} -170} $message2 Text +grid .topleft .topright -sticky nsew +grid .botleft .botright -sticky nsew -pady {10 0} +grid columnconfigure . all -weight 1 +grid columnconfigure . all -weight 1 +grid rowconfigure . 0 -weight 1 + diff --git a/examples/ntext/ntextExample.tcl b/examples/ntext/ntextExample.tcl index abf3c74d..97734dea 100755 --- a/examples/ntext/ntextExample.tcl +++ b/examples/ntext/ntextExample.tcl @@ -4,7 +4,7 @@ exec tclsh "$0" "$@" package require Tk -# Copyright (c) 2005-2017 Keith Nash. +# Copyright (c) 2005-2018 Keith Nash. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. @@ -15,6 +15,7 @@ package require Tk ### To explore the ntext options, try ntextDemoBindings.tcl ### To explore ntext indentation, try ntextDemoIndent.tcl ### To explore vertical scrolling on the Mac, try ntextDemoMacScrolling.tcl +### For corner cases in scrolling, try ntextDemoScroll.tcl . configure -bg #d0cfce diff --git a/modules/ntext/ChangeLog b/modules/ntext/ChangeLog index 5b8f2aff..beba3d13 100644 --- a/modules/ntext/ChangeLog +++ b/modules/ntext/ChangeLog @@ -1,3 +1,29 @@ +2018-01-26 Keith Nash + + * Update to correspond to current tk8.x/text.tcl -- + core-8-5-branch 2015-10-04 artifact [6af61544] check-in [55133bde] + core-8-6-branch 2017-09-22 artifact [24e611b8] check-in [ba5ef805] + trunk 2017-10-07 artifact [642cbaf3] check-in [429e2357] + revised_text 2018-01-15 artifact [a76837e9] check-in [74f86687] + * Adapt to work with revised_text. + * Add revisions made to Tk library/text.tcl since the last release + of ntext. + * When indenting word-wrapped lines, use the text widget tag option + -lmargincolor if available (i.e. for Tk 8.6.6 and above). Add command + ::ntext::syncIndentColor and variable ::ntext::indentColor for this + purpose. + * Add the option to use the block cursor when in "overwrite" mode. Make + this the default for Tk 8.5.12 or newer (earlier versions have a bug + in their block cursor). + * Generate a <> event when the PRIMARY selection changes + as a result of an "insert" or "delete" operation, in older versions of + Tk. (This missing feature is added to the text widget itself in + Tk 8.6.9.) + * Add a new example for unusual scrolling cases identified in + revised_text. + * Update docs and examples. + * Increase version to 1.0b2 + 2017-03-31 Keith Nash * Update to correspond to current tk8.x/text.tcl -- diff --git a/modules/ntext/ntext.man b/modules/ntext/ntext.man index 850ca5fd..82277d5a 100644 --- a/modules/ntext/ntext.man +++ b/modules/ntext/ntext.man @@ -13,7 +13,7 @@ The purpose of the [package ntext] package is to make the text widget behave mor The package provides a binding tag named [emph Ntext] for use by text widgets in place of the default [emph Text] binding tag. [para] -Package [package ntext] 's functions and variables are contained entirely in the [var ::ntext] namespace; its other code is contained in the binding tag [emph Ntext]. [package ntext] has no exports to the global or other namespaces, and no new widget commands. It uses modified copies of the Tk code, leaving the original code, and the [emph Text] binding tag, unchanged. +Package [package ntext] 's functions and variables are contained entirely in the [var ::ntext] namespace; its other code is contained in the binding tag [emph Ntext]. [package ntext] has no exports to the global or other namespaces, and no new widget commands. It uses modified copies of the [package Tk] code, leaving the original code, and the [emph Text] binding tag, unchanged. [comment {use emph instead of term, because term creates a hyperlink, and ntext, Ntext and Text occur in almost every sentence: the page would be covered with the same hyperlinks many times}] [para] @@ -26,7 +26,7 @@ The differences between the [emph Ntext] binding tag and the default [emph Text] [item] When a logical line with leading whitespace is word-wrapped onto more than one display line, the wrapped display lines begin further to the left than the first display line, which can make the text layout untidy and difficult to read. [emph Ntext] can indent the wrapped lines to match the leading whitespace of the first display line (this facility is switched off by default). For details see [term ntextIndent]. -[item] When the user navigates or selects text, Tcl/Tk sometimes needs to detect word boundaries. [emph Ntext] provides improved rules for word boundary detection. For details see [term ntextWordBreak]. +[item] When the user navigates or selects text, [const Tcl/Tk] sometimes needs to detect word boundaries. [emph Ntext] provides improved rules for word boundary detection. For details see [term ntextWordBreak]. [list_end] @@ -52,6 +52,10 @@ Replacement for ::tk_textCut that also maintains [emph Ntext] indentation (see [ Replacement for ::tk_textPaste that also maintains [emph Ntext] indentation (see [term ntextIndent]). +[call [cmd ::ntext::syncIndentColor] [arg pathName]] + +Command to apply the current value of the variable [var ::ntext::indentColor] to existing lines in a text widget. This command is useful if a text widget has been created, text has been inserted in the widget, [emph {and then}] the value of [var ::ntext::indentColor] is changed (see [term ntextIndent]). + [list_end] [section {CONFIGURATION OPTIONS}] @@ -92,6 +96,18 @@ The behaviour of [emph Ntext] may be configured application-wide by setting the [item] For more information see [term ntextBindings] [list_end] + +[para] +[var ::ntext::classicParagraphs] +[list_begin itemized] +[item] + [const 0] - (default value) on macOS Aqua, certain keyboard bindings are made to behave in the same way as the Mac application TextEdit. The bindings involve vertical scrolling of the screen and are . +[item] + [const 1] - on macOS Aqua, certain keyboard bindings are made to behave in the same way as classic [emph Text], ignoring the conventions of Aqua. The bindings involve vertical scrolling of the screen and are . +[item] + For more information see [term ntextBindings] +[list_end] + [para] [var ::ntext::classicSelection] [list_begin itemized] @@ -123,6 +139,20 @@ The behaviour of [emph Ntext] may be configured application-wide by setting the For more information see [term ntextIndent] [list_end] [para] +[var ::ntext::indentColor] +[list_begin itemized] +[item] + [const {{}}] - if the value is the empty string, then the indent of wrapped display lines has the same color as the widget background. +[item] + [emph color] - a valid [package Tk] color to use for the indent of wrapped display lines (default value [emph #d9d9d9]). +[para] + Coloring is implemented with the text widget tag option [arg -lmargincolor], which is available from [package Tk] 8.6.6 onwards. [emph Ntext] indent coloring has no effect in earlier versions of [package Tk]. +[para] + The value of [var ::ntext::indentColor] will often be set at startup. If the value is changed when text widgets already exist and contain text, those widgets can be updated by calling command [cmd ::ntext::syncIndentColor]. +[item] + For more information see [term ntextIndent] +[list_end] +[para] [var ::ntext::overwrite] [list_begin itemized] [item] @@ -134,13 +164,16 @@ The behaviour of [emph Ntext] may be configured application-wide by setting the [item] For more information see [term ntextBindings] [list_end] + [para] -[var ::ntext::classicParagraphs] +[var ::ntext::useBlockCursor] [list_begin itemized] [item] - [const 0] - (default value) on macOS Aqua, certain keyboard bindings are made to behave in the same way as the Mac application TextEdit. The bindings involve vertical scrolling of the screen and are . + [const 0] - the block cursor will not be used. When the widget is in [emph overwrite] mode (see [const ::ntext::overwrite]), the ordinary cursor will change color instead. [item] - [const 1] - on macOS Aqua, certain keyboard bindings are made to behave in the same way as classic [emph Text], ignoring the conventions of Aqua. The bindings involve vertical scrolling of the screen and are . + [const 1] - the block cursor will be used when the widget is in [emph overwrite] mode (see [const ::ntext::overwrite]). +[item] + The default value depends on the version of [const Tk]. In versions of [const Tk] earlier than [const 8.5.12], the sizing of the block cursor had a bug, and [var ::ntext::useBlockCursor] defaults to [const 0]. From [const 8.5.12] onwards the bug is fixed, and [var ::ntext::useBlockCursor] defaults to [const 1]. [item] For more information see [term ntextBindings] [list_end] diff --git a/modules/ntext/ntext.tcl b/modules/ntext/ntext.tcl index bd20c724..d04e331f 100644 --- a/modules/ntext/ntext.tcl +++ b/modules/ntext/ntext.tcl @@ -7,7 +7,8 @@ # Copyright (c) 1992-1994 The Regents of the University of California. # Copyright (c) 1994-1997 Sun Microsystems, Inc. # Copyright (c) 1998 by Scriptics Corporation. -# Copyright (c) 2005-2017 additions by Keith Nash. +# Copyright (c) 2015-2017 Gregor Cramer +# Copyright (c) 2005-2018 additions by Keith Nash. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. @@ -15,14 +16,39 @@ ##### START OF CODE THAT IS MODIFIED from the following versions of text.tcl: # +# tag 8-6-8 +# 2017-09-22 artifact [24e611b8] part of check-in [16815561] & [ba5ef805] # branch core-8-6-branch -# 2015-10-09 artifact [e9c33ef1] part of check-in [553899e9] +# 2017-09-22 artifact [24e611b8] part of check-in [8cc5e98d] & [ba5ef805] # branch core-8-5-branch -# 2015-10-04 artifact [6af61544] part of check-in [55133bde] +# 2015-10-04 artifact [6af61544] part of check-in [ffd695c5] & [55133bde] # trunk -# 2016-09-27 artifact [530d3c1b] part of check-in [6b21cc27] -# -# Not yet adapted to revised text widget by Gregor Cramer, or to Androwish. +# 2017-10-07 artifact [642cbaf3] part of check-in [06baa487] & [429e2357] +# branch revised_text +# 2018-01-15 artifact [a76837e9] part of check-in [74f86687] +# +# Not yet adapted to Androwish. + + +########################################################################## +# TODO: (from revised_text's text.tcl) +# Currently we cannot use identifier "begin" for very first index, because +# it has still lowest precedence, and this may clash if the application is +# using this identifier for marks. In a later version of this file all +# occurences of "1.0" should be replaced with "begin", as soon as "begin" +# has highest precedence. +########################################################################## +# TODO: (revised_text with Ntext) +# - Ntext tries to be compatible with all versions of Tk from 8.5 onwards. +# - Therefore Ntext sometimes keeps "unrevised text" code when this has +# been replaced with a simpler equivalent in revised_text's text.tcl. +# - In other places Ntext uses [catch] to test for revised_text before +# using its facilities. +# - Ntext does not use some revised_text code - these (and some other) +# places can be discovered by searching for "revised_text". +# - Any Ntext code that breaks revised_text facilities (e.g. "watch") is +# considered a bug. Please report such bugs using the tklib tracker. +########################################################################## #------------------------------------------------------------------------- # Elements of ::tk::Priv that are used in this file: @@ -47,7 +73,7 @@ #------------------------------------------------------------------------- -#------------------------------------------------------------------------------- +# ------------------------------------------------------------------------------ # ntext no longer uses private commands ::tk::* from tk8.x/text.tcl. Any # necessary commands are defined below in the ::ntext namespace, even if the # corresponding ::tk::* command from tk8.x/text.tcl is identical. This makes @@ -56,7 +82,28 @@ # ntext still uses the private array ::tk::Priv (shared with text.tcl etc) and # the private command ::tk::GetSelection (from tk.tcl). There is a small risk # of breakage if one of these private items is altered in Tk. -#------------------------------------------------------------------------------- +# ------------------------------------------------------------------------------ + +# ------------------------------------------------------------------------------ +# <> events +# ------------------------------------------------------------------------------ +# - The text widget generates a <> event when the "selection" method +# changes the selected text. +# - For Tk earlier than 8.6.9, the text widget does not generate this event when +# the selection range is changed by an "insert" or "delete" method. +# - When using "insert" or "delete" methods with these earlier versions of Tk, +# it is the responsibility of the programmer to generate <> events +# if they are needed. This bug was fixed in Tk 8.6.9. +# - The Ntext bindings mostly handle these cases appropriately (usually by using +# the "tag" method to remove the selection, thereby generating a <> +# event). +# - In a few cases, a binding that calls an "insert" or "delete" method changes +# the selection without causing the widget to generate a <> event. +# In these cases an "event generate" command has been added to the script. +# - The bindings affected are: , <>, <>. +# - The variable $::ntext::GenerateSelect records whether the version of Tk +# requires these bindings to generate <> events. +# ------------------------------------------------------------------------------ package require Tcl 8.5 package require Tk 8.5 @@ -325,7 +372,7 @@ switch -exact -- [tk windowingsystem] { bind Ntext <1> { set ::ntext::Bcount 1 ntext::TextButton1 %W %x %y - %W tag remove sel 0.0 end + %W tag remove sel 1.0 end } bind Ntext { set tk::Priv(x) %x @@ -342,7 +389,7 @@ bind Ntext { if {$::ntext::Bcount != 1} { set ::ntext::Bcount 1 ntext::TextButton1 %W %x %y - %W tag remove sel 0.0 end + %W tag remove sel 1.0 end } set ::ntext::Bcount 2 set tk::Priv(selectMode) word @@ -446,7 +493,9 @@ bind Ntext { bind Ntext { # nothing } # stop an accidental movement triggering bind Ntext { # nothing } - +# revised_text uses displaychars not displayindices in <>, +# <> <> <>. Ntext keeps +# displayindices so cursor navigation does not ignore embedded windows/images. bind Ntext <> { ntext::AdjustInsert %W left ntext::TextSetCursor %W insert-1displayindices @@ -471,10 +520,10 @@ bind Ntext <> { ntext::TextKeySelect %W [%W index {insert + 1displayindices}] } bind Ntext <> { - ntext::TextKeySelect %W [ntext::TextUpDownLine %W -1] + ntext::TextKeySelect %W [ntext::TextUpDownLine %W -1 yes] } bind Ntext <> { - ntext::TextKeySelect %W [ntext::TextUpDownLine %W 1] + ntext::TextKeySelect %W [ntext::TextUpDownLine %W 1 yes] } bind Ntext <> { ntext::AdjustInsert %W left @@ -564,7 +613,7 @@ bind Ntext { } } bind Ntext { - # Needed only to keep binding from triggering; doesn't + # Needed only to keep binding from triggering; doesn't # have to actually do anything. break } @@ -580,46 +629,60 @@ bind Ntext { } } bind Ntext { - ntext::TextInsert %W \n - if {[%W cget -autoseparators]} { - %W edit separator - } -} -bind Ntext { - if {[ntext::TextCursorInSelection %W]} { - # When deleting the selection, make this an atomic operation on the Undo - # stack, i.e. separate it from other delete operations on either side. + if {[%W cget -state] eq "normal"} { + ntext::TextInsert %W \n if {[%W cget -autoseparators]} { %W edit separator - } else { } - set ::ntext::OldFirst [%W index sel.first] - %W delete sel.first sel.last - ntext::AdjustIndentOneLine %W $::ntext::OldFirst - if {[%W cget -autoseparators]} { - %W edit separator - } else { + } +} +bind Ntext { + if {[%W cget -state] eq "normal"} { + if {[ntext::TextCursorInSelection %W]} { + # When deleting the selection, make this an atomic operation on the Undo + # stack, i.e. separate it from other delete operations on either side. + if {[%W cget -autoseparators]} { + %W edit separator + } else { + } + set ::ntext::OldFirst [%W index sel.first] + ntext::TextDelete %W sel.first sel.last + ntext::AdjustIndentOneLine %W $::ntext::OldFirst + if {[%W cget -autoseparators]} { + %W edit separator + } else { + } + if {$::ntext::GenerateSelect} { + # The PRIMARY selection has changed but the widget does + # not generate this event. + event generate %W <> + } else { + } + } elseif {[%W compare end != insert+1i]} { + %W delete insert + ntext::AdjustIndentOneLine %W insert } - } elseif {[%W compare end != insert+1c]} { - %W delete insert - ntext::AdjustIndentOneLine %W insert + %W see insert } - %W see insert } bind Ntext { - if {[ntext::TextCursorInSelection %W]} { - set ::ntext::OldFirst [%W index sel.first] - %W delete sel.first sel.last - ntext::AdjustIndentOneLine %W $::ntext::OldFirst - } elseif {[%W compare insert != 1.0]} { - %W delete insert-1c - ntext::AdjustIndentOneLine %W insert + if {[%W cget -state] eq "normal"} { + if {[ntext::TextCursorInSelection %W]} { + set ::ntext::OldFirst [%W index sel.first] + ntext::TextDelete %W sel.first sel.last + ntext::AdjustIndentOneLine %W $::ntext::OldFirst + } elseif {[%W compare insert != 1.0]} { + # ensure that this operation is triggering "watch" + %W mark set insert insert-1i + %W delete insert + ntext::AdjustIndentOneLine %W insert + } + %W see insert } - %W see insert } # This is present in early versions of -# 8.5 and intercepts the Shift-Backspace event. +# 8.5 and intercepts the event. catch {bind Ntext { if {[ntext::TextCursorInSelection %W]} { set ::ntext::OldFirst [%W index sel.first] @@ -673,36 +736,31 @@ bind Ntext <> { ntext::new_textPaste %W } bind Ntext <> { - # Make <> an atomic operation on the Undo stack, - # i.e. separate it from other delete operations on either side - if {[%W tag nextrange sel 1.0 end] ne ""} { - if {[%W cget -autoseparators]} { - %W edit separator - } - set ::ntext::OldFirst [%W index sel.first] - %W delete sel.first sel.last - ntext::AdjustIndentOneLine %W $::ntext::OldFirst - if {[%W cget -autoseparators]} { - %W edit separator + if {[%W cget -state] eq "normal"} { + # Make <> an atomic operation on the Undo stack, + # i.e. separate it from other delete operations on either side + if {[%W tag nextrange sel 1.0 end] ne ""} { + if {[%W cget -autoseparators]} { + %W edit separator + } + set ::ntext::OldFirst [%W index sel.first] + ntext::TextDelete %W sel.first sel.last + ntext::AdjustIndentOneLine %W $::ntext::OldFirst + if {[%W cget -autoseparators]} { + %W edit separator + } } } } bind Ntext <> { - if {$tk_strictMotif || ![info exists tk::Priv(mouseMoved)] - || !$tk::Priv(mouseMoved)} { + if {$tk_strictMotif || ![info exists tk::Priv(mouseMoved)] || !$tk::Priv(mouseMoved)} { ntext::TextPasteSelection %W %x %y } } # Implement Insert/Overwrite modes bind Ntext { set ntext::overwrite [expr !$ntext::overwrite] -# This behaves strangely on a newline or tab: -# %W configure -blockcursor $ntext::overwrite - if {$ntext::overwrite} { - %W configure -insertbackground red - } else { - %W configure -insertbackground black - } + ::ntext::DefineCursor %W } bind Ntext { ntext::TextInsert %W %A @@ -718,7 +776,7 @@ bind Ntext {# nothing} bind Ntext {# nothing} # Make Escape clear the selection bind Ntext { - %W tag remove sel 0.0 end + %W tag remove sel 1.0 end if {[%W cget -autoseparators]} { %W edit separator } @@ -731,15 +789,15 @@ if {[tk windowingsystem] eq "aqua"} { # Additional Emacs-like bindings: # cf. , but not fixed for TextCursorInSelection and no see bind Ntext { - if {$::ntext::classicExtras && !$tk_strictMotif && - [%W compare end != insert+1c]} { + if {[%W cget -state] eq "normal" && $::ntext::classicExtras && !$tk_strictMotif && + [%W compare end != insert+1i]} { %W delete insert ntext::AdjustIndentOneLine %W insert } } bind Ntext { - if {$::ntext::classicExtras && !$tk_strictMotif && - [%W compare end != insert+1c]} { + if {[%W cget -state] eq "normal" && $::ntext::classicExtras && !$tk_strictMotif && + [%W compare end != insert+1i]} { if {[%W compare insert == {insert lineend}]} { %W delete insert } else { @@ -749,9 +807,9 @@ bind Ntext { } } bind Ntext { - if {$::ntext::classicExtras && !$tk_strictMotif} { + if {[%W cget -state] eq "normal" && $::ntext::classicExtras && !$tk_strictMotif} { %W insert insert \n - %W mark set insert insert-1c + %W mark set insert insert-1i ntext::AdjustIndentOneLine %W "insert + 1 line" } } @@ -761,27 +819,29 @@ bind Ntext { } } bind Ntext <> { - # An Undo operation may remove the separator at the top of the Undo stack. - # Then the item at the top of the stack gets merged with the subsequent - # changes. - # Place separators before and after Undo to prevent this. - if {[%W cget -autoseparators]} { - %W edit separator - } - if {![catch { %W edit undo }]} { - # Cancel the selection so that Undo does not mess it up. - %W tag remove sel 0.0 end - # The undo stack does not record tags - so we need to reapply them. - ntext::AdjustIndentMultipleLines %W 1.0 end - } - if {[%W cget -autoseparators]} { - %W edit separator + if {[%W cget -state] eq "normal"} { + # An Undo operation may remove the separator at the top of the Undo stack. + # Then the item at the top of the stack gets merged with the subsequent + # changes. + # Place separators before and after Undo to prevent this. + if {[%W cget -autoseparators]} { + %W edit separator + } + if {![catch { %W edit undo }]} { + # Cancel the selection so that Undo does not mess it up. + %W tag remove sel 1.0 end + # The undo stack does not record tags - so we need to reapply them. + ntext::AdjustIndentMultipleLines %W 1.0 end + } + if {[%W cget -autoseparators]} { + %W edit separator + } } } bind Ntext <> { - if {![catch { %W edit redo }]} { + if {[%W cget -state] eq "normal" && ![catch { %W edit redo }]} { # Cancel the selection so that Redo does not mess it up. - %W tag remove sel 0.0 end + %W tag remove sel 1.0 end # The redo stack does not record tags - so we need to reapply them. ntext::AdjustIndentMultipleLines %W 1.0 end } @@ -798,7 +858,7 @@ bind Ntext { } } bind Ntext { - if {!$tk_strictMotif && [%W compare end != insert+1c]} { + if {!$tk_strictMotif && [%W compare end != insert+1i]} { %W delete insert [ntext::TextNextWord %W insert] ntext::AdjustIndentOneLine %W insert } @@ -818,22 +878,18 @@ bind Ntext { bind Ntext { if {!$tk_strictMotif} { #ntext::AdjustInsert %W right - ntext::TextSetCursor %W end-1c + ntext::TextSetCursor %W end-1i } } bind Ntext { - if {!$tk_strictMotif} { - %W delete \ - [ntext::TextPrevPos %W insert ntext::new_startOfPreviousWord] \ - insert + if {[%W cget -state] eq "normal" && !$tk_strictMotif} { + ntext::TextDelete %W [ntext::TextPrevPos %W insert ntext::new_startOfPreviousWord] insert } ntext::AdjustIndentOneLine %W insert } bind Ntext { - if {!$tk_strictMotif} { - %W delete \ - [ntext::TextPrevPos %W insert ntext::new_startOfPreviousWord] \ - insert + if {[%W cget -state] eq "normal" && !$tk_strictMotif} { + ntext::TextDelete %W [ntext::TextPrevPos %W insert ntext::new_startOfPreviousWord] insert } ntext::AdjustIndentOneLine %W insert } @@ -847,14 +903,11 @@ if {[tk windowingsystem] eq "aqua"} { # The cursor color indicates the insert/overwrite state. # Make sure it is in sync with the all-widgets value of ::ntext::overwrite. bind Ntext { - if {$ntext::overwrite} { - %W configure -insertbackground red - } else { - %W configure -insertbackground black - } + ::ntext::DefineCursor %W } } + # macOS/Aqua only bindings: # # The following virtual events are not defined on the macOS/Aqua platform: @@ -1103,9 +1156,14 @@ bind Ntext { # A few additional bindings of my own. # cf. , but not fixed for TextCursorInSelection bind Ntext { - if {$::ntext::classicExtras && (!$tk_strictMotif) - && [%W compare insert != 1.0]} { - %W delete insert-1c + if { ([%W cget -state] eq "normal") + && $::ntext::classicExtras + && (!$tk_strictMotif) + && [%W compare insert != 1.0] + } { + # ensure that this operation is triggering "watch" + %W mark set insert insert-1i + %W delete insert %W see insert ntext::AdjustIndentOneLine %W insert } @@ -1136,10 +1194,9 @@ if {[tk windowingsystem] eq "aqua"} { } set ::tk::Priv(prevPos) {} -# The MouseWheel will typically only fire on Windows and macOS/Aqua. -# However, someone could use the "event generate" command to produce one -# on other platforms. We must be careful not to round -ve values of %D -# down to zero. +# The MouseWheel events: + +# We must be careful not to round -ve values of %D down to zero. if {[tk windowingsystem] eq "aqua"} { bind Ntext { @@ -1162,18 +1219,10 @@ if {[tk windowingsystem] eq "aqua"} { # (int)-1/3 = -1 # The following code ensure equal +/- behaviour. bind Ntext { - if {%D >= 0} { - %W yview scroll [expr {-%D/3}] pixels - } else { - %W yview scroll [expr {(2-%D)/3}] pixels - } + %W yview scroll [expr {%D >= 0 ? -%D/3 : (2-%D)/3}] pixels } bind Ntext { - if {%D >= 0} { - %W xview scroll [expr {-%D/3}] pixels - } else { - %W xview scroll [expr {(2-%D)/3}] pixels - } + %W xview scroll [expr {%D >= 0 ? -%D/3 : (2-%D)/3}] pixels } } @@ -1181,7 +1230,7 @@ if {"x11" eq [tk windowingsystem]} { # Support for mousewheels on Linux/Unix commonly comes through mapping # the wheel to the extended buttons. If you have a mousewheel, find # Linux configuration info at: - # http://www.inria.fr/koala/colas/mouse-wheel-scroll/ + # http://linuxreviews.org/howtos/xfree/mouse/ bind Ntext <4> { if {!$tk_strictMotif} { %W yview scroll -50 pixels @@ -1189,7 +1238,7 @@ if {"x11" eq [tk windowingsystem]} { } bind Ntext <5> { if {!$tk_strictMotif} { - %W yview scroll 50 pixels + %W yview scroll +50 pixels } } bind Ntext { @@ -1199,7 +1248,7 @@ if {"x11" eq [tk windowingsystem]} { } bind Ntext { if {!$tk_strictMotif} { - %W xview scroll 50 pixels + %W xview scroll +50 pixels } } } @@ -1210,6 +1259,7 @@ bind Ntext { bind Ntext { unset -nocomplain ::ntext::OldSelectMode(%W) + unset -nocomplain ::ntext::OldInsertBackground(%W) } @@ -1255,12 +1305,21 @@ namespace eval ::ntext { # line according to the magnitude of its hanging (-lmargin2) indent. variable lm2IndentDebug 0 + # Color to use for the hanging (-lmargin2) indent itself. + # Set to {} for no color. + variable indentColor #d9d9d9 + + # Whether to use the -blockcursor when in "overwrite" mode (the alternative + # is a change of color). Defaults to YES iff 8.5.12 or over. For earlier + # versions a bug made the -blockcursor fill the whole of a newline. + variable useBlockCursor [expr {[package vsatisfies [package require Tk] 8.5.12-]}] + # When a keystroke cancels a selection, is the position of the insert mark # preserved, or does it jump to the "appropriate" end of the selection? if {[tk windowingsystem] eq "aqua"} { - variable classicSelection 0 + variable classicSelection 0 } else { - variable classicSelection 1 + variable classicSelection 1 } # Whether or not the macOS/Aqua bindings should use @@ -1278,10 +1337,12 @@ namespace eval ::ntext { # These variables are for internal use by ntext only. They should not be # modified by the user's script. - variable Bcount 0 - variable OldFirst {} + variable GenerateSelect [expr {![package vsatisfies [package require Tk] 8.6.9-]}] + variable Bcount 0 + variable OldFirst {} + # arrays: variable OldSelectMode - # array + variable OldInsertBackground if {[tk windowingsystem] eq "aqua"} { variable EmacsEvents { @@ -1332,25 +1393,25 @@ proc ::ntext::EmacsBindings {argVarName var2 action} { variable classicExtras if {$::ntext::classicExtras && !$::tk_strictMotif} { - set op add + set op add } else { - set op delete + set op delete } foreach {virtual real1 real2} $EmacsEvents { - event $op $virtual $real1 $real2 + event $op $virtual $real1 $real2 } if {[tk windowingsystem] eq "x11"} { - if {!$::tk_strictMotif} { - set op2 add - } else { - set op2 delete - } + if {!$::tk_strictMotif} { + set op2 add + } else { + set op2 delete + } - event $op2 <> - event $op2 <> - event $op2 <> + event $op2 <> + event $op2 <> + event $op2 <> } return @@ -1359,6 +1420,26 @@ proc ::ntext::EmacsBindings {argVarName var2 action} { # Trigger the trace, to call ::ntext::EmacsBindings for the first time. set ::tk_strictMotif $::tk_strictMotif + + +# ::tk::TextCursorPos -- +# Given x and y coordinates, this procedure computes the "cursor" +# position, and returns the index of the character at this position. +# +# Arguments: +# w - The text window. +# x - X-coordinate within the window. +# y - Y-coordinate within the window. + +proc ::ntext::TextCursorPos {w x y} { + if {[$w cget -blockcursor]} { + # If we have a block cursor, then use the actual x-position + # for cursor position. + return [$w index @$x,$y] + } + return [TextClosestGap $w $x $y] +} + # ::tk::TextClosestGap -- # Given x and y coordinates, this procedure finds the closest boundary # between characters to the given coordinates and returns the index @@ -1375,12 +1456,13 @@ set ::tk_strictMotif $::tk_strictMotif proc ::ntext::TextClosestGap {w x y} { set pos [$w index @$x,$y] set bbox [$w bbox $pos] - if {$bbox eq ""} { + if {[llength $bbox] == 0} { return $pos } if {($x - [lindex $bbox 0]) < ([lindex $bbox 2]/2)} { return $pos } + # Never return a position that will place the cursor on the next display # line. This used to happen if $x is closer to the end of the display line # than to its last character. @@ -1389,11 +1471,12 @@ proc ::ntext::TextClosestGap {w x y} { } else { set lineType lines } - if {[$w count -$lineType $pos "$pos + 1 char"] != 0} { + if {[$w count -$lineType $pos "$pos + 1i"] != 0} { return $pos } else { } - $w index "$pos + 1 char" + + $w index "$pos + 1i" } # ::tk::TextButton1 -- @@ -1412,33 +1495,51 @@ proc ::ntext::TextClosestGap {w x y} { proc ::ntext::TextButton1 {w x y} { variable ::tk::Priv - set Priv(selectMode) char - set Priv(mouseMoved) 0 - set Priv(pressX) $x - set anchorname [TextAnchor $w] - $w mark set insert [TextClosestGap $w $x $y] - $w mark set $anchorname insert - # Set the anchor mark's gravity depending on the click position - # relative to the gap - set bbox [$w bbox [$w index $anchorname]] - if {$x > [lindex $bbox 0]} { - $w mark gravity $anchorname right - } else { - $w mark gravity $anchorname left + # Catch the very special case with dead peers. + if {[catch {$w isdead} result] || !$result} { + set Priv(selectMode) char + set Priv(mouseMoved) 0 + set Priv(pressX) $x + + # "Wrong line" position adjustment - + # revised_text does it here, ntext does it in TextClosestGap. + $w mark set insert [TextCursorPos $w $x $y] + + set anchorname [TextAnchor $w] + $w mark set $anchorname insert +# # revised_text adjusts $anchorname (if -blockcursor) using +# # TextClosestGap. ntext does not do this. +# if {[$w cget -blockcursor]} { +# $w mark set $anchorname [TextClosestGap $w $x $y] +# } else { +# # this is already the closest gap +# $w mark set $anchorname insert +# } + + # Set the anchor mark's gravity depending on the click position + # relative to the gap. + set bbox [$w bbox $anchorname] + set gravity [expr {$x > [lindex $bbox 0] ? "right" : "left"}] + $w mark gravity $anchorname $gravity + + if {[$w cget -autoseparators]} { + $w edit separator + } } + # Allow focus in any case on Windows, because that will let the # selection be displayed even for state disabled text widgets. - if {[tk windowingsystem] eq "win32" \ - || [$w cget -state] eq "normal"} { + if {[tk windowingsystem] eq "win32" || [$w cget -state] eq "normal"} { focus $w } - if {[$w cget -autoseparators]} { - $w edit separator - } + return } -# If text.tcl is sufficiently recent to have ::tk::Priv(textanchoruid), this -# forces it to be initialized. + +# If text.tcl is sufficiently recent to have ::tk::Priv(textanchoruid), the +# code below forces it to be initialized. +# The revised_text text.tcl is even more recent, and does not use +# ::tk::Priv(textanchoruid). In that case, this initialization is harmless. catch {::tk::TextAnchor} if {[info exists ::tk::Priv(textanchoruid)]} { @@ -1449,13 +1550,28 @@ if {[info exists ::tk::Priv(textanchoruid)]} { # text.tcl may increment this variable but will not re-initialize it. } + # ::ntext::TextAnchor -- # Modified to use ::tk::Priv despite change of namespace. proc ::ntext::TextAnchor {w} { variable ::tk::Priv if {![info exists Priv(textanchor,$w)]} { - set Priv(textanchor,$w) tk::anchor[incr Priv(textanchoruid)] + if {[catch {$w mark generate} result]} { + # This is the "unrevised" text widget. + set Priv(textanchor,$w) tk::anchor[incr Priv(textanchoruid)] + } else { + # This is the revised_text text widget. + # This gives us a private mark, not visible with + # "mark names|next|previous|..". + set Priv(textanchor,$w) $result + # The Tk library still has a big weakness: it's not possible to + # bind variables to a widget, so we use a private command for this + # binding; this means that the variable will be unset automatically + # when the widget will be destroyed. This is the only proper way to + # handle unique identifiers. + $w tk_bindvar ::tk::Priv(textanchor,$w) + } } return $Priv(textanchor,$w) } @@ -1486,8 +1602,8 @@ proc ::ntext::RepelAnchor {w idx} { proc ::ntext::WordBounds {w lineType first last} { # Now find word boundaries - set first1 [$w index "$first + 1c"] - set last1 [$w index "$last - 1c"] + set first1 [$w index "$first + 1i"] + set last1 [$w index "$last - 1i"] if {[$w count -$lineType $first $first1] != 0} { set first1 [$w index $first] } else { @@ -1526,7 +1642,9 @@ proc ::ntext::WordBounds {w lineType first last} { # Note that the 'anchor' is implemented programmatically using # a text widget mark, and uses a name that will be unique for each # text widget (even when there are multiple peers). Currently the -# anchor is considered private to Tk, hence the name 'tk::anchor$i'. +# anchor is considered private to Tk, hence the name 'tk::anchor$i' in text, +# while in revised_text the name is [$w mark generate] and the anchor is not +# listed in [$w mark names]. # # Arguments: # w - The text window in which the button was pressed. @@ -1572,9 +1690,14 @@ proc ::ntext::WordBounds {w lineType first last} { proc ::ntext::TextSelectTo {w x y {extend 0}} { variable ::tk::Priv variable OldSelectMode + if {![catch {$w isdead} result] && $result} { + # revised_text + # Catch the very special case with dead peers. + return + } set anchorname [TextAnchor $w] - set cur [TextClosestGap $w $x $y] + set cur [TextCursorPos $w $x $y] if {[catch {$w index $anchorname}]} { $w mark set $anchorname $cur # Right gravity is set by default. @@ -1627,101 +1750,117 @@ proc ::ntext::TextSelectTo {w x y {extend 0}} { } } word { - # Set initial range based only on the anchor (1 char min width - - # MOD - unless this straddles a display line end) - if {[$w cget -wrap] eq "word"} { - set lineType displaylines + set start [$w index @$x,$y] + set isEmbedded [expr {[string length [$w get $start]] == 0}] + if {0 && $isEmbedded} { + # This is a revised_text feature, disabled here. It is useful + # with on an embedded item; but less helpful when + # is used to extend a selection. + # Don't extend the range if we have an embedded item at this + # position. + set first $start + set last "$first+1i" } else { - set lineType lines - } - # The gravity of the "selection anchor" mark. - # - The anchor's gravity is explicitly used only here. - # - In text.tcl the anchor mark's gravity is set by - # ::tk::TextButton1 depending on the click position relative to - # the gap. - # - In ntext.tcl, the anchor mark's gravity is also set in other - # places, to prevent inappropriate growth of the selection when - # the value is tested here. When the anchor is at an end of the - # selection, its gravity always faces the selected text. - # - The gravity of the insert mark, and of the ntext::* "recorded - # selection" marks, are never explicitly used, and their values - # are always "right". - if {[$w mark gravity $anchorname] eq "right"} { - set first $anchorname - set last "$anchorname + 1c" - if {[$w count -$lineType $first $last] != 0} { - set last $first + # Set initial range based only on the anchor (1 char min width - + # MOD - unless this straddles a display line end) + if {[$w cget -wrap] eq "word"} { + set lineType displaylines } else { + set lineType lines } - } else { - set first "$anchorname - 1c" - set last $anchorname - if {[$w count -$lineType $first $last] != 0} { + # The gravity of the "selection anchor" mark. + # - The anchor's gravity is explicitly used only here. + # - In text.tcl the anchor mark's gravity is set by + # ::tk::TextButton1 depending on the click position relative + # to the gap. + # - In ntext.tcl, the anchor mark's gravity is also set in other + # places, to prevent inappropriate growth of the selection + # when the value is tested here. When the anchor is at an end + # of the selection, its gravity always faces the selected + # text. + # - The gravity of the insert mark, and of the ntext::* + # "recorded selection" marks, are never explicitly used, and + # their values are always "right". + if {[$w mark gravity $anchorname] eq "right"} { + set first $anchorname + set last "$anchorname + 1i" + if {[$w count -$lineType $first $last] != 0} { + set last $first + } else { + } + } else { + set first "$anchorname - 1i" + set last $anchorname + if {[$w count -$lineType $first $last] != 0} { set first $last + } else { + } + } + if { [$w compare $last == $first] + && [$w compare $cur == $first] + } { + # Use $first and $last as above; further extension will + # straddle a display line. Better to have no selection than + # a bad one. + set StoreAnchors 1 } else { + set first0 $first + set last0 $last + if {$selectionExists && $OldSelectMode($w) eq "char"} { + # Do WordBounds calc but without cur. This computes the + # ntext::* anchor marks. This code is necessary if the + # user has used character selection to extend the + # selection, and then come here by using word selection. + # Compute ntext::* anchor marks on the transition from + # "char" to "word" selection. + lassign [WordBounds $w $lineType $first $last] first last + # The new selection will be a single word. + $w mark set ntext::left::$anchorname $first + $w mark set ntext::right::$anchorname $last + set OldSelectMode($w) word + set StoreAnchors 0 + } else { + set StoreAnchors 1 + } + + # Now do the conventional/text.tcl WordBounds calc with cur. + set first $first0 + set last $last0 + set extend 0 + # Extend range (if necessary) to include the current point. + if {[$w compare $cur < $first]} { + set first $cur + if { ($OldSelectMode($w) eq "line") + && [$w compare $last == "$last linestart"] + } { + # This kludge stops the selection growing by one + # word in the wrong direction. + set last "$last-1c" + set extend 1 + } else { + } + } elseif {[$w compare $cur > $last]} { + set last $cur + } + + lassign [WordBounds $w $lineType $first $last] first last + if {$extend} { + set last [$w index $last+1c] + } else { + } } - } - if {[$w compare $last == $first] && [$w compare $cur == $first]} { - # Use $first and $last as above; further extension will straddle - # a display line. Better to have no selection than a bad one. - set StoreAnchors 1 - } else { - set first0 $first - set last0 $last - if {$selectionExists && $OldSelectMode($w) eq "char"} { - # Do WordBounds calc but without cur. This computes the - # ntext::* anchor marks. This code is necessary if the user - # has used character selection to extend the selection, and - # then come here by using word selection. + if { (!$selectionExists) + && ($OldSelectMode($w) eq "char") + && $StoreAnchors + } { # Compute ntext::* anchor marks on the transition from # "char" to "word" selection. - lassign [WordBounds $w $lineType $first $last] first last # The new selection will be a single word. $w mark set ntext::left::$anchorname $first $w mark set ntext::right::$anchorname $last set OldSelectMode($w) word - set StoreAnchors 0 - } else { - set StoreAnchors 1 - } - - # Now do the conventional/text.tcl WordBounds calc with cur. - set first $first0 - set last $last0 - set extend 0 - # Extend range (if necessary) to include the current point - if {[$w compare $cur < $first]} { - set first $cur - if { ($OldSelectMode($w) eq "line") - && [$w compare $last == "$last linestart"] - } { - # This kludge stops the selection growing by one word in - # the wrong direction. - set last "$last-1c" - set extend 1 - } else { - } - } elseif {[$w compare $cur > $last]} { - set last $cur - } - - lassign [WordBounds $w $lineType $first $last] first last - if {$extend} { - set last [$w index $last+1c] - } else { } } - if { (!$selectionExists) - && ($OldSelectMode($w) eq "char") - && $StoreAnchors - } { - # Compute ntext::* anchor marks on the transition from "char" - # to "word" selection. - # The new selection will be a single word. - $w mark set ntext::left::$anchorname $first - $w mark set ntext::right::$anchorname $last - set OldSelectMode($w) word - } } line { if {$selectionExists && $OldSelectMode($w) eq "line"} { @@ -1744,15 +1883,15 @@ proc ::ntext::TextSelectTo {w x y {extend 0}} { if {[$w compare $cur < $first]} { set first "$cur linestart" } elseif {[$w compare $cur > $last]} { - set last "$cur lineend+1c" + set last "$cur lineend+1i" } set first [$w index $first] set last [$w index $last] } } if {$Priv(mouseMoved) || ($Priv(selectMode) ne "char")} { - # Set the insert mark and anchor to the ends of the selection. - # The insert mark is the end that is closest to the mouse position $cur. + # Set the insert mark and anchor to the ends of the selection. + # The insert mark is the end that is closest to the mouse position $cur. set distFirst [$w count -displaychars $first $cur] set distLast [$w count -displaychars $last $cur] if {abs($distFirst) < abs($distLast)} { @@ -1770,10 +1909,11 @@ proc ::ntext::TextSelectTo {w x y {extend 0}} { $w mark gravity $anchorname $newGrav # Rearrange operations so that selection is never full-empty-full. -# $w tag remove sel 0.0 end - $w tag add sel $first $last +# $w tag remove sel 1.0 end $w tag remove sel 1.0 $first + $w tag add sel $first $last $w tag remove sel $last end + update idletasks } return @@ -1808,6 +1948,8 @@ proc ::ntext::TextKeyExtend {w index} { if {[catch {$w index $anchorname}]} { $w mark set $anchorname $cur # Right gravity is set by default. + # revised_text sets left gravity. + # ntext sets gravity in the code below. } if {[$w compare $cur < $anchorname]} { @@ -1820,9 +1962,9 @@ proc ::ntext::TextKeyExtend {w index} { set grav right } # Rearrange operations so that selection is never full-empty-full. - # $w tag remove sel 0.0 $first + # $w tag remove sel 1.0 $first $w tag add sel $first $last - $w tag remove sel 0.0 $first + $w tag remove sel 1.0 $first $w tag remove sel $last end $w mark gravity $anchorname $grav return @@ -1840,24 +1982,13 @@ proc ::ntext::TextKeyExtend {w index} { # modified to set oldInsert and call AdjustIndentMultipleLines. proc ::ntext::TextPasteSelection {w x y} { - $w mark set insert [TextClosestGap $w $x $y] - set oldInsert [$w index insert] - if {![catch {::tk::GetSelection $w PRIMARY} sel]} { - set oldSeparator [$w cget -autoseparators] - if {$oldSeparator} { - $w configure -autoseparators 0 - $w edit separator - } - $w insert insert $sel - AdjustIndentMultipleLines $w $oldInsert insert - if {$oldSeparator} { - $w edit separator - $w configure -autoseparators 1 - } - } if {[$w cget -state] eq "normal"} { + # revised_text uses TextCursorPos instead of TextClosestGap. + $w mark set insert [TextClosestGap $w $x $y] + TextInsertSelection $w PRIMARY focus $w } + return } # ::tk::TextAutoScan -- @@ -1891,7 +2022,7 @@ proc ::ntext::TextAutoScan {w} { return } TextSelectTo $w $Priv(x) $Priv(y) - set Priv(afterId) [after 50 [list ntext::TextAutoScan $w]] + set Priv(afterId) [after 50 [list ::ntext::TextAutoScan $w]] } # ::tk::TextSetCursor @@ -1906,7 +2037,7 @@ proc ::ntext::TextAutoScan {w} { proc ::ntext::TextSetCursor {w pos} { if {[$w compare $pos == end]} { - set pos {end - 1 chars} + set pos {end - 1i} } $w mark set insert $pos $w tag remove sel 1.0 end @@ -1933,9 +2064,13 @@ proc ::ntext::TextSetCursor {w pos} { # never full, then empty, then full. proc ::ntext::TextKeySelect {w new} { - + if {![catch {$w isdead} result] && $result} { + # revised_text + # Catch the very special case with dead peers. + return + } set anchorname [TextAnchor $w] - if {[$w tag nextrange sel 1.0 end] eq ""} { + if {[llength [$w tag nextrange sel 1.0 end]] == 0} { if {[$w compare $new < insert]} { $w tag add sel $new insert $w mark set $anchorname insert @@ -1946,6 +2081,9 @@ proc ::ntext::TextKeySelect {w new} { $w mark gravity $anchorname right } } else { + if {[catch {$w index $anchorname}]} { + $w mark set $anchorname insert + } if {[$w compare $new < $anchorname]} { set first $new set last $anchorname @@ -1987,7 +2125,7 @@ proc ::ntext::TextKeySelect {w new} { # - Set the gravity of the anchor. proc ::ntext::TextResetAnchor {w index} { - if {[$w tag ranges sel] eq ""} { + if {[llength [$w tag ranges sel]] == 0} { # Don't move the anchor if there is no selection now; this # makes the widget behave "correctly" when the user clicks # once, then shift-clicks somewhere -- ie, the area between @@ -2011,7 +2149,7 @@ proc ::ntext::TextResetAnchor {w index} { scan $a "%d.%d" lineA chA scan $b "%d.%d" lineB chB scan $c "%d.%d" lineC chC - if {$lineB < $lineC+2} { + if {$lineB < $lineC + 2} { set total [string length [$w get $b $c]] if {$total <= 2} { return @@ -2025,7 +2163,7 @@ proc ::ntext::TextResetAnchor {w index} { } return } - if {($lineA-$lineB) < ($lineC-$lineA)} { + if {$lineA - $lineB < $lineC - $lineA} { $w mark set $anchorname sel.last $w mark gravity $anchorname left } else { @@ -2042,10 +2180,9 @@ proc ::ntext::TextResetAnchor {w index} { # w - The text widget whose selection is to be checked proc ::ntext::TextCursorInSelection {w} { - expr { - [llength [$w tag ranges sel]] - && [$w compare sel.first <= insert] - && [$w compare sel.last >= insert] + expr { [llength [$w tag ranges sel]] + && [$w compare sel.first <= insert] + && [$w compare sel.last >= insert] } } @@ -2063,7 +2200,7 @@ proc ::ntext::TextCursorInSelection {w} { # - call AdjustIndentOneLine proc ::ntext::TextInsert {w s} { - if {$s eq "" || [$w cget -state] eq "disabled"} { + if {[string length $s] == 0 || [$w cget -state] ne "normal"} { return } set compound 0 @@ -2074,6 +2211,8 @@ proc ::ntext::TextInsert {w s} { $w edit separator } else { } + # revised_text - ensure that this operation is triggering "watch" + $w mark set insert sel.first $w delete sel.first sel.last } elseif {$::ntext::overwrite && ($s ne "\n") && ($s ne "\t") && ([$w get insert] ne "\n")} { @@ -2103,14 +2242,15 @@ proc ::ntext::TextInsert {w s} { # maintain the original x position across repeated operations, even though # some lines that will get passed through don't have enough characters to # cover the original column. Second, don't try to scroll past the -# beginning or end of the text. +# beginning or end of the text if we don't select. # # Arguments: # w - The text window in which the cursor is to move. # n - The number of display lines to move: -1 for up one line, # +1 for down one line. +# sel Boolean value whether we are selecting text. -proc ::ntext::TextUpDownLine {w n} { +proc ::ntext::TextUpDownLine {w n {sel no}} { variable ::tk::Priv set i [$w index insert] @@ -2118,10 +2258,8 @@ proc ::ntext::TextUpDownLine {w n} { set Priv(textPosOrig) $i } set lines [$w count -displaylines $Priv(textPosOrig) $i] - set new [$w index \ - "$Priv(textPosOrig) + [expr {$lines + $n}] displaylines"] - if {[$w compare $new == end] \ - || [$w compare $new == "insert display linestart"]} { + set new [$w index "$Priv(textPosOrig) + [expr {$lines + $n}] displaylines"] + if {(!$sel) && ([$w compare $new == end] || [$w compare $new == "insert display linestart"])} { set new $i } set Priv(prevPos) $new @@ -2140,17 +2278,16 @@ proc ::ntext::TextUpDownLine {w n} { proc ::ntext::TextPrevPara {w pos} { set pos [$w index "$pos linestart"] while {1} { - if {([$w get "$pos - 1 line"] eq "\n" && ([$w get $pos] ne "\n")) \ - || $pos eq "1.0"} { - if {[regexp -indices -- {^[ \t]+(.)} \ - [$w get $pos "$pos lineend"] -> index]} { + set newPos [$w index "$pos - 1 line"] + if {([$w get $newPos] eq "\n" && ([$w get $pos] ne "\n")) || [$w compare $pos == 1.0]} { + if {[regexp -indices -- {^[ \t]+(.)} [$w get $pos "$pos lineend"] -> index]} { set pos [$w index "$pos + [lindex $index 0] chars"] } - if {[$w compare $pos != insert] || [lindex [split $pos .] 0]==1} { + if {[$w compare $pos != insert] || [$w compare [$w index "$pos linestart"] == 1.0]} { return $pos } } - set pos [$w index "$pos - 1 line"] + set pos $newPos } } @@ -2167,18 +2304,17 @@ proc ::ntext::TextNextPara {w start} { set pos [$w index "$start linestart + 1 line"] while {[$w get $pos] ne "\n"} { if {[$w compare $pos == end]} { - return [$w index "end - 1c"] + return [$w index "end - 1i"] } set pos [$w index "$pos + 1 line"] } while {[$w get $pos] eq "\n"} { set pos [$w index "$pos + 1 line"] if {[$w compare $pos == end]} { - return [$w index "end - 1c"] + return [$w index "end - 1i"] } } - if {[regexp -indices -- {^[ \t]+(.)} \ - [$w get $pos "$pos lineend"] -> index]} { + if {[regexp -indices -- {^[ \t]+(.)} [$w get $pos "$pos lineend"] -> index]} { return [$w index "$pos + [lindex $index 0] chars"] } return $pos @@ -2189,7 +2325,9 @@ proc ::ntext::TextNextPara {w start} { # pages and possibly extending the selection along the way. It scrolls # the view in the widget by the number of pages, and it returns the # index of the character that is at the same position in the new view -# as the insertion cursor used to be in the old view. +# as the insertion cursor used to be in the old view. (Or, if the insert +# cursor was not in view, it returns a weird index from somewhere in the +# first display line). # # Arguments: # w - The text window in which the cursor is to move. @@ -2209,12 +2347,12 @@ proc ::ntext::TextNextPara {w start} { # ::ntext::TextScrollPages takes a slightly different approach: # like ::tk::TextScrollPages, it returns an index (a new value for the insert # mark), and lets the calling code decide whether to move the mark. -# Unlike ::tk::TextScrollPages, when called with two arguments it does no +# Unlike ::tk::TextScrollPages (which calls "$w yview", but not "$w see"), when +# called with two arguments ::ntext::TextScrollPages does no # scrolling - it relies on the calling code to do the scrolling, which in # practice is usually when it tries to 'see' the returned index value. # -# By focussing on the insert mark, ::ntext::TextScrollPages has the -# following useful features: +# ::ntext::TextScrollPages has the following useful features: # - When the slack is less than one page, it "moves" the insert mark as far # as possible. # - When there is no slack, it "moves" the insert mark to the start/end of @@ -2223,7 +2361,8 @@ proc ::ntext::TextNextPara {w start} { # # When called with three arguments, 3rd argument = "preScroll", then, if the # new position of the insert mark is off-screen, ::ntext::TextScrollPages -# will scroll the widget, to try to make the calling code's "see" move the +# will scroll the widget (using "see", not "yview"), to try to make the calling +# code's "see" move the # returned index value to the middle, not the edge, of the widget. This # feature is most useful in widgets with only a few visible lines, where it # prevents successive calls from moving the insert mark between the middle and @@ -2232,36 +2371,65 @@ proc ::ntext::TextNextPara {w start} { proc ::ntext::TextScrollPages {w count {help ""}} { set spareLines 1 ;# adjustable + # Cf. revised_text - when scrolling is already at its limit or within a + # fractional display line of it, behave as if spareLines is 0, i.e. jump + # to the limit. + if {$count > 0} { + if {[llength [$w dlineinfo end-1c]]} { + # Last display line of last line is partially or fully visible. + set localSpareLines 0 + } else { + set localSpareLines $spareLines + } + } else { + if {[llength [$w dlineinfo 1.0]]} { + # First display line of first line is partially or fully visible. + set localSpareLines 0 + } else { + set localSpareLines $spareLines + } + } + set oldInsert [$w index insert] set count [expr {int($count)}] if {$count == 0} { return $oldInsert } set visibleLines [$w count -displaylines @0,0 @0,20000] - if {$visibleLines > $spareLines} { - set pageLines [expr {$visibleLines - $spareLines}] + if {$visibleLines > $localSpareLines} { + set pageLines [expr {$visibleLines - $localSpareLines}] } else { set pageLines 1 } set newInsert [TextUpDownLine $w [expr {$pageLines * $count}]] if {[$w compare $oldInsert != $newInsert]} { - set finalInsert $newInsert + set newPos $newInsert } elseif {$count < 0} { - set finalInsert 1.0 + set newPos 1.0 } else { - set finalInsert [$w index "end -1 char"] + set newPos [$w index "end -1 char"] } - if {($help eq "preScroll") && ([$w bbox $finalInsert] eq "")} { - # If $finalInsert is offscreen, try to put it in the middle - if { [$w count -displaylines 1.0 $finalInsert] > \ - [$w count -displaylines $finalInsert end]} { + if {($help eq "preScroll") && ([$w bbox $newPos] eq "")} { + # If $newPos is offscreen, try to put it in the middle + if { [$w count -displaylines 1.0 $newPos] + > [$w count -displaylines $newPos end] + } { $w see 1.0 } else { $w see end } - $w see $finalInsert + $w see $newPos } - return $finalInsert + + + # From revised_text - to permit scrolling in this corner case. + if {[$w compare insert == $newPos]} { + # This may happen if a character is spanning the entire view, + # ensure that at least one line will change. + set newPos [$w index "[expr {$count > 0 ? "insert +1" : "insert -1"}] displayline"] + } + + return $newPos } # ::tk::TextTranspose -- @@ -2279,22 +2447,30 @@ proc ::ntext::TextScrollPages {w count {help ""}} { # - renames local variable autosep to oldSeparator, as in other procs proc ::ntext::TextTranspose w { - set pos insert - if {[$w compare $pos != "$pos lineend"]} { - set pos [$w index "$pos + 1 char"] - } - set new [$w get "$pos - 1 char"][$w get "$pos - 2 char"] - if {[$w compare "$pos - 1 char" == 1.0]} { + if {[$w cget -state] ne "normal" || [$w compare insert == 1.0]} { return } + + set pos insert + if {[$w compare insert != "insert lineend"]} { + append pos +1i + } + set pos [$w index $pos] + # ensure this is seen as an atomic op to undo set oldSeparator [$w cget -autoseparators] if {$oldSeparator} { $w configure -autoseparators 0 $w edit separator } - $w delete "$pos - 2 char" $pos + + # for revised_text, ensure that this operation is triggering "watch" + set insPos [$w index insert] + $w mark set insert ${pos}-2c + set new [$w get insert+1i][$w get insert] + $w delete insert $pos $w insert insert $new + $w mark set insert $insPos if {[$w compare insert == "insert linestart"]} { AdjustIndentOneLine $w "insert - 1 line" @@ -2302,10 +2478,12 @@ proc ::ntext::TextTranspose w { AdjustIndentOneLine $w insert $w see insert + if {$oldSeparator} { $w edit separator $w configure -autoseparators 1 } + return } # ::tk_textCopy -- @@ -2338,21 +2516,33 @@ proc ::ntext::new_textCopy w { proc ::ntext::new_textCut w { if {![catch {set data [$w get sel.first sel.last]}]} { - # make <> an atomic operation on the Undo stack, - # i.e. separate it from other delete operations on either side - set oldSeparator [$w cget -autoseparators] - if {$oldSeparator} { - $w configure -autoseparators 0 - $w edit separator - } - set LocalOldFirst [$w index sel.first] clipboard clear -displayof $w clipboard append -displayof $w $data - $w delete sel.first sel.last - AdjustIndentOneLine $w $LocalOldFirst - if {$oldSeparator} { - $w edit separator - $w configure -autoseparators 1 + + if {([$w cget -state] eq "normal")} { + # make <> an atomic operation on the Undo stack, + # i.e. separate it from other delete operations on either side + # (For older Tk? Check.) disable -autoseparators for the operation. + set oldSeparator [$w cget -autoseparators] + if {$oldSeparator} { + $w configure -autoseparators 0 + $w edit separator + } + + set LocalOldFirst [$w index sel.first] + TextDelete $w sel.first sel.last + AdjustIndentOneLine $w $LocalOldFirst + + if {$oldSeparator} { + $w edit separator + $w configure -autoseparators 1 + } + + if {$::ntext::GenerateSelect} { + # The PRIMARY selection has changed but the widget does + # not generate this event. + event generate $w <> + } } } return @@ -2372,30 +2562,8 @@ proc ::ntext::new_textCut w { # - overwrite the selection (if it exists), even if the insert mark is elsewhere proc ::ntext::new_textPaste w { - set oldInsert [$w index insert] - if {![catch {::tk::GetSelection $w CLIPBOARD} sel]} { - set oldSeparator [$w cget -autoseparators] - if {$oldSeparator} { - $w configure -autoseparators 0 - $w edit separator - } - if {([tk windowingsystem] ne "x11TheOldFashionedWay") && \ - ([$w tag nextrange sel 1.0 end] ne "")} { - set LocalOldFirst [$w index sel.first] - $w mark set ntextIndentMark sel.last - # right gravity mark, survives deletion - - $w delete sel.first sel.last - $w insert $LocalOldFirst $sel - AdjustIndentMultipleLines $w $LocalOldFirst ntextIndentMark - } else { - $w insert insert $sel - AdjustIndentMultipleLines $w $oldInsert insert - } - if {$oldSeparator} { - $w edit separator - $w configure -autoseparators 1 - } + if {[$w cget -state] eq "normal"} { + ::ntext::TextInsertSelection $w CLIPBOARD } return } @@ -2431,12 +2599,13 @@ proc ::ntext::TextNextPos {w start op} { set text "" set cur $start while {[$w compare $cur < end]} { - set text $text[$w get -displaychars $cur "$cur lineend + 1c"] + set end [$w index "$cur lineend + 1i"] + append text [$w get -displaychars $cur $end] set pos [$op $text 0] if {$pos >= 0} { return [$w index "$start + $pos display chars"] } - set cur [$w index "$cur lineend +1c"] + set cur $end } return end } @@ -2451,17 +2620,19 @@ proc ::ntext::TextNextPos {w start op} { # op - Function to use to find next position. proc ::ntext::TextPrevPos {w start op} { - set text "" + set succ "" set cur $start - while {[$w compare $cur > 0.0]} { - set text [$w get -displaychars "$cur linestart - 1c" $cur]$text + while {[$w compare $cur > 1.0]} { + set text "" + append text [$w get -displaychars "$cur linestart - 1i" $cur] $succ set pos [$op $text end] if {$pos >= 0} { - return [$w index "$cur linestart - 1c + $pos display chars"] + return [$w index "$cur linestart - 1i + $pos display chars"] } - set cur [$w index "$cur linestart - 1c"] + set cur [$w index "$cur linestart - 1i"] + set succ $text } - return 0.0 + return 1.0 } # ::tk::TextScanMark -- @@ -2508,6 +2679,95 @@ proc ::ntext::TextScanDrag {w x y} { } } +# ::tk::TextDelete -- +# +# Delete the characters in given range. +# Ensure that "watch" will be triggered, and consider +# that "insert" may be involved in the given range. +# This implementation avoids unnecessary mappings of indices. + +proc ::ntext::TextDelete {w start end} { + if {[catch {set testPos [$w mark generate]}]} { + # This is the "unrevised" text widget. + $w delete $start $end + } else { + # This is the revised_text text widget. + # Remember old positions, use temporary marks ('mark generate'), + # take into account that $end may refer "insert" mark. + $w mark set [set insPos [$w mark generate]] insert + $w mark set [set endPos [$w mark generate]] $end + $w mark set insert $start + $w delete insert $endPos + $w mark set insert $insPos + $w mark unset $insPos + $w mark unset $endPos + $w mark unset $testPos + } + return +} + +# ::tk::TextInsertSelection -- +# This procedure inserts the selection. +# +# Arguments: +# w - The text window. +# selection atom name of the selection (usually CLIPBOARD or PRIMARY) + +# Extracted from ::ntext::new_textPaste and ::ntext::TextPasteSelection, and +# corresponds to revised_text's tk::TextInsertSelection. + +proc ::ntext::TextInsertSelection {w selection} { + if {[catch {::tk::GetSelection $w $selection} sel]} { + return + } + set oldInsert [$w index insert] + set oldSeparator [$w cget -autoseparators] + if {$oldSeparator} { + $w configure -autoseparators 0 + $w edit separator + } + if { ($selection eq "CLIPBOARD") + && ([tk windowingsystem] ne "x11TheOldFashionedWay") + && ([$w tag nextrange sel 1.0 end] ne "") + } { + set LocalOldFirst [$w index sel.first] + $w mark set ntextIndentMark sel.last + # right gravity mark, survives deletion + + TextDelete $w sel.first sel.last + $w insert $LocalOldFirst $sel + AdjustIndentMultipleLines $w $LocalOldFirst ntextIndentMark + } else { + $w insert insert $sel + AdjustIndentMultipleLines $w $oldInsert insert + } + if {$oldSeparator} { + $w edit separator + $w configure -autoseparators 1 + } + + # The PRIMARY selection has changed but the widget does + # not generate this event. + if { ($selection eq "PRIMARY") + && [TextCursorInSelection $w] + && $::ntext::GenerateSelect + } { + event generate $w <> + } + return +} + + +# revised_text text.tcl has new commands in the global namespace: +# ::tk_textInsert +# ::tk_textReplace +# ::tk_textRebindMouseWheel +# ::tk_mergeRange +# These commands are loaded from text.tcl and are self-contained: they are not +# used by any bindings or commands in text.tcl, and do not call any other +# commands in text.tcl. Therefore ntext does not need to provide replacements. + + ##### END OF CODE THAT IS MODIFIED from the file text.tcl. ##### THE CODE ABOVE ALSO USES THE PROCS DEFINED BELOW. @@ -2628,6 +2888,31 @@ proc ::ntext::EndIndex {w index} { return $end } +# ::ntext::DefineCursor -- +# Set the cursor depending on insert/overwrite mode and +# ::ntext::useBlockCursor. + +proc ::ntext::DefineCursor {w} { + variable overwrite + variable useBlockCursor + variable OldInsertBackground + + if {$useBlockCursor} { + $w configure -blockcursor $overwrite + } else { + if {$overwrite} { + set OldInsertBackground($w) [$w cget -insertbackground] + $w configure -insertbackground red + } elseif {[info exists OldInsertBackground($w)]} { + $w configure -insertbackground $OldInsertBackground($w) + } else { + # Somehow the old value was not recorded. Improvise. + $w configure -insertbackground [$w cget -fg] + } + } + return +} + # Extra procs for macOS/Aqua: @@ -3102,11 +3387,14 @@ proc ::ntext::AdjustIndentOneLine {textWidget index} { proc ::ntext::AddIndent {textWidget index pix} { # Add a tag with properties "-lmargin2 $pix" to the entire logical line variable lm2IndentDebug + variable indentColor set lineStart [$textWidget index "$index linestart"] set nextLineStart [$textWidget index "$lineStart + 1 line"] set tagName ntextAlignLM2Indent=${pix} $textWidget tag add $tagName $lineStart $nextLineStart $textWidget tag configure $tagName -lmargin2 ${pix} + # Older versions of Tk do not support -lmargincolor. + catch {$textWidget tag configure $tagName -lmargincolor $indentColor} if {$lm2IndentDebug} { $textWidget tag configure $tagName -background [IntToColor $pix 100] } @@ -3262,6 +3550,25 @@ proc ::ntext::IntToColor {pix range} { return $color } +# ::ntext::syncIndentColor -- +# +# Synchronize text widget indent coloring with indentColor. +# Call only if indentColor is changed after widgets with text have been +# defined. +# +# Arguments: +# w - Tk window path of a text widget + +proc ::ntext::syncIndentColor {w} { + variable indentColor + foreach tag [$w tag names] { + if {[string match ntextAlignLM2Indent=* $tag]} { + catch {$w tag configure $tag -lmargincolor $indentColor} + } + } + return +} + ##### END OF CODE TO HANDLE (OPTIONAL) INDENTATION USING -lmargin2 ##### End of procs. @@ -3270,4 +3577,4 @@ proc ::ntext::IntToColor {pix range} { ::ntext::initializeMatchPatterns -package provide ntext 1.0b1 +package provide ntext 1.0b2 diff --git a/modules/ntext/ntextBindings.man b/modules/ntext/ntextBindings.man index 9cb019cd..925c48b1 100644 --- a/modules/ntext/ntextBindings.man +++ b/modules/ntext/ntextBindings.man @@ -83,6 +83,16 @@ The behaviour of [emph Ntext] may be configured application-wide by setting the [item] [const 1] - selects classic [emph Text] behaviour [list_end] + +[para] +[var ::ntext::classicParagraphs] +[list_begin itemized] +[item] + [const 0] - (default value) on macOS Aqua, certain keyboard bindings are made to behave in the same way as the Mac application TextEdit. The bindings involve vertical scrolling of the screen and are . +[item] + [const 1] - on macOS Aqua, certain keyboard bindings are made to behave in the same way as for the Windows and X11 windowing systems and the classic [emph Text], ignoring the conventions of Aqua. The bindings involve vertical scrolling of the screen and are . +[list_end] + [para] [var ::ntext::classicSelection] [list_begin itemized] @@ -101,16 +111,18 @@ The behaviour of [emph Ntext] may be configured application-wide by setting the [item] The value is toggled by the [emph Insert] key. [list_end] + [para] -[var ::ntext::classicParagraphs] +[var ::ntext::useBlockCursor] [list_begin itemized] [item] - [const 0] - (default value) on macOS Aqua, certain keyboard bindings are made to behave in the same way as the Mac application TextEdit. The bindings involve vertical scrolling of the screen and are . + [const 0] - the block cursor will not be used. When the widget is in [emph overwrite] mode (see [const ::ntext::overwrite]), the ordinary cursor will change color instead. [item] - [const 1] - on macOS Aqua, certain keyboard bindings are made to behave in the same way as for the Windows and X11 windowing systems and the classic [emph Text], ignoring the conventions of Aqua. The bindings involve vertical scrolling of the screen and are . + [const 1] - the block cursor will be used when the widget is in [emph overwrite] mode (see [const ::ntext::overwrite]). +[item] + The default value depends on the version of [const Tk]. In versions of [const Tk] earlier than [const 8.5.12], the sizing of the block cursor had a bug, and [var ::ntext::useBlockCursor] defaults to [const 0]. From [const 8.5.12] onwards the bug is fixed, and [var ::ntext::useBlockCursor] defaults to [const 1]. [list_end] - [section INTERNALS] In order to remain independent of the version of [package Tk] (8.5 or 8.6), [package ntext] defines its own virtual events. These new virtual events are used only in the [emph Ntext] binding tag, and therefore do not interfere with the real or virtual events used in other code. diff --git a/modules/ntext/ntextIndent.man b/modules/ntext/ntextIndent.man index 3d69e38f..0dc81773 100644 --- a/modules/ntext/ntextIndent.man +++ b/modules/ntext/ntextIndent.man @@ -27,11 +27,15 @@ Replacement for ::tk_textCopy. [call [cmd ::ntext::new_textCut] [arg pathName]] -Replacement for ::tk_textCut that also maintains [emph Ntext] indentation (see [term ntextIndent]). +Replacement for ::tk_textCut that also maintains [emph Ntext] indentation. [call [cmd ::ntext::new_textPaste] [arg pathName]] -Replacement for ::tk_textPaste that also maintains [emph Ntext] indentation (see [term ntextIndent]). +Replacement for ::tk_textPaste that also maintains [emph Ntext] indentation. + +[call [cmd ::ntext::syncIndentColor] [arg pathName]] + +Command to apply the current value of the variable [var ::ntext::indentColor] to existing lines in a text widget. This command is useful if a text widget has been created, text has been inserted in the widget, [emph {and then}] the value of [var ::ntext::indentColor] is changed. [list_end] @@ -43,11 +47,23 @@ The behavior of [emph Ntext] may be configured application-wide by setting the v [var ::ntext::classicWrap] [list_begin itemized] [item] - 0 - selects [emph Ntext] behaviour, i.e. display lines are indented to match the initial whitespace of the first display line of a logical line. + [const 0] - selects [emph Ntext] behaviour, i.e. display lines are indented to match the initial whitespace of the first display line of a logical line. [para] No other action is required if this option, and the text widget's [arg -wrap] option, are set before any text is entered in the widget, and if text is entered and edited only by the mouse and keyboard. If, instead, text is manipulated by the script, or if the text widget's [arg -wrap] option or the value of [var ::ntext::classicWrap] are changed while the widget holds text, then calls to [emph ntext] functions are needed to alter the indentation. See the section [sectref {INDENTING DISPLAY LINES}] for detailed instructions. [item] - 1 - (default value) selects classic [emph Text] behaviour, i.e. no indentation. + [const 1] - (default value) selects classic [emph Text] behaviour, i.e. no indentation. +[list_end] + +[var ::ntext::indentColor] +[list_begin itemized] +[item] + [const {{}}] - if the value is the empty string, then the indent of wrapped display lines has the same color as the widget background. +[item] + [emph color] - a valid Tk color to use for the indent of wrapped display lines (default value [emph #d9d9d9]). +[para] + Coloring is implemented with the text widget tag option [arg -lmargincolor], which is available from [package Tk] 8.6.6 onwards. [emph Ntext] indent coloring has no effect in earlier versions of [package Tk]. +[para] + The value of [var ::ntext::indentColor] will often be set at startup. If the value is changed when text widgets already exist and contain text, those widgets can be updated by calling command [cmd ::ntext::syncIndentColor]. [list_end] [emph {Advanced Use}] @@ -120,11 +136,31 @@ This version of [package ntext] is intended to be compatible with all releases o [section EXAMPLES] -To switch on [emph Ntext] 's indentation and use it in widget .t: +To switch on [emph Ntext] 's indentation and use it in widget .t, using the default indent color [emph #d9d9d9]: + +[example { +package require ntext +set ::ntext::classicWrap 0 +text .t -wrap word +bindtags .t {.t Ntext . all} +}] + +To switch on [emph Ntext] 's indentation and use it in widget .t, without colored indents: [example { package require ntext set ::ntext::classicWrap 0 +set ::ntext::indentColor {} +text .t -wrap word +bindtags .t {.t Ntext . all} +}] + +To switch on [emph Ntext] 's indentation and use it in widget .t, coloring the indents black: + +[example { +package require ntext +set ::ntext::classicWrap 0 +set ::ntext::indentColor black text .t -wrap word bindtags .t {.t Ntext . all} }] @@ -151,6 +187,13 @@ set foo [.t index end] ::ntext::wrapIndent .t $foo end }] +To change the indentation color when a widget .t already holds text: + +[example { +set ::ntext::indentColor black +::ntext::syncIndentColor .t +}] + To switch to [arg -wrap] [arg char] mode: [example { @@ -160,7 +203,6 @@ To switch to [arg -wrap] [arg char] mode: - [see_also ntext] [see_also text bindtags regexp re_syntax] [keywords text bindtags regexp re_syntax] diff --git a/modules/ntext/pkgIndex.tcl b/modules/ntext/pkgIndex.tcl index 86815b56..5e7e5055 100644 --- a/modules/ntext/pkgIndex.tcl +++ b/modules/ntext/pkgIndex.tcl @@ -1 +1 @@ -package ifneeded ntext 1.0b1 [list source [file join $dir ntext.tcl]] +package ifneeded ntext 1.0b2 [list source [file join $dir ntext.tcl]] From b00a8400f27085dc7d32ca583deb9f48bb52e05e Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 12 Feb 2018 18:40:48 +0000 Subject: [PATCH 035/150] * CHANGES.txt: Updated. --- modules/tablelist/ChangeLog | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/tablelist/ChangeLog b/modules/tablelist/ChangeLog index 944430b0..b16a0bc0 100644 --- a/modules/tablelist/ChangeLog +++ b/modules/tablelist/ChangeLog @@ -1,3 +1,7 @@ +2018-02-12 Csaba Nemethi + + * CHANGES.txt: Updated. + 2018-01-08 Csaba Nemethi * *.tcl: Bumped the version number to 6.0.1. From a3d6b40af3e6b33662eeeaf7bea9df7633ade365 Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 12 Feb 2018 18:41:30 +0000 Subject: [PATCH 036/150] * CHANGES.txt: Updated. --- modules/tablelist/CHANGES.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/tablelist/CHANGES.txt b/modules/tablelist/CHANGES.txt index 460d8128..945dfa78 100644 --- a/modules/tablelist/CHANGES.txt +++ b/modules/tablelist/CHANGES.txt @@ -2,11 +2,11 @@ What is new in Tablelist 6.0.1? ------------------------------- This is a bugfix-only release. The only corrected file in the -"scripts" directory is "tablelistUtil.tcl": inserted the missing closed +"scripts" directory is "tablelistUtil.tcl": inserted the missing close bracket in line #6448. This fix eliminates a regression related to both temporarily and persistently embedded Tk checkbuttons on Windows, introduced in the previous Tablelist version (thanks to Johann -Oberdorfer for his bug report). +Oberdorfer and Jyrki Majamaeki for their bug reports). What was new in Tablelist 6.0? ------------------------------ From ee923187e2527fd1491b38227569ad7e226b3703 Mon Sep 17 00:00:00 2001 From: Keith Nash Date: Sat, 17 Feb 2018 18:10:28 +0000 Subject: [PATCH 037/150] Add modules widgetPlus and persistentSelection --- .../allWidgetsDebugDemo.tcl | 269 ++ .../persistentSelection/allWidgetsDemo.tcl | 177 + .../simpleDemoEntryPlus.tcl | 99 + .../persistentSelection/simpleDemoNtext.tcl | 50 + .../persistentSelection/simpleDemoText.tcl | 50 + examples/widgetPlus/widgetPlusDemo.tcl | 162 + .../PersistentSelection.odt | Bin 0 -> 17575 bytes .../PersistentSelection.pdf | Bin 0 -> 66968 bytes .../persistentSelection.man | 209 + .../persistentSelection.tcl | 904 ++++ modules/persistentSelection/pkgIndex.tcl | 1 + modules/widgetPlus/entryExtras.test | 125 + modules/widgetPlus/entryPlus.test | 3663 +++++++++++++++ modules/widgetPlus/pkgIndex.tcl | 1 + modules/widgetPlus/spinboxPlus.test | 3977 +++++++++++++++++ modules/widgetPlus/ttkComboboxPlus.test | 83 + modules/widgetPlus/ttkEntryPlus.test | 297 ++ modules/widgetPlus/ttkSpinboxPlus.test | 294 ++ modules/widgetPlus/widgetPlus.man | 339 ++ modules/widgetPlus/widgetPlus.tcl | 1673 +++++++ support/installation/modules.tcl | 2 + 21 files changed, 12375 insertions(+) create mode 100755 examples/persistentSelection/allWidgetsDebugDemo.tcl create mode 100755 examples/persistentSelection/allWidgetsDemo.tcl create mode 100755 examples/persistentSelection/simpleDemoEntryPlus.tcl create mode 100755 examples/persistentSelection/simpleDemoNtext.tcl create mode 100755 examples/persistentSelection/simpleDemoText.tcl create mode 100644 examples/widgetPlus/widgetPlusDemo.tcl create mode 100644 modules/persistentSelection/PersistentSelection.odt create mode 100644 modules/persistentSelection/PersistentSelection.pdf create mode 100644 modules/persistentSelection/persistentSelection.man create mode 100644 modules/persistentSelection/persistentSelection.tcl create mode 100644 modules/persistentSelection/pkgIndex.tcl create mode 100644 modules/widgetPlus/entryExtras.test create mode 100644 modules/widgetPlus/entryPlus.test create mode 100644 modules/widgetPlus/pkgIndex.tcl create mode 100644 modules/widgetPlus/spinboxPlus.test create mode 100644 modules/widgetPlus/ttkComboboxPlus.test create mode 100644 modules/widgetPlus/ttkEntryPlus.test create mode 100644 modules/widgetPlus/ttkSpinboxPlus.test create mode 100644 modules/widgetPlus/widgetPlus.man create mode 100644 modules/widgetPlus/widgetPlus.tcl diff --git a/examples/persistentSelection/allWidgetsDebugDemo.tcl b/examples/persistentSelection/allWidgetsDebugDemo.tcl new file mode 100755 index 00000000..1af93ce0 --- /dev/null +++ b/examples/persistentSelection/allWidgetsDebugDemo.tcl @@ -0,0 +1,269 @@ +#!/bin/sh +# the next line restarts using tclsh \ +exec tclsh "$0" "$@" + +# Copyright (c) 2017-2018 Keith Nash. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. + +# To use the <> event, the caller must bind a command to it. +# In this demo, the <> event is used by the persistent selection +# module persistentSelection. + +# ------------------------------------------------------------------------------ +# Demo of the persistent selection module persistentSelection. +# ------------------------------------------------------------------------------ +# This demo is for text, ntext and all widgetPlus widgets, and it also provides +# tools for monitoring and debugging. +# ------------------------------------------------------------------------------ + + +# ------------------------------------------------------------------------------ +# Load package(s) and create bindings. +# ------------------------------------------------------------------------------ + +package require Tk + +# persistentSelection +package require persistentSelection + +# text +persistentSelection::fixText +bind Text <> {persistentSelection::report text %W} + +# ntext +package require ntext +bind Ntext <> {persistentSelection::report text %W} +if 0 { +# widgetPlus +package require widgetPlus +namespace import widgetPlus::* +bind EntryPlus <> {persistentSelection::report entry %W} +bind TEntryPlus <> {persistentSelection::report entry %W} +bind SpinboxPlus <> {persistentSelection::report entry %W} +bind TSpinboxPlus <> {persistentSelection::report entry %W} +bind TComboboxPlus <> {persistentSelection::report entry %W} + + +# ------------------------------------------------------------------------------ +# Create, initialize, and map entryPlus widget. +# ------------------------------------------------------------------------------ + +# ------------------------------------------------------------------------------ +# Command CreateWidget +# ------------------------------------------------------------------------------ +# Command to create a widgetPlus widget, initialize it, and map it. +# If there is an existing widget with the same name it is destroyed. +# +# When debugging, note that the Undo/Redo innards differ if $w has or does not +# have a -textvariable. +# +# The options added by widgetPlus are shown on the first line of each widgetPlus +# command. The options on continuation lines are those of the widget hull. +# ------------------------------------------------------------------------------ + +proc CreateWidget {w} { + destroy $w + switch -exact -- $::hullType { + entry {entryPlus $w -undo 1 -maxundo 0 \ + -bg white} + + spinbox {spinboxPlus $w -undo 1 -maxundo 0 \ + -values {1 2 3 4 5} \ + -bg white} + + ttk::entry {ttkEntryPlus $w -undo 1 -maxundo 0} + + ttk::spinbox {ttkSpinboxPlus $w -undo 1 -maxundo 0 \ + -values {1 2 3 4 5}} + + ttk::combobox {ttkComboboxPlus $w -undo 1 -maxundo 0 \ + -values {1 2 3 4 5}} + + default {error {set ::hullType to entry, ttk::entry, spinbox,\ + ttk::spinbox, or ttk::combobox}} + } + + pack $w -side left + + $w delete 0 end + $w insert end {Initial Text} + $w edit reset + + return +} + + +# ------------------------------------------------------------------------------ +# Command CreateDemo +# ------------------------------------------------------------------------------ +# Command to create a megawidget with a descriptive label, a radiobutton widget +# selector, and a widgetPlus widget. +# ------------------------------------------------------------------------------ + +proc CreateDemo {w} { + frame $w + label $w.lab -text {Use radiobuttons to choose widget:} + pack $w.lab -pady 10 + + frame $w.f + radiobutton $w.f.rb0 -value entry -text entry + radiobutton $w.f.rb1 -value spinbox -text spinbox + radiobutton $w.f.rb2 -value ttk::entry -text ttk::entry + radiobutton $w.f.rb3 -value ttk::spinbox -text ttk::spinbox + radiobutton $w.f.rb4 -value ttk::combobox -text ttk::combobox + + foreach rb {.f.rb0 .f.rb1 .f.rb2 .f.rb3 .f.rb4} { + $w$rb configure -variable ::hullType -command [list CreateWidget $w.g.e] + } + pack $w.f.rb0 $w.f.rb1 $w.f.rb2 $w.f.rb3 $w.f.rb4 -side left -padx 5 + pack $w.f + set ::hullType entry + + frame $w.g + pack $w.g -padx 20 -pady {20 10} + + frame $w.g.filler -height 30 -width 1 + pack $w.g.filler -side left + + # Start with "entry", specified by ::hullType. + CreateWidget $w.g.e + return $w +} + +CreateDemo .wpdemo +pack .wpdemo +} + +# ------------------------------------------------------------------------------ +# Create, initialize, and map text widget. +# ------------------------------------------------------------------------------ + +text .top -bg white -height 10 -wrap word -undo 1 -maxundo 0 +pack .top + +.top insert end {Widget .top, bindtag Text. + +Try using the persistent PRIMARY selection with this widget, and with the entryPlus widget (above). + +When the selection is cleared in the widget that owns the PRIMARY selection, usually Tk also clears the PRIMARY selection. The persistentSelection package ensures that, instead, the PRIMARY selection retains the last non-empty selected string. +} +.top edit reset + + +# ------------------------------------------------------------------------------ +# Create, initialize, and map ntext widget. +# ------------------------------------------------------------------------------ + +text .mid -bg white -height 5 -wrap word -undo 1 -maxundo 0 +bindtags .mid {.mid Ntext . all} +pack .mid -pady 5 + +.mid insert end {Widget .mid, bindtag Ntext. + +Try using the persistent PRIMARY selection with the entryPlus widget (top), the text widget (above), and the ntext widget (here). +} +.mid edit reset + + +# ------------------------------------------------------------------------------ +# Monitoring Tools. +# ------------------------------------------------------------------------------ +# - These are not necessary for the demo to work, but they show what is +# happening. +# - This code can be copied to other demos if required. +# ------------------------------------------------------------------------------ + +label .mon -text {Monitoring Tools} -font TkCaptionFont +pack .mon -pady 10 + +# 1. Counter for <> events. + +bind all <> {incr ::selCount} +set ::selCount 0 +frame .count +label .count.left -text {Number of <> events: } +label .count.right -textvariable ::selCount -bg #e0f0e0 -fg red -relief sunken +pack .count.left .count.right -side left +pack .count -pady 5 -padx 20 + +# 2. Show the PRIMARY selection. + +label .desc -text {Contents of the PRIMARY selection (refreshed every 0.5s):} +pack .desc + +text .test -bg #e0f0e0 -height 5 -width 80 -exportselection 0 +bindtags .test {.test Ntext . all} +pack .test + +proc showSelection {delay} { + set w .test + $w delete 1.0 end + set sel {} + catch {set sel [::tk::GetSelection $w PRIMARY]} + $w insert 1.0 $sel + set ::selEvent [after $delay showSelection $delay] + return +} + +showSelection 500 + +# 3. Show the contents of the Persistent Store(s). + +proc ::persistentSelection::Show {} { + ShowExample .lab + return +} + +label .lab -bg #e0f0e0 -bd 1 -relief sunken +pack .lab -fill x -pady {10 5} -padx 20 + +::persistentSelection::Show + +# 4. Log the processing of <> events. + +# ------------------------------------------------------------------------------ +# Command LogButtons +# ------------------------------------------------------------------------------ +# Command to create a megawidget with a descriptive label, a radiobutton widget +# selector, and a widgetPlus widget. +# ------------------------------------------------------------------------------ + +proc LogButtons {w} { + frame $w + label $w.lab -text {Logger} -font TkHeadingFont + pack $w.lab -pady {5 0} + + frame $w.f + label $w.f.rb0 -text {Choose Log Level:} + radiobutton $w.f.rb1 -value 0 -text Simple -variable ::logLevel + radiobutton $w.f.rb2 -value 1 -text Debug -variable ::logLevel + + pack $w.f.rb0 $w.f.rb1 $w.f.rb2 -side left -padx 5 + pack $w.f + set ::logLevel 0 + + return $w +} + +LogButtons .logbuttons +pack .logbuttons + +proc ::persistentSelection::Log {msg} { + LogExample .log $::logLevel $msg + return +} + +pack [text .log -bg #e0f0e0 -height 30 -width 80 -exportselection 0 -wrap word] -expand 1 -fill both + +bindtags .log {.log Ntext . all} + +set msg {This window logs <> events in windows .top and .mid (above), and their processing by package persistentSelection. + +The log window's contents can be edited. This is useful for marking the points before and after a GUI event in windows .top and .mid. +} + +.log insert end $msg +.log insert end \n +.log see end-1c diff --git a/examples/persistentSelection/allWidgetsDemo.tcl b/examples/persistentSelection/allWidgetsDemo.tcl new file mode 100755 index 00000000..64287c15 --- /dev/null +++ b/examples/persistentSelection/allWidgetsDemo.tcl @@ -0,0 +1,177 @@ +#!/bin/sh +# the next line restarts using tclsh \ +exec tclsh "$0" "$@" + +# Copyright (c) 2017-2018 Keith Nash. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. + +# ------------------------------------------------------------------------------ +# Demo of the persistent selection module persistentSelection. +# ------------------------------------------------------------------------------ +# This demo is for text, ntext and all widgetPlus widgets. +# ------------------------------------------------------------------------------ + + +# ------------------------------------------------------------------------------ +# Load package(s) and create bindings. +# ------------------------------------------------------------------------------ + +package require Tk +package require persistentSelection +package require ntext +package require snit +package require widgetPlus +namespace import widgetPlus::* + +persistentSelection::fixText +bind Text <> {persistentSelection::report text %W} +bind Ntext <> {persistentSelection::report text %W} +bind EntryPlus <> {persistentSelection::report entry %W} +bind TEntryPlus <> {persistentSelection::report entry %W} +bind SpinboxPlus <> {persistentSelection::report entry %W} +bind TSpinboxPlus <> {persistentSelection::report entry %W} +bind TComboboxPlus <> {persistentSelection::report entry %W} + + +# ------------------------------------------------------------------------------ +# Create, initialize, and map a widgetPlus widget. +# ------------------------------------------------------------------------------ + +# ------------------------------------------------------------------------------ +# Command CreateWidget +# ------------------------------------------------------------------------------ +# Command to create a widgetPlus widget, initialize it, and map it. +# If there is an existing widget with the same name it is destroyed. +# +# When debugging, note that the Undo/Redo innards differ if $w has or does not +# have a -textvariable. +# +# The options added by widgetPlus are shown on the first line of each widgetPlus +# command. The options on continuation lines are those of the widget hull. +# ------------------------------------------------------------------------------ + +proc CreateWidget {w} { + destroy $w + switch -exact -- $::hullType { + entry {entryPlus $w -undo 1 -maxundo 0 \ + -bg white} + + spinbox {spinboxPlus $w -undo 1 -maxundo 0 \ + -values {1 2 3 4 5} \ + -bg white} + + ttk::entry {ttkEntryPlus $w -undo 1 -maxundo 0} + + ttk::spinbox {ttkSpinboxPlus $w -undo 1 -maxundo 0 \ + -values {1 2 3 4 5}} + + ttk::combobox {ttkComboboxPlus $w -undo 1 -maxundo 0 \ + -values {1 2 3 4 5}} + + default {error {set ::hullType to entry, ttk::entry, spinbox,\ + ttk::spinbox, or ttk::combobox}} + } + + pack $w -side left + + $w delete 0 end + $w insert end {Initial Text} + $w edit reset + + return +} + + +# ------------------------------------------------------------------------------ +# Command CreateDemo +# ------------------------------------------------------------------------------ +# Command to create a megawidget with a descriptive label, a radiobutton widget +# selector, and a widgetPlus widget. +# ------------------------------------------------------------------------------ + +proc CreateDemo {w} { + frame $w + label $w.lab -text {Use radiobuttons to choose widget:} + pack $w.lab -pady 10 + + frame $w.f + radiobutton $w.f.rb0 -value entry -text entry + radiobutton $w.f.rb1 -value spinbox -text spinbox + radiobutton $w.f.rb2 -value ttk::entry -text ttk::entry + radiobutton $w.f.rb3 -value ttk::spinbox -text ttk::spinbox + radiobutton $w.f.rb4 -value ttk::combobox -text ttk::combobox + + foreach rb {.f.rb0 .f.rb1 .f.rb2 .f.rb3 .f.rb4} { + $w$rb configure -variable ::hullType -command [list CreateWidget $w.g.e] + } + pack $w.f.rb0 $w.f.rb1 $w.f.rb2 $w.f.rb3 $w.f.rb4 -side left -padx 5 + pack $w.f + set ::hullType entry + + frame $w.g + pack $w.g -padx 20 -pady {20 10} + + frame $w.g.filler -height 30 -width 1 + pack $w.g.filler -side left + + # Start with "entry", specified by ::hullType. + CreateWidget $w.g.e + return $w +} + +CreateDemo .wpdemo +pack .wpdemo + + +# ------------------------------------------------------------------------------ +# Create, initialize, and map text widget. +# ------------------------------------------------------------------------------ + +text .top -height 22 -bg white -wrap word -undo 1 -maxundo 0 +pack .top + +set RR \u00ae + +.top insert end {Try using the persistent PRIMARY selection on the widget modified with widgetPlus (above) and the text widget (here). + +When the selection is cleared in the widget that owns the PRIMARY selection, usually Tk also clears the PRIMARY selection. The persistentSelection package ensures that, instead, the PRIMARY selection retains the last non-empty selected string. + +Also try using Undo/Redo on these widgets.} + +.top insert end " + +On X11 systems (Linux$RR, BSD$RR, Solaris$RR ...) + <> is mapped to + <> is mapped to + +On Windows$RR systems + <> is mapped to + <> is mapped to + +On Aqua$RR systems (i.e. Apple$RR macOS$RR or OS X$RR) + <> is mapped to + <> is mapped to +" + +.top edit reset + + +# ------------------------------------------------------------------------------ +# Create, initialize, and map ntext widget. +# ------------------------------------------------------------------------------ + +# Create and map a ntext widget. +text .mid -height 5 -bg white -wrap word -undo 1 -maxundo 0 +pack .mid -pady {10 0} +bindtags .mid {.mid Ntext . all} +.mid insert end "Also try the persistent PRIMARY selection, and Undo/Redo, on this ntext widget." +.mid edit reset + + +# ------------------------------------------------------------------------------ +# Code for monitoring tools can be copied here from allWidgetsDebugDemo.tcl. +# These tools are not necessary for the demo to work, but they show what is +# happening. +# ------------------------------------------------------------------------------ diff --git a/examples/persistentSelection/simpleDemoEntryPlus.tcl b/examples/persistentSelection/simpleDemoEntryPlus.tcl new file mode 100755 index 00000000..dd1cb6f9 --- /dev/null +++ b/examples/persistentSelection/simpleDemoEntryPlus.tcl @@ -0,0 +1,99 @@ +#!/bin/sh +# the next line restarts using tclsh \ +exec tclsh "$0" "$@" + +# Copyright (c) 2017-2018 Keith Nash. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. + +# ------------------------------------------------------------------------------ +# Demo of the persistent selection module persistentSelection. +# ------------------------------------------------------------------------------ +# This demo is for entryPlus widgets only. +# ------------------------------------------------------------------------------ + + +# ------------------------------------------------------------------------------ +# Load package(s) and create bindings. +# ------------------------------------------------------------------------------ + +package require Tk +package require persistentSelection +package require snit +package require widgetPlus +namespace import widgetPlus::* + +# To use with widgetPlus::entryPlus widgets: +bind EntryPlus <> {persistentSelection::report entry %W} + + +# ------------------------------------------------------------------------------ +# Create, initialize, and map entryPlus widget. +# ------------------------------------------------------------------------------ + +entryPlus .e -undo 1 -maxundo 0 -bg white + +.e delete 0 end +.e insert end {Initial Text} +.e edit reset +pack .e -padx 40 -pady 20 -fill x + + +# ------------------------------------------------------------------------------ +# Create and map a label widget with instructions. +# ------------------------------------------------------------------------------ + +label .lab1 -justify left -anchor center +pack .lab1 -padx 20 -pady {0 20} + +.lab1 configure -text {Try using the persistent PRIMARY selection on the\ + entryPlus widget. + +When the selection is cleared in the widget that owns the PRIMARY +selection, usually Tk also clears the PRIMARY selection. The +persistentSelection package ensures that, instead, the PRIMARY +selection retains the last non-empty selected string.} + + +# ------------------------------------------------------------------------------ +# To replace entryPlus with a different widgetPlus widget: +# ------------------------------------------------------------------------------ + +if 0 { +# This block of code is not executed! + +# To try a different type of widgetPlus widget, look for these two lines in +# the code above: + +# entry +bind EntryPlus <> {persistentSelection::report entry %W} +entryPlus .e -undo 1 -maxundo 0 -bg white + +# and replace them with one of the pairs of lines below. Alternatively use +# the demo #### which has a radiobutton widget selector. + +# spinbox +bind SpinboxPlus <> {persistentSelection::report entry %W} +spinboxPlus .e -undo 1 -maxundo 0 -values {1 2 3 4 5} -bg white + +# ttk::entry +bind TEntryPlus <> {persistentSelection::report entry %W} +ttkEntryPlus .e -undo 1 -maxundo 0 + +# ttk::spinbox +bind TSpinboxPlus <> {persistentSelection::report entry %W} +ttkSpinboxPlus .e -undo 1 -maxundo 0 -values {1 2 3 4 5} + +# ttk::combobox +ttk::combobox ttkComboboxPlus .e -undo 1 -maxundo 0 -values {1 2 3 4 5} +bind TComboboxPlus <> {persistentSelection::report entry %W} + +} + + +# ------------------------------------------------------------------------------ +# Code for monitoring tools can be copied here from allWidgetsDebugDemo.tcl. +# These tools are not necessary for the demo to work, but they show what is +# happening. +# ------------------------------------------------------------------------------ diff --git a/examples/persistentSelection/simpleDemoNtext.tcl b/examples/persistentSelection/simpleDemoNtext.tcl new file mode 100755 index 00000000..33e0ee2c --- /dev/null +++ b/examples/persistentSelection/simpleDemoNtext.tcl @@ -0,0 +1,50 @@ +#!/bin/sh +# the next line restarts using tclsh \ +exec tclsh "$0" "$@" + +# Copyright (c) 2017-2018 Keith Nash. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. + +# ------------------------------------------------------------------------------ +# Demo of the persistent selection module persistentSelection. +# ------------------------------------------------------------------------------ +# This demo is for ntext text widgets only. +# ------------------------------------------------------------------------------ + + +# ------------------------------------------------------------------------------ +# Load package(s) and create bindings. +# ------------------------------------------------------------------------------ + +package require Tk +package require persistentSelection +package require ntext + +# To use with ntext widgets: +bind Ntext <> {persistentSelection::report text %W} + + +# ------------------------------------------------------------------------------ +# Create, initialize, and map ntext widget. +# ------------------------------------------------------------------------------ + +text .mid -bg white -height 10 -wrap word -undo 1 -maxundo 0 +bindtags .mid {.mid Ntext . all} +pack .mid + +.mid insert end {Widget .mid, bindtag Ntext. + +Try using the persistent PRIMARY selection with this widget. + +When the selection is cleared in the widget that owns the PRIMARY selection, usually Tk also clears the PRIMARY selection. The persistentSelection package ensures that, instead, the PRIMARY selection retains the last non-empty selected string. +} +.mid edit reset + + +# ------------------------------------------------------------------------------ +# Code for monitoring tools can be copied here from allWidgetsDebugDemo.tcl. +# These tools are not necessary for the demo to work, but they show what is +# happening. +# ------------------------------------------------------------------------------ diff --git a/examples/persistentSelection/simpleDemoText.tcl b/examples/persistentSelection/simpleDemoText.tcl new file mode 100755 index 00000000..46fb847f --- /dev/null +++ b/examples/persistentSelection/simpleDemoText.tcl @@ -0,0 +1,50 @@ +#!/bin/sh +# the next line restarts using tclsh \ +exec tclsh "$0" "$@" + +# Copyright (c) 2017-2018 Keith Nash. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. + +# ------------------------------------------------------------------------------ +# Demo of the persistent selection module persistentSelection. +# ------------------------------------------------------------------------------ +# This demo is for plain text widgets only. +# It requires no packages except Tk and persistentSelection itself. +# ------------------------------------------------------------------------------ + + +# ------------------------------------------------------------------------------ +# Load package(s) and create bindings. +# ------------------------------------------------------------------------------ + +package require Tk +package require persistentSelection + +# To use with text widgets: +persistentSelection::fixText +bind Text <> {persistentSelection::report text %W} + + +# ------------------------------------------------------------------------------ +# Create, initialize, and map text widget. +# ------------------------------------------------------------------------------ + +text .top -bg white -height 10 -wrap word -undo 1 -maxundo 0 +pack .top + +.top insert end {Widget .top, bindtag Text. + +Try using the persistent PRIMARY selection with this widget. + +When the selection is cleared in the widget that owns the PRIMARY selection, usually Tk also clears the PRIMARY selection. The persistentSelection package ensures that, instead, the PRIMARY selection retains the last non-empty selected string. +} +.top edit reset + + +# ------------------------------------------------------------------------------ +# Code for monitoring tools can be copied here from allWidgetsDebugDemo.tcl. +# These tools are not necessary for the demo to work, but they show what is +# happening. +# ------------------------------------------------------------------------------ diff --git a/examples/widgetPlus/widgetPlusDemo.tcl b/examples/widgetPlus/widgetPlusDemo.tcl new file mode 100644 index 00000000..ab638633 --- /dev/null +++ b/examples/widgetPlus/widgetPlusDemo.tcl @@ -0,0 +1,162 @@ +#!/bin/sh +# the next line restarts using tclsh \ +exec tclsh "$0" "$@" + +# Copyright (c) 2017-2018 Keith Nash. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. + +# This script is a demo of Undo/Redo in the widgetPlus widgets (entryPlus etc) and +# in the text widget. + +package require Tk +package require snit +package require widgetPlus +namespace import widgetPlus::* + +# ------------------------------------------------------------------------------ +# Command CreateWidget +# ------------------------------------------------------------------------------ +# Command to create a widgetPlus widget, initialize it, and map it. +# If there is an existing widget with the same name it is destroyed. +# +# When debugging, note that the Undo/Redo innards differ if $w has or does not +# have a -textvariable. +# +# The options added by widgetPlus are shown on the first line of each widgetPlus +# command. The options on continuation lines are those of the widget hull. +# ------------------------------------------------------------------------------ + +proc CreateWidget {w} { + destroy $w + switch -exact -- $::hullType { + entry {entryPlus $w -undo 1 -maxundo 0 \ + -bg white} + + spinbox {spinboxPlus $w -undo 1 -maxundo 0 \ + -values {1 2 3 4 5} \ + -bg white} + + ttk::entry {ttkEntryPlus $w -undo 1 -maxundo 0} + + ttk::spinbox {ttkSpinboxPlus $w -undo 1 -maxundo 0 \ + -values {1 2 3 4 5}} + + ttk::combobox {ttkComboboxPlus $w -undo 1 -maxundo 0 \ + -values {1 2 3 4 5}} + + default {error {set ::hullType to entry, ttk::entry, spinbox,\ + ttk::spinbox, or ttk::combobox}} + } + + pack $w -side left + + $w delete 0 end + $w insert end {Initial Text} + $w edit reset + + return +} + + +# ------------------------------------------------------------------------------ +# Command CreateDemo +# ------------------------------------------------------------------------------ +# Command to create a megawidget with a descriptive label, a radiobutton widget +# selector, and a widgetPlus widget. +# ------------------------------------------------------------------------------ + +proc CreateDemo {w} { + frame $w + label $w.lab -text {Use radiobuttons to choose widget:} + pack $w.lab -pady 10 + + frame $w.f + radiobutton $w.f.rb0 -value entry -text entry + radiobutton $w.f.rb1 -value spinbox -text spinbox + radiobutton $w.f.rb2 -value ttk::entry -text ttk::entry + radiobutton $w.f.rb3 -value ttk::spinbox -text ttk::spinbox + radiobutton $w.f.rb4 -value ttk::combobox -text ttk::combobox + + foreach rb {.f.rb0 .f.rb1 .f.rb2 .f.rb3 .f.rb4} { + $w$rb configure -variable ::hullType -command [list CreateWidget $w.g.e] + } + pack $w.f.rb0 $w.f.rb1 $w.f.rb2 $w.f.rb3 $w.f.rb4 -side left -padx 5 + pack $w.f + set ::hullType entry + + frame $w.g + pack $w.g -padx 20 -pady {20 10} + + frame $w.g.filler -height 30 -width 1 + pack $w.g.filler -side left + + # Start with "entry", specified by ::hullType. + CreateWidget $w.g.e + return $w +} + +# Select, create and map a widgetPlus widget. + +CreateDemo .wpdemo +pack .wpdemo + +# Choose options: whether to use persistentSelection, ntext. +set PS 0 +set NT 0 + +# Create and map a text widget. + +text .top -height 17 -bg white -wrap word -undo 1 -maxundo 0 +pack .top + +set RR \u00ae + +.top insert end "Try Undo/Redo on the widget modified with widgetPlus (above) and the text widget (here). + +On X11 systems (Linux$RR, BSD$RR, Solaris$RR ...) + <> is mapped to + <> is mapped to + +On Windows$RR systems + <> is mapped to + <> is mapped to + +On Aqua$RR systems (i.e. Apple$RR macOS$RR or OS X$RR) + <> is mapped to + <> is mapped to +" + +if $PS { + .top insert end "\nAlso try using the persistent PRIMARY selection." +} + +.top edit reset + +if $NT { + # Create and map a ntext widget. + package require ntext + text .mid -height 5 -bg white -wrap word -undo 1 -maxundo 0 + pack .mid -pady {10 0} + bindtags .mid {.mid Ntext . all} + if $PS { + .mid insert end "Also try the persistent PRIMARY selection, and Undo/Redo, on this ntext widget." + } else { + .mid insert end "Also try Undo/Redo on this ntext widget." + } + .mid edit reset +} + +if $PS { + # Append this code to test persistentSelection. + package require persistentSelection + persistentSelection::fixText + bind Text <> {persistentSelection::report text %W} + bind Ntext <> {persistentSelection::report text %W} + bind EntryPlus <> {persistentSelection::report entry %W} + bind TEntryPlus <> {persistentSelection::report entry %W} + bind SpinboxPlus <> {persistentSelection::report entry %W} + bind TSpinboxPlus <> {persistentSelection::report entry %W} + bind TComboboxPlus <> {persistentSelection::report entry %W} +} diff --git a/modules/persistentSelection/PersistentSelection.odt b/modules/persistentSelection/PersistentSelection.odt new file mode 100644 index 0000000000000000000000000000000000000000..05a45b7b166df8d2525a14f95aecd0ee6ab1b091 GIT binary patch literal 17575 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 Ty#xe=^zmo=5r2pTejoiG;ro() literal 0 HcmV?d00001 diff --git a/modules/persistentSelection/PersistentSelection.pdf b/modules/persistentSelection/PersistentSelection.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4b2ded8b01722e335f3e011bb689724627ce4dc3 GIT binary patch literal 66968 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%0A9KYd;!%HuAmT@t6f+hYhhN|0FsI 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
    K<2R@v?rM7LEQFdbx* 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] event, will fail. + +[para] +The [package persistentSelection] package offers more convenient behavior. It will sustain as the [const PRIMARY] selection the last non-empty value set by any [package Tk] widget that it monitors, as long as the [const PRIMARY] selection is not claimed by another process, or by a widget that it does not monitor. + +[para] +The [package persistentSelection] package works by binding to the [const <>] event on the widgets of interest, and using this binding to monitor any change of the selection in the widget. Its commands are confined to the namespace [namespace ::persistentSelection]. + +[section COMMANDS] + +[list_begin definitions] + + +[call [cmd persistentSelection::fixText]] + +Call this command once to resolve problems with [syscmd [widget text]] widgets that use the default [const Text] bindtag (rather than [const Ntext]). See [sectref {Text widgets}] for an explanation. + +[para] +The command adjusts some [const Text] bindings to generate [const <>] events; and it re-orders calls to the [syscmd [widget text]] widget [cmd tag] command in the private command [cmd ::tk::TextSelectTo], so that this command cooperates better with [package persistentSelection]. + +[para] +These adjustments are needed only to older versions of [package Tk]. The command [cmd persistentSelection::fixText] has no effect on sufficiently recent releases. It can safely be called for any version of [package Tk]. + +[call [cmd persistentSelection::getClassicPrimarySel] [opt [arg displayOf]] [opt [arg withOthers]]] + +[list_begin itemized] +[item] [arg displayOf] - a [package Tk] window path on the display to be interrogated (optional, default {[const .]}) +[item] [arg withOthers] - whether to return the [const PRIMARY] selection if it is owned by another process or interpreter (optional, boolean, default [const false]) +[list_end] + +A command to return the classic (non-persistent) form of the [const PRIMARY] selection. If the selection does not exist, or is sustained only by [package persistentSelection], the command returns the empty string. + + +[call [cmd persistentSelection::getPrimarySel] [opt [arg displayOf]]] +[list_begin itemized] +[item] [arg displayOf] - a [package Tk] window on the display to be interrogated (optional, default {[const .]}) +[list_end] + +A command to return the value of the [const PRIMARY] selection. If the selection does not exist, the command returns the empty string. The usual [package Tk] commands are perfectly valid, but they raise an error if the selection does not exist. + +[call [cmd persistentSelection::report] [arg type] [arg pathName]] + +[list_begin itemized] +[item] [arg type] - (value [const text] or [const entry]) classification of the widget whose selection has changed +[item] [arg pathName] - the [package Tk] window path of the widget whose selection has changed +[list_end] + +To make package [package persistentSelection] monitor a widget, this command must be bound to the [const <>] event on that widget. The command records changes in the widget's selection, and uses the information to sustain a non-empty [const PRIMARY] selection on each display. + +[list_end] + + +[section USAGE] +[subsection {Script requirements}] + +For each widget that will be monitored by [package persistentSelection], the command [cmd persistentSelection::report] must be bound to event [const <>] in one of the widget's binding tags. + +[para] +For example, the developer may wish to use [package persistentSelection] with every [syscmd [widget text]] and [syscmd [widget entryPlus]] widget in an application: this can be achieved by adding the [const <>] binding to the [const Text] and [const EntryPlus] bindtags. See [sectref EXAMPLES]. + +[para] +If [package persistentSelection] is not required for all widgets of a particular class, the binding can be added to per-widget bindtags. See [sectref EXAMPLES]. + +[subsection {Widget requirements}] +To be capable of being monitored by [package persistentSelection], a widget must satisfy three conditions: +[list_begin itemized] + +[item] It must have an [option -exportselection] option that allows it to export its selection to the [const PRIMARY] selection. + +[item] It must generate a [const <>] event whenever its selection changes. + +[item] its bindings to other events should be suitable - specifically, in versions of [package Tk] older than [const 8.6.6], a GUI event that extends or reduces the selection from one non-empty value to another should not use an intermediate state that has an empty selection, because this confuses [package persistentStore]. + +[list_end] + +[para] +The [package Tk] and [const Ttk] widgets that can export their selection are [syscmd [widget text]], [syscmd [widget entry]], [syscmd [widget listbox]], [syscmd [widget spinbox]], [syscmd [widget ttk::entry]], [syscmd [widget ttk::spinbox]], and [syscmd [widget ttk::combobox]]. + +[subsection {Text widgets}] +In versions of [package Tk] older than [const 8.6.9], the [syscmd [widget text]] widget does not generate [const <>] events in a few "corner cases" in which its selection changes. These omissions can be corrected by changes to the [const Text] bindings, in order to satisfy the second condition of [sectref {Widget requirements}]. + +[para] +In addition, versions of [package Tk] older than [const 8.6.6] process selection events slightly differently from newer versions, and in combination with the [const Text] bindings this confuses [package persistentStore]. If an upgrade to the current version of [const Tcl/Tk] is not feasible, this problem can be resolved by making a slight modification to the widget bindings, in order to satisfy the third condition of [sectref {Widget requirements}]. + +[para] +Either the script should call the command [cmd persistentSelection::fixText] to adjust the [const Text] bindings and the commands that they call; or the widget can use the [const Ntext] binding tag (for [package ntext] version 1.0 or above) instead of the default [const Text] bindtag. + +[para] +In either case, the argument [arg type] supplied to command [cmd persistentSelection::report] should have the value [const text]. + +[subsection {Entry, spinbox, ttk::entry, ttk::spinbox, and ttk::combobox widgets}] +The [syscmd [widget entry]], [syscmd [widget spinbox]], [syscmd [widget ttk::entry]], [syscmd [widget ttk::spinbox]], and [syscmd [widget ttk::combobox]] widgets do not generate a [const <>] event when their selection changes, and therefore require modification. + +[para] +The package [package widgetPlus] provides [package snit] wrappers [syscmd [widget widgetPlus::entryPlus]], [syscmd [widget widgetPlus::spinboxPlus]], [syscmd [widget widgetPlus::ttkEntryPlus]], [syscmd [widget widgetPlus::ttkSpinboxPlus]], and [syscmd [widget widgetPlus::ttkComboboxPlus]] respectively. Each [package widgetPlus] widget generates the required [const <>] events. + +[para] +In all these cases, the argument [arg type] supplied to command [cmd persistentSelection::report] should have the value [const entry]. This argument determines how [package persistentSelection] will inspect the widget's selection, and the commands that do so are the same for all these widgets. + +[subsection {Listbox widgets}] +A similar wrapper has not been created for the [syscmd [widget listbox]] widget, which has the complication of permitting multiple selections. + +[section {TO DO}] + +[list_begin itemized] + +[item] Test on a system with multiple displays. + +[list_end] + +[section BUGS] + +This version of [package persistentSelection] is intended to be compatible with all releases of [package Tk] 8.5 and 8.6, and with the branches [emph core-8-5-branch], [emph core-8-6-branch], [emph revised_text], and [emph trunk] in the source code repository for [package Tk]. Any incompatibility with any of these versions, for any [package Tk] windowing system, should be reported as a bug. Please report such in the category [emph persistentSelection] of the [uri http://core.tcl.tk/tklib/reportlist {Tklib Trackers}]. + +[section EXAMPLES] + +Each example uses [package persistentSelection] to retain the last non-empty value of the selection in certain widgets. Each example also includes the creation of sample widgets. + +[para] + +Monitor all [syscmd [widget entryPlus]] widgets. + +[example { +package require widgetPlus +widgetPlus::entryPlus .ep +pack .ep + +package require persistentSelection +bind EntryPlus <> {::persistentSelection::report entry %W} +}] + + +Monitor all [syscmd [widget text]] widgets that use the default [const Text] bindings. + +[example { +text .t +pack .t + +package require persistentSelection +::persistentSelection::fixText +bind Text <> {::persistentSelection::report text %W} +}] + + +Monitor all [syscmd [widget text]] widgets that use the default [const Text] bindings, and all [syscmd [widget entryPlus]] widgets. + +[example { +text .t +pack .t + +package require widgetPlus +widgetPlus::entryPlus .ep +pack .ep + +package require persistentSelection +::persistentSelection::fixText +bind Text <> {::persistentSelection::report text %W} +bind EntryPlus <> {::persistentSelection::report entry %W} +}] + + +Monitor all [syscmd [widget text]] widgets that use [const Ntext] bindings. + +[example { +text .t +pack .t + +package require ntext +bindtags .t {.t Ntext . all} + +package require persistentSelection +bind Ntext <> {::persistentSelection::report text %W} +}] + + +Monitor a single [syscmd [widget entryPlus]] widget [const .ep] + +[example { +package require widgetPlus +widgetPlus::entryPlus .ep +pack .ep + +package require persistentSelection +bind .ep <> {::persistentSelection::report entry %W} +}] + + +Monitor a single [syscmd [widget text]] widget [const .t] + +[example { +text .t +pack .t + +package require persistentSelection +bind .t <> {::persistentSelection::report text %W} +}] + + +[see_also widgetPlus text ntext bindtags] +[manpage_end] diff --git a/modules/persistentSelection/persistentSelection.tcl b/modules/persistentSelection/persistentSelection.tcl new file mode 100644 index 00000000..e9396588 --- /dev/null +++ b/modules/persistentSelection/persistentSelection.tcl @@ -0,0 +1,904 @@ +# ------------------------------------------------------------------------------ +# FILE: +# persistentSelection.tcl +# +# DESCRIPTION: +# Module to preserve the PRIMARY selection exported by a widget, after +# the user has cancelled the selection (so the widget's sel tag is empty). +# +# LICENCE: +# Copyright (C) 2017-2018 Keith Nash. +# This file is part of Tklib and may be used subject to the terms in +# file license.terms; please note in particular the terms repeated here: +# +# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +# MODIFICATIONS. +# +# ------------------------------------------------------------------------------ +# 80 columns +# Conventional use of namespace/package names. + +# ------------------------------------------------------------------------------ +# Module persistentSelection +# ------------------------------------------------------------------------------ +# Module to retain a non-empty PRIMARY selection. +# The same persistent store is shared by all windows on the same display. +# A state diagram is provided in an OpenOffice document. +# A manual page exists. +# +# --------------- +# Text widget +# --------------- +# Use with text windows that are bound EITHER to Ntext 1.0b3 or above, +# OR to Text if the command persistentSelection::fixText has been run. +# +# Usage: Bind the persistentSelection::report command to <> +# on text widgets, and supply %W as the 2nd argument. For example: +# +# package require persistentSelection +# bind SomeTag <> {::persistentSelection::report text %W} +# +# --------------- +# Entry widget +# --------------- +# Use only with entryPlus (package widgetPlus) or another suitable wrapper for +# the entry widget. +# - the Tk entry and ttk::entry widgets do not generate the <> events +# that this module needs. +# +# Usage: Bind the persistentSelection::report command to <> +# on entryPlus widgets, and supply %W as the 2nd argument. For example: +# +# package require persistentSelection +# bind SomeTag <> {::persistentSelection::report entry %W} +# +# FIXME - not tested for multiple displays. +# The code uses a separate persistent store for each display. +# ------------------------------------------------------------------------------ + +namespace eval ::persistentSelection { + variable PreviousSelection + variable Stores + variable Active + variable toplevelCount 0 + variable oldTime {} + variable logCount 0 + + # If these values are inconvenient, the caller may change them at any + # time before it uses the selection. + variable toplevelPrefix ._for_persistent_selection + variable textPath ._hidden_persistent_selection + + namespace export fixText getClassicPrimarySel getPrimarySel report +} + + +# ------------------------------------------------------------------------------ +# Proc ::persistentSelection::CreateStoreFor +# ------------------------------------------------------------------------------ +# Command to create a store for a persistent PRIMARY selection for a display. +# +# Arguments: +# displayOf Tk window path of any window on the display. +# destroyOld (boolean) whether or not to destroy the store (if any) +# previously associated with the display. +# +# Return Value: none +# ------------------------------------------------------------------------------ + +proc ::persistentSelection::CreateStoreFor {displayOf {destroyOld 0}} { + variable PreviousSelection + variable Stores + variable Active + variable toplevelCount + + set screenName [winfo screen $displayOf] + set PreviousSelection($screenName) {} + set Active($screenName) 0 + + if {$screenName eq [winfo screen .]} { + DefineStore ._hidden_persistent_selection . $destroyOld + } else { + # First create and withdraw a toplevel $tl on this display: + set tl ._for_persistent_selection[incr toplevelCount] + if {$destroyOld && [info exists Stores($screenName)]} { + destroy [winfo parent $Stores($screenName)] + } else { + } + toplevel $tl -screen $screenName + wm withdraw $tl + DefineStore $tl._hidden_persistent_selection $displayOf + } + Show + return +} + + +# ------------------------------------------------------------------------------ +# Proc ::persistentSelection::DefineStore +# ------------------------------------------------------------------------------ +# Command to change the location of the store in the unlikely case that the +# existing value is not acceptable. +# +# There is no need to map the store, or give it any bindtags. +# +# Arguments: +# w Tk window path for the window to be created. +# displayOf Tk window path of any window on the same display. +# destroyOld (boolean) whether or not to destroy the store (if any) +# previously associated with the display. +# +# Return Value: none +# ------------------------------------------------------------------------------ + +proc ::persistentSelection::DefineStore {w {displayOf .} {destroyOld 0}} { + variable Stores + + set screenName [winfo screen $displayOf] + + if {![info exists Stores($screenName)]} { + set Stores($screenName) UNDEFINED + } + + if {$destroyOld} { + destroy $Stores($screenName) + } + + set Stores($screenName) $w + text $Stores($screenName) -bg yellow -fg red + bindtags $Stores($screenName) {} + return +} + + +# ------------------------------------------------------------------------------ +# Proc ::persistentSelection::GetEntrySelection +# ------------------------------------------------------------------------------ +# Command to get the selection from an entry or ttk::entry widget +# +# Analogous to text widget's "$w get sel.first sel.last" - will return with +# error status if the selection does not exixt. +# +# Arguments: +# w Tk window path of an entry or ttk::entry window +# +# Return Value: the selected text in $w, or error if none +# ------------------------------------------------------------------------------ + +proc ::persistentSelection::GetEntrySelection {w} { + set contents [$w get] + set start [$w index sel.first] + set end [$w index sel.last] + string range $contents $start $end-1 + # N.B. Implicit Return +} + + +# ------------------------------------------------------------------------------ +# Proc ::persistentSelection::report +# ------------------------------------------------------------------------------ +# Command to retain a non-empty PRIMARY selection. +# The same persistent store is shared by all windows w on the same display. +# +# Usage: Bind this command to <> on text or entryPlus widgets, and +# supply %W as the 2nd argument. +# ------------------------------------------------------------------------------ +# Nothing happens if bound to <> on entry, ttk::entry, because these +# widgets do not support the <> event. +# +# Called (in Kerlin) from KWE/quilt.tcl where it is bound to <> in a +# revision to binding tag Ntext. +# ------------------------------------------------------------------------------ + + +# ------------------------------------------------------------------------------ +# When does the event <> fire on text widget $w? +# When persistentSelection is in use, the events can be: +# ------------------------------------------------------------------------------ +# +# ===== ================ =================== =========== +# Label Tag sel has been Selection ownership Response is +# changed in $w has moved +# ===== ================ =================== =========== +# (1) from non-empty no change ($w) Y1 +# to non-empty +# +# (2) from non-empty no change ($w) N2 +# to empty +# +# (3) from empty no change (not $w) Y2 +# to non-empty +# +# (4a) from non-empty from $w to other AE +# to empty (in this interp) +# +# (4b) from non-empty from $w to other N1 +# to empty (not in this interp) +# +# (5) no change to $w Y1 +# +# (6) no change from $w to the AE +# persistent store +# ===== ================ =================== =========== + +# "Response" is recorded in logs, and is defined by the branch taken in +# proc report. + +# AE - no response because "Another Event is is active" +# Events (4a) and (4b) each report changes similar to those of events +# (2) and (6) combined. +# In (4a) and (4b), ownership of selection has moved from $w, AND as a result +# the sel tag has been changed in $w from non-empty to empty. + +# Notes: +# When persistentSelection is in use, $w never has non-transient ownership of +# the selection when its sel tag is empty, and so does not own the selection in +# event (3). + +proc ::persistentSelection::report {type w} { + variable PreviousSelection + variable Stores + variable Active + variable logCount + + if {![$w cget -exportselection]} { + return + } + + set screenName [winfo screen $w] + + if {![info exists Stores($screenName)]} { + CreateStoreFor $w + } + + # If $w has a selection, set selDat to its value; otherwise set selDat to {} + set selDat {} + if {$type eq "text"} { + catch {set selDat [$w get sel.first sel.last]} + } elseif {$type eq "entry"} { + catch {set selDat [GetEntrySelection $w]} + } else { + } + + set selOwner [selection own -displayof $w] + + set i [incr logCount] + Log "$i Start <> $w with sel {$selDat} and owner {$selOwner}" + + if {$Active($screenName)} { + # In 8.5, <> events are not handled one at a time; all the + # superposed events are unwanted. + Log "$i AE another event is active, ignore event on $w" + } elseif {$::tk_version ne {8.5} && $selOwner eq $Stores($screenName)} { + # In 8.6+, <> events are handled one at a time; the unwanted + # events are distinguished here ... + Log "$i XX PS owns the selection, ignore event on $w" + } elseif {$::tk_version ne {8.5} && $selOwner ne $w} { + # ... and here. + Log "$i YY $w does not own the selection, ignore event on $w" + } else { + set Active($screenName) 1 + # FIXME report errors + catch { + if {$selDat ne {}} { + # Window $w has a selection. + if {$selOwner eq $w} { + Log "$i Y1 $w -- {$selDat} -- {$selOwner}" + # Do not execute "selection own" - $w already owns the + # selection, and executing "selection own" again makes $w + # lose (and therefore clear) and then regain the selection. + } else { + Log "$i Y2 $w -- {$selDat} -- {$selOwner}" + # This clears the selection in the window that has lost + # ownership. Any -command defined here in "selection own" is + # never executed. + selection own $w + } + set PreviousSelection($screenName) $selDat + + # Now cases with empty $selDat + } elseif {$selOwner eq {}} { + # The selection is owned by another process/interpreter. + Log "$i N1 $w -- {$selDat} -- {$selOwner}" + Log "$i Do not set hidden store" + set PreviousSelection($screenName) {} + } else { + # The selection is still owned by this process/interpreter. + + # These operations move ownership of the selection to the + # persistent store for this display, where it stays until + # another selection is made on this display, in any process. + Log "$i N2 $w -- {$selDat} -- {$selOwner}" + Log "$i Set hidden store to $PreviousSelection($screenName)" + Log "$i $Stores($screenName) gained PRIMARY Selection\ + from $selOwner" + + $Stores($screenName) delete 1.0 end + $Stores($screenName) insert end $PreviousSelection($screenName) + $Stores($screenName) tag add sel 1.0 end-1c + selection own -command [list ::persistentSelection::Clear \ + $Stores($screenName)] $Stores($screenName) + set PreviousSelection($screenName) {} + + Show + } + } + set Active($screenName) 0 + } + + Log "$i End <> $w" + return +} + + +# ------------------------------------------------------------------------------ +# Proc ::persistentSelection::getClassicPrimarySel +# ------------------------------------------------------------------------------ +# Command to return the classic (non-persistent) form of the PRIMARY selection. +# No error if selection does not exist. +# +# Arguments: +# w - (optional) Tk window path - used only for -displayof +# withOthers - (optional, boolean, default false) whether to return the +# selection if it is owned by another process/interpreter. +# +# Return Value: the PRIMARY selection on the display of $w, or {} if none +# ------------------------------------------------------------------------------ +# Now (with revised getPrimarySel) allows out-of-process PRIMARY selection; the +# default is not to do so. +# +# Called (in Kerlin) by KWE/worksheet.tcl in the "Search" operation - to show +# selected text in the search box. +# ------------------------------------------------------------------------------ + +proc ::persistentSelection::getClassicPrimarySel {{w .} {withOthers 0}} { + variable Stores + set screenName [winfo screen $w] + + if {![info exists Stores($screenName)]} { + CreateStoreFor $w + } + + lappend forbidden $Stores($screenName) + if {!$withOthers} { + lappend forbidden {} + } + + if {[selection own -displayof $w] in $forbidden} { + return {} + } else { + return [getPrimarySel $w] + } + # N.B. Multiple Return. +} + + +# ------------------------------------------------------------------------------ +# Proc ::persistentSelection::getPrimarySel +# ------------------------------------------------------------------------------ +# Command to return the PRIMARY selection. +# No error if selection does not exist. +# +# The Tk command is perfectly valid (and its equivalent is called here), but it +# is designed to raise an error if the selection does not exist. This command +# catches the error and returns the empty string. +# +# Arguments: +# displayOf - (optional) Tk window path - used only for -displayof +# +# Return Value: the PRIMARY selection on the display of $displayOf, +# or {} if none +# ------------------------------------------------------------------------------ +# Previously returned a value only if the selection was owned by this +# interpreter - found by testing ([selection own -displayof $displayOf] ne {}). +# +# Called (in Kerlin) from panels::textbox typemethod RawInsertAfter; if the +# result is non-empty, a new textbox will be created and a <> +# event will be generated there. +# ------------------------------------------------------------------------------ + +proc ::persistentSelection::getPrimarySel {{displayOf .}} { + if {(![catch {GetSelection $displayOf PRIMARY} selectedText]) + } { + # Selection has been copied into selectedText + } else { + set selectedText {} + } + return $selectedText +} + + +# ------------------------------------------------------------------------------ +# Proc ::persistentSelection::Clear +# ------------------------------------------------------------------------------ +# Command executed when the persistent store $storeValue loses ownership of the +# PRIMARY selection. Deletes the selection in the persistent store. +# +# Movement of ownership is lazy: it will not happen when another window has +# focus, it waits until a selection is made. +# +# Arguments: +# storeValue - Tk window path of the persistent store +# +# Return Value: none +# ------------------------------------------------------------------------------ + +proc ::persistentSelection::Clear {storeValue} { + set selOwner [selection own -displayof $storeValue] + $storeValue delete 1.0 end + + Log "xx $storeValue lost PRIMARY Selection to $selOwner" + Log "xx Set hidden store to {}" + Show + + return +} + + +# ------------------------------------------------------------------------------ +# Proc ::persistentSelection::GetSelection +# ------------------------------------------------------------------------------ +# This private Tk command ::tk::GetSelection is copied to avoid breakage if Tk +# evolves. +# It is copied without changes except its namespace, and removal from the error +# return of arguments -errorcode {TK SELECTION NONE} +# +# ::tk::GetSelection -- +# This tries to obtain the default selection. On Unix, we first try +# and get a UTF8_STRING, a type supported by modern Unix apps for +# passing Unicode data safely. We fall back on the default STRING +# type otherwise. On Windows, only the STRING type is necessary. +# Arguments: +# w The widget for which the selection will be retrieved. +# Important for the -displayof property. +# sel The source of the selection (PRIMARY or CLIPBOARD) +# Results: +# Returns the selection, or an error if none could be found +# ------------------------------------------------------------------------------ + +if {[tk windowingsystem] ne "win32"} { + proc ::persistentSelection::GetSelection {w {sel PRIMARY}} { + if {[catch { + selection get -displayof $w -selection $sel -type UTF8_STRING + } txt] && [catch { + selection get -displayof $w -selection $sel + } txt]} then { + return -code error \ + "could not find default selection" + } else { + return $txt + } + } +} else { + proc ::persistentSelection::GetSelection {w {sel PRIMARY}} { + if {[catch { + selection get -displayof $w -selection $sel + } txt]} then { + return -code error \ + "could not find default selection" + } else { + return $txt + } + } +} + + +# ------------------------------------------------------------------------------ +# Proc ::persistentSelection::Log +# ------------------------------------------------------------------------------ +# Command for use in debugging, to log events handled by this module. +# +# If required, this dummy command should be replaced with one that does +# something - see e.g. ::persistentSelection::LogExample +# +# Arguments: +# msg - text to be reported +# +# Return Value: none +# ------------------------------------------------------------------------------ + +proc ::persistentSelection::Log msg { +} + +# ------------------------------------------------------------------------------ +# Proc ::persistentSelection::Show +# ------------------------------------------------------------------------------ +# Command for use in debugging, to display the contents of the persistent +# storage. +# +# If required, this dummy command should be replaced with one that does +# something - see e.g. ::persistentSelection::ShowExample +# +# Arguments: none +# Return Value: none +# ------------------------------------------------------------------------------ + +proc ::persistentSelection::Show {} { +} + + +# ------------------------------------------------------------------------------ +# Proc ::persistentSelection::fixText +# ------------------------------------------------------------------------------ +# Command to replace the command ::tk::TextSelectTo with one that is compatible +# with persistentStorage. +# +# First checks that the command is loaded, then examines the end of the +# procedure body and replaces it if possible. If it is not possible, it +# replaces the entire procedure body with a suitable one. +# +# Arguments: none +# Return Value: none +# ------------------------------------------------------------------------------ + +proc ::persistentSelection::fixText {} { +#indent-4 + +# -------------------------------------------------- +# (0) Ensure text.tcl has been sourced. +# -------------------------------------------------- + +catch ::tk::TextSelectTo + +# -------------------------------------------------- +# (1) Fix Bindings: add extra <> events, +# omitted by the widget, to Tk versions < 8.6.9. +# -------------------------------------------------- + +if {![package vsatisfies [package require Tk] 8.6.9-]} { +#indent-4 + +bind Text { + if {[%W cget -state] eq "normal"} { + if {[tk::TextCursorInSelection %W]} { + # When deleting the selection, make this an atomic operation on the Undo + # stack, i.e. separate it from other delete operations on either side. + if {[%W cget -autoseparators]} { + %W edit separator + } else { + } + %W delete sel.first sel.last + if {[%W cget -autoseparators]} { + %W edit separator + } else { + } + # The PRIMARY selection has changed but the widget does + # not generate this event. + event generate %W <> + } elseif {[%W compare end != insert+1i]} { + %W delete insert + } + %W see insert + } +} + +bind Text <> { + if {$tk_strictMotif || ![info exists tk::Priv(mouseMoved)] + || !$tk::Priv(mouseMoved)} { + tk::TextPasteSelection %W %x %y + } +} + +# Add this command for early Tk that do not have it. +proc ::tk::TextCursorInSelection {w} { + expr { + [llength [$w tag ranges sel]] + && [$w compare sel.first <= insert] + && [$w compare sel.last >= insert] + } +} + +proc ::tk::TextPasteSelection {w x y} { + if {[$w cget -state] eq "normal"} { + $w mark set insert [TextClosestGap $w $x $y] + TextInsertSelection $w PRIMARY + focus $w + } + return +} + +proc ::tk_textCut w { + if {![catch {set data [$w get sel.first sel.last]}]} { + clipboard clear -displayof $w + clipboard append -displayof $w $data + + if {([$w cget -state] eq "normal")} { + # make <> an atomic operation on the Undo stack, + # i.e. separate it from other delete operations on either side + # (For older Tk? Check.) disable -autoseparators for the operation. + set oldSeparator [$w cget -autoseparators] + if {$oldSeparator} { + $w configure -autoseparators 0 + $w edit separator + } + + $w delete sel.first sel.last + + if {$oldSeparator} { + $w edit separator + $w configure -autoseparators 1 + } + + # The PRIMARY selection has changed but the widget does + # not generate this event. + event generate $w <> + } + } + return +} + +proc ::tk_textPaste w { + if {[$w cget -state] eq "normal"} { + ::tk::TextInsertSelection $w CLIPBOARD + } + return +} + +proc ::tk::TextInsertSelection {w selection} { + if {[catch {::tk::GetSelection $w $selection} sel]} { + return + } + set oldSeparator [$w cget -autoseparators] + if {$oldSeparator} { + $w configure -autoseparators 0 + $w edit separator + } + + if {([$w tag nextrange sel 1.0 end] ne "")} { + set oldSel [list [$w index sel.first] [$w index sel.last]] + } else { + set oldSel {} + } + + set pos insert + if { ($selection eq "CLIPBOARD") + && ([tk windowingsystem] ne "x11") + && ([$w tag nextrange sel 1.0 end] ne "") + } { + set pos [$w index sel.first] + $w delete sel.first sel.last + } + $w insert $pos $sel + if {$oldSeparator} { + $w edit separator + $w configure -autoseparators 1 + } + + # The PRIMARY selection has changed but the widget does + # not generate this event. + if { ($selection eq "PRIMARY") + && [TextCursorInSelection $w] + } { + event generate $w <> + } + + # The PRIMARY selection has changed but the widget does + # not generate this event. + # The operation doesn't change the value without changing the range, + # so it is enough to consider the range. + # The operation does not mark a selection if none existed before. + if { ($selection eq "CLIPBOARD") + && ($oldSel ne {}) + && ( ([$w tag nextrange sel 1.0 end] eq "") + || ([list [$w index sel.first] [$w index sel.last]] ne $oldSel) + ) + } { + event generate $w <> + } + + return +} + +#indent+4 +} + + +# -------------------------------------------------- +# (2) Rewrite Proc ::tk::TextSelectTo. +# -------------------------------------------------- + +if {![package vsatisfies [package require Tk] 8.6.6-]} { +#indent-4 + + +set replace {if {$Priv(mouseMoved) || ($Priv(selectMode) ne "char")} { + $w mark set insert $cur + $w tag remove sel 1.0 $first + $w tag add sel $first $last + $w tag remove sel $last end + update idletasks + }} + +set needle {if {$Priv(mouseMoved) || ($Priv(selectMode) ne "char")} { + $w tag remove sel 0.0 end + $w mark set insert $cur + $w tag add sel $first $last + $w tag remove sel $last end + update idletasks + }} + +set haystack [info body ::tk::TextSelectTo] + +set srch [string last $needle $haystack] + +if {$srch != -1} { + # There's a match. Now check it is followed only by whitespace, + # and preceded by whitespace that includes a newline. + set last [expr {$srch + [string length $needle] - 1}] + set ndle [string range $haystack $srch $last] + set post [string trim [string range $haystack $last+1 end]] + set pre [string range $haystack 0 $srch-1] + set pres [string trimright $pre] + set diff [string range $pre [string length $pres] end] + if {[string trim $diff] eq {} && [string first \n $diff] != -1} { + # All conditions met. Redefine the function. + set newBody $pre$replace\n\n + proc ::tk::TextSelectTo {w x y {extend 0}} $newBody + return + } +} + +# We're still here. So define a standard proc (from Tk 8.6.8 with the +# code at the end replaced), and forgo any changes made to the proc it +# is replacing. + +proc ::tk::TextSelectTo {w x y {extend 0}} { + variable ::tk::Priv + + set anchorname [tk::TextAnchor $w] + set cur [TextClosestGap $w $x $y] + if {[catch {$w index $anchorname}]} { + $w mark set $anchorname $cur + } + set anchor [$w index $anchorname] + if {[$w compare $cur != $anchor] || (abs($Priv(pressX) - $x) >= 3)} { + set Priv(mouseMoved) 1 + } + switch -- $Priv(selectMode) { + char { + if {[$w compare $cur < $anchorname]} { + set first $cur + set last $anchorname + } else { + set first $anchorname + set last $cur + } + } + word { + # Set initial range based only on the anchor (1 char min width) + if {[$w mark gravity $anchorname] eq "right"} { + set first $anchorname + set last "$anchorname + 1c" + } else { + set first "$anchorname - 1c" + set last $anchorname + } + # Extend range (if necessary) based on the current point + if {[$w compare $cur < $first]} { + set first $cur + } elseif {[$w compare $cur > $last]} { + set last $cur + } + + # Now find word boundaries + set first [TextPrevPos $w "$first + 1c" tcl_wordBreakBefore] + set last [TextNextPos $w "$last - 1c" tcl_wordBreakAfter] + } + line { + # Set initial range based only on the anchor + set first "$anchorname linestart" + set last "$anchorname lineend" + + # Extend range (if necessary) based on the current point + if {[$w compare $cur < $first]} { + set first "$cur linestart" + } elseif {[$w compare $cur > $last]} { + set last "$cur lineend" + } + set first [$w index $first] + set last [$w index "$last + 1c"] + } + } +# if {$Priv(mouseMoved) || ($Priv(selectMode) ne "char")} { +# $w tag remove sel 0.0 end +# $w mark set insert $cur +# $w tag add sel $first $last +# $w tag remove sel $last end +# update idletasks +# } + if {$Priv(mouseMoved) || ($Priv(selectMode) ne "char")} { + $w mark set insert $cur + $w tag remove sel 1.0 $first + $w tag add sel $first $last + $w tag remove sel $last end + update idletasks + } +} + +#indent+4 +} + +return + +#indent+4 +} + + +# These commands are not called by anything, but are examples that the developer +# can call from ::persistentSelection::Log, ::persistentSelection::Show +# for debugging purposes. + +# ------------------------------------------------------------------------------ +# Proc ::persistentSelection::LogExample +# ------------------------------------------------------------------------------ +# Example logging command. See ::persistentSelection::Log for specs. +# +# If debugging is required, define ::persistentSelection::Log to wrap a command +# like this one. This example requires a text widget $w. +# ------------------------------------------------------------------------------ + +proc ::persistentSelection::LogExample {w level msg} { + variable oldTime + set pattern {^([0-9]*) Start( <> .*$)} + if {$level > 0} { + set newTime [clock milliseconds] + if {$oldTime eq {}} { + set oldTime $newTime + } + + if {$newTime - $oldTime > 200} { + $w insert end \n + } + + $w insert end $msg + $w insert end \n + $w see end-1c + + set oldTime $newTime + } elseif {[regexp -- $pattern $msg all part1 part2]} { + $w insert end $part1$part2 + $w insert end \n + $w see end-1c + } + return +} + + +# ------------------------------------------------------------------------------ +# Proc ::persistentSelection::ShowExample +# ------------------------------------------------------------------------------ +# Example command to show the contents of the persistent storage. +# See ::persistentSelection::Show for specs. +# +# If debugging is required, define ::persistentSelection::Show to wrap a command +# like this one. This example requires a label widget $w. +# ------------------------------------------------------------------------------ + +proc ::persistentSelection::ShowExample {w} { + variable Stores + set msg {} + foreach path [lsort [array names Stores]] { + append msg "Persistent Store for display {$path} holds" + append msg " {[$Stores($path) get 1.0 end-1c]}\n" + } + set msg [string range $msg 0 end-1] + if {$msg eq {}} { + set msg {Persistent Store is empty} + } + $w configure -text $msg + return +} + + +# Older versions of Tk need this to be set in the file. +package provide persistentSelection 1.0b1 diff --git a/modules/persistentSelection/pkgIndex.tcl b/modules/persistentSelection/pkgIndex.tcl new file mode 100644 index 00000000..c18f475f --- /dev/null +++ b/modules/persistentSelection/pkgIndex.tcl @@ -0,0 +1 @@ +package ifneeded persistentSelection 1.0b1 [list source [file join $dir persistentSelection.tcl]] diff --git a/modules/widgetPlus/entryExtras.test b/modules/widgetPlus/entryExtras.test new file mode 100644 index 00000000..5298356f --- /dev/null +++ b/modules/widgetPlus/entryExtras.test @@ -0,0 +1,125 @@ +# This file is a Tcl script to test entry widgets in Tk. It is +# organized in the standard fashion for Tcl tests. +# +# Copyright (c) 1994 The Regents of the University of California. +# Copyright (c) 1994-1997 Sun Microsystems, Inc. +# Copyright (c) 1998-1999 by Scriptics Corporation. +# All rights reserved. + +package require widgetPlus +namespace import ::widgetPlus::entryPlus + +# ------------------------------------------------------------ +# Tests for entryPlus, in addition to those in file +# entryPlus.test which is copied with mods from Tk entry.test. +# ------------------------------------------------------------ + +package require tcltest 2.2 +namespace import ::tcltest::* +eval tcltest::configure $argv +tcltest::loadTestedCommands + +# ------------------------------------------------------------ +# First test the entry widget when changing its -textvariable. +# Cf. entry.test 5.* and 22.* +# ------------------------------------------------------------ + +test entry-25.1 {entry set textvar} -setup { + entry .e +} -body { + .e insert end {Some Text} + .e configure -textvariable ::foo + set ::foo +} -cleanup { + destroy .e + unset ::foo +} -result {Some Text} + +test entry-25.2 {entry unset textvar} -setup { + set ::foo {Some Text} + entry .e -textvariable ::foo +} -body { + unset ::foo + .e get +} -cleanup { + destroy .e +} -result {Some Text} + +test entry-25.3 {entry replace textvar set} -setup { + set ::foo {Some Text} + entry .e -textvariable ::foo +} -body { + set ::bar {Replacement} + .e configure -textvariable ::bar + set ::bar +} -cleanup { + destroy .e + unset ::foo ::bar +} -result {Replacement} + +test entry-25.4 {entry replace textvar unset} -setup { + set ::foo {Some Text} + entry .e -textvariable ::foo +} -body { + unset -nocomplain ::bar + .e configure -textvariable ::bar + set ::bar +} -cleanup { + destroy .e + unset ::foo ::bar +} -result {Some Text} + + +# ------------------------------------------------------------ +# Now test that entryPlus does the same as entry. +# ------------------------------------------------------------ + +test entry-35.1 {entryPlus set textvar} -setup { + entryPlus .e +} -body { + .e insert end {Some Text} + .e configure -textvariable ::foo + set ::foo +} -cleanup { + destroy .e + unset ::foo +} -result {Some Text} + +test entry-35.2 {entryPlus unset textvar} -setup { + set ::foo {Some Text} + entryPlus .e -textvariable ::foo +} -body { + unset ::foo + .e get +} -cleanup { + destroy .e +} -result {Some Text} + +test entry-35.3 {entryPlus replace textvar set} -setup { + set ::foo {Some Text} + entryPlus .e -textvariable ::foo +} -body { + set ::bar {Replacement} + .e configure -textvariable ::bar + set ::bar +} -cleanup { + destroy .e + unset ::foo ::bar +} -result {Replacement} + +test entry-35.4 {entryPlus replace textvar unset} -setup { + set ::foo {Some Text} + entryPlus .e -textvariable ::foo +} -body { + unset -nocomplain ::bar + .e configure -textvariable ::bar + set ::bar +} -cleanup { + destroy .e + unset ::foo ::bar +} -result {Some Text} + + + +cleanupTests +return diff --git a/modules/widgetPlus/entryPlus.test b/modules/widgetPlus/entryPlus.test new file mode 100644 index 00000000..ed1e6dfc --- /dev/null +++ b/modules/widgetPlus/entryPlus.test @@ -0,0 +1,3663 @@ +# This file is a Tcl script to test entry widgets in Tk. It is +# organized in the standard fashion for Tcl tests. +# +# Copyright (c) 1994 The Regents of the University of California. +# Copyright (c) 1994-1997 Sun Microsystems, Inc. +# Copyright (c) 1998-1999 by Scriptics Corporation. +# All rights reserved. + +package require widgetPlus +namespace import ::widgetPlus::entryPlus + +# ------------------------------------------------------------------------------ +# This file is copied from entry.test, with addition of the two lines above, +# application of "s/entry/entryPlus/g" to the code (but not to comments, +# results, test names or other metadata), and further editing of failing tests +# as described below. +# +# The purpose is to check that "entryPlus" does not break any features +# of "entry", including important matters such as validation. +# +# There are 13 test failures: +# - 3.15.entry (llength of [.e configure]) +# - 12 differences in error messages +# +# These harmless failures occur because "entryPlus" does not give the same +# results as "entry". These tests are given constraints named +# entryResultDifferent and entryErrorMsgDifferent respectively, and their test +# names have ".entry" appended. +# +# Copies of the same tests without the ".entry" suffix or the added constraints +# have the test result modified to reflect the (valid but different) value +# obtained when using "entryPlus" instead of "entry". +# ------------------------------------------------------------------------------ + +package require tcltest 2.2 +namespace import ::tcltest::* +eval tcltest::configure $argv +tcltest::loadTestedCommands + +# For xscrollcommand +proc scroll args { + global scrollInfo + set scrollInfo $args +} +# For trace variable +proc override args { + global x + set x 12345 +} + +# Procedures used in widget VALIDATION tests +proc doval {W d i P s S v V} { + set ::vVals [list $W $d $i $P $s $S $v $V] + return 1 +} +proc doval2 {W d i P s S v V} { + set ::vVals [list $W $d $i $P $s $S $v $V] + set ::e mydata + return 1 +} +proc doval3 {W d i P s S v V} { + set ::vVals [list $W $d $i $P $s $S $v $V] + return 0 +} + +set cy [font metrics {Courier -12} -linespace] + + +test entry-1.1 {configuration option: "background" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -background #ff0000 + .e cget -background +} -cleanup { + destroy .e +} -result {#ff0000} +test entry-1.2 {configuration option: "background" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -background non-existent +} -cleanup { + destroy .e +} -returnCodes {error} -result {unknown color name "non-existent"} + +test entry-1.3 {configuration option: "bd" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -bd 4 + .e cget -bd +} -cleanup { + destroy .e +} -result {4} +test entry-1.4 {configuration option: "bd" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -bd badValue +} -cleanup { + destroy .e +} -returnCodes {error} -result {bad screen distance "badValue"} + +test entry-1.5 {configuration option: "bg" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -bg #ff0000 + .e cget -bg +} -cleanup { + destroy .e +} -result {#ff0000} +test entry-1.6 {configuration option: "bg" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -bg non-existent +} -cleanup { + destroy .e +} -returnCodes {error} -result {unknown color name "non-existent"} + +test entry-1.7 {configuration option: "borderwidth" for entry} -setup { + entryPlus .e -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -borderwidth 1.3 + .e cget -borderwidth +} -cleanup { + destroy .e +} -result {1} +test entry-1.8 {configuration option: "borderwidth" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -borderwidth badValue +} -cleanup { + destroy .e +} -returnCodes {error} -result {bad screen distance "badValue"} + +test entry-1.9 {configuration option: "cursor" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -cursor arrow + .e cget -cursor +} -cleanup { + destroy .e +} -result {arrow} +test entry-1.10 {configuration option: "cursor" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -cursor badValue +} -cleanup { + destroy .e +} -returnCodes {error} -result {bad cursor spec "badValue"} + +test entry-1.11 {configuration option: "disabledbackground" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -disabledbackground green + .e cget -disabledbackground +} -cleanup { + destroy .e +} -result {green} +test entry-1.12 {configuration option: "disabledbackground" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -disabledbackground non-existent +} -cleanup { + destroy .e +} -returnCodes {error} -result {unknown color name "non-existent"} + +test entry-1.13 {configuration option: "disabledforeground" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -disabledforeground blue + .e cget -disabledforeground +} -cleanup { + destroy .e +} -result {blue} +test entry-1.14 {configuration option: "disabledforeground" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -disabledforeground non-existent +} -cleanup { + destroy .e +} -returnCodes {error} -result {unknown color name "non-existent"} + +test entry-1.15 {configuration option: "exportselection" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -exportselection yes + .e cget -exportselection +} -cleanup { + destroy .e +} -result {1} +test entry-1.16 {configuration option: "exportselection" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -exportselection xyzzy +} -cleanup { + destroy .e +} -returnCodes {error} -result {expected boolean value but got "xyzzy"} + +test entry-1.17 {configuration option: "fg" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -fg #110022 + .e cget -fg +} -cleanup { + destroy .e +} -result {#110022} +test entry-1.18 {configuration option: "fg" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -fg non-existent +} -cleanup { + destroy .e +} -returnCodes {error} -result {unknown color name "non-existent"} + +test entry-1.19 {configuration option: "font" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e configure -font {Helvetica -12} + .e cget -font +} -cleanup { + destroy .e +} -result {Helvetica -12} +test entry-1.20 {configuration option: "font" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e configure -font {} +} -cleanup { + destroy .e +} -returnCodes {error} -result {font "" doesn't exist} + +test entry-1.21 {configuration option: "foreground" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -foreground #110022 + .e cget -foreground +} -cleanup { + destroy .e +} -result {#110022} +test entry-1.22 {configuration option: "foreground" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -foreground non-existent +} -cleanup { + destroy .e +} -returnCodes {error} -result {unknown color name "non-existent"} + +test entry-1.23 {configuration option: "highlightbackground" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -highlightbackground #110022 + .e cget -highlightbackground +} -cleanup { + destroy .e +} -result {#110022} +test entry-1.24 {configuration option: "highlightbackground" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -highlightbackground non-existent +} -cleanup { + destroy .e +} -returnCodes {error} -result {unknown color name "non-existent"} + +test entry-1.25 {configuration option: "highlightcolor" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -highlightcolor #110022 + .e cget -highlightcolor +} -cleanup { + destroy .e +} -result {#110022} +test entry-1.26 {configuration option: "highlightcolor" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -highlightcolor non-existent +} -cleanup { + destroy .e +} -returnCodes {error} -result {unknown color name "non-existent"} + +test entry-1.27 {configuration option: "highlightthickness" for entry} -setup { + entryPlus .e -borderwidth 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -highlightthickness 6 + .e cget -highlightthickness +} -cleanup { + destroy .e +} -result {6} +test entry-1.28 {configuration option: "highlightthickness" for entry} -setup { + entryPlus .e -borderwidth 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -highlightthickness -2 + .e cget -highlightthickness +} -cleanup { + destroy .e +} -result {0} +test entry-1.29 {configuration option: "highlightthickness" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -highlightthickness badValue +} -cleanup { + destroy .e +} -returnCodes {error} -result {bad screen distance "badValue"} + +test entry-1.30 {configuration option: "insertbackground" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -insertbackground #110022 + .e cget -insertbackground +} -cleanup { + destroy .e +} -result {#110022} +test entry-1.31 {configuration option: "insertbackground" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -insertbackground non-existent +} -cleanup { + destroy .e +} -returnCodes {error} -result {unknown color name "non-existent"} + +test entry-1.32 {configuration option: "insertborderwidth" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -insertborderwidth 1.3 + .e cget -insertborderwidth +} -cleanup { + destroy .e +} -result {1} +test entry-1.33 {configuration option: "insertborderwidth" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -insertborderwidth 2.6x +} -cleanup { + destroy .e +} -returnCodes {error} -result {bad screen distance "2.6x"} + +test entry-1.34 {configuration option: "insertofftime" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -insertofftime 100 + .e cget -insertofftime +} -cleanup { + destroy .e +} -result {100} +test entry-1.35 {configuration option: "insertofftime" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -insertofftime 3.2 +} -cleanup { + destroy .e +} -returnCodes {error} -result {expected integer but got "3.2"} + +test entry-1.36 {configuration option: "insertontime" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -insertontime 100 + .e cget -insertontime +} -cleanup { + destroy .e +} -result {100} +test entry-1.37 {configuration option: "insertontime" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -insertontime 3.2 +} -cleanup { + destroy .e +} -returnCodes {error} -result {expected integer but got "3.2"} + +test entry-1.38 {configuration option: "invalidcommand" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -invalidcommand "any string" + .e cget -invalidcommand +} -cleanup { + destroy .e +} -result {any string} + +test entry-1.39 {configuration option: "invcmd" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -invcmd "any string" + .e cget -invcmd +} -cleanup { + destroy .e +} -result {any string} + +test entry-1.40 {configuration option: "justify" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -justify right + .e cget -justify +} -cleanup { + destroy .e +} -result {right} +test entry-1.41 {configuration option: "justify" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -justify bogus +} -cleanup { + destroy .e +} -returnCodes {error} -result {bad justification "bogus": must be left, right, or center} + +test entry-1.42 {configuration option: "readonlybackground" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -readonlybackground green + .e cget -readonlybackground +} -cleanup { + destroy .e +} -result {green} +test entry-1.43 {configuration option: "readonlybackground" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -readonlybackground non-existent +} -cleanup { + destroy .e +} -returnCodes {error} -result {unknown color name "non-existent"} + +test entry-1.44 {configuration option: "relief" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -relief flat + .e cget -relief +} -cleanup { + destroy .e +} -result {flat} + +test entry-1.45 {configuration option: "selectbackground" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -selectbackground #110022 + .e cget -selectbackground +} -cleanup { + destroy .e +} -result {#110022} +test entry-1.46.entry {configuration option: "selectbackground" for entry} -constraints { + entryErrorMsgDifferent +} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -selectbackground non-existent +} -cleanup { + destroy .e +} -returnCodes {error} -result {unknown color name "non-existent"} +test entry-1.46 {configuration option: "selectbackground" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -selectbackground non-existent +} -cleanup { + destroy .e +} -returnCodes {error} -result {invalid -selectbackground value: unknown color name "non-existent"} + +test entry-1.47 {configuration option: "selectborderwidth" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -selectborderwidth 1.3 + .e cget -selectborderwidth +} -cleanup { + destroy .e +} -result {1} +test entry-1.48 {configuration option: "selectborderwidth" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -selectborderwidth badValue +} -cleanup { + destroy .e +} -returnCodes {error} -result {bad screen distance "badValue"} + +test entry-1.49 {configuration option: "selectforeground" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -selectforeground #110022 + .e cget -selectforeground +} -cleanup { + destroy .e +} -result {#110022} +test entry-1.50 {configuration option: "selectforeground" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -selectforeground non-existent +} -cleanup { + destroy .e +} -returnCodes {error} -result {unknown color name "non-existent"} + +test entry-1.51 {configuration option: "show" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -show * + .e cget -show +} -cleanup { + destroy .e +} -result {*} + +test entry-1.52 {configuration option: "state" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -state n + .e cget -state +} -cleanup { + destroy .e +} -result {normal} +test entry-1.53 {configuration option: "state" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -state bogus +} -cleanup { + destroy .e +} -returnCodes {error} -result {bad state "bogus": must be disabled, normal, or readonly} + +test entry-1.54 {configuration option: "takefocus" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -takefocus "any string" + .e cget -takefocus +} -cleanup { + destroy .e +} -result {any string} + +test entry-1.55 {configuration option: "textvariable" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -textvariable i + .e cget -textvariable +} -cleanup { + destroy .e +} -result {i} + +test entry-1.56 {configuration option: "width" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -width 402 + .e cget -width +} -cleanup { + destroy .e +} -result {402} +test entry-1.57 {configuration option: "width" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -width 3p +} -cleanup { + destroy .e +} -returnCodes {error} -result {expected integer but got "3p"} + +test entry-1.58 {configuration option: "xscrollcommand" for entry} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12 bold} + pack .e + update +} -body { + .e configure -xscrollcommand {Some command} + .e cget -xscrollcommand +} -cleanup { + destroy .e +} -result {Some command} + + + +test entry-2.1.entry {Tk_EntryCmd procedure} -constraints { + entryErrorMsgDifferent +} -body { + entryPlus +} -returnCodes error -result {wrong # args: should be "entry pathName ?-option value ...?"} +test entry-2.1 {Tk_EntryCmd procedure} -body { + entryPlus +} -returnCodes error -result {wrong # args: should be "entryPlus pathName ?-option value ...?"} +test entry-2.2.entry {Tk_EntryCmd procedure} -constraints { + entryErrorMsgDifferent +} -body { + entryPlus gorp +} -returnCodes error -result {bad window path name "gorp"} +test entry-2.2 {Tk_EntryCmd procedure} -body { + entryPlus gorp +} -returnCodes error -result {unknown subcommand "gorp": must be create} +test entry-2.3 {Tk_EntryCmd procedure} -body { + entryPlus .e + pack .e + update + list [winfo exists .e] [winfo class .e] [info commands .e] +} -cleanup { + destroy .e +} -result {1 Entry .e} +test entry-2.4.entry {Tk_EntryCmd procedure} -constraints { + entryErrorMsgDifferent +} -body { + entryPlus .e -gorp foo +} -cleanup { + destroy .e +} -returnCodes error -result {unknown option "-gorp"} +test entry-2.4 {Tk_EntryCmd procedure} -body { + entryPlus .e -gorp foo +} -cleanup { + destroy .e +} -returnCodes error -result {Error in constructor: unknown option "-gorp"} +test entry-2.4.1 {Tk_EntryCmd procedure} -body { + catch {entryPlus .e -gorp foo} + list [winfo exists .e] [info commands .e] +} -cleanup { + destroy .e +} -result {0 {}} +test entry-2.5 {Tk_EntryCmd procedure} -body { + entryPlus .e +} -cleanup { + destroy .e +} -result {.e} + + +test entry-3.1.entry {EntryWidgetCmd procedure} -constraints { + entryErrorMsgDifferent +} -setup { + entryPlus .e + pack .e + update +} -body { + .e +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e option ?arg ...?"} +test entry-3.1 {EntryWidgetCmd procedure} -setup { + entryPlus .e + pack .e + update +} -body { + .e +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e subcommand ?arg ...?"} +test entry-3.2 {EntryWidgetCmd procedure, "bbox" widget command} -setup { + entryPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e bbox +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e bbox index"} +test entry-3.3 {EntryWidgetCmd procedure, "bbox" widget command} -setup { + entryPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e bbox a b +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e bbox index"} +test entry-3.4 {EntryWidgetCmd procedure, "bbox" widget command} -setup { + entryPlus .e + pack .e + update +} -body { + .e bbox bogus +} -cleanup { + destroy .e +} -returnCodes error -result {bad entry index "bogus"} +test entry-3.5 {EntryWidgetCmd procedure, "bbox" widget command} -setup { + entryPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e bbox 0 +} -cleanup { + destroy .e +} -result [list 5 5 0 $cy] + +# Previously the result was count using previousli counted font measurements +# and metrics. It was changed to less verbose solution - the result is the one +# that passes fonts constraint (this concerns tests 3.6, 3.7, 3.8, 3.10) +test entry-3.6 {EntryWidgetCmd procedure, "bbox" widget command} -constraints { + fonts +} -setup { + entryPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { +# Tcl_UtfAtIndex(): no utf chars + .e insert 0 "abc" + list [.e bbox 3] [.e bbox end] +} -cleanup { + destroy .e +} -result {{19 5 7 13} {19 5 7 13}} +test entry-3.7 {EntryWidgetCmd procedure, "bbox" widget command} -constraints { + fonts +} -setup { + entryPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { +# Tcl_UtfAtIndex(): utf at end + .e insert 0 "ab\u4e4e" + .e bbox end +} -cleanup { + destroy .e +} -result {19 5 12 13} +test entry-3.8 {EntryWidgetCmd procedure, "bbox" widget command} -constraints { + fonts +} -setup { + entryPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { +# Tcl_UtfAtIndex(): utf before index + .e insert 0 "ab\u4e4ec" + .e bbox 3 +} -cleanup { + destroy .e +} -result {31 5 7 13} +test entry-3.9 {EntryWidgetCmd procedure, "bbox" widget command} -setup { + entryPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { +# Tcl_UtfAtIndex(): no chars + .e bbox end +} -cleanup { + destroy .e +} -result "5 5 0 $cy" +test entry-3.10 {EntryWidgetCmd procedure, "bbox" widget command} -constraints { + fonts +} -setup { + entryPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e insert 0 "abcdefghij\u4e4eklmnop" + list [.e bbox 0] [.e bbox 1] [.e bbox 10] [.e bbox end] +} -cleanup { + destroy .e +} -result {{5 5 7 13} {12 5 7 13} {75 5 12 13} {122 5 7 13}} +test entry-3.11 {EntryWidgetCmd procedure, "cget" widget command} -setup { + entryPlus .e +} -body { + .e cget +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e cget option"} +test entry-3.12 {EntryWidgetCmd procedure, "cget" widget command} -setup { + entryPlus .e +} -body { + .e cget a b +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e cget option"} +test entry-3.13 {EntryWidgetCmd procedure, "cget" widget command} -setup { + entryPlus .e +} -body { + .e cget -gorp +} -cleanup { + destroy .e +} -returnCodes error -result {unknown option "-gorp"} +test entry-3.14 {EntryWidgetCmd procedure, "cget" widget command} -setup { + entryPlus .e +} -body { + .e configure -bd 4 + .e cget -bd +} -cleanup { + destroy .e +} -result {4} +test entry-3.15.entry {EntryWidgetCmd procedure, "configure" widget command} -constraints { + entryResultDifferent +} -setup { + entryPlus .e + pack .e + update +} -body { + llength [.e configure] +} -cleanup { + destroy .e +} -result {36} +test entry-3.15 {EntryWidgetCmd procedure, "configure" widget command} -setup { + entryPlus .e + pack .e + update +} -body { + llength [.e configure] +} -cleanup { + destroy .e +} -result {39} +test entry-3.16 {EntryWidgetCmd procedure, "configure" widget command} -setup { + entryPlus .e +} -body { + .e configure -foo +} -cleanup { + destroy .e +} -returnCodes error -result {unknown option "-foo"} +test entry-3.17 {EntryWidgetCmd procedure, "configure" widget command} -setup { + entryPlus .e +} -body { + .e configure -bd 4 + .e configure -bg #ffffff + lindex [.e configure -bd] 4 +} -cleanup { + destroy .e +} -result {4} +test entry-3.18 {EntryWidgetCmd procedure, "delete" widget command} -setup { + entryPlus .e +} -body { + .e delete +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e delete firstIndex ?lastIndex?"} +test entry-3.19 {EntryWidgetCmd procedure, "delete" widget command} -setup { + entryPlus .e +} -body { + .e delete a b c +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e delete firstIndex ?lastIndex?"} +test entry-3.20 {EntryWidgetCmd procedure, "delete" widget command} -setup { + entryPlus .e +} -body { + .e delete foo +} -cleanup { + destroy .e +} -returnCodes error -result {bad entry index "foo"} +test entry-3.21 {EntryWidgetCmd procedure, "delete" widget command} -setup { + entryPlus .e +} -body { + .e delete 0 bar +} -cleanup { + destroy .e +} -returnCodes error -result {bad entry index "bar"} +test entry-3.22 {EntryWidgetCmd procedure, "delete" widget command} -setup { + entryPlus .e + pack .e + update +} -body { + .e insert end "01234567890" + .e delete 2 4 + .e get +} -cleanup { + destroy .e +} -result {014567890} +test entry-3.23 {EntryWidgetCmd procedure, "delete" widget command} -setup { + entryPlus .e +} -body { + .e insert end "01234567890" + .e delete 6 + .e get +} -cleanup { + destroy .e +} -result {0123457890} +test entry-3.24 {EntryWidgetCmd procedure, "delete" widget command} -setup { + entryPlus .e + pack .e + update + set x {} +} -body { +# UTF + .e insert end "01234\u4e4e67890" + .e delete 6 + lappend x [.e get] + .e delete 0 end + .e insert end "012345\u4e4e7890" + .e delete 6 + lappend x [.e get] + .e delete 0 end + .e insert end "0123456\u4e4e890" + .e delete 6 + lappend x [.e get] +} -cleanup { + destroy .e +} -result [list "01234\u4e4e7890" "0123457890" "012345\u4e4e890"] +test entry-3.25 {EntryWidgetCmd procedure, "delete" widget command} -setup { + entryPlus .e + pack .e + update +} -body { + .e insert end "01234567890" + .e delete 6 5 + .e get +} -cleanup { + destroy .e +} -result {01234567890} +test entry-3.26 {EntryWidgetCmd procedure, "delete" widget command} -setup { + entryPlus .e + pack .e + update +} -body { + .e insert end "01234567890" + .e configure -state disabled + .e delete 2 8 + .e configure -state normal + .e get +} -cleanup { + destroy .e +} -result {01234567890} +test entry-3.26a {EntryWidgetCmd procedure, "delete" widget command} -setup { + entryPlus .e + pack .e + update +} -body { + .e insert end "01234567890" + .e configure -state readonly + .e delete 2 8 + .e configure -state normal + .e get +} -cleanup { + destroy .e +} -result {01234567890} +test entry-3.27 {EntryWidgetCmd procedure, "get" widget command} -setup { + entryPlus .e +} -body { + .e get foo +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e get"} +test entry-3.28 {EntryWidgetCmd procedure, "icursor" widget command} -setup { + entryPlus .e +} -body { + .e icursor +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e icursor pos"} +test entry-3.29 {EntryWidgetCmd procedure, "icursor" widget command} -setup { + entryPlus .e +} -body { + .e icursor foo +} -cleanup { + destroy .e +} -returnCodes error -result {bad entry index "foo"} +test entry-3.30 {EntryWidgetCmd procedure, "icursor" widget command} -setup { + entryPlus .e +} -body { + .e insert end "01234567890" + .e icursor 4 + .e index insert +} -cleanup { + destroy .e +} -result {4} +test entry-3.31 {EntryWidgetCmd procedure, "index" widget command} -setup { + entryPlus .e +} -body { + .e in +} -cleanup { + destroy .e +} -returnCodes error -result {ambiguous option "in": must be bbox, cget, configure, delete, get, icursor, index, insert, scan, selection, validate, or xview} +test entry-3.32 {EntryWidgetCmd procedure, "index" widget command} -setup { + entryPlus .e +} -body { + .e index +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e index string"} +test entry-3.33 {EntryWidgetCmd procedure, "index" widget command} -setup { + entryPlus .e +} -body { + .e index foo +} -cleanup { + destroy .e +} -returnCodes error -result {bad entry index "foo"} +test entry-3.34 {EntryWidgetCmd procedure, "index" widget command} -setup { + entryPlus .e + pack .e + update +} -body { + .e index 0 +} -cleanup { + destroy .e +} -returnCodes {ok} -match glob -result {*} +test entry-3.35 {EntryWidgetCmd procedure, "index" widget command} -setup { + entryPlus .e + pack .e + update +} -body { +# UTF + .e insert 0 abc\u4e4e\u0153def + list [.e index 3] [.e index 4] [.e index end] +} -cleanup { + destroy .e +} -result {3 4 8} +test entry-3.36 {EntryWidgetCmd procedure, "insert" widget command} -setup { + entryPlus .e +} -body { + .e insert a +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e insert index text"} +test entry-3.37 {EntryWidgetCmd procedure, "insert" widget command} -setup { + entryPlus .e +} -body { + .e insert a b c +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e insert index text"} +test entry-3.38 {EntryWidgetCmd procedure, "insert" widget command} -setup { + entryPlus .e +} -body { + .e insert foo Text +} -cleanup { + destroy .e +} -returnCodes error -result {bad entry index "foo"} +test entry-3.39 {EntryWidgetCmd procedure, "insert" widget command} -setup { + entryPlus .e + pack .e + update +} -body { + .e insert end "01234567890" + .e insert 3 xxx + .e get +} -cleanup { + destroy .e +} -result {012xxx34567890} +test entry-3.40 {EntryWidgetCmd procedure, "insert" widget command} -setup { + entryPlus .e + pack .e + update +} -body { + .e insert end "01234567890" + .e configure -state disabled + .e insert 3 xxx + .e configure -state normal + .e get +} -cleanup { + destroy .e +} -result {01234567890} +test entry-3.40a {EntryWidgetCmd procedure, "insert" widget command} -setup { + entryPlus .e + pack .e + update +} -body { + .e insert end "01234567890" + .e configure -state readonly + .e insert 3 xxx + .e configure -state normal + .e get +} -cleanup { + destroy .e +} -result {01234567890} +test entry-3.41 {EntryWidgetCmd procedure, "insert" widget command} -setup { + entryPlus .e +} -body { + .e insert a b c +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e insert index text"} +test entry-3.42 {EntryWidgetCmd procedure, "scan" widget command} -setup { + entryPlus .e + pack .e + update +} -body { + .e scan a +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e scan mark|dragto x"} +test entry-3.43 {EntryWidgetCmd procedure, "scan" widget command} -setup { + entryPlus .e + pack .e + update +} -body { + .e scan a b c +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e scan mark|dragto x"} +test entry-3.44 {EntryWidgetCmd procedure, "scan" widget command} -setup { + entryPlus .e + pack .e + update +} -body { + .e scan foobar 20 +} -cleanup { + destroy .e +} -returnCodes error -result {bad scan option "foobar": must be mark or dragto} +test entry-3.45 {EntryWidgetCmd procedure, "scan" widget command} -setup { + entryPlus .e + pack .e + update +} -body { + .e scan mark 20.1 +} -cleanup { + destroy .e +} -returnCodes error -result {expected integer but got "20.1"} + +# This test is non-portable because character sizes vary. +test entry-3.46 {EntryWidgetCmd procedure, "scan" widget command} -constraints { + fonts +} -setup { + entryPlus .e -font {Helvetica -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e insert end "This is quite a long string, in fact a " + .e insert end "very very long string" + .e scan mark 30 + .e scan dragto 28 + .e index @0 +} -cleanup { + destroy .e +} -result {2} +test entry-3.47.entry {EntryWidgetCmd procedure, "select" widget command} -constraints { + entryErrorMsgDifferent +} -setup { + entryPlus .e +} -body { + .e select +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e selection option ?index?"} +test entry-3.47 {EntryWidgetCmd procedure, "select" widget command} -setup { + entryPlus .e +} -body { + .e select +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e select option ?index?"} +test entry-3.48 {EntryWidgetCmd procedure, "select" widget command} -setup { + entryPlus .e +} -body { + .e select foo +} -cleanup { + destroy .e +} -returnCodes error -result {bad selection option "foo": must be adjust, clear, from, present, range, or to} + +test entry-3.49.entry {EntryWidgetCmd procedure, "select clear" widget command} -constraints { + entryErrorMsgDifferent +} -setup { + entryPlus .e +} -body { + .e select clear gorp +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e selection clear"} +test entry-3.49 {EntryWidgetCmd procedure, "select clear" widget command} -setup { + entryPlus .e +} -body { + .e select clear gorp +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e select clear"} +test entry-3.50 {EntryWidgetCmd procedure, "select clear" widget command} -setup { + entryPlus .e +} -body { + .e insert end "0123456789" + .e select from 1 + .e select to 4 + update + .e select clear + selection get +} -cleanup { + destroy .e +} -returnCodes error -result {PRIMARY selection doesn't exist or form "STRING" not defined} +test entry-3.50.1 {EntryWidgetCmd procedure, "select clear" widget command} -setup { + entryPlus .e + pack .e + update +} -body { + .e insert end "0123456789" + .e select from 1 + .e select to 4 + update + .e select clear + catch {selection get} + selection own +} -cleanup { + destroy .e +} -result {.e} + +test entry-3.51 {EntryWidgetCmd procedure, "selection present" widget command} -setup { + entryPlus .e +} -body { + .e selection present foo +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e selection present"} +test entry-3.52 {EntryWidgetCmd procedure, "selection present" widget command} -setup { + entryPlus .e + pack .e + update +} -body { + .e insert end 0123456789 + .e select from 3 + .e select to 6 + .e selection present +} -cleanup { + destroy .e +} -result {1} +test entry-3.53 {EntryWidgetCmd procedure, "selection present" widget command} -setup { + entryPlus .e + pack .e + update +} -body { + .e insert end 0123456789 + .e select from 3 + .e select to 6 + .e configure -exportselection false + .e selection present +} -cleanup { + destroy .e +} -result {1} +test entry-3.54 {EntryWidgetCmd procedure, "selection present" widget command} -setup { + entryPlus .e + pack .e + update +} -body { + .e insert end 0123456789 + .e select from 3 + .e select to 6 + .e delete 0 end + .e selection present +} -cleanup { + destroy .e +} -result {0} +test entry-3.55 {EntryWidgetCmd procedure, "selection adjust" widget command} -setup { + entryPlus .e +} -body { + .e select adjust x +} -cleanup { + destroy .e +} -returnCodes error -result {bad entry index "x"} +test entry-3.56.entry {EntryWidgetCmd procedure, "selection adjust" widget command} -constraints { + entryErrorMsgDifferent +} -setup { + entryPlus .e +} -body { + .e select adjust 2 3 +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e selection adjust index"} +test entry-3.56 {EntryWidgetCmd procedure, "selection adjust" widget command} -setup { + entryPlus .e +} -body { + .e select adjust 2 3 +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e select adjust index"} +test entry-3.57 {EntryWidgetCmd procedure, "selection adjust" widget command} -setup { + entryPlus .e + pack .e + update +} -body { + .e insert end "0123456789" + .e select from 1 + .e select to 5 + update + .e select adjust 4 + selection get +} -cleanup { + destroy .e +} -result {123} +test entry-3.58 {EntryWidgetCmd procedure, "selection adjust" widget command} -setup { + entryPlus .e + pack .e + update +} -body { + .e insert end "0123456789" + .e select from 1 + .e select to 5 + update + .e select adjust 2 + selection get +} -cleanup { + destroy .e +} -result {234} +test entry-3.59.entry {EntryWidgetCmd procedure, "selection from" widget command} -constraints { + entryErrorMsgDifferent +} -setup { + entryPlus .e +} -body { + .e select from 2 3 +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e selection from index"} +test entry-3.59 {EntryWidgetCmd procedure, "selection from" widget command} -setup { + entryPlus .e +} -body { + .e select from 2 3 +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e select from index"} + +test entry-3.60.entry {EntryWidgetCmd procedure, "selection range" widget command} -constraints { + entryErrorMsgDifferent +} -setup { + entryPlus .e +} -body { + .e select range 2 +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e selection range start end"} +test entry-3.60 {EntryWidgetCmd procedure, "selection range" widget command} -setup { + entryPlus .e +} -body { + .e select range 2 +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e select range start end"} +test entry-3.61 {EntryWidgetCmd procedure, "selection range" widget command} -setup { + entryPlus .e +} -body { + .e selection range 2 3 4 +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e selection range start end"} +test entry-3.62 {EntryWidgetCmd procedure, "selection range" widget command} -setup { + entryPlus .e +} -body { + .e insert end 0123456789 + .e select from 1 + .e select to 5 + .e select range 4 4 + .e index sel.first +} -cleanup { + destroy .e +} -returnCodes error -result {selection isn't in widget .e} +test entry-3.63 {EntryWidgetCmd procedure, "selection range" widget command} -setup { + entryPlus .e + pack .e + update +} -body { + .e insert end 0123456789 + .e select from 3 + .e select to 7 + .e select range 2 9 + list [.e index sel.first] [.e index sel.last] [.e index anchor] +} -cleanup { + destroy .e +} -result {2 9 3} +test entry-3.64 {EntryWidgetCmd procedure, "selection" widget command} -setup { + entryPlus .e + pack .e + update +} -body { + .e insert end 0123456789 + .e selection range 0 end + .e configure -state disabled + .e selection range 2 4 + .e configure -state normal + list [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {0 10} +test entry-3.64a {EntryWidgetCmd procedure, "selection" widget command} -setup { + entryPlus .e + pack .e + update +} -body { + .e insert end 0123456789 + .e selection range 0 end + .e configure -state readonly + .e selection range 2 4 + .e configure -state normal + list [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {2 4} +test entry-3.64b.entry {EntryWidgetCmd procedure, "selection to" widget command} -constraints { + entryErrorMsgDifferent +} -setup { + entryPlus .e + pack .e + update + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." +} -body { + .e select to 2 3 +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e selection to index"} +test entry-3.64b {EntryWidgetCmd procedure, "selection to" widget command} -setup { + entryPlus .e + pack .e + update + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." +} -body { + .e select to 2 3 +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e select to index"} + +test entry-3.65 {EntryWidgetCmd procedure, "xview" widget command} -setup { + entryPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + .e xview 5 + format {%.7f %.7f} {*}[.e xview] +} -cleanup { + destroy .e +} -result {0.0537634 0.2688172} +test entry-3.66 {EntryWidgetCmd procedure, "xview" widget command} -setup { + entryPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e xview gorp +} -cleanup { + destroy .e +} -returnCodes error -result {bad entry index "gorp"} +test entry-3.67 {EntryWidgetCmd procedure, "xview" widget command} -setup { + entryPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + .e xview 0 + .e icursor 10 + .e xview insert + format {%.6f %.6f} {*}[.e xview] +} -cleanup { + destroy .e +} -result {0.107527 0.322581} +test entry-3.68 {EntryWidgetCmd procedure, "xview" widget command} -setup { + entryPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e xview moveto foo bar +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e xview moveto fraction"} +test entry-3.69 {EntryWidgetCmd procedure, "xview" widget command} -setup { + entryPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e xview moveto foo +} -cleanup { + destroy .e +} -returnCodes error -result {expected floating-point number but got "foo"} +test entry-3.70 {EntryWidgetCmd procedure, "xview" widget command} -setup { + entryPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + .e xview moveto 0.5 + format {%.6f %.6f} {*}[.e xview] +} -cleanup { + destroy .e +} -result {0.505376 0.720430} +test entry-3.71 {EntryWidgetCmd procedure, "xview" widget command} -setup { + entryPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + .e xview scroll 24 +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e xview scroll number units|pages"} +test entry-3.72 {EntryWidgetCmd procedure, "xview" widget command} -setup { + entryPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + update + .e xview scroll gorp units +} -cleanup { + destroy .e +} -returnCodes error -result {expected integer but got "gorp"} +test entry-3.73 {EntryWidgetCmd procedure, "xview" widget command} -setup { + entryPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + update + .e xview moveto 0 + .e xview scroll 1 pages + format {%.6f %.6f} {*}[.e xview] +} -cleanup { + destroy .e +} -result {0.193548 0.408602} +test entry-3.74 {EntryWidgetCmd procedure, "xview" widget command} -setup { + entryPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + .e xview moveto .9 + update + .e xview scroll -2 p + format {%.6f %.6f} {*}[.e xview] +} -cleanup { + destroy .e +} -result {0.397849 0.612903} +test entry-3.75 {EntryWidgetCmd procedure, "xview" widget command} -setup { + entryPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + update + .e xview 30 + update + .e xview scroll 2 units + .e index @0 +} -cleanup { + destroy .e +} -result {32} +test entry-3.76 {EntryWidgetCmd procedure, "xview" widget command} -setup { + entryPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + update + .e xview 30 + update + .e xview scroll -1 units + .e index @0 +} -cleanup { + destroy .e +} -result {29} +test entry-3.77 {EntryWidgetCmd procedure, "xview" widget command} -setup { + entryPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + update + .e xview scroll 23 foobars +} -cleanup { + destroy .e +} -returnCodes error -result {bad argument "foobars": must be units or pages} +test entry-3.78 {EntryWidgetCmd procedure, "xview" widget command} -setup { + entryPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + update + .e xview eat 23 hamburgers +} -cleanup { + destroy .e +} -returnCodes error -result {unknown option "eat": must be moveto or scroll} +test entry-3.79 {EntryWidgetCmd procedure, "xview" widget command} -setup { + entryPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + .e xview 0 + update + .e xview -4 + .e index @0 +} -cleanup { + destroy .e +} -result {0} +test entry-3.80 {EntryWidgetCmd procedure, "xview" widget command} -setup { + entryPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + update + .e xview 300 + .e index @0 +} -cleanup { + destroy .e +} -result {73} +test entry-3.86 {EntryWidgetCmd procedure, "xview" widget command} -setup { + entryPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + .e insert 10 \u4e4e + update +# UTF +# If Tcl_NumUtfChars wasn't used, wrong answer would be: +# 0.106383 0.117021 0.117021 + set x {} + .e xview moveto .1 + lappend x [format {%.6f} [lindex [.e xview] 0]] + .e xview moveto .11 + lappend x [format {%.6f} [lindex [.e xview] 0]] + .e xview moveto .12 + lappend x [format {%.6f} [lindex [.e xview] 0]] +} -cleanup { + destroy .e +} -result {0.095745 0.106383 0.117021} + +test entry-3.82 {EntryWidgetCmd procedure} -setup { + entryPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e gorp +} -cleanup { + destroy .e +} -returnCodes error -result {bad option "gorp": must be bbox, cget, configure, delete, get, icursor, index, insert, scan, selection, validate, or xview} + +# The test below doesn't actually check anything directly, but if run +# with Purify or some other memory-allocation-checking program it will +# ensure that resources get properly freed. + +test entry-4.1 {DestroyEntry procedure} -body { + entryPlus .e -textvariable x -show * + pack .e + .e insert end "Sample text" + update + destroy .e +} -result {} + +test entry-5.1 {ConfigureEntry procedure, -textvariable} -body { + set x 12345 + entryPlus .e -textvariable x + .e get +} -cleanup { + destroy .e +} -result {12345} +test entry-5.2 {ConfigureEntry procedure, -textvariable} -body { + set x 12345 + entryPlus .e -textvariable x + set y abcde + .e configure -textvariable y + set x 54321 + .e get +} -cleanup { + destroy .e +} -result {abcde} +test entry-5.3 {ConfigureEntry procedure, -textvariable} -setup { + unset -nocomplain x + entryPlus .e +} -body { + .e insert 0 "Some text" + .e configure -textvariable x + return $x +} -cleanup { + destroy .e +} -result {Some text} +test entry-5.4 {ConfigureEntry procedure, -textvariable} -setup { + unset -nocomplain x + entryPlus .e +} -body { + trace variable x w override + .e insert 0 "Some text" + .e configure -textvariable x + list $x [.e get] +} -cleanup { + destroy .e + trace vdelete x w override + unset x; +} -result {12345 12345} + +test entry-5.5 {ConfigureEntry procedure} -setup { + set x {} + entryPlus .e1 + entryPlus .e2 +} -body { + .e2 insert end "This is some sample text" + .e1 configure -exportselection false + .e1 insert end "0123456789" + pack .e1 .e2 + .e2 select from 0 + .e2 select to 10 + lappend x [selection get] + .e1 select from 1 + .e1 select to 5 + lappend x [selection get] + .e1 configure -exportselection 1 + lappend x [selection get] + return $x +} -cleanup { + destroy .e1 .e2 +} -result {{This is so} {This is so} 1234} +test entry-5.6 {ConfigureEntry procedure} -setup { + entryPlus .e + pack .e +} -body { + .e insert end "0123456789" + .e select from 1 + .e select to 5 + .e configure -exportselection 0 + selection get +} -cleanup { + destroy .e +} -returnCodes error -result {PRIMARY selection doesn't exist or form "STRING" not defined} +test entry-5.6.1 {ConfigureEntry procedure} -setup { + entryPlus .e + pack .e +} -body { + .e insert end "0123456789" + .e select from 1 + .e select to 5 + .e configure -exportselection 0 + catch {selection get} + list [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {1 5} + +test entry-5.7 {ConfigureEntry procedure} -setup { + entryPlus .e -font {Helvetica -12} -borderwidth 2 -highlightthickness 2 + pack .e +} -body { + .e configure -font {Courier -12} -width 4 -xscrollcommand scroll + .e insert end "01234567890" + update + .e configure -width 5 + format {%.6f %.6f} {*}$scrollInfo +} -cleanup { + destroy .e +} -result {0.000000 0.363636} + + +test entry-5.8 {ConfigureEntry procedure} -constraints { + fonts +} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 + pack .e +} -body { + .e configure -width 0 -font {Helvetica -12} + .e insert end "0123" + update + .e configure -font {Helvetica -24} + update + winfo geom .e +} -cleanup { + destroy .e +} -result {62x37+0+0} +test entry-5.9 {ConfigureEntry procedure} -constraints { + fonts +} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 + pack .e +} -body { + .e configure -font {Courier -12} -bd 2 -relief raised + .e insert end "0123" + update + list [.e index @10] [.e index @11] [.e index @12] [.e index @13] +} -cleanup { + destroy .e +} -result {0 0 1 1} +test entry-5.10 {ConfigureEntry procedure} -constraints { + fonts +} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 + pack .e +} -body { + .e configure -font {Courier -12} -bd 2 -relief flat + .e insert end "0123" + update + list [.e index @10] [.e index @11] [.e index @12] [.e index @13] +} -cleanup { + destroy .e +} -result {0 0 1 1} +test entry-5.11 {ConfigureEntry procedure} -setup { + entryPlus .e -borderwidth 2 -highlightthickness 2 + pack .e +} -body { +# If "0" in selected font had 0 width, caused divide-by-zero error. + .e configure -font {{open look glyph}} + .e scan dragto 30 + update +} -cleanup { + destroy .e +} -result {} + +# No tests for DisplayEntry. + +test entry-6.1 {EntryComputeGeometry procedure} -constraints { + fonts +} -setup { + entryPlus .e + pack .e +} -body { + .e configure -font {Courier -12} -bd 2 -relief raised -width 20 \ + -highlightthickness 3 + .e insert end 012\t45 + update + list [.e index @61] [.e index @62] +} -cleanup { + destroy .e +} -result {3 4} +test entry-6.2 {EntryComputeGeometry procedure} -constraints { + fonts +} -setup { + entryPlus .e + pack .e +} -body { + .e configure -font {Courier -12} -bd 2 -relief raised -width 20 \ + -justify center -highlightthickness 3 + .e insert end 012\t45 + update + list [.e index @96] [.e index @97] +} -cleanup { + destroy .e +} -result {3 4} +test entry-6.3 {EntryComputeGeometry procedure} -constraints { + fonts +} -setup { + entryPlus .e + pack .e +} -body { + .e configure -font {Courier -12} -bd 2 -relief raised -width 20 \ + -justify right -highlightthickness 3 + .e insert end 012\t45 + update + list [.e index @131] [.e index @132] +} -cleanup { + destroy .e +} -result {3 4} +test entry-6.4 {EntryComputeGeometry procedure} -setup { + entryPlus .e + pack .e +} -body { + .e configure -font {Courier -12} -bd 2 -relief raised -width 5 + .e insert end "01234567890" + update + .e xview 6 + .e index @0 +} -cleanup { + destroy .e +} -result {6} +test entry-6.5 {EntryComputeGeometry procedure} -setup { + entryPlus .e -highlightthickness 2 + pack .e +} -body { + .e configure -font {Courier -12} -bd 2 -relief raised -width 5 + .e insert end "01234567890" + update + .e xview 7 + .e index @0 +} -cleanup { + destroy .e +} -result {6} +test entry-6.6 {EntryComputeGeometry procedure} -constraints { + fonts +} -setup { + entryPlus .e -highlightthickness 2 + pack .e +} -body { + .e configure -font {Courier -12} -bd 2 -relief raised -width 10 + .e insert end "01234\t67890" + update + .e xview 3 + list [.e index @39] [.e index @40] +} -cleanup { + destroy .e +} -result {5 6} +test entry-6.7 {EntryComputeGeometry procedure} -constraints { + fonts +} -setup { + entryPlus .e -highlightthickness 2 + pack .e +} -body { + .e configure -font {Helvetica -24} -bd 3 -relief raised -width 5 + .e insert end "01234567" + update + list [winfo reqwidth .e] [winfo reqheight .e] +} -cleanup { + destroy .e +} -result {77 39} +test entry-6.8 {EntryComputeGeometry procedure} -constraints { + fonts +} -setup { + entryPlus .e -highlightthickness 2 + pack .e +} -body { + .e configure -font {Helvetica -24} -bd 3 -relief raised -width 0 + .e insert end "01234567" + update + list [winfo reqwidth .e] [winfo reqheight .e] +} -cleanup { + destroy .e +} -result {116 39} +test entry-6.9 {EntryComputeGeometry procedure} -constraints { + fonts +} -setup { + entryPlus .e -highlightthickness 2 + pack .e +} -body { + .e configure -font {Helvetica -24} -bd 3 -relief raised -width 0 + update + list [winfo reqwidth .e] [winfo reqheight .e] +} -cleanup { + destroy .e +} -result {25 39} +test entry-6.10 {EntryComputeGeometry procedure} -constraints { + unix fonts +} -setup { + entryPlus .e -highlightthickness 2 -font {Helvetica -12} + pack .e +} -body { + .e configure -bd 1 -relief raised -width 0 -show . + .e insert 0 12345 + update + set x [winfo reqwidth .e] + .e configure -show X + lappend x [winfo reqwidth .e] + .e configure -show "" + lappend x [winfo reqwidth .e] +} -cleanup { + destroy .e +} -result {23 53 43} +test entry-6.11 {EntryComputeGeometry procedure} -constraints { + win +} -setup { + entryPlus .e -highlightthickness 2 + pack .e +} -body { + .e configure -bd 1 -relief raised -width 0 -show . -font {helvetica 12} + .e insert 0 12345 + update + set x1 [winfo reqwidth .e] + set x2 [expr {8+5*[font measure {helvetica 12} .]}] + set x [expr {$x1 eq $x2}] + .e configure -show X + set x1 [winfo reqwidth .e] + set x2 [expr {8+5*[font measure {helvetica 12} X]}] + lappend x [expr {$x1 eq $x2}] + .e configure -show "" + set x1 [winfo reqwidth .e] + set x2 [expr {8+[font measure {helvetica 12} 12345]}] + lappend x [expr {$x1 eq $x2}] +} -cleanup { + destroy .e +} -result {1 1 1} +test entry-6.12 {EntryComputeGeometry procedure} -constraints { + fonts +} -setup { + catch {destroy .e} + entryPlus .e -font {Courier -12} -bd 2 -relief raised -width 20 + pack .e +} -body { + .e insert end "012\t456\t" + update + list [.e index @80] [.e index @81] [.e index @115] [.e index @116] +} -cleanup { + destroy .e +} -result {6 7 7 8} + + +test entry-7.1 {InsertChars procedure} -setup { + unset -nocomplain contents + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e configure -textvariable contents -xscrollcommand scroll + .e insert 0 abcde + .e insert 2 XXX + update + list [.e get] $contents [format {%.6f %.6f} {*}$scrollInfo] +} -cleanup { + destroy .e +} -result {abXXXcde abXXXcde {0.000000 1.000000}} + +test entry-7.2 {InsertChars procedure} -setup { + unset -nocomplain contents + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e configure -textvariable contents -xscrollcommand scroll + .e insert 0 abcde + .e insert 500 XXX + update + list [.e get] $contents [format {%.6f %.6f} {*}$scrollInfo] +} -cleanup { + destroy .e +} -result {abcdeXXX abcdeXXX {0.000000 1.000000}} +test entry-7.3 {InsertChars procedure} -setup { + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e +} -body { + .e insert 0 0123456789 + .e select from 2 + .e select to 6 + .e insert 2 XXX + set x "[.e index sel.first] [.e index sel.last]" + .e select to 8 + lappend x [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {5 9 5 8} +test entry-7.4 {InsertChars procedure} -setup { + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e +} -body { + .e insert 0 0123456789 + .e select from 2 + .e select to 6 + .e insert 3 XXX + set x "[.e index sel.first] [.e index sel.last]" + .e select to 8 + lappend x [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {2 9 2 8} +test entry-7.5 {InsertChars procedure} -setup { + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e +} -body { + .e insert 0 0123456789 + .e select from 2 + .e select to 6 + .e insert 5 XXX + set x "[.e index sel.first] [.e index sel.last]" + .e select to 8 + lappend x [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {2 9 2 8} +test entry-7.6 {InsertChars procedure} -setup { + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e +} -body { + .e insert 0 0123456789 + .e select from 2 + .e select to 6 + .e insert 6 XXX + set x "[.e index sel.first] [.e index sel.last]" + .e select to 5 + lappend x [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {2 6 2 5} +test entry-7.7 {InsertChars procedure} -setup { + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e +} -body { + .e configure -xscrollcommand scroll + .e insert 0 0123456789 + .e icursor 4 + .e insert 4 XXX + .e index insert +} -cleanup { + destroy .e +} -result {7} +test entry-7.8 {InsertChars procedure} -setup { + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e +} -body { + .e insert 0 0123456789 + .e icursor 4 + .e insert 5 XXX + .e index insert +} -cleanup { + destroy .e +} -result {4} +test entry-7.9 {InsertChars procedure} -setup { + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e +} -body { + .e insert 0 "This is a very long string" + update + .e xview 4 + .e insert 3 XXX + .e index @0 +} -cleanup { + destroy .e +} -result {7} +test entry-7.10 {InsertChars procedure} -setup { + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e +} -body { + .e insert 0 "This is a very long string" + update + .e xview 4 + .e insert 4 XXX + .e index @0 +} -cleanup { + destroy .e +} -result {4} + +test entry-7.11 {InsertChars procedure} -constraints { + fonts +} -setup { + entryPlus .e -width 0 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e +} -body { + .e insert 0 "xyzzy" + update + .e insert 2 00 + winfo reqwidth .e +} -cleanup { + destroy .e +} -result {59} + +test entry-8.1 {DeleteChars procedure} -setup { + unset -nocomplain contents + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e configure -textvariable contents -xscrollcommand scroll + .e insert 0 abcde + .e delete 2 4 + update + list [.e get] $contents [format {%.6f %.6f} {*}$scrollInfo] +} -cleanup { + destroy .e +} -result {abe abe {0.000000 1.000000}} +test entry-8.2 {DeleteChars procedure} -setup { + unset -nocomplain contents + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e configure -textvariable contents -xscrollcommand scroll + .e insert 0 abcde + .e delete -2 2 + update + list [.e get] $contents [format {%.6f %.6f} {*}$scrollInfo] +} -cleanup { + destroy .e +} -result {cde cde {0.000000 1.000000}} +test entry-8.3 {DeleteChars procedure} -setup { + unset -nocomplain contents + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e configure -textvariable contents -xscrollcommand scroll + .e insert 0 abcde + .e delete 3 1000 + update + list [.e get] $contents [format {%.6f %.6f} {*}$scrollInfo] +} -cleanup { + destroy .e +} -result {abc abc {0.000000 1.000000}} +test entry-8.4 {DeleteChars procedure} -setup { + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 0123456789abcde + .e select from 3 + .e select to 8 + .e delete 1 3 + update + set x "[.e index sel.first] [.e index sel.last]" + .e select to 5 + lappend x [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {1 6 1 5} +test entry-8.5 {DeleteChars procedure} -setup { + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 0123456789abcde + .e select from 3 + .e select to 8 + .e delete 1 4 + update + set x "[.e index sel.first] [.e index sel.last]" + .e select to 4 + lappend x [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {1 5 1 4} +test entry-8.6 {DeleteChars procedure} -setup { + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 0123456789abcde + .e select from 3 + .e select to 8 + .e delete 1 7 + update + set x "[.e index sel.first] [.e index sel.last]" + .e select to 5 + lappend x [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {1 2 1 5} +test entry-8.7 {DeleteChars procedure} -setup { + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 0123456789abcde + .e select from 3 + .e select to 8 + .e delete 1 8 + update + .e index sel.first +} -cleanup { + destroy .e +} -returnCodes error -result {selection isn't in widget .e} +test entry-8.8 {DeleteChars procedure} -setup { + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 0123456789abcde + .e select from 3 + .e select to 8 + .e delete 3 7 + update + set x "[.e index sel.first] [.e index sel.last]" + .e select to 8 + lappend x [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {3 4 3 8} +test entry-8.9 {DeleteChars procedure} -setup { + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e +} -body { + .e insert 0 0123456789abcde + .e select from 3 + .e select to 8 + .e delete 3 8 + update + .e index sel.first +} -cleanup { + destroy .e +} -returnCodes error -result {selection isn't in widget .e} +test entry-8.10 {DeleteChars procedure} -setup { + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 0123456789abcde + .e select from 8 + .e select to 3 + .e delete 5 8 + update + set x "[.e index sel.first] [.e index sel.last]" + .e select to 8 + lappend x [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {3 5 5 8} +test entry-8.11 {DeleteChars procedure} -setup { + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 0123456789abcde + .e select from 8 + .e select to 3 + .e delete 8 10 + update + set x "[.e index sel.first] [.e index sel.last]" + .e select to 4 + lappend x [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {3 8 4 8} +test entry-8.12 {DeleteChars procedure} -setup { + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 0123456789abcde + .e icursor 4 + .e delete 1 4 + update + .e index insert +} -cleanup { + destroy .e +} -result {1} +test entry-8.13 {DeleteChars procedure} -setup { + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 0123456789abcde + .e icursor 4 + .e delete 1 5 + update + .e index insert +} -cleanup { + destroy .e +} -result {1} +test entry-8.14 {DeleteChars procedure} -setup { + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 0123456789abcde + .e icursor 4 + .e delete 4 6 + update + .e index insert +} -cleanup { + destroy .e +} -result {4} +test entry-8.15 {DeleteChars procedure} -setup { + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 "This is a very long string" + .e xview 4 + .e delete 1 4 + update + .e index @0 +} -cleanup { + destroy .e +} -result {1} +test entry-8.16 {DeleteChars procedure} -setup { + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 "This is a very long string" + .e xview 4 + .e delete 1 5 + update + .e index @0 +} -cleanup { + destroy .e +} -result {1} +test entry-8.17 {DeleteChars procedure} -setup { + entryPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 "This is a very long string" + .e xview 4 + .e delete 4 6 + update + .e index @0 +} -cleanup { + destroy .e +} -result {4} +test entry-8.18 {DeleteChars procedure} -setup { + entryPlus .e -width 0 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 "xyzzy" + update + .e delete 2 4 + winfo reqwidth .e +} -cleanup { + destroy .e +} -result {31} + +test entry-9.1 {EntryValueChanged procedure} -setup { + unset -nocomplain x +} -body { + trace variable x w override + entryPlus .e -textvariable x -width 0 + .e insert 0 foo + list $x [.e get] +} -cleanup { + destroy .e + trace vdelete x w override + unset x +} -result {12345 12345} + + +test entry-10.1 {EntrySetValue procedure} -constraints fonts -body { + set x abcde + set y ab + entryPlus .e -font {Helvetica -12} -highlightthickness 2 -bd 2 -width 0 + pack .e + .e configure -textvariable x + .e configure -textvariable y + update + list [.e get] [winfo reqwidth .e] +} -cleanup { + destroy .e +} -result {ab 24} +test entry-10.2 {EntrySetValue procedure, updating selection} -setup { + unset -nocomplain x + entryPlus .e -font {Helvetica -12} -highlightthickness 2 -bd 2 + pack .e +} -body { + .e configure -textvariable x + .e insert 0 "abcdefghjklmnopqrstu" + .e selection range 4 10 + set x "a" + .e index sel.first +} -cleanup { + destroy .e +} -returnCodes error -result {selection isn't in widget .e} +test entry-10.3 {EntrySetValue procedure, updating selection} -setup { + unset -nocomplain x + entryPlus .e -font {Helvetica -12} -highlightthickness 2 -bd 2 + pack .e +} -body { + .e configure -textvariable x + .e insert 0 "abcdefghjklmnopqrstu" + .e selection range 4 10 + set x "abcdefg" + list [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {4 7} +test entry-10.4 {EntrySetValue procedure, updating selection} -setup { + unset -nocomplain x + entryPlus .e -font {Helvetica -12} -highlightthickness 2 -bd 2 + pack .e +} -body { + .e configure -textvariable x + .e insert 0 "abcdefghjklmnopqrstu" + .e selection range 4 10 + set x "abcdefghijklmn" + list [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {4 10} +test entry-10.5 {EntrySetValue procedure, updating display position} -setup { + unset -nocomplain x + entryPlus .e -highlightthickness 2 -bd 2 + pack .e +} -body { + .e configure -width 10 -font {Courier -12} -textvariable x + .e insert 0 "abcdefghjklmnopqrstuvwxyz" + .e xview 10 + update + set x "abcdefg" + update + .e index @0 +} -cleanup { + destroy .e +} -result {0} +test entry-10.6 {EntrySetValue procedure, updating display position} -setup { + unset -nocomplain x + entryPlus .e -highlightthickness 2 -bd 2 + pack .e +} -body { + .e configure -width 10 -font {Courier -12} -textvariable x + pack .e + .e insert 0 "abcdefghjklmnopqrstuvwxyz" + .e xview 10 + update + set x "1234567890123456789012" + update + .e index @0 +} -cleanup { + destroy .e +} -result {10} +test entry-10.7 {EntrySetValue procedure, updating insertion cursor} -setup { + unset -nocomplain x + entryPlus .e -highlightthickness 2 -bd 2 + pack .e + update +} -body { + .e configure -width 10 -font {Courier -12} -textvariable x + pack .e + .e insert 0 "abcdefghjklmnopqrstuvwxyz" + .e icursor 5 + set x "123" + .e index insert +} -cleanup { + destroy .e +} -result {3} +test entry-10.8 {EntrySetValue procedure, updating insertion cursor} -setup { + unset -nocomplain x + entryPlus .e -highlightthickness 2 -bd 2 + pack .e +} -body { + .e configure -width 10 -font {Courier -12} -textvariable x + pack .e + .e insert 0 "abcdefghjklmnopqrstuvwxyz" + .e icursor 5 + set x "123456" + .e index insert +} -cleanup { + destroy .e +} -result {5} + +test entry-11.1 {EntryEventProc procedure} -setup { + entryPlus .e -highlightthickness 2 -bd 2 -font {Helvetica -12} + pack .e +} -body { + .e insert 0 abcdefg + destroy .e + update +} -cleanup { + destroy .e +} -result {} +test entry-11.2 {EntryEventProc procedure} -setup { + set x {} +} -body { + entryPlus .e1 -fg #112233 + rename .e1 .e2 + lappend x [winfo children .] + lappend x [.e2 cget -fg] + destroy .e1 + lappend x [info command .e*] [winfo children .] +} -cleanup { + destroy .e1 +} -result {.e1 #112233 {} {}} + +test entry-12.1 {EntryCmdDeletedProc procedure} -body { + button .b -text "xyz_123" + rename .b {} + list [info command .b*] [winfo children .] +} -cleanup { + destroy .b +} -result {{} {}} + + +test entry-13.1 {GetEntryIndex procedure} -setup { + entryPlus .e -font {Courier -12} -width 5 -bd 2 -relief sunken + pack .e +} -body { + .e insert 0 012345678901234567890 + .e xview 4 + update + .e index end +} -cleanup { + destroy .e +} -result {21} +test entry-13.2 {GetEntryIndex procedure} -body { + entryPlus .e + .e index abogus +} -cleanup { + destroy .e +} -returnCodes error -result {bad entry index "abogus"} +test entry-13.3 {GetEntryIndex procedure} -setup { + entryPlus .e -font {Courier -12} -width 5 -bd 2 -relief sunken + pack .e +} -body { + .e insert 0 012345678901234567890 + .e xview 4 + update + .e select from 1 + .e select to 6 + .e index anchor +} -cleanup { + destroy .e +} -result {1} +test entry-13.4 {GetEntryIndex procedure} -setup { + entryPlus .e -font {Courier -12} -width 5 -bd 2 -relief sunken + pack .e +} -body { + .e insert 0 012345678901234567890 + .e xview 4 + update + .e select from 4 + .e select to 1 + .e index anchor +} -cleanup { + destroy .e +} -result {4} +test entry-13.5 {GetEntryIndex procedure} -setup { + entryPlus .e -font {Courier -12} -width 5 -bd 2 -relief sunken + pack .e +} -body { + .e insert 0 012345678901234567890 + .e xview 4 + update + .e select from 3 + .e select to 15 + .e select adjust 4 + .e index anchor +} -cleanup { + destroy .e +} -result {15} +test entry-13.6 {GetEntryIndex procedure} -setup { + entryPlus .e +} -body { + .e index ebogus +} -cleanup { + destroy .e +} -returnCodes error -result {bad entry index "ebogus"} +test entry-13.7 {GetEntryIndex procedure} -setup { + entryPlus .e -font {Courier -12} -width 5 -bd 2 -relief sunken + pack .e +} -body { + .e insert 0 012345678901234567890 + .e xview 4 + update + .e icursor 2 + .e index insert +} -cleanup { + destroy .e +} -result {2} +test entry-13.8 {GetEntryIndex procedure} -setup { + entryPlus .e +} -body { + .e index ibogus +} -cleanup { + destroy .e +} -returnCodes error -result {bad entry index "ibogus"} +test entry-13.9 {GetEntryIndex procedure} -setup { + entryPlus .e -font {Courier -12} -width 5 -bd 2 -relief sunken + pack .e +} -body { + .e insert 0 012345678901234567890 + .e xview 4 + update + .e select from 1 + .e select to 6 + list [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {1 6} + + + + + + +test entry-13.10 {GetEntryIndex procedure} -constraints unix -body { +# On unix, when selection is cleared, entry widget's internal +# selection range is reset. +# Previous settings: + entryPlus .e -font {Courier -12} -width 5 -bd 2 -relief sunken + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e select from 1 + .e select to 6 + list [.e index sel.first] [.e index sel.last] +# Testing: + selection clear .e + .e index sel.first +} -cleanup { + destroy .e +} -returnCodes error -result {selection isn't in widget .e} + +test entry-13.11 {GetEntryIndex procedure} -constraints win -body { +# On mac and pc, when selection is cleared, entry widget remembers +# last selected range. When selection ownership is restored to +# entry, the old range will be rehighlighted. +# Previous settings: + entryPlus .e -font {Courier -12} -width 5 -bd 2 -relief sunken + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e select from 1 + .e select to 6 + list [.e index sel.first] [.e index sel.last] +# Testing: + selection clear .e + catch {selection get} + .e index sel.first +} -cleanup { + destroy .e +} -result {1} + +test entry-13.12 {GetEntryIndex procedure} -constraints unix -body { +# Previous settings: + entryPlus .e -font {Courier -12} -width 5 -bd 2 -relief sunken + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e select from 1 + .e select to 6 + list [.e index sel.first] [.e index sel.last] +# Testing: + selection clear .e + .e index sbogus +} -cleanup { + destroy .e +} -returnCodes error -result {selection isn't in widget .e} + +# why when string in .e index changed to not beginning with s, +# it behaves differently? +test entry-13.12.1 {GetEntryIndex procedure} -constraints unix -body { +# Previous settings: + entryPlus .e -font {Courier -12} -width 5 -bd 2 -relief sunken + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e select from 1 + .e select to 6 + list [.e index sel.first] [.e index sel.last] +# Testing: + selection clear .e + .e index bogus +} -cleanup { + destroy .e +} -returnCodes error -result {bad entry index "bogus"} + +test entry-13.13 {GetEntryIndex procedure} -constraints win -body { +# Previous settings: + entryPlus .e -font {Courier -12} -width 5 -bd 2 -relief sunken + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e select from 1 + .e select to 6 + list [.e index sel.first] [.e index sel.last] +# Testing: + selection clear .e + .e index sbogus +} -cleanup { + destroy .e +} -returnCodes error -result {bad entry index "sbogus"} + +test entry-13.14 {GetEntryIndex procedure} -constraints win -body { +# On mac and pc, when selection is cleared, entry widget remembers +# last selected range. When selection ownership is restored to +# entry, the old range will be rehighlighted. +# Previous settings: + entryPlus .e -font {Courier -12} -width 5 -bd 2 -relief sunken + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e select from 1 + .e select to 6 + list [.e index sel.first] [.e index sel.last] +# Testing: + selection clear .e + selection get +} -cleanup { + destroy .e +} -returnCodes error -match glob -result {*} + +test entry-13.14.1 {GetEntryIndex procedure} -constraints win -body { +# On mac and pc, when selection is cleared, entry widget remembers +# last selected range. When selection ownership is restored to +# entry, the old range will be rehighlighted. +# Previous settings: + entryPlus .e -font {Courier -12} -width 5 -bd 2 -relief sunken + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e select from 1 + .e select to 6 + list [.e index sel.first] [.e index sel.last] +# Testing: + selection clear .e + catch {selection get} + .e index sbogus +} -cleanup { + destroy .e +} -returnCodes error -match glob -result {*} + +test entry-13.15 {GetEntryIndex procedure} -body { + entryPlus .e + selection clear .e + .e index @xyz +} -cleanup { + destroy .e +} -returnCodes error -result {bad entry index "@xyz"} + +test entry-13.16 {GetEntryIndex procedure} -constraints fonts -body { + entryPlus .e -width 5 -relief sunken -highlightthickness 2 -bd 2\ + -font {Courier -12} + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e index @4 +} -cleanup { + destroy .e +} -result {4} +test entry-13.17 {GetEntryIndex procedure} -constraints fonts -body { + entryPlus .e -width 5 -relief sunken -highlightthickness 2 -bd 2\ + -font {Courier -12} + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e index @11 +} -cleanup { + destroy .e +} -result {4} +test entry-13.18 {GetEntryIndex procedure} -constraints fonts -body { + entryPlus .e -width 5 -relief sunken -highlightthickness 2 -bd 2\ + -font {Courier -12} + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e index @12 +} -cleanup { + destroy .e +} -result {5} +test entry-13.19 {GetEntryIndex procedure} -constraints fonts -body { + entryPlus .e -width 5 -relief sunken -highlightthickness 2 -bd 2\ + -font {Courier -12} + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e index @[expr {[winfo width .e] - 6}] +} -cleanup { + destroy .e +} -result {8} +test entry-13.20 {GetEntryIndex procedure} -constraints fonts -body { + entryPlus .e -width 5 -relief sunken -highlightthickness 2 -bd 2\ + -font {Courier -12} + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e index @[expr {[winfo width .e] - 5}] +} -cleanup { + destroy .e +} -result {9} +test entry-13.21 {GetEntryIndex procedure} -body { + entryPlus .e -width 5 -relief sunken -highlightthickness 2 -bd 2\ + -font {Courier -12} + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e index @1000 +} -cleanup { + destroy .e +} -result {9} +test entry-13.22 {GetEntryIndex procedure} -setup { + entryPlus .e + pack .e + update +} -body { + .e index 1xyz +} -cleanup { + destroy .e +} -returnCodes error -result {bad entry index "1xyz"} +test entry-13.23 {GetEntryIndex procedure} -body { + entryPlus .e -width 5 -relief sunken -highlightthickness 2 -bd 2\ + -font {Courier -12} + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e index -10 +} -cleanup { + destroy .e +} -result {0} +test entry-13.24 {GetEntryIndex procedure} -body { + entryPlus .e -width 5 -relief sunken -highlightthickness 2 -bd 2\ + -font {Courier -12} + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e index 12 +} -cleanup { + destroy .e +} -result {12} +test entry-13.25 {GetEntryIndex procedure} -body { + entryPlus .e -width 5 -relief sunken -highlightthickness 2 -bd 2\ + -font {Courier -12} + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e index 49 +} -cleanup { + destroy .e +} -result {21} +test entry-13.26 {GetEntryIndex procedure} -constraints fonts -body { + entryPlus .e -highlightthickness 2 -bd 2 -font {Helvetica -12} + selection clear .e + .e configure -show . + .e insert 0 XXXYZZY + pack .e + update + list [.e index @7] [.e index @8] +} -cleanup { + destroy .e +} -result {0 1} + +# XXX Still need to write tests for EntryScanTo and EntrySelectTo. + + +test entry-14.1 {EntryFetchSelection procedure} -body { + entryPlus .e + .e insert end "This is a test string" + .e select from 1 + .e select to 18 + selection get +} -cleanup { + destroy .e +} -result {his is a test str} +test entry-14.2 {EntryFetchSelection procedure} -body { + entryPlus .e -show * + .e insert end "This is a test string" + .e select from 1 + .e select to 18 + selection get +} -cleanup { + destroy .e +} -result {*****************} +test entry-14.3 {EntryFetchSelection procedure} -setup { + set x {} + for {set i 1} {$i <= 500} {incr i} { + append x "This is line $i, out of 500\n" +} +} -body { + entryPlus .e + .e insert end $x + .e select from 0 + .e select to end + string compare [selection get] $x +} -cleanup { + destroy .e +} -result {0} + +test entry-15.1 {EntryLostSelection} -body { + entryPlus .e + .e insert 0 "Text" + .e select from 0 + .e select to 4 + set result [selection get] + selection clear + .e select from 0 + .e select to 4 + lappend result [selection get] +} -cleanup { + destroy .e +} -result {Text Text} + +# is scrollcommand needed here?? +test entry-16.1 {EntryVisibleRange procedure} -constraints fonts -body { + entryPlus .e -width 10 -font {Helvetica -12} + pack .e + update + .e insert 0 "............................." + format {%.6f %.6f} {*}[.e xview] +} -cleanup { + destroy .e +} -result {0.000000 0.827586} +test entry-16.2 {EntryVisibleRange procedure} -constraints { + unix fonts +} -body { + entryPlus .e -show X -width 10 -font {Helvetica -12} + pack .e + update + .e insert 0 "............................." + format {%.6f %.6f} {*}[.e xview] +} -cleanup { + destroy .e +} -result {0.000000 0.275862} +test entry-16.3 {EntryVisibleRange procedure} -constraints { + win +} -body { + entryPlus .e -show . -width 10 -font {Helvetica -12} + pack .e + update + .e insert 0 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX + format {%.6f %.6f} {*}[.e xview] +} -cleanup { + destroy .e +} -result {0.000000 0.827586} +test entry-16.4 {EntryVisibleRange procedure} -body { + entryPlus .e -show "" + format {%.6f %.6f} {*}[.e xview] +} -cleanup { + destroy .e +} -result {0.000000 1.000000} + + +test entry-17.1 {EntryUpdateScrollbar procedure} -body { + entryPlus .e -width 10 -xscrollcommand scroll -font {Courier -12} + pack .e + .e delete 0 end + .e insert 0 123 + update + format {%.6f %.6f} {*}$scrollInfo +} -cleanup { + destroy .e +} -result {0.000000 1.000000} +test entry-17.2 {EntryUpdateScrollbar procedure} -body { + entryPlus .e -width 10 -xscrollcommand scroll -font {Courier -12} + pack .e + .e insert 0 0123456789abcdef + .e xview 3 + update + format {%.6f %.6f} {*}$scrollInfo +} -cleanup { + destroy .e +} -result {0.187500 0.812500} +test entry-17.3 {EntryUpdateScrollbar procedure} -body { + entryPlus .e -width 10 -xscrollcommand scroll -font {Courier -12} + pack .e + .e insert 0 abcdefghijklmnopqrs + .e xview 6 + update + format {%.6f %.6f} {*}$scrollInfo +} -cleanup { + destroy .e +} -result {0.315789 0.842105} +test entry-17.4 {EntryUpdateScrollbar procedure} -setup { + proc bgerror msg { + global x + set x $msg +} +} -body { + entryPlus .e -width 5 -xscrollcommand thisisnotacommand + pack .e + update + list $x $errorInfo +} -cleanup { + destroy .e + rename bgerror {} +} -result {{invalid command name "thisisnotacommand"} {invalid command name "thisisnotacommand" + while executing +"thisisnotacommand 0.0 1.0" + (horizontal scrolling command executed by .e)}} + + +test entry-18.1 {Entry widget vs hiding} -setup { + entryPlus .e +} -body { + set l [interp hidden] + interp hide {} .e + destroy .e + set res1 [list [winfo children .] [interp hidden]] + set res2 [list {} $l] + expr {$res1 == $res2} +} -result {1} + +## +## Entry widget VALIDATION tests +## +# The validation tests build each one upon the previous, so cascading +# failures aren't good +# + +# 19.* test cases in previous version highly depended on the previous +# test cases. This was replaced by inserting recently set configurations +# that matters for the test case +test entry-19.1 {entry widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + entryPlus .e -validate all \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert 0 a + return $::vVals +} -cleanup { + destroy .e +} -result {.e 1 0 a {} a all key} + +test entry-19.2 {entry widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + entryPlus .e -validate all \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert 0 a ;# previous settings + .e insert 1 b + return $::vVals +} -cleanup { + destroy .e +} -result {.e 1 1 ab a b all key} + +test entry-19.3 {entry widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + entryPlus .e -validate all \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert 0 ab ;# previous settings + .e insert end c + return $::vVals +} -cleanup { + destroy .e +} -result {.e 1 2 abc ab c all key} + +test entry-19.4 {entry widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + entryPlus .e -validate all \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert 0 abc ;# previous settings + .e insert 1 123 + list $::vVals $::e +} -cleanup { + destroy .e +} -result {{.e 1 1 a123bc abc 123 all key} a123bc} + +test entry-19.5 {entry widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + entryPlus .e -validate all \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert 0 a123bc ;# previous settings + .e delete 2 + return $::vVals +} -cleanup { + destroy .e +} -result {.e 0 2 a13bc a123bc 2 all key} + +test entry-19.6 {entry widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + entryPlus .e -validate all \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert 0 a13bc ;# previous settings + .e configure -validate key + .e delete 1 3 + return $::vVals +} -cleanup { + destroy .e +} -result {.e 0 1 abc a13bc 13 key key} + +test entry-19.7 {entry widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + entryPlus .e -validate focus \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert end abc ;# previous settings + set ::vVals {} + .e insert end d + return $::vVals +} -cleanup { + destroy .e +} -result {} + +test entry-19.8 {entry widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + entryPlus .e -validate all \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e configure -validate focus ;# previous settings + .e insert end abcd ;# previous settings + focus -force .e +# update necessary to process FocusIn event + update + return $::vVals +} -cleanup { + destroy .e +} -result {.e -1 -1 abcd abcd {} focus focusin} + +test entry-19.9 {entry widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + entryPlus .e -validate focus \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert end abcd ;# previous settings + focus -force .e ;# previous settings + update ;# previous settings +# update necessary to process FocusIn event + focus -force . +# update necessary to process FocusOut event + update + return $::vVals +} -cleanup { + destroy .e +} -result {.e -1 -1 abcd abcd {} focus focusout} + +test entry-19.10 {entry widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + entryPlus .e -validate all \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert end abcd ;# previous settings + focus -force .e +# update necessary to process FocusIn event + update + return $::vVals +} -cleanup { + destroy .e +} -result {.e -1 -1 abcd abcd {} all focusin} + +test entry-19.11 {entry widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + entryPlus .e -validate all \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert end abcd ;# previous settings + focus -force .e ;# previous settings +# update necessary to process FocusIn event + update ;# previous settings + focus -force . +# update necessary to process FocusOut event + update + return $::vVals +} -cleanup { + destroy .e +} -result {.e -1 -1 abcd abcd {} all focusout} + +test entry-19.12 {entry widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + entryPlus .e -validate focusin \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert 0 abcd ;# previous settings + focus -force .e +# update necessary to process FocusIn event + update + return $::vVals +} -cleanup { + destroy .e +} -result {.e -1 -1 abcd abcd {} focusin focusin} + +test entry-19.13 {entry widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + entryPlus .e -validate focusin \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert end abcd ;# previous settings + set ::vVals {} + focus -force . +# update necessary to process FocusOut event + update + return $::vVals +} -cleanup { + destroy .e +} -result {} + +test entry-19.14 {entry widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + entryPlus .e -validate focuso \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert end abcd ;# previous settings + set ::vVals {} ;# previous settings + focus -force .e +# update necessary to process FocusIn event + update + return $::vVals +} -cleanup { + destroy .e +} -result {} + +test entry-19.15 {entry widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + entryPlus .e -validate focuso \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert end abcd ;# previous settings + set ::vVals {} ;# previous settings + focus -force .e ;# previous settings +# update necessary to process FocusIn event + update ;# previous settings + focus -force . +# update necessary to process FocusOut event + update + return $::vVals +} -cleanup { + destroy .e +} -result {.e -1 -1 abcd abcd {} focusout focusout} + +# the same as 19.16 but added [.e validate] to returned list +test entry-19.16 {entry widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + entryPlus .e -validate focuso \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert end abcd ;# previous settings + set ::vVals {} ;# previous settings + focus -force .e ;# previous settings +# update necessary to process FocusIn event + update ;# previous settings + focus -force . +# update necessary to process FocusOut event + update + list [.e validate] $::vVals +} -cleanup { + destroy .e +} -result {1 {.e -1 -1 abcd abcd {} all forced}} + + +test entry-19.17 {entry widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + entryPlus .e -validate focuso \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert end abcd ;# previous settings + set ::e newdata + list [.e cget -validate] $::vVals +} -cleanup { + destroy .e +} -result {focusout {.e -1 -1 newdata abcd {} focusout forced}} + + +# proc doval changed - returns 0 +test entry-19.18 {entry widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + entryPlus .e -validate all \ + -validatecommand [list doval3 %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + set ::e newdata ;# previous settings + .e configure -validate all + set ::e nextdata + list [.e cget -validate] $::vVals +} -cleanup { + destroy .e +} -result {none {.e -1 -1 nextdata newdata {} all forced}} + +## This sets validate to none because it shows that we prevent a possible +## loop condition in the validation, when the entry textvar is also set +# proc doval2 used +test entry-19.19 {entry widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + entryPlus .e -validate all \ + -validatecommand [list doval3 %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + set ::e nextdata ;# previous settings + + .e configure -validatecommand [list doval2 %W %d %i %P %s %S %v %V] + .e validate + list [.e cget -validate] [.e get] $::vVals +} -cleanup { + destroy .e +} -result {none mydata {.e -1 -1 nextdata nextdata {} all forced}} + +## This leaves validate alone because we trigger validation through the +## textvar (a write trace), and the write during validation triggers +## nothing (by definition of avoiding loops on var traces). This is +## one of those "dangerous" conditions where the user will have a +## different value in the entry widget shown as is in the textvar. +test entry-19.20 {entry widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + entryPlus .e -validate all \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + set ::e nextdata ;# previous settings + .e configure -validatecommand [list doval2 %W %d %i %P %s %S %v %V] ;# prev + .e validate ;# previous settings + + .e configure -validate all + set ::e testdata + list [.e cget -validate] [.e get] $::e $::vVals +} -cleanup { + destroy .e +} -result {all testdata mydata {.e -1 -1 testdata mydata {} all forced}} +## +## End validation tests +## + +test entry-20.1 {widget deletion while active} -body { + entryPlus .e -validate all \ + -validatecommand { destroy %W ; return 1 } \ + -invalidcommand bell + update + .e insert 0 abc + winfo exists .e +} -cleanup { + destroy .e +} -result {0} + +test entry-20.2 {widget deletion while active} -body { + entryPlus .e -validate all \ + -validatecommand { return 0 } \ + -invalidcommand { destroy %W } + .e insert 0 abc + winfo exists .e +} -cleanup { + destroy .e +} -result {0} + +test entry-20.3 {widget deletion while active} -body { + entryPlus .e -validate all \ + -validatecommand { rename .e {} ; return 1 } + .e insert 0 abc + winfo exists .e +} -cleanup { + destroy .e +} -result {0} + +test entry-20.4 {widget deletion while active} -body { + entryPlus .e -validate all \ + -validatecommand { return 0 } \ + -invalidcommand { rename .e {} } + .e insert 0 abc + winfo exists .e +} -cleanup { + destroy .e +} -result {0} + +test entry-20.5 {widget deletion while active} -body { + entryPlus .e -validatecommand { destroy .e ; return 0 } + .e validate + winfo exists .e +} -cleanup { + destroy .e +} -result {0} + +test entry-20.6 {widget deletion while active} -body { + pack [entryPlus .e] + update + .e config -xscrollcommand { destroy .e } + update idle + winfo exists .e +} -cleanup { + destroy .e +} -result {0} + +test entry-20.7 {widget deletion with textvariable active} -body { +# SF bugs 607390 and 617446 + set FOO init + entryPlus .e -textvariable FOO -validate all \ + -vcmd {%W configure -bg white; format 1} + bind .e { set FOO hello } + destroy .e + winfo exists .e +} -cleanup { + destroy .e +} -result {0} + + +test entry-21.1 {selection present while disabled, bug 637828} -body { + entryPlus .e + .e insert end 0123456789 + .e select from 3 + .e select to 6 + set out [.e selection present] + .e configure -state disabled +# still return 1 when disabled, because 'selection get' will work, +# but selection cannot be changed (new behavior since 8.4) + .e select to 9 + lappend out [.e selection present] [selection get] +} -cleanup { + destroy .e +} -result {1 1 345} + +test entry-22.1 {lost namespaced textvar} -body { + namespace eval test { variable foo {a b} } + entryPlus .e -textvariable ::test::foo + namespace delete test + set ::test::foo +} -cleanup { + destroy .e +} -returnCodes error -result {can't read "::test::foo": no such variable} +test entry-22.2 {lost namespaced textvar} -body { + namespace eval test { variable foo {a b} } + entryPlus .e -textvariable ::test::foo + namespace delete test + catch {.e insert end "more stuff"} result1 + catch {.e delete 5 end } result2 + catch {set ::test::foo} result3 + list [.e get] [.e cget -textvar] $result1 $result2 $result3 +} -cleanup { + destroy .e +} -result [list "a bmo" ::test::foo \ + {can't set "::test::foo": parent namespace doesn't exist} \ + {can't set "::test::foo": parent namespace doesn't exist} \ + {can't read "::test::foo": no such variable}] + +test entry-23.1 {error in trace proc attached to the textvariable} -setup { + destroy .e +} -body { + trace variable myvar w traceit + proc traceit args {error "Intentional error here!"} + entryPlus .e -textvariable myvar + catch {.e insert end mystring} result1 + catch {.e delete 0} result2 + list $result1 $result2 +} -cleanup { + destroy .e +} -result [list {can't set "myvar": Intentional error here!} \ + {can't set "myvar": Intentional error here!}] + +test entry-24.1.entry {textvariable lives in a non-existing namespace} -constraints { + entryErrorMsgDifferent +} -setup { + destroy .e +} -body { + catch {entryPlus .e -textvariable thisnsdoesntexist::myvar} result1 + set result1 +} -cleanup { + destroy .e +} -result {can't trace "thisnsdoesntexist::myvar": parent namespace doesn't exist} + +test entry-24.1 {textvariable lives in a non-existing namespace} -setup { + destroy .e +} -body { + catch {entryPlus .e -textvariable thisnsdoesntexist::myvar} result1 + set result1 +} -cleanup { + destroy .e +} -result {Error in constructor: can't trace "thisnsdoesntexist::myvar": parent namespace doesn't exist} + +# Gathered comments about lacks +# XXX Still need to write tests for EntryBlinkProc, EntryFocusProc, +# and EntryTextVarProc. +# No tests for DisplayEntry. +# XXX Still need to write tests for EntryScanTo and EntrySelectTo. +# No tests for EventuallyRedraw + +# option clear +# cleanup +cleanupTests +return + + + diff --git a/modules/widgetPlus/pkgIndex.tcl b/modules/widgetPlus/pkgIndex.tcl new file mode 100644 index 00000000..70950b28 --- /dev/null +++ b/modules/widgetPlus/pkgIndex.tcl @@ -0,0 +1 @@ +package ifneeded widgetPlus 1.0b1 [list source [file join $dir widgetPlus.tcl]] diff --git a/modules/widgetPlus/spinboxPlus.test b/modules/widgetPlus/spinboxPlus.test new file mode 100644 index 00000000..fd4991b2 --- /dev/null +++ b/modules/widgetPlus/spinboxPlus.test @@ -0,0 +1,3977 @@ +# This file is a Tcl script to test spinbox widgets in Tk. It is +# organized in the standard fashion for Tcl tests. +# +# Copyright (c) 1994 The Regents of the University of California. +# Copyright (c) 1994-1997 Sun Microsystems, Inc. +# Copyright (c) 1998-1999 by Scriptics Corporation. +# All rights reserved. + +package require tcltest 2.2 +namespace import ::tcltest::* +eval tcltest::configure $argv +tcltest::loadTestedCommands + +package require widgetPlus +namespace import ::widgetPlus::spinboxPlus + +# ------------------------------------------------------------------------------ +# This file is copied from spinbox.test, with addition of the two lines above, +# application of "s/spinbox/spinboxPlus/g" to the code (but not to comments, +# results, test names or other metadata), and further editing of failing tests +# as described below. +# +# The purpose is to check that "spinboxPlus" does not break any features +# of "spinbox", including important matters such as validation. +# +# There are 13 test failures: +# - 3.15.spinbox (llength of [.s configure]) +# - 12 differences in error messages +# +# These harmless failures occur because "spinboxPlus" does not give the same +# results as "spinbox". The tests are given constraints named +# spinboxResultDifferent and spinboxErrorMsgDifferent respectively, and their test +# names have ".spinbox" appended. +# +# Copies of the same tests without the ".spinbox" suffix or the added constraints +# have the test result modified to reflect the (valid but different) value +# obtained when using "spinboxPlus" instead of "spinbox". +# ------------------------------------------------------------------------------ + +# For xscrollcommand +proc scroll args { + global scrollInfo + set scrollInfo $args +} +# For trace variable +proc override args { + global x + set x 12345 +} + +# Procedures used in widget VALIDATION tests +proc doval {W d i P s S v V} { + set ::vVals [list $W $d $i $P $s $S $v $V] + return 1 +} +proc doval2 {W d i P s S v V} { + set ::vVals [list $W $d $i $P $s $S $v $V] + set ::e mydata + return 1 +} +proc doval3 {W d i P s S v V} { + set ::vVals [list $W $d $i $P $s $S $v $V] + return 0 +} + +set cy [font metrics {Courier -12} -linespace] + +test spinbox-1.1 {configuration option: "activebackground"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -activebackground #ff0000 + .e cget -activebackground +} -cleanup { + destroy .e +} -result {#ff0000} +test spinbox-1.2 {configuration option: "activebackground" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -activebackground non-existent +} -cleanup { + destroy .e +} -returnCodes {error} -result {unknown color name "non-existent"} + +test spinbox-1.3 {configuration option: "background"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -background #ff0000 + .e cget -background +} -cleanup { + destroy .e +} -result {#ff0000} +test spinbox-1.4 {configuration option: "background" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -background non-existent +} -cleanup { + destroy .e +} -returnCodes {error} -result {unknown color name "non-existent"} + +test spinbox-1.5 {configuration option: "bd"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -bd 4 + .e cget -bd +} -cleanup { + destroy .e +} -result {4} +test spinbox-1.6 {configuration option: "bd" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -bd badValue +} -cleanup { + destroy .e +} -returnCodes {error} -result {bad screen distance "badValue"} + +test spinbox-1.7 {configuration option: "bg"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -bg #ff0000 + .e cget -bg +} -cleanup { + destroy .e +} -result {#ff0000} +test spinbox-1.8 {configuration option: "bg" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -bg non-existent +} -cleanup { + destroy .e +} -returnCodes {error} -result {unknown color name "non-existent"} + +test spinbox-1.9 {configuration option: "borderwidth"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -borderwidth 1.3 + .e cget -borderwidth +} -cleanup { + destroy .e +} -result {1} +test spinbox-1.10 {configuration option: "borderwidth" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -borderwidth badValue +} -cleanup { + destroy .e +} -returnCodes {error} -result {bad screen distance "badValue"} + +test spinbox-1.11 {configuration option: "buttonbackground"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -buttonbackground #ff0000 + .e cget -buttonbackground +} -cleanup { + destroy .e +} -result {#ff0000} +test spinbox-1.12 {configuration option: "buttonbackground" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -buttonbackground non-existent +} -cleanup { + destroy .e +} -returnCodes {error} -result {unknown color name "non-existent"} + +test spinbox-1.13 {configuration option: "buttoncursor"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -buttoncursor arrow + .e cget -buttoncursor +} -cleanup { + destroy .e +} -result {arrow} +test spinbox-1.14 {configuration option: "buttoncursor" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -buttoncursor badValue +} -cleanup { + destroy .e +} -returnCodes {error} -result {bad cursor spec "badValue"} + +test spinbox-1.15 {configuration option: "command"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -command {a command} + .e cget -command +} -cleanup { + destroy .e +} -result {a command} + +test spinbox-1.16 {configuration option: "cursor"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -cursor arrow + .e cget -cursor +} -cleanup { + destroy .e +} -result {arrow} +test spinbox-1.17 {configuration option: "cursor" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -cursor badValue +} -cleanup { + destroy .e +} -returnCodes {error} -result {bad cursor spec "badValue"} + +test spinbox-1.18 {configuration option: "disabledbackground"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -disabledbackground green + .e cget -disabledbackground +} -cleanup { + destroy .e +} -result {green} +test spinbox-1.19 {configuration option: "disabledbackground" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -disabledbackground non-existent +} -cleanup { + destroy .e +} -returnCodes {error} -result {unknown color name "non-existent"} + +test spinbox-1.20 {configuration option: "disabledforeground"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -disabledforeground #110022 + .e cget -disabledforeground +} -cleanup { + destroy .e +} -result {#110022} +test spinbox-1.21 {configuration option: "disabledforeground" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -disabledforeground bogus +} -cleanup { + destroy .e +} -returnCodes {error} -result {unknown color name "bogus"} + +test spinbox-1.22 {configuration option: "exportselection"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -exportselection yes + .e cget -exportselection +} -cleanup { + destroy .e +} -result {1} +test spinbox-1.23 {configuration option: "exportselection" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -exportselection xyzzy +} -cleanup { + destroy .e +} -returnCodes {error} -result {expected boolean value but got "xyzzy"} + +test spinbox-1.24 {configuration option: "fg"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -fg #110022 + .e cget -fg +} -cleanup { + destroy .e +} -result {#110022} +test spinbox-1.25 {configuration option: "fg" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -fg bogus +} -cleanup { + destroy .e +} -returnCodes {error} -result {unknown color name "bogus"} + +test spinbox-1.26 {configuration option: "font"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* + .e cget -font +} -cleanup { + destroy .e +} -result {-Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-*} +test spinbox-1.27 {configuration option: "font" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -font {} +} -cleanup { + destroy .e +} -returnCodes {error} -result {font "" doesn't exist} + +test spinbox-1.28 {configuration option: "foreground"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -foreground #110022 + .e cget -foreground +} -cleanup { + destroy .e +} -result {#110022} +test spinbox-1.29 {configuration option: "foreground" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -foreground bogus +} -cleanup { + destroy .e +} -returnCodes {error} -result {unknown color name "bogus"} + +test spinbox-1.30 {configuration option: "format"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -format %0.5f + .e cget -format +} -cleanup { + destroy .e +} -result {%0.5f} +test spinbox-1.31 {configuration option: "format" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -format %d +} -cleanup { + destroy .e +} -returnCodes {error} -result {bad spinbox format specifier "%d"} + +test spinbox-1.32 {configuration option: "from"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -from -10 + .e cget -from +} -cleanup { + destroy .e +} -result {-10.0} +test spinbox-1.33 {configuration option: "from" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -from bogus +} -cleanup { + destroy .e +} -returnCodes {error} -result {expected floating-point number but got "bogus"} + +test spinbox-1.34 {configuration option: "highlightbackground"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -highlightbackground #123456 + .e cget -highlightbackground +} -cleanup { + destroy .e +} -result {#123456} +test spinbox-1.35 {configuration option: "highlightbackground" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -highlightbackground ugly +} -cleanup { + destroy .e +} -returnCodes {error} -result {unknown color name "ugly"} + +test spinbox-1.36 {configuration option: "highlightcolor"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -highlightcolor #123456 + .e cget -highlightcolor +} -cleanup { + destroy .e +} -result {#123456} +test spinbox-1.37 {configuration option: "highlightcolor" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -highlightcolor bogus +} -cleanup { + destroy .e +} -returnCodes {error} -result {unknown color name "bogus"} + +test spinbox-1.38 {configuration option: "highlightthickness"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -highlightthickness 6 + .e cget -highlightthickness +} -cleanup { + destroy .e +} -result {6} +test spinbox-1.39 {configuration option: "highlightthickness" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -highlightthickness bogus +} -cleanup { + destroy .e +} -returnCodes {error} -result {bad screen distance "bogus"} + +test spinbox-1.40 {configuration option: "highlightthickness"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -highlightthickness -2 + .e cget -highlightthickness +} -cleanup { + destroy .e +} -result {0} + +test spinbox-1.41 {configuration option: "increment"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -increment 1.0 + .e cget -increment +} -cleanup { + destroy .e +} -result {1.0} +test spinbox-1.42 {configuration option: "increment" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -increment bogus +} -cleanup { + destroy .e +} -returnCodes {error} -result {expected floating-point number but got "bogus"} + +test spinbox-1.43 {configuration option: "insertbackground"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -insertbackground #110022 + .e cget -insertbackground +} -cleanup { + destroy .e +} -result {#110022} +test spinbox-1.44 {configuration option: "insertbackground" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -insertbackground bogus +} -cleanup { + destroy .e +} -returnCodes {error} -result {unknown color name "bogus"} + +test spinbox-1.45 {configuration option: "insertborderwidth"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -insertborderwidth 1.3 + .e cget -insertborderwidth +} -cleanup { + destroy .e +} -result {1} +test spinbox-1.46 {configuration option: "insertborderwidth" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -insertborderwidth 2.6x +} -cleanup { + destroy .e +} -returnCodes {error} -result {bad screen distance "2.6x"} + +test spinbox-1.47 {configuration option: "insertofftime"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -insertofftime 100 + .e cget -insertofftime +} -cleanup { + destroy .e +} -result {100} +test spinbox-1.48 {configuration option: "insertofftime" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -insertofftime 3.2 +} -cleanup { + destroy .e +} -returnCodes {error} -result {expected integer but got "3.2"} + +test spinbox-1.49 {configuration option: "insertontime"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -insertontime 100 + .e cget -insertontime +} -cleanup { + destroy .e +} -result {100} +test spinbox-1.50 {configuration option: "insertontime" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -insertontime 3.2 +} -cleanup { + destroy .e +} -returnCodes {error} -result {expected integer but got "3.2"} + +test spinbox-1.51 {configuration option: "invalidcommand"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -invalidcommand "a command" + .e cget -invalidcommand +} -cleanup { + destroy .e +} -result {a command} + +test spinbox-1.52 {configuration option: "invcmd"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -invcmd "a command" + .e cget -invcmd +} -cleanup { + destroy .e +} -result {a command} + +test spinbox-1.53 {configuration option: "justify"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -justify right + .e cget -justify +} -cleanup { + destroy .e +} -result {right} +test spinbox-1.54 {configuration option: "justify" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -justify bogus +} -cleanup { + destroy .e +} -returnCodes {error} -result {bad justification "bogus": must be left, right, or center} + +test spinbox-1.55 {configuration option: "readonlybackground"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -readonlybackground green + .e cget -readonlybackground +} -cleanup { + destroy .e +} -result {green} +test spinbox-1.56 {configuration option: "readonlybackground" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -readonlybackground non-existent +} -cleanup { + destroy .e +} -returnCodes {error} -result {unknown color name "non-existent"} + +test spinbox-1.57 {configuration option: "relief"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -relief groove + .e cget -relief +} -cleanup { + destroy .e +} -result {groove} +test spinbox-1.58 {configuration option: "relief" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -relief 1.5 +} -cleanup { + destroy .e +} -returnCodes {error} -result {bad relief "1.5": must be flat, groove, raised, ridge, solid, or sunken} + +test spinbox-1.59 {configuration option: "repeatdelay"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -repeatdelay 500 + .e cget -repeatdelay +} -cleanup { + destroy .e +} -result {500} +test spinbox-1.60 {configuration option: "repeatdelay" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -repeatdelay 3p +} -cleanup { + destroy .e +} -returnCodes {error} -result {expected integer but got "3p"} + +test spinbox-1.61 {configuration option: "repeatinterval"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -repeatinterval -500 + .e cget -repeatinterval +} -cleanup { + destroy .e +} -result {-500} +test spinbox-1.62 {configuration option: "repeatinterval" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -repeatinterval 3p +} -cleanup { + destroy .e +} -returnCodes {error} -result {expected integer but got "3p"} + +test spinbox-1.63 {configuration option: "selectbackground"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -selectbackground #110022 + .e cget -selectbackground +} -cleanup { + destroy .e +} -result {#110022} +test spinbox-1.64.spinbox {configuration option: "selectbackground" for spinbox} -constraints { + spinboxErrorMsgDifferent +} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -selectbackground bogus +} -cleanup { + destroy .e +} -returnCodes {error} -result {unknown color name "bogus"} +test spinbox-1.64 {configuration option: "selectbackground" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -selectbackground bogus +} -cleanup { + destroy .e +} -returnCodes {error} -result {invalid -selectbackground value: unknown color name "bogus"} + +test spinbox-1.65 {configuration option: "selectborderwidth"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -selectborderwidth 1.3 + .e cget -selectborderwidth +} -cleanup { + destroy .e +} -result {1} +test spinbox-1.66 {configuration option: "selectborderwidth" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -selectborderwidth badValue +} -cleanup { + destroy .e +} -returnCodes {error} -result {bad screen distance "badValue"} + +test spinbox-1.67 {configuration option: "selectforeground"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -selectforeground #654321 + .e cget -selectforeground +} -cleanup { + destroy .e +} -result {#654321} +test spinbox-1.68 {configuration option: "selectforeground" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -selectforeground bogus +} -cleanup { + destroy .e +} -returnCodes {error} -result {unknown color name "bogus"} + +test spinbox-1.69 {configuration option: "state"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -state n + .e cget -state +} -cleanup { + destroy .e +} -result {normal} +test spinbox-1.70 {configuration option: "state" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -state bogus +} -cleanup { + destroy .e +} -returnCodes {error} -result {bad state "bogus": must be disabled, normal, or readonly} + +test spinbox-1.71 {configuration option: "takefocus"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -takefocus "any string" + .e cget -takefocus +} -cleanup { + destroy .e +} -result {any string} + +test spinbox-1.72 {configuration option: "textvariable"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -textvariable i + .e cget -textvariable +} -cleanup { + destroy .e +} -result {i} + +test spinbox-1.73 {configuration option: "to"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -to 14.9 + .e cget -to +} -cleanup { + destroy .e +} -result {14.9} +test spinbox-1.74 {configuration option: "to" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -to bogus +} -cleanup { + destroy .e +} -returnCodes {error} -result {expected floating-point number but got "bogus"} + +test spinbox-1.75 {configuration option: "validate"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -validate "key" + .e cget -validate +} -cleanup { + destroy .e +} -result {key} +test spinbox-1.76 {configuration option: "validate" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -validate "bogus" +} -cleanup { + destroy .e +} -returnCodes {error} -result {bad validate "bogus": must be all, key, focus, focusin, focusout, or none} + +test spinbox-1.77 {configuration option: "validatecommand"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -validatecommand "a command" + .e cget -validatecommand +} -cleanup { + destroy .e +} -result {a command} + +test spinbox-1.78 {configuration option: "values"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -values {mon tue wed thur} + .e cget -values +} -cleanup { + destroy .e +} -result {mon tue wed thur} +test spinbox-1.79 {configuration option: "values" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -values {bad {}list} +} -cleanup { + destroy .e +} -returnCodes {error} -result {list element in braces followed by "list" instead of space} + +test spinbox-1.80 {configuration option: "vcmd"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -vcmd "a command" + .e cget -vcmd +} -cleanup { + destroy .e +} -result {a command} + +test spinbox-1.81 {configuration option: "width"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -width 402 + .e cget -width +} -cleanup { + destroy .e +} -result {402} +test spinbox-1.82 {configuration option: "width" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -width 3p +} -cleanup { + destroy .e +} -returnCodes {error} -result {expected integer but got "3p"} + +test spinbox-1.83 {configuration option: "wrap"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -wrap yes + .e cget -wrap +} -cleanup { + destroy .e +} -result {1} +test spinbox-1.84 {configuration option: "wrap" for spinbox} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -wrap xyzzy +} -cleanup { + destroy .e +} -returnCodes {error} -result {expected boolean value but got "xyzzy"} + +test spinbox-1.85 {configuration option: "xscrollcommand"} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 -font {Helvetica -12} \ + -relief sunken + pack .e + update +} -body { + .e configure -xscrollcommand {Some command} + .e cget -xscrollcommand +} -cleanup { + destroy .e +} -result {Some command} + + +test spinbox-2.1.spinbox {Tk_SpinboxCmd procedure} -constraints { + spinboxErrorMsgDifferent +} -body { + spinboxPlus +} -returnCodes error -result {wrong # args: should be "spinbox pathName ?-option value ...?"} +test spinbox-2.1 {Tk_SpinboxCmd procedure} -body { + spinboxPlus +} -returnCodes error -result {wrong # args: should be "spinboxPlus pathName ?-option value ...?"} +test spinbox-2.2.spinbox {Tk_SpinboxCmd procedure} -constraints { + spinboxErrorMsgDifferent +} -body { + spinboxPlus gorp +} -returnCodes error -result {bad window path name "gorp"} +test spinbox-2.2 {Tk_SpinboxCmd procedure} -body { + spinboxPlus gorp +} -returnCodes error -result {unknown subcommand "gorp": must be create} +test spinbox-2.3 {Tk_SpinboxCmd procedure} -body { + spinboxPlus .e + pack .e + update + list [winfo exists .e] [winfo class .e] [info commands .e] +} -cleanup { + destroy .e +} -result {1 Spinbox .e} +test spinbox-2.4.spinbox {Tk_SpinboxCmd procedure} -constraints { + spinboxErrorMsgDifferent +} -body { + spinboxPlus .e -gorp foo +} -cleanup { + destroy .e +} -returnCodes error -result {unknown option "-gorp"} +test spinbox-2.4 {Tk_SpinboxCmd procedure} -body { + spinboxPlus .e -gorp foo +} -cleanup { + destroy .e +} -returnCodes error -result {Error in constructor: unknown option "-gorp"} +test spinbox-2.4.1 {Tk_SpinboxCmd procedure} -body { + catch {spinboxPlus .e -gorp foo} + list [winfo exists .e] [info commands .e] +} -cleanup { + destroy .e +} -result {0 {}} +test spinbox-2.5 {Tk_SpinboxCmd procedure} -body { + spinboxPlus .e +} -cleanup { + destroy .e +} -result {.e} + + +test spinbox-3.1.spinbox {SpinboxWidgetCmd procedure} -constraints { + spinboxErrorMsgDifferent +} -setup { + spinboxPlus .e + pack .e + update +} -body { + .e +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e option ?arg ...?"} +test spinbox-3.1 {SpinboxWidgetCmd procedure} -setup { + spinboxPlus .e + pack .e + update +} -body { + .e +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e subcommand ?arg ...?"} +test spinbox-3.2 {SpinboxWidgetCmd procedure, "bbox" widget command} -setup { + spinboxPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e bbox +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e bbox index"} +test spinbox-3.3 {SpinboxWidgetCmd procedure, "bbox" widget command} -setup { + spinboxPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e bbox a b +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e bbox index"} +test spinbox-3.4 {SpinboxWidgetCmd procedure, "bbox" widget command} -setup { + spinboxPlus .e + pack .e + update +} -body { + .e bbox bogus +} -cleanup { + destroy .e +} -returnCodes error -result {bad spinbox index "bogus"} +test spinbox-3.5 {SpinboxWidgetCmd procedure, "bbox" widget command} -setup { + spinboxPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e bbox 0 +} -cleanup { + destroy .e +} -result [list 5 5 0 $cy] + +# Oryginaly the result was count using measurements +# and metrics. It was changed to less verbose solution - the result is the one +# that passes fonts constraint (this concerns tests 3.6, 3.7, 3.8, 3.10) +test spinbox-3.6 {SpinboxWidgetCmd procedure, "bbox" widget command} -constraints { + fonts +} -setup { + spinboxPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { +# Tcl_UtfAtIndex(): no utf chars + .e insert 0 "abc" + list [.e bbox 3] [.e bbox end] +} -cleanup { + destroy .e +} -result {{19 5 7 13} {19 5 7 13}} +test spinbox-3.7 {SpinboxWidgetCmd procedure, "bbox" widget command} -constraints { + fonts +} -setup { + spinboxPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { +# Tcl_UtfAtIndex(): utf at end + .e insert 0 "ab\u4e4e" + .e bbox end +} -cleanup { + destroy .e +} -result {19 5 12 13} +test spinbox-3.8 {SpinboxWidgetCmd procedure, "bbox" widget command} -constraints { + fonts +} -setup { + spinboxPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { +# Tcl_UtfAtIndex(): utf before index + .e insert 0 "ab\u4e4ec" + .e bbox 3 +} -cleanup { + destroy .e +} -result {31 5 7 13} +test spinbox-3.9 {SpinboxWidgetCmd procedure, "bbox" widget command} -setup { + spinboxPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { +# Tcl_UtfAtIndex(): no chars + .e bbox end +} -cleanup { + destroy .e +} -result "5 5 0 $cy" +test spinbox-3.10 {SpinboxWidgetCmd procedure, "bbox" widget command} -constraints { + fonts +} -setup { + spinboxPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e insert 0 "abcdefghij\u4e4eklmnop" + list [.e bbox 0] [.e bbox 1] [.e bbox 10] [.e bbox end] +} -cleanup { + destroy .e +} -result {{5 5 7 13} {12 5 7 13} {75 5 12 13} {122 5 7 13}} +test spinbox-3.11 {SpinboxWidgetCmd procedure, "cget" widget command} -setup { + spinboxPlus .e +} -body { + .e cget +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e cget option"} +test spinbox-3.12 {SpinboxWidgetCmd procedure, "cget" widget command} -setup { + spinboxPlus .e +} -body { + .e cget a b +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e cget option"} +test spinbox-3.13 {SpinboxWidgetCmd procedure, "cget" widget command} -setup { + spinboxPlus .e +} -body { + .e cget -gorp +} -cleanup { + destroy .e +} -returnCodes error -result {unknown option "-gorp"} +test spinbox-3.14 {SpinboxWidgetCmd procedure, "cget" widget command} -setup { + spinboxPlus .e +} -body { + .e configure -bd 4 + .e cget -bd +} -cleanup { + destroy .e +} -result {4} +test spinbox-3.15.spinbox {SpinboxWidgetCmd procedure, "configure" widget command} -constraints { + spinboxResultDifferent +} -setup { + spinboxPlus .e + pack .e + update +} -body { + llength [.e configure] +} -cleanup { + destroy .e +} -result {49} +test spinbox-3.15 {SpinboxWidgetCmd procedure, "configure" widget command} -setup { + spinboxPlus .e + pack .e + update +} -body { + llength [.e configure] +} -cleanup { + destroy .e +} -result {52} +test spinbox-3.16 {SpinboxWidgetCmd procedure, "configure" widget command} -setup { + spinboxPlus .e +} -body { + .e configure -foo +} -cleanup { + destroy .e +} -returnCodes error -result {unknown option "-foo"} +test spinbox-3.17 {SpinboxWidgetCmd procedure, "configure" widget command} -setup { + spinboxPlus .e +} -body { + .e configure -bd 4 + .e configure -bg #ffffff + lindex [.e configure -bd] 4 +} -cleanup { + destroy .e +} -result {4} +test spinbox-3.18 {SpinboxWidgetCmd procedure, "delete" widget command} -setup { + spinboxPlus .e +} -body { + .e delete +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e delete firstIndex ?lastIndex?"} +test spinbox-3.19 {SpinboxWidgetCmd procedure, "delete" widget command} -setup { + spinboxPlus .e +} -body { + .e delete a b c +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e delete firstIndex ?lastIndex?"} +test spinbox-3.20 {SpinboxWidgetCmd procedure, "delete" widget command} -setup { + spinboxPlus .e +} -body { + .e delete foo +} -cleanup { + destroy .e +} -returnCodes error -result {bad spinbox index "foo"} +test spinbox-3.21 {SpinboxWidgetCmd procedure, "delete" widget command} -setup { + spinboxPlus .e +} -body { + .e delete 0 bar +} -cleanup { + destroy .e +} -returnCodes error -result {bad spinbox index "bar"} +test spinbox-3.22 {SpinboxWidgetCmd procedure, "delete" widget command} -setup { + spinboxPlus .e + pack .e + update +} -body { + .e insert end "01234567890" + .e delete 2 4 + .e get +} -cleanup { + destroy .e +} -result {014567890} +test spinbox-3.23 {SpinboxWidgetCmd procedure, "delete" widget command} -setup { + spinboxPlus .e +} -body { + .e insert end "01234567890" + .e delete 6 + .e get +} -cleanup { + destroy .e +} -result {0123457890} +test spinbox-3.24 {SpinboxWidgetCmd procedure, "delete" widget command} -setup { + spinboxPlus .e + pack .e + update + set x {} +} -body { +# UTF + .e insert end "01234\u4e4e67890" + .e delete 6 + lappend x [.e get] + .e delete 0 end + .e insert end "012345\u4e4e7890" + .e delete 6 + lappend x [.e get] + .e delete 0 end + .e insert end "0123456\u4e4e890" + .e delete 6 + lappend x [.e get] +} -cleanup { + destroy .e +} -result [list "01234\u4e4e7890" "0123457890" "012345\u4e4e890"] +test spinbox-3.25 {SpinboxWidgetCmd procedure, "delete" widget command} -setup { + spinboxPlus .e + pack .e + update +} -body { + .e insert end "01234567890" + .e delete 6 5 + .e get +} -cleanup { + destroy .e +} -result {01234567890} +test spinbox-3.26 {SpinboxWidgetCmd procedure, "delete" widget command} -setup { + spinboxPlus .e + pack .e + update +} -body { + .e insert end "01234567890" + .e configure -state disabled + .e delete 2 8 + .e configure -state normal + .e get +} -cleanup { + destroy .e +} -result {01234567890} +test spinbox-3.26.1 {SpinboxWidgetCmd procedure, "delete" widget command} -setup { + spinboxPlus .e + pack .e + update +} -body { + .e insert end "01234567890" + .e configure -state readonly + .e delete 2 8 + .e configure -state normal + .e get +} -cleanup { + destroy .e +} -result {01234567890} +test spinbox-3.27 {SpinboxWidgetCmd procedure, "get" widget command} -setup { + spinboxPlus .e +} -body { + .e get foo +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e get"} +test spinbox-3.28 {SpinboxWidgetCmd procedure, "icursor" widget command} -setup { + spinboxPlus .e +} -body { + .e icursor +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e icursor pos"} +test spinbox-3.29 {SpinboxWidgetCmd procedure, "icursor" widget command} -setup { + spinboxPlus .e +} -body { + .e icursor foo +} -cleanup { + destroy .e +} -returnCodes error -result {bad spinbox index "foo"} +test spinbox-3.30 {SpinboxWidgetCmd procedure, "icursor" widget command} -setup { + spinboxPlus .e +} -body { + .e insert end "01234567890" + .e icursor 4 + .e index insert +} -cleanup { + destroy .e +} -result {4} +test spinbox-3.31 {SpinboxWidgetCmd procedure, "index" widget command} -setup { + spinboxPlus .e +} -body { + .e in +} -cleanup { + destroy .e +} -returnCodes error -result {ambiguous option "in": must be bbox, cget, configure, delete, get, icursor, identify, index, insert, invoke, scan, selection, set, validate, or xview} +test spinbox-3.32 {SpinboxWidgetCmd procedure, "index" widget command} -setup { + spinboxPlus .e +} -body { + .e index +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e index string"} +test spinbox-3.33 {SpinboxWidgetCmd procedure, "index" widget command} -setup { + spinboxPlus .e +} -body { + .e index foo +} -cleanup { + destroy .e +} -returnCodes error -result {bad spinbox index "foo"} +test spinbox-3.34 {SpinboxWidgetCmd procedure, "index" widget command} -setup { + spinboxPlus .e + pack .e + update +} -body { + .e index 0 +} -cleanup { + destroy .e +} -returnCodes {ok} -match glob -result {*} +test spinbox-3.35 {SpinboxWidgetCmd procedure, "index" widget command} -setup { + spinboxPlus .e + pack .e + update +} -body { +# UTF + .e insert 0 abc\u4e4e\u0153def + list [.e index 3] [.e index 4] [.e index end] +} -cleanup { + destroy .e +} -result {3 4 8} +test spinbox-3.36 {SpinboxWidgetCmd procedure, "insert" widget command} -setup { + spinboxPlus .e +} -body { + .e insert a +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e insert index text"} +test spinbox-3.37 {SpinboxWidgetCmd procedure, "insert" widget command} -setup { + spinboxPlus .e +} -body { + .e insert a b c +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e insert index text"} +test spinbox-3.38 {SpinboxWidgetCmd procedure, "insert" widget command} -setup { + spinboxPlus .e +} -body { + .e insert foo Text +} -cleanup { + destroy .e +} -returnCodes error -result {bad spinbox index "foo"} +test spinbox-3.39 {SpinboxWidgetCmd procedure, "insert" widget command} -setup { + spinboxPlus .e + pack .e + update +} -body { + .e insert end "01234567890" + .e insert 3 xxx + .e get +} -cleanup { + destroy .e +} -result {012xxx34567890} +test spinbox-3.40 {SpinboxWidgetCmd procedure, "insert" widget command} -setup { + spinboxPlus .e + pack .e + update +} -body { + .e insert end "01234567890" + .e configure -state disabled + .e insert 3 xxx + .e configure -state normal + .e get +} -cleanup { + destroy .e +} -result {01234567890} +test spinbox-3.40.1 {SpinboxWidgetCmd procedure, "insert" widget command} -setup { + spinboxPlus .e + pack .e + update +} -body { + .e insert end "01234567890" + .e configure -state readonly + .e insert 3 xxx + .e configure -state normal + .e get +} -cleanup { + destroy .e +} -result {01234567890} +test spinbox-3.41 {SpinboxWidgetCmd procedure, "insert" widget command} -setup { + spinboxPlus .e +} -body { + .e insert a b c +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e insert index text"} +test spinbox-3.42 {SpinboxWidgetCmd procedure, "scan" widget command} -setup { + spinboxPlus .e + pack .e + update +} -body { + .e scan a +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e scan mark|dragto x"} +test spinbox-3.43 {SpinboxWidgetCmd procedure, "scan" widget command} -setup { + spinboxPlus .e + pack .e + update +} -body { + .e scan a b c +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e scan mark|dragto x"} +test spinbox-3.44 {SpinboxWidgetCmd procedure, "scan" widget command} -setup { + spinboxPlus .e + pack .e + update +} -body { + .e scan foobar 20 +} -cleanup { + destroy .e +} -returnCodes error -result {bad scan option "foobar": must be mark or dragto} +test spinbox-3.45 {SpinboxWidgetCmd procedure, "scan" widget command} -setup { + spinboxPlus .e + pack .e + update +} -body { + .e scan mark 20.1 +} -cleanup { + destroy .e +} -returnCodes error -result {expected integer but got "20.1"} + +# This test is non-portable because character sizes vary. +test spinbox-3.46 {SpinboxWidgetCmd procedure, "scan" widget command} -constraints { + fonts +} -setup { + spinboxPlus .e -font {Helvetica -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e insert end "This is quite a long string, in fact a " + .e insert end "very very long string" + .e scan mark 30 + .e scan dragto 28 + .e index @0 +} -cleanup { + destroy .e +} -result {2} +test spinbox-3.47.spinbox {SpinboxWidgetCmd procedure, "select" widget command} -constraints { + spinboxErrorMsgDifferent +} -setup { + spinboxPlus .e +} -body { + .e select +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e selection option ?index?"} +test spinbox-3.47 {SpinboxWidgetCmd procedure, "select" widget command} -setup { + spinboxPlus .e +} -body { + .e select +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e select option ?index?"} +test spinbox-3.48 {SpinboxWidgetCmd procedure, "select" widget command} -setup { + spinboxPlus .e +} -body { + .e select foo +} -cleanup { + destroy .e +} -returnCodes error -result {bad selection option "foo": must be adjust, clear, element, from, present, range, or to} + +test spinbox-3.49.spinbox {SpinboxWidgetCmd procedure, "select clear" widget command} -constraints { + spinboxErrorMsgDifferent +} -setup { + spinboxPlus .e +} -body { + .e select clear gorp +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e selection clear"} +test spinbox-3.49 {SpinboxWidgetCmd procedure, "select clear" widget command} -setup { + spinboxPlus .e +} -body { + .e select clear gorp +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e select clear"} +test spinbox-3.50 {SpinboxWidgetCmd procedure, "select clear" widget command} -setup { + spinboxPlus .e +} -body { + .e insert end "0123456789" + .e select from 1 + .e select to 4 + update + .e select clear + selection get +} -cleanup { + destroy .e +} -returnCodes error -result {PRIMARY selection doesn't exist or form "STRING" not defined} +test spinbox-3.50.1 {SpinboxWidgetCmd procedure, "select clear" widget command} -setup { + spinboxPlus .e + pack .e + update +} -body { + .e insert end "0123456789" + .e select from 1 + .e select to 4 + update + .e select clear + catch {selection get} + selection own +} -cleanup { + destroy .e +} -result {.e} + +test spinbox-3.51 {SpinboxWidgetCmd procedure, "selection present" widget command} -setup { + spinboxPlus .e +} -body { + .e selection present foo +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e selection present"} +test spinbox-3.52 {SpinboxWidgetCmd procedure, "selection present" widget command} -setup { + spinboxPlus .e + pack .e + update +} -body { + .e insert end 0123456789 + .e select from 3 + .e select to 6 + .e selection present +} -cleanup { + destroy .e +} -result {1} +test spinbox-3.53 {SpinboxWidgetCmd procedure, "selection present" widget command} -setup { + spinboxPlus .e + pack .e + update +} -body { + .e insert end 0123456789 + .e select from 3 + .e select to 6 + .e configure -exportselection false + .e selection present +} -cleanup { + destroy .e +} -result {1} +test spinbox-3.54 {SpinboxWidgetCmd procedure, "selection present" widget command} -setup { + spinboxPlus .e + pack .e + update +} -body { + .e insert end 0123456789 + .e select from 3 + .e select to 6 + .e delete 0 end + .e selection present +} -cleanup { + destroy .e +} -result {0} +test spinbox-3.55 {SpinboxWidgetCmd procedure, "selection adjust" widget command} -setup { + spinboxPlus .e +} -body { + .e select adjust x +} -cleanup { + destroy .e +} -returnCodes error -result {bad spinbox index "x"} +test spinbox-3.56.spinbox {SpinboxWidgetCmd procedure, "selection adjust" widget command} -constraints { + spinboxErrorMsgDifferent +} -setup { + spinboxPlus .e +} -body { + .e select adjust 2 3 +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e selection adjust index"} +test spinbox-3.56 {SpinboxWidgetCmd procedure, "selection adjust" widget command} -setup { + spinboxPlus .e +} -body { + .e select adjust 2 3 +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e select adjust index"} +test spinbox-3.57 {SpinboxWidgetCmd procedure, "selection adjust" widget command} -setup { + spinboxPlus .e + pack .e + update +} -body { + .e insert end "0123456789" + .e select from 1 + .e select to 5 + update + .e select adjust 4 + selection get +} -cleanup { + destroy .e +} -result {123} +test spinbox-3.58 {SpinboxWidgetCmd procedure, "selection adjust" widget command} -setup { + spinboxPlus .e + pack .e + update +} -body { + .e insert end "0123456789" + .e select from 1 + .e select to 5 + update + .e select adjust 2 + selection get +} -cleanup { + destroy .e +} -result {234} +test spinbox-3.59.spinbox {SpinboxWidgetCmd procedure, "selection from" widget command} -constraints { + spinboxErrorMsgDifferent +} -setup { + spinboxPlus .e +} -body { + .e select from 2 3 +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e selection from index"} +test spinbox-3.59 {SpinboxWidgetCmd procedure, "selection from" widget command} -setup { + spinboxPlus .e +} -body { + .e select from 2 3 +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e select from index"} + +test spinbox-3.60.spinbox {SpinboxWidgetCmd procedure, "selection range" widget command} -constraints { + spinboxErrorMsgDifferent +} -setup { + spinboxPlus .e +} -body { + .e select range 2 +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e selection range start end"} +test spinbox-3.60 {SpinboxWidgetCmd procedure, "selection range" widget command} -setup { + spinboxPlus .e +} -body { + .e select range 2 +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e select range start end"} +test spinbox-3.61 {SpinboxWidgetCmd procedure, "selection range" widget command} -setup { + spinboxPlus .e +} -body { + .e selection range 2 3 4 +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e selection range start end"} +test spinbox-3.62 {SpinboxWidgetCmd procedure, "selection range" widget command} -setup { + spinboxPlus .e +} -body { + .e insert end 0123456789 + .e select from 1 + .e select to 5 + .e select range 4 4 + .e index sel.first +} -cleanup { + destroy .e +} -returnCodes error -result {selection isn't in widget .e} +test spinbox-3.63 {SpinboxWidgetCmd procedure, "selection range" widget command} -setup { + spinboxPlus .e + pack .e + update +} -body { + .e insert end 0123456789 + .e select from 3 + .e select to 7 + .e select range 2 9 + list [.e index sel.first] [.e index sel.last] [.e index anchor] +} -cleanup { + destroy .e +} -result {2 9 3} +test spinbox-3.64.spinbox {SpinboxWidgetCmd procedure, "selection to" widget command} -constraints { + spinboxErrorMsgDifferent +} -setup { + spinboxPlus .e + pack .e + update + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." +} -body { + .e select to 2 3 +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e selection to index"} +test spinbox-3.64 {SpinboxWidgetCmd procedure, "selection to" widget command} -setup { + spinboxPlus .e + pack .e + update + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." +} -body { + .e select to 2 3 +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e select to index"} +test spinbox-3.64.1 {SpinboxWidgetCmd procedure, "selection" widget command} -setup { + spinboxPlus .e + pack .e + update +} -body { + .e insert end 0123456789 + .e selection range 0 end + .e configure -state disabled + .e selection range 2 4 + .e configure -state normal + list [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {0 10} +test spinbox-3.64.2 {SpinboxWidgetCmd procedure, "selection" widget command} -setup { + spinboxPlus .e + pack .e + update +} -body { + .e insert end 0123456789 + .e selection range 0 end + .e configure -state readonly + .e selection range 2 4 + .e configure -state normal + list [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {2 4} + +test spinbox-3.65 {SpinboxWidgetCmd procedure, "xview" widget command} -setup { + spinboxPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + .e xview 5 + format {%.6f %.6f} {*}[.e xview] +} -cleanup { + destroy .e +} -result {0.053763 0.268817} +test spinbox-3.66 {SpinboxWidgetCmd procedure, "xview" widget command} -setup { + spinboxPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e xview gorp +} -cleanup { + destroy .e +} -returnCodes error -result {bad spinbox index "gorp"} +test spinbox-3.67 {SpinboxWidgetCmd procedure, "xview" widget command} -setup { + spinboxPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + .e xview 0 + .e icursor 10 + .e xview insert + format {%.6f %.6f} {*}[.e xview] +} -cleanup { + destroy .e +} -result {0.107527 0.322581} +test spinbox-3.68 {SpinboxWidgetCmd procedure, "xview" widget command} -setup { + spinboxPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e xview moveto foo bar +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e xview moveto fraction"} +test spinbox-3.69 {SpinboxWidgetCmd procedure, "xview" widget command} -setup { + spinboxPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e xview moveto foo +} -cleanup { + destroy .e +} -returnCodes error -result {expected floating-point number but got "foo"} +test spinbox-3.70 {SpinboxWidgetCmd procedure, "xview" widget command} -setup { + spinboxPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + .e xview moveto 0.5 + format {%.6f %.6f} {*}[.e xview] +} -cleanup { + destroy .e +} -result {0.505376 0.720430} +test spinbox-3.71 {SpinboxWidgetCmd procedure, "xview" widget command} -setup { + spinboxPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + .e xview scroll 24 +} -cleanup { + destroy .e +} -returnCodes error -result {wrong # args: should be ".e xview scroll number units|pages"} +test spinbox-3.72 {SpinboxWidgetCmd procedure, "xview" widget command} -setup { + spinboxPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + update + .e xview scroll gorp units +} -cleanup { + destroy .e +} -returnCodes error -result {expected integer but got "gorp"} +test spinbox-3.73 {SpinboxWidgetCmd procedure, "xview" widget command} -setup { + spinboxPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + update + .e xview moveto 0 + .e xview scroll 1 pages + format {%.6f %.6f} {*}[.e xview] +} -cleanup { + destroy .e +} -result {0.193548 0.408602} +test spinbox-3.74 {SpinboxWidgetCmd procedure, "xview" widget command} -setup { + spinboxPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + .e xview moveto .9 + update + .e xview scroll -2 p + format {%.6f %.6f} {*}[.e xview] +} -cleanup { + destroy .e +} -result {0.397849 0.612903} +test spinbox-3.75 {SpinboxWidgetCmd procedure, "xview" widget command} -setup { + spinboxPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + update + .e xview 30 + update + .e xview scroll 2 units + .e index @0 +} -cleanup { + destroy .e +} -result {32} +test spinbox-3.76 {SpinboxWidgetCmd procedure, "xview" widget command} -setup { + spinboxPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + update + .e xview 30 + update + .e xview scroll -1 units + .e index @0 +} -cleanup { + destroy .e +} -result {29} +test spinbox-3.77 {SpinboxWidgetCmd procedure, "xview" widget command} -setup { + spinboxPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + update + .e xview scroll 23 foobars +} -cleanup { + destroy .e +} -returnCodes error -result {bad argument "foobars": must be units or pages} +test spinbox-3.78 {SpinboxWidgetCmd procedure, "xview" widget command} -setup { + spinboxPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + update + .e xview eat 23 hamburgers +} -cleanup { + destroy .e +} -returnCodes error -result {unknown option "eat": must be moveto or scroll} +test spinbox-3.79 {SpinboxWidgetCmd procedure, "xview" widget command} -setup { + spinboxPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + .e xview 0 + update + .e xview -4 + .e index @0 +} -cleanup { + destroy .e +} -result {0} +test spinbox-3.80 {SpinboxWidgetCmd procedure, "xview" widget command} -setup { + spinboxPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + update + .e xview 300 + .e index @0 +} -cleanup { + destroy .e +} -result {73} +test spinbox-3.81 {SpinboxWidgetCmd procedure, "xview" widget command} -setup { + spinboxPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e +} -body { + .e insert end "This is quite a long text string, so long that it " + .e insert end "runs off the end of the window quite a bit." + .e insert 10 \u4e4e + update +# UTF +# If Tcl_NumUtfChars wasn't used, wrong answer would be: +# 0.106383 0.117021 0.117021 + set x {} + .e xview moveto .1 + lappend x [format {%.6f} [lindex [.e xview] 0]] + .e xview moveto .11 + lappend x [format {%.6f} [lindex [.e xview] 0]] + .e xview moveto .12 + lappend x [format {%.6f} [lindex [.e xview] 0]] +} -cleanup { + destroy .e +} -result {0.095745 0.106383 0.117021} + +test spinbox-3.82 {SpinboxWidgetCmd procedure} -setup { + spinboxPlus .e -font {Courier -12} -borderwidth 2 -highlightthickness 2 + pack .e + update +} -body { + .e gorp +} -cleanup { + destroy .e +} -returnCodes error -result {bad option "gorp": must be bbox, cget, configure, delete, get, icursor, identify, index, insert, invoke, scan, selection, set, validate, or xview} + +test spinbox-5.1 {ConfigureSpinbox procedure, -textvariable} -body { + set x 12345 + spinboxPlus .e -textvariable x + .e get +} -cleanup { + destroy .e +} -result {12345} +test spinbox-5.2 {ConfigureSpinbox procedure, -textvariable} -body { + set x 12345 + spinboxPlus .e -textvariable x + set y abcde + .e configure -textvariable y + set x 54321 + .e get +} -cleanup { + destroy .e +} -result {abcde} +test spinbox-5.3 {ConfigureSpinbox procedure, -textvariable} -setup { + unset -nocomplain x + spinboxPlus .e +} -body { + .e insert 0 "Some text" + .e configure -textvariable x + set x +} -cleanup { + destroy .e +} -result {Some text} +test spinbox-5.4 {ConfigureSpinbox procedure, -textvariable} -setup { + unset -nocomplain x + spinboxPlus .e +} -body { + trace variable x w override + .e insert 0 "Some text" + .e configure -textvariable x + list $x [.e get] +} -cleanup { + destroy .e + trace vdelete x w override +} -result {12345 12345} + +test spinbox-5.5 {ConfigureSpinbox procedure} -setup { + set x {} + spinboxPlus .e1 + spinboxPlus .e2 +} -body { + .e2 insert end "This is some sample text" + .e1 configure -exportselection false + .e1 insert end "0123456789" + pack .e1 .e2 + .e2 select from 0 + .e2 select to 10 + lappend x [selection get] + .e1 select from 1 + .e1 select to 5 + lappend x [selection get] + .e1 configure -exportselection 1 + lappend x [selection get] + set x +} -cleanup { + destroy .e1 .e2 +} -result {{This is so} {This is so} 1234} +test spinbox-5.6 {ConfigureSpinbox procedure} -setup { + spinboxPlus .e + pack .e +} -body { + .e insert end "0123456789" + .e select from 1 + .e select to 5 + .e configure -exportselection 0 + selection get +} -cleanup { + destroy .e +} -returnCodes error -result {PRIMARY selection doesn't exist or form "STRING" not defined} +test spinbox-5.6.1 {ConfigureSpinbox procedure} -setup { + spinboxPlus .e + pack .e +} -body { + .e insert end "0123456789" + .e select from 1 + .e select to 5 + .e configure -exportselection 0 + catch {selection get} + list [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {1 5} + +test spinbox-5.7 {ConfigureSpinbox procedure} -setup { + spinboxPlus .e -font {Helvetica -12} -borderwidth 2 -highlightthickness 2 + pack .e +} -body { + .e configure -font {Courier -12} -width 4 -xscrollcommand scroll + .e insert end "01234567890" + update + .e configure -width 5 + format {%.6f %.6f} {*}$scrollInfo +} -cleanup { + destroy .e +} -result {0.000000 0.363636} + +test spinbox-5.8 {ConfigureSpinbox procedure} -constraints { + fonts +} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 + pack .e +} -body { + .e configure -width 0 -font {Helvetica -12} + .e insert end "0123" + update + .e configure -font {Helvetica -24} + update + winfo geom .e +} -cleanup { + destroy .e +} -result {79x37+0+0} +test spinbox-5.9 {ConfigureSpinbox procedure} -constraints { + fonts +} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 + pack .e +} -body { + .e configure -font {Courier -12} -bd 2 -relief raised + .e insert end "0123" + update + list [.e index @10] [.e index @11] [.e index @12] [.e index @13] +} -cleanup { + destroy .e +} -result {0 0 1 1} +test spinbox-5.10 {ConfigureSpinbox procedure} -constraints { + fonts +} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 + pack .e +} -body { + .e configure -font {Courier -12} -bd 2 -relief flat + .e insert end "0123" + update + list [.e index @10] [.e index @11] [.e index @12] [.e index @13] +} -cleanup { + destroy .e +} -result {0 0 1 1} +test spinbox-5.11 {ConfigureSpinbox procedure} -setup { + spinboxPlus .e -borderwidth 2 -highlightthickness 2 + pack .e +} -body { +# If "0" in selected font had 0 width, caused divide-by-zero error. + .e configure -font {{open look glyph}} + .e scan dragto 30 + update +} -cleanup { + destroy .e +} -result {} + +# No tests for DisplaySpinbox. + +test spinbox-6.1 {SpinboxComputeGeometry procedure} -constraints { + fonts +} -setup { + spinboxPlus .e + pack .e +} -body { + .e configure -font {Courier -12} -bd 2 -relief raised -width 20 -highlightthickness 3 + .e insert end 012\t45 + update + list [.e index @61] [.e index @62] +} -cleanup { + destroy .e +} -result {3 4} +test spinbox-6.2 {SpinboxComputeGeometry procedure} -constraints { + fonts +} -setup { + spinboxPlus .e + pack .e +} -body { + .e configure -font {Courier -12} -bd 2 -relief raised -width 20 -justify center \ + -highlightthickness 3 + .e insert end 012\t45 + update + list [.e index @96] [.e index @97] +} -cleanup { + destroy .e +} -result {3 4} +test spinbox-6.3 {SpinboxComputeGeometry procedure} -constraints { + fonts +} -setup { + spinboxPlus .e + pack .e +} -body { + .e configure -font {Courier -12} -bd 2 -relief raised -width 20 -justify right \ + -highlightthickness 3 + .e insert end 012\t45 + update + list [.e index @131] [.e index @132] +} -cleanup { + destroy .e +} -result {3 4} +test spinbox-6.4 {SpinboxComputeGeometry procedure} -setup { + spinboxPlus .e + pack .e +} -body { + .e configure -font {Courier -12} -bd 2 -relief raised -width 5 + .e insert end "01234567890" + update + .e xview 6 + .e index @0 +} -cleanup { + destroy .e +} -result {6} +test spinbox-6.5 {SpinboxComputeGeometry procedure} -setup { + spinboxPlus .e -highlightthickness 2 + pack .e +} -body { + .e configure -font {Courier -12} -bd 2 -relief raised -width 5 + .e insert end "01234567890" + update + .e xview 7 + .e index @0 +} -cleanup { + destroy .e +} -result {6} +test spinbox-6.6 {SpinboxComputeGeometry procedure} -constraints { + fonts +} -setup { + spinboxPlus .e -highlightthickness 2 + pack .e +} -body { + .e configure -font {Courier -12} -bd 2 -relief raised -width 10 + .e insert end "01234\t67890" + update + .e xview 3 + list [.e index @39] [.e index @40] +} -cleanup { + destroy .e +} -result {5 6} +test spinbox-6.7 {SpinboxComputeGeometry procedure} -constraints { + fonts +} -setup { + spinboxPlus .e -highlightthickness 2 + pack .e +} -body { + .e configure -font {Helvetica -24} -bd 3 -relief raised -width 5 + .e insert end "01234567" + update + list [winfo reqwidth .e] [winfo reqheight .e] +} -cleanup { + destroy .e +} -result {94 39} +test spinbox-6.8 {SpinboxComputeGeometry procedure} -constraints { + fonts +} -setup { + spinboxPlus .e -highlightthickness 2 + pack .e +} -body { + .e configure -font {Helvetica -24} -bd 3 -relief raised -width 0 + .e insert end "01234567" + update + list [winfo reqwidth .e] [winfo reqheight .e] +} -cleanup { + destroy .e +} -result {133 39} +test spinbox-6.9 {SpinboxComputeGeometry procedure} -constraints { + fonts +} -setup { + spinboxPlus .e -highlightthickness 2 + pack .e +} -body { + .e configure -font {Helvetica -24} -bd 3 -relief raised -width 0 + update + list [winfo reqwidth .e] [winfo reqheight .e] +} -cleanup { + destroy .e +} -result {42 39} + + +test spinbox-7.1 {InsertChars procedure} -setup { + unset -nocomplain contents + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e configure -textvariable contents -xscrollcommand scroll + .e insert 0 abcde + .e insert 2 XXX + update + list [.e get] $contents [format {%.6f %.6f} {*}$scrollInfo] +} -cleanup { + destroy .e +} -result {abXXXcde abXXXcde {0.000000 1.000000}} + +test spinbox-7.2 {InsertChars procedure} -setup { + unset -nocomplain contents + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e configure -textvariable contents -xscrollcommand scroll + .e insert 0 abcde + .e insert 500 XXX + update + list [.e get] $contents [format {%.6f %.6f} {*}$scrollInfo] +} -cleanup { + destroy .e +} -result {abcdeXXX abcdeXXX {0.000000 1.000000}} +test spinbox-7.3 {InsertChars procedure} -setup { + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e +} -body { + .e insert 0 0123456789 + .e select from 2 + .e select to 6 + .e insert 2 XXX + set x "[.e index sel.first] [.e index sel.last]" + .e select to 8 + lappend x [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {5 9 5 8} +test spinbox-7.4 {InsertChars procedure} -setup { + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e +} -body { + .e insert 0 0123456789 + .e select from 2 + .e select to 6 + .e insert 3 XXX + set x "[.e index sel.first] [.e index sel.last]" + .e select to 8 + lappend x [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {2 9 2 8} +test spinbox-7.5 {InsertChars procedure} -setup { + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e +} -body { + .e insert 0 0123456789 + .e select from 2 + .e select to 6 + .e insert 5 XXX + set x "[.e index sel.first] [.e index sel.last]" + .e select to 8 + lappend x [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {2 9 2 8} +test spinbox-7.6 {InsertChars procedure} -setup { + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e +} -body { + .e insert 0 0123456789 + .e select from 2 + .e select to 6 + .e insert 6 XXX + set x "[.e index sel.first] [.e index sel.last]" + .e select to 5 + lappend x [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {2 6 2 5} +test spinbox-7.7 {InsertChars procedure} -setup { + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e +} -body { + .e configure -xscrollcommand scroll + .e insert 0 0123456789 + .e icursor 4 + .e insert 4 XXX + .e index insert +} -cleanup { + destroy .e +} -result {7} +test spinbox-7.8 {InsertChars procedure} -setup { + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e +} -body { + .e insert 0 0123456789 + .e icursor 4 + .e insert 5 XXX + .e index insert +} -cleanup { + destroy .e +} -result {4} +test spinbox-7.9 {InsertChars procedure} -setup { + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e +} -body { + .e insert 0 "This is a very long string" + update + .e xview 4 + .e insert 3 XXX + .e index @0 +} -cleanup { + destroy .e +} -result {7} +test spinbox-7.10 {InsertChars procedure} -setup { + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e +} -body { + .e insert 0 "This is a very long string" + update + .e xview 4 + .e insert 4 XXX + .e index @0 +} -cleanup { + destroy .e +} -result {4} + +test spinbox-7.11 {InsertChars procedure} -constraints { + fonts +} -setup { + spinboxPlus .e -width 0 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e +} -body { + .e insert 0 "xyzzy" + update + .e insert 2 00 + winfo reqwidth .e +} -cleanup { + destroy .e +} -result {70} + +test spinbox-8.1 {DeleteChars procedure} -setup { + unset -nocomplain contents + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e configure -textvariable contents -xscrollcommand scroll + .e insert 0 abcde + .e delete 2 4 + update + list [.e get] $contents [format {%.6f %.6f} {*}$scrollInfo] +} -cleanup { + destroy .e +} -result {abe abe {0.000000 1.000000}} +test spinbox-8.2 {DeleteChars procedure} -setup { + unset -nocomplain contents + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e configure -textvariable contents -xscrollcommand scroll + .e insert 0 abcde + .e delete -2 2 + update + list [.e get] $contents [format {%.6f %.6f} {*}$scrollInfo] +} -cleanup { + destroy .e +} -result {cde cde {0.000000 1.000000}} +test spinbox-8.3 {DeleteChars procedure} -setup { + unset -nocomplain contents + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e configure -textvariable contents -xscrollcommand scroll + .e insert 0 abcde + .e delete 3 1000 + update + list [.e get] $contents [format {%.6f %.6f} {*}$scrollInfo] +} -cleanup { + destroy .e +} -result {abc abc {0.000000 1.000000}} +test spinbox-8.4 {DeleteChars procedure} -setup { + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 0123456789abcde + .e select from 3 + .e select to 8 + .e delete 1 3 + update + set x "[.e index sel.first] [.e index sel.last]" + .e select to 5 + lappend x [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {1 6 1 5} +test spinbox-8.5 {DeleteChars procedure} -setup { + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 0123456789abcde + .e select from 3 + .e select to 8 + .e delete 1 4 + update + set x "[.e index sel.first] [.e index sel.last]" + .e select to 4 + lappend x [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {1 5 1 4} +test spinbox-8.6 {DeleteChars procedure} -setup { + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 0123456789abcde + .e select from 3 + .e select to 8 + .e delete 1 7 + update + set x "[.e index sel.first] [.e index sel.last]" + .e select to 5 + lappend x [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {1 2 1 5} +test spinbox-8.7 {DeleteChars procedure} -setup { + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 0123456789abcde + .e select from 3 + .e select to 8 + .e delete 1 8 + update + .e index sel.first +} -cleanup { + destroy .e +} -returnCodes error -result {selection isn't in widget .e} +test spinbox-8.8 {DeleteChars procedure} -setup { + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 0123456789abcde + .e select from 3 + .e select to 8 + .e delete 3 7 + update + set x "[.e index sel.first] [.e index sel.last]" + .e select to 8 + lappend x [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {3 4 3 8} +test spinbox-8.9 {DeleteChars procedure} -setup { + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e +} -body { + .e insert 0 0123456789abcde + .e select from 3 + .e select to 8 + .e delete 3 8 + update + .e index sel.first +} -cleanup { + destroy .e +} -returnCodes error -result {selection isn't in widget .e} +test spinbox-8.10 {DeleteChars procedure} -setup { + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 0123456789abcde + .e select from 8 + .e select to 3 + .e delete 5 8 + update + set x "[.e index sel.first] [.e index sel.last]" + .e select to 8 + lappend x [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {3 5 5 8} +test spinbox-8.11 {DeleteChars procedure} -setup { + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 0123456789abcde + .e select from 8 + .e select to 3 + .e delete 8 10 + update + set x "[.e index sel.first] [.e index sel.last]" + .e select to 4 + lappend x [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {3 8 4 8} +test spinbox-8.12 {DeleteChars procedure} -setup { + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 0123456789abcde + .e icursor 4 + .e delete 1 4 + update + .e index insert +} -cleanup { + destroy .e +} -result {1} +test spinbox-8.13 {DeleteChars procedure} -setup { + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 0123456789abcde + .e icursor 4 + .e delete 1 5 + update + .e index insert +} -cleanup { + destroy .e +} -result {1} +test spinbox-8.14 {DeleteChars procedure} -setup { + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 0123456789abcde + .e icursor 4 + .e delete 4 6 + update + .e index insert +} -cleanup { + destroy .e +} -result {4} +test spinbox-8.15 {DeleteChars procedure} -setup { + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 "This is a very long string" + .e xview 4 + .e delete 1 4 + update + .e index @0 +} -cleanup { + destroy .e +} -result {1} +test spinbox-8.16 {DeleteChars procedure} -setup { + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 "This is a very long string" + .e xview 4 + .e delete 1 5 + update + .e index @0 +} -cleanup { + destroy .e +} -result {1} +test spinbox-8.17 {DeleteChars procedure} -setup { + spinboxPlus .e -width 10 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 "This is a very long string" + .e xview 4 + .e delete 4 6 + update + .e index @0 +} -cleanup { + destroy .e +} -result {4} +test spinbox-8.18 {DeleteChars procedure} -setup { + spinboxPlus .e -width 0 -font {Courier -12} -highlightthickness 2 -bd 2 + pack .e + focus .e +} -body { + .e insert 0 "xyzzy" + update + .e delete 2 4 + winfo reqwidth .e +} -cleanup { + destroy .e +} -result {42} + +test spinbox-9.1 {SpinboxValueChanged procedure} -setup { + unset -nocomplain x +} -body { + trace variable x w override + spinboxPlus .e -textvariable x -width 0 + .e insert 0 foo + list $x [.e get] +} -cleanup { + destroy .e + trace vdelete x w override +} -result {12345 12345} + + +test spinbox-10.1 {SpinboxSetValue procedure} -constraints fonts -body { + set x abcde + set y ab + spinboxPlus .e -font {Helvetica -12} -highlightthickness 2 -bd 2 -width 0 + pack .e + .e configure -textvariable x + .e configure -textvariable y + update + list [.e get] [winfo reqwidth .e] +} -cleanup { + destroy .e +} -result {ab 35} +test spinbox-10.2 {SpinboxSetValue procedure, updating selection} -setup { + unset -nocomplain x + spinboxPlus .e -font {Helvetica -12} -highlightthickness 2 -bd 2 + pack .e +} -body { + .e configure -textvariable x + .e insert 0 "abcdefghjklmnopqrstu" + .e selection range 4 10 + set x "a" + .e index sel.first +} -cleanup { + destroy .e +} -returnCodes error -result {selection isn't in widget .e} +test spinbox-10.3 {SpinboxSetValue procedure, updating selection} -setup { + unset -nocomplain x + spinboxPlus .e -font {Helvetica -12} -highlightthickness 2 -bd 2 + pack .e +} -body { + .e configure -textvariable x + .e insert 0 "abcdefghjklmnopqrstu" + .e selection range 4 10 + set x "abcdefg" + list [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {4 7} +test spinbox-10.4 {SpinboxSetValue procedure, updating selection} -setup { + unset -nocomplain x + spinboxPlus .e -font {Helvetica -12} -highlightthickness 2 -bd 2 + pack .e +} -body { + .e configure -textvariable x + .e insert 0 "abcdefghjklmnopqrstu" + .e selection range 4 10 + set x "abcdefghijklmn" + list [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {4 10} +test spinbox-10.5 {SpinboxSetValue procedure, updating display position} -setup { + unset -nocomplain x + spinboxPlus .e -highlightthickness 2 -bd 2 + pack .e +} -body { + .e configure -width 10 -font {Courier -12} -textvariable x + .e insert 0 "abcdefghjklmnopqrstuvwxyz" + .e xview 10 + update + set x "abcdefg" + update + .e index @0 +} -cleanup { + destroy .e +} -result {0} +test spinbox-10.6 {SpinboxSetValue procedure, updating display position} -setup { + unset -nocomplain x + spinboxPlus .e -highlightthickness 2 -bd 2 + pack .e +} -body { + .e configure -width 10 -font {Courier -12} -textvariable x + pack .e + .e insert 0 "abcdefghjklmnopqrstuvwxyz" + .e xview 10 + update + set x "1234567890123456789012" + update + .e index @0 +} -cleanup { + destroy .e +} -result {10} +test spinbox-10.7 {SpinboxSetValue procedure, updating insertion cursor} -setup { + unset -nocomplain x + spinboxPlus .e -highlightthickness 2 -bd 2 + pack .e + update +} -body { + .e configure -width 10 -font {Courier -12} -textvariable x + pack .e + .e insert 0 "abcdefghjklmnopqrstuvwxyz" + .e icursor 5 + set x "123" + .e index insert +} -cleanup { + destroy .e +} -result {3} +test spinbox-10.8 {SpinboxSetValue procedure, updating insertion cursor} -setup { + unset -nocomplain x + spinboxPlus .e -highlightthickness 2 -bd 2 + pack .e +} -body { + .e configure -width 10 -font {Courier -12} -textvariable x + pack .e + .e insert 0 "abcdefghjklmnopqrstuvwxyz" + .e icursor 5 + set x "123456" + .e index insert +} -cleanup { + destroy .e +} -result {5} + +test spinbox-11.1 {SpinboxEventProc procedure} -setup { + spinboxPlus .e -highlightthickness 2 -bd 2 -font {Helvetica -12} + pack .e +} -body { + .e insert 0 abcdefg + destroy .e + update +} -cleanup { + destroy .e +} -result {} +test spinbox-11.2 {SpinboxEventProc procedure} -setup { + set x {} +} -body { + spinboxPlus .e1 -fg #112233 + rename .e1 .e2 + lappend x [winfo children .] + lappend x [.e2 cget -fg] + destroy .e1 + lappend x [info command .e*] [winfo children .] +} -cleanup { + destroy .e1 +} -result {.e1 #112233 {} {}} + +test spinbox-12.1 {SpinboxCmdDeletedProc procedure} -body { + button .b -text "xyz_123" + rename .b {} + list [info command .b*] [winfo children .] +} -cleanup { + destroy .b +} -result {{} {}} + + +test spinbox-13.1 {GetSpinboxIndex procedure} -setup { + spinboxPlus .e -font {Courier -12} -width 5 -bd 2 -relief sunken + pack .e +} -body { + .e insert 0 012345678901234567890 + .e xview 4 + update + .e index end +} -cleanup { + destroy .e +} -result {21} +test spinbox-13.2 {GetSpinboxIndex procedure} -body { + spinboxPlus .e + .e index abogus +} -cleanup { + destroy .e +} -returnCodes error -result {bad spinbox index "abogus"} +test spinbox-13.3 {GetSpinboxIndex procedure} -setup { + spinboxPlus .e -font {Courier -12} -width 5 -bd 2 -relief sunken + pack .e +} -body { + .e insert 0 012345678901234567890 + .e xview 4 + update + .e select from 1 + .e select to 6 + .e index anchor +} -cleanup { + destroy .e +} -result {1} +test spinbox-13.4 {GetSpinboxIndex procedure} -setup { + spinboxPlus .e -font {Courier -12} -width 5 -bd 2 -relief sunken + pack .e +} -body { + .e insert 0 012345678901234567890 + .e xview 4 + update + .e select from 4 + .e select to 1 + .e index anchor +} -cleanup { + destroy .e +} -result {4} +test spinbox-13.5 {GetSpinboxIndex procedure} -setup { + spinboxPlus .e -font {Courier -12} -width 5 -bd 2 -relief sunken + pack .e +} -body { + .e insert 0 012345678901234567890 + .e xview 4 + update + .e select from 3 + .e select to 15 + .e select adjust 4 + .e index anchor +} -cleanup { + destroy .e +} -result {15} +test spinbox-13.6 {GetSpinboxIndex procedure} -setup { + spinboxPlus .e +} -body { + .e index ebogus +} -cleanup { + destroy .e +} -returnCodes error -result {bad spinbox index "ebogus"} +test spinbox-13.7 {GetSpinboxIndex procedure} -setup { + spinboxPlus .e -font {Courier -12} -width 5 -bd 2 -relief sunken + pack .e +} -body { + .e insert 0 012345678901234567890 + .e xview 4 + update + .e icursor 2 + .e index insert +} -cleanup { + destroy .e +} -result {2} +test spinbox-13.8 {GetSpinboxIndex procedure} -setup { + spinboxPlus .e +} -body { + .e index ibogus +} -cleanup { + destroy .e +} -returnCodes error -result {bad spinbox index "ibogus"} +test spinbox-13.9 {GetSpinboxIndex procedure} -setup { + spinboxPlus .e -font {Courier -12} -width 5 -bd 2 -relief sunken + pack .e +} -body { + .e insert 0 012345678901234567890 + .e xview 4 + update + .e select from 1 + .e select to 6 + list [.e index sel.first] [.e index sel.last] +} -cleanup { + destroy .e +} -result {1 6} + +test spinbox-13.10 {GetSpinboxIndex procedure} -constraints unix -body { +# On unix, when selection is cleared, spinbox widget's internal +# selection range is reset. +# Previous settings: + spinboxPlus .e -font {Courier -12} -width 5 -bd 2 -relief sunken + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e select from 1 + .e select to 6 + list [.e index sel.first] [.e index sel.last] +# Testing: + selection clear .e + .e index sel.first +} -cleanup { + destroy .e +} -returnCodes error -result {selection isn't in widget .e} + +test spinbox-13.11 {GetSpinboxIndex procedure} -constraints win -body { +# On mac and pc, when selection is cleared, spinbox widget remembers +# last selected range. When selection ownership is restored to +# spinbox, the old range will be rehighlighted. +# Previous settings: + spinboxPlus .e -font {Courier -12} -width 5 -bd 2 -relief sunken + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e select from 1 + .e select to 6 + list [.e index sel.first] [.e index sel.last] +# Testing: + selection clear .e + catch {selection get} + .e index sel.first +} -cleanup { + destroy .e +} -result {1} + +test spinbox-13.12 {GetSpinboxIndex procedure} -constraints unix -body { +# Previous settings: + spinboxPlus .e -font {Courier -12} -width 5 -bd 2 -relief sunken + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e select from 1 + .e select to 6 + list [.e index sel.first] [.e index sel.last] +# Testing: + selection clear .e + .e index sbogus +} -cleanup { + destroy .e +} -returnCodes error -result {selection isn't in widget .e} + +test spinbox-13.12.1 {GetSpinboxIndex procedure} -constraints unix -body { +# Previous settings: + spinboxPlus .e -font {Courier -12} -width 5 -bd 2 -relief sunken + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e select from 1 + .e select to 6 + list [.e index sel.first] [.e index sel.last] +# Testing: + selection clear .e + .e index bogus +} -cleanup { + destroy .e +} -returnCodes error -result {bad spinbox index "bogus"} + +test spinbox-13.13 {GetSpinboxIndex procedure} -constraints win -body { +# Previous settings: + spinboxPlus .e -font {Courier -12} -width 5 -bd 2 -relief sunken + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e select from 1 + .e select to 6 + list [.e index sel.first] [.e index sel.last] +# Testing: + selection clear .e + .e index sbogus +} -cleanup { + destroy .e +} -returnCodes error -result {bad spinbox index "sbogus"} + +test spinbox-13.14 {GetSpinboxIndex procedure} -constraints win -body { +# On mac and pc, when selection is cleared, spinbox widget remembers +# last selected range. When selection ownership is restored to +# spinbox, the old range will be rehighlighted. +# Previous settings: + spinboxPlus .e -font {Courier -12} -width 5 -bd 2 -relief sunken + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e select from 1 + .e select to 6 + list [.e index sel.first] [.e index sel.last] +# Testing: + selection clear .e + selection get +} -cleanup { + destroy .e +} -returnCodes error -match glob -result {*} + +test spinbox-13.14.1 {GetSpinboxIndex procedure} -constraints win -body { +# On mac and pc, when selection is cleared, spinbox widget remembers +# last selected range. When selection ownership is restored to +# spinbox, the old range will be rehighlighted. +# Previous settings: + spinboxPlus .e -font {Courier -12} -width 5 -bd 2 -relief sunken + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e select from 1 + .e select to 6 + list [.e index sel.first] [.e index sel.last] +# Testing: + selection clear .e + catch {selection get} + .e index sbogus +} -cleanup { + destroy .e +} -returnCodes error -match glob -result {*} + +test spinbox-13.15 {GetSpinboxIndex procedure} -body { + spinboxPlus .e + selection clear .e + .e index @xyz +} -cleanup { + destroy .e +} -returnCodes error -result {bad spinbox index "@xyz"} + +test spinbox-13.16 {GetSpinboxIndex procedure} -constraints fonts -body { + spinboxPlus .e -width 5 -relief sunken -highlightthickness 2 -bd 2 \ + -font {Courier -12} + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e index @4 +} -cleanup { + destroy .e +} -result {4} +test spinbox-13.17 {GetSpinboxIndex procedure} -constraints fonts -body { + spinboxPlus .e -width 5 -relief sunken -highlightthickness 2 -bd 2 \ + -font {Courier -12} + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e index @11 +} -cleanup { + destroy .e +} -result {4} +test spinbox-13.18 {GetSpinboxIndex procedure} -constraints fonts -body { + spinboxPlus .e -width 5 -relief sunken -highlightthickness 2 -bd 2 \ + -font {Courier -12} + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e index @12 +} -cleanup { + destroy .e +} -result {5} +test spinbox-13.19 {GetSpinboxIndex procedure} -constraints fonts -body { + spinboxPlus .e -width 5 -relief sunken -highlightthickness 2 -bd 2 \ + -font {Courier -12} + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e index @[expr {[winfo width .e] - 6-11}] +} -cleanup { + destroy .e +} -result {8} +test spinbox-13.20 {GetSpinboxIndex procedure} -constraints fonts -body { + spinboxPlus .e -width 5 -relief sunken -highlightthickness 2 -bd 2 \ + -font {Courier -12} + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e index @[expr {[winfo width .e] - 5}] +} -cleanup { + destroy .e +} -result {9} +test spinbox-13.21 {GetSpinboxIndex procedure} -body { + spinboxPlus .e -width 5 -relief sunken -highlightthickness 2 -bd 2 \ + -font {Courier -12} + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e index @1000 +} -cleanup { + destroy .e +} -result {9} +test spinbox-13.22 {GetSpinboxIndex procedure} -setup { + spinboxPlus .e + pack .e + update +} -body { + .e index 1xyz +} -cleanup { + destroy .e +} -returnCodes error -result {bad spinbox index "1xyz"} +test spinbox-13.23 {GetSpinboxIndex procedure} -body { + spinboxPlus .e -width 5 -relief sunken -highlightthickness 2 -bd 2 \ + -font {Courier -12} + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e index -10 +} -cleanup { + destroy .e +} -result {0} +test spinbox-13.24 {GetSpinboxIndex procedure} -body { + spinboxPlus .e -width 5 -relief sunken -highlightthickness 2 -bd 2 \ + -font {Courier -12} + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e index 12 +} -cleanup { + destroy .e +} -result {12} +test spinbox-13.25 {GetSpinboxIndex procedure} -body { + spinboxPlus .e -width 5 -relief sunken -highlightthickness 2 -bd 2 \ + -font {Courier -12} + pack .e + .e insert 0 012345678901234567890 + .e xview 4 + update + .e index 49 +} -cleanup { + destroy .e +} -result {21} + +# XXX Still need to write tests for SpinboxScanTo and SpinboxSelectTo. + +test spinbox-14.1 {SpinboxFetchSelection procedure} -body { + spinboxPlus .e + .e insert end "This is a test string" + .e select from 1 + .e select to 18 + selection get +} -cleanup { + destroy .e +} -result {his is a test str} +test spinbox-14.3 {SpinboxFetchSelection procedure} -setup { + set x {} + for {set i 1} {$i <= 500} {incr i} { + append x "This is line $i, out of 500\n" +} +} -body { + spinboxPlus .e + .e insert end $x + .e select from 0 + .e select to end + string compare [selection get] $x +} -cleanup { + destroy .e +} -result {0} + +test spinbox-15.1 {SpinboxLostSelection} -body { + spinboxPlus .e + .e insert 0 "Text" + .e select from 0 + .e select to 4 + set result [selection get] + selection clear + .e select from 0 + .e select to 4 + lappend result [selection get] +} -cleanup { + destroy .e +} -result {Text Text} + + +test spinbox-16.1 {SpinboxVisibleRange procedure} -constraints fonts -body { + spinboxPlus .e -width 10 -font {Helvetica -12} + pack .e + update + .e insert 0 "............................." + format {%.6f %.6f} {*}[.e xview] +} -cleanup { + destroy .e +} -result {0.000000 0.827586} +test spinbox-16.2 {SpinboxVisibleRange procedure} -body { + spinboxPlus .e + format {%.6f %.6f} {*}[.e xview] +} -cleanup { + destroy .e +} -result {0.000000 1.000000} + + +test spinbox-17.1 {SpinboxUpdateScrollbar procedure} -body { + spinboxPlus .e -width 10 -xscrollcommand scroll -font {Courier -12} + pack .e + .e delete 0 end + .e insert 0 123 + update + format {%.6f %.6f} {*}$scrollInfo +} -cleanup { + destroy .e +} -result {0.000000 1.000000} +test spinbox-17.2 {SpinboxUpdateScrollbar procedure} -body { + spinboxPlus .e -width 10 -xscrollcommand scroll -font {Courier -12} + pack .e + .e insert 0 0123456789abcdef + .e xview 3 + update + format {%.6f %.6f} {*}$scrollInfo +} -cleanup { + destroy .e +} -result {0.187500 0.812500} +test spinbox-17.3 {SpinboxUpdateScrollbar procedure} -body { + spinboxPlus .e -width 10 -xscrollcommand scroll -font {Courier -12} + pack .e + .e insert 0 abcdefghijklmnopqrs + .e xview 6 + update + format {%.6f %.6f} {*}$scrollInfo +} -cleanup { + destroy .e +} -result {0.315789 0.842105} +test spinbox-17.4 {SpinboxUpdateScrollbar procedure} -setup { + proc bgerror msg { + global x + set x $msg +} +} -body { + spinboxPlus .e -width 5 -xscrollcommand thisisnotacommand + pack .e + update + list $x $errorInfo +} -cleanup { + destroy .e + rename bgerror {} +} -result {{invalid command name "thisisnotacommand"} {invalid command name "thisisnotacommand" + while executing +"thisisnotacommand 0.0 1.0" + (horizontal scrolling command executed by .e)}} + + +test spinbox-18.1 {Spinbox widget vs hiding} -setup { + spinboxPlus .e +} -body { + set l [interp hidden] + interp hide {} .e + destroy .e + set res1 [list [winfo children .] [interp hidden]] + set res2 [list {} $l] + expr {$res1 == $res2} +} -result {1} + +## +## Spinbox widget VALIDATION tests +## +# The validation tests build each one upon the previous, so cascading +# failures aren't good +# +# 19.* test cases in previous version highly depended on the previous +# test cases. This was replaced by inserting recently set configurations +# that matters for the test case +test spinbox-19.1 {spinbox widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + spinboxPlus .e -validate all \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert 0 a + set ::vVals +} -cleanup { + destroy .e +} -result {.e 1 0 a {} a all key} + +test spinbox-19.2 {spinbox widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + spinboxPlus .e -validate all \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert 0 a ;# previous settings + .e insert 1 b + set ::vVals +} -cleanup { + destroy .e +} -result {.e 1 1 ab a b all key} + +test spinbox-19.3 {spinbox widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + spinboxPlus .e -validate all \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert 0 ab ;# previous settings + .e insert end c + set ::vVals +} -cleanup { + destroy .e +} -result {.e 1 2 abc ab c all key} + +test spinbox-19.4 {spinbox widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + spinboxPlus .e -validate all \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert 0 abc ;# previous settings + .e insert 1 123 + list $::vVals $::e +} -cleanup { + destroy .e +} -result {{.e 1 1 a123bc abc 123 all key} a123bc} + +test spinbox-19.5 {spinbox widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + spinboxPlus .e -validate all \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert 0 a123bc ;# previous settings + .e delete 2 + set ::vVals +} -cleanup { + destroy .e +} -result {.e 0 2 a13bc a123bc 2 all key} + +test spinbox-19.6 {spinbox widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + spinboxPlus .e -validate all \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert 0 a13bc ;# previous settings + .e configure -validate key + .e delete 1 3 + set ::vVals +} -cleanup { + destroy .e +} -result {.e 0 1 abc a13bc 13 key key} + +test spinbox-19.7 {spinbox widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + spinboxPlus .e -validate focus \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert end abc ;# previous settings + set ::vVals {} + .e insert end d + set ::vVals +} -cleanup { + destroy .e +} -result {} + +test spinbox-19.8 {spinbox widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + spinboxPlus .e -validate all \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e configure -validate focus ;# previous settings + .e insert end abcd ;# previous settings + focus -force .e +# update necessary to process FocusIn event + update + set ::vVals +} -cleanup { + destroy .e +} -result {.e -1 -1 abcd abcd {} focus focusin} + +test spinbox-19.9 {spinbox widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + spinboxPlus .e -validate focus \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert end abcd ;# previous settings + focus -force .e ;# previous settings + update ;# previous settings +# update necessary to process FocusIn event + focus -force . +# update necessary to process FocusOut event + update + set ::vVals +} -cleanup { + destroy .e +} -result {.e -1 -1 abcd abcd {} focus focusout} + +test spinbox-19.10 {spinbox widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + spinboxPlus .e -validate all \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert end abcd ;# previous settings + focus -force .e +# update necessary to process FocusIn event + update + set ::vVals +} -cleanup { + destroy .e +} -result {.e -1 -1 abcd abcd {} all focusin} + +test spinbox-19.11 {spinbox widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + spinboxPlus .e -validate all \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert end abcd ;# previous settings + focus -force .e ;# previous settings +# update necessary to process FocusIn event + update ;# previous settings + focus -force . +# update necessary to process FocusOut event + update + set ::vVals +} -cleanup { + destroy .e +} -result {.e -1 -1 abcd abcd {} all focusout} + +test spinbox-19.12 {spinbox widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + spinboxPlus .e -validate focusin \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert 0 abcd ;# previous settings + focus -force .e +# update necessary to process FocusIn event + update + set ::vVals +} -cleanup { + destroy .e +} -result {.e -1 -1 abcd abcd {} focusin focusin} + +test spinbox-19.13 {spinbox widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + spinboxPlus .e -validate focusin \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert end abcd ;# previous settings + set ::vVals {} + focus -force . +# update necessary to process FocusOut event + update + set ::vVals +} -cleanup { + destroy .e +} -result {} + +test spinbox-19.14 {spinbox widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + spinboxPlus .e -validate focuso \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert end abcd ;# previous settings + set ::vVals {} ;# previous settings + focus -force .e +# update necessary to process FocusIn event + update + set ::vVals +} -cleanup { + destroy .e +} -result {} + +test spinbox-19.15 {spinbox widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + spinboxPlus .e -validate focuso \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert end abcd ;# previous settings + set ::vVals {} ;# previous settings + focus -force .e ;# previous settings +# update necessary to process FocusIn event + update ;# previous settings + focus -force . +# update necessary to process FocusOut event + update + set ::vVals +} -cleanup { + destroy .e +} -result {.e -1 -1 abcd abcd {} focusout focusout} + +# the same as 19.16 but added [.e validate] to returned list +test spinbox-19.16 {spinbox widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + spinboxPlus .e -validate focuso \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert end abcd ;# previous settings + set ::vVals {} ;# previous settings + focus -force .e ;# previous settings +# update necessary to process FocusIn event + update ;# previous settings + focus -force . +# update necessary to process FocusOut event + update + list [.e validate] $::vVals +} -cleanup { + destroy .e +} -result {1 {.e -1 -1 abcd abcd {} all forced}} + + +test spinbox-19.17 {spinbox widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + spinboxPlus .e -validate focuso \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + .e insert end abcd ;# previous settings + set ::e newdata + list [.e cget -validate] $::vVals +} -cleanup { + destroy .e +} -result {focusout {.e -1 -1 newdata abcd {} focusout forced}} + + +# proc doval changed - returns 0 +test spinbox-19.18 {spinbox widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + spinboxPlus .e -validate all \ + -validatecommand [list doval3 %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + set ::e newdata ;# previous settings + .e configure -validate all + set ::e nextdata + list [.e cget -validate] $::vVals +} -cleanup { + destroy .e +} -result {none {.e -1 -1 nextdata newdata {} all forced}} + + +## This sets validate to none because it shows that we prevent a possible +## loop condition in the validation, when the spinbox textvar is also set +# proc doval2 used +test spinbox-19.19 {spinbox widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + spinboxPlus .e -validate all \ + -validatecommand [list doval3 %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + set ::e nextdata ;# previous settings + + .e configure -validatecommand [list doval2 %W %d %i %P %s %S %v %V] + .e validate + list [.e cget -validate] [.e get] $::vVals +} -cleanup { + destroy .e +} -result {none mydata {.e -1 -1 nextdata nextdata {} all forced}} + +## This leaves validate alone because we trigger validation through the +## textvar (a write trace), and the write during validation triggers +## nothing (by definition of avoiding loops on var traces). This is +## one of those "dangerous" conditions where the user will have a +## different value in the spinbox widget shown as is in the textvar. +test spinbox-19.20 {spinbox widget validation} -setup { + unset -nocomplain ::e ::vVals +} -body { + spinboxPlus .e -validate all \ + -validatecommand [list doval %W %d %i %P %s %S %v %V] \ + -invalidcommand bell \ + -textvariable ::e \ + -background red -foreground white + pack .e + set ::e nextdata ;# previous settings + .e configure -validatecommand [list doval2 %W %d %i %P %s %S %v %V] ;# prev + .e validate ;# previous settings + + .e configure -validate all + set ::e testdata + list [.e cget -validate] [.e get] $::e $::vVals +} -cleanup { + destroy .e +} -result {all testdata mydata {.e -1 -1 testdata mydata {} all forced}} +## +## End validation tests +## + +test spinbox-20.1 {spinbox config, -format specifier} -body { + spinboxPlus .e + .e config -format %2f +} -cleanup { + destroy .e +} -returnCodes ok +test spinbox-20.2 {spinbox config, -format specifier} -body { + spinboxPlus .e + .e config -format %2.2f +} -cleanup { + destroy .e +} -returnCodes ok +test spinbox-20.3 {spinbox config, -format specifier} -body { + spinboxPlus .e + .e config -format %.2f +} -cleanup { + destroy .e +} -returnCodes ok +test spinbox-20.4 {spinbox config, -format specifier} -body { + spinboxPlus .e + .e config -format %2.f +} -cleanup { + destroy .e +} -returnCodes ok +test spinbox-20.5 {spinbox config, -format specifier} -body { + spinboxPlus .e + .e config -format %2e-1f +} -cleanup { + destroy .e +} -returnCodes {error} -result {bad spinbox format specifier "%2e-1f"} +test spinbox-20.6 {spinbox config, -format specifier} -body { + spinboxPlus .e + .e config -format 2.2 +} -cleanup { + destroy .e +} -returnCodes {error} -result {bad spinbox format specifier "2.2"} +test spinbox-20.7 {spinbox config, -format specifier} -body { + spinboxPlus .e + .e config -format %2.-2f +} -cleanup { + destroy .e +} -returnCodes {error} -result {bad spinbox format specifier "%2.-2f"} +test spinbox-20.8 {spinbox config, -format specifier} -body { + spinboxPlus .e + .e config -format %-2.02f +} -cleanup { + destroy .e +} -returnCodes ok +test spinbox-20.9 {spinbox config, -format specifier} -body { + spinboxPlus .e + .e config -format "% 2.02f" +} -cleanup { + destroy .e +} -returnCodes ok +test spinbox-20.10 {spinbox config, -format specifier} -body { + spinboxPlus .e + .e config -format "% -2.200f" +} -cleanup { + destroy .e +} -returnCodes ok +test spinbox-20.11 {spinbox config, -format specifier} -body { + spinboxPlus .e + .e config -format "%09.200f" +} -cleanup { + destroy .e +} -returnCodes ok +test spinbox-20.12 {spinbox config, -format specifier does something} -setup { + spinboxPlus .e + set out {} +} -body { + .e config -format "%02.f" + .e config -values {} -from 0 -to 10 -increment 1 + lappend out [.e set 0]; # set currently doesn't force format + .e invoke buttonup + lappend out [.e set]; # but after invoke it should be formatted + lappend out [.e set 3]; # set currently doesn't force format + .e config -format "%03.f" + lappend out [.e set]; # changing -format should cause formatting +} -cleanup { + destroy .e +} -result {0 01 3 003} + + +test spinbox-21.1 {spinbox button, out of range checking} -body { + spinboxPlus .e -from -10 -to 20 -increment 2 + set out {} + lappend out [.e get]; # -10 + .e delete 0 end + .e insert 0 25; # set outside of range + .e invoke buttondown; # should constrain + lappend out [.e get]; # 20 + .e delete 0 end + .e insert 0 25; # set outside of range + .e invoke buttonup; # should constrain + lappend out [.e get]; # 20 + .e delete 0 end + .e insert 0 -100; # set outside of range + .e invoke buttonup; # should constrain + lappend out [.e get]; # -10 + .e delete 0 end + .e insert 0 -100; # set outside of range + .e invoke buttondown; # should constrain + lappend out [.e get]; # -10 + .e delete 0 end + .e insert 0 bogus; # set to a bogus value + .e invoke buttondown; # should use fromValue + lappend out [.e get]; # -10 + .e delete 0 end + .e insert 0 19; # set just inside of range + .e invoke buttonup; # no wrap + lappend out [.e get]; # 20 + .e invoke buttonup; # no wrap + lappend out [.e get]; # 20 + .e invoke buttondown + lappend out [.e get]; # 18 + .e delete 0 end + .e insert 0 -9; # set just inside of range + .e invoke buttondown; # no wrap + lappend out [.e get]; # -10 + .e invoke buttondown; # no wrap + lappend out [.e get]; # -10 + .e invoke buttonup; # no wrap + lappend out [.e get]; # -8 + + .e configure -wrap 1 + .e delete 0 end + .e insert 0 19; # set just inside of range + .e invoke buttonup; # wrap + lappend out [.e get]; # -10 + .e invoke buttonup + lappend out [.e get]; # -8 + .e invoke buttondown + lappend out [.e get]; # -10 + .e delete 0 end + .e insert 0 -9; # set just inside of range + .e invoke buttondown; # wrap + lappend out [.e get]; # 20 + .e invoke buttondown + lappend out [.e get]; # 18 + .e invoke buttonup; # no wrap + lappend out [.e get]; # 20 +} -cleanup { + destroy .e +} -result {-10 20 20 -10 -10 -10 20 20 18 -10 -10 -8 -10 -8 -10 20 18 20} + +test spinbox-22.1 {spinbox config, -from changes SF bug 559078} -body { + set val 5 + spinboxPlus .e -from 1 -to 10 -textvariable val + set val +} -cleanup { + destroy .e +} -result {5} +test spinbox-22.2 {spinbox config, -from changes SF bug 559078} -body { + set val 5 + spinboxPlus .e -from 1 -to 10 -textvariable val + .e configure -from 3 -to 10 + set val +} -cleanup { + destroy .e +} -result {5} +test spinbox-22.3 {spinbox config, -from changes SF bug 559078} -body { + set val 5 + spinboxPlus .e -from 3 -to 10 -textvariable val + .e configure -from 6 -to 10 + set val +} -cleanup { + destroy .e +} -result {6} + +test spinbox-23.1 {selection present while disabled, bug 637828} -body { + spinboxPlus .e + .e insert end 0123456789 + .e select from 3 + .e select to 6 + set out [.e selection present] + .e configure -state disabled +# still return 1 when disabled, because 'selection get' will work, +# but selection cannot be changed (new behavior since 8.4) + .e select to 9 + lappend out [.e selection present] [selection get] +} -cleanup { + destroy .e +} -result {1 1 345} + +test spinbox-24.1 {error in trace proc attached to the textvariable} -setup { + destroy .s +} -body { + trace variable myvar w traceit + proc traceit args {error "Intentional error here!"} + spinboxPlus .s -textvariable myvar -from 1 -to 10 + catch {.s set mystring} result1 + catch {.s insert 0 mystring} result2 + catch {.s delete 0} result3 + catch {.s invoke buttonup} result4 + list $result1 $result2 $result3 $result4 +} -cleanup { + destroy .s +} -result [list {can't set "myvar": Intentional error here!} \ + {can't set "myvar": Intentional error here!} \ + {can't set "myvar": Intentional error here!} \ + {can't set "myvar": Intentional error here!}] + +test spinbox-25.1.spinbox {textvariable lives in a non-existing namespace} -constraints { + spinboxErrorMsgDifferent +} -setup { + destroy .s +} -body { + catch {spinboxPlus .s -textvariable thisnsdoesntexist::myvar} result1 + set result1 +} -cleanup { + destroy .s +} -result {can't trace "thisnsdoesntexist::myvar": parent namespace doesn't exist} +test spinbox-25.1 {textvariable lives in a non-existing namespace} -setup { + destroy .s +} -body { + catch {spinboxPlus .s -textvariable thisnsdoesntexist::myvar} result1 + set result1 +} -cleanup { + destroy .s +} -result {Error in constructor: can't trace "thisnsdoesntexist::myvar": parent namespace doesn't exist} + +# Collected comments about lacks from the test +# XXX Still need to write tests for SpinboxBlinkProc, SpinboxFocusProc, +# and SpinboxTextVarProc. +# No tests for DisplaySpinbox. +# XXX Still need to write tests for SpinboxScanTo and SpinboxSelectTo. +# No tests for EventuallyRedraw + +# option clear +# cleanup +cleanupTests +return + + diff --git a/modules/widgetPlus/ttkComboboxPlus.test b/modules/widgetPlus/ttkComboboxPlus.test new file mode 100644 index 00000000..19bf303e --- /dev/null +++ b/modules/widgetPlus/ttkComboboxPlus.test @@ -0,0 +1,83 @@ +# +# ttk::combobox widget tests +# + +package require Tk 8.5 +package require tcltest ; namespace import -force tcltest::* +loadTestedCommands + +package require widgetPlus +namespace import ::widgetPlus::ttkComboboxPlus + +# ------------------------------------------------------------------------------ +# This file is copied from ttk/combobox.test, with addition of the two lines +# above, application of "s/ttk::combobox/ttkComboboxPlus/g" to widget +# constructors in the code, but not to commands ttk::combobox::* (and not to +# comments, results, test names or other metadata). +# +# The purpose is to check that "ttkComboboxPlus" does not break any features of +# "ttk::combobox", including important matters such as validation. +# +# All tests pass. +# ------------------------------------------------------------------------------ + +test combobox-1.0 "Combobox tests -- setup" -body { + ttkComboboxPlus .cb +} -result .cb + +test combobox-1.1 "Bad -values list" -body { + .cb configure -values "bad \{list" +} -result "unmatched open brace in list" -returnCodes 1 + +test combobox-1.end "Combobox tests -- cleanup" -body { + destroy .cb +} + +test combobox-2.0 "current command" -body { + ttkComboboxPlus .cb -values [list a b c d e a] + .cb current +} -result -1 + +test combobox-2.1 "current -- set index" -body { + .cb current 5 + .cb get +} -result a + +test combobox-2.2 "current -- change -values" -body { + .cb configure -values [list c b a d e] + .cb current +} -result 2 + +test combobox-2.3 "current -- change value" -body { + .cb set "b" + .cb current +} -result 1 + +test combobox-2.4 "current -- value not in list" -body { + .cb set "z" + .cb current +} -result -1 + +test combobox-2.end "Cleanup" -body { destroy .cb } + + +test combobox-1890211 "ComboboxSelected event after listbox unposted" -body { + # whitebox test... + pack [ttkComboboxPlus .cb -values [list a b c]] + set result [list] + bind .cb <> { + lappend result Event [winfo ismapped .cb.popdown] [.cb get] + } + lappend result Start 0 [.cb get] + ttk::combobox::Post .cb + lappend result Post [winfo ismapped .cb.popdown] [.cb get] + .cb.popdown.f.l selection clear 0 end; .cb.popdown.f.l selection set 1 + ttk::combobox::LBSelected .cb.popdown.f.l + lappend result Select [winfo ismapped .cb.popdown] [.cb get] + update + set result +} -result [list Start 0 {} Post 1 {} Select 0 b Event 0 b] -cleanup { + destroy .cb +} + +tcltest::cleanupTests diff --git a/modules/widgetPlus/ttkEntryPlus.test b/modules/widgetPlus/ttkEntryPlus.test new file mode 100644 index 00000000..b2363980 --- /dev/null +++ b/modules/widgetPlus/ttkEntryPlus.test @@ -0,0 +1,297 @@ +# +# Tile package: entry widget tests +# + +package require Tk 8.5 +package require tcltest ; namespace import -force tcltest::* +loadTestedCommands + +package require widgetPlus +namespace import ::widgetPlus::ttkEntryPlus + +# ------------------------------------------------------------------------------ +# This file is copied from ttk/entry.test, with addition of the two lines above, +# application of "s/ttk::entry/ttkEntryPlus/g" to the code (but not to comments, +# results, test names or other metadata). +# +# The purpose is to check that "ttkEntryPlus" does not break any features of +# "ttk::entry", including important matters such as validation. +# +# All tests pass. +# ------------------------------------------------------------------------------ + +variable scrollInfo +proc scroll args { + global scrollInfo + set scrollInfo $args +} + +# Some of the tests raise background errors; +# override default bgerror to catch them. +# +variable bgerror "" +proc bgerror {error} { + variable bgerror $error + variable bgerrorInfo $::errorInfo + variable bgerrorCode $::errorCode +} + +# +test entry-1.1 "Create entry widget" -body { + ttkEntryPlus .e +} -result .e + +test entry-1.2 "Insert" -body { + .e insert end abcde + .e get +} -result abcde + +test entry-1.3 "Selection" -body { + .e selection range 1 3 + selection get +} -result bc + +test entry-1.4 "Delete" -body { + .e delete 1 3 + .e get +} -result ade + +test entry-1.5 "Deletion - insert cursor" -body { + .e insert end abcde + .e icursor 0 + .e delete 0 end + .e index insert +} -result 0 + +test entry-1.6 "Deletion - insert cursor at end" -body { + .e insert end abcde + .e icursor end + .e delete 0 end + .e index insert +} -result 0 + +test entry-1.7 "Deletion - insert cursor in the middle " -body { + .e insert end abcde + .e icursor 3 + .e delete 0 end + .e index insert +} -result 0 + +test entry-1.done "Cleanup" -body { destroy .e } + +# Scrollbar tests. + +test entry-2.1 "Create entry before scrollbar" -body { + pack [ttkEntryPlus .te -xscrollcommand [list .tsb set]] \ + -expand true -fill both + pack [ttk::scrollbar .tsb -orient horizontal -command [list .te xview]] \ + -expand false -fill x +} -cleanup {destroy .te .tsb} + +test entry-2.2 "Initial scroll position" -body { + ttkEntryPlus .e -font fixed -width 5 -xscrollcommand scroll + .e insert end "0123456789" + pack .e; update + set scrollInfo +} -result {0.0 0.5} -cleanup { destroy .e } +# NOTE: result can vary depending on font. + +# Bounding box / scrolling tests. +test entry-3.0 "Series 3 setup" -body { + ttk::style theme use default + variable fixed fixed + variable cw [font measure $fixed a] + variable ch [font metrics $fixed -linespace] + variable bd 2 ;# border + padding + variable ux [font measure $fixed \u4e4e] + + pack [ttkEntryPlus .e -font $fixed -width 20] + update +} + +test entry-3.1 "bbox widget command" -body { + .e delete 0 end + .e bbox 0 +} -result [list $bd $bd 0 $ch] + +test entry-3.2 "xview" -body { + .e delete 0 end; + .e insert end [string repeat "0" 40] + update idletasks + set result [.e xview] +} -result {0.0 0.5} + +test entry-3.last "Series 3 cleanup" -body { + destroy .e +} + +# Selection tests: + +test entry-4.0 "Selection test - setup" -body { + ttkEntryPlus .e + .e insert end asdfasdf + .e selection range 0 end +} + +test entry-4.1 "Selection test" -body { + selection get +} -result asdfasdf + +test entry-4.2 "Disable -exportselection" -body { + .e configure -exportselection false + selection get +} -returnCodes error -result "PRIMARY selection doesn't exist*" -match glob + +test entry-4.3 "Reenable -exportselection" -body { + .e configure -exportselection true + selection get +} -result asdfasdf + +test entry-4.4 "Force selection loss" -body { + selection own . + .e index sel.first +} -returnCodes error -result "selection isn't in widget .e" + +test entry-4.5 "Allow selection changes if readonly" -body { + .e delete 0 end + .e insert end 0123456789 + .e selection range 0 end + .e configure -state readonly + .e selection range 2 4 + .e configure -state normal + list [.e index sel.first] [.e index sel.last] +} -result {2 4} + +test entry-4.6 "Disallow selection changes if disabled" -body { + .e delete 0 end + .e insert end 0123456789 + .e selection range 0 end + .e configure -state disabled + .e selection range 2 4 + .e configure -state normal + list [.e index sel.first] [.e index sel.last] +} -result {0 10} + +test entry-4.7 {sel.first and sel.last gravity} -body { + set result [list] + .e delete 0 end + .e insert 0 0123456789 + .e select range 2 6 + .e insert 2 XXX + lappend result [.e index sel.first] [.e index sel.last] + .e insert 6 YYY + lappend result [.e index sel.first] [.e index sel.last] [.e get] +} -result {5 9 5 12 01XXX2YYY3456789} + +# Self-destruct tests. + +test entry-5.1 {widget deletion while active} -body { + destroy .e + pack [ttkEntryPlus .e] + update + .e config -xscrollcommand { destroy .e } + update idletasks + winfo exists .e +} -result 0 + +# TODO: test killing .e in -validatecommand, -invalidcommand, variable trace; + + +# -textvariable tests. + +test entry-6.1 {Update linked variable in write trace} -body { + proc override args { + global x + set x "Overridden!" + } + catch {destroy .e} + set x "" + trace variable x w override + ttkEntryPlus .e -textvariable x + .e insert 0 "Some text" + set result [list $x [.e get]] + set result +} -result {Overridden! Overridden!} -cleanup { + unset x + rename override {} + destroy .e +} + +test entry-6.2 {-textvariable tests} -body { + set result [list] + ttkEntryPlus .e -textvariable x + set x "text" + lappend result [.e get] + unset x + lappend result [.e get] + .e insert end "newtext" + lappend result [.e get] [set x] +} -result [list "text" "" "newtext" "newtext"] -cleanup { + destroy .e + unset -nocomplain x +} + +test entry-7.1 {Bad style options} -body { + ttk::style theme create entry-7.1 -settings { + ttk::style configure TEntry -foreground BadColor + ttk::style map TEntry -foreground {readonly AnotherBadColor} + ttk::style map TEntry -font {readonly ABadFont} + ttk::style map TEntry \ + -selectbackground {{} BadColor} \ + -selectforeground {{} BadColor} \ + -insertcolor {{} BadColor} + } + pack [ttkEntryPlus .e -text "Don't crash"] + ttk::style theme use entry-7.1 + update + .e selection range 0 end + update + .e state readonly; + update +} -cleanup { destroy .e ; ttk::style theme use default } + +test entry-8.1 "Unset linked variable" -body { + variable foo "bar" + pack [ttkEntryPlus .e -textvariable foo] + unset foo + .e insert end "baz" + list [.e cget -textvariable] [.e get] [set foo] +} -result [list foo "baz" "baz"] -cleanup { destroy .e } + +test entry-8.2 "Unset linked variable by deleting namespace" -body { + namespace eval ::test { variable foo "bar" } + pack [ttkEntryPlus .e -textvariable ::test::foo] + namespace delete ::test + .e insert end "baz" ;# <== error here + list [.e cget -textvariable] [.e get] [set foo] +} -returnCodes error -result "*parent namespace doesn't exist*" -match glob +# '-result [list ::test::foo "baz" "baz"]' would also be sensible, +# but Tcl namespaces don't work that way. + +test entry-8.2a "Followup to test 8.2" -body { + .e cget -textvariable +} -result ::test::foo -cleanup { destroy .e } +# For 8.2a, -result {} would also be sensible. + +test entry-9.1 "Index range invariants" -setup { + # See bug#1721532 for discussion + proc entry-9.1-trace {n1 n2 op} { + set ::V NO! + } + variable V + trace add variable V write entry-9.1-trace + ttkEntryPlus .e -textvariable V +} -body { + set result [list] + .e insert insert a ; lappend result [.e index insert] [.e index end] + .e insert insert b ; lappend result [.e index insert] [.e index end] + .e insert insert c ; lappend result [.e index insert] [.e index end] + .e insert insert d ; lappend result [.e index insert] [.e index end] + .e insert insert e ; lappend result [.e index insert] [.e index end] + set result +} -result [list 1 3 2 3 3 3 3 3 3 3] -cleanup { + unset V + destroy .e +} + +tcltest::cleanupTests diff --git a/modules/widgetPlus/ttkSpinboxPlus.test b/modules/widgetPlus/ttkSpinboxPlus.test new file mode 100644 index 00000000..d964b2f1 --- /dev/null +++ b/modules/widgetPlus/ttkSpinboxPlus.test @@ -0,0 +1,294 @@ +# +# ttk::spinbox widget tests +# + +package require widgetPlus +namespace import ::widgetPlus::ttkSpinboxPlus + +# ------------------------------------------------------------------------------ +# This file is copied from ttk/spinbox.test, with addition of the two lines +# above, application of "s/ttk::spinbox/ttkSpinboxPlus/g" to the code (but not +# to comments, results, test names or other metadata). +# +# The purpose is to check that "ttkSpinboxPlus" does not break any features of +# "ttk::spinbox", including important matters such as validation. +# +# All tests pass. +# ------------------------------------------------------------------------------ + +package require Tk +package require tcltest ; namespace import -force tcltest::* +loadTestedCommands + +test spinbox-1.0 "Spinbox tests -- setup" -body { + ttkSpinboxPlus .sb +} -cleanup { destroy .sb } -result .sb + +test spinbox-1.1 "Bad -values list" -setup { + ttkSpinboxPlus .sb +} -body { + .sb configure -values "bad \{list" +} -cleanup { + destroy .sb +} -returnCodes error -result "unmatched open brace in list" + +test spinbox-1.3.1 "get retrieves value" -setup { + ttkSpinboxPlus .sb -from 0 -to 100 +} -body { + .sb set 50 + .sb get +} -cleanup { + destroy .sb +} -result 50 + +test spinbox-1.3.2 "get retrieves value" -setup { + ttkSpinboxPlus .sb -from 0 -to 100 -values 55 +} -body { + .sb set 55 + .sb get +} -cleanup { + destroy .sb +} -result 55 + +test spinbox-1.4.1 "set changes value" -setup { + ttkSpinboxPlus .sb -from 0 -to 100 +} -body { + .sb set 33 + .sb get +} -cleanup { + destroy .sb +} -result 33 + +test spinbox-1.4.2 "set changes value" -setup { + ttkSpinboxPlus .sb -from 0 -to 100 -values 55 +} -body { + .sb set 33 + .sb get +} -cleanup { + destroy .sb +} -result 33 + + +test spinbox-1.6.1 "insert start" -setup { + ttkSpinboxPlus .sb -from 0 -to 100 +} -body { + .sb set 5 + .sb insert 0 4 + .sb get +} -cleanup { + destroy .sb +} -result 45 + +test spinbox-1.6.2 "insert end" -setup { + ttkSpinboxPlus .sb -from 0 -to 100 +} -body { + .sb set 5 + .sb insert end 4 + .sb get +} -cleanup { + destroy .sb +} -result 54 + +test spinbox-1.6.3 "insert invalid index" -setup { + ttkSpinboxPlus .sb -from 0 -to 100 +} -body { + .sb set 5 + .sb insert 100 4 + .sb get +} -cleanup { + destroy .sb +} -result 54 + +test spinbox-1.7.1 "-command option: set doesnt fire" -setup { + ttkSpinboxPlus .sb -from 0 -to 100 -command {set ::spinbox_test 1} +} -body { + set ::spinbox_test 0 + .sb set 50 + set ::spinbox_test +} -cleanup { + destroy .sb +} -result 0 + +test spinbox-1.7.2 "-command option: button handler will fire" -setup { + ttkSpinboxPlus .sb -from 0 -to 100 -command {set ::spinbox_test 1} +} -body { + set ::spinbox_test 0 + .sb set 50 + event generate .sb <> + set ::spinbox_test +} -cleanup { + destroy .sb +} -result 1 + +test spinbox-1.8.1 "option -validate" -setup { + ttkSpinboxPlus .sb -from 0 -to 100 +} -body { + .sb configure -validate all + .sb cget -validate +} -cleanup { + destroy .sb +} -result {all} + +test spinbox-1.8.2 "option -validate" -setup { + ttkSpinboxPlus .sb -from 0 -to 100 +} -body { + .sb configure -validate key + .sb configure -validate focus + .sb configure -validate focusin + .sb configure -validate focusout + .sb configure -validate none + .sb cget -validate +} -cleanup { + destroy .sb +} -result {none} + +test spinbox-1.8.3 "option -validate" -setup { + ttkSpinboxPlus .sb -from 0 -to 100 +} -body { + .sb configure -validate bogus +} -cleanup { + destroy .sb +} -returnCodes error -result {bad validate "bogus": must be all, key, focus, focusin, focusout, or none} + +test spinbox-1.8.4 "-validate option: " -setup { + set ::spinbox_test {} + ttkSpinboxPlus .sb -from 0 -to 100 +} -body { + .sb configure -validate all -validatecommand {lappend ::spinbox_test %P} + pack .sb + .sb set 50 + focus -force .sb + after 500 {set ::spinbox_wait 1} ; vwait ::spinbox_wait + set ::spinbox_test +} -cleanup { + destroy .sb +} -result {50} + + +test spinbox-2.0 "current command -- unset should be 0" -constraints nyi -setup { + ttkSpinboxPlus .sb -values [list a b c d e a] +} -body { + .sb current +} -cleanup { + destroy .sb +} -result 0 +# @@@ for combobox, this is -1. + +test spinbox-2.1 "current command -- set index" -constraints nyi -setup { + ttkSpinboxPlus .sb -values [list a b c d e a] +} -body { + .sb current 5 + .sb get +} -cleanup { + destroy .sb +} -result a + +test spinbox-2.2 "current command -- change -values" -constraints nyi -setup { + ttkSpinboxPlus .sb -values [list a b c d e a] +} -body { + .sb current 5 + .sb configure -values [list c b a d e] + .sb current +} -cleanup { + destroy .sb +} -result 2 + +test spinbox-2.3 "current command -- change value" -constraints nyi -setup { + ttkSpinboxPlus .sb -values [list c b a d e] +} -body { + .sb current 2 + .sb set "b" + .sb current +} -cleanup { + destroy .sb +} -result 1 + +test spinbox-2.4 "current command -- value not in list" -constraints nyi -setup { + ttkSpinboxPlus .sb -values [list c b a d e] +} -body { + .sb current 2 + .sb set "z" + .sb current +} -cleanup { + destroy .sb +} -result -1 + +# nostomp: NB intentional difference between ttk::spinbox and tk::spinbox; +# see also #1439266 +# +test spinbox-nostomp-1 "don't stomp on -variable (init; -from/to)" -body { + set SBV 55 + ttkSpinboxPlus .sb -textvariable SBV -from 0 -to 100 -increment 5 + list $SBV [.sb get] +} -cleanup { + unset SBV + destroy .sb +} -result [list 55 55] + +test spinbox-nostomp-2 "don't stomp on -variable (init; -values)" -body { + set SBV Apr + ttkSpinboxPlus .sb -textvariable SBV -values {Jan Feb Mar Apr May Jun Jul Aug} + list $SBV [.sb get] +} -cleanup { + unset SBV + destroy .sb +} -result [list Apr Apr] + +test spinbox-nostomp-3 "don't stomp on -variable (configure; -from/to)" -body { + set SBV 55 + ttkSpinboxPlus .sb + .sb configure -textvariable SBV -from 0 -to 100 -increment 5 + list $SBV [.sb get] +} -cleanup { + unset SBV + destroy .sb +} -result [list 55 55] + +test spinbox-nostomp-4 "don't stomp on -variable (configure; -values)" -body { + set SBV Apr + ttkSpinboxPlus .sb + .sb configure -textvariable SBV -values {Jan Feb Mar Apr May Jun Jul Aug} + list $SBV [.sb get] +} -cleanup { + unset SBV + destroy .sb +} -result [list Apr Apr] + +test spinbox-dieoctaldie-1 "Cope with leading zeros" -body { + # See SF#2358545 -- ttk::spinbox also affected + set secs 07 + ttkSpinboxPlus .sb -from 0 -to 59 -format %02.0f -textvariable secs + + set result [list $secs] + event generate .sb <>; lappend result $secs + event generate .sb <>; lappend result $secs + event generate .sb <>; lappend result $secs + event generate .sb <>; lappend result $secs + + event generate .sb <>; lappend result $secs + event generate .sb <>; lappend result $secs + event generate .sb <>; lappend result $secs + event generate .sb <>; lappend result $secs + + set result +} -result [list 07 08 09 10 11 10 09 08 07] -cleanup { + destroy .sb + unset secs +} + +test spinbox-dieoctaldie-2 "Cope with general bad input" -body { + set result [list] + ttkSpinboxPlus .sb -from 0 -to 100 -format %03.0f + .sb set asdfasdf ; lappend result [.sb get] + event generate .sb <> ; lappend result [.sb get] + .sb set asdfasdf ; lappend result [.sb get] + event generate .sb <> ; lappend result [.sb get] +} -result [list asdfasdf 000 asdfasdf 000] -cleanup { + destroy .sb +} + +tcltest::cleanupTests + +# Local variables: +# mode: tcl +# End: diff --git a/modules/widgetPlus/widgetPlus.man b/modules/widgetPlus/widgetPlus.man new file mode 100644 index 00000000..18656742 --- /dev/null +++ b/modules/widgetPlus/widgetPlus.man @@ -0,0 +1,339 @@ +[comment {-*- tcl -*- widgetPlus manpage}] +[manpage_begin widgetPlus n 1.0] +[moddesc {Enhanced Entry, Spinbox, and Combobox Widgets with Undo/Redo and other useful features}] +[titledesc {Enhanced Entry, Spinbox, and Combobox Widgets with Undo/Redo and other useful features}] +[require Tcl 8.5] +[require Tk 8.5] +[require snit] +[require widgetPlus [opt 1.0]] +[description] + +The [package widgetPlus] package adds new features to the widgets [syscmd [widget entry]], [syscmd [widget spinbox]], [syscmd [widget ttk::entry]], [syscmd [widget ttk::spinbox]], and [syscmd [widget ttk::combobox]]. + +[para] +The new features are Undo and Redo operations, a [const <>] event, and for the [const Tk] (unthemed) widgets an [option -inactiveselectbackground] option, and some minor fixes to bindings. The new facilities closely follow those of the [syscmd [widget text]] widget. + +[para] +The revised [syscmd [widget entry]], [syscmd [widget spinbox]], [syscmd [widget ttk::entry]], [syscmd [widget ttk::spinbox]], and [syscmd [widget ttk::combobox]] widgets are created by the commands [cmd widgetPlus::entryPlus], [cmd widgetPlus::spinboxPlus], [cmd widgetPlus::ttkEntryPlus], [cmd widgetPlus::ttkSpinboxPlus], and [cmd widgetPlus::ttkComboboxPlus] respectively. + +[para] +For example, the [cmd widgetPlus::entryPlus] widget is implemented as a [term Snit] [syscmd snit::widgetadaptor] that wraps a [package Tk] [syscmd [widget entry]] widget. Its [syscmd {winfo class}] is [const Entry], and it uses a binding tag [const EntryPlus] that replaces the [const Entry] binding tag. The other widgets are implemented in a similar way. + +[para] +The package uses the namespace [namespace ::widgetPlus], which exports (only) the five commands defined below that begin with a lower-case letter ([cmd EnableBWidget] is not exported). These commands can be imported into the global namespace, and for simplicity, descriptive text in this manual will henceforth omit the namespace qualifier. + +[example { +namespace import ::widgetPlus::* +}] + + +[section {WIDGET OPTIONS}] + +In addition to the usual options of the [syscmd [widget entry]], [syscmd [widget spinbox]], [syscmd [widget ttk::entry]], [syscmd [widget ttk::spinbox]], and [syscmd [widget ttk::combobox]] widgets, the wrappers [cmd [widget entryPlus]], [cmd [widget spinboxPlus]], [cmd [widget ttkEntryPlus]], [cmd [widget ttkSpinboxPlus]], and [cmd [widget ttkComboboxPlus]] provide the options below. + +[list_begin tkoptions] + +[comment { +[tkoption_def [option -autoseparators] autoSeparators AutoSeparators] +Boolean value, currently ignored (see [sectref {TO DO}]). Currently, an implicit autoseparator is added to the [term {undo stack}] for each call to a widget command (e.g. [cmd insert] or [cmd delete]) that changes the widget contents: these therefore separate the addition or removal of individual characters, except that [term cut] or [term paste] operations are discrete. + +[para] +[emph SHOULD] specify a [term boolean] that says whether separators are automatically inserted in the [term {undo stack}]. Only meaningful when the [option -undo] option is [const true]. +}] + +[tkoption_def [option -inactiveselectbackground] inactiveSelectBackground Foreground] +Specifies the color to use for the selection when the window does not have the input [syscmd focus]. If empty, [const {{}}], then no selection is shown when the window does not have the [syscmd focus]. The [option -inactiveselectbackground] option has no effect on the [const Ttk] (themed) widgets [cmd [widget ttkEntryPlus]], [cmd [widget ttkSpinboxPlus]], and [cmd [widget ttkComboboxPlus]]. + +[tkoption_def [option -maxundo] maxUndo MaxUndo] +Specifies the maximum number of compound undo actions on the [term {undo stack}]. A zero or a negative value imply an unlimited [term {undo stack}]. + +[tkoption_def [option -undo] undo Undo] +Specifies a [term boolean] that says whether the undo mechanism is active or not. + +[list_end] + +[section COMMANDS] + +[list_begin definitions] + +[call [cmd widgetPlus::entryPlus] [opt [arg create]] [arg pathName]] + +Create an [cmd [widget entryPlus]] widget; or convert an existing [widget entry] widget into an [cmd [widget entryPlus]]. + +[call [cmd widgetPlus::spinboxPlus] [opt [arg create]] [arg pathName]] + +Create a [cmd [widget spinboxPlus]] widget; or convert an existing [widget spinbox] widget into a [cmd [widget spinboxPlus]]. + +[call [cmd widgetPlus::ttkEntryPlus] [opt [arg create]] [arg pathName]] + +Create a [cmd [widget ttkEntryPlus]] widget; or convert an existing [widget ttk::entry] widget into a [cmd [widget ttkEntryPlus]]. + +[call [cmd widgetPlus::ttkSpinboxPlus] [opt [arg create]] [arg pathName]] + +Create a [cmd [widget ttkSpinboxPlus]] widget; or convert an existing [widget ttk::spinbox] widget into a [cmd [widget ttkSpinboxPlus]]. + +[call [cmd widgetPlus::ttkComboboxPlus] [opt [arg create]] [arg pathName]] + +Create a [cmd [widget ttkComboboxPlus]] widget; or convert an existing [widget ttk::combobox] widget into a [cmd [widget ttkComboboxPlus]]. + +[call [cmd widgetPlus::EnableBWidget]] + +Enable [package widgetPlus] to modify [package BWidget] [syscmd [widget Entry]] widgets and their compounds (such as the [package BWidget] [syscmd [widget ComboBox]]). The command creates a bindtag [const BwEntryPlus] to replace the default bindtag [const BwEntry]. This operation is not performed when the package is loaded because it requires [package BWidget] to be loaded first. This command is not exported from namespace [namespace ::widgetPlus]. + + +[list_end] + +[section {WIDGET COMMANDS}] + +In addition to the usual commands of the [syscmd [widget entry]], [syscmd [widget spinbox]], [syscmd [widget ttk::entry]], [syscmd [widget ttk::spinbox]], and [syscmd [widget ttk::combobox]] widgets, the wrappers [cmd [widget entryPlus]], [cmd [widget ttkEntryPlus]], [cmd [widget spinboxPlus]], [cmd [widget ttkSpinboxPlus]], and [cmd [widget ttkComboboxPlus]] provide: + +[list_begin definitions] + +[call [arg pathName] [cmd edit] [opt [arg {arg arg ...}]]] + This command controls the undo mechanism and the [term {modified flag}]. The exact behavior of the command depends on the option argument that follows the edit argument. The following forms of the command are currently supported: + +[call [arg pathName] [cmd {edit canredo}]] + Returns a [term boolean] [const true] if redo is possible, i.e. when the [term {redo stack}] is not empty. Otherwise returns [const false]. + +[call [arg pathName] [cmd {edit canundo}]] + Returns a [term boolean] [const true] if undo is possible, i.e. when the [term {undo stack}] is not empty. Otherwise returns [const false]. + +[call [arg pathName] [cmd {edit modified}] [opt [arg boolean]]] + If [arg boolean] is not specified, returns the [term {modified flag}] of the widget. The [cmd insert], [cmd delete], [cmd {edit undo}] and [cmd {edit redo}] commands, or (by using this command) the user, can set or clear the [term {modified flag}]. If [arg boolean] is specified, sets the [term {modified flag}] of the widget to [arg boolean]. + +[call [arg pathName] [cmd {edit redo}]] + When the [option -undo] option is [const true], reapplies the last undone edits provided no other edits were done since then. Generates an error when the [term {redo stack}] is empty. Does nothing when the [option -undo] option is [const false]. + +[call [arg pathName] [cmd {edit reset}]] + Clears the [term {undo stack}] and [term {redo stack}]. + +[call [arg pathName] [cmd {edit separator}]] + Included for completeness, but has no effect. + + [para] + + (N.B. An implicit separator is added to the [term {undo stack}] for each call to a widget command (e.g. [cmd insert] or [cmd delete]) that changes the widget contents. These therefore separate the addition or removal of individual characters by typing, except that [term cut] or [term paste] operations are discrete.) +[comment { from text(n) + Inserts a separator (boundary) on the [term {undo stack}]. Does nothing when the [option -undo] option is [const false]. +}] + +[call [arg pathName] [cmd {edit undo}]] + Undoes the last edit action when the [option -undo] option is [const true]. An edit action is defined as a single [cmd insert] or [cmd delete] command that is recorded on the [term {undo stack}]. Generates an error when the [term {undo stack}] is empty. Does nothing when the [option -undo] option is [const false]. +[comment { from text(n) + Undoes the last edit action when the [option -undo] option is [const true]. An edit action is defined as all the [cmd insert] and [cmd delete] commands that are recorded on the [term {undo stack}] in between two separators. Generates an error when the [term {undo stack}] is empty. Does nothing when the [option -undo] option is [const false]. +}] + +[list_end] + +[section BINDINGS] +[subsection {Class Bindings}] + +The class binding tag for different widgets has these default values: + +[list_begin itemized] + +[item] [syscmd [widget entry]] uses [const Entry] +[item] [syscmd [widget spinbox]] uses [const Spinbox] +[item] [syscmd [widget ttk::entry]] uses [const TEntry] +[item] [syscmd [widget ttk::spinbox]] uses [const TSpinbox] +[item] [syscmd [widget ttk::combobox]] uses [const TCombobox] +[item] [cmd [widget entryPlus]] uses [const EntryPlus] +[item] [cmd [widget spinboxPlus]] uses [const SpinboxPlus] +[item] [cmd [widget ttkEntryPlus]] uses [const TEntryPlus] +[item] [cmd [widget ttkSpinboxPlus]] uses [const TSpinboxPlus] +[item] [cmd [widget ttkComboboxPlus]] uses [const TComboboxPlus] + +[list_end] + +[subsection {Undo and Redo}] + +The [const <>] and [const <>] virtual events are mapped to these keyboard events: + +[list_begin itemized] + +[item] On X11 systems (Linux[subst \u00ae], BSD[subst \u00ae], Solaris[subst \u00ae], etc): +[list_begin itemized][item][const <>] is mapped to [const ][list_end] +[list_begin itemized][item][const <>] is mapped to [const ][list_end] + +[item] On Windows[subst \u00ae] systems: +[list_begin itemized][item][const <>] is mapped to [const ][list_end] +[list_begin itemized][item][const <>] is mapped to [const ][list_end] + +[item] On Aqua[subst \u00ae] systems (i.e. Apple[subst \u00ae] macOS[subst \u00ae] or OS X[subst \u00ae]): +[list_begin itemized][item][const <>] is mapped to [const ][list_end] +[list_begin itemized][item][const <>] is mapped to [const ][list_end] + +[list_end] + + +[subsection EntryPlus] + +The [const EntryPlus] bindings are based on those of the [const Entry] bindtag, with these changes: + +[list_begin itemized] + +[item] New bindings to [const <>] and [const <>]. + +[item] An adjustment to the [const <>] binding, so that it behaves the same way on X11 as on other windowing systems (i.e. it deletes the existing selection, if any exists). + +[item] The removal of the antiquated [const ] binding. + +[item] New bindings to [const ] and [const ], to facilitate the implementation of the [option -inactiveselectbackground] option. + +[list_end] + +[subsection SpinboxPlus] + +The [const SpinboxPlus] bindings are based on those of the [const Spinbox] bindtag, with the same changes as are made when converting [const Entry] to [const EntryPlus]. + +[subsection TEntryPlus] + +The [const TEntryPlus] bindings are based on those of the [const TEntry] bindtag, with these changes: + +[list_begin itemized] + +[item] New bindings to [const <>] and [const <>]. + +[list_end] + +[subsection TSpinboxPlus] + +The [const TSpinboxPlus] bindings are based on those of the [const TSpinbox] bindtag, with these changes: + +[list_begin itemized] + +[item] New bindings to [const <>] and [const <>]. + +[list_end] + +[subsection TComboboxPlus] + +The [const TComboboxPlus] bindings are based on those of the [const TCombobox] bindtag, with these changes: + +[list_begin itemized] + +[item] New bindings to [const <>] and [const <>]. + +[list_end] + + +[section {VIRTUAL EVENT <>}] + +Each [package widgetPlus] widget generates a virtual event [const <>] whenever the value of its selection changes. This allows other [package Tcl] code, for example the package [package persistentSelection], to monitor the selection in these widgets. + +[section {USE WITH MEGAWIDGETS}] + +When an [syscmd [widget entry]], [syscmd [widget spinbox]], [syscmd [widget ttk::entry]], [syscmd [widget ttk::spinbox]], or [syscmd [widget ttk::combobox]] is a component of a megawidget, it is often possible to apply [package widgetPlus] to that component without modifying the megawidget code. + +[subsection {combobox (by Bryan Oakley)}] + +A [syscmd [widget combobox]] with path [const {$w}] includes an [syscmd [widget entry]] widget [const {$w.entry}], which uses the [const Entry] binding tag. Thus [package widgetPlus] can be applied to the [syscmd [widget combobox]] after creation, using the command (see [sectref EXAMPLES]) + +[example { +entryPlus $w.entry -undo 1 -maxundo 0 +}] + +[subsection {ComboBox (BWidget)}] + +A [package BWidget] [syscmd ComboBox] with path [const {$w}] includes an [syscmd [widget entry]] widget [const {$w.e}], which uses the [const BwEntry] binding tag in place of the default tag [const Entry]. + +[para] +Package [package widgetPlus] provides a replacement bindtag [const BwEntryPlus], but this is not computed when the package is loaded because it requires [package BWidget] to be loaded first. The command [cmd ::widgetPlus::EnableBWidget] must be called to provide [const BwEntryPlus], and then the [package BWidget] [syscmd ComboBox] can be modified (see [sectref EXAMPLES]) + +[example { +::widgetPlus::EnableBWidget +entryPlus $w.e -undo 1 -maxundo 0 +}] + + + +[section {TO DO}] + +[list_begin itemized] + +[item] Undo and Redo do not sync the value of the [term {modified flag}] - they always set the value to [term boolean] [const true]. +[item] Undo and Redo do not sync the position of the insertion cursor. +[item] The [const <>] event is not generated. +[item] Undo/Redo separators, and the [option -autoseparators] option, as found in the [syscmd [widget text]] widget, are not implemented. An implicit separator is added for each call to a widget command (e.g. [cmd insert] or [cmd delete]) that changes the widget contents. The [cmd {edit separator}] command has no effect. Separator functionality would be less useful for widgets such as [cmd [widget entryPlus]] than it is for a [syscmd [widget text]] widget. +[item] Add an [term overwrite] mode, toggled by [const ] on non-macOS[subst \u00ae] systems. + +[list_end] + +[section BUGS] + +This version of [package widgetPlus] is intended to be compatible with all releases of [package Tk] 8.5 and 8.6, and with the branches [emph core-8-5-branch], [emph core-8-6-branch], and [emph trunk] in the source code repository for [package Tk]. Any incompatibility with any of these versions, for any [package Tk] windowing system, should be reported as a bug. Please report such in the category [emph widgetPlus] of the [uri http://core.tcl.tk/tklib/reportlist {Tklib Trackers}]. + +[section EXAMPLES] + +To create and map an [cmd [widget entryPlus]] widget .ep with an unlimited Undo/Redo stack: +[example { +package require widgetPlus +widgetPlus::entryPlus .ep -undo 1 -maxundo 0 +pack .ep +}] + +The same but using [syscmd {namespace import}]: +[example { +package require widgetPlus +namespace import widgetPlus::* +entryPlus .ep -undo 1 -maxundo 0 +pack .ep +}] + +To convert an existing [syscmd [widget entry]] widget .ee into an [cmd [widget entryPlus]] with an unlimited Undo/Redo stack: +[example { +entry .ee + + . + . + . + +package require widgetPlus +widgetPlus::entryPlus .ee -undo 1 -maxundo 0 +}] + +The same but using [syscmd {namespace import}]: +[example { +entry .ee + + . + . + . + +package require widgetPlus +namespace import widgetPlus::* +entryPlus .ee -undo 1 -maxundo 0 +}] + +Apply [package widgetPlus] to a Bryan Oakley [syscmd [widget combobox]]: +[example { +package require combobox +combobox::combobox .cb + + . + . + . + +package require widgetPlus +namespace import widgetPlus::* +entryPlus .cb.entry -undo 1 -maxundo 0 +}] + +Apply [package widgetPlus] to a [package BWidget] [syscmd [widget ComboBox]]. The command [cmd ::widgetPlus::EnableBWidget] must be called first. +[example { +package require BWidget +ComboBox .cb + + . + . + . + +package require widgetPlus +::widgetPlus::EnableBWidget +namespace import widgetPlus::* + +entryPlus .cb.e -undo 1 -maxundo 0 +}] + +[see_also entry spinbox ttk::entry ttk::spinbox ttk::combobox text persistentSelection BWidget ComboBox Entry] +[manpage_end] diff --git a/modules/widgetPlus/widgetPlus.tcl b/modules/widgetPlus/widgetPlus.tcl new file mode 100644 index 00000000..d9d998fb --- /dev/null +++ b/modules/widgetPlus/widgetPlus.tcl @@ -0,0 +1,1673 @@ +# ------------------------------------------------------------------------------ +# FILE: +# widgetPlus-*.dmw, widgetPlus-*.tm +# +# DESCRIPTION: +# Module to provide enhancements to entry, spinbox, ttk::entry, +# ttk::spinbox, and ttk::combobox widgets, with Undo/Redo, <>, +# -inactiveselectbackground and improved bindings. +# +# LICENCE: +# Copyright (C) 2015-2018 Keith Nash. +# This file is part of Tklib and may be used subject to the terms in +# file license.terms; please note in particular the terms repeated here: +# +# IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +# ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +# DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +# IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +# NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +# MODIFICATIONS. +# +# ------------------------------------------------------------------------------ +# One line exceeds 80 columns, for clarity. +# Conventional use of namespace/package names. +# Defines bindtags EntryPlus, SpinboxPlus, TEntryPlus, TSpinboxPlus, +# TComboboxPlus, and BwEntryPlus. +# Docs are in "man n widgetPlus". + +package require Tk +package require snit + +namespace eval ::widgetPlus { + variable BWidgetEnabled 0 + namespace export entryPlus spinboxPlus + namespace export ttkEntryPlus ttkSpinboxPlus ttkComboboxPlus +} + + +# ------------------------------------------------------------------------------ +# Commands ::widgetPlus::entryPlus ::widgetPlus::spinboxPlus +# ::widgetPlus::ttkEntryPlus ::widgetPlus::ttkSpinboxPlus +# ::widgetPlus::ttkComboboxPlus +# ------------------------------------------------------------------------------ +# Commands for objects ::widgetPlus::entryPlus etc. +# These simple wrapper commands allow most of the code to be held in a common +# object, ::widgetPlus::WidgetPlusPrivateCore. +# +# It is a pity not to use snit::widgetadaptor wrappers for +# ::widgetPlus::WidgetPlusPrivateCore, but they do give more obscure error +# messages, chiefly by using "::hull2.e" not ".e" in the message text. This +# change causes 20 more (harmless) test failures in entryPlus.test. +# +# A downside to these simple wrappers is that, while the Snit typemethod +# widgetPlus::entryPlus info instances +# works, it is really an alias to +# widgetPlus::WidgetPlusPrivateCore info instances +# and so it includes "types" such as widgetPlus::spinboxPlus as well as +# widgetPlus::entryPlus. +# ------------------------------------------------------------------------------ + +proc ::widgetPlus::entryPlus {args} { + set sub [lindex $args 0] + set lenny [llength $args] + if {($sub eq {create}) && ($lenny > 1)} { + set win [lindex $args 1] + set args [lrange $args 2 end] + } elseif {[string index $sub 0] eq {.}} { + set win $sub + set args [lrange $args 1 end] + } elseif {$lenny == 0} { + set msg {wrong # args: } + append msg {should be "entryPlus pathName ?-option value ...?"} + return -code error $msg + } else { + # A typemethod. + return [::widgetPlus::WidgetPlusPrivateCore {*}$args] + } + ::widgetPlus::WidgetPlusPrivateCore create $win entry {*}$args +} + +proc ::widgetPlus::spinboxPlus {args} { + set sub [lindex $args 0] + set lenny [llength $args] + if {($sub eq {create}) && ($lenny > 1)} { + set win [lindex $args 1] + set args [lrange $args 2 end] + } elseif {[string index $sub 0] eq {.}} { + set win $sub + set args [lrange $args 1 end] + } elseif {$lenny == 0} { + set msg {wrong # args: } + append msg {should be "spinboxPlus pathName ?-option value ...?"} + return -code error $msg + } else { + # A typemethod. + return [::widgetPlus::WidgetPlusPrivateCore {*}$args] + } + ::widgetPlus::WidgetPlusPrivateCore create $win spinbox {*}$args +} + +proc ::widgetPlus::ttkEntryPlus {args} { + set sub [lindex $args 0] + set lenny [llength $args] + if {($sub eq {create}) && ($lenny > 1)} { + set win [lindex $args 1] + set args [lrange $args 2 end] + } elseif {[string index $sub 0] eq {.}} { + set win $sub + set args [lrange $args 1 end] + } elseif {$lenny == 0} { + set msg {wrong # args: } + append msg {should be "ttkEntryPlus pathName ?-option value ...?"} + return -code error $msg + } else { + # A typemethod. + return [::widgetPlus::WidgetPlusPrivateCore {*}$args] + } + ::widgetPlus::WidgetPlusPrivateCore create $win ttk::entry {*}$args +} + +proc ::widgetPlus::ttkSpinboxPlus {args} { + set sub [lindex $args 0] + set lenny [llength $args] + if {($sub eq {create}) && ($lenny > 1)} { + set win [lindex $args 1] + set args [lrange $args 2 end] + } elseif {[string index $sub 0] eq {.}} { + set win $sub + set args [lrange $args 1 end] + } elseif {$lenny == 0} { + set msg {wrong # args: } + append msg {should be "ttkSpinboxPlus pathName ?-option value ...?"} + return -code error $msg + } else { + # A typemethod. + return [::widgetPlus::WidgetPlusPrivateCore {*}$args] + } + ::widgetPlus::WidgetPlusPrivateCore create $win ttk::spinbox {*}$args +} + +proc ::widgetPlus::ttkComboboxPlus {args} { + set sub [lindex $args 0] + set lenny [llength $args] + if {($sub eq {create}) && ($lenny > 1)} { + set win [lindex $args 1] + set args [lrange $args 2 end] + } elseif {[string index $sub 0] eq {.}} { + set win $sub + set args [lrange $args 1 end] + } elseif {$lenny == 0} { + set msg {wrong # args: } + append msg {should be "ttkComboboxPlus pathName ?-option value ...?"} + return -code error $msg + } else { + # A typemethod. + return [::widgetPlus::WidgetPlusPrivateCore {*}$args] + } + ::widgetPlus::WidgetPlusPrivateCore create $win ttk::combobox {*}$args +} + + +# ------------------------------------------------------------------------------ +# Proc ::widgetPlus::replaceBindtag +# ------------------------------------------------------------------------------ +# Command to remove a specific bindtag on a window, and replace it with 0 or +# more others. +# ------------------------------------------------------------------------------ + +proc ::widgetPlus::replaceBindtag {w OldTag args} { + set pos [lsearch -exact [bindtags $w] $OldTag] + if {$pos == -1} { + return 0 + } else { + bindtags $w [lreplace [bindtags $w] $pos $pos {*}$args] + return 1 + } +} + + +# ------------------------------------------------------------------------------ +# Proc ::widgetPlus::copyBindtag +# ------------------------------------------------------------------------------ +# Command to copy all the bindings from one bindtag to another. +# ------------------------------------------------------------------------------ + +proc ::widgetPlus::copyBindtag {from to} { + foreach binding [bind $from] { + bind $to $binding [bind $from $binding] + } + return +} + + +# ------------------------------------------------------------------------------ +# Bindtag EntryPlus (replaces bindtag Entry for widget entry) +# ------------------------------------------------------------------------------ +# Cf. bindtag Entry defined in Tk file library/entry.tcl. +# +# Copy the bindings at run time from Entry to EntryPlus. Replace some bindings +# and add new ones. Define in this file all the commands used by the +# replacement bindings, so that the bindings are resilient against changes in +# Tk file library/entry.tcl. +# ------------------------------------------------------------------------------ + +# ------------------------------------------------------------------------------ +# (1) Copy all bindings from Entry to EntryPlus +# ------------------------------------------------------------------------------ + +# Ensure entry.tcl has been sourced. +catch ::tk::EntryPaste + +::widgetPlus::copyBindtag Entry EntryPlus + + +# ------------------------------------------------------------------------------ +# (2) Replace two bindings copied from bindtag Entry. +# ------------------------------------------------------------------------------ + +# Give x11 the same behavior as other windowing systems. + +bind EntryPlus <> { + catch { + if {[tk windowingsystem] ne "x11TheOldFashionedWay"} { + catch { + %W delete sel.first sel.last + } + } + %W insert insert [::widgetPlus::GetSelection %W CLIPBOARD] + widgetPlus::EntrySeeInsert %W + } +} + +# Remove this antiquated binding (which inserts text from the PRIMARY +# selection, on windowing systems other than win32). + +bind EntryPlus {# nothing} + + +# ------------------------------------------------------------------------------ +# (2a) Define the commands used by the bindings (2), so they are resilient +# against any incompatible revisions to library/entry.tcl. +# ------------------------------------------------------------------------------ + +# ::widgetPlus::EntrySeeInsert -- copy of ::tk::EntrySeeInsert +# Make sure that the insertion cursor is visible in the entry window. +# If not, adjust the view so that it is. +# +# Arguments: +# w - The entry window. + +proc ::widgetPlus::EntrySeeInsert w { + set c [$w index insert] + if {($c < [$w index @0]) || ($c > [$w index @[winfo width $w]])} { + $w xview $c + } +} + +# ::widgetPlus::GetSelection -- copy of ::tk::GetSelection +# This tries to obtain the default selection. On Unix, we first try +# and get a UTF8_STRING, a type supported by modern Unix apps for +# passing Unicode data safely. We fall back on the default STRING +# type otherwise. On Windows, only the STRING type is necessary. +# Arguments: +# w The widget for which the selection will be retrieved. +# Important for the -displayof property. +# sel The source of the selection (PRIMARY or CLIPBOARD) +# Results: +# Returns the selection, or an error if none could be found +# +if {[tk windowingsystem] ne "win32"} { + proc ::widgetPlus::GetSelection {w {sel PRIMARY}} { + if {[catch { + selection get -displayof $w -selection $sel -type UTF8_STRING + } txt] && [catch { + selection get -displayof $w -selection $sel + } txt]} then { + return -code error -errorcode {TK SELECTION NONE} \ + "could not find default selection" + } else { + return $txt + } + } +} else { + proc ::widgetPlus::GetSelection {w {sel PRIMARY}} { + if {[catch { + selection get -displayof $w -selection $sel + } txt]} then { + return -code error -errorcode {TK SELECTION NONE} \ + "could not find default selection" + } else { + return $txt + } + } +} + +# ------------------------------------------------------------------------------ +# (3) Add new bindings that depend on widgetPlus commands. +# ------------------------------------------------------------------------------ + +bind EntryPlus <> { + if {![catch { %W edit undo }]} { + # Cancel the selection so that Undo does not mess it up. + %W selection clear + } +} + +bind EntryPlus <> { + if {![catch { %W edit redo }]} { + # Cancel the selection so that Redo does not mess it up. + %W selection clear + } +} + +# These bindings let the widgetPlus have option -inactiveselectbackground as +# well as -selectbackground. + +bind EntryPlus { + %W SelectColorIn +} + +bind EntryPlus { + %W SelectColorOut +} + + +# ------------------------------------------------------------------------------ +# Proc ::widgetPlus::EnableBWidget +# ------------------------------------------------------------------------------ +# Command to check that BWidget Entry is available, and then copy and modify its +# bindtag BwEntry to BwEntryPlus. +# ------------------------------------------------------------------------------ + +proc ::widgetPlus::EnableBWidget {} { + variable BWidgetEnabled + + if {[catch {package present BWidget}]} { + # Do not load BWidget here - it is clearer if the caller does this. + return -code error {package BWidget has not been loaded} + } + + # Ensure bwidget-${ver}/entry.tcl has been sourced. + catch ::Entry + + EnablePrivateCommand + set BWidgetEnabled 1 + + return +} + + +# ------------------------------------------------------------------------------ +# Proc ::widgetPlus::EnableSlab +# ------------------------------------------------------------------------------ +# Command to check that Slab::Entry is available, and then copy and modify its +# bindtag BwEntry to BwEntryPlus. +# +# Slab and BWidget use identical bindings. This may change in future. +# ------------------------------------------------------------------------------ + +proc ::widgetPlus::EnableSlab {} { + variable BWidgetEnabled + + if {[catch {package present Slab}]} { + # Do not load Slab here - it is clearer if this is done by the caller. + return -code error {package Slab has not been loaded} + } + + # Ensure module Slab::Entry has been sourced. + catch ::Slab::Entry + + EnablePrivateCommand + set BWidgetEnabled 1 + + return +} + + +proc ::widgetPlus::EnablePrivateCommand {} { +#indent-4 + +# ------------------------------------------------------------------------------ +# Bindtag BwEntryPlus (replaces bindtag BwEntry for BWidget's Entry widget) +# ------------------------------------------------------------------------------ +# Cf. bindtag BwEntry defined in BWidget file library/entry.tcl. +# +# Copy the bindings at run time from BwEntry to BwEntryPlus. Replace some +# bindings and add new ones. Define in this file all the commands used by the +# replacement bindings, so that the bindings are resilient against changes in +# BWidget file bwidget-${ver}/entry.tcl. +# ------------------------------------------------------------------------------ + +# ------------------------------------------------------------------------------ +# (1) Copy all bindings from BwEntry to BwEntryPlus +# ------------------------------------------------------------------------------ + +::widgetPlus::copyBindtag BwEntry BwEntryPlus + + +# ------------------------------------------------------------------------------ +# (2) Replace two bindings copied from bindtag BwEntry. +# ------------------------------------------------------------------------------ + +# Give x11 the same behavior as other windowing systems. + +bind BwEntryPlus <> { + catch { + if {[tk windowingsystem] ne "x11TheOldFashionedWay"} { + catch { + %W delete sel.first sel.last + } + } + %W insert insert [::widgetPlus::GetSelection %W CLIPBOARD] + widgetPlus::EntrySeeInsert %W + } +} + +# Remove this antiquated binding (which inserts text from the PRIMARY +# selection, on windowing systems other than win32). + +bind BwEntryPlus {# nothing} + + +# ------------------------------------------------------------------------------ +# (3) Add new bindings that depend on widgetPlus commands. +# ------------------------------------------------------------------------------ + +bind BwEntryPlus <> { + if {![catch { %W edit undo }]} { + # Cancel the selection so that Undo does not mess it up. + %W selection clear + } +} + +bind BwEntryPlus <> { + if {![catch { %W edit redo }]} { + # Cancel the selection so that Redo does not mess it up. + %W selection clear + } +} + +# These bindings let the widgetPlus have option -inactiveselectbackground as +# well as -selectbackground. + +bind BwEntryPlus { + %W SelectColorIn +} + +bind BwEntryPlus { + %W SelectColorOut +} + +return + +#indent_4 +} + + +# ------------------------------------------------------------------------------ +# Bindtag SpinboxPlus (replaces bindtag Spinbox for widget spinbox) +# ------------------------------------------------------------------------------ +# Cf. bindtag Spinbox defined in Tk file library/spinbox.tcl. +# +# Copy the bindings at run time from Spinbox to SpinboxPlus. Replace some +# bindings and add new ones. Define in this file all the commands used by the +# replacement bindings, so that the bindings are resilient against changes in +# Tk files library/entry.tcl and library/spinbox.tcl. +# ------------------------------------------------------------------------------ + +# ------------------------------------------------------------------------------ +# (1) Copy all bindings from Spinbox to SpinboxPlus +# ------------------------------------------------------------------------------ + +# Ensure entry.tcl and spinbox.tcl have been sourced. +namespace eval ::tk::spinbox {} +catch ::tk::EntryPaste +catch ::tk::spinbox::Paste + +::widgetPlus::copyBindtag Spinbox SpinboxPlus + + +# ------------------------------------------------------------------------------ +# (2) Replace two bindings copied from bindtag TEntry. +# ------------------------------------------------------------------------------ + +bind SpinboxPlus {# nothing} + +bind SpinboxPlus <> { + catch { + if {[tk windowingsystem] ne "x11TheOldFashionedWay"} { + catch { + %W delete sel.first sel.last + } + } + %W insert insert [::widgetPlus::GetSelection %W CLIPBOARD] + ::widgetPlus::EntrySeeInsert %W + } +} + + +# ------------------------------------------------------------------------------ +# (2a) Define the commands used by the bindings (2), so they are resilient +# against any incompatible revisions to library/spinbox.tcl. +# ------------------------------------------------------------------------------ + +# ::widgetPlus::SpinboxPaste -- copy of ::tk::spinbox::Paste +# This procedure sets the insertion cursor to the current mouse position, +# pastes the selection there, and sets the focus to the window. +# +# Arguments: +# w - The spinbox window. +# x - X position of the mouse. + +proc ::widgetPlus::SpinboxPaste {w x} { + $w icursor [::widgetPlus::SpinboxClosestGap $w $x] + catch {$w insert insert [::widgetPlus::GetSelection $w PRIMARY]} + if {"disabled" eq [$w cget -state]} { + focus $w + } +} + + +# ::widgetPlus::SpinboxClosestGap -- copy of ::tk::spinbox::ClosestGap +# Given x and y coordinates, this procedure finds the closest boundary +# between characters to the given coordinates and returns the index +# of the character just after the boundary. +# +# Arguments: +# w - The spinbox window. +# x - X-coordinate within the window. + +proc ::widgetPlus::SpinboxClosestGap {w x} { + set pos [$w index @$x] + set bbox [$w bbox $pos] + if {($x - [lindex $bbox 0]) < ([lindex $bbox 2]/2)} { + return $pos + } + incr pos +} + + +# ------------------------------------------------------------------------------ +# (3) Add new bindings that depend on widgetPlus commands. +# ------------------------------------------------------------------------------ + +bind SpinboxPlus <> { + if {![catch { %W edit undo }]} { + # Cancel the selection so that Undo does not mess it up. + %W selection clear + } +} + +bind SpinboxPlus <> { + if {![catch { %W edit redo }]} { + # Cancel the selection so that Redo does not mess it up. + %W selection clear + } +} + +# These bindings let the widgetPlus have option -inactiveselectbackground as +# well as -selectbackground. + +bind SpinboxPlus { + %W SelectColorIn +} + +bind SpinboxPlus { + %W SelectColorOut +} + + +# ------------------------------------------------------------------------------ +# Bindtag TEntryPlus (replaces bindtag TEntry for widget ttk::entry) +# ------------------------------------------------------------------------------ +# Cf. bindtag TEntry defined in Tk file library/ttk/entry.tcl. +# +# Copy the bindings at run time from TEntry to TEntryPlus. Replace some +# bindings and add new ones. Define in this file all the commands used by the +# replacement bindings, so that the bindings are resilient against changes in +# Tk file library/ttk/entry.tcl. +# ------------------------------------------------------------------------------ + +# ------------------------------------------------------------------------------ +# (1) Copy all bindings from TEntry to TEntryPlus +# ------------------------------------------------------------------------------ + +# File tk.tcl automatically sources ttk/ttk.tcl which sources all ttk files. + +::widgetPlus::copyBindtag TEntry TEntryPlus + + +# ------------------------------------------------------------------------------ +# (2) Replace no bindings copied from bindtag TEntry. +# ------------------------------------------------------------------------------ + + +# ------------------------------------------------------------------------------ +# (3) Add new bindings that depend on widgetPlus commands. +# ------------------------------------------------------------------------------ + +bind TEntryPlus <> { + if {![catch { %W edit undo }]} { + # Cancel the selection so that Undo does not mess it up. + %W selection clear + } +} + +bind TEntryPlus <> { + if {![catch { %W edit redo }]} { + # Cancel the selection so that Redo does not mess it up. + %W selection clear + } +} + + +# ------------------------------------------------------------------------------ +# Bindtag TSpinboxPlus (replaces bindtag TSpinbox for widget ttk::spinbox) +# ------------------------------------------------------------------------------ +# Cf. bindtag TSpinbox defined in Tk file library/ttk/spinbox.tcl. +# +# Copy the bindings at run time from TSpinbox to TSpinboxPlus. Replace some +# bindings and add new ones. Define in this file all the commands used by the +# replacement bindings, so that the bindings are resilient against changes in +# Tk files library/ttk/entry.tcl and library/ttk/spinbox.tcl. +# ------------------------------------------------------------------------------ + +# ------------------------------------------------------------------------------ +# (1) Copy all bindings from TSpinbox to TSpinboxPlus +# ------------------------------------------------------------------------------ +# (TSpinbox is itself copied with revisions from TEntry.) + +# File tk.tcl automatically sources ttk/ttk.tcl which sources all ttk files. + +::widgetPlus::copyBindtag TSpinbox TSpinboxPlus + + +# ------------------------------------------------------------------------------ +# (2) Replace no bindings copied from bindtag TSpinbox. +# ------------------------------------------------------------------------------ + + +# ------------------------------------------------------------------------------ +# (3) Add new bindings that depend on widgetPlus commands. +# ------------------------------------------------------------------------------ + +bind TSpinboxPlus <> { + if {![catch { %W edit undo }]} { + # Cancel the selection so that Undo does not mess it up. + %W selection clear + } +} + +bind TSpinboxPlus <> { + if {![catch { %W edit redo }]} { + # Cancel the selection so that Redo does not mess it up. + %W selection clear + } +} + + +# ------------------------------------------------------------------------------ +# Bindtag TComboboxPlus (replaces bindtag TCombobox for widget ttk::combobox) +# ------------------------------------------------------------------------------ +# Cf. bindtag TCombobox defined in Tk file library/ttk/combobox.tcl. +# +# Copy the bindings at run time from TCombobox to TComboboxPlus. Replace some +# bindings and add new ones. Define in this file all the commands used by the +# replacement bindings, so that the bindings are resilient against changes in +# Tk files library/ttk/entry.tcl and library/ttk/combobox.tcl. +# ------------------------------------------------------------------------------ + +# ------------------------------------------------------------------------------ +# (1) Copy all bindings from TCombobox to TComboboxPlus +# ------------------------------------------------------------------------------ +# (TCombobox is itself copied with revisions from TEntry.) + +# File tk.tcl automatically sources ttk/ttk.tcl which sources all ttk files. + +::widgetPlus::copyBindtag TCombobox TComboboxPlus + + +# ------------------------------------------------------------------------------ +# (2) Replace no bindings copied from bindtag TCombobox. +# ------------------------------------------------------------------------------ + + +# ------------------------------------------------------------------------------ +# (3) Add new bindings that depend on widgetPlus commands. +# ------------------------------------------------------------------------------ + +bind TComboboxPlus <> { + if {![catch { %W edit undo }]} { + # Cancel the selection so that Undo does not mess it up. + %W selection clear + } +} + +bind TComboboxPlus <> { + if {![catch { %W edit redo }]} { + # Cancel the selection so that Redo does not mess it up. + %W selection clear + } +} + + +# ------------------------------------------------------------------------------ +# Object widgetPlus::color +# ------------------------------------------------------------------------------ +# A Snit validation type for a Tk color. +# Use "-strict 0" for cases where the acceptable value is a color or {}. +# ------------------------------------------------------------------------------ + +snit::type widgetPlus::color { + option -strict -type snit::boolean -default 1 + + typemethod validate {value} { + if {[catch {winfo rgb . $value} color]} { + set msg "unknown color name \"$value\"" + return -code error -errorcode INVALID $msg + } + return $value + } + + constructor {args} { + $self configurelist $args + return + } + + method validate {value} { + if {($value eq {}) && (!$options(-strict))} { + return {} + } + + $type validate $value + } +} + + +# ------------------------------------------------------------------------------ +# Object ::widgetPlus::WidgetPlusPrivateCore +# ------------------------------------------------------------------------------ +# This object forms the core of ::widgetPlus::entryPlus etc. Its existence +# avoids the quintuplication of most of its code. +# ------------------------------------------------------------------------------ + +snit::widgetadaptor ::widgetPlus::WidgetPlusPrivateCore { +#indent-4 + +variable My -array { + ,list {{}} + ,pointer 0 + ,modified 0 + ,trace {} + ,oldValue {} +} + +option {-undo undo Undo} \ + -default 1 \ + -type snit::boolean \ + -configuremethod SetOption + +option {-maxundo maxUndo MaxUndo} \ + -default 0 \ + -type snit::integer + +option {-selectbackground selectBackground Foreground} \ + -default #418bd4 \ + -type widgetPlus::color \ + -configuremethod SetOption + +option {-inactiveselectbackground inactiveSelectBackground Foreground} \ + -default #c3c3c3 \ + -type {widgetPlus::color -strict 0} \ + -configuremethod SetOption + +option {-textvariable textVariable Variable} \ + -default {} \ + -configuremethod SetOption + +delegate option * to hull +delegate method * to hull + + +typevariable Our -array { + ,classList {entry ttk::entry spinbox ttk::spinbox ttk::combobox} + ,themedClassList {ttk::entry ttk::spinbox ttk::combobox} + ,c2t { + Entry entry + TEntry ttk::entry + Spinbox spinbox + TSpinbox ttk::spinbox + TCombobox ttk::combobox + } +} + +variable My -array { + ,type {} +} + + +# ------------------------------------------------------------------------------ +# Constructor +# ------------------------------------------------------------------------------ +# The command can be run regardless of whether the entry, spinbox, ttk::entry, +# ttk::spinbox, or ttk::combobox widget has already been created. +# +# Note the first argument "kind", which is the name of the widget to be used as +# the hull. This argument is provided by the wrapper commands +# ::widgetPlus::entryPlus etc, and is not visible to end users. +# ------------------------------------------------------------------------------ + +constructor {kind args} { + if {$kind ni $Our(,classList)} { + set msg "argument \"kind\" must be one of entry,\ + spinbox, ttk::entry, ttk::spinbox, or ttk::combobox" + return -code error $msg + } + if {$kind eq {entry}} { + set ia an + } else { + set ia a + } + + set My(,type) $kind + + # When the hull is fed options one at a time, it raises an error if it gets + # an incompatible combination (e.g. spinbox -from and -to). To avoid this, + # organise the arguments here and pass them to the hull in one command. + set hullOpts $args + set selfOpts {} + foreach key { + -undo + -maxundo + -selectbackground + -inactiveselectbackground + -textvariable + } { + dict unset hullOpts $key + if {[dict exists $args $key]} { + dict set selfOpts $key [dict get $args $key] + } + } + + if {[winfo exists $win]} { + # Use an existing widget as the hull, if it is "suitable", i.e. + # - It must be an entry, spinbox, ttk::entry, ttk::spinbox, or + # ttk::combobox widget + # - Its "type" must agree with that specified by argument "kind" + # - It must not already be wrapped by widgetPlus::WidgetPlusPrivateCore + + if {![dict exists $Our(,c2t) [winfo class $win]]} { + set msg "window $win already exists, but it is not $ia $My(,type)" + return -code error $msg + + } elseif {[dict get $Our(,c2t) [winfo class $win]] ne $My(,type)} { + set msg "window $win already exists, but it is not $ia $My(,type)" + return -code error $msg + + } elseif {![catch {$win EntryPlusCanary}]} { + set msg "window $win already exists, but it is\ + already wrapped by widgetPlus" + return -code error $msg + + } else { + installhull $win + if {![$self IsThemed]} { + $self configure -selectbackground [$hull cget -selectbackground] + } + $self configure -textvariable [$hull cget -textvariable] + $hull configure {*}$hullOpts + } + } else { + # Create a new widget for the hull. + installhull using $My(,type) {*}$hullOpts + } + + $self configurelist $selfOpts + # Options -selectbackground, -inactiveselectbackground have no effect + # if the widget is themed, and they do not propagate to the hull. + + set tag [winfo class $win] + ::widgetPlus::replaceBindtag $win $tag ${tag}Plus + if {($tag eq {Entry}) && ($::widgetPlus::BWidgetEnabled)} { + ::widgetPlus::replaceBindtag $win BwEntry BwEntryPlus + } + + if {[focus -displayof $win] eq $win} { + $self SelectColorIn + } else { + $self SelectColorOut + } + + return SET_BY_SNIT +} + + +# ------------------------------------------------------------------------------ +# Destructor +# ------------------------------------------------------------------------------ + +destructor { + set cb [mymethod TextVarTracer] + set val $options(-textvariable) + if {$val ne {}} { + namespace eval :: [list trace remove variable $val {write unset} $cb] + } + return +} + + +# ------------------------------------------------------------------------------ +# Method EntryPlusCanary +# ------------------------------------------------------------------------------ +# The existence of this method indicates that this is a +# widgetPlus::WidgetPlusPrivateCore widget. +# It is called by the constructor to test that a +# widgetPlus::WidgetPlusPrivateCore widget does not use another +# widgetPlus::WidgetPlusPrivateCore as its hull. +# ------------------------------------------------------------------------------ + +method EntryPlusCanary {} { + return +} + + +# ------------------------------------------------------------------------------ +# Method SetOption +# ------------------------------------------------------------------------------ +# Snit configuremethod for options -selectbackground -inactiveselectbackground. +# ------------------------------------------------------------------------------ + +method SetOption {opt val} { + if {$opt ni {-selectbackground -inactiveselectbackground + -textvariable -undo} + } { + return -code error {argument "opt" must be -selectbackground,\ + -inactiveselectbackground, -textvariable, or -undo} + } + + set oldVal $options($opt) + set options($opt) $val + + if 0 { + } elseif { ($opt eq {-selectbackground}) + && ([focus -displayof $win] eq $win) + } { + $self SelectColorIn + + } elseif { ($opt eq {-inactiveselectbackground}) + && ([focus -displayof $win] ne $win) + } { + $self SelectColorOut + + } elseif { ($opt eq {-textvariable}) && ($val ne $oldVal)} { + set cb [mymethod TextVarTracer] + if {$oldVal ne {}} { + namespace eval :: [list trace remove variable $oldVal {write unset} $cb] + } else { + } + + set ClearOldVal 1 + if {$val ne {}} { + namespace eval :: [list trace add variable $val {write unset} $cb] + + # If the variable's val is defined, this will fire the trace and + # will call Push and set My(,oldValue). + catch { + set ValueOfVar [namespace eval :: [list set $val]] + namespace eval :: [list set $val $ValueOfVar] + set ClearOldVal 0 + } + } else { + } + + # Either -textvariable is {}, or the variable has not been set. + if {$ClearOldVal} { + $self Push {} + set My(,oldValue) {} + } else { + } + + $hull configure -textvariable $val + + } elseif {($opt eq {-undo}) && ($val ne $oldVal)} { + # On a change of value, start the undo/redo stack from scratch. + $self edit reset + + } else { + } + + return +} + + +# ------------------------------------------------------------------------------ +# Method TextVarTracer +# ------------------------------------------------------------------------------ +# This command is bound to a trace on the -textvariable, and is called whenever +# that variable is set or unset. +# - When -textvariable is not {}, it is the name of a global variable. A trace +# on writing or unsetting that variable will monitor all changes to the text +# displayed in the widget: both changes made when the script modifiies the +# value of the global variable; and changes made by the "insert" and "delete" +# methods (and thus, via bindings, by the GUI user), which Tk also applies to +# the global variable. There is no need for separate monitoring of changes +# made by "insert" or "replace". +# - When -textvariable is {}, there is no "textvariable". Changes made by +# "insert" or "delete" are monitored by code in those methods. +# ------------------------------------------------------------------------------ + +method TextVarTracer {name1 name2 op} { + if {$op eq "write"} { + set oldVal $My(,oldValue) + set newVal [namespace eval :: [list set $options(-textvariable)]] + set My(,oldValue) $newVal + if {$newVal ne $oldVal} { + set My(,modified) 1 + $self Push $newVal + } else { + } + } elseif {$op eq "unset"} { + # The trace is removed when the variable is unset. + # Re-add the trace. + set cb [mymethod TextVarTracer] + set val $options(-textvariable) + namespace eval :: [list trace add variable $val {write unset} $cb] + # The entry widget retains the last value of the unset -textvariable. + # Leave the Undo/Redo stack and My(,oldValue) unchanged. + } + return +} + + +# ------------------------------------------------------------------------------ +# Method SetTextSilently +# ------------------------------------------------------------------------------ +# Command to set widget text without invoking the trace on the -textvariable. +# ------------------------------------------------------------------------------ + +method SetTextSilently {txt} { + set cb [mymethod TextVarTracer] + set val $options(-textvariable) + + if {$val ne {}} { + namespace eval :: [list trace remove variable $val {write unset} $cb] + } + + $hull delete 0 end + $hull insert 0 $txt + + if {$val ne {}} { + namespace eval :: [list trace add variable $val {write unset} $cb] + } + return +} + + +# ------------------------------------------------------------------------------ +# Method IsThemed +# ------------------------------------------------------------------------------ +# Command to return a boolean value, true iff the widget is themed (Ttk). +# ------------------------------------------------------------------------------ + +method IsThemed {} { + expr {$My(,type) in $Our(,themedClassList)} +} + + +# ------------------------------------------------------------------------------ +# Method SelectColorIn +# ------------------------------------------------------------------------------ +# Command to set the hull's -selectbackground to the widget's -selectbackground. +# +# The command is called: +# 1. when the widget acquires focus +# 2. when the value of -selectbackground is changed while the widget has focus +# 3. at construction if the widget has focus +# ------------------------------------------------------------------------------ + +method SelectColorIn {} { + if {![$self IsThemed]} { + $hull configure -selectbackground [$self cget -selectbackground] + } + return +} + + +# ------------------------------------------------------------------------------ +# Method SelectColorOut +# ------------------------------------------------------------------------------ +# Command to set the hull's -selectbackground to the widget's +# -inactiveselectbackground. +# +# The command is called: +# 1. when the widget loses focus +# 2. when the value of -inactiveselectbackground is changed while the widget +# does not have focus +# 3. at construction if the widget does not have focus +# ------------------------------------------------------------------------------ + +method SelectColorOut {} { + if {![$self IsThemed]} { + set col [$self cget -inactiveselectbackground] + if {$col eq {}} { + set col [$self cget -background] + } + $hull configure -selectbackground $col + } + return +} + + +# ------------------------------------------------------------------------------ +# Method FullSelection +# ------------------------------------------------------------------------------ +# Command to return the selection in the widget, or {} if none exists. +# ------------------------------------------------------------------------------ + +method FullSelection {} { + set content {} + catch { + set from [$hull index sel.first] + set to [$hull index sel.last] + set content [string range [$hull get] $from $to] + } + return $content +} + + +# ------------------------------------------------------------------------------ +# Method invoke (spinbox only) +# ------------------------------------------------------------------------------ +# Command to wrap the hull method and also: +# 1. copy the widget text, if changed, to the Undo/Redo stack. +# 2. generate a <> event if the selection is changed. +# ------------------------------------------------------------------------------ + +method invoke {element} { + if {$My(,type) ne {spinbox}} { + $hull invoke {*}$args + # The line above will cause an error return. Just make sure ... + set msg "bad option \"invoke\"" + return -code error $msg + } + + + set oldSel [$self FullSelection] + + set old [$hull get] + set result [$hull invoke $element] + if {![info exists hull]} { + # The widget has been deleted. + return $result + } + set new [$hull get] + + if {($new ne $old) && ($options(-textvariable) eq {})} { + set My(,modified) 1 + $self Push $new + } + + + set newSel [$self FullSelection] + + if {$oldSel ne $newSel} { + event generate $win <> + } + + return $result +} + + +# ------------------------------------------------------------------------------ +# Method current (ttk::combobox only) +# ------------------------------------------------------------------------------ +# Command to wrap the hull method and also: +# 1. copy the widget text, if changed, to the Undo/Redo stack. +# 2. generate a <> event if the selection is changed. +# ------------------------------------------------------------------------------ + +method current {args} { + if {$My(,type) ne {ttk::combobox}} { + $hull current {*}$args + # The line above will cause an error return. Just make sure ... + set msg "bad option \"current\"" + return -code error $msg + } elseif {[llength $args] ni {0 1}} { + set msg "wrong # args: should be \"$win current ?newIndex?\"" + return -code error $msg + } elseif {[llength $args] == 0} { + # Just reads the current value. + return [$hull current] + } + + set newValue [lindex $args 0] + # Now write $newValue to the widget. + + set oldSel [$self FullSelection] + + set old [$hull get] + set result [$hull current $newValue] + + if {![info exists hull]} { + # The widget has been deleted. + return $result + } + set new [$hull get] + + if {($new ne $old) && ($options(-textvariable) eq {})} { + set My(,modified) 1 + $self Push $new + } + + set newSel [$self FullSelection] + + if {$oldSel ne $newSel} { + event generate $win <> + } + + return $result + + +} + +# ------------------------------------------------------------------------------ +# Method set (spinbox ttk::spinbox, and ttk::combobox only) +# ------------------------------------------------------------------------------ +# Command to wrap the hull method and also: +# 1. copy the widget text, if changed, to the Undo/Redo stack. +# 2. generate a <> event if the selection is changed. +# ------------------------------------------------------------------------------ + +method set {args} { + if {$My(,type) ni {spinbox ttk::spinbox ttk::combobox}} { + $hull set {*}$args + # The line above will cause an error return. Just make sure ... + set msg "bad option \"set\"" + return -code error $msg + + } elseif {($My(,type) eq {spinbox}) && ([llength $args] ni {0 1})} { + set msg "wrong # args: should be \"$win set ?string?\"" + return -code error $msg + + } elseif { ($My(,type) in {ttk::spinbox ttk::combobox}) + && ([llength $args] != 1) + } { + set msg "wrong # args: should be \"$win set value\"" + return -code error $msg + + } elseif {[llength $args] == 0} { + # Just reads the current value. + return [$hull set] + } + + set newValue [lindex $args 0] + # Now write $newValue to the widget. + + set oldSel [$self FullSelection] + + set old [$hull get] + set result [$hull set $newValue] + + if {![info exists hull]} { + # The widget has been deleted. + return $result + } + set new [$hull get] + + if {($new ne $old) && ($options(-textvariable) eq {})} { + set My(,modified) 1 + $self Push $new + } + + set newSel [$self FullSelection] + + if {$oldSel ne $newSel} { + event generate $win <> + } + + return $result +} + + +# ------------------------------------------------------------------------------ +# Method delete +# ------------------------------------------------------------------------------ +# Command to wrap the hull method and also: +# 1. copy the widget text, if changed, to the Undo/Redo stack. +# 2. generate a <> event if the selection is changed. +# ------------------------------------------------------------------------------ + +method delete {args} { + if {[llength $args] ni {1 2}} { + set msg "wrong # args: should be \"$win delete firstIndex ?lastIndex?\"" + return -code error $msg + } + + set oldSel [$self FullSelection] + + set old [$hull get] + set result [$hull delete {*}$args] + if {![info exists hull]} { + # The widget has been deleted. + return $result + } + set new [$hull get] + if {($new ne $old) && ($options(-textvariable) eq {})} { + set My(,modified) 1 + $self Push $new + } + + set newSel [$self FullSelection] + + if {$oldSel ne $newSel} { + event generate $win <> + } + + return $result +} + + +# ------------------------------------------------------------------------------ +# Method insert +# ------------------------------------------------------------------------------ +# Command to wrap the hull method and also: +# 1. copy the widget text, if changed, to the Undo/Redo stack. +# 2. The object must generate a <> event if the selection is changed. +# ------------------------------------------------------------------------------ + +method insert {index text} { + set oldSel [$self FullSelection] + + set old [$hull get] + set result [$hull insert $index $text] + if {![info exists hull]} { + # The widget has been deleted. + return $result + } + set new [$hull get] + if {($new ne $old) && ($options(-textvariable) eq {})} { + set My(,modified) 1 + $self Push $new + } + + set newSel [$self FullSelection] + + if {$oldSel ne $newSel} { + event generate $win <> + } + + return $result +} + + +# ------------------------------------------------------------------------------ +# Method edit +# ------------------------------------------------------------------------------ +# Hierarchical submethods are defined below. Snit correctly returns an error +# for submethods that do not exist, and for bare "$w edit", but the messages are +# not as helpful as they might be. +# ------------------------------------------------------------------------------ + +# ------------------------------------------------------------------------------ +# Hierarchical Method edit canredo +# ------------------------------------------------------------------------------ +# Command returns true iff a redo operation is available. +# ------------------------------------------------------------------------------ + +method {edit canredo} {} { + expr {[$win cget -undo] && ($My(,pointer) < [llength $My(,list)] - 1)} +} + + +# ------------------------------------------------------------------------------ +# Hierarchical Method edit canundo +# ------------------------------------------------------------------------------ +# Command returns true iff an undo operation is available. +# ------------------------------------------------------------------------------ + +method {edit canundo} {} { + expr {[$win cget -undo] && ($My(,pointer) > 0)} +} + + +# ------------------------------------------------------------------------------ +# Hierarchical Method edit redo +# ------------------------------------------------------------------------------ +# Command to attempt a "redo" operation. If the pointer is already at the end +# of the Redo stack, the command raises an error. Otherwise, it increments the +# stack pointer and changes the widget text to the next value from the Redo +# stack. +# ------------------------------------------------------------------------------ + +method {edit redo} {} { + if {![$win cget -undo]} { + return + } + + $hull selection clear + if {[$self edit canredo]} { + incr My(,pointer) + $self SetTextSilently [$self GetCurrent] + set My(,modified) 1 + } else { + return -code error {nothing to redo} + } + return +} + + +# ------------------------------------------------------------------------------ +# Hierarchical Method edit undo +# ------------------------------------------------------------------------------ +# Command to attempt an "undo" operation. If the pointer is already at the end +# of the Undo stack, the command raises an error. Otherwise, it decrements the +# stack pointer and changes the widget text to the next value from the Undo +# stack. +# ------------------------------------------------------------------------------ + +method {edit undo} {} { + if {![$win cget -undo]} { + return + } + + $hull selection clear + if {[$self edit canundo]} { + incr My(,pointer) -1 + $self SetTextSilently [$self GetCurrent] + set My(,modified) 1 + } else { + return -code error {nothing to undo} + } + return +} + + +# ------------------------------------------------------------------------------ +# Hierarchical Method edit modified +# ------------------------------------------------------------------------------ +# Accessor command for the "modified" state of the widget. "Set" semantics. +# ------------------------------------------------------------------------------ + +method {edit modified} {args} { + set lenny [llength $args] + set newValue [lindex $args 0] + + if {$lenny == 0} { + return $My(,modified) + } elseif {$lenny > 1} { + return -code error "usage: $win edit modified ?value?" + } elseif {[string is boolean -strict $newValue]} { + # && ($lenny == 1) + # Store boolean as 0 or 1. + set My(,modified) [expr {$newValue && $newValue}] + } else { + return -code error "boolean value required" + } + # N.B. Multiple Return. +} + + +# ------------------------------------------------------------------------------ +# Hierarchical Method edit separator +# ------------------------------------------------------------------------------ +# Does nothing. Each insert/delete operation has its own implicit separator. +# +# If separators are implemented in future, this command will insert a separator +# on the Undo/Redo stack. +# ------------------------------------------------------------------------------ + +method {edit separator} {} { + return +} + + +# ------------------------------------------------------------------------------ +# Hierarchical Method edit reset +# ------------------------------------------------------------------------------ +# Command to reset the Undo/Redo stack. +# ------------------------------------------------------------------------------ + +method {edit reset} {} { + if {![$win cget -undo]} { + return + } + + set My(,pointer) 0 + set My(,list) [list [$hull get]] + return +} + + +# ------------------------------------------------------------------------------ +# Method Push +# ------------------------------------------------------------------------------ +# Command to push a new value onto the Undo stack, and remove the Redo stack. +# ------------------------------------------------------------------------------ + +method Push {new} { + incr My(,pointer) + set My(,list) [lreplace $My(,list) $My(,pointer) end $new] + + $self ResizeStack + return +} + + +# ------------------------------------------------------------------------------ +# Method ResizeStack +# ------------------------------------------------------------------------------ +# Command to limit the Undo/Redo stack to the size specified by option -maxundo. +# Called only from Push. If called from elsewhere, must generalise to the case +# where My(,pointer) is reduced below 0. +# ------------------------------------------------------------------------------ + +method ResizeStack {} { + set maxUndo [expr {max(0,[$win cget -maxundo])}] + set lastDead [expr {$My(,pointer) - $maxUndo - 1}] + if {($maxUndo > 0) && ($lastDead > -1)} { + set My(,list) [lreplace $My(,list) 0 $lastDead] + set My(,pointer) [expr {$My(,pointer) - $lastDead - 1}] + } + return +} + + +# ------------------------------------------------------------------------------ +# Method GetCurrent +# ------------------------------------------------------------------------------ +# The pointer indicates a position in the Undo/Redo stack. +# This command retrieves the value from that position on the Undo/Redo stack, +# without changing either the stack or the pointer. +# ------------------------------------------------------------------------------ + +method GetCurrent {} { + return [lindex $My(,list) $My(,pointer)] +} + + +# ------------------------------------------------------------------------------ +# Method selection +# ------------------------------------------------------------------------------ +# Command to wrap the hull method and generate a <> event. +# - This event is needed by the persistent selection module persistentSelection. +# - To use the persistentSelection module, the caller must bind a suitable +# command to the <> event on this widget. +# +# - The event is generated for subcommands that can modify the selection, +# whether or not they actually do so. +# - The hull return value is stored and returned, because subcommand "present" +# returns a non-empty value. +# ------------------------------------------------------------------------------ + +method selection {args} { + + # -------------------------------------------------------------------------- + # 0. Process arguments: check correct number, to give an appropriate error + # message. + # -------------------------------------------------------------------------- + + set lenny [llength $args] + set com [lindex $args 0] + if {$lenny == 0} { + set msg "wrong # args: should be \"$win selection option ?index?\"" + return -code error $msg + } elseif { ($My(,type) eq "spinbox") + && ($com ni {adjust clear element from present range to}) + } { + set msg "bad selection option \"$com\": must be adjust, clear,\ + element, from, present, range, or to" + return -code error $msg + } elseif { ($My(,type) eq "entry") + && ($com ni {adjust clear from present range to}) + } { + set msg "bad selection option \"$com\": must be adjust, clear, from,\ + present, range, or to" + return -code error $msg + } elseif { ($My(,type) in {ttk::entry ttk::spinbox ttk::combobox}) + && ($com ni {clear present range}) + } { + set msg "bad selection option \"$com\": must be clear, present,\ + or range" + return -code error $msg + } elseif {($com in {clear present}) && ($lenny != 1)} { + set msg "wrong # args: should be \"$win selection $com\"" + return -code error $msg + } elseif {($com in {adjust from to}) && ($lenny != 2)} { + set msg "wrong # args: should be \"$win selection $com index\"" + return -code error $msg + } elseif {($com eq {range}) && ($lenny != 3)} { + set msg "wrong # args: should be \"$win selection $com start end\"" + return -code error $msg + } elseif {($com eq {element}) && ($lenny != 1) && ($lenny != 2)} { + set msg "wrong # args: should be \"$win selection $com ?element?\"" + return -code error $msg + } else { + # A valid command com with the correct number of arguments. + } + + # -------------------------------------------------------------------------- + # 1. Process arguments: convert all indices to in-range integers. + # -------------------------------------------------------------------------- + # Number of arguments, including subcommand: + # element - 0 or 1 args, not an index + # clear present - 1 args + # adjust from to - 2 args + # range - 3 args + # All arguments except the first (the subcommand) are indices - except for + # subcommand "element". + # Sanitise them: make each one a numerical value that is + # neither < 0 nor > length. + # -------------------------------------------------------------------------- + + set lenny [llength $args] + set newArgs {} + set i 0 + foreach arg $args { + set tmp $arg + if {($i != 0) && ($com ne "element")} { + set tmp [$hull index $tmp] + } + set arg$i $tmp + lappend newArgs $tmp + incr i + } + + + # -------------------------------------------------------------------------- + # 2. Rewrite the command to avoid unhelpful cases. + # -------------------------------------------------------------------------- + # The command "$hull selection range $i $j" clears the persistent selection + # if indices $i and $j are the same. E.g. if click at the end of an entry + # widget and do a slight drag, the persistent selection is lost. + # Replace this command with "$hull selection clear" which does not do this. + # - FIXME understand why this happens - is this a bug in persistentSelection + # or this module, or a misunderstanding of the entry widget? + # - FIXME do a similar thing if needed for subcommands "to" and "adjust", + # which can clear the widget. + # -------------------------------------------------------------------------- + + if {($arg0 eq {range}) && ($lenny == 3) && ($arg1 == $arg2)} { + set newArgs clear + } + + + # -------------------------------------------------------------------------- + # 3. Evaluate the hull command. + # -------------------------------------------------------------------------- + + set res [$hull selection {*}$newArgs] + + + # -------------------------------------------------------------------------- + # 4. Generate a <> event if appropriate. + # -------------------------------------------------------------------------- + + if {[lindex $args 0] in {adjust clear range to}} { + event generate $win <> + } + + return $res +} + + +#indent+4 +} + +package provide widgetPlus 1.0b1 diff --git a/support/installation/modules.tcl b/support/installation/modules.tcl index c6217f02..8ccf1ccb 100755 --- a/support/installation/modules.tcl +++ b/support/installation/modules.tcl @@ -48,6 +48,7 @@ Module khim _tclm _man _null Module mentry _tab _null _exa Module menubar _tcl _man _exa Module ntext _tcl _man _exa +Module persistentSelection _tcl _man _exa Module plotchart _tcl _man _exa Module style _tcl _man _null Module swaplist _tcl _man _null @@ -57,6 +58,7 @@ Module tooltip _tcl _man _null Module wcb _tab _null _exa Module widget _tcl _man _exa Module widgetl _tcl _man _null +Module widgetPlus _tcl _man _null Module widgetv _tcl _man _null Application diagram-viewer From de39067e590e7bc87e40954a71e60236241278b6 Mon Sep 17 00:00:00 2001 From: Keith Nash Date: Sat, 17 Feb 2018 18:25:31 +0000 Subject: [PATCH 038/150] Update ntext to 1.0b3. Bugfix. See modules/ntext/ChangeLog for details. --- modules/ntext/ChangeLog | 6 ++++++ modules/ntext/ntext.tcl | 25 ++++++++++++++++++++++++- modules/ntext/pkgIndex.tcl | 2 +- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/modules/ntext/ChangeLog b/modules/ntext/ChangeLog index beba3d13..6eaf0f58 100644 --- a/modules/ntext/ChangeLog +++ b/modules/ntext/ChangeLog @@ -1,3 +1,9 @@ +2018-02-17 Keith Nash + + * Bugfix - generate <> for Tk < 8.6.9 in the corner case in + which the CLIPBOARD is <>d into the PRIMARY selection. + * Increase version to 1.0b3 + 2018-01-26 Keith Nash * Update to correspond to current tk8.x/text.tcl -- diff --git a/modules/ntext/ntext.tcl b/modules/ntext/ntext.tcl index d04e331f..f344ff21 100644 --- a/modules/ntext/ntext.tcl +++ b/modules/ntext/ntext.tcl @@ -2726,6 +2726,13 @@ proc ::ntext::TextInsertSelection {w selection} { $w configure -autoseparators 0 $w edit separator } + + if {([$w tag nextrange sel 1.0 end] ne "")} { + set oldSel [list [$w index sel.first] [$w index sel.last]] + } else { + set oldSel {} + } + if { ($selection eq "CLIPBOARD") && ([tk windowingsystem] ne "x11TheOldFashionedWay") && ([$w tag nextrange sel 1.0 end] ne "") @@ -2754,6 +2761,22 @@ proc ::ntext::TextInsertSelection {w selection} { } { event generate $w <> } + + # The PRIMARY selection has changed but the widget does + # not generate this event. + # The operation doesn't change the value without changing the range, + # so it is enough to consider the range. + # The operation does not mark a selection if none existed before. + if { ($selection eq "CLIPBOARD") + && ($oldSel ne {}) + && $::ntext::GenerateSelect + && ( ([$w tag nextrange sel 1.0 end] eq "") + || ([list [$w index sel.first] [$w index sel.last]] ne $oldSel) + ) + } { + event generate $w <> + } + return } @@ -3577,4 +3600,4 @@ proc ::ntext::syncIndentColor {w} { ::ntext::initializeMatchPatterns -package provide ntext 1.0b2 +package provide ntext 1.0b3 diff --git a/modules/ntext/pkgIndex.tcl b/modules/ntext/pkgIndex.tcl index 5e7e5055..61665919 100644 --- a/modules/ntext/pkgIndex.tcl +++ b/modules/ntext/pkgIndex.tcl @@ -1 +1 @@ -package ifneeded ntext 1.0b2 [list source [file join $dir ntext.tcl]] +package ifneeded ntext 1.0b3 [list source [file join $dir ntext.tcl]] From 87f86e80240daf9c772fd78ad670d580870afb93 Mon Sep 17 00:00:00 2001 From: Keith Nash Date: Sat, 17 Feb 2018 18:32:20 +0000 Subject: [PATCH 039/150] Regenerate Documentation --- .../modules/controlwidget/controlwidget.n | 6 + embedded/man/files/modules/ntext/ntext.n | 41 +- .../man/files/modules/ntext/ntextBindings.n | 19 +- .../man/files/modules/ntext/ntextIndent.n | 57 +- .../man/files/modules/ntext/ntextWordBreak.n | 2 +- .../persistentSelection/persistentSelection.n | 456 +++++++++++++ .../man/files/modules/plotchart/plotchart.n | 59 ++ .../man/files/modules/widgetPlus/widgetPlus.n | 617 ++++++++++++++++++ embedded/man/toc.n | 14 +- embedded/www/index.html | 282 ++++---- .../www/tklib/files/apps/bitmap-editor.html | 2 +- .../www/tklib/files/apps/diagram-viewer.html | 4 +- .../files/modules/autoscroll/autoscroll.html | 2 +- .../files/modules/canvas/canvas_drag.html | 2 +- .../files/modules/canvas/canvas_epoints.html | 2 +- .../modules/canvas/canvas_epolyline.html | 2 +- .../files/modules/canvas/canvas_equad.html | 2 +- .../files/modules/canvas/canvas_gradient.html | 2 +- .../modules/canvas/canvas_highlight.html | 2 +- .../files/modules/canvas/canvas_mvg.html | 2 +- .../files/modules/canvas/canvas_snap.html | 2 +- .../files/modules/canvas/canvas_sqmap.html | 2 +- .../files/modules/canvas/canvas_tags.html | 2 +- .../files/modules/canvas/canvas_trlines.html | 2 +- .../files/modules/canvas/canvas_zoom.html | 2 +- .../files/modules/chatwidget/chatwidget.html | 8 +- .../modules/controlwidget/controlwidget.html | 9 +- .../files/modules/crosshair/crosshair.html | 2 +- .../www/tklib/files/modules/ctext/ctext.html | 4 +- .../tklib/files/modules/cursor/cursor.html | 2 +- .../files/modules/datefield/datefield.html | 4 +- .../tklib/files/modules/diagrams/diagram.html | 206 +++--- .../files/modules/getstring/tk_getString.html | 2 +- .../files/modules/history/tklib_history.html | 2 +- embedded/www/tklib/files/modules/ico/ico.html | 2 +- .../tklib/files/modules/ipentry/ipentry.html | 2 +- .../www/tklib/files/modules/khim/khim.html | 2 +- .../modules/notifywindow/notifywindow.html | 2 +- .../www/tklib/files/modules/ntext/ntext.html | 36 +- .../files/modules/ntext/ntextBindings.html | 25 +- .../files/modules/ntext/ntextIndent.html | 49 +- .../files/modules/ntext/ntextWordBreak.html | 8 +- .../persistentSelection.html | 283 ++++++++ .../files/modules/plotchart/plotchart.html | 548 +++++++++------- .../files/modules/swaplist/swaplist.html | 2 +- .../files/modules/tkpiechart/canvaslabel.html | 26 +- .../tklib/files/modules/tkpiechart/pie.html | 12 +- .../modules/tkpiechart/pieboxlabeler.html | 6 +- .../tkpiechart/pieperipherallabeler.html | 6 +- .../tklib/files/modules/tooltip/tooltip.html | 2 +- .../tklib/files/modules/widget/widget.html | 2 +- .../files/modules/widget/widget_calendar.html | 2 +- .../modules/widget/widget_dateentry.html | 2 +- .../files/modules/widget/widget_toolbar.html | 2 +- .../files/modules/widgetPlus/widgetPlus.html | 407 ++++++++++++ .../modules/widgetl/widget_listentry.html | 2 +- .../modules/widgetl/widget_listsimple.html | 2 +- .../modules/widgetv/widget_validator.html | 2 +- embedded/www/tklib/toc.html | 82 ++- embedded/www/toc.html | 36 +- embedded/www/toc0.html | 22 +- embedded/www/toc1.html | 14 + support/devel/sak/doc/manpages.txt | 2 + support/devel/sak/doc/toc.txt | 82 +-- support/devel/sak/doc/toc_cats.txt | 76 +-- support/devel/sak/doc/toc_mods.txt | 6 + 66 files changed, 2841 insertions(+), 735 deletions(-) create mode 100644 embedded/man/files/modules/persistentSelection/persistentSelection.n create mode 100644 embedded/man/files/modules/widgetPlus/widgetPlus.n create mode 100644 embedded/www/tklib/files/modules/persistentSelection/persistentSelection.html create mode 100644 embedded/www/tklib/files/modules/widgetPlus/widgetPlus.html diff --git a/embedded/man/files/modules/controlwidget/controlwidget.n b/embedded/man/files/modules/controlwidget/controlwidget.n index b03967aa..bf25051d 100644 --- a/embedded/man/files/modules/controlwidget/controlwidget.n +++ b/embedded/man/files/modules/controlwidget/controlwidget.n @@ -637,6 +637,9 @@ Color for the needle and the pin \fB::controlwidget::rdial\fR \fIw\fR \fIargs\fR Create a rotating dial\&. You can drag the dial to change the value\&. With the shift button depressed the value changes slowly, with the control button depressed it changes fast\&. +Similarly, you can control the dial via the mouse wheel, with the shift and control button +working in the same way as with the mouse pointer\&. +\fINote:\fR The shift and control buttons currently have no effect on Windows\&. .RS .TP widget \fIw\fR (in) @@ -658,6 +661,9 @@ Whether a horizontal disk/dial is required ("horizontal") or a vertical one ("ve \fBstep\fR value Initial step for incrementing or decrementing the value .TP +\fBbindwheel\fR value +Step size for controlling the dial's value via the mouse wheel +.TP \fBslow\fR value Factor on the step size for incrementing or decrementing the value slowly .TP diff --git a/embedded/man/files/modules/ntext/ntext.n b/embedded/man/files/modules/ntext/ntext.n index 8d2bd83a..338a6817 100644 --- a/embedded/man/files/modules/ntext/ntext.n +++ b/embedded/man/files/modules/ntext/ntext.n @@ -1,5 +1,5 @@ '\" -'\" Generated from file 'ntext\&.man' by tcllib/doctools with format 'nroff' +'\" Generated from file 'ntext\&.man~' by tcllib/doctools with format 'nroff' '\" .TH "ntext" n 1\&.0 tklib "Alternative Bindings for the Text Widget" .\" The -*- nroff -*- definitions below are for supplemental macros used @@ -285,13 +285,15 @@ package require \fBntext ?1\&.0?\fR .sp \fB::ntext::new_textPaste\fR \fIpathName\fR .sp +\fB::ntext::syncIndentColor\fR \fIpathName\fR +.sp .BE .SH DESCRIPTION The purpose of the \fBntext\fR package is to make the text widget behave more like other text-editing applications\&. It makes the text widget more useful for implementing a text editor, and makes it behave in a way that will be more familiar to most users\&. .PP The package provides a binding tag named \fINtext\fR for use by text widgets in place of the default \fIText\fR binding tag\&. .PP -Package \fBntext\fR 's functions and variables are contained entirely in the \fB::ntext\fR namespace; its other code is contained in the binding tag \fINtext\fR\&. \fBntext\fR has no exports to the global or other namespaces, and no new widget commands\&. It uses modified copies of the Tk code, leaving the original code, and the \fIText\fR binding tag, unchanged\&. +Package \fBntext\fR 's functions and variables are contained entirely in the \fB::ntext\fR namespace; its other code is contained in the binding tag \fINtext\fR\&. \fBntext\fR has no exports to the global or other namespaces, and no new widget commands\&. It uses modified copies of the \fBTk\fR code, leaving the original code, and the \fIText\fR binding tag, unchanged\&. .PP The differences between the \fINtext\fR binding tag and the default \fIText\fR binding tag are in three categories: .IP \(bu @@ -299,7 +301,7 @@ Some \fIText\fR bindings behave differently from most text-editing applications\ .IP \(bu When a logical line with leading whitespace is word-wrapped onto more than one display line, the wrapped display lines begin further to the left than the first display line, which can make the text layout untidy and difficult to read\&. \fINtext\fR can indent the wrapped lines to match the leading whitespace of the first display line (this facility is switched off by default)\&. For details see \fIntextIndent\fR\&. .IP \(bu -When the user navigates or selects text, Tcl/Tk sometimes needs to detect word boundaries\&. \fINtext\fR provides improved rules for word boundary detection\&. For details see \fIntextWordBreak\fR\&. +When the user navigates or selects text, \fBTcl/Tk\fR sometimes needs to detect word boundaries\&. \fINtext\fR provides improved rules for word boundary detection\&. For details see \fIntextWordBreak\fR\&. .PP The remainder of this page describes the basic use and configuration of all three aspects of \fINtext\fR\&. For more detailed information on the different facilities of \fINtext\fR, see the pages \fIntextBindings\fR, \fIntextIndent\fR, and \fIntextWordBreak\fR\&. .PP @@ -314,6 +316,9 @@ Replacement for ::tk_textCut that also maintains \fINtext\fR indentation (see \f .TP \fB::ntext::new_textPaste\fR \fIpathName\fR Replacement for ::tk_textPaste that also maintains \fINtext\fR indentation (see \fIntextIndent\fR)\&. +.TP +\fB::ntext::syncIndentColor\fR \fIpathName\fR +Command to apply the current value of the variable \fB::ntext::indentColor\fR to existing lines in a text widget\&. This command is useful if a text widget has been created, text has been inserted in the widget, \fIand then\fR the value of \fB::ntext::indentColor\fR is changed (see \fIntextIndent\fR)\&. .PP .SH "CONFIGURATION OPTIONS" \fINtext\fR provides alternatives to a number of behaviours of the classic \fIText\fR binding tag\&. Where there is an option, the \fINtext\fR behaviour (except for display-line indentation) is switched on by default\&. @@ -347,6 +352,15 @@ For more information see \fIntextBindings\fR For more information see \fIntextBindings\fR .PP .PP +\fB::ntext::classicParagraphs\fR +.IP \(bu +\fB0\fR - (default value) on macOS Aqua, certain keyboard bindings are made to behave in the same way as the Mac application TextEdit\&. The bindings involve vertical scrolling of the screen and are \&. +.IP \(bu +\fB1\fR - on macOS Aqua, certain keyboard bindings are made to behave in the same way as classic \fIText\fR, ignoring the conventions of Aqua\&. The bindings involve vertical scrolling of the screen and are \&. +.IP \(bu +For more information see \fIntextBindings\fR +.PP +.PP \fB::ntext::classicSelection\fR .IP \(bu \fB0\fR - (default value on macOS Aqua) selects Mac-like behaviour, i\&.e\&. when a navigation keystroke cancels a selection, the insert mark first moves to the end of the selection determined by the navigation direction of the keystroke, and then the keystroke is applied\&. @@ -374,6 +388,19 @@ After changing this value, the matching patterns should be recalculated\&. See For more information see \fIntextIndent\fR .PP .PP +\fB::ntext::indentColor\fR +.IP \(bu +\fB{}\fR - if the value is the empty string, then the indent of wrapped display lines has the same color as the widget background\&. +.IP \(bu +\fIcolor\fR - a valid \fBTk\fR color to use for the indent of wrapped display lines (default value \fI#d9d9d9\fR)\&. +.sp +Coloring is implemented with the text widget tag option \fI-lmargincolor\fR, which is available from \fBTk\fR 8\&.6\&.6 onwards\&. \fINtext\fR indent coloring has no effect in earlier versions of \fBTk\fR\&. +.sp +The value of \fB::ntext::indentColor\fR will often be set at startup\&. If the value is changed when text widgets already exist and contain text, those widgets can be updated by calling command \fB::ntext::syncIndentColor\fR\&. +.IP \(bu +For more information see \fIntextIndent\fR +.PP +.PP \fB::ntext::overwrite\fR .IP \(bu \fB0\fR - (initial value) text typed at the keyboard is inserted into the widget @@ -385,11 +412,13 @@ The value is toggled by the \fIInsert\fR key (except on macOS Aqua where there i For more information see \fIntextBindings\fR .PP .PP -\fB::ntext::classicParagraphs\fR +\fB::ntext::useBlockCursor\fR .IP \(bu -\fB0\fR - (default value) on macOS Aqua, certain keyboard bindings are made to behave in the same way as the Mac application TextEdit\&. The bindings involve vertical scrolling of the screen and are \&. +\fB0\fR - the block cursor will not be used\&. When the widget is in \fIoverwrite\fR mode (see \fB::ntext::overwrite\fR), the ordinary cursor will change color instead\&. .IP \(bu -\fB1\fR - on macOS Aqua, certain keyboard bindings are made to behave in the same way as classic \fIText\fR, ignoring the conventions of Aqua\&. The bindings involve vertical scrolling of the screen and are \&. +\fB1\fR - the block cursor will be used when the widget is in \fIoverwrite\fR mode (see \fB::ntext::overwrite\fR)\&. +.IP \(bu +The default value depends on the version of \fBTk\fR\&. In versions of \fBTk\fR earlier than \fB8\&.5\&.12\fR, the sizing of the block cursor had a bug, and \fB::ntext::useBlockCursor\fR defaults to \fB0\fR\&. From \fB8\&.5\&.12\fR onwards the bug is fixed, and \fB::ntext::useBlockCursor\fR defaults to \fB1\fR\&. .IP \(bu For more information see \fIntextBindings\fR .PP diff --git a/embedded/man/files/modules/ntext/ntextBindings.n b/embedded/man/files/modules/ntext/ntextBindings.n index ef08fdd7..75f8c348 100644 --- a/embedded/man/files/modules/ntext/ntextBindings.n +++ b/embedded/man/files/modules/ntext/ntextBindings.n @@ -1,5 +1,5 @@ '\" -'\" Generated from file 'ntextBindings\&.man' by tcllib/doctools with format 'nroff' +'\" Generated from file 'ntextBindings\&.man~' by tcllib/doctools with format 'nroff' '\" .TH "ntextBindings" n 1\&.0 tklib "Alternative Bindings for the Text Widget" .\" The -*- nroff -*- definitions below are for supplemental macros used @@ -343,6 +343,13 @@ The behaviour of \fINtext\fR may be configured application-wide by setting the v \fB1\fR - selects classic \fIText\fR behaviour .PP .PP +\fB::ntext::classicParagraphs\fR +.IP \(bu +\fB0\fR - (default value) on macOS Aqua, certain keyboard bindings are made to behave in the same way as the Mac application TextEdit\&. The bindings involve vertical scrolling of the screen and are \&. +.IP \(bu +\fB1\fR - on macOS Aqua, certain keyboard bindings are made to behave in the same way as for the Windows and X11 windowing systems and the classic \fIText\fR, ignoring the conventions of Aqua\&. The bindings involve vertical scrolling of the screen and are \&. +.PP +.PP \fB::ntext::classicSelection\fR .IP \(bu \fB0\fR - (default value on macOS Aqua) selects Mac-like behaviour, i\&.e\&. when a navigation keystroke cancels a selection, the insert mark first moves to the end of the selection determined by the navigation direction of the keystroke, and then the keystroke is applied\&. @@ -359,11 +366,15 @@ The behaviour of \fINtext\fR may be configured application-wide by setting the v The value is toggled by the \fIInsert\fR key\&. .PP .PP -\fB::ntext::classicParagraphs\fR +\fB::ntext::useBlockCursor\fR .IP \(bu -\fB0\fR - (default value) on macOS Aqua, certain keyboard bindings are made to behave in the same way as the Mac application TextEdit\&. The bindings involve vertical scrolling of the screen and are \&. +\fB0\fR - the block cursor will not be used\&. When the widget is in \fIoverwrite\fR mode (see \fB::ntext::overwrite\fR), the ordinary cursor will change color instead\&. .IP \(bu -\fB1\fR - on macOS Aqua, certain keyboard bindings are made to behave in the same way as for the Windows and X11 windowing systems and the classic \fIText\fR, ignoring the conventions of Aqua\&. The bindings involve vertical scrolling of the screen and are \&. +\fB1\fR - the block cursor will be used when the widget is in \fIoverwrite\fR mode (see \fB::ntext::overwrite\fR)\&. +.IP \(bu +The default value depends on the version of \fBTk\fR\&. In versions of \fBTk\fR earlier than \fB8\&.5\&.12\fR, the sizing of the block cursor had a bug, and \fB::ntext::useBlockCursor\fR defaults to \fB0\fR\&. From \fB8\&.5\&.12\fR onwards the bug is fixed, and \fB::ntext::useBlockCursor\fR defaults to \fB1\fR\&. +.IP \(bu +For more information see \fIntextBindings\fR .PP .SH INTERNALS In order to remain independent of the version of \fBTk\fR (8\&.5 or 8\&.6), \fBntext\fR defines its own virtual events\&. These new virtual events are used only in the \fINtext\fR binding tag, and therefore do not interfere with the real or virtual events used in other code\&. diff --git a/embedded/man/files/modules/ntext/ntextIndent.n b/embedded/man/files/modules/ntext/ntextIndent.n index 0ba7302f..8ed062d4 100644 --- a/embedded/man/files/modules/ntext/ntextIndent.n +++ b/embedded/man/files/modules/ntext/ntextIndent.n @@ -1,5 +1,5 @@ '\" -'\" Generated from file 'ntextIndent\&.man' by tcllib/doctools with format 'nroff' +'\" Generated from file 'ntextIndent\&.man~' by tcllib/doctools with format 'nroff' '\" .TH "ntextIndent" n 1\&.0 tklib "ntext Indentation for the Text Widget" .\" The -*- nroff -*- definitions below are for supplemental macros used @@ -285,6 +285,8 @@ package require \fBntext ?1\&.0?\fR .sp \fB::ntext::new_textPaste\fR \fIpathName\fR .sp +\fB::ntext::syncIndentColor\fR \fIpathName\fR +.sp .BE .SH DESCRIPTION The \fBntext\fR package provides a binding tag named \fINtext\fR for use by text widgets in place of the default \fIText\fR binding tag\&. @@ -300,21 +302,34 @@ This indentation is available to text widgets only in \fI-wrap\fR \fIword\fR mod Replacement for ::tk_textCopy\&. .TP \fB::ntext::new_textCut\fR \fIpathName\fR -Replacement for ::tk_textCut that also maintains \fINtext\fR indentation (see \fIntextIndent\fR)\&. +Replacement for ::tk_textCut that also maintains \fINtext\fR indentation\&. .TP \fB::ntext::new_textPaste\fR \fIpathName\fR -Replacement for ::tk_textPaste that also maintains \fINtext\fR indentation (see \fIntextIndent\fR)\&. +Replacement for ::tk_textPaste that also maintains \fINtext\fR indentation\&. +.TP +\fB::ntext::syncIndentColor\fR \fIpathName\fR +Command to apply the current value of \fB::ntext::indentColor\fR to existing lines in a text widget\&. This command is useful if a text widget has been created, text has been inserted in the widget, \fIand then\fR the value of \fB::ntext::indentColor\fR is changed\&. .PP .SH "CONFIGURATION OPTIONS" The behavior of \fINtext\fR may be configured application-wide by setting the values of a number of namespace variables: .PP \fB::ntext::classicWrap\fR .IP \(bu -0 - selects \fINtext\fR behaviour, i\&.e\&. display lines are indented to match the initial whitespace of the first display line of a logical line\&. +\fB0\fR - selects \fINtext\fR behaviour, i\&.e\&. display lines are indented to match the initial whitespace of the first display line of a logical line\&. .sp No other action is required if this option, and the text widget's \fI-wrap\fR option, are set before any text is entered in the widget, and if text is entered and edited only by the mouse and keyboard\&. If, instead, text is manipulated by the script, or if the text widget's \fI-wrap\fR option or the value of \fB::ntext::classicWrap\fR are changed while the widget holds text, then calls to \fIntext\fR functions are needed to alter the indentation\&. See the section \fBINDENTING DISPLAY LINES\fR for detailed instructions\&. .IP \(bu -1 - (default value) selects classic \fIText\fR behaviour, i\&.e\&. no indentation\&. +\fB1\fR - (default value) selects classic \fIText\fR behaviour, i\&.e\&. no indentation\&. +.PP +\fB::ntext::indentColor\fR +.IP \(bu +\fB{}\fR - if the value is the empty string, then the indent of wrapped display lines has the same color as the widget background\&. +.IP \(bu +\fIcolor\fR - a valid Tk color to use for the indent of wrapped display lines (default value \fI#d9d9d9\fR)\&. +.sp +Coloring is implemented with the text widget tag option \fI-lmargincolor\fR, which is available from \fBTk\fR 8\&.6\&.6 onwards\&. \fINtext\fR indent coloring has no effect in earlier versions of \fBTk\fR\&. +.sp +The value of \fB::ntext::indentColor\fR will often be set at startup\&. If the value is changed when text widgets already exist and contain text, those widgets can be updated by calling command \fB::ntext::syncIndentColor\fR\&. .PP \fIAdvanced Use\fR .PP @@ -367,12 +382,34 @@ In other cases, i\&.e\&. if the widget is in \fI-word\fR \fIchar\fR or \fI-word\ .SH BUGS This version of \fBntext\fR is intended to be compatible with all releases of \fBTk\fR 8\&.5 and 8\&.6, and with the branches \fIcore-8-5-branch\fR, \fIcore-8-6-branch\fR, and \fItrunk\fR in the source code repository for \fBTk\fR\&. Any incompatibility with any of these versions, for any \fBTk\fR windowing system, should be reported as a bug\&. Please report such in the category \fIntext\fR of the \fITklib Trackers\fR [http://core\&.tcl\&.tk/tklib/reportlist]\&. .SH EXAMPLES -To switch on \fINtext\fR 's indentation and use it in widget \&.t: +To switch on \fINtext\fR 's indentation and use it in widget \&.t, using the default indent color \fI#d9d9d9\fR: +.CS + + +package require ntext +set ::ntext::classicWrap 0 +text \&.t -wrap word +bindtags \&.t {\&.t Ntext \&. all} + +.CE +To switch on \fINtext\fR 's indentation and use it in widget \&.t, without colored indents: .CS package require ntext set ::ntext::classicWrap 0 +set ::ntext::indentColor {} +text \&.t -wrap word +bindtags \&.t {\&.t Ntext \&. all} + +.CE +To switch on \fINtext\fR 's indentation and use it in widget \&.t, coloring the indents black: +.CS + + +package require ntext +set ::ntext::classicWrap 0 +set ::ntext::indentColor black text \&.t -wrap word bindtags \&.t {\&.t Ntext \&. all} @@ -401,6 +438,14 @@ set foo [\&.t index end] \&.t insert end {This line was added by the script, not the keyboard!} ::ntext::wrapIndent \&.t $foo end +.CE +To change the indentation color when a widget \&.t already holds text: +.CS + + +set ::ntext::indentColor black +::ntext::syncIndentColor \&.t + .CE To switch to \fI-wrap\fR \fIchar\fR mode: .CS diff --git a/embedded/man/files/modules/ntext/ntextWordBreak.n b/embedded/man/files/modules/ntext/ntextWordBreak.n index 1a23c0ba..8a67fe23 100644 --- a/embedded/man/files/modules/ntext/ntextWordBreak.n +++ b/embedded/man/files/modules/ntext/ntextWordBreak.n @@ -1,5 +1,5 @@ '\" -'\" Generated from file 'ntextWordBreak\&.man' by tcllib/doctools with format 'nroff' +'\" Generated from file 'ntextWordBreak\&.man~' by tcllib/doctools with format 'nroff' '\" .TH "ntextWordBreak" n 1\&.0 tklib "ntext Word Boundary Detection for the Text Widget" .\" The -*- nroff -*- definitions below are for supplemental macros used diff --git a/embedded/man/files/modules/persistentSelection/persistentSelection.n b/embedded/man/files/modules/persistentSelection/persistentSelection.n new file mode 100644 index 00000000..bcf13b31 --- /dev/null +++ b/embedded/man/files/modules/persistentSelection/persistentSelection.n @@ -0,0 +1,456 @@ +'\" +'\" Generated from file 'persistentSelection\&.man~' by tcllib/doctools with format 'nroff' +'\" +.TH "persistentSelection" n 1\&.0 tklib "Enhanced PRIMARY selection" +.\" The -*- nroff -*- definitions below are for supplemental macros used +.\" in Tcl/Tk manual entries. +.\" +.\" .AP type name in/out ?indent? +.\" Start paragraph describing an argument to a library procedure. +.\" type is type of argument (int, etc.), in/out is either "in", "out", +.\" or "in/out" to describe whether procedure reads or modifies arg, +.\" and indent is equivalent to second arg of .IP (shouldn't ever be +.\" needed; use .AS below instead) +.\" +.\" .AS ?type? ?name? +.\" Give maximum sizes of arguments for setting tab stops. Type and +.\" name are examples of largest possible arguments that will be passed +.\" to .AP later. If args are omitted, default tab stops are used. +.\" +.\" .BS +.\" Start box enclosure. From here until next .BE, everything will be +.\" enclosed in one large box. +.\" +.\" .BE +.\" End of box enclosure. +.\" +.\" .CS +.\" Begin code excerpt. +.\" +.\" .CE +.\" End code excerpt. +.\" +.\" .VS ?version? ?br? +.\" Begin vertical sidebar, for use in marking newly-changed parts +.\" of man pages. The first argument is ignored and used for recording +.\" the version when the .VS was added, so that the sidebars can be +.\" found and removed when they reach a certain age. If another argument +.\" is present, then a line break is forced before starting the sidebar. +.\" +.\" .VE +.\" End of vertical sidebar. +.\" +.\" .DS +.\" Begin an indented unfilled display. +.\" +.\" .DE +.\" End of indented unfilled display. +.\" +.\" .SO ?manpage? +.\" Start of list of standard options for a Tk widget. The manpage +.\" argument defines where to look up the standard options; if +.\" omitted, defaults to "options". The options follow on successive +.\" lines, in three columns separated by tabs. +.\" +.\" .SE +.\" End of list of standard options for a Tk widget. +.\" +.\" .OP cmdName dbName dbClass +.\" Start of description of a specific option. cmdName gives the +.\" option's name as specified in the class command, dbName gives +.\" the option's name in the option database, and dbClass gives +.\" the option's class in the option database. +.\" +.\" .UL arg1 arg2 +.\" Print arg1 underlined, then print arg2 normally. +.\" +.\" .QW arg1 ?arg2? +.\" Print arg1 in quotes, then arg2 normally (for trailing punctuation). +.\" +.\" .PQ arg1 ?arg2? +.\" Print an open parenthesis, arg1 in quotes, then arg2 normally +.\" (for trailing punctuation) and then a closing parenthesis. +.\" +.\" # Set up traps and other miscellaneous stuff for Tcl/Tk man pages. +.if t .wh -1.3i ^B +.nr ^l \n(.l +.ad b +.\" # Start an argument description +.de AP +.ie !"\\$4"" .TP \\$4 +.el \{\ +. ie !"\\$2"" .TP \\n()Cu +. el .TP 15 +.\} +.ta \\n()Au \\n()Bu +.ie !"\\$3"" \{\ +\&\\$1 \\fI\\$2\\fP (\\$3) +.\".b +.\} +.el \{\ +.br +.ie !"\\$2"" \{\ +\&\\$1 \\fI\\$2\\fP +.\} +.el \{\ +\&\\fI\\$1\\fP +.\} +.\} +.. +.\" # define tabbing values for .AP +.de AS +.nr )A 10n +.if !"\\$1"" .nr )A \\w'\\$1'u+3n +.nr )B \\n()Au+15n +.\" +.if !"\\$2"" .nr )B \\w'\\$2'u+\\n()Au+3n +.nr )C \\n()Bu+\\w'(in/out)'u+2n +.. +.AS Tcl_Interp Tcl_CreateInterp in/out +.\" # BS - start boxed text +.\" # ^y = starting y location +.\" # ^b = 1 +.de BS +.br +.mk ^y +.nr ^b 1u +.if n .nf +.if n .ti 0 +.if n \l'\\n(.lu\(ul' +.if n .fi +.. +.\" # BE - end boxed text (draw box now) +.de BE +.nf +.ti 0 +.mk ^t +.ie n \l'\\n(^lu\(ul' +.el \{\ +.\" Draw four-sided box normally, but don't draw top of +.\" box if the box started on an earlier page. +.ie !\\n(^b-1 \{\ +\h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul' +.\} +.el \}\ +\h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul' +.\} +.\} +.fi +.br +.nr ^b 0 +.. +.\" # VS - start vertical sidebar +.\" # ^Y = starting y location +.\" # ^v = 1 (for troff; for nroff this doesn't matter) +.de VS +.if !"\\$2"" .br +.mk ^Y +.ie n 'mc \s12\(br\s0 +.el .nr ^v 1u +.. +.\" # VE - end of vertical sidebar +.de VE +.ie n 'mc +.el \{\ +.ev 2 +.nf +.ti 0 +.mk ^t +\h'|\\n(^lu+3n'\L'|\\n(^Yu-1v\(bv'\v'\\n(^tu+1v-\\n(^Yu'\h'-|\\n(^lu+3n' +.sp -1 +.fi +.ev +.\} +.nr ^v 0 +.. +.\" # Special macro to handle page bottom: finish off current +.\" # box/sidebar if in box/sidebar mode, then invoked standard +.\" # page bottom macro. +.de ^B +.ev 2 +'ti 0 +'nf +.mk ^t +.if \\n(^b \{\ +.\" Draw three-sided box if this is the box's first page, +.\" draw two sides but no top otherwise. +.ie !\\n(^b-1 \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c +.el \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c +.\} +.if \\n(^v \{\ +.nr ^x \\n(^tu+1v-\\n(^Yu +\kx\h'-\\nxu'\h'|\\n(^lu+3n'\ky\L'-\\n(^xu'\v'\\n(^xu'\h'|0u'\c +.\} +.bp +'fi +.ev +.if \\n(^b \{\ +.mk ^y +.nr ^b 2 +.\} +.if \\n(^v \{\ +.mk ^Y +.\} +.. +.\" # DS - begin display +.de DS +.RS +.nf +.sp +.. +.\" # DE - end display +.de DE +.fi +.RE +.sp +.. +.\" # SO - start of list of standard options +.de SO +'ie '\\$1'' .ds So \\fBoptions\\fR +'el .ds So \\fB\\$1\\fR +.SH "STANDARD OPTIONS" +.LP +.nf +.ta 5.5c 11c +.ft B +.. +.\" # SE - end of list of standard options +.de SE +.fi +.ft R +.LP +See the \\*(So manual entry for details on the standard options. +.. +.\" # OP - start of full description for a single option +.de OP +.LP +.nf +.ta 4c +Command-Line Name: \\fB\\$1\\fR +Database Name: \\fB\\$2\\fR +Database Class: \\fB\\$3\\fR +.fi +.IP +.. +.\" # CS - begin code excerpt +.de CS +.RS +.nf +.ta .25i .5i .75i 1i +.. +.\" # CE - end code excerpt +.de CE +.fi +.RE +.. +.\" # UL - underline word +.de UL +\\$1\l'|0\(ul'\\$2 +.. +.\" # QW - apply quotation marks to word +.de QW +.ie '\\*(lq'"' ``\\$1''\\$2 +.\"" fix emacs highlighting +.el \\*(lq\\$1\\*(rq\\$2 +.. +.\" # PQ - apply parens and quotation marks to word +.de PQ +.ie '\\*(lq'"' (``\\$1''\\$2)\\$3 +.\"" fix emacs highlighting +.el (\\*(lq\\$1\\*(rq\\$2)\\$3 +.. +.\" # QR - quoted range +.de QR +.ie '\\*(lq'"' ``\\$1''\\-``\\$2''\\$3 +.\"" fix emacs highlighting +.el \\*(lq\\$1\\*(rq\\-\\*(lq\\$2\\*(rq\\$3 +.. +.\" # MT - "empty" string +.de MT +.QW "" +.. +.BS +.SH NAME +persistentSelection \- Enhanced PRIMARY selection +.SH SYNOPSIS +package require \fBTcl 8\&.5\fR +.sp +package require \fBTk 8\&.5\fR +.sp +package require \fBpersistentSelection ?1\&.0?\fR +.sp +\fBpersistentSelection::fixText\fR +.sp +\fBpersistentSelection::getClassicPrimarySel\fR ?\fIdisplayOf\fR? ?\fIwithOthers\fR? +.sp +\fBpersistentSelection::getPrimarySel\fR ?\fIdisplayOf\fR? +.sp +\fBpersistentSelection::report\fR \fItype\fR \fIpathName\fR +.sp +.BE +.SH DESCRIPTION +Consider a \fBTk\fR widget that sets its \fB-exportselection\fR option to boolean \fBtrue\fR, thereby exporting its selection\&. When the selection in the widget is canceled, by default \fBTk\fR also cancels the \fBPRIMARY\fR selection\&. In this situation, an attempt to read the \fBPRIMARY\fR selection, e\&.g\&. by a \fB<>\fR event, will fail\&. +.PP +The \fBpersistentSelection\fR package offers more convenient behavior\&. It will sustain as the \fBPRIMARY\fR selection the last non-empty value set by any \fBTk\fR widget that it monitors, as long as the \fBPRIMARY\fR selection is not claimed by another process, or by a widget that it does not monitor\&. +.PP +The \fBpersistentSelection\fR package works by binding to the \fB<>\fR event on the widgets of interest, and using this binding to monitor any change of the selection in the widget\&. Its commands are confined to the namespace \fB::persistentSelection\fR\&. +.SH COMMANDS +.TP +\fBpersistentSelection::fixText\fR +Call this command once to resolve problems with \fB\fBtext\fR\fR widgets that use the default \fBText\fR bindtag (rather than \fBNtext\fR)\&. See \fBText widgets\fR for an explanation\&. +.sp +The command adjusts some \fBText\fR bindings to generate \fB<>\fR events; and it re-orders calls to the \fB\fBtext\fR\fR widget \fBtag\fR command in the private command \fB::tk::TextSelectTo\fR, so that this command cooperates better with \fBpersistentSelection\fR\&. +.sp +These adjustments are needed only to older versions of \fBTk\fR\&. The command \fBpersistentSelection::fixText\fR has no effect on sufficiently recent releases\&. It can safely be called for any version of \fBTk\fR\&. +.TP +\fBpersistentSelection::getClassicPrimarySel\fR ?\fIdisplayOf\fR? ?\fIwithOthers\fR? +.RS +.IP \(bu +\fIdisplayOf\fR - a \fBTk\fR window path on the display to be interrogated (optional, default {\fB\&.\fR}) +.IP \(bu +\fIwithOthers\fR - whether to return the \fBPRIMARY\fR selection if it is owned by another process or interpreter (optional, boolean, default \fBfalse\fR) +.RE +.IP +A command to return the classic (non-persistent) form of the \fBPRIMARY\fR selection\&. If the selection does not exist, or is sustained only by \fBpersistentSelection\fR, the command returns the empty string\&. +.TP +\fBpersistentSelection::getPrimarySel\fR ?\fIdisplayOf\fR? +.RS +.IP \(bu +\fIdisplayOf\fR - a \fBTk\fR window on the display to be interrogated (optional, default {\fB\&.\fR}) +.RE +.IP +A command to return the value of the \fBPRIMARY\fR selection\&. If the selection does not exist, the command returns the empty string\&. The usual \fBTk\fR commands are perfectly valid, but they raise an error if the selection does not exist\&. +.TP +\fBpersistentSelection::report\fR \fItype\fR \fIpathName\fR +.RS +.IP \(bu +\fItype\fR - (value \fBtext\fR or \fBentry\fR) classification of the widget whose selection has changed +.IP \(bu +\fIpathName\fR - the \fBTk\fR window path of the widget whose selection has changed +.RE +.IP +To make package \fBpersistentSelection\fR monitor a widget, this command must be bound to the \fB<>\fR event on that widget\&. The command records changes in the widget's selection, and uses the information to sustain a non-empty \fBPRIMARY\fR selection on each display\&. +.PP +.SH USAGE +.SS "SCRIPT REQUIREMENTS" +For each widget that will be monitored by \fBpersistentSelection\fR, the command \fBpersistentSelection::report\fR must be bound to event \fB<>\fR in one of the widget's binding tags\&. +.PP +For example, the developer may wish to use \fBpersistentSelection\fR with every \fB\fBtext\fR\fR and \fB\fBentryPlus\fR\fR widget in an application: this can be achieved by adding the \fB<>\fR binding to the \fBText\fR and \fBEntryPlus\fR bindtags\&. See \fBEXAMPLES\fR\&. +.PP +If \fBpersistentSelection\fR is not required for all widgets of a particular class, the binding can be added to per-widget bindtags\&. See \fBEXAMPLES\fR\&. +.SS "WIDGET REQUIREMENTS" +To be capable of being monitored by \fBpersistentSelection\fR, a widget must satisfy three conditions: +.IP \(bu +It must have an \fB-exportselection\fR option that allows it to export its selection to the \fBPRIMARY\fR selection\&. +.IP \(bu +It must generate a \fB<>\fR event whenever its selection changes\&. +.IP \(bu +its bindings to other events should be suitable - specifically, in versions of \fBTk\fR older than \fB8\&.6\&.6\fR, a GUI event that extends or reduces the selection from one non-empty value to another should not use an intermediate state that has an empty selection, because this confuses \fBpersistentStore\fR\&. +.PP +.PP +The \fBTk\fR and \fBTtk\fR widgets that can export their selection are \fB\fBtext\fR\fR, \fB\fBentry\fR\fR, \fB\fBlistbox\fR\fR, \fB\fBspinbox\fR\fR, \fB\fBttk::entry\fR\fR, \fB\fBttk::spinbox\fR\fR, and \fB\fBttk::combobox\fR\fR\&. +.SS "TEXT WIDGETS" +In versions of \fBTk\fR older than \fB8\&.6\&.9\fR, the \fB\fBtext\fR\fR widget does not generate \fB<>\fR events in a few "corner cases" in which its selection changes\&. These omissions can be corrected by changes to the \fBText\fR bindings, in order to satisfy the second condition of \fBWidget requirements\fR\&. +.PP +In addition, versions of \fBTk\fR older than \fB8\&.6\&.6\fR process selection events slightly differently from newer versions, and in combination with the \fBText\fR bindings this confuses \fBpersistentStore\fR\&. If an upgrade to the current version of \fBTcl/Tk\fR is not feasible, this problem can be resolved by making a slight modification to the widget bindings, in order to satisfy the third condition of \fBWidget requirements\fR\&. +.PP +Either the script should call the command \fBpersistentSelection::fixText\fR to adjust the \fBText\fR bindings and the commands that they call; or the widget can use the \fBNtext\fR binding tag (for \fBntext\fR 1\&.0) instead of the default \fBText\fR bindtag\&. +.PP +In either case, the argument \fItype\fR supplied to command \fBpersistentSelection::report\fR should have the value \fBtext\fR\&. +.SS "ENTRY, SPINBOX, TTK::ENTRY, TTK::SPINBOX, AND TTK::COMBOBOX WIDGETS" +The \fB\fBentry\fR\fR, \fB\fBspinbox\fR\fR, \fB\fBttk::entry\fR\fR, \fB\fBttk::spinbox\fR\fR, and \fB\fBttk::combobox\fR\fR widgets do not generate a \fB<>\fR event when their selection changes, and therefore require modification\&. +.PP +The package \fBwidgetPlus\fR provides \fBsnit\fR wrappers \fB\fBwidgetPlus::entryPlus\fR\fR, \fB\fBwidgetPlus::spinboxPlus\fR\fR, \fB\fBwidgetPlus::ttkEntryPlus\fR\fR, \fB\fBwidgetPlus::ttkSpinboxPlus\fR\fR, and \fB\fBwidgetPlus::ttkComboboxPlus\fR\fR respectively\&. Each \fBwidgetPlus\fR widget generates the required \fB<>\fR events\&. +.PP +In all these cases, the argument \fItype\fR supplied to command \fBpersistentSelection::report\fR should have the value \fBentry\fR\&. This argument determines how \fBpersistentSelection\fR will inspect the widget's selection, and the commands that do so are the same for all these widgets\&. +.SS "LISTBOX WIDGETS" +A similar wrapper has not been created for the \fB\fBlistbox\fR\fR widget, which has the complication of permitting multiple selections\&. +.SH "TO DO" +.IP \(bu +Test on a system with multiple displays\&. +.PP +.SH BUGS +This version of \fBpersistentSelection\fR is intended to be compatible with all releases of \fBTk\fR 8\&.5 and 8\&.6, and with the branches \fIcore-8-5-branch\fR, \fIcore-8-6-branch\fR, \fIrevised_text\fR, and \fItrunk\fR in the source code repository for \fBTk\fR\&. Any incompatibility with any of these versions, for any \fBTk\fR windowing system, should be reported as a bug\&. Please report such in the category \fIpersistentSelection\fR of the \fITklib Trackers\fR [http://core\&.tcl\&.tk/tklib/reportlist]\&. +.SH EXAMPLES +Each example uses \fBpersistentSelection\fR to retain the last non-empty value of the selection in certain widgets\&. Each example also includes the creation of sample widgets\&. +.PP +Monitor all \fB\fBentryPlus\fR\fR widgets\&. +.CS + + +package require widgetPlus +widgetPlus::entryPlus \&.ep +pack \&.ep + +package require persistentSelection +bind EntryPlus <> {::persistentSelection::report entry %W} + +.CE +Monitor all \fB\fBtext\fR\fR widgets that use the default \fBText\fR bindings\&. +.CS + + +text \&.t +pack \&.t + +package require persistentSelection +::persistentSelection::fixText +bind Text <> {::persistentSelection::report text %W} + +.CE +Monitor all \fB\fBtext\fR\fR widgets that use the default \fBText\fR bindings, and all \fB\fBentryPlus\fR\fR widgets\&. +.CS + + +text \&.t +pack \&.t + +package require widgetPlus +widgetPlus::entryPlus \&.ep +pack \&.ep + +package require persistentSelection +::persistentSelection::fixText +bind Text <> {::persistentSelection::report text %W} +bind EntryPlus <> {::persistentSelection::report entry %W} + +.CE +Monitor all \fB\fBtext\fR\fR widgets that use \fBNtext\fR bindings\&. +.CS + + +text \&.t +pack \&.t + +package require ntext +bindtags \&.t {\&.t Ntext \&. all} + +package require persistentSelection +bind Ntext <> {::persistentSelection::report text %W} + +.CE +Monitor a single \fB\fBentryPlus\fR\fR widget \fB\&.ep\fR +.CS + + +package require widgetPlus +widgetPlus::entryPlus \&.ep +pack \&.ep + +package require persistentSelection +bind \&.ep <> {::persistentSelection::report entry %W} + +.CE +Monitor a single \fB\fBtext\fR\fR widget \fB\&.t\fR +.CS + + +text \&.t +pack \&.t + +package require persistentSelection +bind \&.t <> {::persistentSelection::report text %W} + +.CE +.SH "SEE ALSO" +bindtags, ntext, text, widgetPlus \ No newline at end of file diff --git a/embedded/man/files/modules/plotchart/plotchart.n b/embedded/man/files/modules/plotchart/plotchart.n index 0a613bbd..07c38cd1 100644 --- a/embedded/man/files/modules/plotchart/plotchart.n +++ b/embedded/man/files/modules/plotchart/plotchart.n @@ -330,6 +330,8 @@ package require \fBPlotchart ?2\&.4\&.0?\fR .sp \fB::Plotchart::createTernaryDiagram\fR \fIw\fR \fIargs\fR .sp +\fB::Plotchart::createNormalPlot\fR \fIw\fR \fIxscale\fR \fIargs\fR +.sp \fB::Plotchart::createStatusTimeline\fR \fIw\fR \fIxaxis\fR \fIylabel\fR \fIargs\fR .sp \fB$anyplot\fR title \fItext\fR \fIposition\fR @@ -382,6 +384,10 @@ package require \fBPlotchart ?2\&.4\&.0?\fR .sp \fB$xyplot\fR plot \fIseries\fR \fIxcrd\fR \fIycrd\fR .sp +\fB$normalplot\fR plot \fIseries\fR \fImean\fR \fIstdev\fR \fIdata\fR +.sp +\fB$normalplot\fR diagonal +.sp \fB$xyplot\fR plotlist \fIseries\fR \fIxlist\fR \fIylist\fR \fIevery\fR .sp \fB$xyplot\fR region \fIseries\fR \fIxlist\fR \fIylist\fR @@ -1257,6 +1263,33 @@ to influence the number of labels along the three sides\&. .RE .sp .TP +\fB::Plotchart::createNormalPlot\fR \fIw\fR \fIxscale\fR \fIargs\fR +Create a command to draw a normal plot - useful to investigate whether a data set is normally +distributed or not\&. In that case the data will fall on or near the diagonal\&. As such, it is a +specialised plotting procedure\&. +.sp +The details of the plotting procedure have been adopted from the \fIqqnorm\fR in the "R" \fIstats\fR +package and described on Wikipedia\&. +.sp +As the implementation of this plot type relies on the \fImath::statistics\fR package, it is only +available if that package can be loaded\&. +.RS +.TP +widget \fIw\fR (in) +Name of the canvas widget to hold the normal plot\&. +.TP +list \fIxscale\fR (in) +A 3-element list containing minimum, maximum and stepsize for the x-axis +in this order\&. The scaling of the y-axis is determined from that\&. \fIImportant:\fR the scale +is to be given in terms of the normalised data, that is: 0 represents the mean of the data, +1 one standard deviation away from the mean etc\&. +.TP +list \fIargs\fR (in) +Zero or more option-value pairs to influence the position and the appearance of the +plot - see the XY-plot for more details\&. +.RE +.sp +.TP \fB::Plotchart::createStatusTimeline\fR \fIw\fR \fIxaxis\fR \fIylabel\fR \fIargs\fR Create a command to draw a so-called status timeline\&. Its layout is similar to a horizontal barchart, but the bars are drawn in different colours, each representing the status of @@ -1718,6 +1751,32 @@ Y-coordinate of the new point\&. .RE .PP .PP +For \fInormal plots\fR: +.TP +\fB$normalplot\fR plot \fIseries\fR \fImean\fR \fIstdev\fR \fIdata\fR +Plot the data set using the given mean and stanard deviation\&. +.sp +As you give the mean and standard deviation separately, the plot can be used for several data series +or for adding to an existing data series\&. +.RS +.TP +string \fIseries\fR (in) +Name of the data series - used to determine the appearance +.TP +float \fImean\fR (in) +Assumed mean of the data set\&. +.TP +float \fIstdev\fR (in) +Assumed standard deviation of the data set\&. +.TP +list \fIdata\fR (in) +List of the data comprising the data set +.RE +.TP +\fB$normalplot\fR diagonal +Draw a diagonal line, indicating the ideal normally distributed data set\&. +.PP +.PP For \fIxy, x-log y, log-x-y, log-x-log-y plots\fR there is the additional command \fIplotlist\fR, which is useful for plotting a large amount of data: .TP diff --git a/embedded/man/files/modules/widgetPlus/widgetPlus.n b/embedded/man/files/modules/widgetPlus/widgetPlus.n new file mode 100644 index 00000000..7825cd57 --- /dev/null +++ b/embedded/man/files/modules/widgetPlus/widgetPlus.n @@ -0,0 +1,617 @@ +'\" +'\" Generated from file 'widgetPlus\&.man~' by tcllib/doctools with format 'nroff' +'\" +.TH "widgetPlus" n 1\&.0 tklib "Enhanced Entry, Spinbox, and Combobox Widgets with Undo/Redo and other useful features" +.\" The -*- nroff -*- definitions below are for supplemental macros used +.\" in Tcl/Tk manual entries. +.\" +.\" .AP type name in/out ?indent? +.\" Start paragraph describing an argument to a library procedure. +.\" type is type of argument (int, etc.), in/out is either "in", "out", +.\" or "in/out" to describe whether procedure reads or modifies arg, +.\" and indent is equivalent to second arg of .IP (shouldn't ever be +.\" needed; use .AS below instead) +.\" +.\" .AS ?type? ?name? +.\" Give maximum sizes of arguments for setting tab stops. Type and +.\" name are examples of largest possible arguments that will be passed +.\" to .AP later. If args are omitted, default tab stops are used. +.\" +.\" .BS +.\" Start box enclosure. From here until next .BE, everything will be +.\" enclosed in one large box. +.\" +.\" .BE +.\" End of box enclosure. +.\" +.\" .CS +.\" Begin code excerpt. +.\" +.\" .CE +.\" End code excerpt. +.\" +.\" .VS ?version? ?br? +.\" Begin vertical sidebar, for use in marking newly-changed parts +.\" of man pages. The first argument is ignored and used for recording +.\" the version when the .VS was added, so that the sidebars can be +.\" found and removed when they reach a certain age. If another argument +.\" is present, then a line break is forced before starting the sidebar. +.\" +.\" .VE +.\" End of vertical sidebar. +.\" +.\" .DS +.\" Begin an indented unfilled display. +.\" +.\" .DE +.\" End of indented unfilled display. +.\" +.\" .SO ?manpage? +.\" Start of list of standard options for a Tk widget. The manpage +.\" argument defines where to look up the standard options; if +.\" omitted, defaults to "options". The options follow on successive +.\" lines, in three columns separated by tabs. +.\" +.\" .SE +.\" End of list of standard options for a Tk widget. +.\" +.\" .OP cmdName dbName dbClass +.\" Start of description of a specific option. cmdName gives the +.\" option's name as specified in the class command, dbName gives +.\" the option's name in the option database, and dbClass gives +.\" the option's class in the option database. +.\" +.\" .UL arg1 arg2 +.\" Print arg1 underlined, then print arg2 normally. +.\" +.\" .QW arg1 ?arg2? +.\" Print arg1 in quotes, then arg2 normally (for trailing punctuation). +.\" +.\" .PQ arg1 ?arg2? +.\" Print an open parenthesis, arg1 in quotes, then arg2 normally +.\" (for trailing punctuation) and then a closing parenthesis. +.\" +.\" # Set up traps and other miscellaneous stuff for Tcl/Tk man pages. +.if t .wh -1.3i ^B +.nr ^l \n(.l +.ad b +.\" # Start an argument description +.de AP +.ie !"\\$4"" .TP \\$4 +.el \{\ +. ie !"\\$2"" .TP \\n()Cu +. el .TP 15 +.\} +.ta \\n()Au \\n()Bu +.ie !"\\$3"" \{\ +\&\\$1 \\fI\\$2\\fP (\\$3) +.\".b +.\} +.el \{\ +.br +.ie !"\\$2"" \{\ +\&\\$1 \\fI\\$2\\fP +.\} +.el \{\ +\&\\fI\\$1\\fP +.\} +.\} +.. +.\" # define tabbing values for .AP +.de AS +.nr )A 10n +.if !"\\$1"" .nr )A \\w'\\$1'u+3n +.nr )B \\n()Au+15n +.\" +.if !"\\$2"" .nr )B \\w'\\$2'u+\\n()Au+3n +.nr )C \\n()Bu+\\w'(in/out)'u+2n +.. +.AS Tcl_Interp Tcl_CreateInterp in/out +.\" # BS - start boxed text +.\" # ^y = starting y location +.\" # ^b = 1 +.de BS +.br +.mk ^y +.nr ^b 1u +.if n .nf +.if n .ti 0 +.if n \l'\\n(.lu\(ul' +.if n .fi +.. +.\" # BE - end boxed text (draw box now) +.de BE +.nf +.ti 0 +.mk ^t +.ie n \l'\\n(^lu\(ul' +.el \{\ +.\" Draw four-sided box normally, but don't draw top of +.\" box if the box started on an earlier page. +.ie !\\n(^b-1 \{\ +\h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul' +.\} +.el \}\ +\h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul' +.\} +.\} +.fi +.br +.nr ^b 0 +.. +.\" # VS - start vertical sidebar +.\" # ^Y = starting y location +.\" # ^v = 1 (for troff; for nroff this doesn't matter) +.de VS +.if !"\\$2"" .br +.mk ^Y +.ie n 'mc \s12\(br\s0 +.el .nr ^v 1u +.. +.\" # VE - end of vertical sidebar +.de VE +.ie n 'mc +.el \{\ +.ev 2 +.nf +.ti 0 +.mk ^t +\h'|\\n(^lu+3n'\L'|\\n(^Yu-1v\(bv'\v'\\n(^tu+1v-\\n(^Yu'\h'-|\\n(^lu+3n' +.sp -1 +.fi +.ev +.\} +.nr ^v 0 +.. +.\" # Special macro to handle page bottom: finish off current +.\" # box/sidebar if in box/sidebar mode, then invoked standard +.\" # page bottom macro. +.de ^B +.ev 2 +'ti 0 +'nf +.mk ^t +.if \\n(^b \{\ +.\" Draw three-sided box if this is the box's first page, +.\" draw two sides but no top otherwise. +.ie !\\n(^b-1 \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c +.el \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c +.\} +.if \\n(^v \{\ +.nr ^x \\n(^tu+1v-\\n(^Yu +\kx\h'-\\nxu'\h'|\\n(^lu+3n'\ky\L'-\\n(^xu'\v'\\n(^xu'\h'|0u'\c +.\} +.bp +'fi +.ev +.if \\n(^b \{\ +.mk ^y +.nr ^b 2 +.\} +.if \\n(^v \{\ +.mk ^Y +.\} +.. +.\" # DS - begin display +.de DS +.RS +.nf +.sp +.. +.\" # DE - end display +.de DE +.fi +.RE +.sp +.. +.\" # SO - start of list of standard options +.de SO +'ie '\\$1'' .ds So \\fBoptions\\fR +'el .ds So \\fB\\$1\\fR +.SH "STANDARD OPTIONS" +.LP +.nf +.ta 5.5c 11c +.ft B +.. +.\" # SE - end of list of standard options +.de SE +.fi +.ft R +.LP +See the \\*(So manual entry for details on the standard options. +.. +.\" # OP - start of full description for a single option +.de OP +.LP +.nf +.ta 4c +Command-Line Name: \\fB\\$1\\fR +Database Name: \\fB\\$2\\fR +Database Class: \\fB\\$3\\fR +.fi +.IP +.. +.\" # CS - begin code excerpt +.de CS +.RS +.nf +.ta .25i .5i .75i 1i +.. +.\" # CE - end code excerpt +.de CE +.fi +.RE +.. +.\" # UL - underline word +.de UL +\\$1\l'|0\(ul'\\$2 +.. +.\" # QW - apply quotation marks to word +.de QW +.ie '\\*(lq'"' ``\\$1''\\$2 +.\"" fix emacs highlighting +.el \\*(lq\\$1\\*(rq\\$2 +.. +.\" # PQ - apply parens and quotation marks to word +.de PQ +.ie '\\*(lq'"' (``\\$1''\\$2)\\$3 +.\"" fix emacs highlighting +.el (\\*(lq\\$1\\*(rq\\$2)\\$3 +.. +.\" # QR - quoted range +.de QR +.ie '\\*(lq'"' ``\\$1''\\-``\\$2''\\$3 +.\"" fix emacs highlighting +.el \\*(lq\\$1\\*(rq\\-\\*(lq\\$2\\*(rq\\$3 +.. +.\" # MT - "empty" string +.de MT +.QW "" +.. +.BS +.SH NAME +widgetPlus \- Enhanced Entry, Spinbox, and Combobox Widgets with Undo/Redo and other useful features +.SH SYNOPSIS +package require \fBTcl 8\&.5\fR +.sp +package require \fBTk 8\&.5\fR +.sp +package require \fBsnit \fR +.sp +package require \fBwidgetPlus ?1\&.0?\fR +.sp +\fBwidgetPlus::entryPlus\fR ?\fIcreate\fR? \fIpathName\fR +.sp +\fBwidgetPlus::spinboxPlus\fR ?\fIcreate\fR? \fIpathName\fR +.sp +\fBwidgetPlus::ttkEntryPlus\fR ?\fIcreate\fR? \fIpathName\fR +.sp +\fBwidgetPlus::ttkSpinboxPlus\fR ?\fIcreate\fR? \fIpathName\fR +.sp +\fBwidgetPlus::ttkComboboxPlus\fR ?\fIcreate\fR? \fIpathName\fR +.sp +\fBwidgetPlus::EnableBWidget\fR +.sp +\fIpathName\fR \fBedit\fR ?\fIarg arg \&.\&.\&.\fR? +.sp +\fIpathName\fR \fBedit canredo\fR +.sp +\fIpathName\fR \fBedit canundo\fR +.sp +\fIpathName\fR \fBedit modified\fR ?\fIboolean\fR? +.sp +\fIpathName\fR \fBedit redo\fR +.sp +\fIpathName\fR \fBedit reset\fR +.sp +\fIpathName\fR \fBedit separator\fR +.sp +\fIpathName\fR \fBedit undo\fR +.sp +.BE +.SH DESCRIPTION +The \fBwidgetPlus\fR package adds new features to the widgets \fB\fBentry\fR\fR, \fB\fBspinbox\fR\fR, \fB\fBttk::entry\fR\fR, \fB\fBttk::spinbox\fR\fR, and \fB\fBttk::combobox\fR\fR\&. +.PP +The new features are Undo and Redo operations, a \fB<>\fR event, and for the \fBTk\fR (unthemed) widgets an \fB-inactiveselectbackground\fR option, and some minor fixes to bindings\&. The new facilities closely follow those of the \fB\fBtext\fR\fR widget\&. +.PP +The revised \fB\fBentry\fR\fR, \fB\fBspinbox\fR\fR, \fB\fBttk::entry\fR\fR, \fB\fBttk::spinbox\fR\fR, and \fB\fBttk::combobox\fR\fR widgets are created by the commands \fBwidgetPlus::entryPlus\fR, \fBwidgetPlus::spinboxPlus\fR, \fBwidgetPlus::ttkEntryPlus\fR, \fBwidgetPlus::ttkSpinboxPlus\fR, and \fBwidgetPlus::ttkComboboxPlus\fR respectively\&. +.PP +For example, the \fBwidgetPlus::entryPlus\fR widget is implemented as a \fISnit\fR \fBsnit::widgetadaptor\fR that wraps a \fBTk\fR \fB\fBentry\fR\fR widget\&. Its \fBwinfo class\fR is \fBEntry\fR, and it uses a binding tag \fBEntryPlus\fR that replaces the \fBEntry\fR binding tag\&. The other widgets are implemented in a similar way\&. +.PP +The package uses the namespace \fB::widgetPlus\fR, which exports (only) the five commands defined below that begin with a lower-case letter (\fBEnableBWidget\fR is not exported)\&. These commands can be imported into the global namespace, and for simplicity, descriptive text in this manual will henceforth omit the namespace qualifier\&. +.CS + + +namespace import ::widgetPlus::* + +.CE +.SH "WIDGET OPTIONS" +In addition to the usual options of the \fB\fBentry\fR\fR, \fB\fBspinbox\fR\fR, \fB\fBttk::entry\fR\fR, \fB\fBttk::spinbox\fR\fR, and \fB\fBttk::combobox\fR\fR widgets, the wrappers \fB\fBentryPlus\fR\fR, \fB\fBspinboxPlus\fR\fR, \fB\fBttkEntryPlus\fR\fR, \fB\fBttkSpinboxPlus\fR\fR, and \fB\fBttkComboboxPlus\fR\fR provide the options below\&. +.LP +.nf +.ta 6c +Command-Line Switch: \fB\fB-inactiveselectbackground\fR\fR +Database Name: \fBinactiveSelectBackground\fR +Database Class: \fBForeground\fR + +.fi +.IP +Specifies the color to use for the selection when the window does not have the input \fBfocus\fR\&. If empty, \fB{}\fR, then no selection is shown when the window does not have the \fBfocus\fR\&. The \fB-inactiveselectbackground\fR option has no effect on the \fBTtk\fR (themed) widgets \fB\fBttkEntryPlus\fR\fR, \fB\fBttkSpinboxPlus\fR\fR, and \fB\fBttkComboboxPlus\fR\fR\&. +.LP +.nf +.ta 6c +Command-Line Switch: \fB\fB-maxundo\fR\fR +Database Name: \fBmaxUndo\fR +Database Class: \fBMaxUndo\fR + +.fi +.IP +Specifies the maximum number of compound undo actions on the \fIundo stack\fR\&. A zero or a negative value imply an unlimited \fIundo stack\fR\&. +.LP +.nf +.ta 6c +Command-Line Switch: \fB\fB-undo\fR\fR +Database Name: \fBundo\fR +Database Class: \fBUndo\fR + +.fi +.IP +Specifies a \fIboolean\fR that says whether the undo mechanism is active or not\&. +.PP +.SH COMMANDS +.TP +\fBwidgetPlus::entryPlus\fR ?\fIcreate\fR? \fIpathName\fR +Create an \fB\fBentryPlus\fR\fR widget; or convert an existing \fBentry\fR widget into an \fB\fBentryPlus\fR\fR\&. +.TP +\fBwidgetPlus::spinboxPlus\fR ?\fIcreate\fR? \fIpathName\fR +Create a \fB\fBspinboxPlus\fR\fR widget; or convert an existing \fBspinbox\fR widget into a \fB\fBspinboxPlus\fR\fR\&. +.TP +\fBwidgetPlus::ttkEntryPlus\fR ?\fIcreate\fR? \fIpathName\fR +Create a \fB\fBttkEntryPlus\fR\fR widget; or convert an existing \fBttk::entry\fR widget into a \fB\fBttkEntryPlus\fR\fR\&. +.TP +\fBwidgetPlus::ttkSpinboxPlus\fR ?\fIcreate\fR? \fIpathName\fR +Create a \fB\fBttkSpinboxPlus\fR\fR widget; or convert an existing \fBttk::spinbox\fR widget into a \fB\fBttkSpinboxPlus\fR\fR\&. +.TP +\fBwidgetPlus::ttkComboboxPlus\fR ?\fIcreate\fR? \fIpathName\fR +Create a \fB\fBttkComboboxPlus\fR\fR widget; or convert an existing \fBttk::combobox\fR widget into a \fB\fBttkComboboxPlus\fR\fR\&. +.TP +\fBwidgetPlus::EnableBWidget\fR +Enable \fBwidgetPlus\fR to modify \fBBWidget\fR \fB\fBEntry\fR\fR widgets and their compounds (such as the \fBBWidget\fR \fB\fBComboBox\fR\fR)\&. The command creates a bindtag \fBBwEntryPlus\fR to replace the default bindtag \fBBwEntry\fR\&. This operation is not performed when the package is loaded because it requires \fBBWidget\fR to be loaded first\&. This command is not exported from namespace \fB::widgetPlus\fR\&. +.PP +.SH "WIDGET COMMANDS" +In addition to the usual commands of the \fB\fBentry\fR\fR, \fB\fBspinbox\fR\fR, \fB\fBttk::entry\fR\fR, \fB\fBttk::spinbox\fR\fR, and \fB\fBttk::combobox\fR\fR widgets, the wrappers \fB\fBentryPlus\fR\fR, \fB\fBttkEntryPlus\fR\fR, \fB\fBspinboxPlus\fR\fR, \fB\fBttkSpinboxPlus\fR\fR, and \fB\fBttkComboboxPlus\fR\fR provide: +.TP +\fIpathName\fR \fBedit\fR ?\fIarg arg \&.\&.\&.\fR? +This command controls the undo mechanism and the \fImodified flag\fR\&. The exact behavior of the command depends on the option argument that follows the edit argument\&. The following forms of the command are currently supported: +.TP +\fIpathName\fR \fBedit canredo\fR +Returns a \fIboolean\fR \fBtrue\fR if redo is possible, i\&.e\&. when the \fIredo stack\fR is not empty\&. Otherwise returns \fBfalse\fR\&. +.TP +\fIpathName\fR \fBedit canundo\fR +Returns a \fIboolean\fR \fBtrue\fR if undo is possible, i\&.e\&. when the \fIundo stack\fR is not empty\&. Otherwise returns \fBfalse\fR\&. +.TP +\fIpathName\fR \fBedit modified\fR ?\fIboolean\fR? +If \fIboolean\fR is not specified, returns the \fImodified flag\fR of the widget\&. The \fBinsert\fR, \fBdelete\fR, \fBedit undo\fR and \fBedit redo\fR commands, or (by using this command) the user, can set or clear the \fImodified flag\fR\&. If \fIboolean\fR is specified, sets the \fImodified flag\fR of the widget to \fIboolean\fR\&. +.TP +\fIpathName\fR \fBedit redo\fR +When the \fB-undo\fR option is \fBtrue\fR, reapplies the last undone edits provided no other edits were done since then\&. Generates an error when the \fIredo stack\fR is empty\&. Does nothing when the \fB-undo\fR option is \fBfalse\fR\&. +.TP +\fIpathName\fR \fBedit reset\fR +Clears the \fIundo stack\fR and \fIredo stack\fR\&. +.TP +\fIpathName\fR \fBedit separator\fR +Included for completeness, but has no effect\&. +.sp +(N\&.B\&. An implicit separator is added to the \fIundo stack\fR for each call to a widget command (e\&.g\&. \fBinsert\fR or \fBdelete\fR) that changes the widget contents\&. These therefore separate the addition or removal of individual characters by typing, except that \fIcut\fR or \fIpaste\fR operations are discrete\&.) +.TP +\fIpathName\fR \fBedit undo\fR +Undoes the last edit action when the \fB-undo\fR option is \fBtrue\fR\&. An edit action is defined as a single \fBinsert\fR or \fBdelete\fR command that is recorded on the \fIundo stack\fR\&. Generates an error when the \fIundo stack\fR is empty\&. Does nothing when the \fB-undo\fR option is \fBfalse\fR\&. +.PP +.SH BINDINGS +.SS "CLASS BINDINGS" +The class binding tag for different widgets has these default values: +.IP \(bu +\fB\fBentry\fR\fR uses \fBEntry\fR +.IP \(bu +\fB\fBspinbox\fR\fR uses \fBSpinbox\fR +.IP \(bu +\fB\fBttk::entry\fR\fR uses \fBTEntry\fR +.IP \(bu +\fB\fBttk::spinbox\fR\fR uses \fBTSpinbox\fR +.IP \(bu +\fB\fBttk::combobox\fR\fR uses \fBTCombobox\fR +.IP \(bu +\fB\fBentryPlus\fR\fR uses \fBEntryPlus\fR +.IP \(bu +\fB\fBspinboxPlus\fR\fR uses \fBSpinboxPlus\fR +.IP \(bu +\fB\fBttkEntryPlus\fR\fR uses \fBTEntryPlus\fR +.IP \(bu +\fB\fBttkSpinboxPlus\fR\fR uses \fBTSpinboxPlus\fR +.IP \(bu +\fB\fBttkComboboxPlus\fR\fR uses \fBTComboboxPlus\fR +.PP +.SS "UNDO AND REDO" +The \fB<>\fR and \fB<>\fR virtual events are mapped to these keyboard events: +.IP \(bu +On X11 systems (Linux®, BSD®, Solaris®, etc): +.RS +.IP \(bu +\fB<>\fR is mapped to \fB\fR +.RE +.RS +.IP \(bu +\fB<>\fR is mapped to \fB\fR +.RE +.IP \(bu +On Windows® systems: +.RS +.IP \(bu +\fB<>\fR is mapped to \fB\fR +.RE +.RS +.IP \(bu +\fB<>\fR is mapped to \fB\fR +.RE +.IP \(bu +On Aqua® systems (i\&.e\&. Apple® macOS® or OS X®): +.RS +.IP \(bu +\fB<>\fR is mapped to \fB\fR +.RE +.RS +.IP \(bu +\fB<>\fR is mapped to \fB\fR +.RE +.PP +.SS ENTRYPLUS +The \fBEntryPlus\fR bindings are based on those of the \fBEntry\fR bindtag, with these changes: +.IP \(bu +New bindings to \fB<>\fR and \fB<>\fR\&. +.IP \(bu +An adjustment to the \fB<>\fR binding, so that it behaves the same way on X11 as on other windowing systems (i\&.e\&. it deletes the existing selection, if any exists)\&. +.IP \(bu +The removal of the antiquated \fB\fR binding\&. +.IP \(bu +New bindings to \fB\fR and \fB\fR, to facilitate the implementation of the \fB-inactiveselectbackground\fR option\&. +.PP +.SS SPINBOXPLUS +The \fBSpinboxPlus\fR bindings are based on those of the \fBSpinbox\fR bindtag, with the same changes as are made when converting \fBEntry\fR to \fBEntryPlus\fR\&. +.SS TENTRYPLUS +The \fBTEntryPlus\fR bindings are based on those of the \fBTEntry\fR bindtag, with these changes: +.IP \(bu +New bindings to \fB<>\fR and \fB<>\fR\&. +.PP +.SS TSPINBOXPLUS +The \fBTSpinboxPlus\fR bindings are based on those of the \fBTSpinbox\fR bindtag, with these changes: +.IP \(bu +New bindings to \fB<>\fR and \fB<>\fR\&. +.PP +.SS TCOMBOBOXPLUS +The \fBTComboboxPlus\fR bindings are based on those of the \fBTCombobox\fR bindtag, with these changes: +.IP \(bu +New bindings to \fB<>\fR and \fB<>\fR\&. +.PP +.SH "VIRTUAL EVENT <>" +Each \fBwidgetPlus\fR widget generates a virtual event \fB<>\fR whenever the value of its selection changes\&. This allows other \fBTcl\fR code, for example the package \fBpersistentSelection\fR, to monitor the selection in these widgets\&. +.SH "USE WITH MEGAWIDGETS" +When an \fB\fBentry\fR\fR, \fB\fBspinbox\fR\fR, \fB\fBttk::entry\fR\fR, \fB\fBttk::spinbox\fR\fR, or \fB\fBttk::combobox\fR\fR is a component of a megawidget, it is often possible to apply \fBwidgetPlus\fR to that component without modifying the megawidget code\&. +.SS "COMBOBOX (BY BRYAN OAKLEY)" +A \fB\fBcombobox\fR\fR with path \fB$w\fR includes an \fB\fBentry\fR\fR widget \fB$w\&.entry\fR, which uses the \fBEntry\fR binding tag\&. Thus \fBwidgetPlus\fR can be applied to the \fB\fBcombobox\fR\fR after creation, using the command (see \fBEXAMPLES\fR) +.CS + + +entryPlus $w\&.entry -undo 1 -maxundo 0 + +.CE +.SS "COMBOBOX (BWIDGET)" +A \fBBWidget\fR \fBComboBox\fR with path \fB$w\fR includes an \fB\fBentry\fR\fR widget \fB$w\&.e\fR, which uses the \fBBwEntry\fR binding tag in place of the default tag \fBEntry\fR\&. +.PP +Package \fBwidgetPlus\fR provides a replacement bindtag \fBBwEntryPlus\fR, but this is not computed when the package is loaded because it requires \fBBWidget\fR to be loaded first\&. The command \fB::widgetPlus::EnableBWidget\fR must be called to provide \fBBwEntryPlus\fR, and then the \fBBWidget\fR \fBComboBox\fR can be modified (see \fBEXAMPLES\fR) +.CS + + +::widgetPlus::EnableBWidget +entryPlus $w\&.e -undo 1 -maxundo 0 + +.CE +.SH "TO DO" +.IP \(bu +Undo and Redo do not sync the value of the \fImodified flag\fR - they always set the value to \fIboolean\fR \fBtrue\fR\&. +.IP \(bu +Undo and Redo do not sync the position of the insertion cursor\&. +.IP \(bu +The \fB<>\fR event is not generated\&. +.IP \(bu +Undo/Redo separators, and the \fB-autoseparators\fR option, as found in the \fB\fBtext\fR\fR widget, are not implemented\&. An implicit separator is added for each call to a widget command (e\&.g\&. \fBinsert\fR or \fBdelete\fR) that changes the widget contents\&. The \fBedit separator\fR command has no effect\&. Separator functionality would be less useful for widgets such as \fB\fBentryPlus\fR\fR than it is for a \fB\fBtext\fR\fR widget\&. +.IP \(bu +Add an \fIoverwrite\fR mode, toggled by \fB\fR on non-\fImacOS\fR® systems\&. +.PP +.SH BUGS +This version of \fBwidgetPlus\fR is intended to be compatible with all releases of \fBTk\fR 8\&.5 and 8\&.6, and with the branches \fIcore-8-5-branch\fR, \fIcore-8-6-branch\fR, and \fItrunk\fR in the source code repository for \fBTk\fR\&. Any incompatibility with any of these versions, for any \fBTk\fR windowing system, should be reported as a bug\&. Please report such in the category \fIwidgetPlus\fR of the \fITklib Trackers\fR [http://core\&.tcl\&.tk/tklib/reportlist]\&. +.SH EXAMPLES +To create and map an \fB\fBentryPlus\fR\fR widget \&.ep with an unlimited Undo/Redo stack: +.CS + + +package require widgetPlus +widgetPlus::entryPlus \&.ep -undo 1 -maxundo 0 +pack \&.ep + +.CE +The same but using \fBnamespace import\fR: +.CS + + +package require widgetPlus +namespace import widgetPlus::* +entryPlus \&.ep -undo 1 -maxundo 0 +pack \&.ep + +.CE +To convert an existing \fB\fBentry\fR\fR widget \&.ee into an \fB\fBentryPlus\fR\fR with an unlimited Undo/Redo stack: +.CS + + +entry \&.ee + + \&. + \&. + \&. + +package require widgetPlus +widgetPlus::entryPlus \&.ee -undo 1 -maxundo 0 + +.CE +The same but using \fBnamespace import\fR: +.CS + + +entry \&.ee + + \&. + \&. + \&. + +package require widgetPlus +namespace import widgetPlus::* +entryPlus \&.ee -undo 1 -maxundo 0 + +.CE +Apply \fBwidgetPlus\fR to a Bryan Oakley \fB\fBcombobox\fR\fR: +.CS + + +package require combobox +combobox::combobox \&.cb + + \&. + \&. + \&. + +package require widgetPlus +namespace import widgetPlus::* +entryPlus \&.cb\&.entry -undo 1 -maxundo 0 + +.CE +Apply \fBwidgetPlus\fR to a \fBBWidget\fR \fB\fBComboBox\fR\fR\&. The command \fB::widgetPlus::EnableBWidget\fR must be called first\&. +.CS + + +package require BWidget +ComboBox \&.cb + + \&. + \&. + \&. + +package require widgetPlus +::widgetPlus::EnableBWidget +namespace import widgetPlus::* + +entryPlus \&.cb\&.e -undo 1 -maxundo 0 + +.CE +.SH "SEE ALSO" +BWidget, ComboBox, Entry, entry, persistentSelection, spinbox, text, ttk::combobox, ttk::entry, ttk::spinbox \ No newline at end of file diff --git a/embedded/man/toc.n b/embedded/man/toc.n index 29b9d1ad..5ed8fb17 100644 --- a/embedded/man/toc.n +++ b/embedded/man/toc.n @@ -273,6 +273,9 @@ Database Class: \\fB\\$3\\fR tklib .RS .TP +\fBaddUndo\fR +\fIfiles/modules/widgetPlus/\&.old/addUndo\&.n\fR: Adding Undo/Redo to Entry, Spinbox, and Combobox Widgets +.TP \fBautoscroll\fR \fIfiles/modules/autoscroll/autoscroll\&.n\fR: Provides for a scrollbar to automatically mapped and unmapped as needed .TP @@ -375,6 +378,9 @@ tklib \fBntextWordBreak\fR \fIfiles/modules/ntext/ntextWordBreak\&.n\fR: ntext Word Boundary Detection for the Text Widget .TP +\fBpersistentSelection\fR +\fIfiles/modules/persistentSelection/persistentSelection\&.n\fR: Enhanced PRIMARY selection +.TP \fBpie\fR \fIfiles/modules/tkpiechart/pie\&.n\fR: 2D or 3D pie chart object in a canvas .TP @@ -412,4 +418,10 @@ tklib \fIfiles/modules/widget/widget_toolbar\&.n\fR: Toolbar Megawidget .TP \fBwidget_validator\fR -\fIfiles/modules/widgetv/widget_validator\&.n\fR: widget::validator behaviour \ No newline at end of file +\fIfiles/modules/widgetv/widget_validator\&.n\fR: widget::validator behaviour +.TP +\fBwidgetPlus\fR +\fIfiles/modules/widgetPlus/\&.old/addUndo\&.man--old\&.n\fR: Enhanced Entry, Spinbox, and Combobox Widgets with Undo/Redo and other useful features +.TP +\fBwidgetPlus\fR +\fIfiles/modules/widgetPlus/widgetPlus\&.n\fR: Enhanced Entry, Spinbox, and Combobox Widgets with Undo/Redo and other useful features \ No newline at end of file diff --git a/embedded/www/index.html b/embedded/www/index.html index 08ae419a..c9472ef8 100644 --- a/embedded/www/index.html +++ b/embedded/www/index.html @@ -23,7 +23,7 @@

    Keyword Index

    Keywords: 2
    - + @@ -31,22 +31,22 @@

    Keyword Index

    Keywords: A
    - + - + - + - + @@ -54,32 +54,32 @@

    Keyword Index

    Keywords: B
    - + - + - + - + - + - + @@ -87,87 +87,87 @@

    Keyword Index

    Keywords: C
    - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -175,77 +175,77 @@

    Keyword Index

    Keywords: D
    - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -253,32 +253,32 @@

    Keyword Index

    Keywords: E
    - + - + - + - + - + - + @@ -286,17 +286,17 @@

    Keyword Index

    Keywords: G
    - + - + - + @@ -304,22 +304,22 @@

    Keyword Index

    Keywords: H
    - + - + - + - + @@ -327,67 +327,67 @@

    Keyword Index

    Keywords: I
    - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -395,32 +395,32 @@

    Keyword Index

    Keywords: L
    - + - + - + - + - + - + @@ -428,42 +428,42 @@

    Keyword Index

    Keywords: M
    - + - + - + - + - + - + - + - + @@ -471,22 +471,22 @@

    Keyword Index

    Keywords: N
    - + - + - + - + @@ -494,62 +494,62 @@

    Keyword Index

    Keywords: P
    - + - + - + - + - + - + - + - + - + - + - + - + @@ -557,7 +557,7 @@

    Keyword Index

    Keywords: Q
    - + @@ -565,32 +565,32 @@

    Keyword Index

    Keywords: R
    - + - + - + - + - + - + @@ -598,87 +598,87 @@

    Keyword Index

    Keywords: S
    - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -686,47 +686,47 @@

    Keyword Index

    Keywords: T
    - + - + - + - + - + - + - + - + - + @@ -734,22 +734,22 @@

    Keyword Index

    Keywords: V
    - + - + - + - + @@ -757,17 +757,17 @@

    Keyword Index

    Keywords: W
    - + - + - + @@ -775,7 +775,7 @@

    Keyword Index

    Keywords: X
    - + @@ -783,7 +783,7 @@

    Keyword Index

    Keywords: Z
    - + diff --git a/embedded/www/tklib/files/apps/bitmap-editor.html b/embedded/www/tklib/files/apps/bitmap-editor.html index 0593af40..e6a789e5 100644 --- a/embedded/www/tklib/files/apps/bitmap-editor.html +++ b/embedded/www/tklib/files/apps/bitmap-editor.html @@ -172,7 +172,7 @@

    bitmap-editor(n) 1.0 tklib "Bitmap handling"

    package and/or documentation.

    Category

    Image processing

    diff --git a/embedded/www/tklib/files/apps/diagram-viewer.html b/embedded/www/tklib/files/apps/diagram-viewer.html index 46c2df1a..47ab4866 100644 --- a/embedded/www/tklib/files/apps/diagram-viewer.html +++ b/embedded/www/tklib/files/apps/diagram-viewer.html @@ -177,7 +177,7 @@

    diagram-viewer(n) 1.0 tklib "Documentation toolbox"< package img::format

    path inputfile (in)

    This argument specifies the path to the diagram file to process. It -has to exist, must be readable, and written in diagram format.

    +has to exist, must be readable, and written in diagram format.

    @@ -199,7 +199,7 @@

    diagram-viewer(n) 1.0 tklib "Documentation toolbox"< package and/or documentation.

    Category

    Documentation tools

    diff --git a/embedded/www/tklib/files/modules/autoscroll/autoscroll.html b/embedded/www/tklib/files/modules/autoscroll/autoscroll.html index b1d3f958..69294f74 100644 --- a/embedded/www/tklib/files/modules/autoscroll/autoscroll.html +++ b/embedded/www/tklib/files/modules/autoscroll/autoscroll.html @@ -180,6 +180,6 @@

    autoscroll(n) 1.1 tklib "Automatic mapping of scrollbars& package and/or documentation.

    diff --git a/embedded/www/tklib/files/modules/canvas/canvas_drag.html b/embedded/www/tklib/files/modules/canvas/canvas_drag.html index defef828..e7d9207e 100644 --- a/embedded/www/tklib/files/modules/canvas/canvas_drag.html +++ b/embedded/www/tklib/files/modules/canvas/canvas_drag.html @@ -242,6 +242,6 @@

    canvas::drag(n) 0.1 tklib "Variations on a canvas" diff --git a/embedded/www/tklib/files/modules/canvas/canvas_epoints.html b/embedded/www/tklib/files/modules/canvas/canvas_epoints.html index 3eda130e..d8a51c78 100644 --- a/embedded/www/tklib/files/modules/canvas/canvas_epoints.html +++ b/embedded/www/tklib/files/modules/canvas/canvas_epoints.html @@ -321,6 +321,6 @@

    canvas::edit::points(n) 0.1 tklib "Variations on a canvas package and/or documentation.

    diff --git a/embedded/www/tklib/files/modules/canvas/canvas_epolyline.html b/embedded/www/tklib/files/modules/canvas/canvas_epolyline.html index 2c1bb0ff..3cbcae53 100644 --- a/embedded/www/tklib/files/modules/canvas/canvas_epolyline.html +++ b/embedded/www/tklib/files/modules/canvas/canvas_epolyline.html @@ -290,6 +290,6 @@

    canvas::edit::polyline(n) 0.1 tklib "Variations on a canv package and/or documentation.

    diff --git a/embedded/www/tklib/files/modules/canvas/canvas_equad.html b/embedded/www/tklib/files/modules/canvas/canvas_equad.html index 8c45138f..3bc2ca82 100644 --- a/embedded/www/tklib/files/modules/canvas/canvas_equad.html +++ b/embedded/www/tklib/files/modules/canvas/canvas_equad.html @@ -294,6 +294,6 @@

    canvas::edit::quadrilateral(n) 0.1 tklib "Variations on a package and/or documentation.

    diff --git a/embedded/www/tklib/files/modules/canvas/canvas_gradient.html b/embedded/www/tklib/files/modules/canvas/canvas_gradient.html index 9250cfa1..713b58bc 100644 --- a/embedded/www/tklib/files/modules/canvas/canvas_gradient.html +++ b/embedded/www/tklib/files/modules/canvas/canvas_gradient.html @@ -215,7 +215,7 @@

    canvas::gradient(n) 0.2 tklib "Variations on a canvas&quo package and/or documentation.

    diff --git a/embedded/www/tklib/files/modules/canvas/canvas_mvg.html b/embedded/www/tklib/files/modules/canvas/canvas_mvg.html index 2d171c62..85e7435a 100644 --- a/embedded/www/tklib/files/modules/canvas/canvas_mvg.html +++ b/embedded/www/tklib/files/modules/canvas/canvas_mvg.html @@ -155,7 +155,7 @@

    canvas::mvg(n) 1.0.1 tklib "Variations on a canvas"< package and/or documentation.

    diff --git a/embedded/www/tklib/files/modules/canvas/canvas_tags.html b/embedded/www/tklib/files/modules/canvas/canvas_tags.html index d25f2967..b972404e 100644 --- a/embedded/www/tklib/files/modules/canvas/canvas_tags.html +++ b/embedded/www/tklib/files/modules/canvas/canvas_tags.html @@ -186,6 +186,6 @@

    canvas::tag(n) 0.1 tklib "Variations on a canvas" diff --git a/embedded/www/tklib/files/modules/canvas/canvas_trlines.html b/embedded/www/tklib/files/modules/canvas/canvas_trlines.html index b76f5ac3..19dce160 100644 --- a/embedded/www/tklib/files/modules/canvas/canvas_trlines.html +++ b/embedded/www/tklib/files/modules/canvas/canvas_trlines.html @@ -187,6 +187,6 @@

    canvas::track::lines(n) 0.1 tklib "Variations on a canvas package and/or documentation.

    diff --git a/embedded/www/tklib/files/modules/canvas/canvas_zoom.html b/embedded/www/tklib/files/modules/canvas/canvas_zoom.html index e1f0e75e..bcb9ba9b 100644 --- a/embedded/www/tklib/files/modules/canvas/canvas_zoom.html +++ b/embedded/www/tklib/files/modules/canvas/canvas_zoom.html @@ -186,6 +186,6 @@

    canvas::zoom(n) 0.2.1 tklib "Variations on a canvas" package and/or documentation.

    diff --git a/embedded/www/tklib/files/modules/chatwidget/chatwidget.html b/embedded/www/tklib/files/modules/chatwidget/chatwidget.html index 8f1a7518..689714fd 100644 --- a/embedded/www/tklib/files/modules/chatwidget/chatwidget.html +++ b/embedded/www/tklib/files/modules/chatwidget/chatwidget.html @@ -195,15 +195,15 @@

    chatwidget(n) 1.0.0 tklib "Composite widget for chat appl
    $widget hook command args

    Manage hooks. add (message, post names_group, names_nick, chatstate), remove, run

    $widget names args
    -

    Passthrough to the name display text widget. See the text widget manual +

    Passthrough to the name display text widget. See the text widget manual for all available commands. The chatwidget provides two additional commands show and hide which are used to control the display of this element in the widget.

    $widget entry args
    -

    Passthrough to the entry text widget. See the text widget manual +

    Passthrough to the entry text widget. See the text widget manual for all available commands.

    $widget chat args
    -

    Passthrough to the chat text widget. See the text widget manual for +

    Passthrough to the chat text widget. See the text widget manual for all available commands.

    @@ -237,6 +237,6 @@

    chatwidget(n) 1.0.0 tklib "Composite widget for chat appl

    text(n)

    diff --git a/embedded/www/tklib/files/modules/controlwidget/controlwidget.html b/embedded/www/tklib/files/modules/controlwidget/controlwidget.html index 22e67009..adb19c55 100644 --- a/embedded/www/tklib/files/modules/controlwidget/controlwidget.html +++ b/embedded/www/tklib/files/modules/controlwidget/controlwidget.html @@ -386,7 +386,10 @@

    controlwidget(n) 0.1 tklib "controlwidget"

    ::controlwidget::rdial w args

    Create a rotating dial. You can drag the dial to change the value. With the shift button -depressed the value changes slowly, with the control button depressed it changes fast.

    +depressed the value changes slowly, with the control button depressed it changes fast. +Similarly, you can control the dial via the mouse wheel, with the shift and control button +working in the same way as with the mouse pointer. +Note: The shift and control buttons currently have no effect on Windows.

    widget w (in)

    Name of the widget to be created.

    @@ -401,6 +404,8 @@

    controlwidget(n) 0.1 tklib "controlwidget"

    Whether a horizontal disk/dial is required ("horizontal") or a vertical one ("vertical")

    step value

    Initial step for incrementing or decrementing the value

    +
    bindwheel value
    +

    Step size for controlling the dial's value via the mouse wheel

    slow value

    Factor on the step size for incrementing or decrementing the value slowly

    fast value
    @@ -519,7 +524,7 @@

    controlwidget(n) 0.1 tklib "controlwidget"

    package and/or documentation.

    OPTIONS

    -

    See the entry manual entry for details on all available options.

    +

    See the entry manual entry for details on all available options.

    EXAMPLE

    @@ -185,7 +185,7 @@ 

    datefield(n) 0.2 tklib "Tk datefield widget"

    clock(n), entry(n)

    Category

    Widget

    diff --git a/embedded/www/tklib/files/modules/diagrams/diagram.html b/embedded/www/tklib/files/modules/diagrams/diagram.html index 7975f868..1e670abd 100644 --- a/embedded/www/tklib/files/modules/diagrams/diagram.html +++ b/embedded/www/tklib/files/modules/diagrams/diagram.html @@ -154,24 +154,24 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

  • diagramObject new attribute name ?key value...?
  • diagramObject unknown attribute cmdprefix
  • diagramObject draw script
  • -
  • arc attr...
  • -
  • arrow attr...
  • +
  • arc attr...
  • +
  • arrow attr...
  • --> attr...
  • <--> attr...
  • <--> attr...
  • block script attr...
  • -
  • box attr...
  • -
  • circle attr...
  • +
  • box attr...
  • +
  • circle attr...
  • O attr...
  • -
  • diamond attr...
  • +
  • diamond attr...
  • <> attr...
  • -
  • drum attr...
  • -
  • ellipse attr...
  • -
  • line attr...
  • +
  • drum attr...
  • +
  • ellipse attr...
  • +
  • line attr...
  • -- attr...
  • -
  • move attr
  • -
  • spline attr...
  • -
  • text attr...
  • +
  • move attr
  • +
  • spline attr...
  • +
  • text attr...
  • west
  • w
  • left
  • @@ -242,7 +242,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    Description

    Welcome to diagram, a package for the easy construction of diagrams (sic), i.e. 2D vector graphics, sometimes also called pictures. -Note that this package is not a replacement for Tk's canvas, +Note that this package is not a replacement for Tk's canvas, but rather a layer sitting on top of it, to make it easier to use. In other words, using the canvas as the core graphics engine diagram abstracts away from the minutiae of handling coordinates to position and size the drawn elements, allowing the user to concentrate @@ -424,7 +424,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    no validation is done.

    The signature of the command prefix is that of snit validation types. See the documentation - of the snit package.

    + of the snit package.

    merge

    The value of this key is a command prefix which will be invoked to insert the @@ -572,7 +572,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    See section Miscellaneous Commands. figure-02-basic-shapes

    -
    arc attr...
    +
    arc attr...

    figure-02-arc An open element with the corresponding corners, i.e. "start", "end", and "center". @@ -617,7 +617,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    clockwise
    cw
    -

    Specifies the direction of the arc element, here going +

    Specifies the direction of the arc element, here going clockwise. The complementary attribute is counterclockwise. If not specified the system falls back to the value taken from the @@ -631,7 +631,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    counterclockwise
    ccw
    -

    Specifies the direction of the arc element, here +

    Specifies the direction of the arc element, here counter-clockwise. The complementary attribute is clockwise. If not specified the system falls back to the value taken from the @@ -644,7 +644,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    language variable fillcolor, which itself defaults to the empty string, signaling "no filling".

    from location
    -

    Specifies the location where the arc element begins. +

    Specifies the location where the arc element begins. Defaults to the current location as maintained by the layouting system.

    justify left|center|right
    @@ -656,7 +656,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    left. The legal values are left, right, and center.

    radius length
    -

    Specifies the radius of the arc element, or rather, the radius +

    Specifies the radius of the arc element, or rather, the radius of the circle the shown arc is a part of. If not specified the system falls back to the value taken from the language variable arcradius, which itself defaults to the pixel @@ -690,7 +690,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    Note that the values "solid", "dot(ted)", "dash(ed)", "dash-dot", and "dash-dot-dot" are all accepted as shorthands for the style command using them as argument.

    -
    text string
    +
    text string

    Specifies the text to associate with the element. Defaults to nothing. When specified multiple times the actually shown text is the @@ -709,11 +709,11 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    language variable textfont, which itself defaults to Helvetica 12pt.

    to location
    -

    Specifies the location where the arc element ends. +

    Specifies the location where the arc element ends. Defaults to a location such that a 90-degree arc is drawn in the chosen direction, starting at from.

    -
    arrow attr...
    +
    arrow attr...
    --> attr...
    @@ -721,9 +721,9 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    <--> attr...

    figure-02-arrow -An alias for the line element (see below), with the attribute +An alias for the line element (see below), with the attribute arrowhead preset to ->, <->, or <-. The -arrow is equivalent to -->.

    +arrow is equivalent to -->.

    block script attr...

    A closed element with the corresponding corners, i.e. the eight directions of the compass rose, and "center". @@ -745,7 +745,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    In other words, a block is an implicit group.

    Blocks handle all attributes, propgating their settings into the script as the default values active during script execution.

    -
    box attr...
    +
    box attr...

    figure-02-box A closed element with the corresponding corners, i.e. the eight directions of the compass rose, and "center". @@ -816,7 +816,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    left. The legal values are left, right, and center.

    slant angle
    -

    Specifies the angle by which the box element is slanted, in +

    Specifies the angle by which the box element is slanted, in degrees. If not specified the system falls back to the value taken from the language variable slant, which itself defaults to 90, @@ -852,7 +852,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    Note that the values "solid", "dot(ted)", "dash(ed)", "dash-dot", and "dash-dot-dot" are all accepted as shorthands for the style command using them as argument.

    -
    text string
    +
    text string

    Specifies the text to associate with the element. Defaults to nothing. When specified multiple times the actually shown text is the @@ -884,7 +884,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    except if the value for at was specified by the user. In that case it defaults to center.

    -
    circle attr...
    +
    circle attr...
    O attr...

    figure-02-circle @@ -938,7 +938,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    diameter length
    diam length
    -

    Specifies the diameter of the circle element, as an alternative +

    Specifies the diameter of the circle element, as an alternative way to specify its radius. Effective if and only if the radius was not specified. I.e. if both diameter and radius are specified then the radius infomration has @@ -962,7 +962,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    radius length
    rad length
    -

    Specifies the radius of the circle element. +

    Specifies the radius of the circle element. If not specified the system falls back to the value taken from the language variable circleradius, which itself defaults to the pixel equivalent of 1 cm.

    @@ -995,7 +995,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    Note that the values "solid", "dot(ted)", "dash(ed)", "dash-dot", and "dash-dot-dot" are all accepted as shorthands for the style command using them as argument.

    -
    text string
    +
    text string

    Specifies the text to associate with the element. Defaults to nothing. When specified multiple times the actually shown text is the @@ -1020,7 +1020,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    except if the value for at was specified by the user. In that case it defaults to center.

    -
    diamond attr...
    +
    diamond attr...
    <> attr...

    figure-02-diamond @@ -1063,7 +1063,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    aspect number

    Specifies the aspect ratio, i.e ratio of width to height, of the -diamond element. +diamond element. The manner in which a default is calculated when not specified also depends on the specifications of the attributes width and height, if any.

    @@ -1103,7 +1103,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    language variable fillcolor, which itself defaults to the empty string, signaling "no filling".

    height length
    -

    Specifies the height of the diamond element. +

    Specifies the height of the diamond element. The manner in which a default is calculated when not specified also depends on the specifications of the attributes aspect and width, if any.

    @@ -1163,7 +1163,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    Note that the values "solid", "dot(ted)", "dash(ed)", "dash-dot", and "dash-dot-dot" are all accepted as shorthands for the style command using them as argument.

    -
    text string
    +
    text string

    Specifies the text to associate with the element. Defaults to nothing. When specified multiple times the actually shown text is the @@ -1182,7 +1182,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    language variable textfont, which itself defaults to Helvetica 12pt.

    width length
    -

    Specifies the width of the diamond element. +

    Specifies the width of the diamond element. The manner in which a default is calculated when not specified also depends on the specifications of the attributes aspect and height, if any.

    @@ -1212,7 +1212,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    except if the value for at was specified by the user. In that case it defaults to center.

    -
    drum attr...
    +
    drum attr...

    figure-02-drum A closed element with the corresponding corners, i.e. the eight directions of the compass rose, and "center". @@ -1253,7 +1253,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    aspect number

    Specifies the aspect ratio, i.e ratio of width to height, of the -ellipses which are used to draw the top and bottom of the drum +ellipses which are used to draw the top and bottom of the drum element. If not specified the system falls back to the value taken from the language variable drumaspect, which itself defaults to @@ -1318,7 +1318,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    Note that the values "solid", "dot(ted)", "dash(ed)", "dash-dot", and "dash-dot-dot" are all accepted as shorthands for the style command using them as argument.

    -
    text string
    +
    text string

    Specifies the text to associate with the element. Defaults to nothing. When specified multiple times the actually shown text is the @@ -1350,7 +1350,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    except if the value for at was specified by the user. In that case it defaults to center.

    -
    ellipse attr...
    +
    ellipse attr...

    figure-02-ellipse A closed element with the corresponding corners, i.e. the eight directions of the compass rose, and "center". @@ -1449,7 +1449,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    Note that the values "solid", "dot(ted)", "dash(ed)", "dash-dot", and "dash-dot-dot" are all accepted as shorthands for the style command using them as argument.

    -
    text string
    +
    text string

    Specifies the text to associate with the element. Defaults to nothing. When specified multiple times the actually shown text is the @@ -1481,7 +1481,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    except if the value for at was specified by the user. In that case it defaults to center.

    -
    line attr...
    +
    line attr...
    -- attr...

    figure-02-line @@ -1524,7 +1524,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    arrowhead spec

    figure-19-style-arrowheads -Specifies where to draw arrowheads on the line element, at the +Specifies where to draw arrowheads on the line element, at the beginning or end, at both ends, or none. If not specified the system falls back to the value taken from the language variable arrowhead, which itself defaults to @@ -1544,14 +1544,14 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    all accepted as shorthands for the arrowhead command using them as argument.

    at location
    -

    Line elements are normally positioned absolutely, using the +

    Line elements are normally positioned absolutely, using the locations specified through the attributes from, then, and to. If at is specified however then these positions are translated a last time, moving the line's corner named by the attribute with to the location given by this attribute.

    chop ?length?
    -

    Specifies the length of the line element to remove from the +

    Specifies the length of the line element to remove from the beginning and/or end. Defaults to nothing. If specified once the chopping applies to both beginning and end of @@ -1574,7 +1574,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    language variable fillcolor, which itself defaults to the empty string, signaling "no filling".

    from location
    -

    Specifies the location where the line element begins. +

    Specifies the location where the line element begins. Defaults to the current location as maintained by the layouting system.

    justify left|center|right
    @@ -1586,12 +1586,12 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    left. The legal values are left, right, and center.

    noturn
    -

    Specifies that the direction of line element at its end is not +

    Specifies that the direction of line element at its end is not propagated to the layout management. If not specified the direction of the line becomes the new direction the layout.

    smooth
    -

    Specifies the use of bezier splines for the line element. +

    Specifies the use of bezier splines for the line element. If not specified lines are drawn exactly through the specified waypoints, without any smooth curves.

    stroke width
    @@ -1623,7 +1623,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    Note that the values "solid", "dot(ted)", "dash(ed)", "dash-dot", and "dash-dot-dot" are all accepted as shorthands for the style command using them as argument.

    -
    text string
    +
    text string

    Specifies the text to associate with the element. Defaults to nothing. When specified multiple times the actually shown text is the @@ -1646,7 +1646,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    then (<direction> ?length?)...
    (<direction> ?length?)...
    -

    This attribute specifies an intermediate location the line +

    This attribute specifies an intermediate location the line element has to go through. It can be specified multiple times, with each use adding one additional location to the series which the line will go @@ -1672,12 +1672,12 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    starting location, in the current direction as maintained by the layouting system

    to location
    -

    Specifies the location where the line element ends. +

    Specifies the location where the line element ends. This attribute has no default. The default is handled by the attribute then, which makes it appear as if to has a default when not specified.

    with corner
    -

    Line elements are normally positioned absolutely, using the +

    Line elements are normally positioned absolutely, using the locations specified through the attributes from, then, and to. If at is specified however then these positions are translated a @@ -1686,20 +1686,20 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    This means that with is effective if and only if the attribute at was specified as well for the line.

    -
    move attr
    +
    move attr

    An open element with the corresponding corners, i.e. "start", "end", and "center". -A move element is in essence an invisible line. +A move element is in essence an invisible line. While the main effect we are interested in is the change it makes to the layout system, it is an actual element, i.e. it has the same corners as an ordinary line, and shows up in the history as well, allowing future references to all the places it touched. -It handles the same attibutes as line elements.

    -
    spline attr...
    +It handles the same attibutes as line elements.

    +
    spline attr...

    figure-02-spline -An alias for the line element (see above), with the attribute +An alias for the line element (see above), with the attribute smooth preset.

    -
    text attr...
    +
    text attr...

    figure-02-text A closed element with the corresponding corners, i.e. the eight directions of the compass rose, and "center". @@ -1744,7 +1744,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    Defaults to the current location as maintained by the layouting system.

    height length
    -

    Specifies the height of the text element. +

    Specifies the height of the text element. Defaults to the natural height of its text.

    justify left|center|right

    Specifies how multi-line text associated with the element is @@ -1754,7 +1754,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    language variable justify, which itself defaults to left. The legal values are left, right, and center.

    -
    text string
    +
    text string

    Specifies the text to associate with the element. Defaults to nothing. When specified multiple times the actually shown text is the @@ -1773,7 +1773,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    language variable textfont, which itself defaults to Helvetica 12pt.

    width length
    -

    Specifies the width of the text element. +

    Specifies the width of the text element. Defaults to the natural width of its text.

    with corner

    Specifies the corner of the element to place at the location given by @@ -1796,7 +1796,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    the element the processing is for.

    Further, as a catch-all clause, any attribute which could not be processed according to the definitions below will be treated as the -argument of an implicit text attribute.

    +argument of an implicit text attribute.

    anchor name
    @@ -1833,7 +1833,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    arrowhead spec

    figure-19-style-arrowheads -Specifies where to draw arrowheads on the line element, at the +Specifies where to draw arrowheads on the line element, at the beginning or end, at both ends, or none. If not specified the system falls back to the value taken from the language variable arrowhead, which itself defaults to @@ -1854,7 +1854,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    as argument.

    aspect number

    Specifies the aspect ratio, i.e ratio of width to height, of the -diamond element. +diamond element. The manner in which a default is calculated when not specified also depends on the specifications of the attributes width and height, if any.

    @@ -1879,7 +1879,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    previous paragraph.

    aspect number

    Specifies the aspect ratio, i.e ratio of width to height, of the -ellipses which are used to draw the top and bottom of the drum +ellipses which are used to draw the top and bottom of the drum element. If not specified the system falls back to the value taken from the language variable drumaspect, which itself defaults to @@ -1890,14 +1890,14 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    Defaults to the current location as maintained by the layouting system.

    at location
    -

    Line elements are normally positioned absolutely, using the +

    Line elements are normally positioned absolutely, using the locations specified through the attributes from, then, and to. If at is specified however then these positions are translated a last time, moving the line's corner named by the attribute with to the location given by this attribute.

    chop ?length?
    -

    Specifies the length of the line element to remove from the +

    Specifies the length of the line element to remove from the beginning and/or end. Defaults to nothing. If specified once the chopping applies to both beginning and end of @@ -1911,7 +1911,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    clockwise
    cw
    -

    Specifies the direction of the arc element, here going +

    Specifies the direction of the arc element, here going clockwise. The complementary attribute is counterclockwise. If not specified the system falls back to the value taken from the @@ -1925,7 +1925,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    counterclockwise
    ccw
    -

    Specifies the direction of the arc element, here +

    Specifies the direction of the arc element, here counter-clockwise. The complementary attribute is clockwise. If not specified the system falls back to the value taken from the @@ -1934,7 +1934,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    diameter length
    diam length
    -

    Specifies the diameter of the circle element, as an alternative +

    Specifies the diameter of the circle element, as an alternative way to specify its radius. Effective if and only if the radius was not specified. I.e. if both diameter and radius are specified then the radius infomration has @@ -1948,11 +1948,11 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    language variable fillcolor, which itself defaults to the empty string, signaling "no filling".

    from location
    -

    Specifies the location where the line element begins. +

    Specifies the location where the line element begins. Defaults to the current location as maintained by the layouting system.

    from location
    -

    Specifies the location where the arc element begins. +

    Specifies the location where the arc element begins. Defaults to the current location as maintained by the layouting system.

    height length
    @@ -1963,7 +1963,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    language variable boxheight, which itself defaults to the pixel equivalent of 2 cm.

    height length
    -

    Specifies the height of the diamond element. +

    Specifies the height of the diamond element. The manner in which a default is calculated when not specified also depends on the specifications of the attributes aspect and width, if any.

    @@ -1987,7 +1987,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    the user-specified value or the default taken as described in the previous paragraph.

    height length
    -

    Specifies the height of the text element. +

    Specifies the height of the text element. Defaults to the natural height of its text.

    justify left|center|right

    Specifies how multi-line text associated with the element is @@ -1998,25 +1998,25 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    left. The legal values are left, right, and center.

    noturn
    -

    Specifies that the direction of line element at its end is not +

    Specifies that the direction of line element at its end is not propagated to the layout management. If not specified the direction of the line becomes the new direction the layout.

    radius length
    rad length
    -

    Specifies the radius of the circle element. +

    Specifies the radius of the circle element. If not specified the system falls back to the value taken from the language variable circleradius, which itself defaults to the pixel equivalent of 1 cm.

    radius length
    -

    Specifies the radius of the arc element, or rather, the radius +

    Specifies the radius of the arc element, or rather, the radius of the circle the shown arc is a part of. If not specified the system falls back to the value taken from the language variable arcradius, which itself defaults to the pixel equivalent of 1 cm.

    slant angle
    -

    Specifies the angle by which the box element is slanted, in +

    Specifies the angle by which the box element is slanted, in degrees. If not specified the system falls back to the value taken from the language variable slant, which itself defaults to 90, @@ -2024,7 +2024,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    0 degrees is slanting straight east, pointing to the right. 90 degrees is slanting to the north, pointing straight up.

    smooth
    -

    Specifies the use of bezier splines for the line element. +

    Specifies the use of bezier splines for the line element. If not specified lines are drawn exactly through the specified waypoints, without any smooth curves.

    stroke width
    @@ -2056,7 +2056,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    Note that the values "solid", "dot(ted)", "dash(ed)", "dash-dot", and "dash-dot-dot" are all accepted as shorthands for the style command using them as argument.

    -
    text string
    +
    text string

    Specifies the text to associate with the element. Defaults to nothing. When specified multiple times the actually shown text is the @@ -2079,7 +2079,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    then (<direction> ?length?)...
    (<direction> ?length?)...
    -

    This attribute specifies an intermediate location the line +

    This attribute specifies an intermediate location the line element has to go through. It can be specified multiple times, with each use adding one additional location to the series which the line will go @@ -2105,12 +2105,12 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    starting location, in the current direction as maintained by the layouting system

    to location
    -

    Specifies the location where the line element ends. +

    Specifies the location where the line element ends. This attribute has no default. The default is handled by the attribute then, which makes it appear as if to has a default when not specified.

    to location
    -

    Specifies the location where the arc element ends. +

    Specifies the location where the arc element ends. Defaults to a location such that a 90-degree arc is drawn in the chosen direction, starting at from.

    width length
    @@ -2121,7 +2121,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    language variable boxwidth, which itself defaults to the pixel equivalent of 2 cm.

    width length
    -

    Specifies the width of the diamond element. +

    Specifies the width of the diamond element. The manner in which a default is calculated when not specified also depends on the specifications of the attributes aspect and height, if any.

    @@ -2145,7 +2145,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    the user-specified value or the default taken as described in the previous paragraph.

    width length
    -

    Specifies the width of the text element. +

    Specifies the width of the text element. Defaults to the natural width of its text.

    with corner

    Specifies the corner of the element to place at the location given by @@ -2154,7 +2154,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    except if the value for at was specified by the user. In that case it defaults to center.

    with corner
    -

    Line elements are normally positioned absolutely, using the +

    Line elements are normally positioned absolutely, using the locations specified through the attributes from, then, and to. If at is specified however then these positions are translated a @@ -2176,16 +2176,16 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    "center". The first two map to the locations originally provided through the attributes from and to of the element.

    figure-28-corners-open

    -
  • The center of line and move elements is the location +

  • The center of line and move elements is the location halfway between "start" and "end" corners, this is regardless of any intermediate locations the element may have.

  • -
  • The line and move elements additionally name all their +

  • The line and move elements additionally name all their locations as corners using numbers as names, starting from 1 (equivalent to "start"), in order of traversal.

    figure-15-spline-1

  • -
  • The center of arc elements is the center of the circle the arc +

  • The center of arc elements is the center of the circle the arc is part off.

  • -
  • The arc elements additionally define the compass rose of +

  • The arc elements additionally define the compass rose of closed elements as well.

  • @@ -2312,7 +2312,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    point for it, i.e. the delta or translation it represents.

    Note also the (dis)similarities to the directional specifications for -the attribute then of line and move elements. +the attribute then of line and move elements. Where we say here

    by 50 east

    for the attribute we say

    @@ -2445,7 +2445,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    The legal values are all those accepted by Tk_GetAnchor.

    arcradius
    -

    The default value for the attribute radius of arc +

    The default value for the attribute radius of arc elements. Initialized to the pixel equivalent of 1 cm.

    arrowhead
    @@ -2463,24 +2463,24 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    Draw arrowheads at both ends of the line.

    boxheight
    -

    The default value for the attribute height of box, -diamond and ellipse elements. +

    The default value for the attribute height of box, +diamond and ellipse elements. Initialized to the pixel equivalent of 2 cm.

    boxwidth
    -

    The default value for the attribute width of box, -diamond and ellipse elements. +

    The default value for the attribute width of box, +diamond and ellipse elements. Initialized to the pixel equivalent of 2 cm.

    clockwise

    The default value for the attributes clockwise and -counterclockwise of arc elements. +counterclockwise of arc elements. Initialized to False, for counter-clockwise direction.

    circleradius
    -

    The default value for the attribute radius of circle +

    The default value for the attribute radius of circle elements, and also the default for the attribute chop, when specified without an explicit length. Initialized to the pixel equivalent of 1 cm.

    drumaspect
    -

    The default value for the attribute aspect of drum +

    The default value for the attribute aspect of drum elements. Initialized to 0.35.

    fillcolor
    @@ -2494,7 +2494,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    The legal values are left, right, and center.

    linecolor

    The default value for the attribute color of all elements having -to draw lines (all but text). +to draw lines (all but text). Initialized to black.

    linestyle

    The default value for the attribute style of all elements @@ -2521,11 +2521,11 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    Initialized to 1 (pixels).

    movelength

    The default value for the directional specification of intermediate -locations by the attribute then of line and move +locations by the attribute then of line and move elements. Initialized to the pixel equivalent of 2 cm.

    slant
    -

    The default value for the attribute slant of box elements. +

    The default value for the attribute slant of box elements. Initialized to 90 degrees, i.e. slant straight up.

    textcolor

    The default value for the attribute textcolor of all elements @@ -2547,7 +2547,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    hierarchy of the classes implementing diagram.

    figure-00-dependencies

    At the bottom, all at the same level are the supporting packages like -snit, etc. These can all be found in Tcllib.

    +snit, etc. These can all be found in Tcllib.

    Above them is the set of diagram classes implementing the various aspects of the system, i.e.:

    @@ -2584,7 +2584,7 @@

    diagram(n) 0.3 tklib "Documentation toolbox"

    package and/or documentation.

    Category

    Documentation tools

    diff --git a/embedded/www/tklib/files/modules/getstring/tk_getString.html b/embedded/www/tklib/files/modules/getstring/tk_getString.html index 127e1262..dfee27c0 100644 --- a/embedded/www/tklib/files/modules/getstring/tk_getString.html +++ b/embedded/www/tklib/files/modules/getstring/tk_getString.html @@ -168,6 +168,6 @@

    getstring(n) 0.1 tklib "A dialog which prompts for a stri package and/or documentation.

    diff --git a/embedded/www/tklib/files/modules/history/tklib_history.html b/embedded/www/tklib/files/modules/history/tklib_history.html index ef00337c..f7c470d7 100644 --- a/embedded/www/tklib/files/modules/history/tklib_history.html +++ b/embedded/www/tklib/files/modules/history/tklib_history.html @@ -187,6 +187,6 @@

    history(n) 0.1 tklib "Provides a history for Entry widget package and/or documentation.

    diff --git a/embedded/www/tklib/files/modules/ico/ico.html b/embedded/www/tklib/files/modules/ico/ico.html index 4d015c1c..9ee4ce9c 100644 --- a/embedded/www/tklib/files/modules/ico/ico.html +++ b/embedded/www/tklib/files/modules/ico/ico.html @@ -313,6 +313,6 @@

    ico(n) 1.0.5 tklib "Windows ICO handling"

    package and/or documentation.

    diff --git a/embedded/www/tklib/files/modules/ipentry/ipentry.html b/embedded/www/tklib/files/modules/ipentry/ipentry.html index 7dfc1ff2..cd6f182b 100644 --- a/embedded/www/tklib/files/modules/ipentry/ipentry.html +++ b/embedded/www/tklib/files/modules/ipentry/ipentry.html @@ -285,7 +285,7 @@

    ipentry(n) 0.3 tklib "An IP address entry widget"

    Category

    Widget

    diff --git a/embedded/www/tklib/files/modules/khim/khim.html b/embedded/www/tklib/files/modules/khim/khim.html index 4960de6f..25643d11 100644 --- a/embedded/www/tklib/files/modules/khim/khim.html +++ b/embedded/www/tklib/files/modules/khim/khim.html @@ -269,6 +269,6 @@

    khim(n) 1.0 tklib "Kevin's Hacky Input Method"

    package and/or documentation.

    diff --git a/embedded/www/tklib/files/modules/notifywindow/notifywindow.html b/embedded/www/tklib/files/modules/notifywindow/notifywindow.html index ee4ca8f1..c80ae46f 100644 --- a/embedded/www/tklib/files/modules/notifywindow/notifywindow.html +++ b/embedded/www/tklib/files/modules/notifywindow/notifywindow.html @@ -156,7 +156,7 @@

    notifywindow(n) 1.0 tklib "notifywindow"

    package and/or documentation.

    Description

    The purpose of the ntext package is to make the text widget behave more like other text-editing applications. It makes the text widget more useful for implementing a text editor, and makes it behave in a way that will be more familiar to most users.

    The package provides a binding tag named Ntext for use by text widgets in place of the default Text binding tag.

    -

    Package ntext 's functions and variables are contained entirely in the ::ntext namespace; its other code is contained in the binding tag Ntext. ntext has no exports to the global or other namespaces, and no new widget commands. It uses modified copies of the Tk code, leaving the original code, and the Text binding tag, unchanged.

    +

    Package ntext 's functions and variables are contained entirely in the ::ntext namespace; its other code is contained in the binding tag Ntext. ntext has no exports to the global or other namespaces, and no new widget commands. It uses modified copies of the Tk code, leaving the original code, and the Text binding tag, unchanged.

    The differences between the Ntext binding tag and the default Text binding tag are in three categories:

    • Some Text bindings behave differently from most text-editing applications. Ntext gives these bindings more familiar behaviour. For details see ntextBindings.

    • When a logical line with leading whitespace is word-wrapped onto more than one display line, the wrapped display lines begin further to the left than the first display line, which can make the text layout untidy and difficult to read. Ntext can indent the wrapped lines to match the leading whitespace of the first display line (this facility is switched off by default). For details see ntextIndent.

    • -
    • When the user navigates or selects text, Tcl/Tk sometimes needs to detect word boundaries. Ntext provides improved rules for word boundary detection. For details see ntextWordBreak.

    • +
    • When the user navigates or selects text, Tcl/Tk sometimes needs to detect word boundaries. Ntext provides improved rules for word boundary detection. For details see ntextWordBreak.

    The remainder of this page describes the basic use and configuration of all three aspects of Ntext. For more detailed information on the different facilities of Ntext, see the pages ntextBindings, ntextIndent, and ntextWordBreak.

    See Section EXAMPLE for how to apply the Ntext binding tag in place of the Text binding tag.

    @@ -158,6 +159,8 @@

    ntext(n) 1.0 tklib "Alternative Bindings for the Text Wid

    Replacement for ::tk_textCut that also maintains Ntext indentation (see ntextIndent).

    ::ntext::new_textPaste pathName

    Replacement for ::tk_textPaste that also maintains Ntext indentation (see ntextIndent).

    +
    ::ntext::syncIndentColor pathName
    +

    Command to apply the current value of the variable ::ntext::indentColor to existing lines in a text widget. This command is useful if a text widget has been created, text has been inserted in the widget, and then the value of ::ntext::indentColor is changed (see ntextIndent).

    CONFIGURATION OPTIONS

    @@ -181,6 +184,12 @@

    ntext(n) 1.0 tklib "Alternative Bindings for the Text Wid
  • 1 - selects classic Text behaviour

  • For more information see ntextBindings

  • +

    ::ntext::classicParagraphs

    +
      +
    • 0 - (default value) on macOS Aqua, certain keyboard bindings are made to behave in the same way as the Mac application TextEdit. The bindings involve vertical scrolling of the screen and are <?Shift-?Option-(Up|Down)>.

    • +
    • 1 - on macOS Aqua, certain keyboard bindings are made to behave in the same way as classic Text, ignoring the conventions of Aqua. The bindings involve vertical scrolling of the screen and are <?Shift-?Option-(Up|Down)>.

    • +
    • For more information see ntextBindings

    • +

    ::ntext::classicSelection

    • 0 - (default value on macOS Aqua) selects Mac-like behaviour, i.e. when a navigation keystroke cancels a selection, the insert mark first moves to the end of the selection determined by the navigation direction of the keystroke, and then the keystroke is applied.

    • @@ -199,6 +208,14 @@

      ntext(n) 1.0 tklib "Alternative Bindings for the Text Wid
    • 1 - (default value) selects classic Text behaviour, i.e. no indentation

    • For more information see ntextIndent

    +

    ::ntext::indentColor

    +
      +
    • {} - if the value is the empty string, then the indent of wrapped display lines has the same color as the widget background.

    • +
    • color - a valid Tk color to use for the indent of wrapped display lines (default value #d9d9d9).

      +

      Coloring is implemented with the text widget tag option -lmargincolor, which is available from Tk 8.6.6 onwards. Ntext indent coloring has no effect in earlier versions of Tk.

      +

      The value of ::ntext::indentColor will often be set at startup. If the value is changed when text widgets already exist and contain text, those widgets can be updated by calling command ::ntext::syncIndentColor.

    • +
    • For more information see ntextIndent

    • +

    ::ntext::overwrite

    • 0 - (initial value) text typed at the keyboard is inserted into the widget

    • @@ -206,15 +223,16 @@

      ntext(n) 1.0 tklib "Alternative Bindings for the Text Wid
    • The value is toggled by the Insert key (except on macOS Aqua where there is no such key).

    • For more information see ntextBindings

    -

    ::ntext::classicParagraphs

    +

    ::ntext::useBlockCursor

      -
    • 0 - (default value) on macOS Aqua, certain keyboard bindings are made to behave in the same way as the Mac application TextEdit. The bindings involve vertical scrolling of the screen and are <?Shift-?Option-(Up|Down)>.

    • -
    • 1 - on macOS Aqua, certain keyboard bindings are made to behave in the same way as classic Text, ignoring the conventions of Aqua. The bindings involve vertical scrolling of the screen and are <?Shift-?Option-(Up|Down)>.

    • +
    • 0 - the block cursor will not be used. When the widget is in overwrite mode (see ::ntext::overwrite), the ordinary cursor will change color instead.

    • +
    • 1 - the block cursor will be used when the widget is in overwrite mode (see ::ntext::overwrite).

    • +
    • The default value depends on the version of Tk. In versions of Tk earlier than 8.5.12, the sizing of the block cursor had a bug, and ::ntext::useBlockCursor defaults to 0. From 8.5.12 onwards the bug is fixed, and ::ntext::useBlockCursor defaults to 1.

    • For more information see ntextBindings

    BUGS

    -

    This version of ntext is intended to be compatible with all releases of Tk 8.5 and 8.6, and with the branches core-8-5-branch, core-8-6-branch, and trunk in the source code repository for Tk. Any incompatibility with any of these versions, for any Tk windowing system, should be reported as a bug. Please report such in the category ntext of the Tklib Trackers.

    +

    This version of ntext is intended to be compatible with all releases of Tk 8.5 and 8.6, and with the branches core-8-5-branch, core-8-6-branch, and trunk in the source code repository for Tk. Any incompatibility with any of these versions, for any Tk windowing system, should be reported as a bug. Please report such in the category ntext of the Tklib Trackers.

    EXAMPLE

    To create a text widget .t and use the Ntext bindings:

    @@ -226,9 +244,9 @@

    ntext(n) 1.0 tklib "Alternative Bindings for the Text Wid

    See bindtags for more information.

    diff --git a/embedded/www/tklib/files/modules/ntext/ntextBindings.html b/embedded/www/tklib/files/modules/ntext/ntextBindings.html index 21254811..32762ae2 100644 --- a/embedded/www/tklib/files/modules/ntext/ntextBindings.html +++ b/embedded/www/tklib/files/modules/ntext/ntextBindings.html @@ -92,7 +92,7 @@ } --> - @@ -174,6 +174,11 @@

    ntextBindings(n) 1.0 tklib "Alternative Bindings for the
  • 0 - (default value) selects Ntext behaviour, i.e. the anchor point for mouse selection operations is moved by keyboard navigation

  • 1 - selects classic Text behaviour

  • +

    ::ntext::classicParagraphs

    +
      +
    • 0 - (default value) on macOS Aqua, certain keyboard bindings are made to behave in the same way as the Mac application TextEdit. The bindings involve vertical scrolling of the screen and are <?Shift-?Option-(Up|Down)>.

    • +
    • 1 - on macOS Aqua, certain keyboard bindings are made to behave in the same way as for the Windows and X11 windowing systems and the classic Text, ignoring the conventions of Aqua. The bindings involve vertical scrolling of the screen and are <?Shift-?Option-(Up|Down)>.

    • +

    ::ntext::classicSelection

    • 0 - (default value on macOS Aqua) selects Mac-like behaviour, i.e. when a navigation keystroke cancels a selection, the insert mark first moves to the end of the selection determined by the navigation direction of the keystroke, and then the keystroke is applied.

    • @@ -185,19 +190,21 @@

      ntextBindings(n) 1.0 tklib "Alternative Bindings for the
    • 1 - text typed at the keyboard overwrites text already in the widget

    • The value is toggled by the Insert key.

    -

    ::ntext::classicParagraphs

    +

    ::ntext::useBlockCursor

      -
    • 0 - (default value) on macOS Aqua, certain keyboard bindings are made to behave in the same way as the Mac application TextEdit. The bindings involve vertical scrolling of the screen and are <?Shift-?Option-(Up|Down)>.

    • -
    • 1 - on macOS Aqua, certain keyboard bindings are made to behave in the same way as for the Windows and X11 windowing systems and the classic Text, ignoring the conventions of Aqua. The bindings involve vertical scrolling of the screen and are <?Shift-?Option-(Up|Down)>.

    • +
    • 0 - the block cursor will not be used. When the widget is in overwrite mode (see ::ntext::overwrite), the ordinary cursor will change color instead.

    • +
    • 1 - the block cursor will be used when the widget is in overwrite mode (see ::ntext::overwrite).

    • +
    • The default value depends on the version of Tk. In versions of Tk earlier than 8.5.12, the sizing of the block cursor had a bug, and ::ntext::useBlockCursor defaults to 0. From 8.5.12 onwards the bug is fixed, and ::ntext::useBlockCursor defaults to 1.

    • +
    • For more information see ntextBindings

    INTERNALS

    -

    In order to remain independent of the version of Tk (8.5 or 8.6), ntext defines its own virtual events. These new virtual events are used only in the Ntext binding tag, and therefore do not interfere with the real or virtual events used in other code.

    +

    In order to remain independent of the version of Tk (8.5 or 8.6), ntext defines its own virtual events. These new virtual events are used only in the Ntext binding tag, and therefore do not interfere with the real or virtual events used in other code.

    These events include <<NtextCut>>, <<NtextCopy>>, <<NtextPaste>> which are used in place of <<Cut>>, <<Copy>>, <<Paste>> respectively.

    -

    The definition of the virtual event <<NtextCut>> (etc) is similar to that of <<Cut>> (etc) in Tk 8.6.

    +

    The definition of the virtual event <<NtextCut>> (etc) is similar to that of <<Cut>> (etc) in Tk 8.6.

    BUGS

    -

    This version of ntext is intended to be compatible with all releases of Tk 8.5 and 8.6, and with the branches core-8-5-branch, core-8-6-branch, and trunk in the source code repository for Tk. Any incompatibility with any of these versions, for any Tk windowing system, should be reported as a bug. Please report such in the category ntext of the Tklib Trackers.

    +

    This version of ntext is intended to be compatible with all releases of Tk 8.5 and 8.6, and with the branches core-8-5-branch, core-8-6-branch, and trunk in the source code repository for Tk. Any incompatibility with any of these versions, for any Tk windowing system, should be reported as a bug. Please report such in the category ntext of the Tklib Trackers.

    EXAMPLE

    To use Ntext but keep classic Text 's variable-anchor feature:

    @@ -209,9 +216,9 @@

    ntextBindings(n) 1.0 tklib "Alternative Bindings for the

    diff --git a/embedded/www/tklib/files/modules/ntext/ntextIndent.html b/embedded/www/tklib/files/modules/ntext/ntextIndent.html index af13ba31..54d7aabc 100644 --- a/embedded/www/tklib/files/modules/ntext/ntextIndent.html +++ b/embedded/www/tklib/files/modules/ntext/ntextIndent.html @@ -92,7 +92,7 @@ } --> - @@ -136,6 +136,7 @@

    ntextIndent(n) 1.0 tklib "ntext Indentation for the Text
  • ::ntext::new_textCopy pathName
  • ::ntext::new_textCut pathName
  • ::ntext::new_textPaste pathName
  • +
  • ::ntext::syncIndentColor pathName
  • @@ -150,18 +151,27 @@

    ntextIndent(n) 1.0 tklib "ntext Indentation for the Text
    ::ntext::new_textCopy pathName

    Replacement for ::tk_textCopy.

    ::ntext::new_textCut pathName
    -

    Replacement for ::tk_textCut that also maintains Ntext indentation (see ntextIndent).

    +

    Replacement for ::tk_textCut that also maintains Ntext indentation.

    ::ntext::new_textPaste pathName
    -

    Replacement for ::tk_textPaste that also maintains Ntext indentation (see ntextIndent).

    +

    Replacement for ::tk_textPaste that also maintains Ntext indentation.

    +
    ::ntext::syncIndentColor pathName
    +

    Command to apply the current value of ::ntext::indentColor to existing lines in a text widget. This command is useful if a text widget has been created, text has been inserted in the widget, and then the value of ::ntext::indentColor is changed.

    CONFIGURATION OPTIONS

    The behavior of Ntext may be configured application-wide by setting the values of a number of namespace variables:

    ::ntext::classicWrap

      -
    • 0 - selects Ntext behaviour, i.e. display lines are indented to match the initial whitespace of the first display line of a logical line.

      +
    • 0 - selects Ntext behaviour, i.e. display lines are indented to match the initial whitespace of the first display line of a logical line.

      No other action is required if this option, and the text widget's -wrap option, are set before any text is entered in the widget, and if text is entered and edited only by the mouse and keyboard. If, instead, text is manipulated by the script, or if the text widget's -wrap option or the value of ::ntext::classicWrap are changed while the widget holds text, then calls to ntext functions are needed to alter the indentation. See the section INDENTING DISPLAY LINES for detailed instructions.

    • -
    • 1 - (default value) selects classic Text behaviour, i.e. no indentation.

    • +
    • 1 - (default value) selects classic Text behaviour, i.e. no indentation.

    • +
    +

    ::ntext::indentColor

    +
      +
    • {} - if the value is the empty string, then the indent of wrapped display lines has the same color as the widget background.

    • +
    • color - a valid Tk color to use for the indent of wrapped display lines (default value #d9d9d9).

      +

      Coloring is implemented with the text widget tag option -lmargincolor, which is available from Tk 8.6.6 onwards. Ntext indent coloring has no effect in earlier versions of Tk.

      +

      The value of ::ntext::indentColor will often be set at startup. If the value is changed when text widgets already exist and contain text, those widgets can be updated by calling command ::ntext::syncIndentColor.

    Advanced Use

    ::ntext::newWrapRegexp

    @@ -206,13 +216,29 @@

    ntextIndent(n) 1.0 tklib "ntext Indentation for the Text

    BUGS

    -

    This version of ntext is intended to be compatible with all releases of Tk 8.5 and 8.6, and with the branches core-8-5-branch, core-8-6-branch, and trunk in the source code repository for Tk. Any incompatibility with any of these versions, for any Tk windowing system, should be reported as a bug. Please report such in the category ntext of the Tklib Trackers.

    +

    This version of ntext is intended to be compatible with all releases of Tk 8.5 and 8.6, and with the branches core-8-5-branch, core-8-6-branch, and trunk in the source code repository for Tk. Any incompatibility with any of these versions, for any Tk windowing system, should be reported as a bug. Please report such in the category ntext of the Tklib Trackers.

    EXAMPLES

    -

    To switch on Ntext 's indentation and use it in widget .t:

    +

    To switch on Ntext 's indentation and use it in widget .t, using the default indent color #d9d9d9:

    +
    +package require ntext
    +set ::ntext::classicWrap 0
    +text .t -wrap word
    +bindtags .t {.t Ntext . all}
    +
    +

    To switch on Ntext 's indentation and use it in widget .t, without colored indents:

     package require ntext
     set ::ntext::classicWrap 0
    +set ::ntext::indentColor {}
    +text .t -wrap word
    +bindtags .t {.t Ntext . all}
    +
    +

    To switch on Ntext 's indentation and use it in widget .t, coloring the indents black:

    +
    +package require ntext
    +set ::ntext::classicWrap 0
    +set ::ntext::indentColor black
     text .t -wrap word
     bindtags .t {.t Ntext . all}
     
    @@ -232,6 +258,11 @@

    ntextIndent(n) 1.0 tklib "ntext Indentation for the Text .t insert end {This line was added by the script, not the keyboard!} ::ntext::wrapIndent .t $foo end +

    To change the indentation color when a widget .t already holds text:

    +
    +set ::ntext::indentColor black
    +::ntext::syncIndentColor .t
    +

    To switch to -wrap char mode:

     .t configure -wrap char
    @@ -239,9 +270,9 @@ 

    ntextIndent(n) 1.0 tklib "ntext Indentation for the Text

    diff --git a/embedded/www/tklib/files/modules/ntext/ntextWordBreak.html b/embedded/www/tklib/files/modules/ntext/ntextWordBreak.html index e48c0d91..78f43c5f 100644 --- a/embedded/www/tklib/files/modules/ntext/ntextWordBreak.html +++ b/embedded/www/tklib/files/modules/ntext/ntextWordBreak.html @@ -92,7 +92,7 @@ } --> - @@ -192,7 +192,7 @@

    ntextWordBreak(n) 1.0 tklib "ntext Word Boundary Detectio

    As well as its defaults, Ntext permits the developer to define their own classes of characters, or to revert to the classic Text definitions, or to specify their own regexp matching patterns.

    BUGS

    -

    This version of ntext is intended to be compatible with all releases of Tk 8.5 and 8.6, and with the branches core-8-5-branch, core-8-6-branch, and trunk in the source code repository for Tk. Any incompatibility with any of these versions, for any Tk windowing system, should be reported as a bug. Please report such in the category ntext of the Tklib Trackers.

    +

    This version of ntext is intended to be compatible with all releases of Tk 8.5 and 8.6, and with the branches core-8-5-branch, core-8-6-branch, and trunk in the source code repository for Tk. Any incompatibility with any of these versions, for any Tk windowing system, should be reported as a bug. Please report such in the category ntext of the Tklib Trackers.

    EXAMPLE

    To use Ntext with Tcl/Tk's usual word-boundary detection rules:

    @@ -215,9 +215,9 @@

    ntextWordBreak(n) 1.0 tklib "ntext Word Boundary Detectio

    See regexp, re_syntax for more information.

    diff --git a/embedded/www/tklib/files/modules/persistentSelection/persistentSelection.html b/embedded/www/tklib/files/modules/persistentSelection/persistentSelection.html new file mode 100644 index 00000000..8a64bece --- /dev/null +++ b/embedded/www/tklib/files/modules/persistentSelection/persistentSelection.html @@ -0,0 +1,283 @@ + + +persistentSelection - Enhanced PRIMARY selection + + + + +
    +
    [ + Tklib Home +| Main Table Of Contents +| Table Of Contents +| Keyword Index +| Categories +| Modules +| Applications + ]
    +

    persistentSelection(n) 1.0 tklib "Enhanced PRIMARY selection"

    +

    Name

    +

    persistentSelection - Enhanced PRIMARY selection

    +
    + + +

    Description

    +

    Consider a Tk widget that sets its -exportselection option to boolean true, thereby exporting its selection. When the selection in the widget is canceled, by default Tk also cancels the PRIMARY selection. In this situation, an attempt to read the PRIMARY selection, e.g. by a <<PasteSelection>> event, will fail.

    +

    The persistentSelection package offers more convenient behavior. It will sustain as the PRIMARY selection the last non-empty value set by any Tk widget that it monitors, as long as the PRIMARY selection is not claimed by another process, or by a widget that it does not monitor.

    +

    The persistentSelection package works by binding to the <<Selection>> event on the widgets of interest, and using this binding to monitor any change of the selection in the widget. Its commands are confined to the namespace ::persistentSelection.

    +
    +

    COMMANDS

    +
    +
    persistentSelection::fixText
    +

    Call this command once to resolve problems with text widgets that use the default Text bindtag (rather than Ntext). See Text widgets for an explanation.

    +

    The command adjusts some Text bindings to generate <<Selection>> events; and it re-orders calls to the text widget tag command in the private command ::tk::TextSelectTo, so that this command cooperates better with persistentSelection.

    +

    These adjustments are needed only to older versions of Tk. The command persistentSelection::fixText has no effect on sufficiently recent releases. It can safely be called for any version of Tk.

    +
    persistentSelection::getClassicPrimarySel ?displayOf? ?withOthers?
    +
      +
    • displayOf - a Tk window path on the display to be interrogated (optional, default {.})

    • +
    • withOthers - whether to return the PRIMARY selection if it is owned by another process or interpreter (optional, boolean, default false)

    • +
    +

    A command to return the classic (non-persistent) form of the PRIMARY selection. If the selection does not exist, or is sustained only by persistentSelection, the command returns the empty string.

    +
    persistentSelection::getPrimarySel ?displayOf?
    +
      +
    • displayOf - a Tk window on the display to be interrogated (optional, default {.})

    • +
    +

    A command to return the value of the PRIMARY selection. If the selection does not exist, the command returns the empty string. The usual Tk commands are perfectly valid, but they raise an error if the selection does not exist.

    +
    persistentSelection::report type pathName
    +
      +
    • type - (value text or entry) classification of the widget whose selection has changed

    • +
    • pathName - the Tk window path of the widget whose selection has changed

    • +
    +

    To make package persistentSelection monitor a widget, this command must be bound to the <<Selection>> event on that widget. The command records changes in the widget's selection, and uses the information to sustain a non-empty PRIMARY selection on each display.

    +
    +
    +

    USAGE

    +

    Script requirements

    +

    For each widget that will be monitored by persistentSelection, the command persistentSelection::report must be bound to event <<Selection>> in one of the widget's binding tags.

    +

    For example, the developer may wish to use persistentSelection with every text and entryPlus widget in an application: this can be achieved by adding the <<Selection>> binding to the Text and EntryPlus bindtags. See EXAMPLES.

    +

    If persistentSelection is not required for all widgets of a particular class, the binding can be added to per-widget bindtags. See EXAMPLES.

    +
    +

    Widget requirements

    +

    To be capable of being monitored by persistentSelection, a widget must satisfy three conditions:

    +
      +
    • It must have an -exportselection option that allows it to export its selection to the PRIMARY selection.

    • +
    • It must generate a <<Selection>> event whenever its selection changes.

    • +
    • its bindings to other events should be suitable - specifically, in versions of Tk older than 8.6.6, a GUI event that extends or reduces the selection from one non-empty value to another should not use an intermediate state that has an empty selection, because this confuses persistentStore.

    • +
    +

    The Tk and Ttk widgets that can export their selection are text, entry, listbox, spinbox, ttk::entry, ttk::spinbox, and ttk::combobox.

    +
    +

    Text widgets

    +

    In versions of Tk older than 8.6.9, the text widget does not generate <<Selection>> events in a few "corner cases" in which its selection changes. These omissions can be corrected by changes to the Text bindings, in order to satisfy the second condition of Widget requirements.

    +

    In addition, versions of Tk older than 8.6.6 process selection events slightly differently from newer versions, and in combination with the Text bindings this confuses persistentStore. If an upgrade to the current version of Tcl/Tk is not feasible, this problem can be resolved by making a slight modification to the widget bindings, in order to satisfy the third condition of Widget requirements.

    +

    Either the script should call the command persistentSelection::fixText to adjust the Text bindings and the commands that they call; or the widget can use the Ntext binding tag (for ntext 1.0) instead of the default Text bindtag.

    +

    In either case, the argument type supplied to command persistentSelection::report should have the value text.

    +
    +

    Entry, spinbox, ttk::entry, ttk::spinbox, and ttk::combobox widgets

    +

    The entry, spinbox, ttk::entry, ttk::spinbox, and ttk::combobox widgets do not generate a <<Selection>> event when their selection changes, and therefore require modification.

    +

    The package widgetPlus provides snit wrappers widgetPlus::entryPlus, widgetPlus::spinboxPlus, widgetPlus::ttkEntryPlus, widgetPlus::ttkSpinboxPlus, and widgetPlus::ttkComboboxPlus respectively. Each widgetPlus widget generates the required <<Selection>> events.

    +

    In all these cases, the argument type supplied to command persistentSelection::report should have the value entry. This argument determines how persistentSelection will inspect the widget's selection, and the commands that do so are the same for all these widgets.

    +
    +

    Listbox widgets

    +

    A similar wrapper has not been created for the listbox widget, which has the complication of permitting multiple selections.

    +
    +
    +

    TO DO

    +
      +
    • Test on a system with multiple displays.

    • +
    +
    +

    BUGS

    +

    This version of persistentSelection is intended to be compatible with all releases of Tk 8.5 and 8.6, and with the branches core-8-5-branch, core-8-6-branch, revised_text, and trunk in the source code repository for Tk. Any incompatibility with any of these versions, for any Tk windowing system, should be reported as a bug. Please report such in the category persistentSelection of the Tklib Trackers.

    +
    +

    EXAMPLES

    +

    Each example uses persistentSelection to retain the last non-empty value of the selection in certain widgets. Each example also includes the creation of sample widgets.

    +

    Monitor all entryPlus widgets.

    +
    +package require widgetPlus
    +widgetPlus::entryPlus .ep
    +pack .ep
    + 
    +package require persistentSelection
    +bind EntryPlus <<Selection>> {::persistentSelection::report entry %W}
    +
    +

    Monitor all text widgets that use the default Text bindings.

    +
    +text .t
    +pack .t
    + 
    +package require persistentSelection
    +::persistentSelection::fixText
    +bind Text <<Selection>> {::persistentSelection::report text %W}
    +
    +

    Monitor all text widgets that use the default Text bindings, and all entryPlus widgets.

    +
    +text .t
    +pack .t
    + 
    +package require widgetPlus
    +widgetPlus::entryPlus .ep
    +pack .ep
    + 
    +package require persistentSelection
    +::persistentSelection::fixText
    +bind Text <<Selection>> {::persistentSelection::report text %W}
    +bind EntryPlus <<Selection>> {::persistentSelection::report entry %W}
    +
    +

    Monitor all text widgets that use Ntext bindings.

    +
    +text .t
    +pack .t
    + 
    +package require ntext
    +bindtags .t {.t Ntext . all}
    + 
    +package require persistentSelection
    +bind Ntext <<Selection>> {::persistentSelection::report text %W}
    +
    +

    Monitor a single entryPlus widget .ep

    +
    +package require widgetPlus
    +widgetPlus::entryPlus .ep
    +pack .ep
    + 
    +package require persistentSelection
    +bind .ep <<Selection>> {::persistentSelection::report entry %W}
    +
    +

    Monitor a single text widget .t

    +
    +text .t
    +pack .t
    + 
    +package require persistentSelection
    +bind .t <<Selection>> {::persistentSelection::report text %W}
    +
    +
    + +
    diff --git a/embedded/www/tklib/files/modules/plotchart/plotchart.html b/embedded/www/tklib/files/modules/plotchart/plotchart.html index 6d5c9f8b..12bc1956 100644 --- a/embedded/www/tklib/files/modules/plotchart/plotchart.html +++ b/embedded/www/tklib/files/modules/plotchart/plotchart.html @@ -173,133 +173,136 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

  • ::Plotchart::createRightAxis w_or_plot yaxis
  • ::Plotchart::createTableChart w columns ?widths?
  • ::Plotchart::createTernaryDiagram w args
  • -
  • ::Plotchart::createStatusTimeline w xaxis ylabel args
  • -
  • $anyplot title text position
  • -
  • $anyplot subtitle text
  • -
  • $anyplot canvas
  • -
  • $anyplot saveplot filename args
  • -
  • $anyplot xtext text
  • -
  • $anyplot ytext text
  • -
  • $anyplot vtext text
  • -
  • $anyplot xsubtext text
  • -
  • $anyplot ysubtext text
  • -
  • $anyplot vsubtext text
  • -
  • $anyplot xconfig -option value ...
  • -
  • $anyplot yconfig -option value ...
  • -
  • $anyplot background part colour_or_image dir ?brightness?
  • -
  • $anyplot xticklines colour ?dash?
  • -
  • $anyplot yticklines colour ?dash?
  • -
  • $anyplot legend series text ?spacing?
  • -
  • $anyplot removefromlegend series
  • -
  • $anyplot legendconfig -option value ...
  • -
  • $anyplot balloon x y text dir
  • -
  • $anyplot balloonconfig args
  • -
  • $anyplot plaintext x y text dir
  • -
  • $anyplot plaintextconfig args
  • -
  • $anyplot object itemtype series args
  • -
  • $anyplot deletedata
  • -
  • $xyplot plot series xcrd ycrd
  • -
  • $xyplot plotlist series xlist ylist every
  • -
  • $xyplot region series xlist ylist
  • -
  • $xyplot minmax series xcrd ymin ymax
  • -
  • $histogram plotcumulative series xcrd ycrd
  • -
  • $xyplot trend series xcrd ycrd
  • -
  • $xyplot rchart series xcrd ycrd
  • -
  • $xyplot interval series xcrd ymin ymax ?ycentr?
  • -
  • $xyplot box-and-whiskers series xcrd ycrd
  • -
  • $xyplot vector series xcrd ycrd ucmp vcmp
  • -
  • $xyplot vectorconfig series -option value ...
  • -
  • $xyplot dot series xcrd ycrd value
  • -
  • $xyplot dotconfig series -option value ...
  • -
  • $xyplot contourlines xcrd ycrd values ?classes?
  • -
  • $xyplot contourlinesfunctionvalues xvec yvec valuesmat ?classes?
  • -
  • $xyplot contourfill xcrd ycrd values ?classes?
  • -
  • $xyplot contourbox xcrd ycrd values ?classes?
  • -
  • $xyplot colorMap colours
  • -
  • $xyplot legendisolines values classes
  • -
  • $xyplot legendshades values classes
  • -
  • $xyplot grid xcrd ycrd
  • -
  • $xyplot xband ymin ymax
  • -
  • $xyplot yband xmin xmax
  • -
  • $xyplot labeldot x y text orient
  • -
  • $polarplot plot series radius angle
  • -
  • $windrose plot data colour
  • -
  • $plot3d plotfunc function
  • -
  • $plot3d plotfuncont function contours
  • -
  • $plot3d gridsize nxcells nycells
  • -
  • $plot3d plotdata data
  • -
  • $plot3d interpolatedata data contours
  • -
  • $plot3d colour fill border
  • -
  • $plot3d ribbon yzpairs
  • -
  • $plot3d plot yzpairs
  • -
  • $xyplot dataconfig series -option value ...
  • -
  • $pie plot data
  • -
  • $pie colours colour1 colour2 ...
  • -
  • $pie explode segment
  • -
  • $radial plot data colour thickness
  • +
  • ::Plotchart::createNormalPlot w xscale args
  • +
  • ::Plotchart::createStatusTimeline w xaxis ylabel args
  • +
  • $anyplot title text position
  • +
  • $anyplot subtitle text
  • +
  • $anyplot canvas
  • +
  • $anyplot saveplot filename args
  • +
  • $anyplot xtext text
  • +
  • $anyplot ytext text
  • +
  • $anyplot vtext text
  • +
  • $anyplot xsubtext text
  • +
  • $anyplot ysubtext text
  • +
  • $anyplot vsubtext text
  • +
  • $anyplot xconfig -option value ...
  • +
  • $anyplot yconfig -option value ...
  • +
  • $anyplot background part colour_or_image dir ?brightness?
  • +
  • $anyplot xticklines colour ?dash?
  • +
  • $anyplot yticklines colour ?dash?
  • +
  • $anyplot legend series text ?spacing?
  • +
  • $anyplot removefromlegend series
  • +
  • $anyplot legendconfig -option value ...
  • +
  • $anyplot balloon x y text dir
  • +
  • $anyplot balloonconfig args
  • +
  • $anyplot plaintext x y text dir
  • +
  • $anyplot plaintextconfig args
  • +
  • $anyplot object itemtype series args
  • +
  • $anyplot deletedata
  • +
  • $xyplot plot series xcrd ycrd
  • +
  • $normalplot plot series mean stdev data
  • +
  • $normalplot diagonal
  • +
  • $xyplot plotlist series xlist ylist every
  • +
  • $xyplot region series xlist ylist
  • +
  • $xyplot minmax series xcrd ymin ymax
  • +
  • $histogram plotcumulative series xcrd ycrd
  • +
  • $xyplot trend series xcrd ycrd
  • +
  • $xyplot rchart series xcrd ycrd
  • +
  • $xyplot interval series xcrd ymin ymax ?ycentr?
  • +
  • $xyplot box-and-whiskers series xcrd ycrd
  • +
  • $xyplot vector series xcrd ycrd ucmp vcmp
  • +
  • $xyplot vectorconfig series -option value ...
  • +
  • $xyplot dot series xcrd ycrd value
  • +
  • $xyplot dotconfig series -option value ...
  • +
  • $xyplot contourlines xcrd ycrd values ?classes?
  • +
  • $xyplot contourlinesfunctionvalues xvec yvec valuesmat ?classes?
  • +
  • $xyplot contourfill xcrd ycrd values ?classes?
  • +
  • $xyplot contourbox xcrd ycrd values ?classes?
  • +
  • $xyplot colorMap colours
  • +
  • $xyplot legendisolines values classes
  • +
  • $xyplot legendshades values classes
  • +
  • $xyplot grid xcrd ycrd
  • +
  • $xyplot xband ymin ymax
  • +
  • $xyplot yband xmin xmax
  • +
  • $xyplot labeldot x y text orient
  • +
  • $polarplot plot series radius angle
  • +
  • $windrose plot data colour
  • +
  • $plot3d plotfunc function
  • +
  • $plot3d plotfuncont function contours
  • +
  • $plot3d gridsize nxcells nycells
  • +
  • $plot3d plotdata data
  • +
  • $plot3d interpolatedata data contours
  • +
  • $plot3d colour fill border
  • +
  • $plot3d ribbon yzpairs
  • +
  • $plot3d plot yzpairs
  • +
  • $xyplot dataconfig series -option value ...
  • +
  • $pie plot data
  • $pie colours colour1 colour2 ...
  • -
  • $barchart plot series ydata colour ?dir? ?brightness?
  • -
  • $barchart config -option value ...
  • -
  • $barchart plot series xdata colour ?dir? ?brightness?
  • -
  • $barchart config -option value ...
  • -
  • $barchart plot label yvalue colour
  • -
  • $barchart config -option value ...
  • -
  • $ribbon line xypairs colour
  • -
  • $ribbon area xypairs colour
  • -
  • $boxplot plot series label values
  • -
  • $timechart period text time_begin time_end colour
  • -
  • $timechart addperiod time_begin time_end colour
  • -
  • $timechart milestone text time colour
  • -
  • $timechart addmilestone time colour
  • -
  • $timechart vertline text time colour
  • -
  • $timechart hscroll scrollbar
  • -
  • $timechart vscroll scrollbar
  • -
  • $ganttchart task text time_begin time_end completed
  • -
  • $ganttchart milestone text time colour
  • -
  • $ganttchart vertline text time
  • -
  • $ganttchart connect from to
  • -
  • $ganttchart summary text args
  • -
  • $ganttchart color keyword newcolor
  • -
  • $ganttchart font keyword newfont
  • -
  • $ganttchart hscroll scrollbar
  • -
  • $ganttchart vscroll scrollbar
  • -
  • $isoplot plot rectangle x1 y1 x2 y2 colour
  • -
  • $isoplot plot filled-rectangle x1 y1 x2 y2 colour
  • -
  • $isoplot plot circle xc yc radius colour
  • -
  • $isoplot plot filled-circle xc yc radius colour
  • -
  • $table row items
  • -
  • $table separator
  • -
  • $table formatcommand procname
  • -
  • $table cellconfigure args
  • -
  • $ternary plot series xcrd ycrd zcrd text dir
  • -
  • $ternary line series coords
  • -
  • $ternary fill series coords
  • -
  • $ternary text xtext ytext ztext
  • -
  • $ternary ticklines colour
  • -
  • $timeline plot series item start stop color
  • -
  • $timeline vertline text time args
  • -
  • ::Plotchart::viewPort w pxmin pymin pxmax pymax
  • -
  • ::Plotchart::worldCoordinates w xmin ymin xmax ymax
  • -
  • ::Plotchart::world3DCoordinates w xmin ymin zmin xmax ymax zmax
  • -
  • ::Plotchart::coordsToPixel w x y
  • -
  • ::Plotchart::coords3DToPixel w x y z
  • -
  • ::Plotchart::polarCoordinates w radmax
  • -
  • ::Plotchart::polarToPixel w rad phi
  • -
  • ::Plotchart::pixelToCoords w x y
  • -
  • ::Plotchart::pixelToIndex w x y
  • -
  • ::Plotchart::determineScale xmin xmax inverted
  • -
  • ::Plotchart::determineScaleFromList values inverted
  • -
  • ::Plotchart::plotconfig charttype component property value
  • -
  • ::Plotchart::plotstyle subcmd style args
  • -
  • ::Plotchart::eraseplot anyplot
  • -
  • ::Plotchart::createTargetDiagram w limits scale
  • -
  • $target plot series xvalues yvalues
  • -
  • ::Plotchart::createPerformanceProfile w max
  • -
  • $performance plot series_and_data_pairs
  • -
  • ::Plotchart::plotmethod charttype methodname plotproc
  • -
  • ::Plotchart::plotpack w dir args
  • -
  • $anyplot bindplot event command args
  • -
  • $anyplot bindlast series event command
  • +
  • $pie explode segment
  • +
  • $radial plot data colour thickness
  • +
  • $pie colours colour1 colour2 ...
  • +
  • $barchart plot series ydata colour ?dir? ?brightness?
  • +
  • $barchart config -option value ...
  • +
  • $barchart plot series xdata colour ?dir? ?brightness?
  • +
  • $barchart config -option value ...
  • +
  • $barchart plot label yvalue colour
  • +
  • $barchart config -option value ...
  • +
  • $ribbon line xypairs colour
  • +
  • $ribbon area xypairs colour
  • +
  • $boxplot plot series label values
  • +
  • $timechart period text time_begin time_end colour
  • +
  • $timechart addperiod time_begin time_end colour
  • +
  • $timechart milestone text time colour
  • +
  • $timechart addmilestone time colour
  • +
  • $timechart vertline text time colour
  • +
  • $timechart hscroll scrollbar
  • +
  • $timechart vscroll scrollbar
  • +
  • $ganttchart task text time_begin time_end completed
  • +
  • $ganttchart milestone text time colour
  • +
  • $ganttchart vertline text time
  • +
  • $ganttchart connect from to
  • +
  • $ganttchart summary text args
  • +
  • $ganttchart color keyword newcolor
  • +
  • $ganttchart font keyword newfont
  • +
  • $ganttchart hscroll scrollbar
  • +
  • $ganttchart vscroll scrollbar
  • +
  • $isoplot plot rectangle x1 y1 x2 y2 colour
  • +
  • $isoplot plot filled-rectangle x1 y1 x2 y2 colour
  • +
  • $isoplot plot circle xc yc radius colour
  • +
  • $isoplot plot filled-circle xc yc radius colour
  • +
  • $table row items
  • +
  • $table separator
  • +
  • $table formatcommand procname
  • +
  • $table cellconfigure args
  • +
  • $ternary plot series xcrd ycrd zcrd text dir
  • +
  • $ternary line series coords
  • +
  • $ternary fill series coords
  • +
  • $ternary text xtext ytext ztext
  • +
  • $ternary ticklines colour
  • +
  • $timeline plot series item start stop color
  • +
  • $timeline vertline text time args
  • +
  • ::Plotchart::viewPort w pxmin pymin pxmax pymax
  • +
  • ::Plotchart::worldCoordinates w xmin ymin xmax ymax
  • +
  • ::Plotchart::world3DCoordinates w xmin ymin zmin xmax ymax zmax
  • +
  • ::Plotchart::coordsToPixel w x y
  • +
  • ::Plotchart::coords3DToPixel w x y z
  • +
  • ::Plotchart::polarCoordinates w radmax
  • +
  • ::Plotchart::polarToPixel w rad phi
  • +
  • ::Plotchart::pixelToCoords w x y
  • +
  • ::Plotchart::pixelToIndex w x y
  • +
  • ::Plotchart::determineScale xmin xmax inverted
  • +
  • ::Plotchart::determineScaleFromList values inverted
  • +
  • ::Plotchart::plotconfig charttype component property value
  • +
  • ::Plotchart::plotstyle subcmd style args
  • +
  • ::Plotchart::eraseplot anyplot
  • +
  • ::Plotchart::createTargetDiagram w limits scale
  • +
  • $target plot series xvalues yvalues
  • +
  • ::Plotchart::createPerformanceProfile w max
  • +
  • $performance plot series_and_data_pairs
  • +
  • ::Plotchart::plotmethod charttype methodname plotproc
  • +
  • ::Plotchart::plotpack w dir args
  • +
  • $anyplot bindplot event command args
  • +
  • $anyplot bindlast series event command
  • @@ -795,7 +798,27 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    -fractions yes/no, to display numbers 0 to 1 instead of 0 to 100% and -steps number to influence the number of labels along the three sides.

    -
    ::Plotchart::createStatusTimeline w xaxis ylabel args
    +
    ::Plotchart::createNormalPlot w xscale args
    +

    Create a command to draw a normal plot - useful to investigate whether a data set is normally +distributed or not. In that case the data will fall on or near the diagonal. As such, it is a +specialised plotting procedure.

    +

    The details of the plotting procedure have been adopted from the qqnorm in the "R" stats +package and described on Wikipedia.

    +

    As the implementation of this plot type relies on the math::statistics package, it is only +available if that package can be loaded.

    +
    +
    widget w (in)
    +

    Name of the canvas widget to hold the normal plot.

    +
    list xscale (in)
    +

    A 3-element list containing minimum, maximum and stepsize for the x-axis +in this order. The scaling of the y-axis is determined from that. Important: the scale +is to be given in terms of the normalised data, that is: 0 represents the mean of the data, +1 one standard deviation away from the mean etc.

    +
    list args (in)
    +

    Zero or more option-value pairs to influence the position and the appearance of the +plot - see the XY-plot for more details.

    +
    +
    ::Plotchart::createStatusTimeline w xaxis ylabel args

    Create a command to draw a so-called status timeline. Its layout is similar to a horizontal barchart, but the bars are drawn in different colours, each representing the status of the item as it varies over time (the horizontal axis).

    @@ -822,7 +845,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    General subcommands for all types of charts. \$anyplot is the command returned by the creation command:

    -
    $anyplot title text position
    +
    $anyplot title text position

    Specify the title of the whole chart.

    string text (in)
    @@ -832,16 +855,16 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    alternatively use "left" or "right". You can use multiple titles with different positions.

    -
    $anyplot subtitle text
    +
    $anyplot subtitle text

    Specify the subtitle of the whole chart.

    string text (in)

    The text of the subtitle to be drawn.

    -
    $anyplot canvas
    +
    $anyplot canvas

    Return the name of the canvas (or the alias if you use more than one plot within a canvas). Use this value for the coordinate transformations.

    -
    $anyplot saveplot filename args
    +
    $anyplot saveplot filename args

    Draws the plot into a file, using PostScript.

    string filename (in)
    @@ -863,28 +886,28 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    of waiting for the visibility of the window, the procedure simply waits two seconds. It is not ideal, but it seems to work better.

    -
    $anyplot xtext text
    +
    $anyplot xtext text

    Specify the title of the (horizontal) x-axis, for those plots that have a straight x-axis.

    string text (in)

    The text of the x-axis label to be drawn.

    -
    $anyplot ytext text
    +
    $anyplot ytext text

    Specify the title of the (horizontal) y-axis, for those plots that have a straight y-axis.

    string text (in)

    The text of the y-axis label to be drawn.

    -
    $anyplot vtext text
    +
    $anyplot vtext text

    Draw a vertical label to the y-axis. Note: this requires Tk 8.6 or later, for older versions it does nothing.

    string text (in)

    Text to drawn to the y-axis

    -
    $anyplot xsubtext text
    +
    $anyplot xsubtext text

    Specify the subtext of the (horizontal) x-axis, for those plots that have a straight x-axis. This text is drawn below the primary text.

    Since this involves positioning the primary text and setting margins, you need to @@ -894,7 +917,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    string text (in)

    The secondary text of the x-axis label to be drawn.

    -
    $anyplot ysubtext text
    +
    $anyplot ysubtext text

    Specify the subtext of the (vertical) y-axis, for those plots that have a straight y-axis. This text is drawn below the primary text, for both axes on the left and the right.

    @@ -905,7 +928,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    string text (in)

    The secondary text of the y-axis label to be drawn.

    -
    $anyplot vsubtext text
    +
    $anyplot vsubtext text

    Specify the subtext of the (vertical) y-axis, for those plots that have a straight y-axis. This text is drawn to the right of the primary text, for both axes on the left and the right.

    @@ -918,7 +941,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    string text (in)

    The secondary (vertical) text of the y-axis label to be drawn.

    -
    $anyplot xconfig -option value ...
    +
    $anyplot xconfig -option value ...

    Set one or more configuration parameters for the x-axis. The following options are supported:

    @@ -933,10 +956,10 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    maximum and stepsize for the axis, in this order.

    Beware: Setting this option will clear all data from the plot.

    -
    $anyplot yconfig -option value ...
    +
    $anyplot yconfig -option value ...

    Set one or more configuration parameters for the y-axis. This method accepts the same options and values as the method xconfig.

    -
    $anyplot background part colour_or_image dir ?brightness?
    +
    $anyplot background part colour_or_image dir ?brightness?

    Set the background of a part of the plot

    string part
    @@ -958,7 +981,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    string brightness

    Indicates whether the colour should become brighter (bright) or darker (dark). Defaults to bright

    -
    $anyplot xticklines colour ?dash?
    +
    $anyplot xticklines colour ?dash?

    Draw vertical ticklines at each tick location

    string colour
    @@ -969,7 +992,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    Possible values: lines, dots1, dots2, dots3, dots4, dots5. The actual effect depends on the platform.

    -
    $anyplot yticklines colour ?dash?
    +
    $anyplot yticklines colour ?dash?

    Draw horizontal ticklines at each tick location

    string colour
    @@ -980,7 +1003,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    Possible values: lines, dots1, dots2, dots3, dots4, dots5. The actual effect depends on the platform.

    -
    $anyplot legend series text ?spacing?
    +
    $anyplot legend series text ?spacing?

    Add an entry to the legend. The series determines which graphical symbol is to be used. (As a side effect the legend is actually drawn.)

    @@ -993,13 +1016,13 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    Optional argument to specify the vertical spacing between the entries (in pixels). (Note that this spacing will be reused later.)

    -
    $anyplot removefromlegend series
    +
    $anyplot removefromlegend series

    Remove an entry for a series from the legend and redraw it.

    string series

    Name of the data series to be removed.

    -
    $anyplot legendconfig -option value ...
    +
    $anyplot legendconfig -option value ...

    Set one or more options for the legend. The legend is drawn as a rectangle with text and graphics inside.

    @@ -1024,7 +1047,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    Set the vertical spacing between entries in the legend (in pixels). bottom-left or bottom-right. (Default value is 10 pixels.)

    -
    $anyplot balloon x y text dir
    +
    $anyplot balloon x y text dir

    Add balloon text to the plot (except for 3D plots). The arrow will point to the given x- and y-coordinates. For xy-graphs and such, the coordinates are directly related to the axes; for vertical barcharts the @@ -1041,7 +1064,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    Direction of the arrow, one of: north, north-east, east, south-east, south, south-west, west or north-west.

    -
    $anyplot balloonconfig args
    +
    $anyplot balloonconfig args

    Configure the balloon text for the plot. The new settings will be used for the next balloon text.

    @@ -1062,7 +1085,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    arrowsize value

    Length factor for the arrow (in pixels)

    -
    $anyplot plaintext x y text dir
    +
    $anyplot plaintext x y text dir

    Add plain text to the plot (except for 3D plots). The text is positioned at the given x- and y-coordinates. For xy-graphs and such, the coordinates are directly related to the axes; for vertical barcharts the @@ -1079,7 +1102,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    Anchor for the text, one of: north, north-east, east, south-east, south, south-west, west or north-west.

    -
    $anyplot plaintextconfig args
    +
    $anyplot plaintextconfig args

    Configure the plain text annotation for the plot. The new settings will be used for the next plain text.

    @@ -1090,7 +1113,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    textcolour colour

    Colour for the text (synonym: textcolor)

    -
    $anyplot object itemtype series args
    +
    $anyplot object itemtype series args

    Draw a canvas item in the plot where the coordinates are scaled using the coordinate system of the plot. In addition to the standard canvas types, it also supports circles, dots and crosses.

    @@ -1107,7 +1130,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    list args (in)

    List of coordinates and drawing options

    -
    $anyplot deletedata
    +
    $anyplot deletedata

    Remove the lines, symbols and other graphical object associated with the actual data from the plot.

    Note: Currently implemented for xy-plots only

    @@ -1122,7 +1145,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    For xy plots, stripcharts, histograms and time-x-plots:

    -
    $xyplot plot series xcrd ycrd
    +
    $xyplot plot series xcrd ycrd

    Add a data point to the plot.

    string series (in)
    @@ -1134,10 +1157,29 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    Y-coordinate of the new point.

    +

    For normal plots:

    +
    +
    $normalplot plot series mean stdev data
    +

    Plot the data set using the given mean and stanard deviation.

    +

    As you give the mean and standard deviation separately, the plot can be used for several data series +or for adding to an existing data series.

    +
    +
    string series (in)
    +

    Name of the data series - used to determine the appearance

    +
    float mean (in)
    +

    Assumed mean of the data set.

    +
    float stdev (in)
    +

    Assumed standard deviation of the data set.

    +
    list data (in)
    +

    List of the data comprising the data set

    +
    +
    $normalplot diagonal
    +

    Draw a diagonal line, indicating the ideal normally distributed data set.

    +

    For xy, x-log y, log-x-y, log-x-log-y plots there is the additional command plotlist, which is useful for plotting a large amount of data:

    -
    $xyplot plotlist series xlist ylist every
    +
    $xyplot plotlist series xlist ylist every

    Draw a series of data as a whole. If symbols are asked for, draw them only for every Nth data point.

    @@ -1154,7 +1196,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    Other commands for xy, x-log y, log-x-y, log-x-log-y plots are region and minmax to draw filled polygons:

    -
    $xyplot region series xlist ylist
    +
    $xyplot region series xlist ylist

    Draw a filled polygon (region). The configuration of the series influences the polygon as follows: -fillcolour is used to fill the polygon, -colour is used for the boundary (set it to {} if no boundary is required and -width determines the width of the boundary.

    @@ -1166,7 +1208,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    float ycrd (in)

    List of Y-coordinates for the region.

    -
    $xyplot minmax series xcrd ymin ymax
    +
    $xyplot minmax series xcrd ymin ymax

    Draw a filled strip representing a minimum and a maximum. The configuration of the series influences the polygon as follows: -fillcolour is used to fill the polygon, -colour is used for the boundary (set it to {} if no boundary is required and -width determines the width of the boundary.

    @@ -1191,14 +1233,14 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    of the x-axis, you should draw a bar at the maximum x-coordinate.

    For histograms you can also use the plotcumulative command:

    -
    $histogram plotcumulative series xcrd ycrd
    +
    $histogram plotcumulative series xcrd ycrd

    The arguments mean exactly the same as for the plot command, but the data are accumulated to the previous values.

    For xy plots:

    -
    $xyplot trend series xcrd ycrd
    +
    $xyplot trend series xcrd ycrd

    Draw or update a trend line using the data given sofar.

    string series (in)
    @@ -1208,7 +1250,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    float ycrd (in)

    Y-coordinate of the new data point

    -
    $xyplot rchart series xcrd ycrd
    +
    $xyplot rchart series xcrd ycrd

    Draw data in the same way as the plot method, but with two lines added that indicate the expected range (+/- 3*standard deviation) of the data.

    @@ -1219,7 +1261,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    float ycrd (in)

    Y-coordinate of the new data point

    -
    $xyplot interval series xcrd ymin ymax ?ycentr?
    +
    $xyplot interval series xcrd ymin ymax ?ycentr?

    Add a vertical error interval to the plot. The interval is drawn from ymin to ymax. If the ycentr argument is given, a symbol is drawn at that position.

    @@ -1235,7 +1277,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    float ycentr (in)

    Y-coordinate to draw the symbol at (optional)

    -
    $xyplot box-and-whiskers series xcrd ycrd
    +
    $xyplot box-and-whiskers series xcrd ycrd

    Draw a box and whiskers in the plot. If the argument xcrd is a list of several values and the argument ycrd is a single value, a @@ -1271,7 +1313,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    The box ends at the 1st and 3rd quartile, while the whiskers by default are plotted to span 1.5 IQR (interquartile range) from the 1st and 3rd quartile.

    -
    $xyplot vector series xcrd ycrd ucmp vcmp
    +
    $xyplot vector series xcrd ycrd ucmp vcmp

    Draw a vector in the plot. The vector can be given as either cartesian coordinates or as length/angle, where the angle is in degrees and is interpreted according to the mathematical convention or the nautical. @@ -1289,7 +1331,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    float ycentr (in)

    Y-component or the angle of the vector

    -
    $xyplot vectorconfig series -option value ...
    +
    $xyplot vectorconfig series -option value ...

    ] Set the vector drawing options for a particular series

    @@ -1313,7 +1355,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    (the angle 0 coincides with the positive x-axis, 90 coincides with the positive y-axis) or "nautical" (0 is "north" and 90 is "east").

    -
    $xyplot dot series xcrd ycrd value
    +
    $xyplot dot series xcrd ycrd value

    Draw a dot in the plot. The size and colour is determined by the value and by the options set for the series it belongs to. (See the dotconfig subcommand)

    @@ -1327,7 +1369,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    float value (in)

    Value determining size and colour

    -
    $xyplot dotconfig series -option value ...
    +
    $xyplot dotconfig series -option value ...

    ] Set the dot drawing options for a particular series

    @@ -1365,7 +1407,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    You can combine the colouring by value and the scaling by value by setting a list of classes and setting the scalebyvalue option on.

    -
    $xyplot contourlines xcrd ycrd values ?classes?
    +
    $xyplot contourlines xcrd ycrd values ?classes?

    Draw contour lines for the values given on the grid. The grid is defined by the xcrd and ycrd arguments. The xcrd argument (resp. ycrd) is expected to be a matrix, implemented as a list of lists which gives the @@ -1392,7 +1434,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    Note: The xcrd argument is generally made of nypoints identical rows, while each row of ycrd is made with one single value.

    -
    $xyplot contourlinesfunctionvalues xvec yvec valuesmat ?classes?
    +
    $xyplot contourlinesfunctionvalues xvec yvec valuesmat ?classes?

    Draw contour lines for the values given on the grid. The grid is defined by the xvec and yvec arguments. Here, xvec (resp. yvec) is a list of x-coordinates (resp. y-coordinates). The number of values in xvec (resp. yvec) is the number of points in @@ -1416,15 +1458,15 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    classes are determined automatically.

    Note: The class values must enclose the whole range of values.

    -
    $xyplot contourfill xcrd ycrd values ?classes?
    +
    $xyplot contourfill xcrd ycrd values ?classes?

    Draw filled contours for the values given on the grid. (The use of this method is identical to the "contourlines" method).

    Entries in the legend are drawn via the legendshades subcommand.

    -
    $xyplot contourbox xcrd ycrd values ?classes?
    +
    $xyplot contourbox xcrd ycrd values ?classes?

    Draw the cells as filled quadrangles. The colour is determined from the average of the values on all four corners.

    Entries in the legend are drawn via the legendshades subcommand.

    -
    $xyplot colorMap colours
    +
    $xyplot colorMap colours

    Set the colours to be used with the contour methods. The argument is either a predefined colourmap (grey/gray, jet, hot or cool) or a list of colours. When selecting the colours for actually drawing the @@ -1439,7 +1481,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

  • cool: colours from cyan via blue to magenta

  • -
    $xyplot legendisolines values classes
    +
    $xyplot legendisolines values classes

    Add the contour classes to the legend as coloured lines. The text indicates the values.

    @@ -1449,7 +1491,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    list values (in)

    The list of classes as used for the actual drawing.

    -
    $xyplot legendshades values classes
    +
    $xyplot legendshades values classes

    Add the contour classes to the legend as coloured rectangles. The text indicates the values.

    @@ -1459,7 +1501,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    list values (in)

    The list of classes as used for the actual drawing.

    -
    $xyplot grid xcrd ycrd
    +
    $xyplot grid xcrd ycrd

    Draw the grid cells as lines connecting the (valid) grid points.

    list xcrd (in)
    @@ -1467,7 +1509,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    list ycrd (in)

    List of lists, each value is an y-coordinate for a grid cell corner

    -
    $xyplot xband ymin ymax
    +
    $xyplot xband ymin ymax

    Draw a light grey band in the plot, ranging over the full x-axis. This can be used to indicate a "typical" range for the data.

    @@ -1476,7 +1518,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    float ymax (in)

    Upper bound for the band

    -
    $xyplot yband xmin xmax
    +
    $xyplot yband xmin xmax

    Draw a light grey band in the plot, ranging over the full y-axis. This can be used to indicate a "typical" range for the data.

    @@ -1485,7 +1527,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    float xmax (in)

    Upper bound for the band

    -
    $xyplot labeldot x y text orient
    +
    $xyplot labeldot x y text orient

    Draw a label and a symbol in the plot. The label will appear near the symbol. The label will be drawn in grey, so as not to be too conspicuous.

    @@ -1507,7 +1549,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    For polar plots:

    -
    $polarplot plot series radius angle
    +
    $polarplot plot series radius angle

    Add a data point to the polar plot.

    string series (in)
    @@ -1520,7 +1562,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    For wind rose diagrams:

    -
    $windrose plot data colour
    +
    $windrose plot data colour

    Draw the data contained in the data argument. The data are added to the existing spokes towards the outer circle.

    @@ -1532,7 +1574,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    For 3D plots:

    -
    $plot3d plotfunc function
    +
    $plot3d plotfunc function

    Plot a function defined over two variables x and y. The resolution is determined by the set grid sizes (see the method gridsize for more information).

    @@ -1542,7 +1584,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    y coordinates. The procedure has to accept two float arguments (x is first argument, y is second) and return a floating-point value.

    -
    $plot3d plotfuncont function contours
    +
    $plot3d plotfuncont function contours

    Plot a function defined over two variables x and y using the contour levels in contours to colour the surface. The resolution is determined by the set grid sizes (see the method @@ -1556,7 +1598,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    List of values in ascending order that represent the contour levels (the boundaries between the colours in the contour map).

    -
    $plot3d gridsize nxcells nycells
    +
    $plot3d gridsize nxcells nycells

    Set the grid size in the two directions. Together they determine how many polygons will be drawn for a function plot.

    @@ -1567,7 +1609,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    Number of grid cells in y direction. Has to be an integer number greater than zero.

    -
    $plot3d plotdata data
    +
    $plot3d plotdata data

    Plot a matrix of data.

    list data (in)
    @@ -1583,7 +1625,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    -
    $plot3d interpolatedata data contours
    +
    $plot3d interpolatedata data contours

    Plot the data using bilinear interpolation with the contour levels in contours to colour the surface. The resolution is determined by the set grid sizes (see the method @@ -1595,7 +1637,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    List of values in ascending order that represent the contour levels (the boundaries between the colours in the contour map).

    -
    $plot3d colour fill border
    +
    $plot3d colour fill border

    Configure the colour to use for polygon borders and inner area. Note: The "color" subcommand is a synonym.

    @@ -1604,7 +1646,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    color border (in)

    The colour to use for the border of the polygons.

    -
    $plot3d ribbon yzpairs
    +
    $plot3d ribbon yzpairs

    Plot a ribbon based on the pairs of yz-coordinates. The colours for the ribbon itself and the edge are taken from the colours option.

    @@ -1614,7 +1656,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    For 3D ribbon plots:

    -
    $plot3d plot yzpairs
    +
    $plot3d plot yzpairs

    Plot a ribbon based on the pairs of yz-coordinates. The colours for the ribbon itself and the edge are taken from the colours option.

    @@ -1624,7 +1666,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    For xy plots, stripcharts, histograms, polar plots and ternary diagrams:

    -
    $xyplot dataconfig series -option value ...
    +
    $xyplot dataconfig series -option value ...

    Set the value for one or more options regarding the drawing of data of a specific series.

    @@ -1673,14 +1715,14 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    For piecharts and spiral pies:

    -
    $pie plot data
    +
    $pie plot data

    Fill a piechart.

    list data (in)

    A list of pairs (labels and values). The values determine the relative size of the circle segments. The labels are drawn beside the circle.

    -
    $pie colours colour1 colour2 ...
    +
    $pie colours colour1 colour2 ...

    Set the colours to be used.

    color colour1 (in)
    @@ -1688,7 +1730,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    color colour2 (in)

    The second colour, and so on.

    -
    $pie explode segment
    +
    $pie explode segment

    Explode a segment (that is: move one segment out of the circle). If the segment is indicated as "auto", then you can click on a segment. This will be exploded instead of any previously exploded segment.

    @@ -1699,7 +1741,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    For radial charts:

    -
    $radial plot data colour thickness
    +
    $radial plot data colour thickness

    Draw a new line in the radial chart

    list data (in)
    @@ -1710,7 +1752,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    int thickness (in)

    An optional argument for the thickness of the line.

    -
    $pie colours colour1 colour2 ...
    +
    $pie colours colour1 colour2 ...

    Set the colours to be used.

    color colour1 (in)
    @@ -1721,7 +1763,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    For vertical barcharts:

    -
    $barchart plot series ydata colour ?dir? ?brightness?
    +
    $barchart plot series ydata colour ?dir? ?brightness?

    Add a data series to a barchart. The bars are tagged with a tag "data_\$series" to identify them.

    string series (in)
    @@ -1737,7 +1779,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    If given, "bright" or "dark" (defaulting to "bright"). The colour will change to respectively white or black, depending on the direction.

    -
    $barchart config -option value ...
    +
    $barchart config -option value ...

    Set options for drawing the bars.

    showvalues boolean
    @@ -1752,7 +1794,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    For horizontal barcharts:

    -
    $barchart plot series xdata colour ?dir? ?brightness?
    +
    $barchart plot series xdata colour ?dir? ?brightness?

    Add a data series to a barchart. The bars are tagged with a tag "data_\$series" to identify them.

    string series (in)
    @@ -1768,7 +1810,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    If given, "bright" or "dark" (defaulting to "bright"). The colour will change to respectively white or black, depending on the direction.

    -
    $barchart config -option value ...
    +
    $barchart config -option value ...

    Set options for drawing the bars.

    showvalues boolean
    @@ -1783,7 +1825,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    For 3D barcharts:

    -
    $barchart plot label yvalue colour
    +
    $barchart plot label yvalue colour

    Add the next bar to the barchart.

    string label (in)
    @@ -1793,7 +1835,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    color colour (in)

    The colour of the column.

    -
    $barchart config -option value ...
    +
    $barchart config -option value ...

    Set one or more configuration parameters. The following options are supported:

    @@ -1815,7 +1857,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    For 3D ribbon charts:

    -
    $ribbon line xypairs colour
    +
    $ribbon line xypairs colour

    Plot the given xy-pairs as a ribbon in the chart

    list xypairs (in)
    @@ -1823,7 +1865,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    color colour (in)

    The colour of the ribbon.

    -
    $ribbon area xypairs colour
    +
    $ribbon area xypairs colour

    Plot the given xy-pairs as a ribbon with a filled area in front. The effect is that of a box with the data as its upper surface.

    @@ -1835,7 +1877,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    For boxplots:

    -
    $boxplot plot series label values
    +
    $boxplot plot series label values

    Add a box-and-whisker to the plot. The dataconfig command can be used to customize the box-and-whisker (see the box-and-whiskers command for the xyplot for details).

    @@ -1850,7 +1892,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    For timecharts:

    -
    $timechart period text time_begin time_end colour
    +
    $timechart period text time_begin time_end colour

    Add a time period to the chart.

    string text (in)
    @@ -1862,7 +1904,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    color colour (in)

    The colour of the bar (defaults to black).

    -
    $timechart addperiod time_begin time_end colour
    +
    $timechart addperiod time_begin time_end colour

    Add a new period to the current row in the chart. This allows you to highlight several periods in the same row. No new text is drawn.

    @@ -1873,7 +1915,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    color colour (in)

    The colour of the bar (defaults to black).

    -
    $timechart milestone text time colour
    +
    $timechart milestone text time colour

    Add a milestone (represented as an point-down triangle) to the chart.

    @@ -1884,7 +1926,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    color colour (in)

    The colour of the triangle (defaults to black).

    -
    $timechart addmilestone time colour
    +
    $timechart addmilestone time colour

    Add another milestone to the current row in the chart.

    string time (in)
    @@ -1892,7 +1934,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    color colour (in)

    The colour of the triangle (defaults to black).

    -
    $timechart vertline text time colour
    +
    $timechart vertline text time colour

    Add a vertical line (to indicate the start of the month for instance) to the chart in the specified colour.

    @@ -1904,14 +1946,14 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    color colour (in)

    The colour of the line to be drawn (defaults to black)

    -
    $timechart hscroll scrollbar
    +
    $timechart hscroll scrollbar

    Connect a horizontal scrollbar to the chart. See also the section on scrolling.

    widget scrollbar (in)

    The horizontal scrollbar that is to be connected to the chart

    -
    $timechart vscroll scrollbar
    +
    $timechart vscroll scrollbar

    Connect a vertical scrollbar to the chart. See also the section on scrolling.

    @@ -1921,7 +1963,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    For Gantt charts:

    -
    $ganttchart task text time_begin time_end completed
    +
    $ganttchart task text time_begin time_end completed

    Add a task with its period and level of completion to the chart. Returns a list of canvas items that can be used for further manipulations, like connecting two tasks.

    @@ -1935,7 +1977,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    float completed (in)

    The percentage of the task that is completed.

    -
    $ganttchart milestone text time colour
    +
    $ganttchart milestone text time colour

    Add a milestone (represented as an point-down triangle) to the chart.

    @@ -1946,7 +1988,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    color colour (in)

    The colour of the triangle (defaults to black).

    -
    $ganttchart vertline text time
    +
    $ganttchart vertline text time

    Add a vertical line (to indicate the start of the month for instance) to the chart.

    @@ -1956,7 +1998,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    string time (in)

    Time at which the line must be positioned.

    -
    $ganttchart connect from to
    +
    $ganttchart connect from to

    Add an arrow that connects the from task with the to task.

    list from (in)
    @@ -1971,7 +2013,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    The list of items returned by the "task" command that represents the task at which the arrow ends.

    -
    $ganttchart summary text args
    +
    $ganttchart summary text args

    Add a summary item that spans all the tasks listed. The graphical representation is a thick bar running from the leftmost task to the rightmost.

    @@ -1984,7 +2026,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    One or more tasks (the lists returned by the "task" command). They are shifted down to make room for the summary.

    -
    $ganttchart color keyword newcolor
    +
    $ganttchart color keyword newcolor

    Set the colour of a part of the Gantt chart. These colours hold for all items of that type.

    @@ -2003,7 +2045,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    string newcolor (in)

    The new colour for the chosen items.

    -
    $ganttchart font keyword newfont
    +
    $ganttchart font keyword newfont

    Set the font of a part of the Gantt chart. These fonts hold for all items of that type.

    @@ -2017,14 +2059,14 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    string newfont (in)

    The new font for the chosen items.

    -
    $ganttchart hscroll scrollbar
    +
    $ganttchart hscroll scrollbar

    Connect a horizontal scrollbar to the chart. See also the section on scrolling.

    widget scrollbar (in)

    The horizontal scrollbar that is to be connected to the chart

    -
    $ganttchart vscroll scrollbar
    +
    $ganttchart vscroll scrollbar

    Connect a vertical scrollbar to the chart. See also the section on scrolling.

    @@ -2034,7 +2076,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    For isometric plots (to be extended):

    -
    $isoplot plot rectangle x1 y1 x2 y2 colour
    +
    $isoplot plot rectangle x1 y1 x2 y2 colour

    Plot the outlines of a rectangle.

    float x1 (in)
    @@ -2048,7 +2090,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    color colour (in)

    The colour of the rectangle.

    -
    $isoplot plot filled-rectangle x1 y1 x2 y2 colour
    +
    $isoplot plot filled-rectangle x1 y1 x2 y2 colour

    Plot a rectangle filled with the given colour.

    float x1 (in)
    @@ -2062,7 +2104,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    color colour (in)

    The colour of the rectangle.

    -
    $isoplot plot circle xc yc radius colour
    +
    $isoplot plot circle xc yc radius colour

    Plot the outline of a circle.

    float xc (in)
    @@ -2072,7 +2114,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    color colour (in)

    The colour of the circle.

    -
    $isoplot plot filled-circle xc yc radius colour
    +
    $isoplot plot filled-circle xc yc radius colour

    Plot a circle filled with the given colour.

    float xc (in)
    @@ -2085,16 +2127,16 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    For tables you can use the following subcommands:

    -
    $table row items
    +
    $table row items

    Draw a single row of items. The appearance of the items can be controlled explicitly via the format command.

    list items (in)

    List of text items to be drawn, one per column

    -
    $table separator
    +
    $table separator

    Draw a horizontal line to separate two rows

    -
    $table formatcommand procname
    +
    $table formatcommand procname

    Set the procedure that controls the formatting of items. By default items are simply drawn as centered text.

    @@ -2105,7 +2147,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    Use the cellconfigure subcommand to set the attributes per cell.

    -
    $table cellconfigure args
    +
    $table cellconfigure args

    Set the attributes for the next cell(s) to be drawn.

    list args (in)
    @@ -2117,7 +2159,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    For ternary diagrams you can use the following subcommands:

    -
    $ternary plot series xcrd ycrd zcrd text dir
    +
    $ternary plot series xcrd ycrd zcrd text dir

    Draw a single data point with a label. The three coordinates are scaled so that a unique point in the triangle results. A label is drawn next to it.

    @@ -2134,7 +2176,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    string dir (in)

    Optional string indicating the direction in which to plot the label (e, n, etc.)

    -
    $ternary line series coords
    +
    $ternary line series coords

    Draw a continuous line based on the given coordinates (triplets).

    string series (in)
    @@ -2143,7 +2185,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    The coordinates of the points that determine the line (note that a point is defined by three coordinates).

    -
    $ternary fill series coords
    +
    $ternary fill series coords

    Draw a filled polygon based on the given coordinates (triplets).

    string series (in)
    @@ -2152,7 +2194,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    The coordinates of the points that determine the polygon (note that a point is defined by three coordinates).

    -
    $ternary text xtext ytext ztext
    +
    $ternary text xtext ytext ztext

    Draw text at the three corners of the diagram to identify the components.

    string xtext (in)
    @@ -2162,7 +2204,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    string ztext (in)

    Text to be plotted at the top corner

    -
    $ternary ticklines colour
    +
    $ternary ticklines colour

    Draw ticklines to facilitate reading off the diagram.

    string colour (in)
    @@ -2171,7 +2213,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    For status timeline plots you can use the following subcommands:

    -
    $timeline plot series item start stop color
    +
    $timeline plot series item start stop color

    Draw a bar in the given colour from start to stop for the item item. The item is a convenient label - there is no relation to the labels along the axis. The items are drawn from bottom to top.

    @@ -2185,7 +2227,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    string color (in)

    Colour to use for the bar. Defaults to black.

    -
    $timeline vertline text time args
    +
    $timeline vertline text time args

    Draw a vertical line to indicate a significant moment.

    string text (in)
    @@ -2205,7 +2247,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    coordinates to pixels and vice versa. These include:

    -
    ::Plotchart::viewPort w pxmin pymin pxmax pymax
    +
    ::Plotchart::viewPort w pxmin pymin pxmax pymax

    Set the viewport for window w. Should be used in cooperation with ::Plotchart::worldCoordinates.

    @@ -2221,7 +2263,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    float pymax (in)

    Bottom-most pixel coordinate.

    -
    ::Plotchart::worldCoordinates w xmin ymin xmax ymax
    +
    ::Plotchart::worldCoordinates w xmin ymin xmax ymax

    Set the extreme world coordinates for window w. The world coordinates need not be in ascending order (i.e. xmin can be larger than xmax, so that a reversal of the x-axis is achieved).

    @@ -2237,7 +2279,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    float ymax (in)

    Y-coordinate to be mapped to top side of viewport.

    -
    ::Plotchart::world3DCoordinates w xmin ymin zmin xmax ymax zmax
    +
    ::Plotchart::world3DCoordinates w xmin ymin zmin xmax ymax zmax

    Set the extreme three-dimensional world coordinates for window w. The world coordinates need not be in ascending order (i.e. xmin can be larger than xmax, so that a reversal of the x-axis is @@ -2258,7 +2300,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    float zmax (in)

    Z-coordinate to be mapped to top side of viewport.

    -
    ::Plotchart::coordsToPixel w x y
    +
    ::Plotchart::coordsToPixel w x y

    Return a list of pixel coordinates valid for the given window.

    widget w (in)
    @@ -2268,7 +2310,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    float y (in)

    Y-coordinate to be mapped.

    -
    ::Plotchart::coords3DToPixel w x y z
    +
    ::Plotchart::coords3DToPixel w x y z

    Return a list of pixel coordinates valid for the given window.

    widget w (in)
    @@ -2280,7 +2322,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    float y (in)

    Z-coordinate to be mapped.

    -
    ::Plotchart::polarCoordinates w radmax
    +
    ::Plotchart::polarCoordinates w radmax

    Set the extreme polar coordinates for window w. The angle always runs from 0 to 360 degrees and the radius starts at 0. Hence you only need to give the maximum radius. @@ -2293,7 +2335,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    float radmax (in)

    Maximum radius.

    -
    ::Plotchart::polarToPixel w rad phi
    +
    ::Plotchart::polarToPixel w rad phi

    Wrapper for a call to ::Plotchart::coordsToPixel. Note: This procedure has been deprecated - you should use the procedure ::Plotchart::coordsToPixel instead.

    @@ -2305,7 +2347,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    float phi (in)

    Angle to the positive x-axis.

    -
    ::Plotchart::pixelToCoords w x y
    +
    ::Plotchart::pixelToCoords w x y

    Return a list of world coordinates valid for the given window.

    widget w (in)
    @@ -2315,7 +2357,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    float y (in)

    Y-pixel to be mapped.

    -
    ::Plotchart::pixelToIndex w x y
    +
    ::Plotchart::pixelToIndex w x y

    Return the index of the pie segment containing the pixel coordinates (x,y)

    @@ -2331,7 +2373,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    Furthermore there is a routine to determine "pretty" numbers for use with an axis:

    -
    ::Plotchart::determineScale xmin xmax inverted
    +
    ::Plotchart::determineScale xmin xmax inverted

    Determine "pretty" numbers from the given range and return a list containing the minimum, maximum and stepsize that can be used for a (linear) axis.

    @@ -2344,7 +2386,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    Optional argument: if 1, then the returned list produces an inverted axis. Defaults to 0 (the axis will be from minimum to maximum)

    -
    ::Plotchart::determineScaleFromList values inverted
    +
    ::Plotchart::determineScaleFromList values inverted

    Determine "pretty" numbers from the given list of values and return a list containing the minimum, maximum and stepsize that can be used for a (linear) axis.

    @@ -2559,7 +2601,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    manner of options. The command eraseplot can be used to completely erase a plot or chart. The syntax of these commands is:

    -
    ::Plotchart::plotconfig charttype component property value
    +
    ::Plotchart::plotconfig charttype component property value

    Set a new value for the property of a component in a particular chart or plot type or query its current value. Changed properties only have effect for the consecutive plots, not for the ones already created. Each argument is optional.

    @@ -2587,7 +2629,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    Note, that in some cases an empty value is useful. Use "none" in this case - it can be useful for colours and for formats.

    -
    ::Plotchart::plotstyle subcmd style args
    +
    ::Plotchart::plotstyle subcmd style args

    Manipulate the style in which subsequent plots will be drawn. The default style is "default", but you can define and load any number of other styles.

    @@ -2701,7 +2743,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    innerwidth (for the width of lines separating columns and rows).

    -
    ::Plotchart::eraseplot anyplot
    +
    ::Plotchart::eraseplot anyplot

    Erase the plot/chart with all resources connected to it.

    string anyplot (in)
    @@ -2788,7 +2830,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    Most of the general methods for XY-plots work for these plots as well, but their creation and the methods to plot the data are very specific.

    -
    ::Plotchart::createTargetDiagram w limits scale
    +
    ::Plotchart::createTargetDiagram w limits scale

    Create a new target diagram with circles indicating specific limits. The x-axis represents the unbiased "root-mean-square difference" (typically varying between -1 and 1) and the y-axis represents the normalised bias.

    @@ -2802,7 +2844,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    Scale for the axes - defaults to 1, but if the model results are a poor fit, then that may be too small a value. Both axes are scaled in the same way.

    -
    $target plot series xvalues yvalues
    +
    $target plot series xvalues yvalues

    The plot method takes two series of data of the same length, the first one representing the model results, the second one represent the measurements or, more general, the data that need to be reproduced.

    @@ -2816,7 +2858,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    List of measured values (missing values are represented as empty strings; only if both the x and the y values are given, is the pair used in the computations)

    -
    ::Plotchart::createPerformanceProfile w max
    +
    ::Plotchart::createPerformanceProfile w max

    Create a diagram to show the performance of various numerical methods (or solvers). The idea is to first run these methods on a set of problems and measure their performance. The smaller the number the better. Then these methods are compared via a so-called performance profile: @@ -2828,7 +2870,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    float max (in)

    Maximum value for the x-axis (the x-axis is the scaled performance of the series).

    -
    $performance plot series_and_data_pairs
    +
    $performance plot series_and_data_pairs

    Plot the data for each given method. The data are identified by the series name and the appearance is controlled via prior dataconfig subcommand.

    @@ -2839,7 +2881,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    The command plotmethod can be used to add new methods for a particular plot or chart type. It is intended to help you develop specialised graphical displays.

    -
    ::Plotchart::plotmethod charttype methodname plotproc
    +
    ::Plotchart::plotmethod charttype methodname plotproc

    Adds a new method for the given plot or chart type. The method is implemented by the command or procedure given in the plotproc argument. The procedure will be called with two extra arguments, the name of the created plot and the canvas widget that contains @@ -2939,7 +2981,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    Note: the command simply takes a snapshot of the plots/charts as they are at that moment.

    -
    ::Plotchart::plotpack w dir args
    +
    ::Plotchart::plotpack w dir args

    Copy the contents of the plots/charts into another widget, in a manner similar to the pack geometry manager.

    @@ -3015,7 +3057,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    you can use the tags on the various canvas elements to define other bindings.

    The bindplot and bindlast are defined as follows:

    -
    $anyplot bindplot event command args
    +
    $anyplot bindplot event command args

    Register a command that will be run whenever the given event occurs in the plot.

    string event
    @@ -3029,7 +3071,7 @@

    Plotchart(n) 2.3.5 tklib "Plotchart"

    assuming the argument "command" is: {cmd A B C}

    -
    $anyplot bindlast series event command
    +
    $anyplot bindlast series event command

    Register a command that will be run when the event occurs within the neighbourhood of the last point added to the given series. (You can use directly after inserting a data point. All such commands will remain active).

    diff --git a/embedded/www/tklib/files/modules/swaplist/swaplist.html b/embedded/www/tklib/files/modules/swaplist/swaplist.html index 8cc381dd..5d963b2c 100644 --- a/embedded/www/tklib/files/modules/swaplist/swaplist.html +++ b/embedded/www/tklib/files/modules/swaplist/swaplist.html @@ -186,7 +186,7 @@

    swaplist(n) 0.1 tklib "A dialog which allows a user to mo package and/or documentation.

    Category

    Widget

    diff --git a/embedded/www/tklib/files/modules/tkpiechart/canvaslabel.html b/embedded/www/tklib/files/modules/tkpiechart/canvaslabel.html index 51808435..a40f6fef 100644 --- a/embedded/www/tklib/files/modules/tkpiechart/canvaslabel.html +++ b/embedded/www/tklib/files/modules/tkpiechart/canvaslabel.html @@ -158,25 +158,25 @@

    canvasLabel(n) 6.6 tklib "canvasLabel class"

    OPTIONS

    -anchor value
    -

    Specifies the anchor position of the rectangle and the text, relative to the positioning point. The behavior is similar to the -anchor option of the canvas text item, except that the rectangle is taken into account. The default is center.

    +

    Specifies the anchor position of the rectangle and the text, relative to the positioning point. The behavior is similar to the -anchor option of the canvas text item, except that the rectangle is taken into account. The default is center.

    -background color
    -

    Specifies the background color of the bullet rectangle, as in the -fill option of the canvas rectangle item. The default is transparent (empty string).

    +

    Specifies the background color of the bullet rectangle, as in the -fill option of the canvas rectangle item. The default is transparent (empty string).

    -bordercolor color
    -

    Specifies the border color of the rectangle, as in the -outline option of the canvas rectangle item. The default is black.

    +

    Specifies the border color of the rectangle, as in the -outline option of the canvas rectangle item. The default is black.

    -borderwidth value
    -

    Specifies the border width of the rectangle, as in the -width option of the canvas rectangle item. By default, the width is 1 pixel, which is the minimum width.

    +

    Specifies the border width of the rectangle, as in the -width option of the canvas rectangle item. By default, the width is 1 pixel, which is the minimum width.

    -bulletwidth value

    Specifies the width of the rectangle placed to the left of the text. Defaults to 10.

    -font value
    -

    Specifies the font of the text, as in the -font option of the canvas text item. The default is system dependent.

    +

    Specifies the font of the text, as in the -font option of the canvas text item. The default is system dependent.

    -foreground color
    -

    Specifies the color of the text, as in the -fill option of the canvas text item. The default is black.

    +

    Specifies the color of the text, as in the -fill option of the canvas text item. The default is black.

    -justify value
    -

    Specifies how to justify the text, as in the -justify option of the canvas text item. The default is left.

    +

    Specifies how to justify the text, as in the -justify option of the canvas text item. The default is left.

    -minimumwidth value

    The total label width will not go below the specified value, but may be larger if the label text requires it.

    -padding value
    -

    Specifies how much space to leave between the text and the closest rectangle edge. Units are identical to those specified in the canvas COORDINATES manual section.

    +

    Specifies how much space to leave between the text and the closest rectangle edge. Units are identical to those specified in the canvas COORDINATES manual section.

    -scale list

    List of 2 floating point numbers used to set the scaling factor in the x and y axis. Scaling is applied immediately and defaults to 1.

    -select boolean
    @@ -184,17 +184,17 @@

    canvasLabel(n) 6.6 tklib "canvasLabel class"

    -selectrelief value

    Either flat, raised or sunken. Specifies the 3D effect desired for the text area when the label is selected.

    -stipple bitmap
    -

    Specifies the stipple pattern filling the rectangle, as in the -stipple option of the canvas rectangle item. There is no bitmap by default.

    +

    Specifies the stipple pattern filling the rectangle, as in the -stipple option of the canvas rectangle item. There is no bitmap by default.

    -text text
    -

    Specifies the string to be displayed in the text area, as in the -text option of the canvas text item. The default is an empty string.

    +

    Specifies the string to be displayed in the text area, as in the -text option of the canvas text item. The default is an empty string.

    -textbackground color

    Specifies the color of the text area background.

    -width value
    -

    Specifies a maximum line length for the text, as in the -width option of the canvas text item. The default is 0.

    +

    Specifies a maximum line length for the text, as in the -width option of the canvas text item. The default is 0.

    TAGS

    -

    The labeler has the following specific tag (see the canvas manual page ITEM IDS AND TAGS section for more information):

    +

    The labeler has the following specific tag (see the canvas manual page ITEM IDS AND TAGS section for more information):

    Description

    A pie object is used to visualize a set of values, usually as shares of a total. Each value is represented by a colored slice, which may have a 2 dimensional or 3 dimensional look. Each slice is associated with a label displaying the data name, and a numerical field showing the percentage taken by the slice. The labels are placed by the chosen labeler object (-labeler option). Each label color matches its related slice.

    -

    A pie chart is made of Tk canvas items, found in pieBoxLabeler, piePeripheralLabeler and canvasLabel objects, that compose the pie object. The pie constructor creates the pie itself and its background slice within the parent canvas. Once the pie object exists, slices can be created and resized. At the time the pie is created, the parent Tk canvas widget must exist.

    +

    A pie chart is made of Tk canvas items, found in pieBoxLabeler, piePeripheralLabeler and canvasLabel objects, that compose the pie object. The pie constructor creates the pie itself and its background slice within the parent canvas. Once the pie object exists, slices can be created and resized. At the time the pie is created, the parent Tk canvas widget must exist.

    Slice colors are automatically generated, using a default color list for all pies, unless another list is used (using the -colors option). When a 3D look is used, the slice edge is darker than its top while using the same color tone.

    stooop::new pie canvas x y ?options?
    @@ -176,7 +176,7 @@

    pie(n) 6.6 tklib "tkpiechart pie class"

    -colors list

    Specifies a list of colors for slices. In this case, the slice colors will successively be drawn from the list in the list order, cycling through if there are more slices than colors in the list. Colors are specified in the same format as the -background option.

    -height value
    -

    Specifies the total height for the pie, including the room taken by the labeler labels. The pie slices are resized when labels are added or deleted (when adding or deleting slices) so that the total height remains constant. This value may be specified in any of the forms described in the canvas COORDINATES manual section.

    +

    Specifies the total height for the pie, including the room taken by the labeler labels. The pie slices are resized when labels are added or deleted (when adding or deleting slices) so that the total height remains constant. This value may be specified in any of the forms described in the canvas COORDINATES manual section.

    -labeler object

    Specifies a placer object for the slice labels, so that, for example, slice values may be placed next to them. If not specified, the pieBoxLabeler (see corresponding manual) is used, the other option being the piePeripheralLabeler class. Each labeler has a specific behavior which may be set via its options. The labeler object is automatically deleted when the pie object is itself deleted. The labeler cannot be changed once the pie is created.

    -selectable boolean
    @@ -190,7 +190,7 @@

    pie(n) 6.6 tklib "tkpiechart pie class"

    -thickness value

    The thickness is set to 0 by default, giving the pie a simple 2D shape, much faster to display. A positive thickness value will give the pie a 3D look with matched darker colors for the slices edges. These values may be specified in any of the forms described in the SIZES section below.

    -width value
    -

    Specifies the total width for the pie, including the room taken by the labeler labels. The pie slices are resized when labels are added or deleted (when adding or deleting slices) so that the total width remains constant. This value may be specified in any of the forms described in the canvas COORDINATES manual section.

    +

    Specifies the total width for the pie, including the room taken by the labeler labels. The pie slices are resized when labels are added or deleted (when adding or deleting slices) so that the total width remains constant. This value may be specified in any of the forms described in the canvas COORDINATES manual section.

    MEMBER PROCEDURES

    @@ -216,10 +216,10 @@

    pie(n) 6.6 tklib "tkpiechart pie class"

  • pieSlices(pieObject)

  • slice(sliceObject)

  • -

    For example, the whole pie can be moved using the canvas move command on the pie tag, or bindings on slices can be set using the slice tags (see the canvas manual page ITEM IDS AND TAGS section for more information).

    +

    For example, the whole pie can be moved using the canvas move command on the pie tag, or bindings on slices can be set using the slice tags (see the canvas manual page ITEM IDS AND TAGS section for more information).

    SIZES

    -

    All sizes related to pies are stored as floating point numbers. The coordinates and sizes are specified in screen units, which are floating point numbers optionally followed by one of several letters as specified in the canvas COORDINATES manual section.

    +

    All sizes related to pies are stored as floating point numbers. The coordinates and sizes are specified in screen units, which are floating point numbers optionally followed by one of several letters as specified in the canvas COORDINATES manual section.

    LIMITATIONS

    If the number of slices is too big, identical colors will be used for some of the slices. You may set your own colors in this case.

    @@ -236,7 +236,7 @@

    pie(n) 6.6 tklib "tkpiechart pie class"

    canvasLabel, pieBoxLabeler, piePeripheralLabeler

    TAGS

    -

    The labeler has the following specific tag (see the canvas manual page ITEM IDS AND TAGS section for more information):

    +

    The labeler has the following specific tag (see the canvas manual page ITEM IDS AND TAGS section for more information):

    TAGS

    -

    The labeler has the following specific tag (see the canvas manual page ITEM IDS AND TAGS section for more information):

    +

    The labeler has the following specific tag (see the canvas manual page ITEM IDS AND TAGS section for more information):

    • piePeripheralLabeler(piePeripheralLabelerObject)

    • @@ -180,7 +180,7 @@

      piePeripheralLabeler(n) 6.6 tklib "piePeripheralLabeler c

      canvasLabel, pie, pieBoxLabeler

    Category

    Widget

    diff --git a/embedded/www/tklib/files/modules/widget/widget_calendar.html b/embedded/www/tklib/files/modules/widget/widget_calendar.html index df7b7848..7ac5d98a 100644 --- a/embedded/www/tklib/files/modules/widget/widget_calendar.html +++ b/embedded/www/tklib/files/modules/widget/widget_calendar.html @@ -212,7 +212,7 @@

    widget_calendar(n) 1.0.1 tklib "Various megawidgets" package and/or documentation.

    Category

    Widget

    diff --git a/embedded/www/tklib/files/modules/widget/widget_dateentry.html b/embedded/www/tklib/files/modules/widget/widget_dateentry.html index 97adc078..c83b475a 100644 --- a/embedded/www/tklib/files/modules/widget/widget_dateentry.html +++ b/embedded/www/tklib/files/modules/widget/widget_dateentry.html @@ -200,7 +200,7 @@

    widget_dateentry(n) 0.96 tklib "Various megawidgets" package and/or documentation.

    Category

    Widget

    diff --git a/embedded/www/tklib/files/modules/widget/widget_toolbar.html b/embedded/www/tklib/files/modules/widget/widget_toolbar.html index 646c6a5d..893efa4d 100644 --- a/embedded/www/tklib/files/modules/widget/widget_toolbar.html +++ b/embedded/www/tklib/files/modules/widget/widget_toolbar.html @@ -206,7 +206,7 @@

    widget_toolbar(n) 3.0 tklib "Various megawidgets"

    Category

    Widget

    diff --git a/embedded/www/tklib/files/modules/widgetPlus/widgetPlus.html b/embedded/www/tklib/files/modules/widgetPlus/widgetPlus.html new file mode 100644 index 00000000..6f998675 --- /dev/null +++ b/embedded/www/tklib/files/modules/widgetPlus/widgetPlus.html @@ -0,0 +1,407 @@ + + +widgetPlus - Enhanced Entry, Spinbox, and Combobox Widgets with Undo/Redo and other useful features + + + + +
    +
    [ + Tklib Home +| Main Table Of Contents +| Table Of Contents +| Keyword Index +| Categories +| Modules +| Applications + ]
    +

    widgetPlus(n) 1.0 tklib "Enhanced Entry, Spinbox, and Combobox Widgets with Undo/Redo and other useful features"

    +

    Name

    +

    widgetPlus - Enhanced Entry, Spinbox, and Combobox Widgets with Undo/Redo and other useful features

    +
    + + +

    Description

    +

    The widgetPlus package adds new features to the widgets entry, spinbox, ttk::entry, ttk::spinbox, and ttk::combobox.

    +

    The new features are Undo and Redo operations, a <<Selection>> event, and for the Tk (unthemed) widgets an -inactiveselectbackground option, and some minor fixes to bindings. The new facilities closely follow those of the text widget.

    +

    The revised entry, spinbox, ttk::entry, ttk::spinbox, and ttk::combobox widgets are created by the commands widgetPlus::entryPlus, widgetPlus::spinboxPlus, widgetPlus::ttkEntryPlus, widgetPlus::ttkSpinboxPlus, and widgetPlus::ttkComboboxPlus respectively.

    +

    For example, the widgetPlus::entryPlus widget is implemented as a Snit snit::widgetadaptor that wraps a Tk entry widget. Its winfo class is Entry, and it uses a binding tag EntryPlus that replaces the Entry binding tag. The other widgets are implemented in a similar way.

    +

    The package uses the namespace ::widgetPlus, which exports (only) the five commands defined below that begin with a lower-case letter (EnableBWidget is not exported). These commands can be imported into the global namespace, and for simplicity, descriptive text in this manual will henceforth omit the namespace qualifier.

    +
    +namespace import ::widgetPlus::*
    +
    +
    +

    WIDGET OPTIONS

    +

    In addition to the usual options of the entry, spinbox, ttk::entry, ttk::spinbox, and ttk::combobox widgets, the wrappers entryPlus, spinboxPlus, ttkEntryPlus, ttkSpinboxPlus, and ttkComboboxPlus provide the options below.

    +
    +
    Command-Line Switch: -inactiveselectbackground
    +Database Name: inactiveSelectBackground
    +Database Class: Foreground
    +
    +

    Specifies the color to use for the selection when the window does not have the input focus. If empty, {}, then no selection is shown when the window does not have the focus. The -inactiveselectbackground option has no effect on the Ttk (themed) widgets ttkEntryPlus, ttkSpinboxPlus, and ttkComboboxPlus.

    +
    Command-Line Switch: -maxundo
    +Database Name: maxUndo
    +Database Class: MaxUndo
    +
    +

    Specifies the maximum number of compound undo actions on the undo stack. A zero or a negative value imply an unlimited undo stack.

    +
    Command-Line Switch: -undo
    +Database Name: undo
    +Database Class: Undo
    +
    +

    Specifies a boolean that says whether the undo mechanism is active or not.

    +
    +
    +

    COMMANDS

    +
    +
    widgetPlus::entryPlus ?create? pathName
    +

    Create an entryPlus widget; or convert an existing entry widget into an entryPlus.

    +
    widgetPlus::spinboxPlus ?create? pathName
    +

    Create a spinboxPlus widget; or convert an existing spinbox widget into a spinboxPlus.

    +
    widgetPlus::ttkEntryPlus ?create? pathName
    +

    Create a ttkEntryPlus widget; or convert an existing ttk::entry widget into a ttkEntryPlus.

    +
    widgetPlus::ttkSpinboxPlus ?create? pathName
    +

    Create a ttkSpinboxPlus widget; or convert an existing ttk::spinbox widget into a ttkSpinboxPlus.

    +
    widgetPlus::ttkComboboxPlus ?create? pathName
    +

    Create a ttkComboboxPlus widget; or convert an existing ttk::combobox widget into a ttkComboboxPlus.

    +
    widgetPlus::EnableBWidget
    +

    Enable widgetPlus to modify BWidget Entry widgets and their compounds (such as the BWidget ComboBox). The command creates a bindtag BwEntryPlus to replace the default bindtag BwEntry. This operation is not performed when the package is loaded because it requires BWidget to be loaded first. This command is not exported from namespace ::widgetPlus.

    +
    +
    +

    WIDGET COMMANDS

    +

    In addition to the usual commands of the entry, spinbox, ttk::entry, ttk::spinbox, and ttk::combobox widgets, the wrappers entryPlus, ttkEntryPlus, spinboxPlus, ttkSpinboxPlus, and ttkComboboxPlus provide:

    +
    +
    pathName edit ?arg arg ...?
    +

    This command controls the undo mechanism and the modified flag. The exact behavior of the command depends on the option argument that follows the edit argument. The following forms of the command are currently supported:

    +
    pathName edit canredo
    +

    Returns a boolean true if redo is possible, i.e. when the redo stack is not empty. Otherwise returns false.

    +
    pathName edit canundo
    +

    Returns a boolean true if undo is possible, i.e. when the undo stack is not empty. Otherwise returns false.

    +
    pathName edit modified ?boolean?
    +

    If boolean is not specified, returns the modified flag of the widget. The insert, delete, edit undo and edit redo commands, or (by using this command) the user, can set or clear the modified flag. If boolean is specified, sets the modified flag of the widget to boolean.

    +
    pathName edit redo
    +

    When the -undo option is true, reapplies the last undone edits provided no other edits were done since then. Generates an error when the redo stack is empty. Does nothing when the -undo option is false.

    +
    pathName edit reset
    +

    Clears the undo stack and redo stack.

    +
    pathName edit separator
    +

    Included for completeness, but has no effect.

    +

    (N.B. An implicit separator is added to the undo stack for each call to a widget command (e.g. insert or delete) that changes the widget contents. These therefore separate the addition or removal of individual characters by typing, except that cut or paste operations are discrete.)

    +
    pathName edit undo
    +

    Undoes the last edit action when the -undo option is true. An edit action is defined as a single insert or delete command that is recorded on the undo stack. Generates an error when the undo stack is empty. Does nothing when the -undo option is false.

    +
    +
    +

    BINDINGS

    +

    Class Bindings

    +

    The class binding tag for different widgets has these default values:

    +
      +
    • entry uses Entry

    • +
    • spinbox uses Spinbox

    • +
    • ttk::entry uses TEntry

    • +
    • ttk::spinbox uses TSpinbox

    • +
    • ttk::combobox uses TCombobox

    • +
    • entryPlus uses EntryPlus

    • +
    • spinboxPlus uses SpinboxPlus

    • +
    • ttkEntryPlus uses TEntryPlus

    • +
    • ttkSpinboxPlus uses TSpinboxPlus

    • +
    • ttkComboboxPlus uses TComboboxPlus

    • +
    +
    +

    Undo and Redo

    +

    The <<Undo>> and <<Redo>> virtual events are mapped to these keyboard events:

    +
      +
    • On X11 systems (Linux®, BSD®, Solaris®, etc):

      +
        +
      • <<Undo>> is mapped to <Control-z>

      • +
      +
        +
      • <<Redo>> is mapped to <Control-Shift-z>

      • +
      +
    • +
    • On Windows® systems:

      +
        +
      • <<Undo>> is mapped to <Control-z>

      • +
      +
        +
      • <<Redo>> is mapped to <Control-y>

      • +
      +
    • +
    • On Aqua® systems (i.e. Apple® macOS® or OS X®):

      +
        +
      • <<Undo>> is mapped to <Command-z>

      • +
      +
        +
      • <<Redo>> is mapped to <Command-Shift-z>

      • +
      +
    • +
    +
    +

    EntryPlus

    +

    The EntryPlus bindings are based on those of the Entry bindtag, with these changes:

    +
      +
    • New bindings to <<Undo>> and <<Redo>>.

    • +
    • An adjustment to the <<Paste>> binding, so that it behaves the same way on X11 as on other windowing systems (i.e. it deletes the existing selection, if any exists).

    • +
    • The removal of the antiquated <Insert> binding.

    • +
    • New bindings to <FocusIn> and <FocusOut>, to facilitate the implementation of the -inactiveselectbackground option.

    • +
    +
    +

    SpinboxPlus

    +

    The SpinboxPlus bindings are based on those of the Spinbox bindtag, with the same changes as are made when converting Entry to EntryPlus.

    +
    +

    TEntryPlus

    +

    The TEntryPlus bindings are based on those of the TEntry bindtag, with these changes:

    +
      +
    • New bindings to <<Undo>> and <<Redo>>.

    • +
    +
    +

    TSpinboxPlus

    +

    The TSpinboxPlus bindings are based on those of the TSpinbox bindtag, with these changes:

    +
      +
    • New bindings to <<Undo>> and <<Redo>>.

    • +
    +
    +

    TComboboxPlus

    +

    The TComboboxPlus bindings are based on those of the TCombobox bindtag, with these changes:

    +
      +
    • New bindings to <<Undo>> and <<Redo>>.

    • +
    +
    +
    +

    VIRTUAL EVENT <<Selection>>

    +

    Each widgetPlus widget generates a virtual event <<Selection>> whenever the value of its selection changes. This allows other Tcl code, for example the package persistentSelection, to monitor the selection in these widgets.

    +
    +

    USE WITH MEGAWIDGETS

    +

    When an entry, spinbox, ttk::entry, ttk::spinbox, or ttk::combobox is a component of a megawidget, it is often possible to apply widgetPlus to that component without modifying the megawidget code.

    +

    combobox (by Bryan Oakley)

    +

    A combobox with path $w includes an entry widget $w.entry, which uses the Entry binding tag. Thus widgetPlus can be applied to the combobox after creation, using the command (see EXAMPLES)

    +
    +entryPlus $w.entry -undo 1 -maxundo 0
    +
    +
    +

    ComboBox (BWidget)

    +

    A BWidget ComboBox with path $w includes an entry widget $w.e, which uses the BwEntry binding tag in place of the default tag Entry.

    +

    Package widgetPlus provides a replacement bindtag BwEntryPlus, but this is not computed when the package is loaded because it requires BWidget to be loaded first. The command ::widgetPlus::EnableBWidget must be called to provide BwEntryPlus, and then the BWidget ComboBox can be modified (see EXAMPLES)

    +
    +::widgetPlus::EnableBWidget
    +entryPlus $w.e -undo 1 -maxundo 0
    +
    +
    +
    +

    TO DO

    +
      +
    • Undo and Redo do not sync the value of the modified flag - they always set the value to boolean true.

    • +
    • Undo and Redo do not sync the position of the insertion cursor.

    • +
    • The <<Modified>> event is not generated.

    • +
    • Undo/Redo separators, and the -autoseparators option, as found in the text widget, are not implemented. An implicit separator is added for each call to a widget command (e.g. insert or delete) that changes the widget contents. The edit separator command has no effect. Separator functionality would be less useful for widgets such as entryPlus than it is for a text widget.

    • +
    • Add an overwrite mode, toggled by <Insert> on non-macOS® systems.

    • +
    +
    +

    BUGS

    +

    This version of widgetPlus is intended to be compatible with all releases of Tk 8.5 and 8.6, and with the branches core-8-5-branch, core-8-6-branch, and trunk in the source code repository for Tk. Any incompatibility with any of these versions, for any Tk windowing system, should be reported as a bug. Please report such in the category widgetPlus of the Tklib Trackers.

    +
    +

    EXAMPLES

    +

    To create and map an entryPlus widget .ep with an unlimited Undo/Redo stack:

    +
    +package require widgetPlus
    +widgetPlus::entryPlus .ep -undo 1 -maxundo 0
    +pack .ep
    +
    +

    The same but using namespace import:

    +
    +package require widgetPlus
    +namespace import widgetPlus::*
    +entryPlus .ep -undo 1 -maxundo 0
    +pack .ep
    +
    +

    To convert an existing entry widget .ee into an entryPlus with an unlimited Undo/Redo stack:

    +
    +entry .ee
    +    .
    +    .
    +    .
    +package require widgetPlus
    +widgetPlus::entryPlus .ee -undo 1 -maxundo 0
    +
    +

    The same but using namespace import:

    +
    +entry .ee
    +    .
    +    .
    +    .
    +package require widgetPlus
    +namespace import widgetPlus::*
    +entryPlus .ee -undo 1 -maxundo 0
    +
    +

    Apply widgetPlus to a Bryan Oakley combobox:

    +
    +package require combobox
    +combobox::combobox .cb
    +    .
    +    .
    +    .
    +package require widgetPlus
    +namespace import widgetPlus::*
    +entryPlus .cb.entry -undo 1 -maxundo 0
    +
    +

    Apply widgetPlus to a BWidget ComboBox. The command ::widgetPlus::EnableBWidget must be called first.

    +
    +package require BWidget
    +ComboBox .cb
    +    .
    +    .
    +    .
    +package require widgetPlus
    +::widgetPlus::EnableBWidget
    +namespace import widgetPlus::*
    +entryPlus .cb.e -undo 1 -maxundo 0
    +
    +
    +

    See Also

    +

    BWidget, ComboBox, Entry, entry, persistentSelection, spinbox, text, ttk::combobox, ttk::entry, ttk::spinbox

    +
    +
    diff --git a/embedded/www/tklib/files/modules/widgetl/widget_listentry.html b/embedded/www/tklib/files/modules/widgetl/widget_listentry.html index 8308cb79..e6895b7a 100644 --- a/embedded/www/tklib/files/modules/widgetl/widget_listentry.html +++ b/embedded/www/tklib/files/modules/widgetl/widget_listentry.html @@ -384,6 +384,6 @@

    widget_listentry(n) 0.1 tklib "widget::listentry widget&q package and/or documentation.

    diff --git a/embedded/www/tklib/files/modules/widgetl/widget_listsimple.html b/embedded/www/tklib/files/modules/widgetl/widget_listsimple.html index 50eb421e..fb67cf13 100644 --- a/embedded/www/tklib/files/modules/widgetl/widget_listsimple.html +++ b/embedded/www/tklib/files/modules/widgetl/widget_listsimple.html @@ -311,6 +311,6 @@

    widget_listsimple(n) 0.1 tklib "widget::listsimple widget package and/or documentation.

    diff --git a/embedded/www/tklib/files/modules/widgetv/widget_validator.html b/embedded/www/tklib/files/modules/widgetv/widget_validator.html index 99ada425..34cb6644 100644 --- a/embedded/www/tklib/files/modules/widgetv/widget_validator.html +++ b/embedded/www/tklib/files/modules/widgetv/widget_validator.html @@ -230,6 +230,6 @@

    widget_validator(n) 0.1 tklib "widget::validator behaviou package and/or documentation.

    diff --git a/embedded/www/tklib/toc.html b/embedded/www/tklib/toc.html index 2f02a1c8..36c3deea 100644 --- a/embedded/www/tklib/toc.html +++ b/embedded/www/tklib/toc.html @@ -17,141 +17,149 @@

    Table Of Contents


    tklib

    number Specifies the item as a numerical index, where 0 - corresponds to the first item in the tablelist.
    knumberSpecifies the item by its full key, composed of the letter + Specifies the item by its full key, composed of the prefix k and the sequence number associated with the item.  You can use the getkeys widget command to get this sequence @@ -6733,22 +7289,23 @@

    Detailed Reference

    topIndicates the topmost item visible in the tablelist window.Indicates the topmost body item visible in the tablelist + window.
    bottomIndicates the bottommost item visible in the tablelist + Indicates the bottommost body item visible in the tablelist window.
    @x,yIndicates the item that covers the point in the tablelist window - specified by x and y (in - pixel coordinates).  If no item covers that point, then the + Indicates the body item that covers the point in the tablelist + window specified by x and y + (in pixel coordinates).  If no item covers that point, then the closest item to that point is used.  The coordinates x and y are expected to be relative to the tablelist window itself (not its body @@ -6769,8 +7326,8 @@

    Detailed Reference

    In the widget command descriptions below, arguments named - index, first, - last, sourceIndex, and + index, firstIndex, + lastIndex, sourceIndex, and targetIndex always contain row indices in one of the above forms.
    @@ -6889,7 +7446,7 @@

    Detailed Reference

    Many of the widget commands for tablelist widgets take one or more cell indices as arguments.  A cell index specifies a particular cell of the - tablelist, in any of the following ways:
    + tablelist's body component, in any of the following ways:
    @@ -6946,10 +7503,10 @@

    Detailed Reference

    - @@ -6962,6 +7519,147 @@

    Detailed Reference

    lastCell always contain cell indices in one of the above forms. +
    HEADER ROW INDICES
    + +
    Many of the subcommands of the header tablelist widget command take one or more + header row indices as arguments.  A header row index specifies a + particular item of the tablelist's header component, in any of the + following ways:
    + +
    +
    @x,yIndicates the cell that covers the point in the tablelist window - specified by x and y (in - pixel coordinates).  If no cell covers that point, then the - closest cell to that point is used.  The coordinates + Indicates the body cell that covers the point in the tablelist + window specified by x and y + (in pixel coordinates).  If no body cell covers that point, then + the closest body cell to that point is used.  The coordinates x and y are expected to be relative to the tablelist window itself (not its body component).
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    numberSpecifies the header item as a numerical index, where + 0 corresponds to the first item in the tablelist's + header.
    hknumberSpecifies the header item by its full key, composed of the prefix + hk and the sequence number associated with the + item.  You can use the  header getkeys  widget command to + get this sequence number, or the  header getfullkeys  widget + command to retrieve the full key.  In addition, the  + header insert  + and  header + insertlist  subcommands return the list of full + keys associated with the header items just inserted.
    endIndicates the end of the tablelist's header.  For most + commands this refers to the last item in the header component, but + for a few commands such as  header + indexheader + insert,  and  header insertlist  it refers to + the header item just after the last one.
    lastIndicates the last header item of the tablelist.
    @x,yIndicates the header item that covers the point in the tablelist + window specified by x and y + (in pixel coordinates).  If no header item covers that point, + then the closest header item to that point is used.  The + coordinates x and y are + expected to be relative to the tablelist window itself (not its + header component).
    nameSpecifies the header row by the value of its -name configuration option.  + name must be different from all the above header + row indices, and should be unique (if several header rows have the + same name then this value is considered to indicate the first + matching header row).
    +
    + +
    In the widget command descriptions below, arguments named + headerIndex, firstHeaderIndex, and + lastHeaderIndex always contain header row indices in + one of the above forms.
    + +
    HEADER CELL INDICES
    + +
    Many of the subcommands of the header tablelist widget command take one or more + header cell indices as arguments.  A header cell index specifies a + particular cell of the tablelist's header component, in any of the + following ways:
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    headerRow,colIndicates the cell having the header row index + headerRow and column index + colheaderRow may be a + number, a full key (of the form hknumber), + end (where the latter indicates the last header + row in the tablelist), last, or a header row + name.  col may be a number, + active, anchor, + end, last, + left, right, or a column + name.
    endIndicates the last cell in the last row of the tablelist's + header.
    lastIndicates the last cell in the last row of the tablelist's header + (same as end).
    @x,yIndicates the header cell that covers the point in the tablelist + window specified by x and y + (in pixel coordinates).  If no header cell covers that point, + then the closest header cell to that point is used.  The + coordinates x and y are + expected to be relative to the tablelist window itself (not its body + component).
    +
    + +
    In the widget command descriptions below, arguments named + headerCellIndex, firstHeaderCell, + and lastHeaderCell always contain header cell indices + in one of the above forms.
    +
    WIDGET COMMAND
    @@ -7119,11 +7817,11 @@

    Detailed Reference

    pathName cancelediting
    -
    This subcommand cancels the interactive editing of the contents of +
    This subcommand cancels the interactive editing of the content of the cell whose index was passed to the editcell subcommand, destroys the temporary widget embedded into the cell, and restores the original cell - contents.  This command enables you to cancel the interactive cell + content.  This command enables you to cancel the interactive cell editing from within the Tcl command specified by the -editstartcommand configuration option if that pre-edit callback encounters an error when preparing the @@ -7133,7 +7831,7 @@

    Detailed Reference

    Immediately before returning this value, the command generates the virtual event <<TablelistCellRestored>>.  For Tk - versions 8.5 or higher, this virtual event is generated with its + versions 8.5 and higher, this virtual event is generated with its -data option set to a list consisting of the numerical row and column indices of the cell whose content is being edited.  If no cell was being edited when the command was invoked @@ -7202,8 +7900,8 @@

    Detailed Reference

    specified, then the command modifies the given cell option(s) to have the given value(s); in this case the return value is an empty string.  option may have any of the values - described in the CELL CONFIGURATION OPTIONS - section.
    + described in the CELL CONFIGURATION OPTIONS IN + THE TABLELIST BODY section.
    pathName cellindex cellIndex
    @@ -7216,14 +7914,14 @@

    Detailed Reference

    pathName cellselection option args
    -
    This command is used to adjust the cell selection within a - tablelist widget.  It has several forms, depending on +
    This command is used to adjust the cell selection within the body + of a tablelist widget.  It has several forms, depending on option:
    -
    pathName cellselection - anchor cellIndex
    +
    pathName cellselection anchor + cellIndex
    Sets the cell selection anchor to the element given by cellIndex.  If @@ -7236,9 +7934,9 @@

    Detailed Reference

    anchor may be used to refer to the anchor element.
    -
    pathName cellselection - clear firstCell lastCell
    - pathName cellselection clear +
    pathName cellselection clear + firstCell lastCell
    + pathName cellselection clear cellIndexList
    If any of the elements between firstCell @@ -7250,16 +7948,16 @@

    Detailed Reference

    different from those specified by the cell index list given in its second form.
    -
    pathName cellselection - includes cellIndex
    +
    pathName cellselection includes + cellIndex
    Returns 1 if the element indicated by cellIndex is currently selected, 0 if it isn't.
    -
    pathName cellselection - set firstCell lastCell
    - pathName cellselection set +
    pathName cellselection set + firstCell lastCell
    + pathName cellselection set cellIndexList
    Selects all of the selectable elements in the range @@ -7331,8 +8029,8 @@

    Detailed Reference

    Before hiding the descendants of a row, the command specified as the value of the -collapsecommand option (if any) is - automatically concatenated with the name of the tablelist widget and - the row index, and the resulting script is evaluated in the global + automatically concatenated with the path name of the tablelist widget + and the row index, and the resulting script is evaluated in the global scope.
    For technical reasons (the use of the @@ -7360,8 +8058,8 @@

    Detailed Reference

    Before hiding the descendants of a row, the command specified as the value of the -collapsecommand option (if any) is - automatically concatenated with the name of the tablelist widget and - the row index, and the resulting script is evaluated in the global + automatically concatenated with the path name of the tablelist widget + and the row index, and the resulting script is evaluated in the global scope.
    For technical reasons (the use of the @@ -7475,8 +8173,9 @@

    Detailed Reference

    where each option may have any of the values - described in the CELL CONFIGURATION OPTIONS - section.  The return value is an empty string.
    + described in the CELL CONFIGURATION OPTIONS IN + THE TABLELIST BODY section.  The return value is an empty + string.
    This command has the same effect as @@ -7499,8 +8198,8 @@

    Detailed Reference

    and value, the command modifies the given option of the given cell to have the given value.  Each option may have any of the values described in the - CELL CONFIGURATION OPTIONS section.  - The return value is an empty string.
    + CELL CONFIGURATION OPTIONS IN THE TABLELIST + BODY section.  The return value is an empty string.
    pathName configcolumnlist columnConfigSpecList
    @@ -7564,8 +8263,9 @@

    Detailed Reference

    where each option may have any of the values - described in the ROW CONFIGURATION OPTIONS - section.  The return value is an empty string.
    + described in the ROW CONFIGURATION OPTIONS IN + THE TABLELIST BODY section.  The return value is an empty + string.
    This command has the same effect as @@ -7588,8 +8288,8 @@

    Detailed Reference

    value, the command modifies the given option of the given row to have the given value.  Each option may have any of the values described in the - ROW CONFIGURATION OPTIONS section.  The - return value is an empty string.
    + ROW CONFIGURATION OPTIONS IN THE TABLELIST + BODY section.  The return value is an empty string.
    pathName configure ?option? ?value option value @@ -7615,7 +8315,7 @@

    Detailed Reference

    y
    Given a y-coordinate within the tablelist window, this command - returns the index of the tablelist item containing that + returns the index of the tablelist body item containing that y-coordinate.  If no corresponding item is found then the return value is -1.  The coordinate y is expected to be relative to the tablelist window itself (not its body @@ -7625,9 +8325,9 @@

    Detailed Reference

    containingcell x y
    Given an x- and a y-coordinate within the tablelist window, this - command returns the index of the tablelist cell containing the point - having these coordinates.  If no corresponding cell is found then - the row or column component (or both) of the return value is + command returns the index of the tablelist body cell containing the + point having these coordinates.  If no corresponding cell is found + then the row or column component (or both) of the return value is -1.  The coordinates x and y are expected to be relative to the tablelist window itself (not its body component).
    @@ -7717,8 +8417,7 @@

    Detailed Reference

    -
    pathName - curcellselection +
    pathName curcellselection ?-all|-nonhidden|-viewable?
    Returns a list containing the canonical indices (of the form @@ -7755,18 +8454,18 @@

    Detailed Reference

    "#isviewable">viewable ones.
    pathName delete - first last
    + firstIndex lastIndex

    pathName delete indexList
    Deletes one or more items of the tablelist if its state is not disabled.  In the first form of the command, - first and last are indices - specifying the first and last items in the range to delete.  The - command's second form accepts a list indexList of - indices specifying the items to be deleted.  In both cases, all - descendants of the specified items will be deleted, too.  The - return value is an empty string.
    + firstIndex and lastIndex are + indices specifying the first and last items in the range to + delete.  The command's second form accepts a list + indexList of indices specifying the items to be + deleted.  In both cases, all descendants of the specified items + will be deleted, too.  The return value is an empty string.
    pathName deletecolumns firstColumn lastColumn
    @@ -7798,8 +8497,8 @@

    Detailed Reference

    root then the return value will be the number of items of the tablelist widget. -
    pathName - dicttoitem dictionary
    +
    pathName dicttoitem + dictionary
    Returns a tablelist item corresponding to the dictionary indicated by dictionary.  Each key in the specified @@ -7808,7 +8507,7 @@

    Detailed Reference

    (e.g., a number or a column name).  The values corresponding to the keys will be interpreted as the elements of the resulting tablelist item.  If the number of distinct numerical equivalents of the keys - (see the columnindex + (see the columnindex subcommand) is less than the number of columns then the elements corresponding to the missing column indices will be set to empty strings.
    @@ -7824,14 +8523,16 @@

    Detailed Reference

    the same dictionary, the subcommand will return the list  {Black Joe {}}. -
    For technical reasons (the use of the - dict command), this subcommand is not supported for - Tcl versions earlier than 8.5.
    +
    This subcommand is only available in the presence of the + dict command, which is the case when using Tcl + version 8.5 or later, or one of the alternative, Tcl-only dict + implementations.
    pathName editcell cellIndex
    -
    Starts the interactive editing of the cell's contents if the +
    Starts the interactive editing of the cell's content if the tablelist's state is not disabled and the cell is viewable and editable.  Returns an empty @@ -7894,7 +8595,70 @@

    Detailed Reference

    -
    pathName entrypath
    +
    pathName embedcheckbutton + cellIndex ?command?
    + +
    Sets the -window + option of the cell indicated by cellIndex to a + procedure that creates a frame with a checkbutton child having its + -variable option set to a global variable whose + name is private to Tablelist and is initialized with the cell's + internal value (which should be the boolean 0 or + 1).  Any change in the checkbutton's check state will + automatically set the cell's internal value to the corresponding + boolean value 0 or 1.  If the optional + command argument is a nonempty string then the + checkbutton's -command option will be set to a + script that concatenates this argument with the path name of the + tablelist widget and the cell's row and column indices and then invokes + the resulting script at idle time, thus making sure that at the time of + its invocation the cell's internal value will already be updated to + reflect the checkbutton's check state.
    + +
    REMARK 1:  Remember that the + windowpath subcommand + will return the path name of the embedded window, which is a frame; to + get the checkbutton's path name, append .ckbtn to + the frame's one.
    + +
    REMARK 2:  As described above, the + checkbutton's initial check state will reflect the cell's + internal value, and any change in the checkbutton's check state will + automatically update the cell.  On the other hand, if you change + the cell's internal value programmatically then it is your + responsibility to synchronize the checkbutton's check state.  To + this end you will have to retrieve the checkbutton's path name as + described above, get the name of its associated variable via  + cget -variable,  and set this variable to the + cell's internal value.
    + +
    pathName + embedcheckbuttons columnIndex + ?command?
    + +
    This command is logically equivalent to invoking embedcheckbutton for all body cells + of the column specified by columnIndex.
    + +
    pathName + embedttkcheckbutton cellIndex + ?command?
    + +
    Similar to embedcheckbutton, with the only + difference that the frame embedded into the cell will contain a + ttk::checkbutton child.
    + +
    pathName + embedttkcheckbuttons columnIndex + ?command?
    + +
    This command is logically equivalent to invoking embedttkcheckbutton for all body + cells of the column specified by columnIndex.
    + +
    pathName + entrypath
    Returns the path name of the entry or entry-like component of the temporary embedded widget used for interactive cell editing, created by @@ -7928,8 +8692,8 @@

    Detailed Reference

    Before displaying the children of a row, the command specified as the value of the -expandcommand option (if any) is - automatically concatenated with the name of the tablelist widget and - the row index, and the resulting script is evaluated in the global + automatically concatenated with the path name of the tablelist widget + and the row index, and the resulting script is evaluated in the global scope.  This enables you to insert a tree node's children on demand, just before expanding it.
    @@ -7954,8 +8718,8 @@

    Detailed Reference

    Before displaying the children of a row, the command specified as the value of the -expandcommand option (if any) is - automatically concatenated with the name of the tablelist widget and - the row index, and the resulting script is evaluated in the global + automatically concatenated with the path name of the tablelist widget + and the row index, and the resulting script is evaluated in the global scope.  This enables you to insert a tree node's children on demand, just before expanding it.
    @@ -7972,8 +8736,8 @@

    Detailed Reference

    pathName fillcolumn columnIndex text
    -
    Sets all the elements of the specified column to the value - text.
    +
    Sets all the elements of the specified column in the tablelist body + to the value text.
    pathName findcolumnname name
    @@ -8004,20 +8768,20 @@

    Detailed Reference

    finishediting
    This subcommand attempts to terminate the interactive editing of - the contents of the cell whose index was passed to the - editcell subcommand by - destroying the temporary widget embedded into the cell and updating the - cell's contents.  The exact steps involved are as follows:  - First, the widget's final text is compared to its original one.  - If they are equal then the edit window is destroyed and the cell's - original contents are restored.  If the two strings are different - and the value of the editcell subcommand by destroying the + temporary widget embedded into the cell and updating the cell's + content.  The exact steps involved are as follows:  First, + the widget's final text is compared to its original one.  If they + are equal then the edit window is destroyed and the cell's original + content is restored.  If the two strings are different and the + value of the -editendcommand configuration option is a nonempty string, then the widget's final text is passed to that command as its last argument (following the tablelist's path name as well as the cell's row and column indices), the resulting script is evaluated in the global scope, and the return value becomes the cell's - new contents after destroying the edit window.  However, if from + new content after destroying the edit window.  However, if from within this script the rejectinput subcommand was invoked then the cell's value is not changed and the embedded widget remains @@ -8026,7 +8790,7 @@

    Detailed Reference

    1.  Immediately before returning the value 1, the command generates the virtual event <<TablelistCellUpdated>>.  For Tk - versions 8.5 or higher, this virtual event is generated with its + versions 8.5 and higher, this virtual event is generated with its -data option set to a list consisting of the numerical row and column indices of the cell whose content is being edited.  If no cell was being edited when the command was invoked @@ -8067,12 +8831,13 @@

    Detailed Reference

    specified as the value of the -formatcommand column configuration option.  It returns a three-element list containing information - about the tablelist cell whose content is being formatted with the aid - of that command.  The first element of the list is the full key - (of the form knumber) associated with the + about the body or header cell whose content is being formatted with the + aid of that command.  The first element of the list is the full + key (of the form knumber or + hknumber) associated with the body or header item containing the tablelist element that is being formatted.  - The second and third elements are the cell's row and column - indices.
    + The second and third list elements are the cell's row (or header row) + and column indices.
    REMARK:  This subcommand is needed in cases where the @@ -8098,13 +8863,13 @@

    Detailed Reference

    -
    pathName get first - last
    +
    pathName get firstIndex + lastIndex
    pathName get indexList
    The first form of the command returns a list whose elements are all of the tablelist items (i.e., row contents) between - first and last, + firstIndex and lastIndex, inclusive.  The value returned by the second form depends on the number of elements in the list indexList: if the latter contains exactly one index then the return value is the @@ -8136,25 +8901,25 @@

    Detailed Reference

    lists themselves, where each of the sublists corresponds to exactly one column between firstColumn and lastColumn, inclusive, and consists of all of the - tablelist elements contained in that column.  The value returned - by the second form depends on the number of elements in the list - columnIndexList: if the latter contains exactly one - column index then the return value is a list consisting of all of the - tablelist elements contained in the column indicated by that column - index; otherwise the command returns a list whose elements are lists - themselves, where each of the sublists corresponds to exactly one - column index in columnIndexList and consists of all - of the tablelist elements contained in that column.
    + tablelist body elements contained in that column.  The value + returned by the second form depends on the number of elements in the + list columnIndexList: if the latter contains + exactly one column index then the return value is a list consisting of + all of the tablelist body elements contained in the column indicated by + that column index; otherwise the command returns a list whose elements + are lists themselves, where each of the sublists corresponds to exactly + one column index in columnIndexList and consists of + all of the tablelist body elements contained in that column.
    pathName - getformatted first last
    + getformatted firstIndex lastIndex
    pathName getformatted indexList
    The first form of the command returns a list whose elements are all of the formatted tablelist items (i.e., - formatted row contents) between first and - last, inclusive.  The value returned by the - second form depends on the number of elements in the list + formatted row contents) between firstIndex and + lastIndex, inclusive.  The value returned by + the second form depends on the number of elements in the list indexList: if the latter contains exactly one index then the return value is the formatted tablelist item indicated by that index (or an empty string if the index refers to a non-existent item); @@ -8188,24 +8953,25 @@

    Detailed Reference

    lists themselves, where each of the sublists corresponds to exactly one column between firstColumn and lastColumn, inclusive, and consists of all of the - formatted tablelist elements contained in - that column.  The value returned by the second form depends on the - number of elements in the list columnIndexList: if - the latter contains exactly one column index then the return value is a - list consisting of all of the formatted tablelist elements contained in - the column indicated by that column index; otherwise the command - returns a list whose elements are lists themselves, where each of the - sublists corresponds to exactly one column index in - columnIndexList and consists of all of the - formatted tablelist elements contained in that column.
    + formatted tablelist body elements + contained in that column.  The value returned by the second form + depends on the number of elements in the list + columnIndexList: if the latter contains exactly one + column index then the return value is a list consisting of all of the + formatted tablelist body elements contained in the column indicated by + that column index; otherwise the command returns a list whose elements + are lists themselves, where each of the sublists corresponds to exactly + one column index in columnIndexList and consists of + all of the formatted tablelist body elements contained in that + column.
    pathName - getfullkeys first last
    + getfullkeys firstIndex lastIndex
    pathName getfullkeys indexList
    The first form of the command returns a list whose elements are all of the full keys associated with the tablelist items between - first and last, + firstIndex and lastIndex, inclusive.  The value returned by the second form depends on the number of elements in the list indexList: if the latter contains exactly one index then the return value is the full key @@ -8223,12 +8989,12 @@

    Detailed Reference

    k to these internal item IDs.
    pathName getkeys - first last
    + firstIndex lastIndex
    pathName getkeys indexList
    The first form of the command returns a list whose elements are all of the sequence numbers associated with the tablelist items between - first and last, + firstIndex and lastIndex, inclusive.  The value returned by the second form depends on the number of elements in the list indexList: if the latter contains exactly one index then the return value is the sequence @@ -8271,6 +9037,39 @@

    Detailed Reference

    for the row given by index exists and 0 otherwise.
    + + +
    This command is only supported for Tk versions 8.5 and later.  + It is used to invoke various operations on the items in the widget's + header component.  The supported subcommnds are described in the + HEADER-RELATED SUBCOMMANDS section.
    + +
    pathName + headerpath
    + +
    This command is only supported for Tk versions 8.5 and later.  + It returns the path name of the text widget containing the header + items.
    + +
    pathName + headertag
    + +
    This command is only supported for Tk versions 8.5 and later.  + It returns the name of a binding tag whose name depends on the path + name of the tablelist widget and which is associated with the text + widget containing the header items, as well as the message and label + widgets used for displaying multi-line elements and images, + respectively in the header cells.  This binding tag precedes the + tag TablelistHeader + in the list of binding tags of the tablelist descendants mentioned + above, and is designed to be used when defining individual binding + scripts for tablelist widgets.  The main advantage of using this + tag instead of the path name of the text widget containing the header + items is that it enables you to write event handling scripts that are + valid not only for the above-mentioned text widget but also for the + multi-line cells and embedded images contained in it.
    +
    pathName hidetargetmark
    @@ -8308,7 +9107,8 @@

    Detailed Reference

    -bind [.tbl bodytag] <Button-1> {printClickedImage %W %x %y}
    +bind [.tbl bodytag] <Button-1> {printClickedImage %W %x %y}
    proc printClickedImage {w x y} { foreach {tbl x y} [tablelist::convEventFields $w $x $y] {} @@ -8323,7 +9123,7 @@

    Detailed Reference

    -
    pathName index +
    pathName index index
    Returns the integer row index value that corresponds to @@ -8535,7 +9335,7 @@

    Detailed Reference

    0 otherwise.  In both cases, the full (unsnipped) cell text is stored in the variable having the name given by fullTextName; this full text can be the cell's - contents or the string obtained from the latter by using the + content or the string obtained from the latter by using the -formatcommand option of the cell's column.  The most common invocation of this command occurs within the procedure specified as the value of the @@ -8578,10 +9378,10 @@

    Detailed Reference

    itemlistvar
    - Returns the name of a variable used by Tablelist to hold the widget's - internal list.  The recommended way to use this variable is to - create a link to it with the aid of the upvar - command, like in the following example: + Returns the name of a variable used by Tablelist to hold the internal + list associated with the widget's body.  The recommended way to + use this variable is to create a link to it with the aid of the + upvar command, like in the following example:
    @@ -8591,11 +9391,11 @@ 

    Detailed Reference

    In this example, the value of the variable itemList - will be the internal list of the tablelist widget - .tbl.  Each element of the widget's internal list - corresponds to one item, and it is in turn a list whose elements - correspond to the elements of that item, except that it has one - additional element, holding the item's full key.
    + will be the internal list associated with the body of the tablelist + widget .tbl.  Each element of the list corresponds to + one item, and it is in turn a list whose elements correspond to the + elements of that item, except that it has one additional element, + holding the item's full key.
    REMARK:  The itemlistvar command provides an efficient way for accessing this internal list, @@ -8608,18 +9408,18 @@

    Detailed Reference

    etc.  This should, however, be a strictly readonly access; otherwise the results will be unpredictable!
    -
    pathName - itemtodict item
    +
    pathName itemtodict + item
    Returns a dictionary built from the tablelist item indicated by item.  The dictionary's keys will be column numbers or names, and the values will be the corresponding elements of the given item.  For each column number col, if the corresponding column name (returned by  - pathName columncget col -name)  is a - nonempty string then this name will be used as dictionary key, - otherwise the numerical column index col.
    + pathName columncget + col -name)  is a nonempty string then this name will + be used as dictionary key, otherwise the numerical column index + col.
    For example, if your tablelist widget has 3 columns, of which the @@ -8646,9 +9446,11 @@

    Detailed Reference

    -
    For technical reasons (the use of the dict - command), this subcommand is not supported for Tcl versions earlier - than 8.5.
    +
    This subcommand is only available in the presence of the + dict command, which is the case when using Tcl + version 8.5 or later, or one of the alternative, Tcl-only dict + implementations.
    pathName labelpath columnIndex
    @@ -8726,7 +9528,7 @@

    Detailed Reference

    Given a y-coordinate within the tablelist window, this command returns the index of the viewable tablelist - item nearest to that y-coordinate.  The coordinate + body item nearest to that y-coordinate.  The coordinate y is expected to be relative to the tablelist window itself (not its body component).
    @@ -8735,10 +9537,10 @@

    Detailed Reference

    Given an x- and a y-coordinate within the tablelist window, this command returns the index of the viewable - tablelist cell nearest to the point having these coordinates.  The - coordinates x and y are - expected to be relative to the tablelist window itself (not its body - component).
    + tablelist body cell nearest to the point having these + coordinates.  The coordinates x and + y are expected to be relative to the tablelist + window itself (not its body component).
    pathName nearestcolumn x
    @@ -8794,7 +9596,7 @@

    Detailed Reference

    If invoked from within the Tcl command specified by the -editendcommand configuration option, then this subcommand prevents the termination of - the interactive editing of the contents of the cell whose index was + the interactive editing of the content of the cell whose index was passed to the editcell subcommand.  It invokes the seecell subcommand to make sure the @@ -8802,7 +9604,7 @@

    Detailed Reference

    and sets the focus to the temporary widget embedded into the cell.  This command enables you to reject the widget's text during the final validation of the string intended to become the new cell - contents.  The return value is an empty string.
    + content.  The return value is an empty string.
    pathName resetsortinfo
    @@ -8868,8 +9670,8 @@

    Detailed Reference

    specified, then the command modifies the given row option(s) to have the given value(s); in this case the return value is an empty string.  option may have any of the values - described in the ROW CONFIGURATION OPTIONS - section. + described in the ROW CONFIGURATION OPTIONS IN + THE TABLELIST BODY section.
    pathName scan option args
    @@ -8914,7 +9716,7 @@

    Detailed Reference

    searchcolumn columnIndex pattern ?options? -
    This subcommand searches the elements of the column given by +
    This subcommand searches the body elements of the column given by columnIndex to see if one of them matches pattern.  If a match is found, the row index of the first matching element is returned as result (unless the option @@ -8937,7 +9739,7 @@

    Detailed Reference

    -backwards The search will proceed backward through the given column's - elements.
    2D geometry 2D geometry diagram
    alert alert notifywindow
    append tag append tag canvas::tag
    arc arc diagram
    arrow arrow diagram
    background background canvas::gradient
    balloon balloon tooltip
    bindtags bindtags ntext · ntextBindings · ntextIndent · ntextWordBreak
    bitmap bitmap bitmap-editor
    box box diagram
    bundle bundle widget
    calendar calendar widget · widget_calendar
    canvas canvas canvas::drag · canvas::edit::points · canvas::edit::polyline · canvas::edit::quadrilateral · canvas::gradient · canvas::highlight · canvas::mvg · canvas::snap · canvas::sqmap · canvas::tag · canvas::track::lines · canvasLabel · crosshair · diagram · diagram-viewer · pie · pieBoxLabeler · piePeripheralLabeler
    cell cell canvas::sqmap
    character character khim
    chat chat chatwidget
    chatwidget chatwidget chatwidget
    circle circle diagram
    clock clock datefield
    color gradient color gradient canvas::gradient
    composite widget composite widget chatwidget
    concave concave canvas::edit::quadrilateral
    controlling controlling controlwidget
    conversion conversion diagram-viewer
    convex convex canvas::edit::quadrilateral
    cross-hairs cross-hairs crosshair
    crosshair crosshair canvas::track::lines
    cursor cursor cursor
    data entry lists data entry lists widget_listentry · widget_listsimple
    data entry ordered list data entry ordered list widget_listentry
    data entry set of strings data entry set of strings widget_listentry · widget_listsimple
    data entry unordered list data entry unordered list widget_listentry · widget_listsimple
    date date datefield · widget_calendar · widget_dateentry
    dateentry dateentry datefield · widget · widget_dateentry
    diagram diagram diagram · diagram-viewer
    dialog dialog getstring · swaplist · widget
    diamond diamond diagram
    disjointlistbox disjointlistbox swaplist
    displaying displaying controlwidget
    dll dll ico
    dragging dragging canvas::drag
    drawing drawing diagram
    drum drum diagram
    editing editing canvas::edit::points · canvas::edit::polyline · canvas::edit::quadrilateral
    editor editor bitmap-editor
    ellipse ellipse diagram
    enter callback enter callback canvas::highlight
    entry entry datefield · getstring · history · ico · ipentry
    exe exe ico
    gradients gradients canvas::gradient
    graphics graphics canvas::mvg
    grid grid canvas::sqmap
    help help tooltip
    highlighting highlighting canvas::highlight
    history history history
    hover hover tooltip
    i18n i18n khim
    ico ico ico
    icon icon ico
    image image bitmap-editor · canvas::gradient · canvas::snap · canvas::sqmap · diagram
    imagemagick imagemagick canvas::mvg
    input input khim
    insert tag insert tag canvas::tag
    international international khim
    interpolation interpolation diagram
    intersection intersection diagram
    invalid invalid widget_validator
    ip address ip address ipentry
    irc irc chatwidget
    labeler labeler canvasLabel · pie · pieBoxLabeler · piePeripheralLabeler
    leave callback leave callback canvas::highlight
    line line diagram
    list entry panel list entry panel widget_listentry · widget_listsimple
    listbox listbox swaplist
    location location crosshair
    magick vector graphics magick vector graphics canvas::mvg
    map map canvas::sqmap
    mega-widget mega-widget chatwidget
    megawidget megawidget widget · widget_calendar · widget_dateentry · widget_toolbar
    menu menu widget
    method method khim
    move move diagram
    mvg mvg canvas::mvg
    network network ipentry
    non-convex non-convex canvas::edit::quadrilateral
    notification notification notifywindow
    numerical values numerical values controlwidget
    panelframe panelframe widget
    photo photo canvas::snap
    picture picture diagram
    pie pie canvasLabel · pie · pieBoxLabeler · piePeripheralLabeler
    pixel pixel bitmap-editor
    plane geometry plane geometry diagram
    plotting plotting diagram
    point point diagram
    point cloud point cloud canvas::edit::points
    points points canvas::edit::points
    polyline polyline canvas::edit::polyline
    print screen print screen canvas::mvg · canvas::snap
    quadrilateral quadrilateral canvas::edit::quadrilateral
    raster image raster image diagram
    re_syntax re_syntax ntext · ntextIndent · ntextWordBreak
    regexp regexp ntext · ntextIndent · ntextWordBreak
    remove tag remove tag canvas::tag
    rubberband rubberband canvas::track::lines
    ruler ruler widget
    scale widget scale widget controlwidget
    screenruler screenruler widget
    scroll scroll autoscroll
    scrollbar scrollbar autoscroll
    scrolledwindow scrolledwindow widget
    serialization serialization canvas::mvg
    set entry panel set entry panel widget_listentry · widget_listsimple
    slice slice canvasLabel · pie · pieBoxLabeler · piePeripheralLabeler
    snapshot snapshot canvas::snap
    snit snit widget · widget_calendar · widget_dateentry · widget_toolbar
    spline spline diagram
    square map square map canvas::sqmap
    state management state management widget_validator
    statusbar statusbar widget
    string string getstring
    superframe superframe widget
    syntax highlighting syntax highlighting ctext
    tags tags canvas::tag
    text text ctext · diagram · ntext · ntextBindings · ntextIndent · ntextWordBreak
    tile tile canvas::sqmap
    tk tk notifywindow
    toolbar toolbar widget · widget_toolbar
    tooltip tooltip tooltip
    tracking tracking canvas::track::lines · crosshair
    ttk::combobox ttk::combobox widget_validator
    ttk::entry ttk::entry widget_validator
    validation validation widget_validator
    vector vector diagram · diagram-viewer
    vector graphics vector graphics canvas::mvg
    viewport viewport crosshair
    widget widget chatwidget · ctext · datefield · widget · widget_calendar · widget_dateentry · widget_listentry · widget_listsimple · widget_toolbar
    widget background widget background canvas::gradient
    widget validation widget validation widget_validator
    xbm xbm bitmap-editor
    zoom zoom canvas::zoom
    + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + @@ -204,5 +212,13 @@

    Table Of Contents

    + + + + + + + +
    addUndoAdding Undo/Redo to Entry, Spinbox, and Combobox Widgets
    autoscroll Provides for a scrollbar to automatically mapped and unmapped as needed
    bitmap-editor Editor for XBM images
    canvas::drag Manage the dragging of canvas items or item groups
    canvas::edit::points Editing a cloud of points on a canvas
    canvas::edit::polyline Editing a polyline on a canvas
    canvas::edit::quadrilateral Editing a quadrilateral on a canvas
    canvas::gradient Canvas with a gradient background
    canvas::highlight Manage the highlighting of canvas items or item groups
    canvas::mvg Canvas to ImageMagick MVG vector format
    canvas::snap Canvas snapshot to Tk photo image
    canvas::sqmap Canvas with map background based on square tiles
    canvas::tag Easier management of the tags on canvas items or item groups
    canvas::track::lines Manage a group of rubber band lines
    canvas::zoom Zoom control for canvas::sqmap
    canvasLabel tkpiechart canvas label class
    chatwidget Provides a multi-paned view suitable for display of chat room or irc channel information
    controlwidget Collection of widgets for displaying and controlling numerical values
    crosshair Crosshairs for Tk canvas
    ctext Ctext a text widget with highlighting support
    cursor Procedures to handle CURSOR data
    datefield Tk datefield widget
    diagram Diagram drawing
    diagram-viewer Lightweight Diagram Processor
    getstring A string dialog
    history Provides a history for Entry widgets
    ico Reading and writing windows icons
    ipentry An IP address entry widget
    khim Provides key bindings for entering international characters on a keyboard that does not support them
    menubar Creates an instance of the Class.
    notifywindow Provides unobtrusive window for alerts/notifications from Tk applications
    ntext Alternative Bindings for the Text Widget
    ntextBindings Alternative Bindings for the Text Widget
    ntextIndent ntext Indentation for the Text Widget
    ntextWordBreak ntext Word Boundary Detection for the Text Widget
    persistentSelectionEnhanced PRIMARY selection
    pie 2D or 3D pie chart object in a canvaswidget_validator widget::validator behaviour
    widgetPlusEnhanced Entry, Spinbox, and Combobox Widgets with Undo/Redo and other useful features
    widgetPlusEnhanced Entry, Spinbox, and Combobox Widgets with Undo/Redo and other useful features

    diff --git a/embedded/www/toc.html b/embedded/www/toc.html index 2e17af81..b8c0fab5 100644 --- a/embedded/www/toc.html +++ b/embedded/www/toc.html @@ -153,37 +153,45 @@

    Table Of Contents

    ntext Word Boundary Detection for the Text Widget +persistentSelection +Enhanced PRIMARY selection + + pie 2D or 3D pie chart object in a canvas - + pieBoxLabeler tkpiechart pie box style labeler class - + piePeripheralLabeler tkpiechart pie peripheral style labeler class - + Plotchart Simple plotting and charting package - + tooltip Tooltip management - + widget_listentry widget::listentry widget - + widget_listsimple widget::listsimple widget - + widget_validator widget::validator behaviour + +widgetPlus +Enhanced Entry, Spinbox, and Combobox Widgets with Undo/Redo and other useful features +
    Widget
    @@ -404,6 +412,13 @@

    Table Of Contents

    ntext Word Boundary Detection for the Text Widget
    +
    persistentSelection
    + + + + + +
    persistentSelectionEnhanced PRIMARY selection
    plotchart
    @@ -474,6 +489,13 @@

    Table Of Contents

    widget::listsimple widget
    +
    widgetPlus
    + + + + + +
    widgetPlusEnhanced Entry, Spinbox, and Combobox Widgets with Undo/Redo and other useful features
    widgetv
    diff --git a/embedded/www/toc0.html b/embedded/www/toc0.html index 23ee0f0c..11b72f75 100644 --- a/embedded/www/toc0.html +++ b/embedded/www/toc0.html @@ -153,37 +153,45 @@

    Table Of Contents

    + + + + - + - + - + - + - + - + - + + + + +
    ntext Word Boundary Detection for the Text Widget
    persistentSelectionEnhanced PRIMARY selection
    pie 2D or 3D pie chart object in a canvas
    pieBoxLabeler tkpiechart pie box style labeler class
    piePeripheralLabeler tkpiechart pie peripheral style labeler class
    Plotchart Simple plotting and charting package
    tooltip Tooltip management
    widget_listentry widget::listentry widget
    widget_listsimple widget::listsimple widget
    widget_validator widget::validator behaviour
    widgetPlusEnhanced Entry, Spinbox, and Combobox Widgets with Undo/Redo and other useful features
    Widget
    diff --git a/embedded/www/toc1.html b/embedded/www/toc1.html index 52a0b4fd..a1feb71d 100644 --- a/embedded/www/toc1.html +++ b/embedded/www/toc1.html @@ -191,6 +191,13 @@

    Table Of Contents

    ntext Word Boundary Detection for the Text Widget
    +
    persistentSelection
    + + + + + +
    persistentSelectionEnhanced PRIMARY selection
    plotchart
    @@ -261,6 +268,13 @@

    Table Of Contents

    widget::listsimple widget
    +
    widgetPlus
    + + + + + +
    widgetPlusEnhanced Entry, Spinbox, and Combobox Widgets with Undo/Redo and other useful features
    widgetv
    diff --git a/support/devel/sak/doc/manpages.txt b/support/devel/sak/doc/manpages.txt index 8a3578bb..873f23e9 100644 --- a/support/devel/sak/doc/manpages.txt +++ b/support/devel/sak/doc/manpages.txt @@ -31,6 +31,7 @@ modules/ntext/ntext.man modules/ntext/ntextBindings.man modules/ntext/ntextIndent.man modules/ntext/ntextWordBreak.man +modules/persistentSelection/persistentSelection.man modules/plotchart/plotchart.man modules/swaplist/swaplist.man modules/tkpiechart/canvaslabel.man @@ -44,4 +45,5 @@ modules/widget/widget_dateentry.man modules/widget/widget_toolbar.man modules/widgetl/widget_listentry.man modules/widgetl/widget_listsimple.man +modules/widgetPlus/widgetPlus.man modules/widgetv/widget_validator.man diff --git a/support/devel/sak/doc/toc.txt b/support/devel/sak/doc/toc.txt index dcc7f2be..0e03a872 100644 --- a/support/devel/sak/doc/toc.txt +++ b/support/devel/sak/doc/toc.txt @@ -8,43 +8,45 @@ [item apps/bitmap-editor.man bitmap-editor {Editor for XBM images}] [division_end] [division_start Unfiled] -[item modules/autoscroll/autoscroll.man autoscroll {Provides for a scrollbar to automatically mapped and unmapped as needed}] -[item modules/canvas/canvas_drag.man canvas::drag {Manage the dragging of canvas items or item groups}] -[item modules/canvas/canvas_epoints.man canvas::edit::points {Editing a cloud of points on a canvas}] -[item modules/canvas/canvas_epolyline.man canvas::edit::polyline {Editing a polyline on a canvas}] -[item modules/canvas/canvas_equad.man canvas::edit::quadrilateral {Editing a quadrilateral on a canvas}] -[item modules/canvas/canvas_gradient.man canvas::gradient {Canvas with a gradient background}] -[item modules/canvas/canvas_highlight.man canvas::highlight {Manage the highlighting of canvas items or item groups}] -[item modules/canvas/canvas_mvg.man canvas::mvg {Canvas to ImageMagick MVG vector format}] -[item modules/canvas/canvas_snap.man canvas::snap {Canvas snapshot to Tk photo image}] -[item modules/canvas/canvas_sqmap.man canvas::sqmap {Canvas with map background based on square tiles}] -[item modules/canvas/canvas_tags.man canvas::tag {Easier management of the tags on canvas items or item groups}] -[item modules/canvas/canvas_trlines.man canvas::track::lines {Manage a group of rubber band lines}] -[item modules/canvas/canvas_zoom.man canvas::zoom {Zoom control for canvas::sqmap}] -[item modules/tkpiechart/canvaslabel.man canvasLabel {tkpiechart canvas label class}] -[item modules/chatwidget/chatwidget.man chatwidget {Provides a multi-paned view suitable for display of chat room or irc channel information}] -[item modules/controlwidget/controlwidget.man controlwidget {Collection of widgets for displaying and controlling numerical values}] -[item modules/crosshair/crosshair.man crosshair {Crosshairs for Tk canvas}] -[item modules/ctext/ctext.man ctext {Ctext a text widget with highlighting support}] -[item modules/cursor/cursor.man cursor {Procedures to handle CURSOR data}] -[item modules/getstring/tk_getString.man getstring {A string dialog}] -[item modules/history/tklib_history.man history {Provides a history for Entry widgets}] -[item modules/ico/ico.man ico {Reading and writing windows icons}] -[item modules/khim/khim.man khim {Provides key bindings for entering international characters on a keyboard that does not support them}] -[item modules/menubar/menubar.man menubar {Creates an instance of the Class.}] -[item modules/notifywindow/notifywindow.man notifywindow {Provides unobtrusive window for alerts/notifications from Tk applications}] -[item modules/ntext/ntext.man ntext {Alternative Bindings for the Text Widget}] -[item modules/ntext/ntextBindings.man ntextBindings {Alternative Bindings for the Text Widget}] -[item modules/ntext/ntextIndent.man ntextIndent {ntext Indentation for the Text Widget}] -[item modules/ntext/ntextWordBreak.man ntextWordBreak {ntext Word Boundary Detection for the Text Widget}] -[item modules/tkpiechart/pie.man pie {2D or 3D pie chart object in a canvas}] -[item modules/tkpiechart/pieboxlabeler.man pieBoxLabeler {tkpiechart pie box style labeler class}] -[item modules/tkpiechart/pieperipherallabeler.man piePeripheralLabeler {tkpiechart pie peripheral style labeler class}] -[item modules/plotchart/plotchart.man Plotchart {Simple plotting and charting package}] -[item modules/tooltip/tooltip.man tooltip {Tooltip management}] -[item modules/widgetl/widget_listentry.man widget_listentry {widget::listentry widget}] -[item modules/widgetl/widget_listsimple.man widget_listsimple {widget::listsimple widget}] -[item modules/widgetv/widget_validator.man widget_validator {widget::validator behaviour}] +[item modules/autoscroll/autoscroll.man autoscroll {Provides for a scrollbar to automatically mapped and unmapped as needed}] +[item modules/canvas/canvas_drag.man canvas::drag {Manage the dragging of canvas items or item groups}] +[item modules/canvas/canvas_epoints.man canvas::edit::points {Editing a cloud of points on a canvas}] +[item modules/canvas/canvas_epolyline.man canvas::edit::polyline {Editing a polyline on a canvas}] +[item modules/canvas/canvas_equad.man canvas::edit::quadrilateral {Editing a quadrilateral on a canvas}] +[item modules/canvas/canvas_gradient.man canvas::gradient {Canvas with a gradient background}] +[item modules/canvas/canvas_highlight.man canvas::highlight {Manage the highlighting of canvas items or item groups}] +[item modules/canvas/canvas_mvg.man canvas::mvg {Canvas to ImageMagick MVG vector format}] +[item modules/canvas/canvas_snap.man canvas::snap {Canvas snapshot to Tk photo image}] +[item modules/canvas/canvas_sqmap.man canvas::sqmap {Canvas with map background based on square tiles}] +[item modules/canvas/canvas_tags.man canvas::tag {Easier management of the tags on canvas items or item groups}] +[item modules/canvas/canvas_trlines.man canvas::track::lines {Manage a group of rubber band lines}] +[item modules/canvas/canvas_zoom.man canvas::zoom {Zoom control for canvas::sqmap}] +[item modules/tkpiechart/canvaslabel.man canvasLabel {tkpiechart canvas label class}] +[item modules/chatwidget/chatwidget.man chatwidget {Provides a multi-paned view suitable for display of chat room or irc channel information}] +[item modules/controlwidget/controlwidget.man controlwidget {Collection of widgets for displaying and controlling numerical values}] +[item modules/crosshair/crosshair.man crosshair {Crosshairs for Tk canvas}] +[item modules/ctext/ctext.man ctext {Ctext a text widget with highlighting support}] +[item modules/cursor/cursor.man cursor {Procedures to handle CURSOR data}] +[item modules/getstring/tk_getString.man getstring {A string dialog}] +[item modules/history/tklib_history.man history {Provides a history for Entry widgets}] +[item modules/ico/ico.man ico {Reading and writing windows icons}] +[item modules/khim/khim.man khim {Provides key bindings for entering international characters on a keyboard that does not support them}] +[item modules/menubar/menubar.man menubar {Creates an instance of the Class.}] +[item modules/notifywindow/notifywindow.man notifywindow {Provides unobtrusive window for alerts/notifications from Tk applications}] +[item modules/ntext/ntext.man ntext {Alternative Bindings for the Text Widget}] +[item modules/ntext/ntextBindings.man ntextBindings {Alternative Bindings for the Text Widget}] +[item modules/ntext/ntextIndent.man ntextIndent {ntext Indentation for the Text Widget}] +[item modules/ntext/ntextWordBreak.man ntextWordBreak {ntext Word Boundary Detection for the Text Widget}] +[item modules/persistentSelection/persistentSelection.man persistentSelection {Enhanced PRIMARY selection}] +[item modules/tkpiechart/pie.man pie {2D or 3D pie chart object in a canvas}] +[item modules/tkpiechart/pieboxlabeler.man pieBoxLabeler {tkpiechart pie box style labeler class}] +[item modules/tkpiechart/pieperipherallabeler.man piePeripheralLabeler {tkpiechart pie peripheral style labeler class}] +[item modules/plotchart/plotchart.man Plotchart {Simple plotting and charting package}] +[item modules/tooltip/tooltip.man tooltip {Tooltip management}] +[item modules/widgetl/widget_listentry.man widget_listentry {widget::listentry widget}] +[item modules/widgetl/widget_listsimple.man widget_listsimple {widget::listsimple widget}] +[item modules/widgetv/widget_validator.man widget_validator {widget::validator behaviour}] +[item modules/widgetPlus/widgetPlus.man widgetPlus {Enhanced Entry, Spinbox, and Combobox Widgets with Undo/Redo and other useful features}] [division_end] [division_start Widget] [item modules/datefield/datefield.man datefield {Tk datefield widget}] @@ -127,6 +129,9 @@ [item modules/ntext/ntextIndent.man ntextIndent {ntext Indentation for the Text Widget}] [item modules/ntext/ntextWordBreak.man ntextWordBreak {ntext Word Boundary Detection for the Text Widget}] [division_end] +[division_start persistentSelection] +[item modules/persistentSelection/persistentSelection.man persistentSelection {Enhanced PRIMARY selection}] +[division_end] [division_start plotchart] [item modules/plotchart/plotchart.man Plotchart {Simple plotting and charting package}] [division_end] @@ -152,6 +157,9 @@ [item modules/widgetl/widget_listentry.man widget_listentry {widget::listentry widget}] [item modules/widgetl/widget_listsimple.man widget_listsimple {widget::listsimple widget}] [division_end] +[division_start widgetPlus] +[item modules/widgetPlus/widgetPlus.man widgetPlus {Enhanced Entry, Spinbox, and Combobox Widgets with Undo/Redo and other useful features}] +[division_end] [division_start widgetv] [item modules/widgetv/widget_validator.man widget_validator {widget::validator behaviour}] [division_end] diff --git a/support/devel/sak/doc/toc_cats.txt b/support/devel/sak/doc/toc_cats.txt index 9f18ed3b..4b4e8d39 100644 --- a/support/devel/sak/doc/toc_cats.txt +++ b/support/devel/sak/doc/toc_cats.txt @@ -8,43 +8,45 @@ [item apps/bitmap-editor.man bitmap-editor {Editor for XBM images}] [division_end] [division_start Unfiled] -[item modules/autoscroll/autoscroll.man autoscroll {Provides for a scrollbar to automatically mapped and unmapped as needed}] -[item modules/canvas/canvas_drag.man canvas::drag {Manage the dragging of canvas items or item groups}] -[item modules/canvas/canvas_epoints.man canvas::edit::points {Editing a cloud of points on a canvas}] -[item modules/canvas/canvas_epolyline.man canvas::edit::polyline {Editing a polyline on a canvas}] -[item modules/canvas/canvas_equad.man canvas::edit::quadrilateral {Editing a quadrilateral on a canvas}] -[item modules/canvas/canvas_gradient.man canvas::gradient {Canvas with a gradient background}] -[item modules/canvas/canvas_highlight.man canvas::highlight {Manage the highlighting of canvas items or item groups}] -[item modules/canvas/canvas_mvg.man canvas::mvg {Canvas to ImageMagick MVG vector format}] -[item modules/canvas/canvas_snap.man canvas::snap {Canvas snapshot to Tk photo image}] -[item modules/canvas/canvas_sqmap.man canvas::sqmap {Canvas with map background based on square tiles}] -[item modules/canvas/canvas_tags.man canvas::tag {Easier management of the tags on canvas items or item groups}] -[item modules/canvas/canvas_trlines.man canvas::track::lines {Manage a group of rubber band lines}] -[item modules/canvas/canvas_zoom.man canvas::zoom {Zoom control for canvas::sqmap}] -[item modules/tkpiechart/canvaslabel.man canvasLabel {tkpiechart canvas label class}] -[item modules/chatwidget/chatwidget.man chatwidget {Provides a multi-paned view suitable for display of chat room or irc channel information}] -[item modules/controlwidget/controlwidget.man controlwidget {Collection of widgets for displaying and controlling numerical values}] -[item modules/crosshair/crosshair.man crosshair {Crosshairs for Tk canvas}] -[item modules/ctext/ctext.man ctext {Ctext a text widget with highlighting support}] -[item modules/cursor/cursor.man cursor {Procedures to handle CURSOR data}] -[item modules/getstring/tk_getString.man getstring {A string dialog}] -[item modules/history/tklib_history.man history {Provides a history for Entry widgets}] -[item modules/ico/ico.man ico {Reading and writing windows icons}] -[item modules/khim/khim.man khim {Provides key bindings for entering international characters on a keyboard that does not support them}] -[item modules/menubar/menubar.man menubar {Creates an instance of the Class.}] -[item modules/notifywindow/notifywindow.man notifywindow {Provides unobtrusive window for alerts/notifications from Tk applications}] -[item modules/ntext/ntext.man ntext {Alternative Bindings for the Text Widget}] -[item modules/ntext/ntextBindings.man ntextBindings {Alternative Bindings for the Text Widget}] -[item modules/ntext/ntextIndent.man ntextIndent {ntext Indentation for the Text Widget}] -[item modules/ntext/ntextWordBreak.man ntextWordBreak {ntext Word Boundary Detection for the Text Widget}] -[item modules/tkpiechart/pie.man pie {2D or 3D pie chart object in a canvas}] -[item modules/tkpiechart/pieboxlabeler.man pieBoxLabeler {tkpiechart pie box style labeler class}] -[item modules/tkpiechart/pieperipherallabeler.man piePeripheralLabeler {tkpiechart pie peripheral style labeler class}] -[item modules/plotchart/plotchart.man Plotchart {Simple plotting and charting package}] -[item modules/tooltip/tooltip.man tooltip {Tooltip management}] -[item modules/widgetl/widget_listentry.man widget_listentry {widget::listentry widget}] -[item modules/widgetl/widget_listsimple.man widget_listsimple {widget::listsimple widget}] -[item modules/widgetv/widget_validator.man widget_validator {widget::validator behaviour}] +[item modules/autoscroll/autoscroll.man autoscroll {Provides for a scrollbar to automatically mapped and unmapped as needed}] +[item modules/canvas/canvas_drag.man canvas::drag {Manage the dragging of canvas items or item groups}] +[item modules/canvas/canvas_epoints.man canvas::edit::points {Editing a cloud of points on a canvas}] +[item modules/canvas/canvas_epolyline.man canvas::edit::polyline {Editing a polyline on a canvas}] +[item modules/canvas/canvas_equad.man canvas::edit::quadrilateral {Editing a quadrilateral on a canvas}] +[item modules/canvas/canvas_gradient.man canvas::gradient {Canvas with a gradient background}] +[item modules/canvas/canvas_highlight.man canvas::highlight {Manage the highlighting of canvas items or item groups}] +[item modules/canvas/canvas_mvg.man canvas::mvg {Canvas to ImageMagick MVG vector format}] +[item modules/canvas/canvas_snap.man canvas::snap {Canvas snapshot to Tk photo image}] +[item modules/canvas/canvas_sqmap.man canvas::sqmap {Canvas with map background based on square tiles}] +[item modules/canvas/canvas_tags.man canvas::tag {Easier management of the tags on canvas items or item groups}] +[item modules/canvas/canvas_trlines.man canvas::track::lines {Manage a group of rubber band lines}] +[item modules/canvas/canvas_zoom.man canvas::zoom {Zoom control for canvas::sqmap}] +[item modules/tkpiechart/canvaslabel.man canvasLabel {tkpiechart canvas label class}] +[item modules/chatwidget/chatwidget.man chatwidget {Provides a multi-paned view suitable for display of chat room or irc channel information}] +[item modules/controlwidget/controlwidget.man controlwidget {Collection of widgets for displaying and controlling numerical values}] +[item modules/crosshair/crosshair.man crosshair {Crosshairs for Tk canvas}] +[item modules/ctext/ctext.man ctext {Ctext a text widget with highlighting support}] +[item modules/cursor/cursor.man cursor {Procedures to handle CURSOR data}] +[item modules/getstring/tk_getString.man getstring {A string dialog}] +[item modules/history/tklib_history.man history {Provides a history for Entry widgets}] +[item modules/ico/ico.man ico {Reading and writing windows icons}] +[item modules/khim/khim.man khim {Provides key bindings for entering international characters on a keyboard that does not support them}] +[item modules/menubar/menubar.man menubar {Creates an instance of the Class.}] +[item modules/notifywindow/notifywindow.man notifywindow {Provides unobtrusive window for alerts/notifications from Tk applications}] +[item modules/ntext/ntext.man ntext {Alternative Bindings for the Text Widget}] +[item modules/ntext/ntextBindings.man ntextBindings {Alternative Bindings for the Text Widget}] +[item modules/ntext/ntextIndent.man ntextIndent {ntext Indentation for the Text Widget}] +[item modules/ntext/ntextWordBreak.man ntextWordBreak {ntext Word Boundary Detection for the Text Widget}] +[item modules/persistentSelection/persistentSelection.man persistentSelection {Enhanced PRIMARY selection}] +[item modules/tkpiechart/pie.man pie {2D or 3D pie chart object in a canvas}] +[item modules/tkpiechart/pieboxlabeler.man pieBoxLabeler {tkpiechart pie box style labeler class}] +[item modules/tkpiechart/pieperipherallabeler.man piePeripheralLabeler {tkpiechart pie peripheral style labeler class}] +[item modules/plotchart/plotchart.man Plotchart {Simple plotting and charting package}] +[item modules/tooltip/tooltip.man tooltip {Tooltip management}] +[item modules/widgetl/widget_listentry.man widget_listentry {widget::listentry widget}] +[item modules/widgetl/widget_listsimple.man widget_listsimple {widget::listsimple widget}] +[item modules/widgetv/widget_validator.man widget_validator {widget::validator behaviour}] +[item modules/widgetPlus/widgetPlus.man widgetPlus {Enhanced Entry, Spinbox, and Combobox Widgets with Undo/Redo and other useful features}] [division_end] [division_start Widget] [item modules/datefield/datefield.man datefield {Tk datefield widget}] diff --git a/support/devel/sak/doc/toc_mods.txt b/support/devel/sak/doc/toc_mods.txt index 307f4be0..8785f1eb 100644 --- a/support/devel/sak/doc/toc_mods.txt +++ b/support/devel/sak/doc/toc_mods.txt @@ -65,6 +65,9 @@ [item modules/ntext/ntextIndent.man ntextIndent {ntext Indentation for the Text Widget}] [item modules/ntext/ntextWordBreak.man ntextWordBreak {ntext Word Boundary Detection for the Text Widget}] [division_end] +[division_start persistentSelection] +[item modules/persistentSelection/persistentSelection.man persistentSelection {Enhanced PRIMARY selection}] +[division_end] [division_start plotchart] [item modules/plotchart/plotchart.man Plotchart {Simple plotting and charting package}] [division_end] @@ -90,6 +93,9 @@ [item modules/widgetl/widget_listentry.man widget_listentry {widget::listentry widget}] [item modules/widgetl/widget_listsimple.man widget_listsimple {widget::listsimple widget}] [division_end] +[division_start widgetPlus] +[item modules/widgetPlus/widgetPlus.man widgetPlus {Enhanced Entry, Spinbox, and Combobox Widgets with Undo/Redo and other useful features}] +[division_end] [division_start widgetv] [item modules/widgetv/widget_validator.man widget_validator {widget::validator behaviour}] [division_end] From 902189d351ddf6cdcc4135dee8a7efc3c9a1d228 Mon Sep 17 00:00:00 2001 From: Keith Nash Date: Mon, 19 Feb 2018 19:15:44 +0000 Subject: [PATCH 040/150] bugfix - include widgetPlus examples in build --- support/installation/modules.tcl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/support/installation/modules.tcl b/support/installation/modules.tcl index 8ccf1ccb..750cf616 100755 --- a/support/installation/modules.tcl +++ b/support/installation/modules.tcl @@ -58,7 +58,7 @@ Module tooltip _tcl _man _null Module wcb _tab _null _exa Module widget _tcl _man _exa Module widgetl _tcl _man _null -Module widgetPlus _tcl _man _null +Module widgetPlus _tcl _man _exa Module widgetv _tcl _man _null Application diagram-viewer From b124a6d173137c905061c39ee141442f19fce829 Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 5 Mar 2018 14:02:36 +0000 Subject: [PATCH 041/150] * *.tcl: Bumped the version number to 6.1; * COPYRIGHT.txt: updated the copyright information. * README.txt: * ../../examples/tablelist/*.tcl: * CHANGES.txt: Updated to reflect the changes. * scripts/*.tcl: Added the "-imagebackground" cell configuration option; updated the copyright information. * doc/*.html: Updated to reflect the changes; more on the "bodytag" subcommand in connection with embedded images etc. as drag sources. --- modules/tablelist/ChangeLog | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/modules/tablelist/ChangeLog b/modules/tablelist/ChangeLog index b16a0bc0..b5ba39a1 100644 --- a/modules/tablelist/ChangeLog +++ b/modules/tablelist/ChangeLog @@ -1,3 +1,18 @@ +2018-03-05 Csaba Nemethi + + * *.tcl: Bumped the version number to 6.1; + * COPYRIGHT.txt: updated the copyright information. + * README.txt: + * ../../examples/tablelist/*.tcl: + + * CHANGES.txt: Updated to reflect the changes. + + * scripts/*.tcl: Added the "-imagebackground" cell configuration option; + updated the copyright information. + + * doc/*.html: Updated to reflect the changes; more on the "bodytag" + subcommand in connection with embedded images etc. as drag sources. + 2018-02-12 Csaba Nemethi * CHANGES.txt: Updated. From 99b5d785935a67319d3279111e01792d9a01eede Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 5 Mar 2018 14:05:08 +0000 Subject: [PATCH 042/150] * *.tcl: Bumped the version number to 6.1; * COPYRIGHT.txt: updated the copyright information. * README.txt: * ../../examples/tablelist/*.tcl: --- modules/tablelist/COPYRIGHT.txt | 2 +- modules/tablelist/README.txt | 14 +++++++------- modules/tablelist/pkgIndex.tcl | 14 +++++++------- modules/tablelist/tablelist.tcl | 2 +- modules/tablelist/tablelistPublic.tcl | 2 +- modules/tablelist/tablelist_tile.tcl | 2 +- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/modules/tablelist/COPYRIGHT.txt b/modules/tablelist/COPYRIGHT.txt index 388575f1..8af18bd7 100644 --- a/modules/tablelist/COPYRIGHT.txt +++ b/modules/tablelist/COPYRIGHT.txt @@ -1,4 +1,4 @@ -Multi-column listbox and tree widget package Tablelist, version 6.0.1 +Multi-column listbox and tree widget package Tablelist, version 6.1 Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) This library is free software; you can use, modify, and redistribute it diff --git a/modules/tablelist/README.txt b/modules/tablelist/README.txt index 7a6b81f1..b40dbf4c 100644 --- a/modules/tablelist/README.txt +++ b/modules/tablelist/README.txt @@ -88,8 +88,8 @@ How to Get It? -------------- Tablelist is available for free download from the same URL as Wcb. The -distribution file is "tablelist6.0.1.tar.gz" for UNIX and -"tablelist6_0_1.zip" for Windows. These files contain the same +distribution file is "tablelist6.1.tar.gz" for UNIX and +"tablelist6_1.zip" for Windows. These files contain the same information, except for the additional carriage return character preceding the linefeed at the end of each line in the text files for Windows. @@ -108,16 +108,16 @@ locations of these library directories are given by the "tcl_library" and "tk_library" variables, respectively. To install Tablelist on UNIX, "cd" to the desired directory and unpack -the distribution file "tablelist6.0.1.tar.gz": +the distribution file "tablelist6.1.tar.gz": - gunzip -c tablelist6.0.1.tar.gz | tar -xf - + gunzip -c tablelist6.1.tar.gz | tar -xf - -This command will create a directory named "tablelist6.0.1 with the +This command will create a directory named "tablelist6.1 with the subdirectories "demos", "doc", and "scripts". On Windows, use WinZip or some other program capable of unpacking the -distribution file "tablelist6_0_1.zip" into the directory -"tablelist6.0.1", with the subdirectories "demos", "doc", and "scripts". +distribution file "tablelist6_1.zip" into the directory "tablelist6.1", +with the subdirectories "demos", "doc", and "scripts". The file "tablelistEdit.tcl" in the "scripts" directory is only needed for applications making use of interactive cell editing. Similarly, the diff --git a/modules/tablelist/pkgIndex.tcl b/modules/tablelist/pkgIndex.tcl index ae9883cf..de067032 100644 --- a/modules/tablelist/pkgIndex.tcl +++ b/modules/tablelist/pkgIndex.tcl @@ -7,22 +7,22 @@ # # Regular packages: # -package ifneeded tablelist 6.0.1 \ +package ifneeded tablelist 6.1 \ [list source [file join $dir tablelist.tcl]] -package ifneeded tablelist_tile 6.0.1 \ +package ifneeded tablelist_tile 6.1 \ [list source [file join $dir tablelist_tile.tcl]] # # Aliases: # -package ifneeded Tablelist 6.0.1 \ - [list package require -exact tablelist 6.0.1] -package ifneeded Tablelist_tile 6.0.1 \ - [list package require -exact tablelist_tile 6.0.1] +package ifneeded Tablelist 6.1 \ + [list package require -exact tablelist 6.1] +package ifneeded Tablelist_tile 6.1 \ + [list package require -exact tablelist_tile 6.1] # # Code common to all packages: # -package ifneeded tablelist::common 6.0.1 \ +package ifneeded tablelist::common 6.1 \ "namespace eval ::tablelist { proc DIR {} {return [list $dir]} } ;\ source [list [file join $dir tablelistPublic.tcl]]" diff --git a/modules/tablelist/tablelist.tcl b/modules/tablelist/tablelist.tcl index dd8784f7..3ebeadff 100644 --- a/modules/tablelist/tablelist.tcl +++ b/modules/tablelist/tablelist.tcl @@ -6,7 +6,7 @@ package require Tcl 8 package require Tk 8 -package require -exact tablelist::common 6.0.1 +package require -exact tablelist::common 6.1 package provide tablelist $::tablelist::version package provide Tablelist $::tablelist::version diff --git a/modules/tablelist/tablelistPublic.tcl b/modules/tablelist/tablelistPublic.tcl index f64a735b..7854eac7 100644 --- a/modules/tablelist/tablelistPublic.tcl +++ b/modules/tablelist/tablelistPublic.tcl @@ -24,7 +24,7 @@ namespace eval ::tablelist { # # Public variables: # - variable version 6.0.1 + variable version 6.1 variable library if {$tcl_version >= 8.4} { set library [file normalize [DIR]] diff --git a/modules/tablelist/tablelist_tile.tcl b/modules/tablelist/tablelist_tile.tcl index 8ef39fde..dc7509e3 100644 --- a/modules/tablelist/tablelist_tile.tcl +++ b/modules/tablelist/tablelist_tile.tcl @@ -9,7 +9,7 @@ package require Tk 8.4 if {$::tk_version < 8.5 || [regexp {^8\.5a[1-5]$} $::tk_patchLevel]} { package require tile 0.6 } -package require -exact tablelist::common 6.0.1 +package require -exact tablelist::common 6.1 package provide tablelist_tile $::tablelist::version package provide Tablelist_tile $::tablelist::version From 1ee6dbafdb62e13f45f14d22821f80f40b4245db Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 5 Mar 2018 14:05:50 +0000 Subject: [PATCH 043/150] * CHANGES.txt: Updated to reflect the changes. --- modules/tablelist/CHANGES.txt | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/modules/tablelist/CHANGES.txt b/modules/tablelist/CHANGES.txt index 945dfa78..3fe325d8 100644 --- a/modules/tablelist/CHANGES.txt +++ b/modules/tablelist/CHANGES.txt @@ -1,12 +1,19 @@ -What is new in Tablelist 6.0.1? -------------------------------- - -This is a bugfix-only release. The only corrected file in the -"scripts" directory is "tablelistUtil.tcl": inserted the missing close -bracket in line #6448. This fix eliminates a regression related to both -temporarily and persistently embedded Tk checkbuttons on Windows, -introduced in the previous Tablelist version (thanks to Johann -Oberdorfer and Jyrki Majamaeki for their bug reports). +What is new in Tablelist 6.1? +----------------------------- + +1. Added the "-imagebackground" cell configuration option, useful for + embedded images having (partially) transparent regions (thanks to + Jose Luis Lijo for his proposal). + +2. Extended the description of the "bodytag" subcommand in the + reference manual by examples showing how to register the body of a + tablelist widget as a drag source in such a way that the drag works + also for the separators, multi-line cells, and embedded images. + +3. Eliminated a regression related to both temporarily and persistently + embedded Tk checkbuttons on Windows, introduced in the previous + Tablelist version (thanks to Johann Oberdorfer, Jyrki Majamaeki, and + Ralf Fassel for their bug reports). What was new in Tablelist 6.0? ------------------------------ From 749a2879254c16e25f193679fc153ff938b7ee27 Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 5 Mar 2018 14:36:07 +0000 Subject: [PATCH 044/150] * scripts/*.tcl: Added the "-imagebackground" cell configuration option; updated the copyright information. --- modules/tablelist/scripts/mwutil.tcl | 2 +- modules/tablelist/scripts/repair.tcl | 2 +- modules/tablelist/scripts/tablelistBind.tcl | 2 +- modules/tablelist/scripts/tablelistConfig.tcl | 26 ++++++++++++++++--- modules/tablelist/scripts/tablelistEdit.tcl | 2 +- modules/tablelist/scripts/tablelistImages.tcl | 2 +- modules/tablelist/scripts/tablelistMove.tcl | 2 +- modules/tablelist/scripts/tablelistSort.tcl | 2 +- modules/tablelist/scripts/tablelistThemes.tcl | 2 +- modules/tablelist/scripts/tablelistUtil.tcl | 16 +++++++++--- modules/tablelist/scripts/tablelistWidget.tcl | 11 +++++--- 11 files changed, 51 insertions(+), 18 deletions(-) diff --git a/modules/tablelist/scripts/mwutil.tcl b/modules/tablelist/scripts/mwutil.tcl index 704f9345..45e4c9c0 100644 --- a/modules/tablelist/scripts/mwutil.tcl +++ b/modules/tablelist/scripts/mwutil.tcl @@ -5,7 +5,7 @@ # - Namespace initialization # - Public utility procedures # -# Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== package require Tcl 8 diff --git a/modules/tablelist/scripts/repair.tcl b/modules/tablelist/scripts/repair.tcl index c6ef4557..aa43be53 100755 --- a/modules/tablelist/scripts/repair.tcl +++ b/modules/tablelist/scripts/repair.tcl @@ -10,7 +10,7 @@ # 8.4a2), which causes excessive memory use when calling "info exists" on # non-existent array elements. # -# Copyright (c) 2001-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2001-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== set procDef { diff --git a/modules/tablelist/scripts/tablelistBind.tcl b/modules/tablelist/scripts/tablelistBind.tcl index 8430e6bb..64072a13 100644 --- a/modules/tablelist/scripts/tablelistBind.tcl +++ b/modules/tablelist/scripts/tablelistBind.tcl @@ -9,7 +9,7 @@ # - Binding tag TablelistHeader # - Binding tags TablelistLabel, TablelistSubLabel, and TablelistArrow # -# Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # diff --git a/modules/tablelist/scripts/tablelistConfig.tcl b/modules/tablelist/scripts/tablelistConfig.tcl index aad37ec3..0626b77e 100644 --- a/modules/tablelist/scripts/tablelistConfig.tcl +++ b/modules/tablelist/scripts/tablelistConfig.tcl @@ -1,7 +1,7 @@ #============================================================================== # Contains private configuration procedures for tablelist widgets. # -# Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== #------------------------------------------------------------------------------ @@ -3228,6 +3228,27 @@ proc tablelist::doCellConfig {row col win opt val} { 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} { + if {[info exists data($name)]} { + unset data($name) + } + } else { + set data($name) $val + } + + if {!$data(isDisabled)} { + ${p}updateColorsWhenIdle $win + } + } + -indent { if {$data(isDisabled)} { return "" @@ -3842,8 +3863,7 @@ proc tablelist::doCellConfig {row col win opt val} { updateViewWhenIdle $win } - -windowdestroy - - -windowupdate { + -windowdestroy { set key [lindex $data(${p}keyList) $row] set name $key,$col$opt diff --git a/modules/tablelist/scripts/tablelistEdit.tcl b/modules/tablelist/scripts/tablelistEdit.tcl index 7d7c30a7..6b325fab 100644 --- a/modules/tablelist/scripts/tablelistEdit.tcl +++ b/modules/tablelist/scripts/tablelistEdit.tcl @@ -7,7 +7,7 @@ # - Private procedures implementing the interactive cell editing # - Private procedures used in bindings related to interactive cell editing # -# Copyright (c) 2003-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2003-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # diff --git a/modules/tablelist/scripts/tablelistImages.tcl b/modules/tablelist/scripts/tablelistImages.tcl index cd29d3ce..421f0eee 100644 --- a/modules/tablelist/scripts/tablelistImages.tcl +++ b/modules/tablelist/scripts/tablelistImages.tcl @@ -3,7 +3,7 @@ # argument w specifies a canvas displaying a sort arrow, while the argument win # stands for a tablelist widget. # -# Copyright (c) 2006-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2006-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== #------------------------------------------------------------------------------ diff --git a/modules/tablelist/scripts/tablelistMove.tcl b/modules/tablelist/scripts/tablelistMove.tcl index 174b3dc3..a64f5384 100644 --- a/modules/tablelist/scripts/tablelistMove.tcl +++ b/modules/tablelist/scripts/tablelistMove.tcl @@ -1,7 +1,7 @@ #============================================================================== # Contains the implementation of the tablelist move and movecolumn subcommands. # -# Copyright (c) 2003-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2003-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== #------------------------------------------------------------------------------ diff --git a/modules/tablelist/scripts/tablelistSort.tcl b/modules/tablelist/scripts/tablelistSort.tcl index d07fe0fb..7e748003 100644 --- a/modules/tablelist/scripts/tablelistSort.tcl +++ b/modules/tablelist/scripts/tablelistSort.tcl @@ -7,7 +7,7 @@ # - Public procedures related to sorting # - Private procedures implementing the sorting # -# Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # diff --git a/modules/tablelist/scripts/tablelistThemes.tcl b/modules/tablelist/scripts/tablelistThemes.tcl index 4b0bc4f0..402bb0f1 100644 --- a/modules/tablelist/scripts/tablelistThemes.tcl +++ b/modules/tablelist/scripts/tablelistThemes.tcl @@ -8,7 +8,7 @@ # - Private procedures performing RGB <-> HSV conversions # - Private procedures related to global KDE configuration options # -# Copyright (c) 2005-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2005-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # diff --git a/modules/tablelist/scripts/tablelistUtil.tcl b/modules/tablelist/scripts/tablelistUtil.tcl index 1e5b3a80..cad1768a 100644 --- a/modules/tablelist/scripts/tablelistUtil.tcl +++ b/modules/tablelist/scripts/tablelistUtil.tcl @@ -3856,11 +3856,15 @@ proc tablelist::updateColors {win {fromTextIdx ""} {toTextIdx ""}} { # Set the widget's background and foreground # colors to those of the containing cell # + set isImgLabel [expr {[string compare $path $w.img_$key,$col] == 0}] if {$data(isDisabled)} { set bg $data(-background) set fg $data(-disabledforeground) } elseif {$selected} { - if {[info exists data($key,$col-selectbackground)]} { + if {$isImgLabel && + [info exists data($key,$col-imagebackground)]} { + set bg $data($key,$col-imagebackground) + } elseif {[info exists data($key,$col-selectbackground)]} { set bg $data($key,$col-selectbackground) } elseif {[info exists data($key-selectbackground)]} { set bg $data($key-selectbackground) @@ -3882,7 +3886,10 @@ proc tablelist::updateColors {win {fromTextIdx ""} {toTextIdx ""}} { } } } else { - if {[info exists data($key,$col-background)]} { + if {$isImgLabel && + [info exists data($key,$col-imagebackground)]} { + set bg $data($key,$col-imagebackground) + } elseif {[info exists data($key,$col-background)]} { set bg $data($key,$col-background) } elseif {[info exists data($key-background)]} { set bg $data($key-background) @@ -4052,7 +4059,10 @@ proc tablelist::hdr_updateColors win { set bg $data(-background) set fg $data(-disabledforeground) } else { - if {[info exists data($key,$col-background)]} { + if {[string compare $path $w.img_$key,$col] == 0 && + [info exists data($key,$col-imagebackground)]} { + set bg $data($key,$col-imagebackground) + } elseif {[info exists data($key,$col-background)]} { set bg $data($key,$col-background) } elseif {[info exists data($key-background)]} { set bg $data($key-background) diff --git a/modules/tablelist/scripts/tablelistWidget.tcl b/modules/tablelist/scripts/tablelistWidget.tcl index 4f699622..8fdb7666 100644 --- a/modules/tablelist/scripts/tablelistWidget.tcl +++ b/modules/tablelist/scripts/tablelistWidget.tcl @@ -8,7 +8,7 @@ # - Private procedures implementing the tablelist widget command # - Private callback procedures # -# Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # @@ -363,6 +363,7 @@ namespace eval tablelist { -foreground {foreground Foreground } -fg -foreground -image {image Image } + -imagebackground {imageBackground Background } -selectbackground {selectBackground Foreground } -selectforeground {selectForeground Background } -stretchwindow {stretchWindow StretchWindow } @@ -398,6 +399,7 @@ namespace eval tablelist { -foreground {foreground Foreground } -fg -foreground -image {image Image } + -imagebackground {imageBackground Background } -stretchwindow {stretchWindow StretchWindow } -text {text Text } -valign {valign Valign } @@ -6853,8 +6855,9 @@ proc tablelist::deleteRows {win first last updateListVar} { for {set col 0} {$col < $data(colCount)} {incr col} { foreach opt {-background -foreground -editable -editwindow - -selectbackground -selectforeground -valign - -windowdestroy -windowupdate} { + -imagebackground -selectbackground + -selectforeground -valign -windowdestroy + -windowupdate} { if {[info exists data($key,$col$opt)]} { unset data($key,$col$opt) } @@ -7081,7 +7084,7 @@ proc tablelist::hdr_deleteRows {win first last} { } for {set col 0} {$col < $data(colCount)} {incr col} { - foreach opt {-background -foreground -font -image + foreach opt {-background -foreground -font -image -imagebackground -valign -windowdestroy -windowupdate} { if {[info exists data($key,$col$opt)]} { unset data($key,$col$opt) From c79e4b8dac6c335a776d320e0ab8c354c744c711 Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 5 Mar 2018 14:37:06 +0000 Subject: [PATCH 045/150] * doc/*.html: Updated to reflect the changes; more on the "bodytag" subcommand in connection with embedded images etc. as drag sources. --- modules/tablelist/doc/index.html | 5 +- modules/tablelist/doc/tablelist.html | 47 ++++--- modules/tablelist/doc/tablelistBWidget.html | 2 +- modules/tablelist/doc/tablelistBinding.html | 2 +- modules/tablelist/doc/tablelistColSort.html | 2 +- modules/tablelist/doc/tablelistCombobox.html | 2 +- modules/tablelist/doc/tablelistCtext.html | 2 +- modules/tablelist/doc/tablelistIwidgets.html | 2 +- modules/tablelist/doc/tablelistMentry.html | 2 +- modules/tablelist/doc/tablelistThemes.html | 2 +- modules/tablelist/doc/tablelistTile.html | 2 +- modules/tablelist/doc/tablelistTkCore.html | 2 +- modules/tablelist/doc/tablelistWidget.html | 133 +++++++++++++++++-- 13 files changed, 158 insertions(+), 47 deletions(-) diff --git a/modules/tablelist/doc/index.html b/modules/tablelist/doc/index.html index bab5efde..f60e76ae 100644 --- a/modules/tablelist/doc/index.html +++ b/modules/tablelist/doc/index.html @@ -1,7 +1,6 @@ - The Multi-Column Listbox and Tree Widget Package Tablelist - 6.0.1 + The Multi-Column Listbox and Tree Widget Package Tablelist 6.1
    -

    The Multi-Column Listbox and Tree Widget Package Tablelist 6.0.1

    +

    The Multi-Column Listbox and Tree Widget Package Tablelist 6.1

    by

    diff --git a/modules/tablelist/doc/tablelist.html b/modules/tablelist/doc/tablelist.html index 3237a6c6..cedcd097 100644 --- a/modules/tablelist/doc/tablelist.html +++ b/modules/tablelist/doc/tablelist.html @@ -13,7 +13,7 @@

    Tablelist Programmer's Guide

    -

    For Tablelist Version 6.0.1

    +

    For Tablelist Version 6.1

    by

    @@ -170,11 +170,10 @@

    What Is Tablelist?

    How to Get It?

    Tablelist is available for free download from the same URL as Wcb.  - The distribution file is tablelist6.0.1.tar.gz for UNIX and - tablelist6_0_1.zip for Windows.  These files contain the - same information, except for the additional carriage return character - preceding the linefeed at the end of each line in the text files for - Windows.

    + The distribution file is tablelist6.1.tar.gz for UNIX and + tablelist6_1.zip for Windows.  These files contain the same + information, except for the additional carriage return character preceding + the linefeed at the end of each line in the text files for Windows.

    Tablelist is also included in tklib, which has the address

    @@ -195,21 +194,21 @@

    How to Install It?

    To install Tablelist on UNIX, cd to the desired directory and unpack the distribution file - tablelist6.0.1.tar.gz:

    + tablelist6.1.tar.gz:

    -gunzip -c tablelist6.0.1.tar.gz | tar -xf -
    +gunzip -c tablelist6.1.tar.gz | tar -xf -
     
    -

    This command will create a directory named tablelist6.0.1, - with the subdirectories demos, doc, and +

    This command will create a directory named tablelist6.1, with + the subdirectories demos, doc, and scripts.

    On Windows, use WinZip or some other program capable of unpacking - the distribution file tablelist6_0_1.zip into the directory - tablelist6.0.1, with the subdirectories demos, + the distribution file tablelist6_1.zip into the directory + tablelist6.1, with the subdirectories demos, doc, and scripts.

    The file tablelistEdit.tcl in the scripts @@ -306,14 +305,14 @@

    How to Use It?

    tablelist and tablelist_tile.

    REMARK:  If you have an earlier Tablelist version as part of - ActiveTcl 8.5 or above and the new Tablelist release 6.0, then it is highly - recommended to specify the version number 6.0 in the  + ActiveTcl 8.5 or above and the new Tablelist release 6.1, then it is highly + recommended to specify the version number 6.1 in the  package require  command, because otherwise the interpreter will load the old Tablelist version included in ActiveTcl as Tcl Module.  The examples below use the - statement  package require tablelist 6.0,  and their + statement  package require tablelist 6.1,  and their tile-based counterparts invoke the command  package require - tablelist_tile 6.0.

    + tablelist_tile 6.1.

    Since the packages Tablelist and Tablelist_tile are implemented in the tablelist namespace, you must either invoke the

    @@ -500,7 +499,7 @@

    A tablelist Widget for Displaying and Editing
    -package require tablelist 6.0
    +package require tablelist 6.1
     source [file join $tablelist::library demos config.tcl]
     
    @@ -556,7 +555,7 @@

    A tablelist Widget for Displaying and Editing
    -package require tablelist 6.0
    +package require tablelist 6.1
     
     namespace eval demo {
         #
    @@ -1034,7 +1033,7 @@ 

    Two Widget Browsers Based on a tablelist

     package require Tk 8.3
    -package require tablelist 6.0
    +package require tablelist 6.1
     
     namespace eval demo {
         variable dir [file dirname [info script]]
    @@ -1632,7 +1631,7 @@ 

    A Directory Viewer Based on a tablelist

     package require Tk 8.3
    -package require tablelist 6.0
    +package require tablelist 6.1
     
     #
     # Add some entries to the Tk option database
    @@ -2020,7 +2019,7 @@ 

    Advanced Interactive tablelist Cell Editing

     package require Tk 8.4                          ;# because of "-compound"
    -package require tablelist 6.0
    +package require tablelist 6.1
     package require BWidget
     
     wm title . "Serial Line Configuration"
    @@ -2384,7 +2383,7 @@ 

    A tablelist Widget Containing Embedded Windows

    -package require tablelist 6.0
    +package require tablelist 6.1
     
     wm title . "Tk Library Scripts"
     
    @@ -2639,7 +2638,7 @@ 

    Tile-Based Demo Scripts

     package require Tk 8.3                          ;# because of entry validation
    -package require tablelist 6.0
    +package require tablelist 6.1
     
    @@ -2647,7 +2646,7 @@

    Tile-Based Demo Scripts

    -package require tablelist_tile 6.0
    +package require tablelist_tile 6.1
     
    diff --git a/modules/tablelist/doc/tablelistBWidget.html b/modules/tablelist/doc/tablelistBWidget.html index 7b60f92a..9bc5bdcc 100644 --- a/modules/tablelist/doc/tablelistBWidget.html +++ b/modules/tablelist/doc/tablelistBWidget.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using the BWidget Package

    -

    For Tablelist Version 6.0

    +

    For Tablelist Version 6.1

    by

    diff --git a/modules/tablelist/doc/tablelistBinding.html b/modules/tablelist/doc/tablelistBinding.html index 272c7ca4..89cff69b 100644 --- a/modules/tablelist/doc/tablelistBinding.html +++ b/modules/tablelist/doc/tablelistBinding.html @@ -12,7 +12,7 @@

    Commands Related to Binding Scripts

    -

    For Tablelist Version 6.0

    +

    For Tablelist Version 6.1

    by

    diff --git a/modules/tablelist/doc/tablelistColSort.html b/modules/tablelist/doc/tablelistColSort.html index 3c5588cf..f92f0acd 100644 --- a/modules/tablelist/doc/tablelistColSort.html +++ b/modules/tablelist/doc/tablelistColSort.html @@ -12,7 +12,7 @@

    Commands for Interactive Sorting by One or More Columns

    -

    For Tablelist Version 6.0

    +

    For Tablelist Version 6.1

    by

    diff --git a/modules/tablelist/doc/tablelistCombobox.html b/modules/tablelist/doc/tablelistCombobox.html index c28b57e8..1d921e3a 100644 --- a/modules/tablelist/doc/tablelistCombobox.html +++ b/modules/tablelist/doc/tablelistCombobox.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using the combobox Package

    -

    For Tablelist Version 6.0

    +

    For Tablelist Version 6.1

    by

    diff --git a/modules/tablelist/doc/tablelistCtext.html b/modules/tablelist/doc/tablelistCtext.html index fe5953c1..fa2644f0 100644 --- a/modules/tablelist/doc/tablelistCtext.html +++ b/modules/tablelist/doc/tablelistCtext.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using the ctext Package

    -

    For Tablelist Version 6.0

    +

    For Tablelist Version 6.1

    by

    diff --git a/modules/tablelist/doc/tablelistIwidgets.html b/modules/tablelist/doc/tablelistIwidgets.html index bfc4cc5c..2a4cd6d0 100644 --- a/modules/tablelist/doc/tablelistIwidgets.html +++ b/modules/tablelist/doc/tablelistIwidgets.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using the Iwidgets Package

    -

    For Tablelist Version 6.0

    +

    For Tablelist Version 6.1

    by

    diff --git a/modules/tablelist/doc/tablelistMentry.html b/modules/tablelist/doc/tablelistMentry.html index a0309e05..90b6e50b 100644 --- a/modules/tablelist/doc/tablelistMentry.html +++ b/modules/tablelist/doc/tablelistMentry.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using the Mentry Package

    -

    For Tablelist Version 6.0

    +

    For Tablelist Version 6.1

    by

    diff --git a/modules/tablelist/doc/tablelistThemes.html b/modules/tablelist/doc/tablelistThemes.html index 6ad8ecd5..1fe465c9 100644 --- a/modules/tablelist/doc/tablelistThemes.html +++ b/modules/tablelist/doc/tablelistThemes.html @@ -12,7 +12,7 @@

    Commands Related to Tile Themes

    -

    For Tablelist Version 6.0

    +

    For Tablelist Version 6.1

    by

    diff --git a/modules/tablelist/doc/tablelistTile.html b/modules/tablelist/doc/tablelistTile.html index 0fae1092..21c468ce 100644 --- a/modules/tablelist/doc/tablelistTile.html +++ b/modules/tablelist/doc/tablelistTile.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using Tile Widgets

    -

    For Tablelist Version 6.0

    +

    For Tablelist Version 6.1

    by

    diff --git a/modules/tablelist/doc/tablelistTkCore.html b/modules/tablelist/doc/tablelistTkCore.html index ce9855b1..22a594d0 100644 --- a/modules/tablelist/doc/tablelistTkCore.html +++ b/modules/tablelist/doc/tablelistTkCore.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using Tk Core Widgets

    -

    For Tablelist Version 6.0

    +

    For Tablelist Version 6.1

    by

    diff --git a/modules/tablelist/doc/tablelistWidget.html b/modules/tablelist/doc/tablelistWidget.html index 8b0504f8..61d8a60a 100644 --- a/modules/tablelist/doc/tablelistWidget.html +++ b/modules/tablelist/doc/tablelistWidget.html @@ -13,7 +13,7 @@

    The tablelist::tablelist Command

    -

    For Tablelist Version 6.0

    +

    For Tablelist Version 6.1

    by

    @@ -482,6 +482,9 @@

    Quick Reference

    -image image
    +
    -imagebackground + color
    +
    -selectbackground color
    @@ -521,6 +524,9 @@

    Quick Reference

    -image image
    +
    -imagebackground + color
    +
    -stretchwindow boolean
    @@ -2274,7 +2280,7 @@

    Detailed Reference

    rows.  The default is 1.

    REMARK 1:  The default value true of this option makes - he item insertion and sorting significantly faster, especially in the + the item insertion and sorting significantly faster, especially in the presence of static-width columns, because the snipping of elements that don't fit into their cells will be postponed to the time when they get displayed in the body text widget.  On the other hand, this @@ -6340,16 +6346,42 @@

    Detailed Reference

    option will be ignored.
    To display an image in a cell, Tablelist makes use of an - embedded label widget (which is created on demand).  This requires - more memory than inserting the image directly into the tablelist's - body, but has the main advantage of making it possible to adjust the - width of the label containing the widget to fit into its column.  - This has the visual effect of cutting off part of the image from its - right side.  To make sure that images with transparent background - will be displayed correctly, the background color of the label widgets - containing the embedded images is automatically updated whenever + embedded label widget (which is created on demand).  This has the + main advantage of making it possible to adjust the width of the label + containing the image to fit into its column.  This has the visual + effect of cutting off part of the image from its right side.  The + above-mentioned gap to the left or right of the image is also part of + this label.  To make sure that an image with fully or partially + transparent background will be displayed correctly, the background + color of the label widget containing the embedded image is + automatically synchronized with the cell's background color whenever + necessary (e.g., when selecting or deselecting the cell's content, or + changing its background color), provided that the -imagebackground option was not + set or its value is an empty string.  This automatic color + synchronization makes also sure that the gap between the text and the + image is displayed in the right color.
    + +
    -imagebackground + color
    + +
    Specifies the background color of the label widget containing the + embedded image (if any).  If the value of this option is a valid + nonempty color specification then the fully transparent pixels of the + embedded image will appear in the specified color, and the partially + transparent ones will be shown modified according to their alpha + value and the image background color.  The default value is an + empty string, meaning that the background color of the label widget + containing the embedded image will be automatically updated whenever necessary.
    +
    REMARK:  This option works fine if the + cell's text (or at least the latter's formatted version) is an empty string.  + Otherwise there will be a gap between the text and the image, and this + gap will appear in the specified image background color if the latter + is a nonempty string.
    +
    -selectbackground color
    @@ -6555,6 +6587,13 @@

    Detailed Reference

    cell.  The details are the same as for a cell in the tablelist body. +
    + -imagebackground color
    + +
    Specifies the background color of the label widget containing the + embedded image (if any).  The details are the same as for a cell in the tablelist body.
    +
    -stretchwindow boolean
    @@ -7796,6 +7835,80 @@

    Detailed Reference

    handling scripts that are valid not only for the tablelist's body but also for the separators, multi-line cells, and embedded images. +
    For example, to register the body of a tablelist widget + $tbl as a drag source for mouse button 1 in such a way + that the drag works also for the separators, multi-line cells, and + embedded images, you can proceed like in the following code samples: + +
    + TkDND EXAMPLE: + +
    +
    +package require tkdnd 2.7
    +
    +bind [$tbl bodytag] <Button-1> { registerDragSrc %W }
    +
    +proc registerDragSrc w {
    +    # $w can be the tablelist's body, a separator, a message widget
    +    # displaying a multi-line element, or a label widget displaying an
    +    # image.  Register this widget as a drag source for mouse button 1
    +    tkdnd::drag_source register $w DND_Text 1
    +    bind $w <<DragInitCmd>> { onTblDragInit %W }
    +    bind $w <<DragEndCmd>>  { onTblDragEnd %W %A }
    +}
    +
    +proc onTblDragInit w {
    +    set tbl [tablelist::getTablelistPath $w]
    +    . . .
    +}
    +
    +proc onTblDragEnd {w action} {
    +    if {![string equal $action "refuse_drop"]} {        ;# drop accepted
    +        set tbl [tablelist::getTablelistPath $w]
    +        . . .
    +    }
    +}
    +
    +
    +
    + +
    + BWidget EXAMPLE: + +
    +
    +package require BWidget
    +
    +bind [$tbl bodytag] <Button-1> { registerDragSrc %W }
    +
    +proc registerDragSrc w {
    +    # $w can be the tablelist's body, a separator, a message widget
    +    # displaying a multi-line element, or a label widget displaying an
    +    # image.  Register this widget as a drag source for mouse button 1
    +    DragSite::register $w -dragevent 1 \
    +        -draginitcmd tblDragInitCmd -dragendcmd tblDragEndCmd
    +}
    +
    +proc tblDragInitCmd {dragSrc rootX rootY top} {
    +    set tbl [tablelist::getTablelistPath $dragSrc]
    +    . . .
    +}
    +
    +proc tblDragEndCmd {dragSrc dropTarget op dataType data result} {
    +    if {$result != 0} {                                 ;# drop accepted
    +        set tbl [tablelist::getTablelistPath $dragSrc]
    +        . . .
    +    }
    +}
    +
    +
    +
    +
    pathName canceledediting
    From d17bd7da34299947e04a25463c9d1ffd7da14bee Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 5 Mar 2018 14:38:07 +0000 Subject: [PATCH 046/150] * *.tcl: Bumped the version number to 6.1; * COPYRIGHT.txt: updated the copyright information. * README.txt: * ../../examples/tablelist/*.tcl: --- examples/tablelist/browse.tcl | 4 ++-- examples/tablelist/browseTree.tcl | 4 ++-- examples/tablelist/browseTree_tile.tcl | 4 ++-- examples/tablelist/browse_tile.tcl | 4 ++-- examples/tablelist/bwidget.tcl | 4 ++-- examples/tablelist/bwidget_tile.tcl | 4 ++-- examples/tablelist/config.tcl | 4 ++-- examples/tablelist/config_tile.tcl | 4 ++-- examples/tablelist/dirViewer.tcl | 4 ++-- examples/tablelist/dirViewer_tile.tcl | 4 ++-- examples/tablelist/embeddedWindows.tcl | 4 ++-- examples/tablelist/embeddedWindows_tile.tcl | 4 ++-- examples/tablelist/images.tcl | 2 +- examples/tablelist/iwidgets.tcl | 4 ++-- examples/tablelist/iwidgets_tile.tcl | 4 ++-- examples/tablelist/miscWidgets.tcl | 4 ++-- examples/tablelist/miscWidgets_tile.tcl | 4 ++-- examples/tablelist/option.tcl | 2 +- examples/tablelist/option_tile.tcl | 2 +- examples/tablelist/styles.tcl | 4 ++-- examples/tablelist/styles_tile.tcl | 4 ++-- examples/tablelist/tileWidgets.tcl | 4 ++-- 22 files changed, 41 insertions(+), 41 deletions(-) diff --git a/examples/tablelist/browse.tcl b/examples/tablelist/browse.tcl index 1dbb8ca3..6916b8d9 100644 --- a/examples/tablelist/browse.tcl +++ b/examples/tablelist/browse.tcl @@ -2,10 +2,10 @@ # Demonstrates how to use a tablelist widget for displaying information about # the children of an arbitrary widget. # -# Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist 6.0 +package require tablelist 6.1 namespace eval demo { variable dir [file dirname [info script]] diff --git a/examples/tablelist/browseTree.tcl b/examples/tablelist/browseTree.tcl index a7cefa3d..51a10b51 100644 --- a/examples/tablelist/browseTree.tcl +++ b/examples/tablelist/browseTree.tcl @@ -2,11 +2,11 @@ # Demonstrates how to use a tablelist widget for displaying information about # the children of an arbitrary widget. # -# Copyright (c) 2010-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2010-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== package require Tk 8.3 -package require tablelist 6.0 +package require tablelist 6.1 namespace eval demo { variable dir [file dirname [info script]] diff --git a/examples/tablelist/browseTree_tile.tcl b/examples/tablelist/browseTree_tile.tcl index 285355d9..f7edd18d 100644 --- a/examples/tablelist/browseTree_tile.tcl +++ b/examples/tablelist/browseTree_tile.tcl @@ -2,10 +2,10 @@ # Demonstrates how to use a tablelist widget for displaying information about # the children of an arbitrary widget. # -# Copyright (c) 2010-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2010-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.0 +package require tablelist_tile 6.1 namespace eval demo { variable dir [file dirname [info script]] diff --git a/examples/tablelist/browse_tile.tcl b/examples/tablelist/browse_tile.tcl index 64a51fa1..95170fa8 100644 --- a/examples/tablelist/browse_tile.tcl +++ b/examples/tablelist/browse_tile.tcl @@ -2,10 +2,10 @@ # Demonstrates how to use a tablelist widget for displaying information about # children of an arbitrary widget. # -# Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.0 +package require tablelist_tile 6.1 namespace eval demo { variable dir [file dirname [info script]] diff --git a/examples/tablelist/bwidget.tcl b/examples/tablelist/bwidget.tcl index 2316edaf..0d31b915 100755 --- a/examples/tablelist/bwidget.tcl +++ b/examples/tablelist/bwidget.tcl @@ -5,11 +5,11 @@ # widgets from the BWidget package and of the Tk core checkbutton and # menubutton widgets. # -# Copyright (c) 2004-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2004-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== package require Tk 8.4 ;# because of "-compound" -package require tablelist 6.0 +package require tablelist 6.1 package require BWidget wm title . "Serial Line Configuration" diff --git a/examples/tablelist/bwidget_tile.tcl b/examples/tablelist/bwidget_tile.tcl index 302bc7f9..09f918b4 100755 --- a/examples/tablelist/bwidget_tile.tcl +++ b/examples/tablelist/bwidget_tile.tcl @@ -5,10 +5,10 @@ # widgets from the BWidget package and of the Tk core checkbutton and # menubutton widgets. # -# Copyright (c) 2004-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2004-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.0 +package require tablelist_tile 6.1 package require BWidget wm title . "Serial Line Configuration" diff --git a/examples/tablelist/config.tcl b/examples/tablelist/config.tcl index ef3ba62d..c306cad1 100644 --- a/examples/tablelist/config.tcl +++ b/examples/tablelist/config.tcl @@ -2,10 +2,10 @@ # Demonstrates how to use a tablelist widget for displaying and editing the # configuration options of an arbitrary widget. # -# Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist 6.0 +package require tablelist 6.1 namespace eval demo { # diff --git a/examples/tablelist/config_tile.tcl b/examples/tablelist/config_tile.tcl index 64ccf105..b21e5bbd 100644 --- a/examples/tablelist/config_tile.tcl +++ b/examples/tablelist/config_tile.tcl @@ -2,10 +2,10 @@ # Demonstrates how to use a tablelist widget for displaying and editing the # configuration options of an arbitrary widget. # -# Copyright (c) 2000-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.0 +package require tablelist_tile 6.1 namespace eval demo { # diff --git a/examples/tablelist/dirViewer.tcl b/examples/tablelist/dirViewer.tcl index 1da8ece7..09e53e02 100755 --- a/examples/tablelist/dirViewer.tcl +++ b/examples/tablelist/dirViewer.tcl @@ -4,11 +4,11 @@ # Demonstrates how to use a tablelist widget for displaying the content of a # directory. # -# Copyright (c) 2010-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2010-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== package require Tk 8.3 -package require tablelist 6.0 +package require tablelist 6.1 # # Add some entries to the Tk option database diff --git a/examples/tablelist/dirViewer_tile.tcl b/examples/tablelist/dirViewer_tile.tcl index 3e12e318..f6eeab3a 100755 --- a/examples/tablelist/dirViewer_tile.tcl +++ b/examples/tablelist/dirViewer_tile.tcl @@ -4,10 +4,10 @@ # Demonstrates how to use a tablelist widget for displaying the content of a # directory. # -# Copyright (c) 2010-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2010-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.0 +package require tablelist_tile 6.1 # # Add some entries to the Tk option database diff --git a/examples/tablelist/embeddedWindows.tcl b/examples/tablelist/embeddedWindows.tcl index 8c23cb97..a4c710a1 100755 --- a/examples/tablelist/embeddedWindows.tcl +++ b/examples/tablelist/embeddedWindows.tcl @@ -3,10 +3,10 @@ #============================================================================== # Demonstrates the use of embedded windows in tablelist widgets. # -# Copyright (c) 2004-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2004-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist 6.0 +package require tablelist 6.1 wm title . "Tk Library Scripts" diff --git a/examples/tablelist/embeddedWindows_tile.tcl b/examples/tablelist/embeddedWindows_tile.tcl index c726269e..61af6b52 100755 --- a/examples/tablelist/embeddedWindows_tile.tcl +++ b/examples/tablelist/embeddedWindows_tile.tcl @@ -3,10 +3,10 @@ #============================================================================== # Demonstrates the use of embedded windows in tablelist widgets. # -# Copyright (c) 2004-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2004-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.0 +package require tablelist_tile 6.1 wm title . "Tile Library Scripts" diff --git a/examples/tablelist/images.tcl b/examples/tablelist/images.tcl index cf1616df..b34713fd 100644 --- a/examples/tablelist/images.tcl +++ b/examples/tablelist/images.tcl @@ -1,7 +1,7 @@ #============================================================================== # Creates some images. # -# Copyright (c) 2011-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2011-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # diff --git a/examples/tablelist/iwidgets.tcl b/examples/tablelist/iwidgets.tcl index 7e969bc0..887dc728 100755 --- a/examples/tablelist/iwidgets.tcl +++ b/examples/tablelist/iwidgets.tcl @@ -5,11 +5,11 @@ # widgets from the Iwidgets package and of the Tk core checkbutton and # menubutton widgets. # -# Copyright (c) 2004-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2004-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== package require Tk 8.4 ;# because of "-compound" -package require tablelist 6.0 +package require tablelist 6.1 if {[catch {package require iwidgets} result1] != 0 && [catch {package require Iwidgets} result2] != 0} { error "$result1; $result2" diff --git a/examples/tablelist/iwidgets_tile.tcl b/examples/tablelist/iwidgets_tile.tcl index 390a257e..660f8740 100755 --- a/examples/tablelist/iwidgets_tile.tcl +++ b/examples/tablelist/iwidgets_tile.tcl @@ -5,10 +5,10 @@ # widgets from the Iwidgets package and of the Tk core checkbutton and # menubutton widgets. # -# Copyright (c) 2004-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2004-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.0 +package require tablelist_tile 6.1 if {[catch {package require iwidgets} result1] != 0 && [catch {package require Iwidgets} result2] != 0} { error "$result1; $result2" diff --git a/examples/tablelist/miscWidgets.tcl b/examples/tablelist/miscWidgets.tcl index ad0bc826..d448c444 100755 --- a/examples/tablelist/miscWidgets.tcl +++ b/examples/tablelist/miscWidgets.tcl @@ -5,11 +5,11 @@ # Oakley's combobox, the mentry widgets of type "Date" and "Time", and of the # Tk core entry, spinbox, checkbutton, and menubutton widgets. # -# Copyright (c) 2004-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2004-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== package require Tk 8.4 ;# because of "-compound" and the spinbox widget -package require tablelist 6.0 +package require tablelist 6.1 package require combobox package require mentry diff --git a/examples/tablelist/miscWidgets_tile.tcl b/examples/tablelist/miscWidgets_tile.tcl index 6eedbf9b..99d25988 100755 --- a/examples/tablelist/miscWidgets_tile.tcl +++ b/examples/tablelist/miscWidgets_tile.tcl @@ -5,10 +5,10 @@ # Oakley's combobox, the mentry widgets of type "Date" and "Time", and of the # Tk core entry, spinbox, checkbutton, and menubutton widgets. # -# Copyright (c) 2004-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2004-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.0 +package require tablelist_tile 6.1 package require combobox package require mentry diff --git a/examples/tablelist/option.tcl b/examples/tablelist/option.tcl index 8c9aa406..a6092971 100644 --- a/examples/tablelist/option.tcl +++ b/examples/tablelist/option.tcl @@ -1,7 +1,7 @@ #============================================================================== # Contains some Tk option database settings. # -# Copyright (c) 2004-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2004-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # diff --git a/examples/tablelist/option_tile.tcl b/examples/tablelist/option_tile.tcl index 32b84c62..bd74d4cb 100644 --- a/examples/tablelist/option_tile.tcl +++ b/examples/tablelist/option_tile.tcl @@ -1,7 +1,7 @@ #============================================================================== # Contains some Tk option database settings. # -# Copyright (c) 2004-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2004-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # diff --git a/examples/tablelist/styles.tcl b/examples/tablelist/styles.tcl index 0d96ee1b..6eac549c 100755 --- a/examples/tablelist/styles.tcl +++ b/examples/tablelist/styles.tcl @@ -3,10 +3,10 @@ #============================================================================== # Demonstrates some ways of improving the look & feel of a tablelist widget. # -# Copyright (c) 2002-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2002-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist 6.0 +package require tablelist 6.1 wm title . "Tablelist Styles" diff --git a/examples/tablelist/styles_tile.tcl b/examples/tablelist/styles_tile.tcl index d8869780..48251e22 100755 --- a/examples/tablelist/styles_tile.tcl +++ b/examples/tablelist/styles_tile.tcl @@ -3,10 +3,10 @@ #============================================================================== # Demonstrates some ways of improving the look & feel of a tablelist widget. # -# Copyright (c) 2002-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2002-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.0 +package require tablelist_tile 6.1 wm title . "Tablelist Styles" diff --git a/examples/tablelist/tileWidgets.tcl b/examples/tablelist/tileWidgets.tcl index d028dec0..bc0f1b11 100755 --- a/examples/tablelist/tileWidgets.tcl +++ b/examples/tablelist/tileWidgets.tcl @@ -4,10 +4,10 @@ # Demonstrates the interactive tablelist cell editing with the aid of some # widgets from the tile package and of the Tk core spinbox widget. # -# Copyright (c) 2005-2017 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2005-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.0 +package require tablelist_tile 6.1 wm title . "Serial Line Configuration" From 619f70344571b401ab960a1f8106f6c9f8100cf6 Mon Sep 17 00:00:00 2001 From: csaba Date: Tue, 22 May 2018 15:06:01 +0000 Subject: [PATCH 047/150] * *.tcl: Bumped the version number to 6.2. * COPYRIGHT.txt: * README.txt: * ../../examples/tablelist/*.tcl: * CHANGES.txt: Updated to reflect the changes. * doc/*.html: * scripts/*.tcl: Added the "-labelvalign" column configuration option; the "collapse" and "expand" subcommands now accept a list of indices as first argument; significantly improved the overall performance of tablelist widgets containing a tree structure, embedded images, or multi-line cells; important improvements related to the scanning performance and behavior; changed the default arrow style "flat7x5" to "flat8x4" on the windowing system "x11" and for some tile themes; fixed some bugs related to the interactive cell editing and the handling of the "-listvariable" option in connection with snit widgetadaptors; further code improvements and minor bug fixes. * scripts/tclIndex: Newly generated. * doc/arrowStyles_vista.png: Updated screenshots. * doc/browse.png: * doc/browseTree.png: * doc/bwidget.png: * doc/config.png: * doc/dirViewer.png: * doc/embeddedWindows.png: * doc/embeddedWindows_tile.png: * doc/styles.png: * doc/tileWidgets.png: --- modules/tablelist/ChangeLog | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/modules/tablelist/ChangeLog b/modules/tablelist/ChangeLog index b5ba39a1..df219b90 100644 --- a/modules/tablelist/ChangeLog +++ b/modules/tablelist/ChangeLog @@ -1,3 +1,37 @@ +2018-05-22 Csaba Nemethi + + * *.tcl: Bumped the version number to 6.2. + * COPYRIGHT.txt: + * README.txt: + * ../../examples/tablelist/*.tcl: + + * CHANGES.txt: Updated to reflect the changes. + * doc/*.html: + + * scripts/*.tcl: Added the "-labelvalign" column configuration option; + the "collapse" and "expand" subcommands now accept a list of indices + as first argument; significantly improved the overall performance of + tablelist widgets containing a tree structure, embedded images, or + multi-line cells; important improvements related to the scanning + performance and behavior; changed the default arrow style "flat7x5" + to "flat8x4" on the windowing system "x11" and for some tile themes; + fixed some bugs related to the interactive cell editing and the + handling of the "-listvariable" option in connection with snit + widgetadaptors; further code improvements and minor bug fixes. + + * scripts/tclIndex: Newly generated. + + * doc/arrowStyles_vista.png: Updated screenshots. + * doc/browse.png: + * doc/browseTree.png: + * doc/bwidget.png: + * doc/config.png: + * doc/dirViewer.png: + * doc/embeddedWindows.png: + * doc/embeddedWindows_tile.png: + * doc/styles.png: + * doc/tileWidgets.png: + 2018-03-05 Csaba Nemethi * *.tcl: Bumped the version number to 6.1; From dfc99ff508ea107078e5c9accd45c4cfdd096046 Mon Sep 17 00:00:00 2001 From: csaba Date: Tue, 22 May 2018 15:09:55 +0000 Subject: [PATCH 048/150] * *.tcl: Bumped the version number to 6.2. * COPYRIGHT.txt: * README.txt: * ../../examples/tablelist/*.tcl: --- examples/tablelist/browse.tcl | 2 +- examples/tablelist/browseTree.tcl | 2 +- examples/tablelist/browseTree_tile.tcl | 2 +- examples/tablelist/browse_tile.tcl | 2 +- examples/tablelist/bwidget.tcl | 2 +- examples/tablelist/bwidget_tile.tcl | 2 +- examples/tablelist/config.tcl | 2 +- examples/tablelist/config_tile.tcl | 2 +- examples/tablelist/dirViewer.tcl | 2 +- examples/tablelist/dirViewer_tile.tcl | 2 +- examples/tablelist/embeddedWindows.tcl | 2 +- examples/tablelist/embeddedWindows_tile.tcl | 2 +- examples/tablelist/iwidgets.tcl | 2 +- examples/tablelist/iwidgets_tile.tcl | 2 +- examples/tablelist/miscWidgets.tcl | 2 +- examples/tablelist/miscWidgets_tile.tcl | 2 +- examples/tablelist/styles.tcl | 2 +- examples/tablelist/styles_tile.tcl | 2 +- examples/tablelist/tileWidgets.tcl | 2 +- modules/tablelist/COPYRIGHT.txt | 2 +- modules/tablelist/README.txt | 12 ++++++------ modules/tablelist/pkgIndex.tcl | 14 +++++++------- modules/tablelist/tablelist.tcl | 2 +- modules/tablelist/tablelistPublic.tcl | 2 +- modules/tablelist/tablelist_tile.tcl | 2 +- 25 files changed, 36 insertions(+), 36 deletions(-) diff --git a/examples/tablelist/browse.tcl b/examples/tablelist/browse.tcl index 6916b8d9..465d1094 100644 --- a/examples/tablelist/browse.tcl +++ b/examples/tablelist/browse.tcl @@ -5,7 +5,7 @@ # Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist 6.1 +package require tablelist 6.2 namespace eval demo { variable dir [file dirname [info script]] diff --git a/examples/tablelist/browseTree.tcl b/examples/tablelist/browseTree.tcl index 51a10b51..3ab5d60f 100644 --- a/examples/tablelist/browseTree.tcl +++ b/examples/tablelist/browseTree.tcl @@ -6,7 +6,7 @@ #============================================================================== package require Tk 8.3 -package require tablelist 6.1 +package require tablelist 6.2 namespace eval demo { variable dir [file dirname [info script]] diff --git a/examples/tablelist/browseTree_tile.tcl b/examples/tablelist/browseTree_tile.tcl index f7edd18d..6b76c7fb 100644 --- a/examples/tablelist/browseTree_tile.tcl +++ b/examples/tablelist/browseTree_tile.tcl @@ -5,7 +5,7 @@ # Copyright (c) 2010-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.1 +package require tablelist_tile 6.2 namespace eval demo { variable dir [file dirname [info script]] diff --git a/examples/tablelist/browse_tile.tcl b/examples/tablelist/browse_tile.tcl index 95170fa8..b4bd1554 100644 --- a/examples/tablelist/browse_tile.tcl +++ b/examples/tablelist/browse_tile.tcl @@ -5,7 +5,7 @@ # Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.1 +package require tablelist_tile 6.2 namespace eval demo { variable dir [file dirname [info script]] diff --git a/examples/tablelist/bwidget.tcl b/examples/tablelist/bwidget.tcl index 0d31b915..4af92676 100755 --- a/examples/tablelist/bwidget.tcl +++ b/examples/tablelist/bwidget.tcl @@ -9,7 +9,7 @@ #============================================================================== package require Tk 8.4 ;# because of "-compound" -package require tablelist 6.1 +package require tablelist 6.2 package require BWidget wm title . "Serial Line Configuration" diff --git a/examples/tablelist/bwidget_tile.tcl b/examples/tablelist/bwidget_tile.tcl index 09f918b4..4444a879 100755 --- a/examples/tablelist/bwidget_tile.tcl +++ b/examples/tablelist/bwidget_tile.tcl @@ -8,7 +8,7 @@ # Copyright (c) 2004-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.1 +package require tablelist_tile 6.2 package require BWidget wm title . "Serial Line Configuration" diff --git a/examples/tablelist/config.tcl b/examples/tablelist/config.tcl index c306cad1..b6ba34da 100644 --- a/examples/tablelist/config.tcl +++ b/examples/tablelist/config.tcl @@ -5,7 +5,7 @@ # Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist 6.1 +package require tablelist 6.2 namespace eval demo { # diff --git a/examples/tablelist/config_tile.tcl b/examples/tablelist/config_tile.tcl index b21e5bbd..10bf1aa9 100644 --- a/examples/tablelist/config_tile.tcl +++ b/examples/tablelist/config_tile.tcl @@ -5,7 +5,7 @@ # Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.1 +package require tablelist_tile 6.2 namespace eval demo { # diff --git a/examples/tablelist/dirViewer.tcl b/examples/tablelist/dirViewer.tcl index 09e53e02..8c2206df 100755 --- a/examples/tablelist/dirViewer.tcl +++ b/examples/tablelist/dirViewer.tcl @@ -8,7 +8,7 @@ #============================================================================== package require Tk 8.3 -package require tablelist 6.1 +package require tablelist 6.2 # # Add some entries to the Tk option database diff --git a/examples/tablelist/dirViewer_tile.tcl b/examples/tablelist/dirViewer_tile.tcl index f6eeab3a..10ab4c0e 100755 --- a/examples/tablelist/dirViewer_tile.tcl +++ b/examples/tablelist/dirViewer_tile.tcl @@ -7,7 +7,7 @@ # Copyright (c) 2010-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.1 +package require tablelist_tile 6.2 # # Add some entries to the Tk option database diff --git a/examples/tablelist/embeddedWindows.tcl b/examples/tablelist/embeddedWindows.tcl index a4c710a1..6ef218dc 100755 --- a/examples/tablelist/embeddedWindows.tcl +++ b/examples/tablelist/embeddedWindows.tcl @@ -6,7 +6,7 @@ # Copyright (c) 2004-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist 6.1 +package require tablelist 6.2 wm title . "Tk Library Scripts" diff --git a/examples/tablelist/embeddedWindows_tile.tcl b/examples/tablelist/embeddedWindows_tile.tcl index 61af6b52..81d2758d 100755 --- a/examples/tablelist/embeddedWindows_tile.tcl +++ b/examples/tablelist/embeddedWindows_tile.tcl @@ -6,7 +6,7 @@ # Copyright (c) 2004-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.1 +package require tablelist_tile 6.2 wm title . "Tile Library Scripts" diff --git a/examples/tablelist/iwidgets.tcl b/examples/tablelist/iwidgets.tcl index 887dc728..dbb57157 100755 --- a/examples/tablelist/iwidgets.tcl +++ b/examples/tablelist/iwidgets.tcl @@ -9,7 +9,7 @@ #============================================================================== package require Tk 8.4 ;# because of "-compound" -package require tablelist 6.1 +package require tablelist 6.2 if {[catch {package require iwidgets} result1] != 0 && [catch {package require Iwidgets} result2] != 0} { error "$result1; $result2" diff --git a/examples/tablelist/iwidgets_tile.tcl b/examples/tablelist/iwidgets_tile.tcl index 660f8740..414cde30 100755 --- a/examples/tablelist/iwidgets_tile.tcl +++ b/examples/tablelist/iwidgets_tile.tcl @@ -8,7 +8,7 @@ # Copyright (c) 2004-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.1 +package require tablelist_tile 6.2 if {[catch {package require iwidgets} result1] != 0 && [catch {package require Iwidgets} result2] != 0} { error "$result1; $result2" diff --git a/examples/tablelist/miscWidgets.tcl b/examples/tablelist/miscWidgets.tcl index d448c444..89512013 100755 --- a/examples/tablelist/miscWidgets.tcl +++ b/examples/tablelist/miscWidgets.tcl @@ -9,7 +9,7 @@ #============================================================================== package require Tk 8.4 ;# because of "-compound" and the spinbox widget -package require tablelist 6.1 +package require tablelist 6.2 package require combobox package require mentry diff --git a/examples/tablelist/miscWidgets_tile.tcl b/examples/tablelist/miscWidgets_tile.tcl index 99d25988..dbc3a9cd 100755 --- a/examples/tablelist/miscWidgets_tile.tcl +++ b/examples/tablelist/miscWidgets_tile.tcl @@ -8,7 +8,7 @@ # Copyright (c) 2004-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.1 +package require tablelist_tile 6.2 package require combobox package require mentry diff --git a/examples/tablelist/styles.tcl b/examples/tablelist/styles.tcl index 6eac549c..4b477eda 100755 --- a/examples/tablelist/styles.tcl +++ b/examples/tablelist/styles.tcl @@ -6,7 +6,7 @@ # Copyright (c) 2002-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist 6.1 +package require tablelist 6.2 wm title . "Tablelist Styles" diff --git a/examples/tablelist/styles_tile.tcl b/examples/tablelist/styles_tile.tcl index 48251e22..3851ddd7 100755 --- a/examples/tablelist/styles_tile.tcl +++ b/examples/tablelist/styles_tile.tcl @@ -6,7 +6,7 @@ # Copyright (c) 2002-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.1 +package require tablelist_tile 6.2 wm title . "Tablelist Styles" diff --git a/examples/tablelist/tileWidgets.tcl b/examples/tablelist/tileWidgets.tcl index bc0f1b11..754d879f 100755 --- a/examples/tablelist/tileWidgets.tcl +++ b/examples/tablelist/tileWidgets.tcl @@ -7,7 +7,7 @@ # Copyright (c) 2005-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.1 +package require tablelist_tile 6.2 wm title . "Serial Line Configuration" diff --git a/modules/tablelist/COPYRIGHT.txt b/modules/tablelist/COPYRIGHT.txt index 8af18bd7..2dbac8a7 100644 --- a/modules/tablelist/COPYRIGHT.txt +++ b/modules/tablelist/COPYRIGHT.txt @@ -1,4 +1,4 @@ -Multi-column listbox and tree widget package Tablelist, version 6.1 +Multi-column listbox and tree widget package Tablelist, version 6.2 Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) This library is free software; you can use, modify, and redistribute it diff --git a/modules/tablelist/README.txt b/modules/tablelist/README.txt index b40dbf4c..aec48472 100644 --- a/modules/tablelist/README.txt +++ b/modules/tablelist/README.txt @@ -88,8 +88,8 @@ How to Get It? -------------- Tablelist is available for free download from the same URL as Wcb. The -distribution file is "tablelist6.1.tar.gz" for UNIX and -"tablelist6_1.zip" for Windows. These files contain the same +distribution file is "tablelist6.2.tar.gz" for UNIX and +"tablelist6_2.zip" for Windows. These files contain the same information, except for the additional carriage return character preceding the linefeed at the end of each line in the text files for Windows. @@ -108,15 +108,15 @@ locations of these library directories are given by the "tcl_library" and "tk_library" variables, respectively. To install Tablelist on UNIX, "cd" to the desired directory and unpack -the distribution file "tablelist6.1.tar.gz": +the distribution file "tablelist6.2.tar.gz": - gunzip -c tablelist6.1.tar.gz | tar -xf - + gunzip -c tablelist6.2.tar.gz | tar -xf - -This command will create a directory named "tablelist6.1 with the +This command will create a directory named "tablelist6.2 with the subdirectories "demos", "doc", and "scripts". On Windows, use WinZip or some other program capable of unpacking the -distribution file "tablelist6_1.zip" into the directory "tablelist6.1", +distribution file "tablelist6_2.zip" into the directory "tablelist6.2", with the subdirectories "demos", "doc", and "scripts". The file "tablelistEdit.tcl" in the "scripts" directory is only needed diff --git a/modules/tablelist/pkgIndex.tcl b/modules/tablelist/pkgIndex.tcl index de067032..94fec52e 100644 --- a/modules/tablelist/pkgIndex.tcl +++ b/modules/tablelist/pkgIndex.tcl @@ -7,22 +7,22 @@ # # Regular packages: # -package ifneeded tablelist 6.1 \ +package ifneeded tablelist 6.2 \ [list source [file join $dir tablelist.tcl]] -package ifneeded tablelist_tile 6.1 \ +package ifneeded tablelist_tile 6.2 \ [list source [file join $dir tablelist_tile.tcl]] # # Aliases: # -package ifneeded Tablelist 6.1 \ - [list package require -exact tablelist 6.1] -package ifneeded Tablelist_tile 6.1 \ - [list package require -exact tablelist_tile 6.1] +package ifneeded Tablelist 6.2 \ + [list package require -exact tablelist 6.2] +package ifneeded Tablelist_tile 6.2 \ + [list package require -exact tablelist_tile 6.2] # # Code common to all packages: # -package ifneeded tablelist::common 6.1 \ +package ifneeded tablelist::common 6.2 \ "namespace eval ::tablelist { proc DIR {} {return [list $dir]} } ;\ source [list [file join $dir tablelistPublic.tcl]]" diff --git a/modules/tablelist/tablelist.tcl b/modules/tablelist/tablelist.tcl index 3ebeadff..16339427 100644 --- a/modules/tablelist/tablelist.tcl +++ b/modules/tablelist/tablelist.tcl @@ -6,7 +6,7 @@ package require Tcl 8 package require Tk 8 -package require -exact tablelist::common 6.1 +package require -exact tablelist::common 6.2 package provide tablelist $::tablelist::version package provide Tablelist $::tablelist::version diff --git a/modules/tablelist/tablelistPublic.tcl b/modules/tablelist/tablelistPublic.tcl index 7854eac7..4da53a41 100644 --- a/modules/tablelist/tablelistPublic.tcl +++ b/modules/tablelist/tablelistPublic.tcl @@ -24,7 +24,7 @@ namespace eval ::tablelist { # # Public variables: # - variable version 6.1 + variable version 6.2 variable library if {$tcl_version >= 8.4} { set library [file normalize [DIR]] diff --git a/modules/tablelist/tablelist_tile.tcl b/modules/tablelist/tablelist_tile.tcl index dc7509e3..20d4a563 100644 --- a/modules/tablelist/tablelist_tile.tcl +++ b/modules/tablelist/tablelist_tile.tcl @@ -9,7 +9,7 @@ package require Tk 8.4 if {$::tk_version < 8.5 || [regexp {^8\.5a[1-5]$} $::tk_patchLevel]} { package require tile 0.6 } -package require -exact tablelist::common 6.1 +package require -exact tablelist::common 6.2 package provide tablelist_tile $::tablelist::version package provide Tablelist_tile $::tablelist::version From 145064b24191128d0216a8115285ba86c2c625c1 Mon Sep 17 00:00:00 2001 From: csaba Date: Tue, 22 May 2018 15:11:01 +0000 Subject: [PATCH 049/150] * CHANGES.txt: Updated to reflect the changes. * doc/*.html: --- modules/tablelist/CHANGES.txt | 39 ++++++++- modules/tablelist/doc/index.html | 4 +- modules/tablelist/doc/tablelist.html | 58 ++++++------- modules/tablelist/doc/tablelistBWidget.html | 2 +- modules/tablelist/doc/tablelistBinding.html | 2 +- modules/tablelist/doc/tablelistColSort.html | 2 +- modules/tablelist/doc/tablelistCombobox.html | 2 +- modules/tablelist/doc/tablelistCtext.html | 2 +- modules/tablelist/doc/tablelistIwidgets.html | 2 +- modules/tablelist/doc/tablelistMentry.html | 2 +- modules/tablelist/doc/tablelistThemes.html | 2 +- modules/tablelist/doc/tablelistTile.html | 2 +- modules/tablelist/doc/tablelistTkCore.html | 2 +- modules/tablelist/doc/tablelistWidget.html | 86 +++++++++++++------- 14 files changed, 133 insertions(+), 74 deletions(-) diff --git a/modules/tablelist/CHANGES.txt b/modules/tablelist/CHANGES.txt index 3fe325d8..202d3ded 100644 --- a/modules/tablelist/CHANGES.txt +++ b/modules/tablelist/CHANGES.txt @@ -1,6 +1,41 @@ -What is new in Tablelist 6.1? +What is new in Tablelist 6.2? ----------------------------- +1. Added the "-labelvalign" column configuration option, for controlling + the vertical alignment of header label images (thanks to Johann + Oberdorfer for his proposal). + +2. The "collapse" and "expand" subcommands now accept a list of indices + as first argument (thanks to Ulrich Seidl for his proposal). This is + much more efficient than a series of invocations for individual rows. + +3. Significantly improved the overall performance of tablelist widgets + containing a tree structure, embedded images, or multi-line cells + (thanks to Ulrich Seidl for reporting some performance-related + issues in tree widgets). + +4. Important improvements related to the scanning performance and + behavior (thanks to Johann Oberdorfer for discussions on this + subject). + +5. Changed the default arrow style "flat7x5" to "flat8x4" on the + windowing system "x11" and for the tile themes "alt", "clam", + "default", "kroc", "sriv", "srivlg", and "step" (POTENTIAL + INCOMPATIBILITY!). + +6. Fixed two minor bugs related to the interactive cell editing with the + aid of the ctext widget (thanks to Sait Dogru for his bug report). + +7. Fixed a long-standing bug related to the handling of the + "-listvariable" option in connection with snit widgetadaptors (thanks + to Rolf Ade for his bug report). + +8. Several further code improvements and minor bug fixes (thanks to + Alexandru Dadalau and Bernhard Wallner for their bug reports). + +What was new in Tablelist 6.1? +------------------------------ + 1. Added the "-imagebackground" cell configuration option, useful for embedded images having (partially) transparent regions (thanks to Jose Luis Lijo for his proposal). @@ -160,7 +195,7 @@ What was new in Tablelist 5.16? 8 Drastically increased the speed of the "collapse" and "collapseall" subcommands with the "-fully" option (thanks to Ulrich Seidl for - reporting the pure performance of "collapseall -fully"). + reporting the poor performance of "collapseall -fully"). 9. Adapted the implementation of the "delete" subcommand to the changed text widget behavior in Tk 8.6.5 (thanks to Ulrich Seidl for his bug diff --git a/modules/tablelist/doc/index.html b/modules/tablelist/doc/index.html index f60e76ae..c188a6b0 100644 --- a/modules/tablelist/doc/index.html +++ b/modules/tablelist/doc/index.html @@ -1,6 +1,6 @@ - The Multi-Column Listbox and Tree Widget Package Tablelist 6.1 + The Multi-Column Listbox and Tree Widget Package Tablelist 6.2
    -

    The Multi-Column Listbox and Tree Widget Package Tablelist 6.1

    +

    The Multi-Column Listbox and Tree Widget Package Tablelist 6.2

    by

    diff --git a/modules/tablelist/doc/tablelist.html b/modules/tablelist/doc/tablelist.html index cedcd097..09896d3b 100644 --- a/modules/tablelist/doc/tablelist.html +++ b/modules/tablelist/doc/tablelist.html @@ -13,7 +13,7 @@

    Tablelist Programmer's Guide

    -

    For Tablelist Version 6.1

    +

    For Tablelist Version 6.2

    by

    @@ -170,8 +170,8 @@

    What Is Tablelist?

    How to Get It?

    Tablelist is available for free download from the same URL as Wcb.  - The distribution file is tablelist6.1.tar.gz for UNIX and - tablelist6_1.zip for Windows.  These files contain the same + The distribution file is tablelist6.2.tar.gz for UNIX and + tablelist6_2.zip for Windows.  These files contain the same information, except for the additional carriage return character preceding the linefeed at the end of each line in the text files for Windows.

    @@ -194,21 +194,21 @@

    How to Install It?

    To install Tablelist on UNIX, cd to the desired directory and unpack the distribution file - tablelist6.1.tar.gz:

    + tablelist6.2.tar.gz:

    -gunzip -c tablelist6.1.tar.gz | tar -xf -
    +gunzip -c tablelist6.2.tar.gz | tar -xf -
     
    -

    This command will create a directory named tablelist6.1, with +

    This command will create a directory named tablelist6.2, with the subdirectories demos, doc, and scripts.

    On Windows, use WinZip or some other program capable of unpacking - the distribution file tablelist6_1.zip into the directory - tablelist6.1, with the subdirectories demos, + the distribution file tablelist6_2.zip into the directory + tablelist6.2, with the subdirectories demos, doc, and scripts.

    The file tablelistEdit.tcl in the scripts @@ -305,14 +305,14 @@

    How to Use It?

    tablelist and tablelist_tile.

    REMARK:  If you have an earlier Tablelist version as part of - ActiveTcl 8.5 or above and the new Tablelist release 6.1, then it is highly - recommended to specify the version number 6.1 in the  + ActiveTcl 8.5 or above and the new Tablelist release 6.2, then it is highly + recommended to specify the version number 6.2 in the  package require  command, because otherwise the interpreter will load the old Tablelist version included in ActiveTcl as Tcl Module.  The examples below use the - statement  package require tablelist 6.1,  and their + statement  package require tablelist 6.2,  and their tile-based counterparts invoke the command  package require - tablelist_tile 6.1.

    + tablelist_tile 6.2.

    Since the packages Tablelist and Tablelist_tile are implemented in the tablelist namespace, you must either invoke the

    @@ -499,7 +499,7 @@

    A tablelist Widget for Displaying and Editing
    -package require tablelist 6.1
    +package require tablelist 6.2
     source [file join $tablelist::library demos config.tcl]
     
    @@ -541,7 +541,7 @@

    A tablelist Widget for Displaying and Editing the following figure:

    - Configuration Options + Configuration Options

    It is assumed that the Tcl command associated with the widget specified by @@ -555,7 +555,7 @@

    A tablelist Widget for Displaying and Editing
    -package require tablelist 6.1
    +package require tablelist 6.2
     
     namespace eval demo {
         #
    @@ -1002,14 +1002,14 @@ 

    Two Widget Browsers Based on a tablelist

    in the file browse.tcl is a multi-column listbox:

    - Widget Browser + Widget Browser

    The tablelist created by the procedure of the same name in the file browseTree.tcl is a multi-column tree widget:

    - Widget Browser + Widget Browser

    The demo::displayChildren command inserts some data of the @@ -1033,7 +1033,7 @@

    Two Widget Browsers Based on a tablelist

     package require Tk 8.3
    -package require tablelist 6.1
    +package require tablelist 6.2
     
     namespace eval demo {
         variable dir [file dirname [info script]]
    @@ -1615,7 +1615,7 @@ 

    A Directory Viewer Based on a tablelist

    as multi-column tree widget:

    - Directory Viewer + Directory Viewer

    By double-clicking an item or invoking the single entry of a pop-up menu @@ -1631,7 +1631,7 @@

    A Directory Viewer Based on a tablelist

     package require Tk 8.3
    -package require tablelist 6.1
    +package require tablelist 6.2
     
     #
     # Add some entries to the Tk option database
    @@ -1920,7 +1920,7 @@ 

    Improving the Look & Feel of a tablelist Widget

    the following figure:

    - Styles + Styles

    Here is the relevant code segment:

    @@ -2007,7 +2007,7 @@

    Advanced Interactive tablelist Cell Editing

    Serial Line Configuration + "390">

    Here is the relevant code segment from the script bwidget.tcl @@ -2019,7 +2019,7 @@

    Advanced Interactive tablelist Cell Editing

     package require Tk 8.4                          ;# because of "-compound"
    -package require tablelist 6.1
    +package require tablelist 6.2
     package require BWidget
     
     wm title . "Serial Line Configuration"
    @@ -2376,14 +2376,14 @@ 

    A tablelist Widget Containing Embedded Windows

    Embedded Windows + "306">

    First, we create and populate the tablelist widget:

    -package require tablelist 6.1
    +package require tablelist 6.2
     
     wm title . "Tk Library Scripts"
     
    @@ -2638,7 +2638,7 @@ 

    Tile-Based Demo Scripts

     package require Tk 8.3                          ;# because of entry validation
    -package require tablelist 6.1
    +package require tablelist 6.2
     
    @@ -2646,7 +2646,7 @@

    Tile-Based Demo Scripts

    -package require tablelist_tile 6.1
    +package require tablelist_tile 6.2
     
    @@ -2752,7 +2752,7 @@

    Tile-Based Demo Scripts

    Serial Line Configuration + height="385">

    The tile-based version of the demo script Tile-Based Demo Scripts

    Embedded Windows + height="302">
    diff --git a/modules/tablelist/doc/tablelistBWidget.html b/modules/tablelist/doc/tablelistBWidget.html index 9bc5bdcc..0602f580 100644 --- a/modules/tablelist/doc/tablelistBWidget.html +++ b/modules/tablelist/doc/tablelistBWidget.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using the BWidget Package

    -

    For Tablelist Version 6.1

    +

    For Tablelist Version 6.2

    by

    diff --git a/modules/tablelist/doc/tablelistBinding.html b/modules/tablelist/doc/tablelistBinding.html index 89cff69b..873772b1 100644 --- a/modules/tablelist/doc/tablelistBinding.html +++ b/modules/tablelist/doc/tablelistBinding.html @@ -12,7 +12,7 @@

    Commands Related to Binding Scripts

    -

    For Tablelist Version 6.1

    +

    For Tablelist Version 6.2

    by

    diff --git a/modules/tablelist/doc/tablelistColSort.html b/modules/tablelist/doc/tablelistColSort.html index f92f0acd..8fd0c45f 100644 --- a/modules/tablelist/doc/tablelistColSort.html +++ b/modules/tablelist/doc/tablelistColSort.html @@ -12,7 +12,7 @@

    Commands for Interactive Sorting by One or More Columns

    -

    For Tablelist Version 6.1

    +

    For Tablelist Version 6.2

    by

    diff --git a/modules/tablelist/doc/tablelistCombobox.html b/modules/tablelist/doc/tablelistCombobox.html index 1d921e3a..afb77320 100644 --- a/modules/tablelist/doc/tablelistCombobox.html +++ b/modules/tablelist/doc/tablelistCombobox.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using the combobox Package

    -

    For Tablelist Version 6.1

    +

    For Tablelist Version 6.2

    by

    diff --git a/modules/tablelist/doc/tablelistCtext.html b/modules/tablelist/doc/tablelistCtext.html index fa2644f0..33ab8473 100644 --- a/modules/tablelist/doc/tablelistCtext.html +++ b/modules/tablelist/doc/tablelistCtext.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using the ctext Package

    -

    For Tablelist Version 6.1

    +

    For Tablelist Version 6.2

    by

    diff --git a/modules/tablelist/doc/tablelistIwidgets.html b/modules/tablelist/doc/tablelistIwidgets.html index 2a4cd6d0..32087f99 100644 --- a/modules/tablelist/doc/tablelistIwidgets.html +++ b/modules/tablelist/doc/tablelistIwidgets.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using the Iwidgets Package

    -

    For Tablelist Version 6.1

    +

    For Tablelist Version 6.2

    by

    diff --git a/modules/tablelist/doc/tablelistMentry.html b/modules/tablelist/doc/tablelistMentry.html index 90b6e50b..ac02f12f 100644 --- a/modules/tablelist/doc/tablelistMentry.html +++ b/modules/tablelist/doc/tablelistMentry.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using the Mentry Package

    -

    For Tablelist Version 6.1

    +

    For Tablelist Version 6.2

    by

    diff --git a/modules/tablelist/doc/tablelistThemes.html b/modules/tablelist/doc/tablelistThemes.html index 1fe465c9..f7b62289 100644 --- a/modules/tablelist/doc/tablelistThemes.html +++ b/modules/tablelist/doc/tablelistThemes.html @@ -12,7 +12,7 @@

    Commands Related to Tile Themes

    -

    For Tablelist Version 6.1

    +

    For Tablelist Version 6.2

    by

    diff --git a/modules/tablelist/doc/tablelistTile.html b/modules/tablelist/doc/tablelistTile.html index 21c468ce..95504b25 100644 --- a/modules/tablelist/doc/tablelistTile.html +++ b/modules/tablelist/doc/tablelistTile.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using Tile Widgets

    -

    For Tablelist Version 6.1

    +

    For Tablelist Version 6.2

    by

    diff --git a/modules/tablelist/doc/tablelistTkCore.html b/modules/tablelist/doc/tablelistTkCore.html index 22a594d0..f95b9ed6 100644 --- a/modules/tablelist/doc/tablelistTkCore.html +++ b/modules/tablelist/doc/tablelistTkCore.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using Tk Core Widgets

    -

    For Tablelist Version 6.1

    +

    For Tablelist Version 6.2

    by

    diff --git a/modules/tablelist/doc/tablelistWidget.html b/modules/tablelist/doc/tablelistWidget.html index 61d8a60a..0f597bc7 100644 --- a/modules/tablelist/doc/tablelistWidget.html +++ b/modules/tablelist/doc/tablelistWidget.html @@ -13,7 +13,7 @@

    The tablelist::tablelist Command

    -

    For Tablelist Version 6.1

    +

    For Tablelist Version 6.2

    by

    @@ -370,6 +370,9 @@

    Quick Reference

    -labelrelief raised|sunken|flat|ridge|solid|groove
    +
    -labelvalign + center|top|bottom
    +
    -maxwidth width
    @@ -693,7 +696,7 @@

    Quick Reference

    nodeIndex
    pathName collapse - index ?-fully|-partly?
    + indexList ?-fully|-partly?
    pathName collapseall ?-fully|-partly?
    @@ -821,8 +824,8 @@

    Quick Reference

    pathName entrypath
    -
    pathName expand index - ?-fully|-partly?
    +
    pathName expand + indexList ?-fully|-partly?
    pathName expandall ?-fully|-partly?
    @@ -1715,9 +1718,9 @@

    Detailed Reference

    windowing system is x11 then the default arrow color is black and the -arrowstyle option has the default value - flat7x5.  The same holds true for some tile - themes, like alt, default, and - clam.  On the windowing system + flat8x4.  The same holds true for some tile + themes, like alt, clam, and + default.  On the windowing system win32, the default arrow color is #595959 for Windows 10, #569bc0 for Windows Vista, 7, and 8, #aca899 for Windows XP, and an empty @@ -1862,7 +1865,7 @@

    Detailed Reference

    edges:

    Arrow Styles Vista

    + "638" height="124">

    The arrow style photo7x7 uses PNG images that look and behave very close to the native sort arrows on Mac OS X Aqua @@ -5794,6 +5797,17 @@

    Detailed Reference

    image are separated from each other by a gap corresponding to the width of a space character in the given label's font. +
    -labelvalign + verticalAlignment
    + +
    Specifies the vertical alignment of the Tk image (if any) displayed + in the header label.  The verticalAlignment + must be one of center (which is the default), + top, or bottom.  + Especially if the label contains a multi-line text, the image is often + not as tall as the text; in such cases, this option enables you to + control the column-dependent vertical alignment of the image.
    +
    -maxwidth width
    @@ -8122,22 +8136,22 @@

    Detailed Reference

    widget.
    pathName collapse - index ?-fully|-partly?
    + indexList ?-fully|-partly? -
    This subcommand collapses the specified row of a tablelist used as - a tree widget, i.e., elides all its descendants.  The optional +
    This subcommand collapses the specified rows of a tablelist used as + a tree widget, i.e., elides all their descendants.  The optional argument -fully (which is the default) indicates that the command will be performed recursively, i.e., all of the - descendants of the node specified by index will be - collapsed, so that a subsequent invocation of the non-recursive version - of the expand(all) subcommand - will only display the row's children but no further descendants of - it.  The -partly option (which is used by the - default bindings) restricts the operation to just one hierarchy level, - implying that by a subsequent invocation of the non-recursive version - of the expand(all) subcommand exactly the same - descendants will be displayed again that were visible prior to - collapsing the row.
    + descendants of the nodes specified by indexList + will be collapsed, so that a subsequent invocation of the non-recursive + version of the expand(all) + subcommand will only display their children but no further descendants + of them.  The -partly option (which is used by + the default bindings) restricts the operation to just one hierarchy + level, implying that by a subsequent invocation of the non-recursive + version of the expand(all) subcommand exactly the + same descendants will be displayed again that were visible prior to + collapsing the rows.
    Before hiding the descendants of a row, the command specified as the value of the Detailed Reference

    row), this subcommand is not supported for Tk versions earlier than 8.3. +
    REMARK:  If you want to collapse several + rows, it is much more efficient to do it by invoking this subcommand + for the list of their indices than by invoking it in a loop, for the + individual rows.
    +
    pathName collapseall ?-fully|-partly?
    @@ -8161,7 +8180,7 @@

    Detailed Reference

    descendants of the top-level nodes will be collapsed, so that a subsequent invocation of the non-recursive version of the
    expandall subcommand will - only display ther children but no further descendants of them.  + only display their children but no further descendants of them.  The -partly option restricts the operation to just one hierarchy level, implying that by a subsequent invocation of the non-recursive version of the expandall subcommand @@ -8789,18 +8808,18 @@

    Detailed Reference

    configuration options.
    pathName expand - index ?-fully|-partly?
    + indexList ?-fully|-partly?
    -
    This subcommand expands the specified row of a tablelist used as a - tree widget, i.e., makes all its children visible.  The optional +
    This subcommand expands the specified rows of a tablelist used as a + tree widget, i.e., makes all their children visible.  The optional argument -fully (which is the default) indicates that the command will be performed recursively, i.e., all of the - descendants of the node specified by index will be - displayed.  The -partly option (which is used - by the default bindings) restricts the operation to just one hierarchy - level, indicating that only the children of the specified node will be - displayed, without changing the expanded/collapsed state of the child - nodes.
    + descendants of the nodes specified by indexList + will be displayed.  The -partly option (which + is used by the default bindings) restricts the operation to just one + hierarchy level, indicating that only the children of the specified + nodes will be displayed, without changing the expanded/collapsed state + of the child nodes.
    Before displaying the children of a row, the command specified as the value of the Detailed Reference row), this subcommand is not supported for Tk versions earlier than 8.3.
    +
    REMARK:  If you want to expand several rows, + it is much more efficient to do it by invoking this subcommand for the + list of their indices than by invoking it in a loop, for the individual + rows.
    +
    pathName expandall ?-fully|-partly?
    From 43b6a54bb17811e42267ed61f2400d3c41851dd3 Mon Sep 17 00:00:00 2001 From: csaba Date: Tue, 22 May 2018 15:12:21 +0000 Subject: [PATCH 050/150] * scripts/*.tcl: Added the "-labelvalign" column configuration option; the "collapse" and "expand" subcommands now accept a list of indices as first argument; significantly improved the overall performance of tablelist widgets containing a tree structure, embedded images, or multi-line cells; important improvements related to the scanning performance and behavior; changed the default arrow style "flat7x5" to "flat8x4" on the windowing system "x11" and for some tile themes; fixed some bugs related to the interactive cell editing and the handling of the "-listvariable" option in connection with snit widgetadaptors; further code improvements and minor bug fixes. --- modules/tablelist/scripts/tablelistBind.tcl | 34 +- modules/tablelist/scripts/tablelistConfig.tcl | 74 +- modules/tablelist/scripts/tablelistEdit.tcl | 11 +- modules/tablelist/scripts/tablelistMove.tcl | 8 - modules/tablelist/scripts/tablelistSort.tcl | 13 +- modules/tablelist/scripts/tablelistThemes.tcl | 14 +- modules/tablelist/scripts/tablelistUtil.tcl | 240 +++-- modules/tablelist/scripts/tablelistWidget.tcl | 851 +++++++++--------- 8 files changed, 710 insertions(+), 535 deletions(-) diff --git a/modules/tablelist/scripts/tablelistBind.tcl b/modules/tablelist/scripts/tablelistBind.tcl index 64072a13..238031b7 100644 --- a/modules/tablelist/scripts/tablelistBind.tcl +++ b/modules/tablelist/scripts/tablelistBind.tcl @@ -256,14 +256,15 @@ proc tablelist::cleanup win { # Cancel the execution of all delayed (hdr_)handleMotion, updateKeyToRowMap, # adjustSeps, makeStripes, showLineNumbers, stretchColumns, # (hdr_)updateColors, updateScrlColOffset, updateHScrlbar, updateVScrlbar, - # updateView, synchronize, displayItems, horizMoveTo, vertMoveTo, autoScan, - # horizAutoScan, forceRedraw, reconfigWindows, redisplay, redisplayCol, and - # destroyWidgets commands + # updateView, synchronize, displayItems, horizMoveTo, vertMoveTo, dragTo, + # autoScan, horizAutoScan, forceRedraw, reconfigWindows, redisplay, and + # redisplayCol commands # upvar ::tablelist::ns${win}::data data foreach id {motionId hdr_motionId mapId sepsId stripesId lineNumsId stretchId colorsId hdr_colorsId offsetId hScrlbarId vScrlbarId - viewId syncId dispId moveToId afterId redrawId reconfigId} { + viewId syncId dispId moveToId dragToId afterId redrawId + reconfigId} { if {[info exists data($id)]} { after cancel $data($id) } @@ -271,16 +272,13 @@ proc tablelist::cleanup win { foreach name [array names data *redispId] { after cancel $data($name) } - foreach destroyId $data(destroyIdList) { - after cancel $destroyId - } # # If there is a list variable associated with the # widget then remove the trace set on this variable # - upvar #0 $data(-listvariable) var - if {$data(hasListVar) && [info exists var]} { + if {$data(hasListVar) && [info exists $data(-listvariable)]} { + upvar #0 $data(-listvariable) var trace vdelete var wu $data(listVarTraceCmd) } @@ -401,6 +399,17 @@ proc tablelist::updateConfigSpecs win { updateCanvases $win } + # + # Destroy and recreate the label images + # + for {set col 0} {$col < $data(colCount)} {incr col} { + if {[info exists data($col-labelimage)]} { + set val $data($col-labelimage) + doColConfig $col $win -labelimage "" + doColConfig $col $win -labelimage $val + } + } + # # Destroy and recreate the edit window if present # @@ -1142,7 +1151,7 @@ proc tablelist::updateCursor {win row col} { # # Special handling for cell editing with the aid of BWidget - # ComboBox. Oakley combobox, or Tk menubutton widgets + # ComboBox, Oakley combobox, or Tk menubutton widgets # if {$data(editRow) >= 0 && $data(editCol) >= 0} { foreach c [winfo children $data(bodyFrmEd)] { @@ -1160,7 +1169,10 @@ proc tablelist::updateCursor {win row col} { } if {[string compare [$data(body) cget -cursor] $cursor] != 0} { - $data(body) configure -cursor $cursor + if {[catch {$data(body) configure -cursor $cursor}] != 0} { + makeEditCursor + $data(body) configure -cursor $editCursor + } } } diff --git a/modules/tablelist/scripts/tablelistConfig.tcl b/modules/tablelist/scripts/tablelistConfig.tcl index 0626b77e..66cd36c5 100644 --- a/modules/tablelist/scripts/tablelistConfig.tcl +++ b/modules/tablelist/scripts/tablelistConfig.tcl @@ -232,7 +232,7 @@ proc tablelist::extendConfigSpecs {} { x11 { set arrowColor black set arrowDisabledColor #a3a3a3 - set arrowStyle flat7x5 + set arrowStyle flat8x4 set treeStyle gtk } @@ -1726,6 +1726,25 @@ proc tablelist::doColConfig {col win opt val} { } } + 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 # @@ -1823,6 +1842,32 @@ proc tablelist::doColConfig {col win opt val} { } } + -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 @@ -2178,6 +2223,14 @@ proc tablelist::doRowConfig {row win opt val} { } else { ;# uneliding the row if {[info exists 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 {![info exists data($key-hide)]} { @@ -2480,6 +2533,14 @@ proc tablelist::doRowConfig {row win opt val} { } else { ;# unhiding the row if {[info exists 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 {![info exists data($key-elide)]} { @@ -2919,6 +2980,7 @@ proc tablelist::doCellConfig {row col win opt val} { # # 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 @@ -2929,7 +2991,7 @@ proc tablelist::doCellConfig {row col win opt val} { # # Remove the tag cell$opt-$data($name) from the given cell # - findTabs $win $w [expr {$row + $diff}] $col $col tabIdx1 tabIdx2 + findTabs $win $w $line $col $col tabIdx1 tabIdx2 $w tag remove cell$opt-$data($name) $tabIdx1 $tabIdx2+1$pu } @@ -2952,8 +3014,7 @@ proc tablelist::doCellConfig {row col win opt val} { # # Apply the tag to the given cell # - findTabs $win $w [expr {$row + $diff}] $col $col \ - tabIdx1 tabIdx2 + findTabs $win $w $line $col $col tabIdx1 tabIdx2 $w tag add $tag $tabIdx1 $tabIdx2+1$pu } @@ -3034,8 +3095,7 @@ proc tablelist::doCellConfig {row col win opt val} { # # Update the text widget's content between the two tabs # - findTabs $win $w [expr {$row + $diff}] $col $col \ - tabIdx1 tabIdx2 + findTabs $win $w $line $col $col tabIdx1 tabIdx2 if {$multiline} { updateMlCell $w $tabIdx1+1$pu $tabIdx2 $msgScript $aux \ $auxType $auxWidth $indent $indentWidth \ @@ -3182,7 +3242,7 @@ proc tablelist::doCellConfig {row col win opt val} { # 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 + findTabs $win $w [expr {$row + $diff}] $col $col tabIdx1 tabIdx2 if {$multiline} { updateMlCell $w $tabIdx1+1$pu $tabIdx2 $msgScript $aux \ $auxType $auxWidth $indent $indentWidth \ diff --git a/modules/tablelist/scripts/tablelistEdit.tcl b/modules/tablelist/scripts/tablelistEdit.tcl index 6b325fab..d1a092cb 100644 --- a/modules/tablelist/scripts/tablelistEdit.tcl +++ b/modules/tablelist/scripts/tablelistEdit.tcl @@ -1688,7 +1688,7 @@ proc tablelist::doEditCell {win row col restore {cmd ""} {charPos -1}} { # if {$charPos >= 0} { if {$isText || !$editWin($name-isEntryLike)} { - focus $w + focus $comp } else { set hasAuxObject [expr { [info exists data($key,$col-image)] || @@ -1719,8 +1719,10 @@ proc tablelist::doEditCell {win row col restore {cmd ""} {charPos -1}} { } } } else { - if {$isText || $isMentry || !$editWin($name-isEntryLike)} { + if {$isMentry || !$editWin($name-isEntryLike)} { focus $w + } elseif {$isText} { + focus $comp } else { focus $comp $comp icursor end @@ -2004,9 +2006,12 @@ proc tablelist::adjustTextHeight {w args} { set numLines [expr {int([$w index end-1$pu])}] } $w configure -height $numLines + update idletasks ;# needed for ctext set path [wcb::pathname $w] - [winfo parent $path] configure -height [winfo reqheight $path] + if {[winfo exists $path]} { + [winfo parent $path] configure -height [winfo reqheight $path] + } } #------------------------------------------------------------------------------ diff --git a/modules/tablelist/scripts/tablelistMove.tcl b/modules/tablelist/scripts/tablelistMove.tcl index a64f5384..d3c4d3ad 100644 --- a/modules/tablelist/scripts/tablelistMove.tcl +++ b/modules/tablelist/scripts/tablelistMove.tcl @@ -456,14 +456,6 @@ proc tablelist::moveCol {win source target} { return "" } - if {[winfo viewable $win]} { - purgeWidgets $win - update idletasks - if {[destroyed $win]} { - return "" - } - } - # # Update the column list # diff --git a/modules/tablelist/scripts/tablelistSort.tcl b/modules/tablelist/scripts/tablelistSort.tcl index 7e748003..5df23da4 100644 --- a/modules/tablelist/scripts/tablelistSort.tcl +++ b/modules/tablelist/scripts/tablelistSort.tcl @@ -143,13 +143,6 @@ proc tablelist::sortItems {win parentKey sortColList sortOrderList} { upvar ::tablelist::ns${win}::data data set sortAllItems [expr {[string compare $parentKey "root"] == 0}] - if {[winfo viewable $win] && $sortAllItems} { - purgeWidgets $win - update idletasks - if {[destroyed $win]} { - return "" - } - } # # Make sure sortOrderList has the same length as sortColList @@ -462,9 +455,7 @@ proc tablelist::sortItems {win parentKey sortColList sortOrderList} { } set text [joinList $win $list $cellFont \ $pixels $snipSide $snipStr] - } elseif {$data(-displayondemand)} { - set text "" - } else { + } elseif {!$data(-displayondemand)} { set text [strRange $win $text $cellFont \ $pixels $snipSide $snipStr] } @@ -474,6 +465,8 @@ proc tablelist::sortItems {win parentKey sortColList sortOrderList} { lappend insertArgs "\t\t" $cellTags lappend multilineData $col $text $cellFont $pixels \ $alignment + } elseif {$data(-displayondemand)} { + lappend insertArgs "\t\t" $cellTags } else { lappend insertArgs "\t$text\t" $cellTags } diff --git a/modules/tablelist/scripts/tablelistThemes.tcl b/modules/tablelist/scripts/tablelistThemes.tcl index 402bb0f1..9d8d5fa6 100644 --- a/modules/tablelist/scripts/tablelistThemes.tcl +++ b/modules/tablelist/scripts/tablelistThemes.tcl @@ -84,7 +84,7 @@ proc tablelist::altTheme {} { -labelborderwidth 2 \ -labelpady 1 \ -arrowcolor black \ - -arrowstyle flat7x5 \ + -arrowstyle flat8x4 \ -treestyle winnative \ ] } @@ -387,7 +387,7 @@ proc tablelist::clamTheme {} { -labelborderwidth 2 \ -labelpady 3 \ -arrowcolor black \ - -arrowstyle flat7x5 \ + -arrowstyle flat8x4 \ -treestyle gtk \ ] } @@ -489,7 +489,7 @@ proc tablelist::defaultTheme {} { -labelborderwidth 1 \ -labelpady 1 \ -arrowcolor black \ - -arrowstyle flat7x5 \ + -arrowstyle flat8x4 \ -treestyle gtk \ ] } @@ -585,7 +585,7 @@ proc tablelist::krocTheme {} { -labelborderwidth 2 \ -labelpady 1 \ -arrowcolor black \ - -arrowstyle flat7x5 \ + -arrowstyle flat8x4 \ -treestyle gtk \ ] } @@ -649,7 +649,7 @@ proc tablelist::srivTheme {} { -labelborderwidth 2 \ -labelpady 1 \ -arrowcolor black \ - -arrowstyle flat7x5 \ + -arrowstyle flat8x4 \ -treestyle gtk \ ] } @@ -681,7 +681,7 @@ proc tablelist::srivlgTheme {} { -labelborderwidth 2 \ -labelpady 1 \ -arrowcolor black \ - -arrowstyle flat7x5 \ + -arrowstyle flat8x4 \ -treestyle gtk \ ] } @@ -713,7 +713,7 @@ proc tablelist::stepTheme {} { -labelborderwidth 2 \ -labelpady 1 \ -arrowcolor black \ - -arrowstyle flat7x5 \ + -arrowstyle flat8x4 \ -treestyle gtk \ ] } diff --git a/modules/tablelist/scripts/tablelistUtil.tcl b/modules/tablelist/scripts/tablelistUtil.tcl index cad1768a..07f0cb72 100644 --- a/modules/tablelist/scripts/tablelistUtil.tcl +++ b/modules/tablelist/scripts/tablelistUtil.tcl @@ -2417,8 +2417,8 @@ proc tablelist::setupColumns {win columns createLabels} { sortOrder "" sortRank 0 isSnipped 0 changesnipside 0 changetitlesnipside 0 editable 0 editwindow entry hide 0 - maxwidth 0 resizable 1 showarrow 1 - showlinenumbers 0 sortmode ascii + labelvalign center maxwidth 0 resizable 1 + showarrow 1 showlinenumbers 0 sortmode ascii valign center wrap 0} { if {![info exists data($col-$name)]} { set data($col-$name) $val @@ -2872,7 +2872,7 @@ proc tablelist::adjustColumns {win whichWidths stretchCols} { # if {$centerArrows} { place $canvas -in $w -anchor n -bordermode outside \ - -relx 0.5 -y 1 + -relx 0.4999 -y 1 } else { set y 0 if {([winfo reqheight $w] - [winfo reqheight $canvas]) % 2 == 0 @@ -2882,11 +2882,11 @@ proc tablelist::adjustColumns {win whichWidths stretchCols} { if {[string compare $labelAlignment "right"] == 0} { place $canvas -in $w -anchor w -bordermode outside \ -relx 0.0 -x $data(charWidth) \ - -rely 0.49 -y $y + -rely 0.4999 -y $y } else { place $canvas -in $w -anchor e -bordermode outside \ -relx 1.0 -x -$data(charWidth) \ - -rely 0.49 -y $y + -rely 0.4999 -y $y } } raise $canvas @@ -3198,60 +3198,126 @@ proc tablelist::adjustLabel {win col pixels alignment} { place forget $w-tl } - variable usingTile + if {$usingTile} { + set padding [$w cget -padding] + set padT [lindex $padding 1] + set padB [lindex $padding 3] + } else { + set padT [$w cget -pady] + set padB $padT + } + set marginT [expr {$borderWidth + $padT}] + set marginB [expr {$borderWidth + $padB}] + set ilReqWidth [winfo reqwidth $w-il] + switch $alignment { left { - place $w-il -in $w -anchor w -bordermode outside \ - -relx 0.0 -x $marginL -rely 0.49 - raise $w-il + incr marginL + + switch $data($col-labelvalign) { + center { + place $w-il -in $w -anchor w -bordermode outside \ + -relx 0.0 -x $marginL -rely 0.4999 -y 0 + } + top { + place $w-il -in $w -anchor nw -bordermode outside \ + -relx 0.0 -x $marginL -rely 0.0 -y $marginT + } + bottom { + place $w-il -in $w -anchor sw -bordermode outside \ + -relx 0.0 -x $marginL -rely 1.0 -y -$marginB + } + } + if {$usingTile} { set padding [$w cget -padding] - lset padding 0 [incr padL [winfo reqwidth $w-il]] + lset padding 0 [expr {$padL + $ilReqWidth + 1}] $w configure -padding $padding -text $text } elseif {[string length $text] != 0} { - set textX [expr {$marginL + [winfo reqwidth $w-il]}] + set textX [expr {$marginL + $ilReqWidth}] place $w-tl -in $w -anchor w -bordermode outside \ - -relx 0.0 -x $textX -rely 0.49 + -relx 0.0 -x $textX -rely 0.4999 } } right { - place $w-il -in $w -anchor e -bordermode outside \ - -relx 1.0 -x -$marginR -rely 0.49 - raise $w-il + incr marginR + + switch $data($col-labelvalign) { + center { + place $w-il -in $w -anchor e -bordermode outside \ + -relx 1.0 -x -$marginR -rely 0.4999 -y 0 + } + top { + place $w-il -in $w -anchor ne -bordermode outside \ + -relx 1.0 -x -$marginR -rely 0.0 -y $marginT + } + bottom { + place $w-il -in $w -anchor se -bordermode outside \ + -relx 1.0 -x -$marginR -rely 1.0 -y -$marginB + } + } + if {$usingTile} { set padding [$w cget -padding] - lset padding 2 [incr padR [winfo reqwidth $w-il]] + lset padding 2 [expr {$padR + $ilReqWidth + 1}] $w configure -padding $padding -text $text } elseif {[string length $text] != 0} { - set textX [expr {-$marginR - [winfo reqwidth $w-il]}] + set textX [expr {-$marginR - $ilReqWidth}] place $w-tl -in $w -anchor e -bordermode outside \ - -relx 1.0 -x $textX -rely 0.49 + -relx 1.0 -x $textX -rely 0.4999 } } center { - if {$usingTile} { - set padding [$w cget -padding] - lset padding 0 [incr padL [winfo reqwidth $w-il]] - $w configure -padding $padding -text $text - } - if {[string length $text] == 0} { - place $w-il -in $w -anchor center -relx 0.5 -x 0 -rely 0.49 + switch $data($col-labelvalign) { + center { + place $w-il -in $w -anchor center -bordermode \ + inside -relx 0.4999 -x 0 -rely 0.4999 -y 0 + } + top { + place $w-il -in $w -anchor n -bordermode \ + inside -relx 0.4999 -x 0 -rely 0.0 -y $marginT + } + bottom { + place $w-il -in $w -anchor s -bordermode \ + inside -relx 0.4999 -x 0 -rely 1.0 -y -$marginB + } + } } else { - set reqWidth [expr {[winfo reqwidth $w-il] + - [winfo reqwidth $w-tl]}] - set iX [expr {-$reqWidth/2}] - place $w-il -in $w -anchor w -relx 0.5 -x $iX -rely 0.49 - if {!$usingTile} { - set tX [expr {$reqWidth + $iX}] - place $w-tl -in $w -anchor e -relx 0.5 -x $tX -rely 0.49 + set reqWidth [expr {$ilReqWidth + [winfo reqwidth $w-tl]}] + set ilX [expr {-$reqWidth/2}] + + switch $data($col-labelvalign) { + center { + place $w-il -in $w -anchor w -bordermode inside \ + -relx 0.4999 -x $ilX -rely 0.4999 -y 0 + } + top { + place $w-il -in $w -anchor nw -bordermode inside \ + -relx 0.4999 -x $ilX -rely 0.0 -y $marginT + } + bottom { + place $w-il -in $w -anchor sw -bordermode inside \ + -relx 0.4999 -x $ilX -rely 1.0 -y -$marginB + } + } + + if {$usingTile} { + set padding [$w cget -padding] + lset padding 0 [expr {$padL + $ilReqWidth}] + $w configure -padding $padding -text $text + } else { + set tlX [expr {$reqWidth + $ilX}] + place $w-tl -in $w -anchor e -bordermode inside \ + -relx 0.4999 -x $tlX -rely 0.4999 -y 0 } } - raise $w-il } } + + raise $w-il } } @@ -3344,8 +3410,8 @@ proc tablelist::computeColWidth {win col} { #------------------------------------------------------------------------------ # tablelist::computeLabelWidth # -# Computes the width of the col'th label of the tablelist widget win and -# adjusts the column's width accordingly. +# Computes the requested width of the col'th label of the tablelist widget win +# and adjusts the column's width accordingly. #------------------------------------------------------------------------------ proc tablelist::computeLabelWidth {win col} { upvar ::tablelist::ns${win}::data data @@ -3355,8 +3421,16 @@ proc tablelist::computeLabelWidth {win col} { if {$usingTile} { set netLabelWidth [expr {[winfo reqwidth $w] - 2*$data(charWidth)}] } else { - set netLabelWidth \ - [expr {[winfo reqwidth $w-il] + [winfo reqwidth $w-tl]}] + set netLabelWidth [winfo reqwidth $w-il] + set alignment [lindex $data(colList) [expr {2*$col + 1}]] + if {[string compare $alignment "center"] != 0} { + incr netLabelWidth + } + + set text [$w-tl cget -text] + if {[string length $text] != 0} { + incr netLabelWidth [winfo reqwidth $w-tl] + } } } else { set netLabelWidth [expr {[winfo reqwidth $w] - 2*$data(charWidth)}] @@ -4210,12 +4284,6 @@ proc tablelist::updateVScrlbar win { set data(redrawId) [after 50 [list tablelist::forceRedraw $win]] } - if {$data(gotResizeEvent)} { - set data(gotResizeEvent) 0 - } else { - purgeWidgets $win - } - event generate $win <> } @@ -4251,35 +4319,6 @@ proc tablelist::forceRedraw win { } } -#------------------------------------------------------------------------------ -# tablelist::purgeWidgets -# -# Destroys those label widgets containing embedded images and those message -# widgets containing multiline elements that are outside the currently visible -# range of lines of the body of the tablelist widget win. -#------------------------------------------------------------------------------ -proc tablelist::purgeWidgets win { - upvar ::tablelist::ns${win}::data data - set w $data(body) - set fromTextIdx "[$w index @0,0] linestart" - set toTextIdx "[$w index @0,$data(btmY)] lineend" - - foreach {dummy path textIdx} [$w dump -window 1.0 end] { - if {[string length $path] == 0} { - continue - } - - set class [winfo class $path] - if {([string compare $class "Label"] == 0 || - [string compare $class "Message"] == 0) && - ([$w compare $textIdx < $fromTextIdx] || - [$w compare $textIdx > $toTextIdx])} { - $w tag add elidedWin $textIdx - destroy $path - } - } -} - #------------------------------------------------------------------------------ # tablelist::adjustElidedText # @@ -4803,9 +4842,7 @@ proc tablelist::redisplay {win {getSelCells 1} {selCells {}}} { } set text [joinList $win $list $cellFont \ $pixels $snipSide $snipStr] - } elseif {$data(-displayondemand)} { - set text "" - } else { + } elseif {!$data(-displayondemand)} { set text [strRange $win $text $cellFont \ $pixels $snipSide $snipStr] } @@ -4815,6 +4852,8 @@ proc tablelist::redisplay {win {getSelCells 1} {selCells {}}} { lappend insertArgs "\t\t" $cellTags lappend multilineData $col $text $cellFont $pixels \ $alignment + } elseif {$data(-displayondemand)} { + lappend insertArgs "\t\t" $cellTags } else { lappend insertArgs "\t$text\t" $cellTags } @@ -5499,18 +5538,55 @@ proc tablelist::updateView win { } #------------------------------------------------------------------------------ -# tablelist::destroyWidgets +# tablelist::purgeWidgets # -# Destroys a list of widgets embedded into the tablelist widget win. +# Destroys those label widgets containing embedded images and those message +# widgets containing multiline elements that are outside the currently visible +# range of lines of the body of the tablelist widget win or are contained in +# hidden rows or columns, or in descendants of collapsed nodes. #------------------------------------------------------------------------------ -proc tablelist::destroyWidgets win { +proc tablelist::purgeWidgets win { + if {[destroyed $win]} { + return "" + } + upvar ::tablelist::ns${win}::data data - set destroyId [lindex $data(destroyIdList) 0] + if {$data(winSizeChanged)} { + set data(winSizeChanged) 0 + after 5000 [list tablelist::purgeWidgets $win] + } else { + set w $data(body) + set fromTextIdx "[$w index @0,0] linestart" + set toTextIdx "[$w index @0,$data(btmY)] lineend" + + set winList {} + foreach {dummy path textIdx} [$w dump -window 1.0 end] { + if {[string length $path] == 0} { + continue + } + + set class [winfo class $path] + if {([string compare $class "Label"] != 0 && + [string compare $class "Message"] != 0)} { + continue + } - eval destroy $data(widgets-$destroyId) + if {[$w compare $textIdx < $fromTextIdx] || + [$w compare $textIdx > $toTextIdx]} { + $w tag add elidedWin $textIdx + lappend winList $path + } else { + set tagNames [$w tag names $textIdx] + if {[lsearch -glob $tagNames hidden*] >= 0 || + [lsearch -glob $tagNames elided*] >= 0} { + lappend winList $path + } + } + } + eval destroy $winList - set data(destroyIdList) [lrange $data(destroyIdList) 1 end] - unset data(widgets-$destroyId) + after 1000 [list tablelist::purgeWidgets $win] + } } #------------------------------------------------------------------------------ diff --git a/modules/tablelist/scripts/tablelistWidget.tcl b/modules/tablelist/scripts/tablelistWidget.tcl index 8fdb7666..e5bf41db 100644 --- a/modules/tablelist/scripts/tablelistWidget.tcl +++ b/modules/tablelist/scripts/tablelistWidget.tcl @@ -233,6 +233,7 @@ namespace eval tablelist { -labelimage {labelImage Image } -labelpady {labelPadY Pad } -labelrelief {labelRelief Relief } + -labelvalign {labelValign Valign } -maxwidth {maxWidth MaxWidth } -name {name Name } -resizable {resizable Resizable } @@ -261,6 +262,7 @@ namespace eval tablelist { lappend colConfigSpecs(-editable) - 0 lappend colConfigSpecs(-editwindow) - entry lappend colConfigSpecs(-hide) - 0 + lappend colConfigSpecs(-labelvalign) - center lappend colConfigSpecs(-maxwidth) - 0 lappend colConfigSpecs(-resizable) - 1 lappend colConfigSpecs(-showarrow) - 1 @@ -768,7 +770,7 @@ proc tablelist::tablelist args { colCount 0 lastCol -1 treeCol 0 - gotResizeEvent 0 + winSizeChanged 0 rightX 0 btmY 0 rowTagRefCount 0 @@ -806,7 +808,6 @@ proc tablelist::tablelist args { keyToRowMapValid 1 searchStartIdx 0 keyBeingExpanded "" - destroyIdList {} justEntered 0 inEditWin 0 } @@ -1081,6 +1082,8 @@ proc tablelist::tablelist args { trace variable ::tablelist::ns${win}::checkStates w \ [list tablelist::checkStatesTrace $win] + after 1000 [list tablelist::purgeWidgets $win] + return $win } @@ -1452,12 +1455,16 @@ proc tablelist::childkeysSubCmd {win argList} { proc tablelist::collapseSubCmd {win argList} { set argCount [llength $argList] if {$argCount < 1 || $argCount > 2} { - mwutil::wrongNumArgs "$win collapse index ?-fully|-partly?" + mwutil::wrongNumArgs "$win collapse indexLList ?-fully|-partly?" } synchronize $win displayItems $win - set index [rowIndex $win [lindex $argList 0] 0 1] + set indexList {} + foreach elem [lindex $argList 0] { + set index [rowIndex $win $elem 0 1] + lappend indexList $index + } if {$argCount == 1} { set fullCollapsion 1 @@ -1467,83 +1474,70 @@ proc tablelist::collapseSubCmd {win argList} { set fullCollapsion [expr {[string compare $opt "-fully"] == 0}] } + set callerProc [lindex [info level -1] 0] upvar ::tablelist::ns${win}::data data - set key [lindex $data(keyList) $index] + set callCollapseCmd [expr {[string length $data(-collapsecommand)] != 0}] set col $data(treeCol) - if {![info exists data($key,$col-indent)]} { - return "" - } - - if {[string length $data(-collapsecommand)] != 0} { - uplevel #0 $data(-collapsecommand) [list $win $index] - } - - # - # Set the indentation image to the collapsed one - # - set data($key,$col-indent) [strMap \ - {"indented" "collapsed" "expanded" "collapsed"} $data($key,$col-indent)] - if {[winfo exists $data(body).ind_$key,$col]} { - $data(body).ind_$key,$col configure -image $data($key,$col-indent) - } + set w $data(body) + set processed 0 - if {[llength $data($key-children)] == 0} { - return "" - } + foreach index $indexList { + set key [lindex $data(keyList) $index] + if {![info exists data($key,$col-indent)]} { + continue + } - # - # Elide the descendants of this item - # - set fromRow [expr {$index + 1}] - set toRow [nodeRow $win $key end] - for {set row $fromRow} {$row < $toRow} {incr row} { - doRowConfig $row $win -elide 1 + if {$callCollapseCmd} { + uplevel #0 $data(-collapsecommand) [list $win $index] + } - if {$fullCollapsion} { - set descKey [lindex $data(keyList) $row] - if {[llength $data($descKey-children)] != 0} { - if {[string length $data(-collapsecommand)] != 0} { - uplevel #0 $data(-collapsecommand) \ - [list $win [keyToRow $win $descKey]] - } + # + # Set the indentation image to the collapsed one + # + set data($key,$col-indent) [strMap \ + {"indented" "collapsed" "expanded" "collapsed"} \ + $data($key,$col-indent)] + if {[winfo exists $w.ind_$key,$col]} { + $w.ind_$key,$col configure -image $data($key,$col-indent) + } - # - # Change the descendant's indentation image - # from the expanded to the collapsed one - # - set data($descKey,$col-indent) [strMap \ - {"expanded" "collapsed"} $data($descKey,$col-indent)] - if {[winfo exists $data(body).ind_$descKey,$col]} { - $data(body).ind_$descKey,$col configure -image \ - $data($descKey,$col-indent) - } - } + if {[llength $data($key-children)] == 0} { + continue } - } - set callerProc [lindex [info level -1] 0] - if {![string match "collapse*SubCmd" $callerProc]} { # - # Destroy the label and messsage widgets - # embedded into the descendants just elided + # Elide the descendants of this item # - set widgets {} - set fromTextIdx [expr {$fromRow + 1}].0 - set toTextIdx [expr {$toRow + 1}].0 - foreach {dummy path textIdx} \ - [$data(body) dump -window $fromTextIdx $toTextIdx] { - if {[string length $path] != 0} { - set class [winfo class $path] - if {[string compare $class "Label"] == 0 || - [string compare $class "Message"] == 0} { - lappend widgets $path + set fromRow [expr {$index + 1}] + set toRow [nodeRow $win $key end] + for {set row $fromRow} {$row < $toRow} {incr row} { + doRowConfig $row $win -elide 1 + + if {$fullCollapsion} { + set descKey [lindex $data(keyList) $row] + if {[llength $data($descKey-children)] != 0} { + if {$callCollapseCmd} { + uplevel #0 $data(-collapsecommand) [list $win $row] + } + + # + # Change the descendant's indentation image + # from the expanded to the collapsed one + # + set data($descKey,$col-indent) [strMap \ + {"expanded" "collapsed"} $data($descKey,$col-indent)] + if {[winfo exists $w.ind_$descKey,$col]} { + $w.ind_$descKey,$col configure -image \ + $data($descKey,$col-indent) + } } } } - set destroyId [after 300 [list tablelist::destroyWidgets $win]] - lappend data(destroyIdList) $destroyId - set data(widgets-$destroyId) $widgets + set processed 1 + } + + if {$processed} { adjustRowIndex $win data(anchorRow) 1 set activeRow $data(activeRow) @@ -1554,7 +1548,6 @@ proc tablelist::collapseSubCmd {win argList} { hdr_updateColors $win adjustElidedText $win redisplayVisibleItems $win - updateColors $win makeStripes $win adjustSepsWhenIdle $win updateVScrlbarWhenIdle $win @@ -1584,95 +1577,61 @@ proc tablelist::collapseallSubCmd {win argList} { displayItems $win upvar ::tablelist::ns${win}::data data + set callCollapseCmd [expr {[string length $data(-collapsecommand)] != 0}] set col $data(treeCol) + set w $data(body) - if {[winfo viewable $win]} { - purgeWidgets $win - update idletasks - if {[destroyed $win]} { - return "" - } - } - - set childIdx 0 - set childCount [llength $data(root-children)] foreach key $data(root-children) { - if {[llength $data($key-children)] == 0} { - incr childIdx + if {![info exists data($key,$col-indent)]} { continue } - if {[string length $data(-collapsecommand)] != 0} { - uplevel #0 $data(-collapsecommand) [list $win [keyToRow $win $key]] + set index [keyToRow $win $key] + if {$callCollapseCmd} { + uplevel #0 $data(-collapsecommand) [list $win $index] } # - # Change the indentation image from the expanded to the collapsed one + # Set the indentation image to the collapsed one # - set data($key,$col-indent) \ - [strMap {"expanded" "collapsed"} $data($key,$col-indent)] - if {[winfo exists $data(body).ind_$key,$col]} { - $data(body).ind_$key,$col configure -image $data($key,$col-indent) + set data($key,$col-indent) [strMap \ + {"indented" "collapsed" "expanded" "collapsed"} \ + $data($key,$col-indent)] + if {[winfo exists $w.ind_$key,$col]} { + $w.ind_$key,$col configure -image $data($key,$col-indent) + } + + if {[llength $data($key-children)] == 0} { + continue } # # Elide the descendants of this item # - incr childIdx - if {[llength $data($key-children)] != 0} { - set fromRow [expr {[keyToRow $win $key] + 1}] - if {$childIdx < $childCount} { - set nextChildKey [lindex $data(root-children) $childIdx] - set toRow [keyToRow $win $nextChildKey] - } else { - set toRow $data(itemCount) - } - for {set row $fromRow} {$row < $toRow} {incr row} { - doRowConfig $row $win -elide 1 - - if {$fullCollapsion} { - set descKey [lindex $data(keyList) $row] - if {[llength $data($descKey-children)] != 0} { - if {[string length $data(-collapsecommand)] != 0} { - uplevel #0 $data(-collapsecommand) \ - [list $win [keyToRow $win $descKey]] - } + set fromRow [expr {$index + 1}] + set toRow [nodeRow $win $key end] + for {set row $fromRow} {$row < $toRow} {incr row} { + doRowConfig $row $win -elide 1 - # - # Change the descendant's indentation image - # from the expanded to the collapsed one - # - set data($descKey,$col-indent) \ - [strMap {"expanded" "collapsed"} \ - $data($descKey,$col-indent)] - if {[winfo exists $data(body).ind_$descKey,$col]} { - $data(body).ind_$descKey,$col configure -image \ - $data($descKey,$col-indent) - } + if {$fullCollapsion} { + set descKey [lindex $data(keyList) $row] + if {[llength $data($descKey-children)] != 0} { + if {$callCollapseCmd} { + uplevel #0 $data(-collapsecommand) [list $win $row] } - } - } - # - # Destroy the label and messsage widgets - # embedded into the descendants just elided - # - set widgets {} - set fromTextIdx [expr {$fromRow + 1}].0 - set toTextIdx [expr {$toRow + 1}].0 - foreach {dummy path textIdx} \ - [$data(body) dump -window $fromTextIdx $toTextIdx] { - if {[string length $path] != 0} { - set class [winfo class $path] - if {[string compare $class "Label"] == 0 || - [string compare $class "Message"] == 0} { - lappend widgets $path + # + # Change the descendant's indentation image + # from the expanded to the collapsed one + # + set data($descKey,$col-indent) [strMap \ + {"expanded" "collapsed"} $data($descKey,$col-indent)] + if {[winfo exists $w.ind_$descKey,$col]} { + $w.ind_$descKey,$col configure -image \ + $data($descKey,$col-indent) } } } - set destroyId [after 300 [list tablelist::destroyWidgets $win]] - lappend data(destroyIdList) $destroyId - set data(widgets-$destroyId) $widgets } } @@ -1686,7 +1645,6 @@ proc tablelist::collapseallSubCmd {win argList} { hdr_updateColors $win adjustElidedText $win redisplayVisibleItems $win - updateColors $win makeStripes $win adjustSepsWhenIdle $win updateVScrlbarWhenIdle $win @@ -2384,12 +2342,16 @@ proc tablelist::entrypathSubCmd {win argList} { proc tablelist::expandSubCmd {win argList} { set argCount [llength $argList] if {$argCount < 1 || $argCount > 2} { - mwutil::wrongNumArgs "$win expand index ?-fully|-partly?" + mwutil::wrongNumArgs "$win expand indexList ?-fully|-partly?" } synchronize $win displayItems $win - set index [rowIndex $win [lindex $argList 0] 0 1] + set indexList {} + foreach elem [lindex $argList 0] { + set index [rowIndex $win $elem 0 1] + lappend indexList $index + } if {$argCount == 1} { set fullExpansion 1 @@ -2399,61 +2361,69 @@ proc tablelist::expandSubCmd {win argList} { set fullExpansion [expr {[string compare $opt "-fully"] == 0}] } + set callerProc [lindex [info level -1] 0] upvar ::tablelist::ns${win}::data data - set key [lindex $data(keyList) $index] + set callExpandCmd [expr {[string compare $callerProc "doRowConfig"] != 0 && + [string length $data(-expandcommand)] != 0}] set col $data(treeCol) - if {![info exists data($key,$col-indent)] || - [string match "*indented*" $data($key,$col-indent)]} { - return "" - } + set w $data(body) + set processed 0 - set callerProc [lindex [info level -1] 0] - if {[string compare $callerProc "doRowConfig"] != 0 && - [string length $data(-expandcommand)] != 0} { - set data(keyBeingExpanded) $key - uplevel #0 $data(-expandcommand) [list $win $index] - set data(keyBeingExpanded) "" - } + foreach index $indexList { + set key [lindex $data(keyList) $index] + if {![info exists data($key,$col-indent)] || + [string match "*indented*" $data($key,$col-indent)]} { + continue + } - # - # Set the indentation image to the indented or expanded one - # - set childCount [llength $data($key-children)] - set state [expr {($childCount == 0) ? "indented" : "expanded"}] - set data($key,$col-indent) [strMap \ - [list "collapsed" $state "expanded" $state] $data($key,$col-indent)] - if {[string compare $state "indented"] == 0} { - set data($key,$col-indent) [strMap \ - {"Act" "" "Sel" ""} $data($key,$col-indent)] - } - if {[winfo exists $data(body).ind_$key,$col]} { - $data(body).ind_$key,$col configure -image $data($key,$col-indent) - } + if {$callExpandCmd} { + set data(keyBeingExpanded) $key + uplevel #0 $data(-expandcommand) [list $win $index] + set data(keyBeingExpanded) "" + } - # - # Unelide the children if appropriate and - # invoke this procedure recursively on them - # - set isViewable [expr {![info exists data($key-elide)] && - ![info exists data($key-hide)]}] - foreach childKey $data($key-children) { - set childRow [keyToRow $win $childKey] - if {$isViewable} { - doRowConfig $childRow $win -elide 0 + # + # Set the indentation image to the indented or expanded one + # + set childCount [llength $data($key-children)] + set state [expr {($childCount == 0) ? "indented" : "expanded"}] + set data($key,$col-indent) [strMap \ + [list "collapsed" $state "expanded" $state] $data($key,$col-indent)] + if {[string compare $state "indented"] == 0} { + set data($key,$col-indent) [strMap \ + {"Act" "" "Sel" ""} $data($key,$col-indent)] } - if {$fullExpansion} { - expandSubCmd $win [list $childRow -fully] - } elseif {[string match "*expanded*" $data($childKey,$col-indent)]} { - expandSubCmd $win [list $childRow -partly] + if {[winfo exists $w.ind_$key,$col]} { + $w.ind_$key,$col configure -image $data($key,$col-indent) } + + # + # Unelide the children if appropriate and + # invoke this procedure recursively on them + # + set isViewable [expr {![info exists data($key-elide)] && + ![info exists data($key-hide)]}] + foreach childKey $data($key-children) { + set childRow [keyToRow $win $childKey] + if {$isViewable} { + doRowConfig $childRow $win -elide 0 + } + if {$fullExpansion} { + expandSubCmd $win [list $childRow -fully] + } elseif {[string match "*expanded*" \ + $data($childKey,$col-indent)]} { + expandSubCmd $win [list $childRow -partly] + } + } + + set processed 1 } - if {![string match "expand*SubCmd" $callerProc]} { + if {$processed && ![string match "expand*SubCmd" $callerProc]} { hdr_adjustElidedText $win hdr_updateColors $win adjustElidedText $win redisplayVisibleItems $win - updateColors $win makeStripes $win adjustSepsWhenIdle $win updateVScrlbarWhenIdle $win @@ -2483,7 +2453,9 @@ proc tablelist::expandallSubCmd {win argList} { displayItems $win upvar ::tablelist::ns${win}::data data + set callExpandCmd [expr {[string length $data(-expandcommand)] != 0}] set col $data(treeCol) + set w $data(body) foreach key $data(root-children) { if {![info exists data($key,$col-indent)] || @@ -2491,7 +2463,7 @@ proc tablelist::expandallSubCmd {win argList} { continue } - if {[string length $data(-expandcommand)] != 0} { + if {$callExpandCmd} { set data(keyBeingExpanded) $key uplevel #0 $data(-expandcommand) [list $win [keyToRow $win $key]] set data(keyBeingExpanded) "" @@ -2508,16 +2480,19 @@ proc tablelist::expandallSubCmd {win argList} { set data($key,$col-indent) [strMap \ {"Act" "" "Sel" ""} $data($key,$col-indent)] } - if {[winfo exists $data(body).ind_$key,$col]} { - $data(body).ind_$key,$col configure -image $data($key,$col-indent) + if {[winfo exists $w.ind_$key,$col]} { + $w.ind_$key,$col configure -image $data($key,$col-indent) } # - # Unelide the children and invoke expandSubCmd on them + # Unelide the children if appropriate and invoke expandSubCmd on them # + set isViewable [expr {![info exists data($key-hide)]}] foreach childKey $data($key-children) { set childRow [keyToRow $win $childKey] - doRowConfig $childRow $win -elide 0 + if {$isViewable} { + doRowConfig $childRow $win -elide 0 + } if {$fullExpansion} { expandSubCmd $win [list $childRow -fully] } elseif {[string match "*expanded*" \ @@ -2531,7 +2506,6 @@ proc tablelist::expandallSubCmd {win argList} { hdr_updateColors $win adjustElidedText $win redisplayVisibleItems $win - updateColors $win makeStripes $win adjustSepsWhenIdle $win updateVScrlbarWhenIdle $win @@ -6785,8 +6759,8 @@ proc tablelist::deleteRows {win first last updateListVar} { cellTagRefCount 0 imgCount 0 winCount 0 indentCount 0 root-children {}} - foreach name [array names attrib {k[0-9]*}] { - unset attrib($name) + foreach name [array names attribs {k[0-9]*}] { + unset attribs($name) } } else { for {set row $first} {$row <= $last} {incr row} { @@ -7209,7 +7183,8 @@ proc tablelist::deleteCols {win first last selCellsName} { #------------------------------------------------------------------------------ # tablelist::insertRows # -# Processes the tablelist insert and insertlist subcommands. +# Processes the tablelist insert, insertlist, insertchildren, and +# insertchildlist subcommands. #------------------------------------------------------------------------------ proc tablelist::insertRows {win index argList updateListVar parentKey \ childIdx} { @@ -7236,6 +7211,11 @@ proc tablelist::insertRows {win index argList updateListVar parentKey \ set childIdx $childCount } + if {$updateListVar} { + upvar #0 $data(-listvariable) var + trace vdelete var wu $data(listVarTraceCmd) + } + # # Insert the items into the internal list # @@ -7253,14 +7233,11 @@ proc tablelist::insertRows {win index argList updateListVar parentKey \ # Insert the item into the list variable if needed # if {$updateListVar} { - upvar #0 $data(-listvariable) var - trace vdelete var wu $data(listVarTraceCmd) if {$appendingItems} { lappend var $item ;# this works much faster } else { set var [linsert $var $row $item] } - trace variable var wu $data(listVarTraceCmd) } # @@ -7298,15 +7275,19 @@ proc tablelist::insertRows {win index argList updateListVar parentKey \ [linsert $data($parentKey-children) $childIdx $key] } - lappend data(rowsToDisplay) $row lappend result $key incr row incr childIdx } + lappend data(segmentsToDisplay) $index $argCount incr data(itemCount) $argCount set data(lastRow) [expr {$data(itemCount) - 1}] + if {$updateListVar} { + trace variable var wu $data(listVarTraceCmd) + } + # # Update the key -> row mapping at idle time if needed # @@ -7481,7 +7462,7 @@ proc tablelist::hdr_insertRows {win index argList} { # Embed the message widgets displaying multiline elements # foreach {col text font pixels alignment} $multilineData { - findTabs $w $win $win $line $col $col tabIdx1 tabIdx2 + findTabs $win $w $line $col $col tabIdx1 tabIdx2 set msgScript [list ::tablelist::displayText $win $key \ $col $text $font $pixels $alignment] $w window create $tabIdx2 -align top -pady $padY -create $msgScript @@ -7534,7 +7515,8 @@ proc tablelist::displayItems win { # Nothing to do if there are no items to display # upvar ::tablelist::ns${win}::data data - if {![info exists data(dispId)]} { + if {![info exists data(dispId)] || + ![info exists data(segmentsToDisplay)]} { return "" } @@ -7556,200 +7538,207 @@ proc tablelist::displayItems win { set widgetFont $data(-font) set snipStr $data(-snipstring) set padY [expr {[$w cget -spacing1] == 0}] - set wasEmpty [expr {[llength $data(rowsToDisplay)] == $data(itemCount)}] + variable pu + set wasEmpty [$w compare end-1$pu == 1.0] set isEmpty $wasEmpty - foreach row $data(rowsToDisplay) { - set line [expr {$row + 1}] - set item [lindex $data(itemList) $row] - set key [lindex $item end] - - # - # Format the item - # - set dispItem [lrange $item 0 $data(lastCol)] - if {$data(hasFmtCmds)} { - set dispItem [formatItem $win $key $row $dispItem] - } - if {[string match "*\t*" $dispItem]} { - set dispItem [mapTabs $dispItem] - } + foreach {startRow rowCount} $data(segmentsToDisplay) { + for {set row $startRow; set line [expr {$row + 1}]} {$rowCount != 0} \ + {set row $line; incr line; incr rowCount -1} { + set item [lindex $data(itemList) $row] + set key [lindex $item end] - if {$isEmpty} { - set isEmpty 0 - } else { - $w insert $line.0 "\n" - } - if {$data(nonViewableRowCount) != 0} { - $w tag remove elidedRow $line.0 - $w tag remove hiddenRow $line.0 - } - set multilineData {} - set col 0 - if {$data(hasColTags)} { - set insertArgs {} - foreach text $dispItem \ - colFont $data(colFontList) \ - colTags $data(colTagsList) \ - {pixels alignment} $data(colList) { - if {$data($col-hide) && !$canElide} { - incr col - continue - } + # + # Format the item + # + set dispItem [lrange $item 0 $data(lastCol)] + if {$data(hasFmtCmds)} { + set dispItem [formatItem $win $key $row $dispItem] + } + if {[string match "*\t*" $dispItem]} { + set dispItem [mapTabs $dispItem] + } - # - # Update the column width or clip the element if necessary - # - set multiline [string match "*\n*" $text] - if {$pixels == 0} { ;# convention: dynamic width - if {$multiline} { - set list [split $text "\n"] - set textWidth [getListWidth $win $list $colFont] - } else { - set textWidth \ - [font measure $colFont -displayof $win $text] + if {$isEmpty} { + set isEmpty 0 + } else { + $w insert $line.0 "\n" + } + if {$data(nonViewableRowCount) != 0} { + $w tag remove elidedRow $line.0 + $w tag remove hiddenRow $line.0 + } + set multilineData {} + set col 0 + if {$data(hasColTags)} { + set insertArgs {} + foreach text $dispItem \ + colFont $data(colFontList) \ + colTags $data(colTagsList) \ + {pixels alignment} $data(colList) { + if {$data($col-hide) && !$canElide} { + incr col + continue } - if {$data($col-maxPixels) > 0} { - if {$textWidth > $data($col-maxPixels)} { - set pixels $data($col-maxPixels) + + # + # Update the column width or clip the element if necessary + # + set multiline [string match "*\n*" $text] + if {$pixels == 0} { ;# convention: dynamic width + if {$multiline} { + set list [split $text "\n"] + set textWidth [getListWidth $win $list $colFont] + } else { + set textWidth \ + [font measure $colFont -displayof $win $text] + } + if {$data($col-maxPixels) > 0} { + if {$textWidth > $data($col-maxPixels)} { + set pixels $data($col-maxPixels) + } + } + if {$textWidth == $data($col-elemWidth)} { + incr data($col-widestCount) + } elseif {$textWidth > $data($col-elemWidth)} { + set data($col-elemWidth) $textWidth + set data($col-widestCount) 1 } } - if {$textWidth == $data($col-elemWidth)} { - incr data($col-widestCount) - } elseif {$textWidth > $data($col-elemWidth)} { - set data($col-elemWidth) $textWidth - set data($col-widestCount) 1 - } - } - if {$pixels != 0} { - incr pixels $data($col-delta) + if {$pixels != 0} { + incr pixels $data($col-delta) - if {$data($col-wrap) && !$multiline} { - if {[font measure $colFont -displayof $win $text] > - $pixels} { - set multiline 1 + if {$data($col-wrap) && !$multiline} { + if {[font measure $colFont -displayof $win $text] > + $pixels} { + set multiline 1 + } + } + + set snipSide \ + $snipSides($alignment,$data($col-changesnipside)) + if {$multiline} { + set list [split $text "\n"] + if {$data($col-wrap)} { + set snipSide "" + } + set text [joinList $win $list $colFont \ + $pixels $snipSide $snipStr] + } elseif {!$data(-displayondemand)} { + set text [strRange $win $text $colFont \ + $pixels $snipSide $snipStr] } } - set snipSide \ - $snipSides($alignment,$data($col-changesnipside)) if {$multiline} { - set list [split $text "\n"] - if {$data($col-wrap)} { - set snipSide "" - } - set text [joinList $win $list $colFont \ - $pixels $snipSide $snipStr] + lappend insertArgs "\t\t" $colTags + lappend multilineData \ + $col $text $colFont $pixels $alignment } elseif {$data(-displayondemand)} { - set text "" + lappend insertArgs "\t\t" $colTags } else { - set text [strRange $win $text $colFont \ - $pixels $snipSide $snipStr] + lappend insertArgs "\t$text\t" $colTags } - } - - if {$multiline} { - lappend insertArgs "\t\t" $colTags - lappend multilineData $col $text $colFont $pixels $alignment - } else { - lappend insertArgs "\t$text\t" $colTags - } - incr col - } - - # - # Insert the item into the body text widget - # - if {[llength $insertArgs] != 0} { - eval [list $w insert $line.0] $insertArgs - } - } else { - set insertStr "" - foreach text $dispItem {pixels alignment} $data(colList) { - if {$data($col-hide) && !$canElide} { incr col - continue } # - # Update the column width or clip the element if necessary + # Insert the item into the body text widget # - set multiline [string match "*\n*" $text] - if {$pixels == 0} { ;# convention: dynamic width - if {$multiline} { - set list [split $text "\n"] - set textWidth [getListWidth $win $list $widgetFont] - } else { - set textWidth \ - [font measure $widgetFont -displayof $win $text] + if {[llength $insertArgs] != 0} { + eval [list $w insert $line.0] $insertArgs + } + + } else { + set insertStr "" + foreach text $dispItem {pixels alignment} $data(colList) { + if {$data($col-hide) && !$canElide} { + incr col + continue } - if {$data($col-maxPixels) > 0} { - if {$textWidth > $data($col-maxPixels)} { - set pixels $data($col-maxPixels) + + # + # Update the column width or clip the element if necessary + # + set multiline [string match "*\n*" $text] + if {$pixels == 0} { ;# convention: dynamic width + if {$multiline} { + set list [split $text "\n"] + set textWidth [getListWidth $win $list $widgetFont] + } else { + set textWidth \ + [font measure $widgetFont -displayof $win $text] + } + if {$data($col-maxPixels) > 0} { + if {$textWidth > $data($col-maxPixels)} { + set pixels $data($col-maxPixels) + } + } + if {$textWidth == $data($col-elemWidth)} { + incr data($col-widestCount) + } elseif {$textWidth > $data($col-elemWidth)} { + set data($col-elemWidth) $textWidth + set data($col-widestCount) 1 } } - if {$textWidth == $data($col-elemWidth)} { - incr data($col-widestCount) - } elseif {$textWidth > $data($col-elemWidth)} { - set data($col-elemWidth) $textWidth - set data($col-widestCount) 1 - } - } - if {$pixels != 0} { - incr pixels $data($col-delta) + if {$pixels != 0} { + incr pixels $data($col-delta) - if {$data($col-wrap) && !$multiline} { - if {[font measure $widgetFont -displayof $win $text] > - $pixels} { - set multiline 1 + if {$data($col-wrap) && !$multiline} { + if {[font measure $widgetFont -displayof $win $text] + > $pixels} { + set multiline 1 + } + } + + set snipSide \ + $snipSides($alignment,$data($col-changesnipside)) + if {$multiline} { + set list [split $text "\n"] + if {$data($col-wrap)} { + set snipSide "" + } + set text [joinList $win $list $widgetFont \ + $pixels $snipSide $snipStr] + } elseif {!$data(-displayondemand)} { + set text [strRange $win $text $widgetFont \ + $pixels $snipSide $snipStr] } } - set snipSide \ - $snipSides($alignment,$data($col-changesnipside)) if {$multiline} { - set list [split $text "\n"] - if {$data($col-wrap)} { - set snipSide "" - } - set text [joinList $win $list $widgetFont \ - $pixels $snipSide $snipStr] + append insertStr "\t\t" + lappend multilineData $col $text $widgetFont \ + $pixels $alignment } elseif {$data(-displayondemand)} { - set text "" + append insertStr "\t\t" } else { - set text [strRange $win $text $widgetFont \ - $pixels $snipSide $snipStr] + append insertStr "\t$text\t" } - } - if {$multiline} { - append insertStr "\t\t" - lappend multilineData $col $text $widgetFont \ - $pixels $alignment - } else { - append insertStr "\t$text\t" + incr col } - incr col + + # + # Insert the item into the body text widget + # + $w insert $line.0 $insertStr } # - # Insert the item into the body text widget + # Embed the message widgets displaying multiline elements # - $w insert $line.0 $insertStr - } - - # - # Embed the message widgets displaying multiline elements - # - foreach {col text font pixels alignment} $multilineData { - findTabs $win $w $line $col $col tabIdx1 tabIdx2 - set msgScript [list ::tablelist::displayText $win $key \ - $col $text $font $pixels $alignment] - $w window create $tabIdx2 -align top -pady $padY -create $msgScript - $w tag add elidedWin $tabIdx2 + foreach {col text font pixels alignment} $multilineData { + findTabs $win $w $line $col $col tabIdx1 tabIdx2 + set msgScript [list ::tablelist::displayText $win $key \ + $col $text $font $pixels $alignment] + $w window create $tabIdx2 -align top -pady $padY \ + -create $msgScript + $w tag add elidedWin $tabIdx2 + } } } - unset data(rowsToDisplay) + unset data(segmentsToDisplay) # # Adjust the heights of the body text widget @@ -7927,64 +7916,36 @@ proc tablelist::doScan {win opt x y} { incr x -[winfo x $w] incr y -[winfo y $w] - if {$data(-titlecolumns) == 0} { - set textIdx [$data(body) index @0,$y] - set row [expr {int($textIdx) - 1}] - $w scan $opt $x $y - $data(hdrTxt) scan $opt $x 0 - - if {[string compare $opt "dragto"] == 0} { - hdr_adjustElidedText $win - hdr_updateColors $win - adjustElidedText $win - redisplayVisibleItems $win - updateColors $win - adjustSepsWhenIdle $win - updateVScrlbarWhenIdle $win - updateIdletasksDelayed + if {[string compare $opt "mark"] == 0} { + if {$data(-titlecolumns) != 0} { + set data(scanMarkX) $x + set data(scanMarkXOffset) \ + [scrlColOffsetToXOffset $win $data(scrlColOffset)] } - } elseif {[string compare $opt "mark"] == 0} { - $w scan mark 0 $y - set data(scanMarkX) $x - set data(scanMarkXOffset) \ - [scrlColOffsetToXOffset $win $data(scrlColOffset)] + set data(scanMarkY) $y + set data(scanMarkTopRowOffset) \ + [getViewableRowCount $win 0 [expr {[getVertComplTopRow $win] - 1}]] + set data(winViewableCount) [getViewableRowCount $win \ + [getVertComplTopRow $win] [getVertComplBtmRow $win]] + set data(bodyHeight) [winfo height $w] } else { - set textIdx [$data(body) index @0,$y] - set row [expr {int($textIdx) - 1}] - $w scan dragto 0 $y - - # - # Compute the new scrolled x offset by amplifying the - # difference between the current horizontal position and - # the place where the scan started (the "mark" position) - # - set scrlXOffset \ - [expr {$data(scanMarkXOffset) - 10*($x - $data(scanMarkX))}] - set maxScrlXOffset [scrlColOffsetToXOffset $win \ - [getMaxScrlColOffset $win]] - if {$scrlXOffset > $maxScrlXOffset} { - set scrlXOffset $maxScrlXOffset - set data(scanMarkX) $x - set data(scanMarkXOffset) $maxScrlXOffset - } elseif {$scrlXOffset < 0} { - set scrlXOffset 0 - set data(scanMarkX) $x - set data(scanMarkXOffset) 0 + if {![info exists data(scanMarkY)]} { + return "" } - # - # Change the scrolled column offset and adjust the elided text - # - changeScrlColOffset $win [scrlXOffsetToColOffset $win $scrlXOffset] - hdr_adjustElidedText $win - hdr_updateColors $win - adjustElidedText $win - redisplayVisibleItems $win - updateColors $win - adjustSepsWhenIdle $win - updateVScrlbarWhenIdle $win - updateIdletasksDelayed + set data(scanDragToX) $x + set data(scanDragToY) $y + if {![info exists data(dragToId)]} { + variable winSys + if {[string compare $winSys "x11"] == 0} { + set delay [expr {($data(colCount) + 3) / 4}] + } else { + set delay [expr {$data(colCount) * 2}] + } + set data(dragToId) \ + [after $delay [list tablelist::dragTo $win]] + } } return "" @@ -8429,8 +8390,8 @@ proc tablelist::horizMoveTo win { #------------------------------------------------------------------------------ # tablelist::vertMoveTo # -# Adjusts the view in the tablelist window win so that the non-hidden item -# given by data(fraction) appears at the top of the window. +# Adjusts the view in the tablelist window win so that the viewable item given +# by data(fraction) appears at the top of the window. #------------------------------------------------------------------------------ proc tablelist::vertMoveTo win { upvar ::tablelist::ns${win}::data data @@ -8453,6 +8414,82 @@ proc tablelist::vertMoveTo win { } } +#------------------------------------------------------------------------------ +# tablelist::dragTo +# +# Adjusts the view in the tablelist window win by 10 times the difference +# between data(scanDragToX) and data(scanDragToY) and the x and y arguments to +# the last scan mark command. +#------------------------------------------------------------------------------ +proc tablelist::dragTo win { + upvar ::tablelist::ns${win}::data data + if {[info exists data(dragToId)]} { + after cancel $data(dragToId) + unset data(dragToId) + } + + set w $data(body) + if {$data(-titlecolumns) == 0} { + $w scan dragto $data(scanDragToX) 0 + $data(hdrTxt) scan dragto $data(scanDragToX) 0 + } else { + # + # Compute the new scrolled x offset by amplifying the + # difference between the current horizontal position and + # the place where the scan started (the "mark" position) + # + set scrlXOffset [expr {$data(scanMarkXOffset) - + 10*($data(scanDragToX) - $data(scanMarkX))}] + if {$scrlXOffset < 0} { + set data(scanMarkX) $data(scanDragToX) + set data(scanMarkXOffset) 0 + set scrlXOffset 0 + } else { + set maxScrlXOffset \ + [scrlColOffsetToXOffset $win [getMaxScrlColOffset $win]] + if {$scrlXOffset > $maxScrlXOffset} { + set data(scanMarkX) $data(scanDragToX) + set data(scanMarkXOffset) $maxScrlXOffset + set scrlXOffset $maxScrlXOffset + } + } + + changeScrlColOffset $win [scrlXOffsetToColOffset $win $scrlXOffset] + } + + # + # Compute the new top row offset by amplifying the + # difference between the current vertical position and + # the place where the scan started (the "mark" position) + # + set numUnits [expr {10*($data(scanDragToY) - $data(scanMarkY)) * + $data(winViewableCount) / $data(bodyHeight)}] + set newTopRowOffset [expr {$data(scanMarkTopRowOffset) - $numUnits}] + if {$newTopRowOffset < 0} { + set data(scanMarkY) $data(scanDragToY) + set data(scanMarkTopRowOffset) 0 + set newTopRowOffset 0 + } else { + set maxRowOffset [getViewableRowCount $win 0 $data(lastRow)] + if {$newTopRowOffset > $maxRowOffset} { + set data(scanMarkY) $data(scanDragToY) + set data(scanMarkTopRowOffset) $maxRowOffset + set newTopRowOffset $maxRowOffset + } + } + + $w yview [viewableRowOffsetToRowIndex $win $newTopRowOffset] + + hdr_adjustElidedText $win + hdr_updateColors $win + adjustElidedText $win + redisplayVisibleItems $win + updateColors $win + adjustSepsWhenIdle $win + updateVScrlbarWhenIdle $win + updateIdletasksDelayed +} + #------------------------------------------------------------------------------ # tablelist::seeTextIdx # @@ -8539,7 +8576,7 @@ proc tablelist::bodyConfigure {w width height} { set rightX [expr {$width - 1}] set btmY [expr {$height - 1}] if {$rightX != $data(rightX) || $btmY != $data(btmY)} { - set data(gotResizeEvent) 1 + set data(winSizeChanged) 1 set data(rightX) $rightX set data(btmY) $btmY From b04ae6430c903ffe418fedde099cd8497524dfe0 Mon Sep 17 00:00:00 2001 From: csaba Date: Tue, 22 May 2018 15:13:44 +0000 Subject: [PATCH 051/150] * scripts/tclIndex: Newly generated. --- modules/tablelist/scripts/tclIndex | 418 ++++++++++++++--------------- 1 file changed, 209 insertions(+), 209 deletions(-) diff --git a/modules/tablelist/scripts/tclIndex b/modules/tablelist/scripts/tclIndex index 9f07d392..ce44bac0 100644 --- a/modules/tablelist/scripts/tclIndex +++ b/modules/tablelist/scripts/tclIndex @@ -6,6 +6,113 @@ # element name is the name of a command and the value is # a script that loads the command. +set auto_index(::mwutil::makeFocusProcs) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::getChildren) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::wrongNumArgs) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::getAncestorByClass) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::convEventFields) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::defineKeyNav) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::processTraversal) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::configureWidget) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::fullConfigOpt) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::fullOpt) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::enumOpts) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::configureSubCmd) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::attribSubCmd) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::hasattribSubCmd) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::unsetattribSubCmd) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::getScrollInfo) [list source [file join $dir mwutil.tcl]] +set auto_index(::tablelist::getTablelistColumn) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::getTablelistPath) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::convEventFields) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::delaySashPosUpdates) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::addActiveTag) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::removeActiveTag) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::cleanup) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::updateCanvases) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::updateConfigSpecs) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::cleanupWindow) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::defineTablelistBody) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::invokeMotionHandler) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::handleMotionDelayed) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::handleMotion) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::showOrHideTooltip) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::updateExpCollCtrl) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::updateCursor) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::makeEditCursor) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::wasExpCollCtrlClicked) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::condEditContainingCell) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::condBeginMove) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::beginSelect) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::condAutoScan) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::autoScan) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::minScrollableX) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::motion) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::condShowTarget) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::moveOrActivate) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::condEvalInvokeCmd) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::cancelMove) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::beginExtend) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::beginToggle) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::condEditActiveCell) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::plusMinus) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::nextPrevCell) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::upDown) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::leftRight) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::priorNext) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::homeEnd) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::firstLast) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::extendUpDown) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::extendLeftRight) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::extendToHomeEnd) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::extendToFirstLast) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::cancelSelection) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::selectAll) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::isDragSrc) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::normalizedRect) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::cellInRect) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::firstViewableRow) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::lastViewableRow) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::firstViewableCol) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::lastViewableCol) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::condChangeSelection) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::changeSelection) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::defineTablelistHeader) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::hdr_handleMotionDelayed) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::hdr_handleMotion) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::hdr_showOrHideTooltip) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::defineTablelistLabel) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::defineTablelistSubLabel) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::defineTablelistArrow) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::labelEnter) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::labelLeave) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::labelB1Down) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::labelB1Motion) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::labelB1Enter) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::labelB1Leave) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::labelB1Up) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::labelB3Down) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::labelDblB1) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::escape) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::horizAutoScan) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::inResizeArea) [list source [file join $dir tablelistBind.tcl]] +set auto_index(::tablelist::extendConfigSpecs) [list source [file join $dir tablelistConfig.tcl]] +set auto_index(::tablelist::doConfig) [list source [file join $dir tablelistConfig.tcl]] +set auto_index(::tablelist::doCget) [list source [file join $dir tablelistConfig.tcl]] +set auto_index(::tablelist::doColConfig) [list source [file join $dir tablelistConfig.tcl]] +set auto_index(::tablelist::doColCget) [list source [file join $dir tablelistConfig.tcl]] +set auto_index(::tablelist::doRowConfig) [list source [file join $dir tablelistConfig.tcl]] +set auto_index(::tablelist::doRowCget) [list source [file join $dir tablelistConfig.tcl]] +set auto_index(::tablelist::doCellConfig) [list source [file join $dir tablelistConfig.tcl]] +set auto_index(::tablelist::doCellCget) [list source [file join $dir tablelistConfig.tcl]] +set auto_index(::tablelist::makeListVar) [list source [file join $dir tablelistConfig.tcl]] +set auto_index(::tablelist::isRowViewable) [list source [file join $dir tablelistConfig.tcl]] +set auto_index(::tablelist::getCellFont) [list source [file join $dir tablelistConfig.tcl]] +set auto_index(::tablelist::reconfigWindows) [list source [file join $dir tablelistConfig.tcl]] +set auto_index(::tablelist::isCellEditable) [list source [file join $dir tablelistConfig.tcl]] +set auto_index(::tablelist::getEditWindow) [list source [file join $dir tablelistConfig.tcl]] +set auto_index(::tablelist::getVAlignment) [list source [file join $dir tablelistConfig.tcl]] +set auto_index(::tablelist::getConfigParams) [list source [file join $dir tablelistConfig.tcl]] set auto_index(::tablelist::addTkCoreWidgets) [list source [file join $dir tablelistEdit.tcl]] set auto_index(::tablelist::addTileWidgets) [list source [file join $dir tablelistEdit.tcl]] set auto_index(::tablelist::addBWidgetEntry) [list source [file join $dir tablelistEdit.tcl]] @@ -62,6 +169,106 @@ set auto_index(::tablelist::genOptionMouseWheelEvent) [list source [file join $d set auto_index(::tablelist::isKeyReserved) [list source [file join $dir tablelistEdit.tcl]] set auto_index(::tablelist::hasMouseWheelBindings) [list source [file join $dir tablelistEdit.tcl]] set auto_index(::tablelist::isComboTopMapped) [list source [file join $dir tablelistEdit.tcl]] +set auto_index(::tablelist::flat5x3Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::flat5x4Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::flat6x4Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::flat7x4Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::flat7x5Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::flat7x7Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::flat8x4Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::flat8x5Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::flat9x5Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::flat9x6Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::flat11x6Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::flat15x8Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::flatAngle7x4Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::flatAngle7x5Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::flatAngle9x5Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::flatAngle9x6Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::flatAngle9x7Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::flatAngle10x6Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::flatAngle10x7Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::flatAngle11x6Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::flatAngle15x8Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::photo7x4Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::photo7x7Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::photo9x5Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::photo11x6Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::photo15x8Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::sunken8x7Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::sunken10x9Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::sunken12x11Arrows) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::createSortRankImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::createCheckbuttonImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::adwaitaTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::ambianceTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::aquaTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::arcTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::baghiraTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::bicolor1TreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::bicolor2TreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::bicolor3TreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::bicolor4TreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::blueMentaTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::classic1TreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::classic2TreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::classic3TreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::classic4TreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::dustTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::dustSandTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::gtkTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::klearlooksTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::mateTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::mentaTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::mintTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::mint2TreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::newWaveTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::oxygen1TreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::oxygen2TreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::phaseTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::plain1TreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::plain2TreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::plain3TreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::plain4TreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::plastikTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::plastiqueTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::radianceTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::ubuntuTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::ubuntu2TreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::ubuntu3TreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::ubuntuMateTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::vistaAeroTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::vistaAeroTreeImgs_100) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::vistaAeroTreeImgs_125) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::vistaAeroTreeImgs_150) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::vistaAeroTreeImgs_200) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::vistaClassicTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::vistaClassicTreeImgs_100) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::vistaClassicTreeImgs_125) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::vistaClassicTreeImgs_150) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::vistaClassicTreeImgs_200) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::win7AeroTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::win7ClassicTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::win10TreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::win10TreeImgs_100) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::win10TreeImgs_125) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::win10TreeImgs_150) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::win10TreeImgs_200) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::winnativeTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::winxpBlueTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::winxpOliveTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::winxpSilverTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::yuyoTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::createTreeImgs) [list source [file join $dir tablelistImages.tcl]] +set auto_index(::tablelist::moveRow) [list source [file join $dir tablelistMove.tcl]] +set auto_index(::tablelist::moveNode) [list source [file join $dir tablelistMove.tcl]] +set auto_index(::tablelist::moveCol) [list source [file join $dir tablelistMove.tcl]] +set auto_index(::tablelist::sortByColumn) [list source [file join $dir tablelistSort.tcl]] +set auto_index(::tablelist::addToSortColumns) [list source [file join $dir tablelistSort.tcl]] +set auto_index(::tablelist::sortItems) [list source [file join $dir tablelistSort.tcl]] +set auto_index(::tablelist::sortChildren) [list source [file join $dir tablelistSort.tcl]] +set auto_index(::tablelist::sortList) [list source [file join $dir tablelistSort.tcl]] +set auto_index(::tablelist::compareNoCase) [list source [file join $dir tablelistSort.tcl]] set auto_index(::tablelist::setThemeDefaults) [list source [file join $dir tablelistThemes.tcl]] set auto_index(::tablelist::altTheme) [list source [file join $dir tablelistThemes.tcl]] set auto_index(::tablelist::aquaTheme) [list source [file join $dir tablelistThemes.tcl]] @@ -90,31 +297,6 @@ set auto_index(::tablelist::hsv2rgb) [list source [file join $dir tablelistTheme set auto_index(::tablelist::getKdeConfigVal) [list source [file join $dir tablelistThemes.tcl]] set auto_index(::tablelist::makeKdeDirList) [list source [file join $dir tablelistThemes.tcl]] set auto_index(::tablelist::readKdeConfigVal) [list source [file join $dir tablelistThemes.tcl]] -set auto_index(::tablelist::sortByColumn) [list source [file join $dir tablelistSort.tcl]] -set auto_index(::tablelist::addToSortColumns) [list source [file join $dir tablelistSort.tcl]] -set auto_index(::tablelist::sortItems) [list source [file join $dir tablelistSort.tcl]] -set auto_index(::tablelist::sortChildren) [list source [file join $dir tablelistSort.tcl]] -set auto_index(::tablelist::sortList) [list source [file join $dir tablelistSort.tcl]] -set auto_index(::tablelist::compareNoCase) [list source [file join $dir tablelistSort.tcl]] -set auto_index(::tablelist::moveRow) [list source [file join $dir tablelistMove.tcl]] -set auto_index(::tablelist::moveNode) [list source [file join $dir tablelistMove.tcl]] -set auto_index(::tablelist::moveCol) [list source [file join $dir tablelistMove.tcl]] -set auto_index(::mwutil::makeFocusProcs) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::getChildren) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::wrongNumArgs) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::getAncestorByClass) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::convEventFields) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::defineKeyNav) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::processTraversal) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::configureWidget) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::fullConfigOpt) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::fullOpt) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::enumOpts) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::configureSubCmd) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::attribSubCmd) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::hasattribSubCmd) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::unsetattribSubCmd) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::getScrollInfo) [list source [file join $dir mwutil.tcl]] set auto_index(::tablelist::getCurrentTheme) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::destroyed) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::rowIndex) [list source [file join $dir tablelistUtil.tcl]] @@ -194,7 +376,6 @@ set auto_index(::tablelist::updateHScrlbar) [list source [file join $dir tableli set auto_index(::tablelist::updateVScrlbarWhenIdle) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::updateVScrlbar) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::forceRedraw) [list source [file join $dir tablelistUtil.tcl]] -set auto_index(::tablelist::purgeWidgets) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::adjustElidedText) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::hdr_adjustElidedText) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::redisplayWhenIdle) [list source [file join $dir tablelistUtil.tcl]] @@ -208,7 +389,7 @@ set auto_index(::tablelist::showLineNumbersWhenIdle) [list source [file join $di set auto_index(::tablelist::showLineNumbers) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::updateViewWhenIdle) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::updateView) [list source [file join $dir tablelistUtil.tcl]] -set auto_index(::tablelist::destroyWidgets) [list source [file join $dir tablelistUtil.tcl]] +set auto_index(::tablelist::purgeWidgets) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::synchronize) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::getSublabels) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::parseLabelPath) [list source [file join $dir tablelistUtil.tcl]] @@ -235,188 +416,6 @@ set auto_index(::tablelist::makeCheckbutton) [list source [file join $dir tablel set auto_index(::tablelist::createFrameWithTileCheckbutton) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::hdr_createFrameWithTileCheckbutton) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::makeTileCheckbutton) [list source [file join $dir tablelistUtil.tcl]] -set auto_index(::tablelist::getTablelistColumn) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::getTablelistPath) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::convEventFields) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::delaySashPosUpdates) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::addActiveTag) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::removeActiveTag) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::cleanup) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::updateCanvases) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::updateConfigSpecs) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::cleanupWindow) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::defineTablelistBody) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::invokeMotionHandler) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::handleMotionDelayed) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::handleMotion) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::showOrHideTooltip) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::updateExpCollCtrl) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::updateCursor) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::makeEditCursor) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::wasExpCollCtrlClicked) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::condEditContainingCell) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::condBeginMove) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::beginSelect) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::condAutoScan) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::autoScan) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::minScrollableX) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::motion) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::condShowTarget) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::moveOrActivate) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::condEvalInvokeCmd) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::cancelMove) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::beginExtend) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::beginToggle) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::condEditActiveCell) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::plusMinus) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::nextPrevCell) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::upDown) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::leftRight) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::priorNext) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::homeEnd) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::firstLast) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::extendUpDown) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::extendLeftRight) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::extendToHomeEnd) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::extendToFirstLast) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::cancelSelection) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::selectAll) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::isDragSrc) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::normalizedRect) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::cellInRect) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::firstViewableRow) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::lastViewableRow) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::firstViewableCol) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::lastViewableCol) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::condChangeSelection) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::changeSelection) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::defineTablelistHeader) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::hdr_handleMotionDelayed) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::hdr_handleMotion) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::hdr_showOrHideTooltip) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::defineTablelistLabel) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::defineTablelistSubLabel) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::defineTablelistArrow) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::labelEnter) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::labelLeave) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::labelB1Down) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::labelB1Motion) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::labelB1Enter) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::labelB1Leave) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::labelB1Up) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::labelB3Down) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::labelDblB1) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::escape) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::horizAutoScan) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::inResizeArea) [list source [file join $dir tablelistBind.tcl]] -set auto_index(::tablelist::extendConfigSpecs) [list source [file join $dir tablelistConfig.tcl]] -set auto_index(::tablelist::doConfig) [list source [file join $dir tablelistConfig.tcl]] -set auto_index(::tablelist::doCget) [list source [file join $dir tablelistConfig.tcl]] -set auto_index(::tablelist::doColConfig) [list source [file join $dir tablelistConfig.tcl]] -set auto_index(::tablelist::doColCget) [list source [file join $dir tablelistConfig.tcl]] -set auto_index(::tablelist::doRowConfig) [list source [file join $dir tablelistConfig.tcl]] -set auto_index(::tablelist::doRowCget) [list source [file join $dir tablelistConfig.tcl]] -set auto_index(::tablelist::doCellConfig) [list source [file join $dir tablelistConfig.tcl]] -set auto_index(::tablelist::doCellCget) [list source [file join $dir tablelistConfig.tcl]] -set auto_index(::tablelist::makeListVar) [list source [file join $dir tablelistConfig.tcl]] -set auto_index(::tablelist::isRowViewable) [list source [file join $dir tablelistConfig.tcl]] -set auto_index(::tablelist::getCellFont) [list source [file join $dir tablelistConfig.tcl]] -set auto_index(::tablelist::reconfigWindows) [list source [file join $dir tablelistConfig.tcl]] -set auto_index(::tablelist::isCellEditable) [list source [file join $dir tablelistConfig.tcl]] -set auto_index(::tablelist::getEditWindow) [list source [file join $dir tablelistConfig.tcl]] -set auto_index(::tablelist::getVAlignment) [list source [file join $dir tablelistConfig.tcl]] -set auto_index(::tablelist::getConfigParams) [list source [file join $dir tablelistConfig.tcl]] -set auto_index(::tablelist::flat5x3Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::flat5x4Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::flat6x4Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::flat7x4Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::flat7x5Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::flat7x7Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::flat8x4Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::flat8x5Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::flat9x5Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::flat9x6Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::flat11x6Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::flat15x8Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::flatAngle7x4Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::flatAngle7x5Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::flatAngle9x5Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::flatAngle9x6Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::flatAngle9x7Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::flatAngle10x6Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::flatAngle10x7Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::flatAngle11x6Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::flatAngle15x8Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::photo7x4Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::photo7x7Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::photo9x5Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::photo11x6Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::photo15x8Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::sunken8x7Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::sunken10x9Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::sunken12x11Arrows) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::createSortRankImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::createCheckbuttonImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::adwaitaTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::ambianceTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::aquaTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::arcTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::baghiraTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::bicolor1TreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::bicolor2TreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::bicolor3TreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::bicolor4TreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::blueMentaTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::classic1TreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::classic2TreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::classic3TreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::classic4TreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::dustTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::dustSandTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::gtkTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::klearlooksTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::mateTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::mentaTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::mintTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::mint2TreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::newWaveTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::oxygen1TreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::oxygen2TreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::phaseTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::plain1TreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::plain2TreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::plain3TreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::plain4TreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::plastikTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::plastiqueTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::radianceTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::ubuntuTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::ubuntu2TreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::ubuntu3TreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::ubuntuMateTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::vistaAeroTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::vistaAeroTreeImgs_100) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::vistaAeroTreeImgs_125) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::vistaAeroTreeImgs_150) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::vistaAeroTreeImgs_200) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::vistaClassicTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::vistaClassicTreeImgs_100) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::vistaClassicTreeImgs_125) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::vistaClassicTreeImgs_150) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::vistaClassicTreeImgs_200) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::win7AeroTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::win7ClassicTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::win10TreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::win10TreeImgs_100) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::win10TreeImgs_125) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::win10TreeImgs_150) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::win10TreeImgs_200) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::winnativeTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::winxpBlueTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::winxpOliveTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::winxpSilverTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::yuyoTreeImgs) [list source [file join $dir tablelistImages.tcl]] -set auto_index(::tablelist::createTreeImgs) [list source [file join $dir tablelistImages.tcl]] set auto_index(::tablelist::createTileAliases) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::restrictCmdOpts) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::restrictArrowStyles) [list source [file join $dir tablelistWidget.tcl]] @@ -628,6 +627,7 @@ set auto_index(::tablelist::seeCell) [list source [file join $dir tablelistWidge set auto_index(::tablelist::rowSelection) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::horizMoveTo) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::vertMoveTo) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::dragTo) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::seeTextIdx) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::updateIdletasksDelayed) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::updateIdletasks) [list source [file join $dir tablelistWidget.tcl]] From 2420a1b365fe26221f443c40f30b7c650eed5962 Mon Sep 17 00:00:00 2001 From: csaba Date: Tue, 22 May 2018 15:15:31 +0000 Subject: [PATCH 052/150] * doc/arrowStyles_vista.png: Updated screenshots. * doc/browse.png: * doc/browseTree.png: * doc/bwidget.png: * doc/config.png: * doc/dirViewer.png: * doc/embeddedWindows.png: * doc/embeddedWindows_tile.png: * doc/styles.png: * doc/tileWidgets.png: --- modules/tablelist/doc/arrowStyles_vista.png | Bin 5051 -> 4647 bytes modules/tablelist/doc/browse.png | Bin 6064 -> 6150 bytes modules/tablelist/doc/browseTree.png | Bin 9360 -> 9295 bytes modules/tablelist/doc/bwidget.png | Bin 12149 -> 12119 bytes modules/tablelist/doc/config.png | Bin 13531 -> 13592 bytes modules/tablelist/doc/dirViewer.png | Bin 10787 -> 10820 bytes modules/tablelist/doc/embeddedWindows.png | Bin 7411 -> 7490 bytes .../tablelist/doc/embeddedWindows_tile.png | Bin 7279 -> 7315 bytes modules/tablelist/doc/styles.png | Bin 12063 -> 12018 bytes modules/tablelist/doc/tileWidgets.png | Bin 12034 -> 11931 bytes 10 files changed, 0 insertions(+), 0 deletions(-) diff --git a/modules/tablelist/doc/arrowStyles_vista.png b/modules/tablelist/doc/arrowStyles_vista.png index 5c12b5b71a0fad65174b3080fafab676106d1d8d..da7ca8ca71853cbc5fba0331b5272189b876c349 100644 GIT binary patch literal 4647 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 literal 5051 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 bTqZx@OVbNLY^t4{!NK&kjkPK@?1KISEGtnD diff --git a/modules/tablelist/doc/browse.png b/modules/tablelist/doc/browse.png index 0b2407eb6893bd9626f7cf3ac8823ecc79609b92..24c547f1a195099729118f41e97b611f86974fa5 100644 GIT binary patch delta 5927 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 bT}@N@N{JFa-XC-)oWbC}i7w&Z)A0WTP7=Uq literal 6064 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 EA20P^0ssI2 literal 9360 zcmZX4cRbtC*FPQ9>QrhMMXhSB)UMr9Vvky-lp;P#X+j01Mp0F(gsMGiuNWbO|YT)S{x{0^g>;`M8+w@fsyOFU!cd?3KiaM$0KlTJVq zd|&!ep!g;FN4e5k9*p{h!r;g^8iFob8c@JhBI|tswS;#SBpxDifWQG zYdZ*4+6}0>puwGm)^L0qq^qa%$Jhd9FmGaNe0RQ}d1HTmaTbf;-rZK=}|GKCC@!#)@`pkTn6#%%p7>>^@{%D z@GyrwNv^9mRX@HT8J`o%GoBPJrd(xR<}O)Tj=u_wN;$^yJL89H`S=<7b|b3Z{3!_R z<_pnZ9>|2~Yq8|XwacNN{F&LhAz8WoluszQigWsc`+3UPr?;1>grMiA{g951h8AF| zE?E3j%;5(yK7{DZ9l%{I*Mm2zTaYSkMsH5``@c2~{lgwiD3m|yGcqy?^cbkNz8&S> z5=5s@q*;YLLdAV>h&^-Kt?R=C3DuPdgpH`iLirgYYnA5wlv)sw!r7e|`6w~z>FJ+M zh17{8*(XZC-U%2RbhNpg{qFS$r($XvX6?!!|4)3yZWDIotTIFQUAqBaDB>};-80n; zdrSNT8%5u%w~ikd0?4OU=X?L675%jL@-WU5E@__LBOBQ##QhsrJ5l8-rblH49U)_F zI`{ookUypqRj`-GTVLO5YC<*1T+RjU6QJw*o`CBkQ&dxK0x}$aRx$=OzMqQ)vG8(- ztG4{6objJT{7@nJ9KB6CAZ2U}-9Xur#sp|w($ygm1vS|0<8SX- z?SmaGY5^G)J+n1#uE*M6)up?j6)g-#?WYF#sG`*|?@!YY$}Y&RkX4D}>L7jHuilO~ zUE9-C87y{9$>h=x^V{$I)fFyroO|o}Fd$*1ZXP9Ll!{f>G`KDDRnyUcSBP3=Ljr%a z`Mo83B=Crz2I1fTEF*TqXZ}N@3+lM*^&R~IFqmEzHvi*}c^C5MSJ=*byY@I53M z+}V9zTceCyMgEhez)V))wu-I9U7~JnsDkrKg`En|>#y(pU)7`^auZ4I_TtUpc z7+ADjbUG;?17AU#b%^u+5Q-gsfFAwzsM{^4CREP3D;)mg%p%;*Ujq3o;L13kpufMr zT&49kJD7v@D^7V2)~JbHun^YL9Xo&)RPiXFBCivf&Eeh$_L(eacR3>;_e~sjtc9p- zUx6rx%8$)E&31G76Fa9ByM>G1{Q6x4$L?|bbh+{C&6A8=)Y zuVm0)A_8=JjDH;qVl*}-cIwvHpn5K*`Ee6xyzYQss|1cvv|cU)TYmSKAZ9XrLV5}} z`9aYUWMNw-(M*;0nRO%U=S4{~S#`0=Jhx#`IZIqy&EspHu}Icl%th4lYhsFi!jupM z07IMXz^IO!t4A!C!*CIxt(!Ci7H|$QBaFq&ixad^an}IHb`CZ+f)=G6$41i9Vo8J% zwbm*f?Ng#^@zmHa`COoEgPR2 zgQIyo6!li^e(#0Fk`Qw-B`&$XP!Lbz_8b%Z!5ki_jY28eS*cjy&W;g%iv4iQz2a*d zp9{4HFdNP`%SDPblkgeLqxXMX){n| zKr|__kaRDVdp2f|LuK$iX+aozdI}4ilB+qgo``HA%ZQ4{N?y*oe&hpb#Wi>;*%F(A zdZtzlVFCFOh5}-BbrF#+k**k=8|(!&V72q2-6}qpdM3tc-h8~iBYgGl+mVb4F(uK~ zvw;X$$kRKpd7mH--`~qB=Si}nMcv#I<_!bBdwms4Diaw$NIGmHG)hA~J;!GKd+7-) zEr=D+YwV?8H}W~VfdRgdMX8A~hx;w3$=aJ>6Nj?W&s}aG3hTH<<$5b`E#+@~SN!;_ zkWVY|YvP(W*{D`yRI_oGU9rjjz0?dO0soP}Ty)->`|GvQO=#B3t_WBkm~1_GIo+K> z&ON>A^4G*lcqS`e7`449!Hw=p(R@gOae8PJGUiDOMj1cjg)x4 zXy;&5iU!HLAtm39--FGcu)cuL`#cZtKQTFG?6nd)TW^T~nNP?)=nqtTzwbB#T7lH@ zh#nr7EOl4~+`mP|gTna^{@_}IB%IiU^IAu>JXA>3o(0Qeeuy@1M+|Vy_@VCTejL<$ zI(WqWS5?W7&P5Hb+_|W9 zgMXq_Gs+u|<1>mHF+m{ZZy({9fhcV#BDqqX#r5X-*keJOa}rn!$uQvp6t}*P_utF? z9lMIYl!?sfY@GoC?B3$D7oZ*4wUY*4q859W~saPn-m9Ao@st zJrOY_ioa%-8oG>3CA=!HXZ7}mq@p8hS5dD3=ag;P-U{~v1@9xFk>&; zF|bW=TRz%?2Ax67poXbS8PsQOLz;mD7kLx2hP?2!s^^u~Gl^@H8 z)xyc`k~Cg2!Yr+Pmn*OP`=lq9*ERZS3_${8(#vu3ZqaO`I1y zEb~oklv?-?k3*}~9Oe=7wfvNpMIl6ut6UGv%n0S@XK)LYAZYo@q3{bjPEihd`sqg{ z?j-M9=Yg}4;#uojBC{SsC&|ev%-;V5a#9d(x+&v)a;vBk;aqF-qZE7uZ>sI}+IxxB3fKcPoczmg#asGy*M=YFu-(&AvFjB9gf!l^@ zV14HVis=E$^~x;z8j$atU5p z?@KEY4u7Nlc3-5~%*{ME%in91kr+TQ)sH%t(GtsBn$mTj_KKbJ^jflKLdBFSt1Unr z{em0frw3x39 zYqUa)(dks2vJ7x9Cu7Ej12F;qL7TXr(N8pj(%r#72Ob_>bA=h>2ry5v*jA zsfEYFrHeKnQfBBp#>976IRkd((#U{4n^yhnPh+J!If*sq__g7$AWpFNhZ_6zNu^Hu z$d|EIe`~h5nda<`9c`4C63_P%=aA^Bk@_JVv{%*J^9HIT1!wl7rml0{r?dCn%$BEI z=M=iGWy>So8qU#{ww`{`K*FsSS`xJ<@B_BeK}Re<(1$e0!sDu%pZwuV<`J9;hVnNu^JBY*I}v(XEMF)xWt0Hc28b8-pzfh@$6bjl}Q zbLrQcelV3lSL3fKpZEEc*L?CVxvu9_{}b}>F$*_PtRtm0x@G~#G!pc!j_^|vpb#(7 zNrRtjv|EJ!k3K%qWc(3o)Z#tme+goCW!?%-Q~EY{AUe4+QSFlTc@NEt!Pu%;>UFHIz&KnK z?$cfdY!6B-zIy0@*FB*xX7-zkDzFm*weZhMPi{fVxdf!sPF06A3S?3=D+}FKReZE+ zy7)vtL3v^QVdqHjWUySh4GPweYp@vdgvMKmCxR>N4Wjc4d{Y>Kuk+t5em$oP$+d+^ z^MC`=CxnYdOs%B9fiTX2G=yz{nwH`+VZT_*UZkLzJZYDHVrRvNk7a*dZkhFfk9-U7 z*IB#+vx=R1=!9k+9U4Url01<);_QP6yi~_U!ps6Pvlpl!bOyP()J<)2eZ558pQ)aX zRy}W@o#B7_a_}$>X^FE{N(KqcFaGWQj2u~%EjcJkKX?u+Y7YC|lU)d)mrYCA;{P2Q zJbaXjo5g*Wk`!Aw+8q<3AOZ5_G_|yV2zsjgywo&V*nKC&w_!X#1##s;V4vlEv7b%@ zEU)S&9wc}%OxjH?kR&)$7yh%x&dK(aKjN$YicAZtC15!~mUSc=59{t#{>5SG7&h;5 zo!cz&`4!rEKZ=8=<`*yeoa3f3_D|r-3jtN`yT|o`q!{ePuT^WX0SgVaCWUbRvPJOGjr0WhjS9tj>K--__a&d4J=_qb3{{3G5ng;3>O0V?oO-)}C2kU82 zBhRKorZ#T}ODvLpG1k+6W~In2)~h*GOsQ(=mH3n7-32Fe^dlWtCrM^+ER0b>Ih-0J7my|4d}*R+x>?zKoMuUW4r=ZMX+Z5$ zoXj7QG>LlYU-w`}avkp@mlo;|ldPwI<>>o5941Z9p0VW2eH+Fe`LiPnpcvWWL zIEKME>%IfNl%IU9elknds-sz_@w{$$9T8DzwkUU)^qGypZR9xVb8{|ZhWMUUDeQU$ z;~zFFxEtpn(9OYWCEX9)*A+Q+;{REXA{-p79{kU^yPfW4LdAZ3he;yutY4ZeBEhms zI$_8jx{ki|1H`blMule80YYiLOvLH)iydA^*xg~F@%JA1p6oFN%H}t73k}mX#^Qe? zL$_6jDZ6()t$oO3{dC`>Z!#L3%qbXS_Cl5zhSV(w40Xn1Ij zGs=~#S_UFlta`WUQVbyhy;&9dZ6uI!M;~dC9i1YO1-#nL5wG84?Y}88nCy1^GAW|j z=?|3S!ne9*;ie9ZeXwFq3`kOPE@s0Bnr&0)Se=m;4J9>)CO0q2We}zgf___;b~kea zXZcewROH|U;IGS6Qw3u%#(7QT*e=TEks^?Hq29T*|I-(0n+q`baT9zaK&7hJB0#qp zb8nH$M6?I2k^;5N+wiSdSTfhF{0!N5?%hW`yHxT7yZV<& z>l$JgzfUb`*321Rdd4COXik@ZXXgn*Rw-H206bb*Uua?K!dfke&;0SODL4C)aRy}Z z`9Z*=@b~Qly!91UsX$W6m4cZ3yB#b2IL|#nl3C-6rxwj&ANqa)IwB_0%99RfVpnjy zXo%s*AqDi!v%|TEZvy)6Kox}0>Fcw)gE)7Lmat}mgT`s~0ft5JcB14&#M6$$H|tgR z;Dg3Slw{ZfW7wP(Ed#&KQ0m9kF=y|ZE_wxz+3&4(Cf|i84C4MBP8Nx?@b}F6h__PC zH&7+u7KzHx)Itp%k^hkl6pn#K7^oIajNXlpzXpV>oCv9mc-LA`ep&Kb$$WWmjRiP9 zYHt%9H_?@hSjrjg+;LMKJPJeMe^`cfb0o(yPCTu-6XK$;^H&GWvV+>{rl8vqkfsQ> zZYlKY)s`*VGv=a5HPn|t=Y3^>^VvbboF3*tnNX-W=FIxl)!^`V(Hled&m2{xobj9l z2RhFy8F*f0EKSmj^WmVfV?lwqhk%i>HobLa^Ub5v9H_u4A|ME~k1#P8Q+}$wA24U? zU1Ob`;`;L7_xQ&+(3BfWC}i8WHvAR|^XT2p@7WOxnJ;@_^QrdlL78lV7iQWc7>L={ zi#>2Oi4&T>bt8FC@FOg^m1o69=dUgrmE!UwH91NS{i=y&#c0_-!dr3i=c{wpwysG$ zp9J|7nx!1&74!wZ5#y*3ISFgtYk3fyRBC)7KG@XxTI`TD~?K=Zw&7GJ&fmV#%KYt;VveHb%+;B~z z>LDB;ej$E8Qyf4Tn2$nlTEeM`48Ja+qa)6Iy&(z$3%-YECWlfNfhH#XsG{^O^!p` z|C@qe?!$h5W)^-s{rQ(uKTA$q{NcNRpDYbKG;MPO6c_lpybii;Y;L1%E;NTHLZ!yO zFlO;creLx&c!tIzp-~~AN!No4(^g)F3U#S%sB4ZUvjJ{6|7#>#o)QLx2WKi>uF^$3 zTCx{EM<7GjOH`Az==c+h)-@}*Wq_6)oNH2IhE})Lxx*wV&83Wr%dBxhG1qUfMM%hf zb7l7`u%=Ov=3f%0#K$IA^JK#%;z<=>Uay z;rNueB_zb)8hU5Vsu#{GnZ2Jl*NvFoIvj&?IEQ=2*Ap?8gX;ZDl)1&HwcWY?dI#i*K)|DE1gwOI$0Q($=3g)BFQmm8Q4CVBm0E<=sdz1?J7LYgx#qo3o~e} zQP94N!g37fF!Iik!$01yox_rkVw2n$(4Rydt)rfv2;@ix?auKn?^~U@ZhYQg-#Q$@ z!e1u>G%-?J4&zuX?$_H>#G2jgt0Y=)Gb+!=@`wTK*3+>|Id>c9j>HE7+akd1T zD9_izC{XdU?)cI~eFFQPG|(nIw_RdSQ_|czRAbdNYos@x?g_lw*~C)aqa0NnpOTcf zG9{BtUf|k@|MG}itE2y9OUSDG3%q+mc$R6d$Kcj-{;s2l&zEyc$hiO>eN&=NL6op` z(zeR1ZKR!FsJm&8qsQ~(;tI}IzbKMfL+-rN8ZjKHkTzhKAUO2y# zp7q!(b$a4a192>u+)Yp=OZcN)7|c+}M^Q#9sFU6jjBQbNwxiqtUVUaxtjr<$JX->` zE*1>XH&ee8@wpcQW`3D_Zo+{%UNtwa$2iTijI!o3wr`UG10JrAYqIT95P_R~9AHS5 zK?EUT;>j4k&c|ZV3{o)=_qKcx%Q#2v&k0j!tGRL@FaD1i@K*n%bI^YrHZUOJ!}N6U zI4{bMdj?Xno?WVAsvwW;w@mVp9QClV4zOja!6f^X4>Gg1hs5K;M9{gBNYmAZpoaJ# z%S0FnY4`*E{#bAsn0#J#fVc;*2c5VKnB)6t@A+2vPq7onTs|#o|M-&pw>s~KZ>fj1 z?Kov=%sIcS)W+lAmIL+XXWT6NJ?!D2TjtvJ%t}{aNQ>PdfGV7@lSUSPin~AGM_&D1 z3mGIA3c~9rY|3dXdzK%sY@~2K{WiQmRK)D`8lBri0Z+daGRqr;I~CW|x=FziU=5*IyJ^v4YcL zi`RS=ntMZg5ry|2Uk&K{E}xkE9Y~?arfuzwhYHnm&&|2sGD*`R>>|sj$4~ET&(_P1 zl`s|nmcq164E@Ufoakl&_>Flk6k>(mR}FQuukRup{nmyKOnn8n+ZYtqt%FN-Pm#Uu&b#iDle=`03LC9^<6KdrcIKf)nGF#ugahw#?EWiLPW}7*y zj)$b5!@imADTiXrh$A12qM6$Mse2UA2ZcsaP|(pS72BuuWJ!w569a?L$nimM7=oM< zZ~wJ4+d3n4&4fltf-ayB|IqyTNbRvC1hv{4U-12FW78QW9@H6ehONr?E(3Y;iK>IT zYPc_%boC1!=``5xZoY*W>>yuM+<(zoC5)dx>h&21UPmDNWWf;^jBF_cpB2X5iv5@( zPu|*lAmyZjMp=5yu%C_e4_GYPukAPm1;Z53_LmB$7FhK#(Uk(6zpYR zx009b{cH23ITyh0bUD+YY_3eBxcY&_OO+U{$Hrl9iLJxNAx5tHIwyVVi*ME)8%Zsr z!fr)Cp$y^BBOv%NDGx>Fl$wLgo%=+nr2w#&^T3Av1yrP)^>VUKtC9P`d?lZ9RV3a; z$1koxI!Xkrl^T!W!av>r%L7WM{hju-ra5;qQ&>|&=0Wn1DajG;-DKmLiY#GxI0F$v zKcUWvAabB-qC&rvzx(>hv(HZEx!J?4fLy}Myf~SLIX^jl%NGH<)MsN?*&ZXConTEc zUk!~!i?O>HrF7ir&Vak(--aM{?DT;iJxa69sWQ53rW_14R7nGWmdbV>n zrq;e>8dbjxsM$+q9e28lw3Rp+I7DNxqPag}CC1Qvi{bN|wEdx=vyB*;^_FP?E zBh2eon-LK@6+>B0d<}^>z+MNU{%>MIw8N@rX;veu# zxqOq^FUjbP_*^bPabdnt%&imW+s>lq=Ta6pGB=NvW`ou%S0rV|uWD6g3MmtDcdXUh~OiuN#OAe}xn$^)Y4p+bYxh3WDXK?|k?<)ce(Teu6VPoJfVEBf%JUHcKmn!?q3#eGS zwXf^fet^6@GZN0vKt?v=;jNCPSi&eF6YSj>= zK48De;#4=BffIDdf;gr6NhwQw1__~k=s6!me{dPf9mFl*bD({FtLz+^_rgIBqpNH< z)oWf_KZlPj0eonJ#lzrwYwSxo*|tLcr3~>71XRgwKxmMa5>Rvai3s@m$6nUrw?Mbk4qMd!7wq$ z@AndrS7Wetb^8=kj$Zv|L6jlIy6qek5BP6GhGOUY*8pm$Tf38CcqIFEAN9wB!D9Lp z1~&pkxz0vMQxM)eEVjU^o39cXfc2x`J4X~*8tXpu?}dkEH--vYB>+79ZiM`-*@bc3 z+^*%rcJnPm7Uv+pv;RF3+4ua2g2aKE9bBZ@B_t%yc=;K+Zs|n}H$QuXt^J93>e&QR zZ8 z?(Wud?%y<&K0&DZ%){3~|8&S+t?r@7&{4jp$w^ikFb1jpx!}=_xNtc_oiakLQZ8R_ zt`nv{^SSP(65T=vNpEKy;4CRRt)e}v9jZ(Ge G@BbexY#~zs diff --git a/modules/tablelist/doc/bwidget.png b/modules/tablelist/doc/bwidget.png index e5fb7844e5bba9a92f669da3c5326a1e9d97e8f9..598bf15b54a7f44df8f1977a24ccab247af627b2 100644 GIT binary patch literal 12119 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 j=>j+;=^UwVAF`{MZH8Esk;boztqhkXRdMG-& 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 T(GffrdPG;pP`mKvqrm?KFV>m< literal 10787 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 diff --git a/modules/tablelist/doc/embeddedWindows.png b/modules/tablelist/doc/embeddedWindows.png index 43e9df081712215878a819db505b2df84c105eeb..81320c1785685ae3c33ee59185222eed78135393 100644 GIT binary patch literal 7490 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 literal 7411 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 diff --git a/modules/tablelist/doc/embeddedWindows_tile.png b/modules/tablelist/doc/embeddedWindows_tile.png index de8b92c29cb2a79e535b47240fa5e27fd3864b05..bdfd605ae47e754d2cd7dade330dc6850161388b 100644 GIT binary patch literal 7315 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 BkOu$& diff --git a/modules/tablelist/doc/styles.png b/modules/tablelist/doc/styles.png index 7bdc4f40007dba61e588aca3746568af3d159e6a..8493f6450f715e895f3a2562e96a4153f7b2a63e 100644 GIT binary patch literal 12018 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 literal 12063 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 HCxQP3&K~;3 literal 12034 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 From 3ee90a205056a09958dd20a3c98800f973f8761c Mon Sep 17 00:00:00 2001 From: csaba Date: Fri, 25 May 2018 11:45:24 +0000 Subject: [PATCH 053/150] * doc/tablelist.html: Minor correction. --- modules/tablelist/ChangeLog | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/tablelist/ChangeLog b/modules/tablelist/ChangeLog index df219b90..9141bdfb 100644 --- a/modules/tablelist/ChangeLog +++ b/modules/tablelist/ChangeLog @@ -1,3 +1,7 @@ +2018-05-25 Csaba Nemethi + + * doc/tablelist.html: Minor correction. + 2018-05-22 Csaba Nemethi * *.tcl: Bumped the version number to 6.2. From 772e84a1b1e8ddc8cf0784d60800c1eb26822398 Mon Sep 17 00:00:00 2001 From: csaba Date: Fri, 25 May 2018 11:47:03 +0000 Subject: [PATCH 054/150] * doc/tablelist.html: Minor correction. --- modules/tablelist/doc/tablelist.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tablelist/doc/tablelist.html b/modules/tablelist/doc/tablelist.html index 09896d3b..da4018b0 100644 --- a/modules/tablelist/doc/tablelist.html +++ b/modules/tablelist/doc/tablelist.html @@ -1009,7 +1009,7 @@

    Two Widget Browsers Based on a tablelist

    browseTree.tcl is a multi-column tree widget:

    - Widget Browser + Widget Browser

    The demo::displayChildren command inserts some data of the From 619f483d3791bd177536d21185819972290a8582 Mon Sep 17 00:00:00 2001 From: csaba Date: Fri, 25 May 2018 14:12:09 +0000 Subject: [PATCH 055/150] * doc/browseTree.png: Updated. * doc/tablelist.html: --- modules/tablelist/ChangeLog | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/tablelist/ChangeLog b/modules/tablelist/ChangeLog index 9141bdfb..e07f7112 100644 --- a/modules/tablelist/ChangeLog +++ b/modules/tablelist/ChangeLog @@ -1,3 +1,8 @@ +2018-05-25 Csaba Nemethi + + * doc/browseTree.png: Updated. + * doc/tablelist.html: + 2018-05-25 Csaba Nemethi * doc/tablelist.html: Minor correction. From b98cf72645dd7ce3b2c1a785d71c602f3d408fa2 Mon Sep 17 00:00:00 2001 From: csaba Date: Fri, 25 May 2018 14:13:45 +0000 Subject: [PATCH 056/150] * doc/browseTree.png: Updated. * doc/tablelist.html: --- modules/tablelist/doc/browseTree.png | Bin 9295 -> 8995 bytes modules/tablelist/doc/tablelist.html | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tablelist/doc/browseTree.png b/modules/tablelist/doc/browseTree.png index aa8e6bf1a85650cb3ffb9f4fb30abdfb61ee2522..eaa443fbf1c1b8f47d633fa831b2c408ea81db40 100644 GIT binary patch literal 8995 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 literal 9295 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 EA20P^0ssI2 diff --git a/modules/tablelist/doc/tablelist.html b/modules/tablelist/doc/tablelist.html index da4018b0..09896d3b 100644 --- a/modules/tablelist/doc/tablelist.html +++ b/modules/tablelist/doc/tablelist.html @@ -1009,7 +1009,7 @@

    Two Widget Browsers Based on a tablelist

    browseTree.tcl is a multi-column tree widget:

    - Widget Browser + Widget Browser

    The demo::displayChildren command inserts some data of the From 6bb1383e706b461b55ec9257d864aa5fef8342ce Mon Sep 17 00:00:00 2001 From: csaba Date: Tue, 5 Jun 2018 09:08:57 +0000 Subject: [PATCH 057/150] * doc/tablelist.html: Using the "cornerpath" subcommand not * doc/tablelistWidget.html: only on Mac OS X Aqua but also on * ../../examples/tablelist/*.tcl: X11. * CHANGES.txt: Updated to reflect the changes. * doc/browse.png: Updated screenshots. * doc/browseTree.png: * doc/bwidget.png: * doc/config.png: * doc/dirViewer.png: * doc/embeddedWindows.png: * doc/embeddedWindows_tile.png: * doc/styles.png: * doc/tileWidgets.png: --- modules/tablelist/ChangeLog | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/modules/tablelist/ChangeLog b/modules/tablelist/ChangeLog index e07f7112..1b2ef376 100644 --- a/modules/tablelist/ChangeLog +++ b/modules/tablelist/ChangeLog @@ -1,3 +1,21 @@ +2018-06-05 Csaba Nemethi + + * doc/tablelist.html: Using the "cornerpath" subcommand not + * doc/tablelistWidget.html: only on Mac OS X Aqua but also on + * ../../examples/tablelist/*.tcl: X11. + + * CHANGES.txt: Updated to reflect the changes. + + * doc/browse.png: Updated screenshots. + * doc/browseTree.png: + * doc/bwidget.png: + * doc/config.png: + * doc/dirViewer.png: + * doc/embeddedWindows.png: + * doc/embeddedWindows_tile.png: + * doc/styles.png: + * doc/tileWidgets.png: + 2018-05-25 Csaba Nemethi * doc/browseTree.png: Updated. From a5f22d51f429330af8831f66cb6b0a488eb34d07 Mon Sep 17 00:00:00 2001 From: csaba Date: Tue, 5 Jun 2018 09:10:21 +0000 Subject: [PATCH 058/150] * doc/tablelist.html: Using the "cornerpath" subcommand not * doc/tablelistWidget.html: only on Mac OS X Aqua but also on * ../../examples/tablelist/*.tcl: X11. --- examples/tablelist/browse.tcl | 6 ++-- examples/tablelist/browseTree.tcl | 6 ++-- examples/tablelist/browseTree_tile.tcl | 6 ++-- examples/tablelist/browse_tile.tcl | 6 ++-- examples/tablelist/config.tcl | 6 ++-- examples/tablelist/config_tile.tcl | 6 ++-- examples/tablelist/dirViewer.tcl | 6 ++-- examples/tablelist/dirViewer_tile.tcl | 6 ++-- examples/tablelist/embeddedWindows.tcl | 6 ++-- examples/tablelist/embeddedWindows_tile.tcl | 6 ++-- modules/tablelist/doc/tablelist.html | 39 +++++++++++---------- modules/tablelist/doc/tablelistWidget.html | 25 ++++++------- 12 files changed, 64 insertions(+), 60 deletions(-) diff --git a/examples/tablelist/browse.tcl b/examples/tablelist/browse.tcl index 465d1094..5f0ab8e0 100644 --- a/examples/tablelist/browse.tcl +++ b/examples/tablelist/browse.tcl @@ -120,11 +120,11 @@ proc demo::displayChildren w { # grid $tbl -row 0 -rowspan 2 -column 0 -sticky news variable winSys ;# see config.tcl - if {[string compare $winSys "aqua"] == 0} { + if {[string compare $winSys "win32"] == 0} { + grid $vsb -row 0 -rowspan 2 -column 1 -sticky ns + } else { grid [$tbl cornerpath] -row 0 -column 1 -sticky ew grid $vsb -row 1 -column 1 -sticky ns - } else { - grid $vsb -row 0 -rowspan 2 -column 1 -sticky ns } grid rowconfigure $tf 1 -weight 1 grid columnconfigure $tf 0 -weight 1 diff --git a/examples/tablelist/browseTree.tcl b/examples/tablelist/browseTree.tcl index 3ab5d60f..a877e374 100644 --- a/examples/tablelist/browseTree.tcl +++ b/examples/tablelist/browseTree.tcl @@ -122,11 +122,11 @@ proc demo::displayChildren w { # grid $tbl -row 0 -rowspan 2 -column 0 -sticky news variable winSys ;# see config.tcl - if {[string compare $winSys "aqua"] == 0} { + if {[string compare $winSys "win32"] == 0} { + grid $vsb -row 0 -rowspan 2 -column 1 -sticky ns + } else { grid [$tbl cornerpath] -row 0 -column 1 -sticky ew grid $vsb -row 1 -column 1 -sticky ns - } else { - grid $vsb -row 0 -rowspan 2 -column 1 -sticky ns } grid rowconfigure $tf 1 -weight 1 grid columnconfigure $tf 0 -weight 1 diff --git a/examples/tablelist/browseTree_tile.tcl b/examples/tablelist/browseTree_tile.tcl index 6b76c7fb..d8a7dd31 100644 --- a/examples/tablelist/browseTree_tile.tcl +++ b/examples/tablelist/browseTree_tile.tcl @@ -127,11 +127,11 @@ proc demo::displayChildren w { # Manage the widgets # grid $tbl -row 0 -rowspan 2 -column 0 -sticky news - if {[tablelist::getCurrentTheme] eq "aqua"} { + if {[tk windowingsystem] eq "win32"} { + grid $vsb -row 0 -rowspan 2 -column 1 -sticky ns + } else { grid [$tbl cornerpath] -row 0 -column 1 -sticky ew grid $vsb -row 1 -column 1 -sticky ns - } else { - grid $vsb -row 0 -rowspan 2 -column 1 -sticky ns } grid rowconfigure $tf 1 -weight 1 grid columnconfigure $tf 0 -weight 1 diff --git a/examples/tablelist/browse_tile.tcl b/examples/tablelist/browse_tile.tcl index b4bd1554..c83c1631 100644 --- a/examples/tablelist/browse_tile.tcl +++ b/examples/tablelist/browse_tile.tcl @@ -126,11 +126,11 @@ proc demo::displayChildren w { # Manage the widgets # grid $tbl -row 0 -rowspan 2 -column 0 -sticky news - if {[tablelist::getCurrentTheme] eq "aqua"} { + if {[tk windowingsystem] eq "win32"} { + grid $vsb -row 0 -rowspan 2 -column 1 -sticky ns + } else { grid [$tbl cornerpath] -row 0 -column 1 -sticky ew grid $vsb -row 1 -column 1 -sticky ns - } else { - grid $vsb -row 0 -rowspan 2 -column 1 -sticky ns } grid rowconfigure $tf 1 -weight 1 grid columnconfigure $tf 0 -weight 1 diff --git a/examples/tablelist/config.tcl b/examples/tablelist/config.tcl index b6ba34da..de5cbc1a 100644 --- a/examples/tablelist/config.tcl +++ b/examples/tablelist/config.tcl @@ -118,11 +118,11 @@ proc demo::displayConfig w { # grid $tbl -row 0 -rowspan 2 -column 0 -sticky news variable winSys - if {[string compare $winSys "aqua"] == 0} { + if {[string compare $winSys "win32"] == 0} { + grid $vsb -row 0 -rowspan 2 -column 1 -sticky ns + } else { grid [$tbl cornerpath] -row 0 -column 1 -sticky ew grid $vsb -row 1 -column 1 -sticky ns - } else { - grid $vsb -row 0 -rowspan 2 -column 1 -sticky ns } grid $hsb -row 2 -column 0 -sticky ew grid rowconfigure $tf 1 -weight 1 diff --git a/examples/tablelist/config_tile.tcl b/examples/tablelist/config_tile.tcl index 10bf1aa9..8386109b 100644 --- a/examples/tablelist/config_tile.tcl +++ b/examples/tablelist/config_tile.tcl @@ -121,11 +121,11 @@ proc demo::displayConfig w { # Manage the widgets # grid $tbl -row 0 -rowspan 2 -column 0 -sticky news - if {[tablelist::getCurrentTheme] eq "aqua"} { + if {[tk windowingsystem] eq "win32"} { + grid $vsb -row 0 -rowspan 2 -column 1 -sticky ns + } else { grid [$tbl cornerpath] -row 0 -column 1 -sticky ew grid $vsb -row 1 -column 1 -sticky ns - } else { - grid $vsb -row 0 -rowspan 2 -column 1 -sticky ns } grid $hsb -row 2 -column 0 -sticky ew grid rowconfigure $tf 1 -weight 1 diff --git a/examples/tablelist/dirViewer.tcl b/examples/tablelist/dirViewer.tcl index 8c2206df..a9c9eaa9 100755 --- a/examples/tablelist/dirViewer.tcl +++ b/examples/tablelist/dirViewer.tcl @@ -85,11 +85,11 @@ proc displayContents dir { # grid $tbl -row 0 -rowspan 2 -column 0 -sticky news global winSys ;# see option.tcl - if {[string compare $winSys "aqua"] == 0} { + if {[string compare $winSys "win32"] == 0} { + grid $vsb -row 0 -rowspan 2 -column 1 -sticky ns + } else { grid [$tbl cornerpath] -row 0 -column 1 -sticky ew grid $vsb -row 1 -column 1 -sticky ns - } else { - grid $vsb -row 0 -rowspan 2 -column 1 -sticky ns } grid $hsb -row 2 -column 0 -sticky ew grid rowconfigure $tf 1 -weight 1 diff --git a/examples/tablelist/dirViewer_tile.tcl b/examples/tablelist/dirViewer_tile.tcl index 10ab4c0e..8b40c152 100755 --- a/examples/tablelist/dirViewer_tile.tcl +++ b/examples/tablelist/dirViewer_tile.tcl @@ -90,11 +90,11 @@ proc displayContents dir { # Manage the widgets # grid $tbl -row 0 -rowspan 2 -column 0 -sticky news - if {[tablelist::getCurrentTheme] eq "aqua"} { + if {[tk windowingsystem] eq "win32"} { + grid $vsb -row 0 -rowspan 2 -column 1 -sticky ns + } else { grid [$tbl cornerpath] -row 0 -column 1 -sticky ew grid $vsb -row 1 -column 1 -sticky ns - } else { - grid $vsb -row 0 -rowspan 2 -column 1 -sticky ns } grid $hsb -row 2 -column 0 -sticky ew grid rowconfigure $tf 1 -weight 1 diff --git a/examples/tablelist/embeddedWindows.tcl b/examples/tablelist/embeddedWindows.tcl index 6ef218dc..11e7119a 100755 --- a/examples/tablelist/embeddedWindows.tcl +++ b/examples/tablelist/embeddedWindows.tcl @@ -194,11 +194,11 @@ set btn [button .btn -text "Close" -command exit] # Manage the widgets # grid $tbl -row 0 -rowspan 2 -column 0 -sticky news -if {[string compare $winSys "aqua"] == 0} { ;# see option.tcl +if {[string compare $winSys "win32"] == 0} { ;# see option.tcl + grid $vsb -row 0 -rowspan 2 -column 1 -sticky ns +} else { grid [$tbl cornerpath] -row 0 -column 1 -sticky ew grid $vsb -row 1 -column 1 -sticky ns -} else { - grid $vsb -row 0 -rowspan 2 -column 1 -sticky ns } grid rowconfigure $tf 1 -weight 1 grid columnconfigure $tf 0 -weight 1 diff --git a/examples/tablelist/embeddedWindows_tile.tcl b/examples/tablelist/embeddedWindows_tile.tcl index 81d2758d..335332b5 100755 --- a/examples/tablelist/embeddedWindows_tile.tcl +++ b/examples/tablelist/embeddedWindows_tile.tcl @@ -228,11 +228,11 @@ set btn [ttk::button $bf.btn -text "Close" -command exit] # Manage the widgets # grid $tbl -row 0 -rowspan 2 -column 0 -sticky news -if {[tablelist::getCurrentTheme] eq "aqua"} { +if {[tk windowingsystem] eq "win32"} { + grid $vsb -row 0 -rowspan 2 -column 1 -sticky ns +} else { grid [$tbl cornerpath] -row 0 -column 1 -sticky ew grid $vsb -row 1 -column 1 -sticky ns -} else { - grid $vsb -row 0 -rowspan 2 -column 1 -sticky ns } grid rowconfigure $tf 1 -weight 1 grid columnconfigure $tf 0 -weight 1 diff --git a/modules/tablelist/doc/tablelist.html b/modules/tablelist/doc/tablelist.html index 09896d3b..37e22a79 100644 --- a/modules/tablelist/doc/tablelist.html +++ b/modules/tablelist/doc/tablelist.html @@ -541,7 +541,7 @@

    A tablelist Widget for Displaying and Editing the following figure:

    - Configuration Options + Configuration Options

    It is assumed that the Tcl command associated with the widget specified by @@ -668,11 +668,11 @@

    A tablelist Widget for Displaying and Editing # grid $tbl -row 0 -rowspan 2 -column 0 -sticky news variable winSys - if {[string compare $winSys "aqua"] == 0} { + if {[string compare $winSys "win32"] == 0} { + grid $vsb -row 0 -rowspan 2 -column 1 -sticky ns + } else { grid [$tbl cornerpath] -row 0 -column 1 -sticky ew grid $vsb -row 1 -column 1 -sticky ns - } else { - grid $vsb -row 0 -rowspan 2 -column 1 -sticky ns } grid $hsb -row 2 -column 0 -sticky ew grid rowconfigure $tf 1 -weight 1 @@ -776,12 +776,15 @@

    A tablelist Widget for Displaying and Editing #f0f0f0, which improves the readability of the items and gives the widget a nice appearance.

    -

    The option database entries given for the windowing systems other than - x11 are implicitly used when managing the tablelist widget and - the two scrollbars with the aid of grid.  Notice how the - cornerpath - subcommand enables us to achieve a native look & feel with respect to the - vertical scrollbar on the windowing system aqua.

    +

    The option database entries for *DemoTop.tf.borderWidth, + *DemoTop.tf.relief, *DemoTop.tf.tbl.borderWidth, + and *DemoTop.tf.tbl.highlightThickness are implicitly used when + managing the tablelist widget and the two scrollbars with the aid of + grid.  Notice how the cornerpath subcommand enables us + to achieve a native look & feel with respect to the vertical scrollbar on + the windowing systems other than win32 (i.e., aqua + and x11).

    We populate the tablelist by invoking the demo::putConfig procedure discussed below.  The same script is associated with the @@ -1002,14 +1005,14 @@

    Two Widget Browsers Based on a tablelist

    in the file browse.tcl is a multi-column listbox:

    - Widget Browser + Widget Browser

    The tablelist created by the procedure of the same name in the file browseTree.tcl is a multi-column tree widget:

    - Widget Browser + Widget Browser

    The demo::displayChildren command inserts some data of the @@ -1615,7 +1618,7 @@

    A Directory Viewer Based on a tablelist

    as multi-column tree widget:

    - Directory Viewer + Directory Viewer

    By double-clicking an item or invoking the single entry of a pop-up menu @@ -1920,7 +1923,7 @@

    Improving the Look & Feel of a tablelist Widget

    the following figure:

    - Styles + Styles

    Here is the relevant code segment:

    @@ -2007,7 +2010,7 @@

    Advanced Interactive tablelist Cell Editing

    Serial Line Configuration + "409">

    Here is the relevant code segment from the script bwidget.tcl @@ -2376,7 +2379,7 @@

    A tablelist Widget Containing Embedded Windows

    Embedded Windows + "310">

    First, we create and populate the tablelist widget:

    @@ -2752,7 +2755,7 @@

    Tile-Based Demo Scripts

    Serial Line Configuration + height="404">

    The tile-based version of the demo script Tile-Based Demo Scripts

    Embedded Windows + height="316">
    diff --git a/modules/tablelist/doc/tablelistWidget.html b/modules/tablelist/doc/tablelistWidget.html index 0f597bc7..d9ba586e 100644 --- a/modules/tablelist/doc/tablelistWidget.html +++ b/modules/tablelist/doc/tablelistWidget.html @@ -8492,21 +8492,22 @@

    Detailed Reference

    latter's header.  This frame is called the corner frame, because it is designed to be shown to the right of the tablelist widget's top-right corner when managing the vertical scrollbar on Mac - OS X Aqua (see below).  The corner frame contains a label or - ttk::label widget, depending on whether the package Tablelist or + OS X Aqua and X11 (see below).  The corner frame contains a label + or ttk::label widget, depending on whether the package Tablelist or Tablelist_tile is being used (see the
    cornerlabelpath subcommand).  - Whenever the height of the tablelist's header changes, the height of - the corner frame as well as that of the above-mentioned (ttk::)label - widget is updated accordingly. + Whenever the height of the tablelist's header labels changes, the + height of the corner frame as well as that of the above-mentioned + (ttk::)label widget is updated accordingly.
    REMARK:  This subcommand enables you to manage the vertical scrollbar (if any) to appear below the tablelist widget's - header, thus respecting the native look & feel on Mac OS X - Aqua.  As shown in the following example, it is recommended to - always create a scrolled tablelist along with the scrollbar(s) as - children of a (ttk::)frame widget: + header labels, thus respecting the native look & feel on Mac OS X + Aqua and on many modern Linux systems.  As shown in the + following example, it is recommended to always create a scrolled + tablelist along with the scrollbar(s) as children of a (ttk::)frame + widget:
    @@ -8533,11 +8534,11 @@ 

    Detailed Reference

    # Manage the widgets within the frame grid $tbl -row 0 -rowspan 2 -column 0 -sticky news -if {[string compare [tk windowingsystem] "aqua"] == 0} { +if {[string compare [tk windowingsystem] "win32"] == 0} { + grid $vsb -row 0 -rowspan 2 -column 1 -sticky ns +} else { grid [$tbl cornerpath] -row 0 -column 1 -sticky ew grid $vsb -row 1 -column 1 -sticky ns -} else { - grid $vsb -row 0 -rowspan 2 -column 1 -sticky ns } grid $hsb -row 2 -column 0 -sticky ew grid rowconfigure $frm 1 -weight 1 From a4535640fbebd057f239bd3199e34bbc5ced5c91 Mon Sep 17 00:00:00 2001 From: csaba Date: Tue, 5 Jun 2018 09:10:58 +0000 Subject: [PATCH 059/150] * CHANGES.txt: Updated to reflect the changes. --- modules/tablelist/CHANGES.txt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/modules/tablelist/CHANGES.txt b/modules/tablelist/CHANGES.txt index 202d3ded..722c3532 100644 --- a/modules/tablelist/CHANGES.txt +++ b/modules/tablelist/CHANGES.txt @@ -23,14 +23,19 @@ What is new in Tablelist 6.2? "default", "kroc", "sriv", "srivlg", and "step" (POTENTIAL INCOMPATIBILITY!). -6. Fixed two minor bugs related to the interactive cell editing with the +6. The manual now recommends managing the vertical scrollbar (if any) to + appear below the header labels with the aid of the "cornerpath" + subcommand not only for Mac OS X Aqua but also for X11. The demo + scripts have been adapted accordingly. + +7. Fixed two minor bugs related to the interactive cell editing with the aid of the ctext widget (thanks to Sait Dogru for his bug report). -7. Fixed a long-standing bug related to the handling of the +8. Fixed a long-standing bug related to the handling of the "-listvariable" option in connection with snit widgetadaptors (thanks to Rolf Ade for his bug report). -8. Several further code improvements and minor bug fixes (thanks to +9. Several further code improvements and minor bug fixes (thanks to Alexandru Dadalau and Bernhard Wallner for their bug reports). What was new in Tablelist 6.1? From 4c8a214ae940b773e624353dacaf41cd808b4e96 Mon Sep 17 00:00:00 2001 From: csaba Date: Tue, 5 Jun 2018 09:13:28 +0000 Subject: [PATCH 060/150] * doc/browse.png: Updated screenshots. * doc/browseTree.png: * doc/bwidget.png: * doc/config.png: * doc/dirViewer.png: * doc/embeddedWindows.png: * doc/embeddedWindows_tile.png: * doc/styles.png: * doc/tileWidgets.png: --- modules/tablelist/doc/browse.png | Bin 6150 -> 6254 bytes modules/tablelist/doc/browseTree.png | Bin 8995 -> 9265 bytes modules/tablelist/doc/bwidget.png | Bin 12119 -> 12300 bytes modules/tablelist/doc/config.png | Bin 13592 -> 13790 bytes modules/tablelist/doc/dirViewer.png | Bin 10820 -> 11124 bytes modules/tablelist/doc/embeddedWindows.png | Bin 7490 -> 7526 bytes .../tablelist/doc/embeddedWindows_tile.png | Bin 7315 -> 7473 bytes modules/tablelist/doc/styles.png | Bin 12018 -> 12164 bytes modules/tablelist/doc/tileWidgets.png | Bin 11931 -> 12139 bytes 9 files changed, 0 insertions(+), 0 deletions(-) diff --git a/modules/tablelist/doc/browse.png b/modules/tablelist/doc/browse.png index 24c547f1a195099729118f41e97b611f86974fa5..118fd30d6a42d30752ac1db4e2abd573050231c3 100644 GIT binary patch literal 6254 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 delta 5898 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�w7jbV&Z1;8_7l>Ys3rj|`6U-Y zb1Mek8HuA4xi1{o%qa8EbuO&Ma=+K#(#c))-8eoz<+gA8(%6(4pFPCK6MERILPOIT z%f!n&OR)gmr%gLiyC8lA;kjKn8!}7d1DKGJ|AV>B@*~kWK(TwYY3vCfK(ZS#077Cq zNlP4PE4h*-kdQkS2PQy=Ix~e5z$@>^wPq~o%)=g)=dfTD@kX*C3P4=*tcX0-%s%y-IOC%}V0L%nj@+;|ZGVo*8f}TObf*D zd^hjDS=D8Nu_5`XZodG+wyY*bo>Urri|}~|uU|-{D;gDb943tOHX?NYl0adHet5*c z?>7SFoDgC+fWVGtC1)o@-br4`sxvx+V`7Erd;*CQ`b8I0W|vj{uCpa z1H%G{dtQ6+m+-}hIw;iPk{%hcJL50G4c%*CCd@l9>nxcZUy^{P23u4UpL-1KDi98) z;<`=$UO<4hOFmqdgG6(Q>vob9i6V~wS%PdBXkM2*y8Zq_ceiTQ{X$(_C)Av?C#E>9r1#7GmJHL|PI~t-Q$~Z-O14O2!uBTS6Y8U=LJlhjp literal 8995 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 diff --git a/modules/tablelist/doc/bwidget.png b/modules/tablelist/doc/bwidget.png index 598bf15b54a7f44df8f1977a24ccab247af627b2..50278aea114102bc8b2ad156d1f117dbf2689e4e 100644 GIT binary patch literal 12300 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 DfEM{s literal 12119 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

    H<0RWa_MbZ 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 Cb`L86 literal 13592 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 literal 10820 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 T(GffrdPG;pP`mKvqrm?KFV>m< diff --git a/modules/tablelist/doc/embeddedWindows.png b/modules/tablelist/doc/embeddedWindows.png index 81320c1785685ae3c33ee59185222eed78135393..9f1e948112915d28b54210226f8d0dee5eb5e247 100644 GIT binary patch literal 7526 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 f{m3ug+H=PJ*;%;kM_41)lyN-t+?4 literal 7490 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 diff --git a/modules/tablelist/doc/embeddedWindows_tile.png b/modules/tablelist/doc/embeddedWindows_tile.png index bdfd605ae47e754d2cd7dade330dc6850161388b..1777cafa29aa4b6f74144bdb2aa04cc49a90f156 100644 GIT binary patch literal 7473 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 W&tyN+mR;gdB!44vkZxBuY^RlXFN;WgJJy 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 literal 12018 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 diff --git a/modules/tablelist/doc/tileWidgets.png b/modules/tablelist/doc/tileWidgets.png index 20373738bbd0092d91f1d6e80c6fce8006cc33af..1007e295fbf15e15d04230fdc19922291e43700b 100644 GIT binary patch literal 12139 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 C`l_4& literal 11931 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 HCxQP3&K~;3 From c28a304e7eb937a26ca1f5a50dd8fa59d742f8e4 Mon Sep 17 00:00:00 2001 From: csaba Date: Thu, 16 Aug 2018 15:29:59 +0000 Subject: [PATCH 061/150] * *.tcl: Bumped the version number to 6.3. * COPYRIGHT.txt: * README.txt: * ../../examples/tablelist/*.tcl: * CHANGES.txt: Updated to reflect the changes. * doc/*.html: * scripts/*.tcl: Added the "-showbusycursor" configuration option and the "setbusycursor" and "restorecursor" subcommands; the "-stretch" option is no longer ignored if the width was specified as zero or less; enhancements related to managing both scrollbars with the aid of the "cornerpath" subcommand; optimizations in the item insertion and the selection-related code; improved the interactive cell editing with the aid of the ctext widget; made the overall handling of the "-listvariable" option much more robust; fixed some bugs related to the "-maxwidth" column configuration option, the "-displayondemand" option, and the tooltip support; further improvements and minor bug fixes. * scripts/tclIndex: Newly generated. * doc/browseTree.png: Updated screenshots. * doc/dirViewer.png: * doc/embeddedWindows.png: * doc/embeddedWindows_tile.png: * doc/scrollbars.png: Added screenshot. --- modules/tablelist/ChangeLog | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/modules/tablelist/ChangeLog b/modules/tablelist/ChangeLog index 1b2ef376..d14a4aa0 100644 --- a/modules/tablelist/ChangeLog +++ b/modules/tablelist/ChangeLog @@ -1,3 +1,34 @@ +2018-08-16 Csaba Nemethi + + * *.tcl: Bumped the version number to 6.3. + * COPYRIGHT.txt: + * README.txt: + * ../../examples/tablelist/*.tcl: + + * CHANGES.txt: Updated to reflect the changes. + * doc/*.html: + + * scripts/*.tcl: Added the "-showbusycursor" configuration option and + the "setbusycursor" and "restorecursor" subcommands; the "-stretch" + option is no longer ignored if the width was specified as zero or + less; enhancements related to managing both scrollbars with the aid + of the "cornerpath" subcommand; optimizations in the item insertion + and the selection-related code; improved the interactive cell editing + with the aid of the ctext widget; made the overall handling of the + "-listvariable" option much more robust; fixed some bugs related to + the "-maxwidth" column configuration option, the "-displayondemand" + option, and the tooltip support; further improvements and minor bug + fixes. + + * scripts/tclIndex: Newly generated. + + * doc/browseTree.png: Updated screenshots. + * doc/dirViewer.png: + * doc/embeddedWindows.png: + * doc/embeddedWindows_tile.png: + + * doc/scrollbars.png: Added screenshot. + 2018-06-05 Csaba Nemethi * doc/tablelist.html: Using the "cornerpath" subcommand not From daaeca7cca5ffb1dbe6eff627e57ae5cf12fd1ef Mon Sep 17 00:00:00 2001 From: csaba Date: Thu, 16 Aug 2018 15:32:31 +0000 Subject: [PATCH 062/150] * *.tcl: Bumped the version number to 6.3. * COPYRIGHT.txt: * README.txt: * ../../examples/tablelist/*.tcl: --- examples/tablelist/browse.tcl | 2 +- examples/tablelist/browseTree.tcl | 2 +- examples/tablelist/browseTree_tile.tcl | 2 +- examples/tablelist/browse_tile.tcl | 2 +- examples/tablelist/bwidget.tcl | 2 +- examples/tablelist/bwidget_tile.tcl | 2 +- examples/tablelist/config.tcl | 2 +- examples/tablelist/config_tile.tcl | 2 +- examples/tablelist/dirViewer.tcl | 2 +- examples/tablelist/dirViewer_tile.tcl | 2 +- examples/tablelist/embeddedWindows.tcl | 2 +- examples/tablelist/embeddedWindows_tile.tcl | 2 +- examples/tablelist/iwidgets.tcl | 2 +- examples/tablelist/iwidgets_tile.tcl | 2 +- examples/tablelist/miscWidgets.tcl | 2 +- examples/tablelist/miscWidgets_tile.tcl | 2 +- examples/tablelist/styles.tcl | 2 +- examples/tablelist/styles_tile.tcl | 2 +- examples/tablelist/tileWidgets.tcl | 2 +- modules/tablelist/COPYRIGHT.txt | 2 +- modules/tablelist/README.txt | 12 ++++++------ modules/tablelist/pkgIndex.tcl | 14 +++++++------- modules/tablelist/tablelist.tcl | 2 +- modules/tablelist/tablelistPublic.tcl | 2 +- modules/tablelist/tablelist_tile.tcl | 2 +- 25 files changed, 36 insertions(+), 36 deletions(-) diff --git a/examples/tablelist/browse.tcl b/examples/tablelist/browse.tcl index 5f0ab8e0..bf815351 100644 --- a/examples/tablelist/browse.tcl +++ b/examples/tablelist/browse.tcl @@ -5,7 +5,7 @@ # Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist 6.2 +package require tablelist 6.3 namespace eval demo { variable dir [file dirname [info script]] diff --git a/examples/tablelist/browseTree.tcl b/examples/tablelist/browseTree.tcl index a877e374..b92eae32 100644 --- a/examples/tablelist/browseTree.tcl +++ b/examples/tablelist/browseTree.tcl @@ -6,7 +6,7 @@ #============================================================================== package require Tk 8.3 -package require tablelist 6.2 +package require tablelist 6.3 namespace eval demo { variable dir [file dirname [info script]] diff --git a/examples/tablelist/browseTree_tile.tcl b/examples/tablelist/browseTree_tile.tcl index d8a7dd31..ed674b6d 100644 --- a/examples/tablelist/browseTree_tile.tcl +++ b/examples/tablelist/browseTree_tile.tcl @@ -5,7 +5,7 @@ # Copyright (c) 2010-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.2 +package require tablelist_tile 6.3 namespace eval demo { variable dir [file dirname [info script]] diff --git a/examples/tablelist/browse_tile.tcl b/examples/tablelist/browse_tile.tcl index c83c1631..14d049f8 100644 --- a/examples/tablelist/browse_tile.tcl +++ b/examples/tablelist/browse_tile.tcl @@ -5,7 +5,7 @@ # Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.2 +package require tablelist_tile 6.3 namespace eval demo { variable dir [file dirname [info script]] diff --git a/examples/tablelist/bwidget.tcl b/examples/tablelist/bwidget.tcl index 4af92676..44f8ee33 100755 --- a/examples/tablelist/bwidget.tcl +++ b/examples/tablelist/bwidget.tcl @@ -9,7 +9,7 @@ #============================================================================== package require Tk 8.4 ;# because of "-compound" -package require tablelist 6.2 +package require tablelist 6.3 package require BWidget wm title . "Serial Line Configuration" diff --git a/examples/tablelist/bwidget_tile.tcl b/examples/tablelist/bwidget_tile.tcl index 4444a879..c714e049 100755 --- a/examples/tablelist/bwidget_tile.tcl +++ b/examples/tablelist/bwidget_tile.tcl @@ -8,7 +8,7 @@ # Copyright (c) 2004-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.2 +package require tablelist_tile 6.3 package require BWidget wm title . "Serial Line Configuration" diff --git a/examples/tablelist/config.tcl b/examples/tablelist/config.tcl index de5cbc1a..6baa6f87 100644 --- a/examples/tablelist/config.tcl +++ b/examples/tablelist/config.tcl @@ -5,7 +5,7 @@ # Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist 6.2 +package require tablelist 6.3 namespace eval demo { # diff --git a/examples/tablelist/config_tile.tcl b/examples/tablelist/config_tile.tcl index 8386109b..57ccb867 100644 --- a/examples/tablelist/config_tile.tcl +++ b/examples/tablelist/config_tile.tcl @@ -5,7 +5,7 @@ # Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.2 +package require tablelist_tile 6.3 namespace eval demo { # diff --git a/examples/tablelist/dirViewer.tcl b/examples/tablelist/dirViewer.tcl index a9c9eaa9..d3700c3e 100755 --- a/examples/tablelist/dirViewer.tcl +++ b/examples/tablelist/dirViewer.tcl @@ -8,7 +8,7 @@ #============================================================================== package require Tk 8.3 -package require tablelist 6.2 +package require tablelist 6.3 # # Add some entries to the Tk option database diff --git a/examples/tablelist/dirViewer_tile.tcl b/examples/tablelist/dirViewer_tile.tcl index 8b40c152..c50058a7 100755 --- a/examples/tablelist/dirViewer_tile.tcl +++ b/examples/tablelist/dirViewer_tile.tcl @@ -7,7 +7,7 @@ # Copyright (c) 2010-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.2 +package require tablelist_tile 6.3 # # Add some entries to the Tk option database diff --git a/examples/tablelist/embeddedWindows.tcl b/examples/tablelist/embeddedWindows.tcl index 11e7119a..2afbc312 100755 --- a/examples/tablelist/embeddedWindows.tcl +++ b/examples/tablelist/embeddedWindows.tcl @@ -6,7 +6,7 @@ # Copyright (c) 2004-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist 6.2 +package require tablelist 6.3 wm title . "Tk Library Scripts" diff --git a/examples/tablelist/embeddedWindows_tile.tcl b/examples/tablelist/embeddedWindows_tile.tcl index 335332b5..1505da11 100755 --- a/examples/tablelist/embeddedWindows_tile.tcl +++ b/examples/tablelist/embeddedWindows_tile.tcl @@ -6,7 +6,7 @@ # Copyright (c) 2004-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.2 +package require tablelist_tile 6.3 wm title . "Tile Library Scripts" diff --git a/examples/tablelist/iwidgets.tcl b/examples/tablelist/iwidgets.tcl index dbb57157..565dc9f9 100755 --- a/examples/tablelist/iwidgets.tcl +++ b/examples/tablelist/iwidgets.tcl @@ -9,7 +9,7 @@ #============================================================================== package require Tk 8.4 ;# because of "-compound" -package require tablelist 6.2 +package require tablelist 6.3 if {[catch {package require iwidgets} result1] != 0 && [catch {package require Iwidgets} result2] != 0} { error "$result1; $result2" diff --git a/examples/tablelist/iwidgets_tile.tcl b/examples/tablelist/iwidgets_tile.tcl index 414cde30..270b6c19 100755 --- a/examples/tablelist/iwidgets_tile.tcl +++ b/examples/tablelist/iwidgets_tile.tcl @@ -8,7 +8,7 @@ # Copyright (c) 2004-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.2 +package require tablelist_tile 6.3 if {[catch {package require iwidgets} result1] != 0 && [catch {package require Iwidgets} result2] != 0} { error "$result1; $result2" diff --git a/examples/tablelist/miscWidgets.tcl b/examples/tablelist/miscWidgets.tcl index 89512013..53254274 100755 --- a/examples/tablelist/miscWidgets.tcl +++ b/examples/tablelist/miscWidgets.tcl @@ -9,7 +9,7 @@ #============================================================================== package require Tk 8.4 ;# because of "-compound" and the spinbox widget -package require tablelist 6.2 +package require tablelist 6.3 package require combobox package require mentry diff --git a/examples/tablelist/miscWidgets_tile.tcl b/examples/tablelist/miscWidgets_tile.tcl index dbc3a9cd..4dd5f68b 100755 --- a/examples/tablelist/miscWidgets_tile.tcl +++ b/examples/tablelist/miscWidgets_tile.tcl @@ -8,7 +8,7 @@ # Copyright (c) 2004-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.2 +package require tablelist_tile 6.3 package require combobox package require mentry diff --git a/examples/tablelist/styles.tcl b/examples/tablelist/styles.tcl index 4b477eda..a1f3129d 100755 --- a/examples/tablelist/styles.tcl +++ b/examples/tablelist/styles.tcl @@ -6,7 +6,7 @@ # Copyright (c) 2002-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist 6.2 +package require tablelist 6.3 wm title . "Tablelist Styles" diff --git a/examples/tablelist/styles_tile.tcl b/examples/tablelist/styles_tile.tcl index 3851ddd7..a6d9b219 100755 --- a/examples/tablelist/styles_tile.tcl +++ b/examples/tablelist/styles_tile.tcl @@ -6,7 +6,7 @@ # Copyright (c) 2002-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.2 +package require tablelist_tile 6.3 wm title . "Tablelist Styles" diff --git a/examples/tablelist/tileWidgets.tcl b/examples/tablelist/tileWidgets.tcl index 754d879f..d4316d7b 100755 --- a/examples/tablelist/tileWidgets.tcl +++ b/examples/tablelist/tileWidgets.tcl @@ -7,7 +7,7 @@ # Copyright (c) 2005-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require tablelist_tile 6.2 +package require tablelist_tile 6.3 wm title . "Serial Line Configuration" diff --git a/modules/tablelist/COPYRIGHT.txt b/modules/tablelist/COPYRIGHT.txt index 2dbac8a7..03bb8356 100644 --- a/modules/tablelist/COPYRIGHT.txt +++ b/modules/tablelist/COPYRIGHT.txt @@ -1,4 +1,4 @@ -Multi-column listbox and tree widget package Tablelist, version 6.2 +Multi-column listbox and tree widget package Tablelist, version 6.3 Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) This library is free software; you can use, modify, and redistribute it diff --git a/modules/tablelist/README.txt b/modules/tablelist/README.txt index aec48472..1d4733a4 100644 --- a/modules/tablelist/README.txt +++ b/modules/tablelist/README.txt @@ -88,8 +88,8 @@ How to Get It? -------------- Tablelist is available for free download from the same URL as Wcb. The -distribution file is "tablelist6.2.tar.gz" for UNIX and -"tablelist6_2.zip" for Windows. These files contain the same +distribution file is "tablelist6.3.tar.gz" for UNIX and +"tablelist6_3.zip" for Windows. These files contain the same information, except for the additional carriage return character preceding the linefeed at the end of each line in the text files for Windows. @@ -108,15 +108,15 @@ locations of these library directories are given by the "tcl_library" and "tk_library" variables, respectively. To install Tablelist on UNIX, "cd" to the desired directory and unpack -the distribution file "tablelist6.2.tar.gz": +the distribution file "tablelist6.3.tar.gz": - gunzip -c tablelist6.2.tar.gz | tar -xf - + gunzip -c tablelist6.3.tar.gz | tar -xf - -This command will create a directory named "tablelist6.2 with the +This command will create a directory named "tablelist6.3 with the subdirectories "demos", "doc", and "scripts". On Windows, use WinZip or some other program capable of unpacking the -distribution file "tablelist6_2.zip" into the directory "tablelist6.2", +distribution file "tablelist6_3.zip" into the directory "tablelist6.3", with the subdirectories "demos", "doc", and "scripts". The file "tablelistEdit.tcl" in the "scripts" directory is only needed diff --git a/modules/tablelist/pkgIndex.tcl b/modules/tablelist/pkgIndex.tcl index 94fec52e..ef7602df 100644 --- a/modules/tablelist/pkgIndex.tcl +++ b/modules/tablelist/pkgIndex.tcl @@ -7,22 +7,22 @@ # # Regular packages: # -package ifneeded tablelist 6.2 \ +package ifneeded tablelist 6.3 \ [list source [file join $dir tablelist.tcl]] -package ifneeded tablelist_tile 6.2 \ +package ifneeded tablelist_tile 6.3 \ [list source [file join $dir tablelist_tile.tcl]] # # Aliases: # -package ifneeded Tablelist 6.2 \ - [list package require -exact tablelist 6.2] -package ifneeded Tablelist_tile 6.2 \ - [list package require -exact tablelist_tile 6.2] +package ifneeded Tablelist 6.3 \ + [list package require -exact tablelist 6.3] +package ifneeded Tablelist_tile 6.3 \ + [list package require -exact tablelist_tile 6.3] # # Code common to all packages: # -package ifneeded tablelist::common 6.2 \ +package ifneeded tablelist::common 6.3 \ "namespace eval ::tablelist { proc DIR {} {return [list $dir]} } ;\ source [list [file join $dir tablelistPublic.tcl]]" diff --git a/modules/tablelist/tablelist.tcl b/modules/tablelist/tablelist.tcl index 16339427..05bde749 100644 --- a/modules/tablelist/tablelist.tcl +++ b/modules/tablelist/tablelist.tcl @@ -6,7 +6,7 @@ package require Tcl 8 package require Tk 8 -package require -exact tablelist::common 6.2 +package require -exact tablelist::common 6.3 package provide tablelist $::tablelist::version package provide Tablelist $::tablelist::version diff --git a/modules/tablelist/tablelistPublic.tcl b/modules/tablelist/tablelistPublic.tcl index 4da53a41..d1291a06 100644 --- a/modules/tablelist/tablelistPublic.tcl +++ b/modules/tablelist/tablelistPublic.tcl @@ -24,7 +24,7 @@ namespace eval ::tablelist { # # Public variables: # - variable version 6.2 + variable version 6.3 variable library if {$tcl_version >= 8.4} { set library [file normalize [DIR]] diff --git a/modules/tablelist/tablelist_tile.tcl b/modules/tablelist/tablelist_tile.tcl index 20d4a563..58e8b926 100644 --- a/modules/tablelist/tablelist_tile.tcl +++ b/modules/tablelist/tablelist_tile.tcl @@ -9,7 +9,7 @@ package require Tk 8.4 if {$::tk_version < 8.5 || [regexp {^8\.5a[1-5]$} $::tk_patchLevel]} { package require tile 0.6 } -package require -exact tablelist::common 6.2 +package require -exact tablelist::common 6.3 package provide tablelist_tile $::tablelist::version package provide Tablelist_tile $::tablelist::version From 9f06ee1415cb53b9090031d45d7aeac2b6097491 Mon Sep 17 00:00:00 2001 From: csaba Date: Thu, 16 Aug 2018 15:34:05 +0000 Subject: [PATCH 063/150] * CHANGES.txt: Updated to reflect the changes. * doc/*.html: --- modules/tablelist/CHANGES.txt | 50 ++- modules/tablelist/doc/index.html | 4 +- modules/tablelist/doc/tablelist.html | 42 +-- modules/tablelist/doc/tablelistBWidget.html | 2 +- modules/tablelist/doc/tablelistBinding.html | 2 +- modules/tablelist/doc/tablelistColSort.html | 2 +- modules/tablelist/doc/tablelistCombobox.html | 2 +- modules/tablelist/doc/tablelistCtext.html | 2 +- modules/tablelist/doc/tablelistIwidgets.html | 2 +- modules/tablelist/doc/tablelistMentry.html | 2 +- modules/tablelist/doc/tablelistThemes.html | 2 +- modules/tablelist/doc/tablelistTile.html | 2 +- modules/tablelist/doc/tablelistTkCore.html | 2 +- modules/tablelist/doc/tablelistWidget.html | 359 ++++++++++++++----- 14 files changed, 360 insertions(+), 115 deletions(-) diff --git a/modules/tablelist/CHANGES.txt b/modules/tablelist/CHANGES.txt index 722c3532..0397d75e 100644 --- a/modules/tablelist/CHANGES.txt +++ b/modules/tablelist/CHANGES.txt @@ -1,6 +1,52 @@ -What is new in Tablelist 6.2? +What is new in Tablelist 6.3? ----------------------------- +1. Added the "-showbusycursor" configuration option, used to control + whether the default bindings should display a busy cursor during the + actions that can take a long time to complete, using the new + "setbusycursor" and "restorecursor" subcommands. + +2. The "-stretch" configuration option is no longer ignored if the + width of the tablelist widget was specified as zero or less (thanks + to Adrian Medrano Calvo for his proposal). For technical reasons + there is just a minor restriction, which is only relevant on X11: If + the value of the "-width" option is zero or less and the tablelist + has stretchable columns, then the "-setgrid" option will be ignored. + +3. The vertical scrollbar, when managed with the aid of the + "cornerpath" subcommand, will now appear below the entire header, + including both the header labels and the header items (if any). + +4. Besides the north-east corner frame there is now a south-west corner + frame, designed to be used when managing the horizontal scrollbar + in the presence of title columns. The "cornerpath" subcommand now + accepts the corner specification as optional argument. + +5. Significant optimizations in the item insertion as well as in the + selection-related code. + +6. Further improvements related to the interactive cell editing with + the aid of the ctext widget (thanks to Sait Dogru for discussions on + this subject). + +7. Made the overall handling of the "-listvariable" option much more + robust (thanks to Ulrich Seidl for his bug report). + +8. Fixed a long-standing bug related to the "-maxwidth" column + configuration option (again, thanks to Ulrich Seidl for his bug + report). + +9. Fixed a bug related to the "-displayondemand" configuration option + (thanks to "tombert" for his bug report). + +10. Fixed a bug related to the tooltip support (thanks to Bo Berggren + for his bug report). + +11. Numerous further improvements and minor bug fixes. + +What was new in Tablelist 6.2? +------------------------------ + 1. Added the "-labelvalign" column configuration option, for controlling the vertical alignment of header label images (thanks to Johann Oberdorfer for his proposal). @@ -1578,7 +1624,7 @@ What was new in Tablelist 3.6? internal list (thanks to Patrick Fradin for his valuable input). 7. Fixed a bug related to the "-listvariable" option, introduced in - the previous Tablelist release (thanks to Torsten Reincke for his + the previous Tablelist release (thanks to Torsten Reincke for her bug report). 8. Fixed two bugs related to the "cellselection" subcommand (thanks to diff --git a/modules/tablelist/doc/index.html b/modules/tablelist/doc/index.html index c188a6b0..d483d558 100644 --- a/modules/tablelist/doc/index.html +++ b/modules/tablelist/doc/index.html @@ -1,6 +1,6 @@ - The Multi-Column Listbox and Tree Widget Package Tablelist 6.2 + The Multi-Column Listbox and Tree Widget Package Tablelist 6.3

    -

    The Multi-Column Listbox and Tree Widget Package Tablelist 6.2

    +

    The Multi-Column Listbox and Tree Widget Package Tablelist 6.3

    by

    diff --git a/modules/tablelist/doc/tablelist.html b/modules/tablelist/doc/tablelist.html index 37e22a79..7a381573 100644 --- a/modules/tablelist/doc/tablelist.html +++ b/modules/tablelist/doc/tablelist.html @@ -13,7 +13,7 @@

    Tablelist Programmer's Guide

    -

    For Tablelist Version 6.2

    +

    For Tablelist Version 6.3

    by

    @@ -170,8 +170,8 @@

    What Is Tablelist?

    How to Get It?

    Tablelist is available for free download from the same URL as Wcb.  - The distribution file is tablelist6.2.tar.gz for UNIX and - tablelist6_2.zip for Windows.  These files contain the same + The distribution file is tablelist6.3.tar.gz for UNIX and + tablelist6_3.zip for Windows.  These files contain the same information, except for the additional carriage return character preceding the linefeed at the end of each line in the text files for Windows.

    @@ -194,21 +194,21 @@

    How to Install It?

    To install Tablelist on UNIX, cd to the desired directory and unpack the distribution file - tablelist6.2.tar.gz:

    + tablelist6.3.tar.gz:

    -gunzip -c tablelist6.2.tar.gz | tar -xf -
    +gunzip -c tablelist6.3.tar.gz | tar -xf -
     
    -

    This command will create a directory named tablelist6.2, with +

    This command will create a directory named tablelist6.3, with the subdirectories demos, doc, and scripts.

    On Windows, use WinZip or some other program capable of unpacking - the distribution file tablelist6_2.zip into the directory - tablelist6.2, with the subdirectories demos, + the distribution file tablelist6_3.zip into the directory + tablelist6.3, with the subdirectories demos, doc, and scripts.

    The file tablelistEdit.tcl in the scripts @@ -305,14 +305,14 @@

    How to Use It?

    tablelist and tablelist_tile
    .

    REMARK:  If you have an earlier Tablelist version as part of - ActiveTcl 8.5 or above and the new Tablelist release 6.2, then it is highly - recommended to specify the version number 6.2 in the  + ActiveTcl 8.5 or above and the new Tablelist release 6.3, then it is highly + recommended to specify the version number 6.3 in the  package require  command, because otherwise the interpreter will load the old Tablelist version included in ActiveTcl as Tcl Module.  The examples below use the - statement  package require tablelist 6.2,  and their + statement  package require tablelist 6.3,  and their tile-based counterparts invoke the command  package require - tablelist_tile 6.2.

    + tablelist_tile 6.3
    .

    Since the packages Tablelist and Tablelist_tile are implemented in the tablelist namespace, you must either invoke the

    @@ -499,7 +499,7 @@

    A tablelist Widget for Displaying and Editing
    -package require tablelist 6.2
    +package require tablelist 6.3
     source [file join $tablelist::library demos config.tcl]
     
    @@ -555,7 +555,7 @@

    A tablelist Widget for Displaying and Editing
    -package require tablelist 6.2
    +package require tablelist 6.3
     
     namespace eval demo {
         #
    @@ -1012,7 +1012,7 @@ 

    Two Widget Browsers Based on a tablelist

    browseTree.tcl is a multi-column tree widget:

    - Widget Browser + Widget Browser

    The demo::displayChildren command inserts some data of the @@ -1036,7 +1036,7 @@

    Two Widget Browsers Based on a tablelist

     package require Tk 8.3
    -package require tablelist 6.2
    +package require tablelist 6.3
     
     namespace eval demo {
         variable dir [file dirname [info script]]
    @@ -1634,7 +1634,7 @@ 

    A Directory Viewer Based on a tablelist

     package require Tk 8.3
    -package require tablelist 6.2
    +package require tablelist 6.3
     
     #
     # Add some entries to the Tk option database
    @@ -2022,7 +2022,7 @@ 

    Advanced Interactive tablelist Cell Editing

     package require Tk 8.4                          ;# because of "-compound"
    -package require tablelist 6.2
    +package require tablelist 6.3
     package require BWidget
     
     wm title . "Serial Line Configuration"
    @@ -2386,7 +2386,7 @@ 

    A tablelist Widget Containing Embedded Windows

    -package require tablelist 6.2
    +package require tablelist 6.3
     
     wm title . "Tk Library Scripts"
     
    @@ -2641,7 +2641,7 @@ 

    Tile-Based Demo Scripts

     package require Tk 8.3                          ;# because of entry validation
    -package require tablelist 6.2
    +package require tablelist 6.3
     
    @@ -2649,7 +2649,7 @@

    Tile-Based Demo Scripts

    -package require tablelist_tile 6.2
    +package require tablelist_tile 6.3
     
    diff --git a/modules/tablelist/doc/tablelistBWidget.html b/modules/tablelist/doc/tablelistBWidget.html index 0602f580..5f5f9233 100644 --- a/modules/tablelist/doc/tablelistBWidget.html +++ b/modules/tablelist/doc/tablelistBWidget.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using the BWidget Package

    -

    For Tablelist Version 6.2

    +

    For Tablelist Version 6.3

    by

    diff --git a/modules/tablelist/doc/tablelistBinding.html b/modules/tablelist/doc/tablelistBinding.html index 873772b1..c1d50eef 100644 --- a/modules/tablelist/doc/tablelistBinding.html +++ b/modules/tablelist/doc/tablelistBinding.html @@ -12,7 +12,7 @@

    Commands Related to Binding Scripts

    -

    For Tablelist Version 6.2

    +

    For Tablelist Version 6.3

    by

    diff --git a/modules/tablelist/doc/tablelistColSort.html b/modules/tablelist/doc/tablelistColSort.html index 8fd0c45f..9cc9096f 100644 --- a/modules/tablelist/doc/tablelistColSort.html +++ b/modules/tablelist/doc/tablelistColSort.html @@ -12,7 +12,7 @@

    Commands for Interactive Sorting by One or More Columns

    -

    For Tablelist Version 6.2

    +

    For Tablelist Version 6.3

    by

    diff --git a/modules/tablelist/doc/tablelistCombobox.html b/modules/tablelist/doc/tablelistCombobox.html index afb77320..a0d25b2c 100644 --- a/modules/tablelist/doc/tablelistCombobox.html +++ b/modules/tablelist/doc/tablelistCombobox.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using the combobox Package

    -

    For Tablelist Version 6.2

    +

    For Tablelist Version 6.3

    by

    diff --git a/modules/tablelist/doc/tablelistCtext.html b/modules/tablelist/doc/tablelistCtext.html index 33ab8473..54297b72 100644 --- a/modules/tablelist/doc/tablelistCtext.html +++ b/modules/tablelist/doc/tablelistCtext.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using the ctext Package

    -

    For Tablelist Version 6.2

    +

    For Tablelist Version 6.3

    by

    diff --git a/modules/tablelist/doc/tablelistIwidgets.html b/modules/tablelist/doc/tablelistIwidgets.html index 32087f99..e2e62ada 100644 --- a/modules/tablelist/doc/tablelistIwidgets.html +++ b/modules/tablelist/doc/tablelistIwidgets.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using the Iwidgets Package

    -

    For Tablelist Version 6.2

    +

    For Tablelist Version 6.3

    by

    diff --git a/modules/tablelist/doc/tablelistMentry.html b/modules/tablelist/doc/tablelistMentry.html index ac02f12f..e2bad904 100644 --- a/modules/tablelist/doc/tablelistMentry.html +++ b/modules/tablelist/doc/tablelistMentry.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using the Mentry Package

    -

    For Tablelist Version 6.2

    +

    For Tablelist Version 6.3

    by

    diff --git a/modules/tablelist/doc/tablelistThemes.html b/modules/tablelist/doc/tablelistThemes.html index f7b62289..ef14313a 100644 --- a/modules/tablelist/doc/tablelistThemes.html +++ b/modules/tablelist/doc/tablelistThemes.html @@ -12,7 +12,7 @@

    Commands Related to Tile Themes

    -

    For Tablelist Version 6.2

    +

    For Tablelist Version 6.3

    by

    diff --git a/modules/tablelist/doc/tablelistTile.html b/modules/tablelist/doc/tablelistTile.html index 95504b25..703b18b8 100644 --- a/modules/tablelist/doc/tablelistTile.html +++ b/modules/tablelist/doc/tablelistTile.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using Tile Widgets

    -

    For Tablelist Version 6.2

    +

    For Tablelist Version 6.3

    by

    diff --git a/modules/tablelist/doc/tablelistTkCore.html b/modules/tablelist/doc/tablelistTkCore.html index f95b9ed6..aee9be48 100644 --- a/modules/tablelist/doc/tablelistTkCore.html +++ b/modules/tablelist/doc/tablelistTkCore.html @@ -12,7 +12,7 @@

    Interactive Tablelist Cell Editing Using Tk Core Widgets

    -

    For Tablelist Version 6.2

    +

    For Tablelist Version 6.3

    by

    diff --git a/modules/tablelist/doc/tablelistWidget.html b/modules/tablelist/doc/tablelistWidget.html index d9ba586e..ad5a917b 100644 --- a/modules/tablelist/doc/tablelistWidget.html +++ b/modules/tablelist/doc/tablelistWidget.html @@ -13,7 +13,7 @@

    The tablelist::tablelist Command

    -

    For Tablelist Version 6.2

    +

    For Tablelist Version 6.3

    by

    @@ -234,6 +234,9 @@

    Quick Reference

    -showarrow boolean
    +
    -showbusycursor + boolean
    +
    -showeditcursor boolean
    @@ -763,7 +766,7 @@

    Quick Reference

    "#cornerlabelpath">cornerlabelpath

    pathName cornerpath
    + "#cornerpath">cornerpath
    ?-ne|-sw?
    pathName curcellselection @@ -914,7 +917,7 @@

    Quick Reference

    index name
    pathName header option - args
    + ?arg arg ...?
    pathName headerpath
    @@ -1018,6 +1021,9 @@

    Quick Reference

    pathName resetsortinfo
    +
    pathName restorecursor
    +
    pathName rowattrib index ?name? ?value name value ...?
    @@ -1075,6 +1081,9 @@

    Quick Reference

    pathName separators
    +
    pathName setbusycursor
    +
    pathName showtargetmark before|inside index
    @@ -1521,6 +1530,12 @@

    Detailed Reference

    -selectforeground have theme-specific default values. +
    REMARK:  If the value of the -width configuration option is zero or less and the + tablelist has stretchable columns, then the + -setgrid option will be ignored.  This minor + restriction has technical reasons and is only relevant on X11.
    +
    OPTIONS FOR THE BODY AND HEADER COMPONENTS OF THE WIDGET
    @@ -3082,17 +3097,18 @@

    Detailed Reference

    -

    Specifies the name of a variable.  The value of the variable is - a list to be displayed inside the widget's body; if the variable value - changes then the widget will automatically update itself to reflect the - new value.  The value of the variable must be a valid list.  - Each list element corresponds to a row within the widget's body, and - must be a valid list itself; its elements correspond to the cells - within the respective row.  Attempts to assign a variable whose - value does not fulfill these conditions to - -listvariable will cause an error.  Attempts - to unset a variable in use as a -listvariable will - fail but will not generate an error.

    +

    Specifies the name of a global varable or a qualified name of a + namespace variable.  The value of the variable is a list to be + displayed inside the widget's body; if the variable value changes then + the widget will automatically update itself to reflect the new + value.  The value of the variable must be a valid list.  Each + list element corresponds to a row within the widget's body, and must be + a valid list itself; its elements correspond to the cells within the + respective row.  Attempts to assign a variable whose value does + not fulfill these conditions to -listvariable will + cause an error.  Attempts to unset a variable in use as a + -listvariable will fail but will not generate an + error.

    REMARK 1:  For increased efficiency, updating the widget to reflect a changed value of the variable specified with this option @@ -3599,6 +3615,69 @@

    Detailed Reference

    +
    + + + + + + + + + + + + + + + + + + +
    Command-Line Name: -showbusycursor
    Database Name: showBusyCursor
    Database Class: ShowBusyCursor
    + +
    +

    Specifies a boolean value indicating whether the default bindings + should display a windowing system-specific busy cursor during the + actions that can take a long time to complete, using the + setbusycursor and + restorecursor + subcommands.  The default value is 1.

    + +

    The potentially long-running actions that will temporarily change + the mouse cursor when this option is on are as follows:

    + +
      +
    • resizing or moving a column;
    • + +
    • invoking the command specified by the -labelcommand or -labelcommand2 option at widget or + column level (e.g., sorting the items by one or more columns);
    • + +
    • expanding or collapsing a row;
    • + +
    • extending, toggling, or canceling the (cell) selection if the + -selectmode option was + set to extended.
    • +
    + +

    REMARK:  If showing the busy cursor per default during + potentially long-running actions is not what you prefer, you can + override the default for all tablelist instances by inserting the + line

    + +
    +
    +option add *Tablelist.showBusyCursor 0
    +
    +
    + +

    somewhere at the beginning of your script (before creating any + tablelist widgets).

    +
    +
    +
    @@ -3626,28 +3705,39 @@

    Detailed Reference

    click with mouse button 1 would start an editing session.  The default value is 1.

    -

    REMARK:  On X11 and Mac OS X Aqua, the cursor set by - Tablelist when a mouse click would start the interactive cell editing, - is Tk's built-in cursor pencil.  Since on - Windows this cursor is ugly and not really usable, the edit cursor - shown by Tablelist on this platform will be the one loaded from the - file pencil.cur, located in the scripts - subdirectory of the Tablelist installation directory.  If the - application was started as a starpack containing the Tablelist package, - then the edit cursor will be loaded from a copy of this file, created - automatically by Tablelist in the user's Temp - directory.

    - -

    The file pencil.cur is a copy of the file  - Ubuntu Handwriting.cur,  downloaded from the - address

    +

    On X11 and Mac OS X Aqua, the cursor set by Tablelist when a mouse + click would start the interactive cell editing, is Tk's built-in cursor + pencil.  Since on Windows this cursor is ugly + and not really usable, the edit cursor shown by Tablelist on this + platform will be the one loaded from the file pencil.cur, + located in the scripts subdirectory of the Tablelist + installation directory.  If the application was started as a + starpack containing the Tablelist package, then the edit cursor will be + loaded from a copy of this file, created automatically by Tablelist in + the user's Temp directory.  The file + pencil.cur is a copy of the file  Ubuntu + Handwriting.cur,  downloaded from the address

    http://www.rw-designer.com/cursor-detail/46745 + "http://www.rw-designer.com/cursor-detail/46922">http://www.rw-designer.com/cursor-detail/46922
    + +

    REMARK:  If showing the edit cursor per default + whenever a click with mouse button 1 would start the editing is not + what you prefer, you can override the default for all tablelist + instances by inserting the line

    + +
    +
    +option add *Tablelist.showEditCursor 0
    +
    +
    + +

    somewhere at the beginning of your script (before creating any + tablelist widgets).

    @@ -3680,6 +3770,20 @@

    Detailed Reference

    "#fullseparators">-fullseparators option is false, and there is free space left between the last row and the bottom of the tablelist window.  The default value is 1.

    + +

    REMARK:  If showing the horizontal separator per default + under the above-mentioned circumstancies is not what you prefer, you + can override the default for all tablelist instances by inserting the + line

    + +
    +
    +option add *Tablelist.showHorizSeparator 0
    +
    +
    + +

    somewhere at the beginning of your script (before creating any + tablelist widgets).

    @@ -3909,27 +4013,31 @@

    Detailed Reference

    -

    Specifies the columns to be stretched in order to fill the tablelist - window if necessary.  The option's value may be - all or a list of column indices in any of the forms - described in the COLUMN INDICES section - below.  In the second case, the specified column indices are - replaced with their numerical equivalents, except for - end and last, which are viewed - as dynamic column indices whose numerical equivalent (i.e., the index - of the tablelist's last column) might change during program execution - and therefore will be recomputed every time the columns are - stretched.  The list will be updated automatically whenever - columns are inserted, deleted, or moved.  The number of pixels by - which a column is stretched is proportional to its width in - pixels.  The default value of this option is an empty list, - meaning that no column will be stretched to eliminate the blank space - that might appear at the right of the table.  (Note that the blank - space following the header labels is filled with a dummy, insensitive - label having the same background, borderwidth, and relief as the - "normal" header labels.)  This option is ignored if the value of - the -width configuration - option is zero or less.

    +

    Specifies the stretchable columns, i.e., the columns to be + stretched in order to fill the tablelist window if necessary.  The + option's value may be all or a list of column + indices in any of the forms described in the COLUMN INDICES section below.  In the second + case, the specified column indices are replaced with their numerical + equivalents, except for end and + last, which are viewed as dynamic column indices + whose numerical equivalent (i.e., the index of the tablelist's last + column) might change during program execution and therefore will be + recomputed every time the columns are stretched.  The list will be + updated automatically whenever columns are inserted, deleted, or + moved.  The number of pixels by which a column is stretched is + proportional to its width in pixels.  The default value of this + option is an empty list, meaning that no column will be stretched to + eliminate the blank space that might appear at the right of the + table.  (Note that the blank space following the header labels is + filled with a dummy, insensitive label having the same background, + borderwidth, and relief as the "normal" header labels.)

    + +

    REMARK:  If the value of the -width configuration option is zero or less and + the tablelist has stretchable columns, then the + -setgrid option will be ignored.  This minor + restriction has technical reasons and is only relevant on X11.

    @@ -5487,6 +5595,12 @@

    Detailed Reference

    characters of the widget's font.  If zero or less then the desired width for the window is made just large enough to hold all the columns in the tablelist widget.

    + +

    REMARK:  If the value of this configuration option is + zero or less and the tablelist has stretchable + columns, then the -setgrid option will be + ignored.  This minor restriction has technical reasons and is only + relevant on X11.

    @@ -8477,37 +8591,55 @@

    Detailed Reference

    pathName cornerlabelpath
    -
    Returns the path name of the label widget contained in the corner - frame (see the cornerpath - subcommand.  When using Tablelist_tile, the return value will be a - ttk::label widget of the same style as the header labels.  The - global visual options set for the header labels are automatically - applied to this (ttk::)label widget, too.
    +
    Returns the path name of the label widget contained in the + north-east corner frame (see the cornerpath subcommand.  When using + Tablelist_tile, the return value will be a ttk::label widget of the + same style as the header labels.  The global visual options set + for the header labels are automatically applied to this (ttk::)label + widget, too.
    pathName - cornerpath
    - -
    Returns the path name of a frame widget that is a sibling of the - tablelist and is automatically created and destroyed together with the - latter's header.  This frame is called the corner frame, - because it is designed to be shown to the right of the tablelist - widget's top-right corner when managing the vertical scrollbar on Mac - OS X Aqua and X11 (see below).  The corner frame contains a label - or ttk::label widget, depending on whether the package Tablelist or - Tablelist_tile is being used (see the cornerlabelpath subcommand).  - Whenever the height of the tablelist's header labels changes, the - height of the corner frame as well as that of the above-mentioned - (ttk::)label widget is updated accordingly.
    + cornerpath ?-ne|-sw? + +
    Returns the path name of one out of two frame widgets that are + siblings of the tablelist and are automatically created and destroyed + together with the latter.  One of the two frames corresponds to + the tablelist's north-east corner and the other one to its south-west + corner.  The corner is specified by means of the optional + argument: -ne (which is the default) stands for + north-east and -sw stands for south-west.
    + +
    If the corner specification has the value + -ne then the command returns the path name of the + north-east corner frame, which is designed to be shown to the + right of the tablelist widget's top-right corner when managing the + vertical scrollbar on Mac OS X Aqua or X11 (see Remark 1 below).  + This corner frame contains a label or ttk::label widget, depending on + whether the package Tablelist or Tablelist_tile is being used (see the + cornerlabelpath + subcommand).  The height of this corner frame is automatically + kept in sync with that of the tablelist's header component, and the + height of the above-mentioned (ttk::)label widget is automatically kept + in sync with that of the header labels.
    + +
    If the corner was specified as -sw + then the return value is the path name of the south-west corner + frame, which is designed to be shown just below the tablelist's + lower-left corner when managing the horizontal scrollbar if the value + of the -titlecolumns + option is positive (see Remark 2 below).  The width of this corner + frame is automatically kept in sync with the total width of the + non-hidden title columns.  When using Tablelist_tile, the + south-west corner frame will be a ttk::frame widget.
    - REMARK:  This subcommand enables you to manage the + REMARK 1:  This subcommand enables you to manage the vertical scrollbar (if any) to appear below the tablelist widget's - header labels, thus respecting the native look & feel on Mac OS X - Aqua and on many modern Linux systems.  As shown in the - following example, it is recommended to always create a scrolled - tablelist along with the scrollbar(s) as children of a (ttk::)frame - widget: + header, thus respecting the native look & feel on Mac OS X Aqua + and on many modern Linux systems.  As shown in the following + example, it is recommended to always create a scrolled tablelist + along with the scrollbar(s) as children of a (ttk::)frame widget:
    @@ -8527,8 +8659,8 @@ 

    Detailed Reference

    set hsb $frm.hsb tablelist::tablelist $tbl ... \ -xscrollcommand [list $hsb set] -yscrollcommand [list $vsb set] -scrollbar $vsb -orient vertical -command [list $tbl yview] -scrollbar $hsb -orient horizontal -command [list $tbl xview] +(ttk::)scrollbar $vsb -orient vertical -command [list $tbl yview] +(ttk::)scrollbar $hsb -orient horizontal -command [list $tbl xview] . . . @@ -8550,6 +8682,45 @@

    Detailed Reference

    +
    + REMARK 2:  This subcommand also enables you to manage the + horizontal scrollbar (if any) to start to the right of the tablelist + widget's non-scrollable title column area if the value of the + -titlecolumns option + is positive.  In the above example, this can be achieved by + modifying its second half as follows: + +
    +
    +. . .
    +
    +# Manage the widgets within the frame
    +grid $tbl -row 0 -rowspan 2 -column 0 -columnspan 2 -sticky news
    +if {[string compare [tk windowingsystem] "win32"] == 0} {
    +    grid $vsb -row 0 -rowspan 2 -column 2 -sticky ns
    +} else {
    +    grid [$tbl cornerpath] -row 0 -column 2 -sticky ew
    +    grid $vsb              -row 1 -column 2 -sticky ns
    +}
    +grid [$tbl cornerpath -sw] -row 2 -column 0 -sticky ns
    +grid $hsb                  -row 2 -column 1 -sticky ew
    +grid rowconfigure    $frm 1 -weight 1
    +grid columnconfigure $frm 1 -weight 1
    +
    +# Manage the frame
    +pack $frm -expand yes -fill both
    +
    + +

    For a tablelist widget having two header rows and two title + columns, the scrollbars of the modified example will appear like in + the screenshot below (on Windows this is only valid for the + horizontal scrollbar):

    + +

    Scrollbars

    +
    +
    +
    pathName curcellselection ?-all|-nonhidden|-viewable?
    @@ -9176,7 +9347,7 @@

    Detailed Reference

    0 otherwise. + option ?arg arg ...?
    This command is only supported for Tk versions 8.5 and later.  It is used to invoke various operations on the items in the widget's @@ -9761,6 +9932,18 @@

    Detailed Reference

    "#sortbycolumnlist">sortbycolumnlist.  The return value is an empty string.
    +
    pathName + restorecursor
    + +
    Sets the -cursor configuration option to the + value that it had before invoking the setbusycursor subcommand and returns + the boolean value 1.  If there was no previous + setbusycursor invocation or this is not the first + restorecursor invocation since the most recent call + to setbusycursor, then the command returns the + value 0, without attempting to restore the cursor.
    +
    pathName rowattrib index ?name? ?value name value ...?
    @@ -10131,6 +10314,22 @@

    Detailed Reference

    "#showseparators">-showseparators configuration option. +
    pathName + setbusycursor
    + +
    Saves the current value of the -cursor + configuration option and then sets this option to the name of a + windowing system-specific busy cursor (watch or + wait).  Since this subcommand is designed to + be invoked just before starting an operation that can take a long time + to complete, it also makes sure that the new cursor will immediately + get visible, by calling  update + idletasks.  In the rare but possible case that, as a + side effect of this invocation, the tablelist widget gets destroyed by + some application-specific action scheduled for execution at idle time, + the command returns the boolean value 0, otherwise the + value 1.
    +
    pathName showtargetmark before|inside index
    From 47c3f258e66ef2b5066425f55781de36ac270596 Mon Sep 17 00:00:00 2001 From: csaba Date: Thu, 16 Aug 2018 15:35:08 +0000 Subject: [PATCH 064/150] * scripts/*.tcl: Added the "-showbusycursor" configuration option and the "setbusycursor" and "restorecursor" subcommands; the "-stretch" option is no longer ignored if the width was specified as zero or less; enhancements related to managing both scrollbars with the aid of the "cornerpath" subcommand; optimizations in the item insertion and the selection-related code; improved the interactive cell editing with the aid of the ctext widget; made the overall handling of the "-listvariable" option much more robust; fixed some bugs related to the "-maxwidth" column configuration option, the "-displayondemand" option, and the tooltip support; further improvements and minor bug fixes. --- modules/tablelist/scripts/tablelistBind.tcl | 155 ++-- modules/tablelist/scripts/tablelistConfig.tcl | 261 +++--- modules/tablelist/scripts/tablelistEdit.tcl | 8 +- modules/tablelist/scripts/tablelistMove.tcl | 58 +- modules/tablelist/scripts/tablelistSort.tcl | 16 +- modules/tablelist/scripts/tablelistUtil.tcl | 338 ++++---- modules/tablelist/scripts/tablelistWidget.tcl | 761 +++++++++--------- 7 files changed, 808 insertions(+), 789 deletions(-) diff --git a/modules/tablelist/scripts/tablelistBind.tcl b/modules/tablelist/scripts/tablelistBind.tcl index 238031b7..f5b2a8ea 100644 --- a/modules/tablelist/scripts/tablelistBind.tcl +++ b/modules/tablelist/scripts/tablelistBind.tcl @@ -277,7 +277,7 @@ proc tablelist::cleanup win { # If there is a list variable associated with the # widget then remove the trace set on this variable # - if {$data(hasListVar) && [info exists $data(-listvariable)]} { + if {$data(hasListVar) && [info exists ::$data(-listvariable)]} { upvar #0 $data(-listvariable) var trace vdelete var wu $data(listVarTraceCmd) } @@ -311,7 +311,7 @@ proc tablelist::cleanup win { } } - destroy $data(corner) + destroy $data(cornerFrm-ne) $data(cornerFrm-sw) namespace delete ::tablelist::ns$win catch {rename ::$win ""} @@ -944,7 +944,9 @@ proc tablelist::handleMotionDelayed {w x y X Y mode event} { } set data(motionData) [list $w $x $y $X $Y $event] - if {![info exists data(motionId)]} { + if {[string compare $event ""] == 0} { + handleMotion $win + } elseif {![info exists data(motionId)]} { set data(motionId) [after 100 [list tablelist::handleMotion $win]] } @@ -981,9 +983,11 @@ proc tablelist::handleMotion win { set row [containingRow $win $_y] set col [containingCol $win $_x] - showOrHideTooltip $win $row $col $X $Y - if {[destroyed $win]} { - return "" + if {[string compare $event ""] != 0 || ($row >= 0 && $col >= 0)} { + showOrHideTooltip $win $row $col $X $Y + if {[destroyed $win]} { + return "" + } } updateExpCollCtrl $win $w $row $col $x @@ -1265,11 +1269,13 @@ proc tablelist::wasExpCollCtrlClicked {w x y} { # # Toggle the state of the expand/collapse control # + if {[::$win cget -showbusycursor]} { ::$win setbusycursor } if {[string compare $mode "collapsed"] == 0} { - ::$win expand $row -partly + ::$win expand $row -partly ;# can take long } else { - ::$win collapse $row -partly + ::$win collapse $row -partly ;# can take long } + ::$win restorecursor return 1 } @@ -1589,12 +1595,15 @@ proc tablelist::motion {win row col {checkIfDragSrc 0}} { } set ancRow $data(anchorRow) - foreach r $priv(selection) { + + if {[::$win cget -showbusycursor]} { ::$win setbusycursor } + foreach r $priv(selection) { ;# can take long if {($r >= $prRow && $r < $row && $r < $ancRow) || ($r <= $prRow && $r > $row && $r > $ancRow)} { ::$win selection set $r } } + ::$win restorecursor set priv(prevRow) $row event generate $win <> @@ -1643,7 +1652,9 @@ proc tablelist::motion {win row col {checkIfDragSrc 0}} { [normalizedRect $prRow $prCol $ancRow $col] {} foreach {rMin3 cMin3 rMax3 cMax3} \ [normalizedRect $ancRow $ancCol $row $col] {} - foreach cellIdx $priv(selection) { + + if {[::$win cget -showbusycursor]} { ::$win setbusycursor } + foreach cellIdx $priv(selection) { ;# can take long scan $cellIdx "%d,%d" r c if {([cellInRect $r $c $rMin1 $cMin1 $rMax1 $cMax1] || [cellInRect $r $c $rMin2 $cMin2 $rMax2 $cMax2]) && @@ -1651,6 +1662,7 @@ proc tablelist::motion {win row col {checkIfDragSrc 0}} { ::$win cellselection set $r,$c } } + ::$win restorecursor set priv(prevRow) $row set priv(prevCol) $col @@ -1869,7 +1881,11 @@ proc tablelist::moveOrActivate {win row col inside} { if {$targetChildIdx == 0} { set targetParentNodeIdx [lindex $data(keyList) $targetRow] - ::$win expand $targetParentNodeIdx -partly + + if {[::$win cget -showbusycursor]} { ::$win setbusycursor } + ::$win expand $targetParentNodeIdx -partly ;# can take long + ::$win restorecursor + ::$win move $sourceKey $targetParentNodeIdx $targetChildIdx } else { set targetParentNodeIdx [::$win parentkey $targetRow] @@ -1991,12 +2007,8 @@ proc tablelist::cancelMove win { unset data(sourceParentKey) unset data(sourceParentRow) unset data(sourceParentEndRow) - if {[info exists data(targetRow)]} { - unset data(targetRow) - } - if {[info exists data(targetChildIdx)]} { - unset data(targetChildIdx) - } + arrayUnset data targetRow + arrayUnset data targetChildIdx bind [winfo toplevel $win] $data(topEscBinding) $data(body) configure -cursor $data(-cursor) place forget $data(rowGap) @@ -2036,7 +2048,11 @@ proc tablelist::beginToggle {win row col} { row { if {[string compare $data(-selectmode) "extended"] == 0} { variable priv - set priv(selection) [::$win curselection] + + if {[::$win cget -showbusycursor]} { ::$win setbusycursor } + set priv(selection) [::$win curselection] ;# can take long + ::$win restorecursor + set priv(prevRow) $row ::$win selection anchor $row if {[::$win selection includes $row]} { @@ -2062,7 +2078,11 @@ proc tablelist::beginToggle {win row col} { cell { if {[string compare $data(-selectmode) "extended"] == 0} { variable priv - set priv(selection) [::$win curcellselection] + + if {[::$win cget -showbusycursor]} { ::$win setbusycursor } + set priv(selection) [::$win curcellselection] ;# can take long + ::$win restorecursor + set priv(prevRow) $row set priv(prevCol) $col ::$win cellselection anchor $row,$col @@ -2142,7 +2162,9 @@ proc tablelist::plusMinus {win keysym} { # # Toggle the state of the expand/collapse control # - ::$win $op $row -partly + if {[::$win cget -showbusycursor]} { ::$win setbusycursor } + ::$win $op $row -partly ;# can take long + ::$win restorecursor } } @@ -2288,7 +2310,9 @@ proc tablelist::leftRight {win amount} { # # Toggle the state of the expand/collapse control # - ::$win $op $row -partly + if {[::$win cget -showbusycursor]} { ::$win setbusycursor } + ::$win $op $row -partly ;# can take long + ::$win restorecursor } } @@ -2560,9 +2584,11 @@ proc tablelist::cancelSelection win { } ::$win selection clear 0 end - foreach row $priv(selection) { - ::$win selection set $row - } + + if {[::$win cget -showbusycursor]} { ::$win setbusycursor } + ::$win selection set $priv(selection) ;# can take long + ::$win restorecursor + event generate $win <> } @@ -2573,9 +2599,11 @@ proc tablelist::cancelSelection win { } ::$win selection clear 0 end - foreach cellIdx $priv(selection) { - ::$win cellselection set $cellIdx - } + + if {[::$win cget -showbusycursor]} { ::$win setbusycursor } + ::$win cellselection set $priv(selection) ;# can take long + ::$win restorecursor + event generate $win <> } } @@ -2828,9 +2856,9 @@ proc tablelist::changeSelection {win row col} { #------------------------------------------------------------------------------ proc tablelist::defineTablelistHeader {} { foreach event { } { - bind TablelistHeader $event { - tablelist::hdr_handleMotionDelayed %W %x %y %X %Y - } + bind TablelistHeader $event [format { + tablelist::hdr_handleMotionDelayed %%W %%x %%y %%X %%Y %s + } $event] } } @@ -2841,15 +2869,17 @@ proc tablelist::defineTablelistHeader {} { # text widget of a tablelist widget or is moving within it. It schedules the # execution of the hdr_handleMotion procedure 100 ms later. #------------------------------------------------------------------------------ -proc tablelist::hdr_handleMotionDelayed {w x y X Y} { +proc tablelist::hdr_handleMotionDelayed {w x y X Y event} { set win [getTablelistPath $w] upvar ::tablelist::ns${win}::data data if {[regexp {^vsep([0-9]+)?$} [winfo name $w]]} { return "" } - set data(hdr_motionData) [list $w $x $y $X $Y] - if {![info exists data(hdr_motionId)]} { + set data(hdr_motionData) [list $w $x $y $X $Y $event] + if {[string compare $event ""] == 0} { + hdr_handleMotion $win + } elseif {![info exists data(hdr_motionId)]} { set data(hdr_motionId) \ [after 100 [list tablelist::hdr_handleMotion $win]] } @@ -2871,12 +2901,14 @@ proc tablelist::hdr_handleMotion win { # Get the containing header cell from the # coordinates relative to the tablelist # - foreach {w x y X Y} $data(hdr_motionData) {} + foreach {w x y X Y event} $data(hdr_motionData) {} foreach {win _x _y} [convEventFields $w $x $y] {} set row [hdr_containingRow $win $_y] set col [containingCol $win $_x] - hdr_showOrHideTooltip $win $row $col $X $Y + if {[string compare $event ""] != 0 || ($row >= 0 && $col >= 0)} { + hdr_showOrHideTooltip $win $row $col $X $Y + } } #------------------------------------------------------------------------------ @@ -3382,9 +3414,7 @@ proc tablelist::labelB1Motion {w X x y} { $targetCol < $data(-titlecolumns)) || ($col < $data(-titlecolumns) && $targetCol > $data(-titlecolumns))))} { - if {[info exists data(targetCol)]} { - unset data(targetCol) - } + arrayUnset data targetCol configLabel $w -cursor $data(-cursor) $data(hdrTxtFrmCanv)$col configure -cursor $data(-cursor) place forget $data(colGap) @@ -3541,18 +3571,22 @@ proc tablelist::labelB1Up {w X} { } } } + unset data(colBeingResized) - $data(body) tag remove visibleLines 1.0 end - $data(body) tag configure visibleLines -tabs {} if {$data(colResized)} { - redisplayCol $win $col 0 last + if {[::$win cget -showbusycursor]} { ::$win setbusycursor } + redisplayCol $win $col 0 last ;# can take long adjustColumns $win {} 0 stretchColumns $win $col updateColors $win + ::$win restorecursor genVirtualEvent $win <> $col } + + $data(body) tag remove visibleLines 1.0 end + $data(body) tag configure visibleLines -tabs {} } else { if {[info exists data(X)]} { unset data(X) @@ -3569,21 +3603,27 @@ proc tablelist::labelB1Up {w X} { if {$data(inClickedLabel)} { configLabel $w -relief $data(relief) -pressed 0 + set cmd "" if {$data(shiftPressed)} { if {[info exists data($col-labelcommand2)]} { - uplevel #0 $data($col-labelcommand2) [list $win $col] + set cmd $data($col-labelcommand2) } elseif {[string length $data(-labelcommand2)] != 0} { - uplevel #0 $data(-labelcommand2) [list $win $col] + set cmd $data(-labelcommand2) } } else { if {[info exists data($col-labelcommand)]} { - uplevel #0 $data($col-labelcommand) [list $win $col] + set cmd $data($col-labelcommand) } elseif {[string length $data(-labelcommand)] != 0} { - uplevel #0 $data(-labelcommand) [list $win $col] + set cmd $data(-labelcommand) } } - if {[destroyed $win]} { - return "" + if {[string length $cmd] != 0} { + if {[::$win cget -showbusycursor]} { ::$win setbusycursor } + uplevel #0 $cmd [list $win $col] ;# can take long + if {[destroyed $win]} { + return "" + } + ::$win restorecursor } } elseif {$data(-movablecolumns)} { $data(hdrTxtFrmCanv)$col configure -cursor $data(-cursor) @@ -3591,7 +3631,9 @@ proc tablelist::labelB1Up {w X} { set sourceColName [doColCget $col $win -name] set targetColName [doColCget $data(targetCol) $win -name] - moveCol $win $col $data(targetCol) + if {[::$win cget -showbusycursor]} { ::$win setbusycursor } + moveCol $win $col $data(targetCol) ;# can take long + ::$win restorecursor set userData \ [list $col $data(targetCol) $sourceColName $targetColName] @@ -3622,11 +3664,16 @@ proc tablelist::labelB3Down {w shiftPressed} { upvar ::tablelist::ns${win}::data data if {!$data(isDisabled) && $data(-resizablecolumns) && $data($col-resizable)} { + # + # doColConfig $col $win -width ... can take long + # + if {[::$win cget -showbusycursor]} { ::$win setbusycursor } if {$shiftPressed} { doColConfig $col $win -width -$data($col-lastStaticWidth) } else { doColConfig $col $win -width 0 } + ::$win restorecursor genVirtualEvent $win <> $col } @@ -3647,11 +3694,16 @@ proc tablelist::labelDblB1 {w x shiftPressed} { upvar ::tablelist::ns${win}::data data if {!$data(isDisabled) && [inResizeArea $w $x col] && $data(-resizablecolumns) && $data($col-resizable)} { + # + # doColConfig $col $win -width ... can take long + # + if {[::$win cget -showbusycursor]} { ::$win setbusycursor } if {$shiftPressed} { doColConfig $col $win -width -$data($col-lastStaticWidth) } else { doColConfig $col $win -width 0 } + ::$win restorecursor genVirtualEvent $win <> $col } @@ -3671,9 +3723,6 @@ proc tablelist::escape {win col} { if {[info exists data(colBeingResized)]} { ;# resize operation in progress configLabel $w -cursor $data(-cursor) update idletasks - if {[destroyed $win]} { - return "" - } if {[winfo exists $data(focus)]} { focus $data(focus) } @@ -3697,9 +3746,7 @@ proc tablelist::escape {win col} { } bind [winfo toplevel $win] $data(topEscBinding) place forget $data(colGap) - if {[info exists data(targetCol)]} { - unset data(targetCol) - } + arrayUnset data targetCol if {[info exists data(X)]} { unset data(X) after cancel $data(afterId) diff --git a/modules/tablelist/scripts/tablelistConfig.tcl b/modules/tablelist/scripts/tablelistConfig.tcl index 66cd36c5..d253bf41 100644 --- a/modules/tablelist/scripts/tablelistConfig.tcl +++ b/modules/tablelist/scripts/tablelistConfig.tcl @@ -49,6 +49,7 @@ proc tablelist::extendConfigSpecs {} { 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 @@ -88,7 +89,7 @@ proc tablelist::extendConfigSpecs {} { destroy $helpListbox set helpLabel .__helpLabel - for {set n 0} {[winfo exists $helpLabel]} {incr n} { + for {set n 2} {[winfo exists $helpLabel]} {incr n} { set helpLabel .__helpLabel$n } @@ -201,7 +202,7 @@ proc tablelist::extendConfigSpecs {} { # options from a temporary, invisible button widget # set helpButton .__helpButton - for {set n 0} {[winfo exists $helpButton]} {incr n} { + for {set n 2} {[winfo exists $helpButton]} {incr n} { set helpButton .__helpButton$n } button $helpButton @@ -429,9 +430,11 @@ proc tablelist::doConfig {win opt val} { $w configure $opt $val } } - $data(hdrTxt) configure $opt $val - $data(hdrFrmLbl) configure $opt $val - $data(cornerLbl) 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 } @@ -467,6 +470,7 @@ proc tablelist::doConfig {win 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 @@ -706,7 +710,8 @@ proc tablelist::doConfig {win opt val} { -movablerows - -protecttitlecolumns - -resizablecolumns - - -setfocus { + -setfocus - + -showbusycursor { # # Save the boolean value specified by val in data($opt) # @@ -718,13 +723,12 @@ proc tablelist::doConfig {win opt val} { # the lists of the column fonts and tag # names, and redisplay the items # - set selCells [curCellSelection $win] setupColumns $win $val 1 adjustColumns $win allCols 1 adjustColIndex $win data(anchorCol) 1 adjustColIndex $win data(activeCol) 1 makeColFontAndTagLists $win - redisplay $win 0 $selCells + redisplay $win updateViewWhenIdle $win } -columntitles { @@ -759,11 +763,10 @@ proc tablelist::doConfig {win opt val} { for {} {$col < $titleCount} {incr col} { lappend columns 0 [lindex $val $col] left } - set selCells [curCellSelection $win] setupColumns $win $columns 1 adjustColumns $win allCols 1 makeColFontAndTagLists $win - redisplay $win 0 $selCells + redisplay $win updateViewWhenIdle $win # @@ -826,8 +829,9 @@ proc tablelist::doConfig {win opt val} { # when it loses ownership of the PRIMARY selection # set data($opt) [expr {$val ? 1 : 0}] - if {$val && - [llength [$data(body) tag nextrange select 1.0]] != 0} { + upvar ::tablelist::ns${win}::selStates selStates + if {$val && $data(colCount) != 0 && + [array size selStates] != 0} { selection own -command \ [list ::tablelist::lostSelection $win] $win } @@ -956,6 +960,7 @@ proc tablelist::doConfig {win opt val} { # $data(lb) configure $opt $val set data($opt) [$data(lb) cget $opt] + updateListboxSetgridOpt $win } -showarrow { # @@ -1091,6 +1096,7 @@ proc tablelist::doConfig {win opt val} { set data($opt) $val sortStretchableColList $win } + updateListboxSetgridOpt $win set data(forceAdjust) 1 stretchColumnsWhenIdle $win } @@ -1179,6 +1185,14 @@ proc tablelist::doConfig {win opt val} { } set data($opt) $val updateHScrlbarWhenIdle $win + + set cornerFrmWidth [getTitleColsWidth $win] + if {$cornerFrmWidth == 0} { + set cornerFrmWidth 1 + } else { + incr cornerFrmWidth -1 + } + $data(cornerFrm-sw) configure -width $cornerFrmWidth } -treecolumn { # @@ -1248,11 +1262,6 @@ proc tablelist::doConfig {win opt val} { winxp* { set data(protectIndents) 1 } default { set data(protectIndents) 0 } } - set selCells [curCellSelection $win 1] - foreach {key col} $selCells { - set row [keyToRow $win $key] - cellSelection $win set $row $col $row $col - } if {$data(ownsFocus) && ![info exists data(dispId)]} { addActiveTag $win } @@ -1274,6 +1283,7 @@ proc tablelist::doConfig {win opt val} { $data(lb) configure $opt $val } set data($opt) $val + updateListboxSetgridOpt $win } -xscrollcommand { # @@ -1339,9 +1349,7 @@ proc tablelist::doColConfig {col win opt val} { set name $col$opt if {[string length $val] == 0} { - if {[info exists data($name)]} { - unset data($name) - } + arrayUnset data $name } else { # # Configure the tag col$opt-$val in both text widgets @@ -1420,6 +1428,7 @@ proc tablelist::doColConfig {col win opt val} { } -font { + displayItems $win set name $col$opt if {[info exists data($name)] && @@ -1440,9 +1449,7 @@ proc tablelist::doColConfig {col win opt val} { } if {[string length $val] == 0} { - if {[info exists data($name)]} { - unset data($name) - } + arrayUnset data $name } else { # # Configure the tag col$opt-$val in both text widgets @@ -1496,9 +1503,7 @@ proc tablelist::doColConfig {col win opt val} { -formatcommand { if {[string length $val] == 0} { - if {[info exists data($col$opt)]} { - unset data($col$opt) - } + arrayUnset data $col$opt set fmtCmdFlag 0 } else { set data($col$opt) $val @@ -1530,9 +1535,6 @@ proc tablelist::doColConfig {col win opt val} { set oldVal $data($col$opt) set newVal [expr {$val ? 1 : 0}] if {$newVal != $oldVal} { - if {!$canElide} { - set selCells [curCellSelection $win] - } set data($col$opt) $newVal if {$newVal} { ;# hiding the column incr data(hiddenColCount) @@ -1547,13 +1549,7 @@ proc tablelist::doColConfig {col win opt val} { makeColFontAndTagLists $win adjustColumns $win $col 1 if {!$canElide} { - redisplay $win 0 $selCells - if {!$newVal && - [string compare $data(-selecttype) "row"] == 0} { - foreach row [curSelection $win] { - rowSelection $win set $row $row - } - } + redisplay $win } updateViewWhenIdle $win @@ -1567,9 +1563,7 @@ proc tablelist::doColConfig {col win opt val} { # Unset data($col$opt) # set alignment [lindex $data(colList) [expr {2*$col + 1}]] - if {[info exists data($col$opt)]} { - unset data($col$opt) - } + arrayUnset data $col$opt } else { # # Save the properly formatted value of val in data($col$opt) @@ -1608,9 +1602,7 @@ proc tablelist::doColConfig {col win opt val} { # its sublabels (if any), and unset data($col$opt) # configLabel $w -$optTail $data($opt) - if {[info exists data($col$opt)]} { - unset data($col$opt) - } + arrayUnset data $col$opt } else { # # Apply the given value to the col'th label and @@ -1637,9 +1629,7 @@ proc tablelist::doColConfig {col win opt val} { # option to the col'th label and unset data($col$opt) # configLabel $w -$optTail $data($opt) - if {[info exists data($col$opt)]} { - unset data($col$opt) - } + arrayUnset data $col$opt } else { # # Apply the given value to the col'th label and save the @@ -1661,9 +1651,7 @@ proc tablelist::doColConfig {col win opt val} { -name - -sortcommand { if {[string length $val] == 0} { - if {[info exists data($col$opt)]} { - unset data($col$opt) - } + arrayUnset data $col$opt } else { set data($col$opt) $val } @@ -1679,9 +1667,7 @@ proc tablelist::doColConfig {col win opt val} { # its sublabels (if any), and unset data($col$opt) # configLabel $w -$optTail $data($opt) - if {[info exists data($col$opt)]} { - unset data($col$opt) - } + arrayUnset data $col$opt } else { # # Apply the given value to the col'th label and @@ -1709,9 +1695,7 @@ proc tablelist::doColConfig {col win opt val} { # option to the col'th label and unset data($col$opt) # configLabel $w -$optTail $data($opt) - if {[info exists data($col$opt)]} { - unset data($col$opt) - } + arrayUnset data $col$opt } else { # # Apply the given value to the col'th label and save the @@ -1757,9 +1741,7 @@ proc tablelist::doColConfig {col win opt val} { foreach l [getSublabels $w] { destroy $l } - if {[info exists data($col$opt)]} { - unset data($col$opt) - } + arrayUnset data $col$opt } else { if {![winfo exists $w-il]} { variable configSpecs @@ -1829,9 +1811,7 @@ proc tablelist::doColConfig {col win opt val} { # option to the col'th label and unset data($col$opt) # configLabel $w -$optTail $data($opt) - if {[info exists data($col$opt)]} { - unset data($col$opt) - } + arrayUnset data $col$opt } else { # # Apply the given value to the col'th label and save the @@ -1902,9 +1882,7 @@ proc tablelist::doColConfig {col win opt val} { set name $col$opt if {[string length $val] == 0} { - if {[info exists data($name)]} { - unset data($name) - } + arrayUnset data $name } else { # # Configure the tag col$opt-$val in the body text widget @@ -2005,6 +1983,7 @@ proc tablelist::doColConfig {col win opt val} { stretchColumnsWhenIdle $win } } + updateListboxSetgridOpt $win } -stripebackground - @@ -2013,9 +1992,7 @@ proc tablelist::doColConfig {col win opt val} { set name $col$opt if {[string length $val] == 0} { - if {[info exists data($name)]} { - unset data($name) - } + arrayUnset data $name } else { # # Configure the tag col$opt-$val in the body text widget @@ -2098,7 +2075,12 @@ proc tablelist::doColConfig {col win opt val} { set idx [expr {3*$col}] if {$val != [lindex $data(-columns) $idx]} { setupColumns $win [lreplace $data(-columns) $idx $idx $val] 0 - redisplayColWhenIdle $win $col ;# here before adjustColumns! + 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 } @@ -2176,9 +2158,7 @@ proc tablelist::doRowConfig {row win opt val} { set name $key$opt if {[string length $val] == 0} { - if {[info exists data($name)]} { - unset data($name) - } + arrayUnset data $name } else { # # Configure the tag row$opt-$val in the text widget @@ -2199,6 +2179,7 @@ proc tablelist::doRowConfig {row win opt val} { } -elide { + displayItems $win set val [expr {$val ? 1 : 0}] set item [lindex $data(itemList) $row] set key [lindex $item end] @@ -2311,6 +2292,10 @@ proc tablelist::doRowConfig {row win opt val} { } -font { + if {$inBody} { + displayItems $win + } + # # Save the current cell fonts in a temporary array # @@ -2386,9 +2371,7 @@ proc tablelist::doRowConfig {row win opt val} { getIndentData $win $key $col indentWidthSav if {$data($col-maxPixels) > 0} { - if {$data($col-reqPixels) > $data($col-maxPixels)} { - set workPixels $data($col-maxPixels) - } + set workPixels $data($col-maxPixels) } } set aux [getAuxData $win $key $col auxType auxWidth $workPixels] @@ -2491,6 +2474,7 @@ proc tablelist::doRowConfig {row win opt val} { } -hide { + displayItems $win set val [expr {$val ? 1 : 0}] set item [lindex $data(itemList) $row] set key [lindex $item end] @@ -2643,9 +2627,7 @@ proc tablelist::doRowConfig {row win opt val} { -name { set key [lindex $data(${p}keyList) $row] if {[string length $val] == 0} { - if {[info exists data($key$opt)]} { - unset data($key$opt) - } + arrayUnset data $key$opt } else { set data($key$opt) $val } @@ -2656,9 +2638,7 @@ proc tablelist::doRowConfig {row win opt val} { set key [lindex $data(keyList) $row] if {$val} { - if {[info exists data($key$opt)]} { - unset data($key$opt) - } + arrayUnset data $key$opt } else { # # Set data($key$opt) to 0 and deselect the row @@ -2674,9 +2654,7 @@ proc tablelist::doRowConfig {row win opt val} { set name $key$opt if {[string length $val] == 0} { - if {[info exists data($name)]} { - unset data($name) - } + arrayUnset data $name } else { # # Configure the tag row$opt-$val in the body text widget @@ -2702,6 +2680,10 @@ proc tablelist::doRowConfig {row win opt val} { return "" } + if {$inBody} { + displayItems $win + } + set colWidthsChanged 0 set colIdxList {} set oldItem [lindex $data(${p}itemList) $row] @@ -2736,9 +2718,7 @@ proc tablelist::doRowConfig {row win opt val} { getIndentData $win $key $col indentWidthSav if {$data($col-maxPixels) > 0} { - if {$data($col-reqPixels) > $data($col-maxPixels)} { - set workPixels $data($col-maxPixels) - } + set workPixels $data($col-maxPixels) } } set aux [getAuxData $win $key $col auxType auxWidth $workPixels] @@ -2836,7 +2816,8 @@ proc tablelist::doRowConfig {row win opt val} { # # Replace the row's content in the list variable if present # - if {$inBody && $data(hasListVar)} { + if {$inBody && $data(hasListVar) && + [info exists ::$data(-listvariable)]} { upvar #0 $data(-listvariable) var trace vdelete var wu $data(listVarTraceCmd) set var [lreplace $var $row $row $newItem] @@ -2931,9 +2912,7 @@ proc tablelist::doCellConfig {row col win opt val} { set name $key,$col$opt if {[string length $val] == 0} { - if {[info exists data($name)]} { - unset data($name) - } + arrayUnset data $name } else { # # Configure the tag cell$opt-$val in the text widget @@ -2977,6 +2956,10 @@ proc tablelist::doCellConfig {row col win opt val} { } -font { + if {$inBody} { + displayItems $win + } + # # Save the current cell font # @@ -3047,9 +3030,7 @@ proc tablelist::doCellConfig {row col win opt val} { getIndentData $win $key $col indentWidthSav if {$data($col-maxPixels) > 0} { - if {$data($col-reqPixels) > $data($col-maxPixels)} { - set workPixels $data($col-maxPixels) - } + set workPixels $data($col-maxPixels) } } set aux [getAuxData $win $key $col auxType auxWidth $workPixels] @@ -3147,6 +3128,10 @@ proc tablelist::doCellConfig {row col win opt val} { return "" } + if {$inBody} { + displayItems $win + } + # # Save the old image or window width # @@ -3199,9 +3184,7 @@ proc tablelist::doCellConfig {row col win opt val} { getIndentData $win $key $col indentWidthSav if {$data($col-maxPixels) > 0} { - if {$data($col-reqPixels) > $data($col-maxPixels)} { - set workPixels $data($col-maxPixels) - } + set workPixels $data($col-maxPixels) } } set aux [getAuxData $win $key $col auxType auxWidth $workPixels] @@ -3297,9 +3280,7 @@ proc tablelist::doCellConfig {row col win opt val} { # Delete data($name) or save the specified value in it # if {[string length $val] == 0} { - if {[info exists data($name)]} { - unset data($name) - } + arrayUnset data $name } else { set data($name) $val } @@ -3314,6 +3295,8 @@ proc tablelist::doCellConfig {row col win opt val} { return "" } + displayItems $win + # # Save the old indentation width # @@ -3364,9 +3347,7 @@ proc tablelist::doCellConfig {row col win opt val} { getIndentData $win $key $col indentWidthSav if {$data($col-maxPixels) > 0} { - if {$data($col-reqPixels) > $data($col-maxPixels)} { - set workPixels $data($col-maxPixels) - } + set workPixels $data($col-maxPixels) } } set aux [getAuxData $win $key $col auxType auxWidth $workPixels] @@ -3459,9 +3440,7 @@ proc tablelist::doCellConfig {row col win opt val} { set name $key,$col$opt if {[string length $val] == 0} { - if {[info exists data($name)]} { - unset data($name) - } + arrayUnset data $name } else { # # Configure the tag cell$opt-$val in the body text widget @@ -3491,8 +3470,8 @@ proc tablelist::doCellConfig {row col win opt val} { set name $key,$col$opt if {$val} { set data($name) 1 - } elseif {[info exists data($name)]} { - unset data($name) + } else { + arrayUnset data $name } if {($data($col-hide) && !$canElide) || @@ -3522,6 +3501,10 @@ proc tablelist::doCellConfig {row col win opt val} { return "" } + if {$inBody} { + displayItems $win + } + set indent [getIndentData $win $key $col indentWidth] set maxTextWidth $pixels if {$pixels != 0} { @@ -3577,6 +3560,10 @@ proc tablelist::doCellConfig {row col win opt val} { return "" } + if {$inBody} { + displayItems $win + } + set pixels [lindex $data(colList) [expr {2*$col}]] set workPixels $pixels set text $val @@ -3597,9 +3584,7 @@ proc tablelist::doCellConfig {row col win opt val} { getIndentData $win $key $col indentWidthSav if {$data($col-maxPixels) > 0} { - if {$data($col-reqPixels) > $data($col-maxPixels)} { - set workPixels $data($col-maxPixels) - } + set workPixels $data($col-maxPixels) } } set aux [getAuxData $win $key $col auxType auxWidth $workPixels] @@ -3665,7 +3650,8 @@ proc tablelist::doCellConfig {row col win opt val} { # # Replace the cell's content in the list variable if present # - if {$inBody && $data(hasListVar)} { + if {$inBody && $data(hasListVar) && + [info exists ::$data(-listvariable)]} { upvar #0 $data(-listvariable) var trace vdelete var wu $data(listVarTraceCmd) set var [lreplace $var $row $row \ @@ -3726,7 +3712,7 @@ proc tablelist::doCellConfig {row col win opt val} { 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 + redisplayCol $win $col $row $row $inBody } -window { @@ -3734,6 +3720,10 @@ proc tablelist::doCellConfig {row col win opt val} { return "" } + if {$inBody} { + displayItems $win + } + # # Save the old image or window width # @@ -3834,9 +3824,7 @@ proc tablelist::doCellConfig {row col win opt val} { getIndentData $win $key $col indentWidthSav if {$data($col-maxPixels) > 0} { - if {$data($col-reqPixels) > $data($col-maxPixels)} { - set workPixels $data($col-maxPixels) - } + set workPixels $data($col-maxPixels) } } set aux [getAuxData $win $key $col auxType auxWidth $workPixels] @@ -3931,9 +3919,7 @@ proc tablelist::doCellConfig {row col win opt val} { # Delete data($name) or save the specified value in it # if {[string length $val] == 0} { - if {[info exists data($name)]} { - unset data($name) - } + arrayUnset data $name } else { set data($name) $val } @@ -4002,10 +3988,10 @@ proc tablelist::makeListVar {win varName} { # If there is an old list variable associated with the # widget then remove the trace set on this variable # - if {$data(hasListVar)} { + if {$data(hasListVar) && [info exists ::$data(-listvariable)]} { synchronize $win - upvar #0 $data(-listvariable) var - trace vdelete var wu $data(listVarTraceCmd) + upvar #0 $data(-listvariable) oldVar + trace vdelete oldVar wu $data(listVarTraceCmd) } return "" } @@ -4014,24 +4000,35 @@ proc tablelist::makeListVar {win varName} { # The list variable may be an array element but must not be an array # if {![regexp {^(.*)\((.*)\)$} $varName dummy name1 name2]} { - if {[array exists $varName]} { + if {[array exists ::$varName]} { 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 + # + upvar #0 $varName var + if {[info exists var]} { + if {[catch {foreach item $var {llength $item}}] != 0} { + return -code error "value of variable \"$varName\" is not a list\ + of lists" + } + } + # # If there is an old list variable associated with the # widget then remove the trace set on this variable # - if {$data(hasListVar)} { + if {$data(hasListVar) && [info exists ::$data(-listvariable)]} { synchronize $win - upvar #0 $data(-listvariable) var - trace vdelete var wu $data(listVarTraceCmd) + upvar #0 $data(-listvariable) oldVar + trace vdelete oldVar wu $data(listVarTraceCmd) } - upvar #0 $varName var if {[info exists var]} { # # Invoke the trace procedure associated with the new list variable @@ -4053,6 +4050,20 @@ proc tablelist::makeListVar {win varName} { 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 # diff --git a/modules/tablelist/scripts/tablelistEdit.tcl b/modules/tablelist/scripts/tablelistEdit.tcl index d1a092cb..3b09f652 100644 --- a/modules/tablelist/scripts/tablelistEdit.tcl +++ b/modules/tablelist/scripts/tablelistEdit.tcl @@ -1804,11 +1804,15 @@ proc tablelist::doEditCell {win row col restore {cmd ""} {charPos -1}} { if {[destroyed $win]} { return "" } - $f configure -height [winfo reqheight $w] + after 0 [list $f configure -height [winfo reqheight $w]] } else { bind $w { %W configure -height [%W count -displaylines 1.0 end] - [winfo parent %W] configure -height [winfo reqheight %W] + update idletasks ;# needed for ctext + if {[winfo exists %W]} { + after 0 [list [winfo parent %W] configure -height \ + [winfo reqheight %W]] + } } } if {[info exists ::wcb::version]} { diff --git a/modules/tablelist/scripts/tablelistMove.tcl b/modules/tablelist/scripts/tablelistMove.tcl index d3c4d3ad..d09600a7 100644 --- a/modules/tablelist/scripts/tablelistMove.tcl +++ b/modules/tablelist/scripts/tablelistMove.tcl @@ -121,30 +121,8 @@ proc tablelist::moveNode {win source targetParentKey targetChildIdx \ } # - # Build the list of column indices of the selected cells - # within the source line and then delete that line - # - set selectedCols {} - set line [expr {$source + 1}] - set textIdx $line.0 - variable canElide - variable elide - variable pu - for {set col 0} {$col < $data(colCount)} {incr col} { - if {$data($col-hide) && !$canElide} { - continue - } - - # - # Check whether the 2nd tab character of the cell is selected - # - set textIdx [$w search $elide "\t" $textIdx+1$pu $line.end] - if {[lsearch -exact [$w tag names $textIdx] select] >= 0} { - lappend selectedCols $col - } - - set textIdx $textIdx+1$pu - } + # Delete the source line + # $w delete [expr {$source + 1}].0 [expr {$source + 2}].0 # @@ -193,6 +171,7 @@ proc tablelist::moveNode {win source targetParentKey targetChildIdx \ if {[info exists data($sourceKey-font)]} { $w tag add row-font-$data($sourceKey-font) $targetLine.0 $targetLine.end } + variable pu if {[info exists data($sourceKey-elide)]} { $w tag add elidedRow $targetLine.0 $targetLine.end+1$pu } @@ -313,7 +292,7 @@ proc tablelist::moveNode {win source targetParentKey targetChildIdx \ # # Update the list variable if present # - if {$data(hasListVar)} { + if {$data(hasListVar) && [info exists ::$data(-listvariable)]} { upvar #0 $data(-listvariable) var trace vdelete var wu $data(listVarTraceCmd) set var [lreplace $var $source $source] @@ -350,13 +329,6 @@ proc tablelist::moveNode {win source targetParentKey targetChildIdx \ # set data(viewableRowList) {-1} - # - # Select those source elements that were selected before - # - foreach col $selectedCols { - cellSelection $win set $target1 $col $target1 $col - } - # # Restore the edit window if it was present before # @@ -444,7 +416,8 @@ proc tablelist::moveNode {win source targetParentKey targetChildIdx \ #------------------------------------------------------------------------------ proc tablelist::moveCol {win source target} { upvar ::tablelist::ns${win}::data data \ - ::tablelist::ns${win}::attribs attribs + ::tablelist::ns${win}::attribs attribs \ + ::tablelist::ns${win}::selStates selStates if {$data(isDisabled)} { return "" } @@ -471,7 +444,7 @@ proc tablelist::moveCol {win source target} { set data(-columns) [eval linsert {$data(-columns)} $target3 $sourceRange] # - # Save some elements of data and attribs corresponding to source + # Save some elements of data, attribs, and selStates corresponding to source # array set tmpData [array get data $source-*] array set tmpData [array get data hk*,$source-*] @@ -480,9 +453,9 @@ proc tablelist::moveCol {win source target} { set tmpData($specialCol) $data($specialCol) } array set tmpAttribs [array get attribs $source-*] + array set tmpAttribs [array get attribs hk*,$source-*] array set tmpAttribs [array get attribs k*,$source-*] - set selCells [curCellSelection $win] - set tmpRows [extractColFromCellList $selCells $source] + array set tmpSelStates [array get selStates k*,$source] # # Remove source from the list of stretchable columns @@ -524,26 +497,23 @@ proc tablelist::moveCol {win source target} { trace vdelete data(activeCol) w [list tablelist::activeTrace $win] # - # Move the elements of data and attribs corresponding + # Move the elements of data, attribs, and selStates corresponding # to the columns in oldCols to the elements corresponding # to the columns with the same indices in newCols # foreach oldCol $oldCols newCol $newCols { moveColData data data imgs $oldCol $newCol moveColAttribs attribs attribs $oldCol $newCol - set selCells [replaceColInCellList $selCells $oldCol $newCol] + moveColSelStates selStates selStates $oldCol $newCol } # - # Move the elements of data and attribs corresponding + # Move the elements of data, attribs, and selStates corresponding # to source to the elements corresponding to target1 # moveColData tmpData data imgs $source $target1 moveColAttribs tmpAttribs attribs $source $target1 - set selCells [deleteColFromCellList $selCells $target1] - foreach row $tmpRows { - lappend selCells $row,$target1 - } + moveColSelStates tmpSelStates selStates $source $target1 # # If the column given by source was explicitly specified as @@ -595,7 +565,7 @@ proc tablelist::moveCol {win source target} { # # Redisplay the items # - redisplay $win 0 $selCells + redisplay $win hdr_updateColorsWhenIdle $win updateColorsWhenIdle $win diff --git a/modules/tablelist/scripts/tablelistSort.tcl b/modules/tablelist/scripts/tablelistSort.tcl index 5df23da4..ace84565 100644 --- a/modules/tablelist/scripts/tablelistSort.tcl +++ b/modules/tablelist/scripts/tablelistSort.tcl @@ -158,13 +158,11 @@ proc tablelist::sortItems {win parentKey sortColList sortOrderList} { } # - # Save the keys corresponding to anchorRow and activeRow, - # as well as the indices of the selected cells + # Save the keys corresponding to anchorRow and activeRow # foreach type {anchor active} { set ${type}Key [lindex $data(keyList) $data(${type}Row)] } - set selCells [curCellSelection $win 1] # # Save some data of the edit window if present @@ -463,8 +461,8 @@ proc tablelist::sortItems {win parentKey sortColList sortOrderList} { if {$multiline} { lappend insertArgs "\t\t" $cellTags - lappend multilineData $col $text $cellFont $pixels \ - $alignment + lappend multilineData \ + $col $text $cellFont $pixels $alignment } elseif {$data(-displayondemand)} { lappend insertArgs "\t\t" $cellTags } else { @@ -563,14 +561,6 @@ proc tablelist::sortItems {win parentKey sortColList sortOrderList} { # set data(viewableRowList) {-1} - # - # Select the cells that were selected before - # - foreach {key col} $selCells { - set row [keyToRow $win $key] - cellSelection $win set $row $col $row $col - } - # # Disable the body text widget if it was disabled before # diff --git a/modules/tablelist/scripts/tablelistUtil.tcl b/modules/tablelist/scripts/tablelistUtil.tcl index 07f0cb72..b8f2ee8d 100644 --- a/modules/tablelist/scripts/tablelistUtil.tcl +++ b/modules/tablelist/scripts/tablelistUtil.tcl @@ -113,10 +113,12 @@ proc tablelist::rowIndex {win idx endIsSize {checkRange 0}} { } elseif {[string first $idx "last"] == 0} { set index $data(lastRow) } elseif {[string first $idx "top"] == 0} { + synchronize $win displayItems $win set textIdx [$data(body) index @0,0] set index [expr {int($textIdx) - 1}] } elseif {[string first $idx "bottom"] == 0} { + synchronize $win displayItems $win set textIdx [$data(body) index @0,$data(btmY)] set index [expr {int($textIdx) - 1}] @@ -129,6 +131,7 @@ proc tablelist::rowIndex {win idx endIsSize {checkRange 0}} { set index $data(anchorRow) } elseif {[scan $idx "@%d,%d%n" x y count] == 3 && $count == [string length $idx]} { + synchronize $win displayItems $win incr x -[winfo x $data(body)] incr y -[winfo y $data(body)] @@ -719,9 +722,9 @@ proc tablelist::findTabs {win w line firstCol lastCol idx1Name idx2Name} { #------------------------------------------------------------------------------ # tablelist::sortStretchableColList # -# Replaces the column indices different from end in the list of the stretchable -# columns of the tablelist widget win with their numerical equivalents and -# sorts the resulting list. +# Replaces the column indices different from end and last in the list of the +# stretchable columns of the tablelist widget win with their numerical +# equivalents and sorts the resulting list. #------------------------------------------------------------------------------ proc tablelist::sortStretchableColList win { upvar ::tablelist::ns${win}::data data @@ -760,24 +763,20 @@ proc tablelist::deleteColData {win col} { } # - # Remove the elements with names of the form $col-* + # Remove the elements having names of the form $col-* # if {[info exists data($col-redispId)]} { after cancel $data($col-redispId) } - foreach name [array names data $col-*] { - unset data($name) - } + arrayUnset data $col-* # - # Remove the elements with names of the form hk*,$col-* + # Remove the elements having names of the form hk*,$col-* # - foreach name [array names data hk*,$col-*] { - unset data($name) - } + arrayUnset data hk*,$col-* # - # Remove the elements with names of the form k*,$col-* + # Remove the elements having names of the form k*,$col-* # foreach name [array names data k*,$col-*] { unset data($name) @@ -816,25 +815,27 @@ proc tablelist::deleteColAttribs {win col} { upvar ::tablelist::ns${win}::attribs attribs # - # Remove the elements with names of the form $col-* + # Remove the elements having names of the + # form $col-*, hk*,$col-*, and k*,$col-* # - foreach name [array names attribs $col-*] { - unset attribs($name) - } + arrayUnset attribs $col-* + arrayUnset attribs hk*,$col-* + arrayUnset attribs k*,$col-* +} - # - # Remove the elements with names of the form hk*,$col-* - # - foreach name [array names attribs hk*,$col-*] { - unset attribs($name) - } +#------------------------------------------------------------------------------ +# tablelist::deleteColSelStates +# +# Cleans up the selection states associated with the col'th column of the +# tablelist widget win. +#------------------------------------------------------------------------------ +proc tablelist::deleteColSelStates {win col} { + upvar ::tablelist::ns${win}::selStates selStates # - # Remove the elements with names of the form k*,$col-* + # Remove the elements having names of the form k*,$col # - foreach name [array names attribs k*,$col-*] { - unset attribs($name) - } + arrayUnset selStates k*,$col } #------------------------------------------------------------------------------ @@ -870,12 +871,10 @@ proc tablelist::moveColData {oldArrName newArrName imgArrName oldCol newCol} { } # - # Move the elements of oldArr with names of the form $oldCol-* - # to those of newArr with names of the form $newCol-* + # Move the elements of oldArr having names of the form $oldCol-* + # to those of newArr having names of the form $newCol-* # - foreach newName [array names newArr $newCol-*] { - unset newArr($newName) - } + arrayUnset newArr $newCol-* foreach oldName [array names oldArr $oldCol-*] { regsub "$oldCol-" $oldName "$newCol-" newName set newArr($newName) $oldArr($oldName) @@ -897,12 +896,10 @@ proc tablelist::moveColData {oldArrName newArrName imgArrName oldCol newCol} { } # - # Move the elements of oldArr with names of the form hk*,$oldCol-* - # to those of newArr with names of the form hk*,$newCol-* + # Move the elements of oldArr having names of the form hk*,$oldCol-* + # to those of newArr having names of the form hk*,$newCol-* # - foreach newName [array names newArr hk*,$newCol-*] { - unset newArr($newName) - } + arrayUnset newArr hk*,$newCol-* foreach oldName [array names oldArr hk*,$oldCol-*] { regsub -- ",$oldCol-" $oldName ",$newCol-" newName set newArr($newName) $oldArr($oldName) @@ -910,12 +907,10 @@ proc tablelist::moveColData {oldArrName newArrName imgArrName oldCol newCol} { } # - # Move the elements of oldArr with names of the form k*,$oldCol-* - # to those of newArr with names of the form k*,$newCol-* + # Move the elements of oldArr having names of the form k*,$oldCol-* + # to those of newArr having names of the form k*,$newCol-* # - foreach newName [array names newArr k*,$newCol-*] { - unset newArr($newName) - } + arrayUnset newArr k*,$newCol-* foreach oldName [array names oldArr k*,$oldCol-*] { regsub -- ",$oldCol-" $oldName ",$newCol-" newName set newArr($newName) $oldArr($oldName) @@ -950,12 +945,10 @@ proc tablelist::moveColAttribs {oldArrName newArrName oldCol newCol} { upvar $oldArrName oldArr $newArrName newArr # - # Move the elements of oldArr with names of the form $oldCol-* - # to those of newArr with names of the form $newCol-* + # Move the elements of oldArr having names of the form $oldCol-* + # to those of newArr having names of the form $newCol-* # - foreach newName [array names newArr $newCol-*] { - unset newArr($newName) - } + arrayUnset newArr $newCol-* foreach oldName [array names oldArr $oldCol-*] { regsub "$oldCol-" $oldName "$newCol-" newName set newArr($newName) $oldArr($oldName) @@ -963,12 +956,10 @@ proc tablelist::moveColAttribs {oldArrName newArrName oldCol newCol} { } # - # Move the elements of oldArr with names of the form hk*,$oldCol-* - # to those of newArr with names of the form hk*,$newCol-* + # Move the elements of oldArr having names of the form hk*,$oldCol-* + # to those of newArr having names of the form hk*,$newCol-* # - foreach newName [array names newArr hk*,$newCol-*] { - unset newArr($newName) - } + arrayUnset newArr hk*,$newCol-* foreach oldName [array names oldArr hk*,$oldCol-*] { regsub -- ",$oldCol-" $oldName ",$newCol-" newName set newArr($newName) $oldArr($oldName) @@ -976,12 +967,10 @@ proc tablelist::moveColAttribs {oldArrName newArrName oldCol newCol} { } # - # Move the elements of oldArr with names of the form k*,$oldCol-* - # to those of newArr with names of the form k*,$newCol-* + # Move the elements of oldArr having names of the form k*,$oldCol-* + # to those of newArr having names of the form k*,$newCol-* # - foreach newName [array names newArr k*,$newCol-*] { - unset newArr($newName) - } + arrayUnset newArr k*,$newCol-* foreach oldName [array names oldArr k*,$oldCol-*] { regsub -- ",$oldCol-" $oldName ",$newCol-" newName set newArr($newName) $oldArr($oldName) @@ -990,60 +979,24 @@ proc tablelist::moveColAttribs {oldArrName newArrName oldCol newCol} { } #------------------------------------------------------------------------------ -# tablelist::deleteColFromCellList +# tablelist::moveColSelStates # -# Returns the list obtained from a given list of cell indices by removing the -# elements whose column component equals a given column number. -#------------------------------------------------------------------------------ -proc tablelist::deleteColFromCellList {cellList col} { - set newCellList {} - foreach cellIdx $cellList { - scan $cellIdx "%d,%d" cellRow cellCol - if {$cellCol != $col} { - lappend newCellList $cellIdx - } - } - - return $newCellList -} - -#------------------------------------------------------------------------------ -# tablelist::extractColFromCellList -# -# Returns the list of row indices obtained from those elements of a given list -# of cell indices whose column component equals a given column number. +# Moves the elements of oldArrName corresponding to oldCol to those of +# newArrName corresponding to newCol. #------------------------------------------------------------------------------ -proc tablelist::extractColFromCellList {cellList col} { - set rowList {} - foreach cellIdx $cellList { - scan $cellIdx "%d,%d" cellRow cellCol - if {$cellCol == $col} { - lappend rowList $cellRow - } - } - - return $rowList -} +proc tablelist::moveColSelStates {oldArrName newArrName oldCol newCol} { + upvar $oldArrName oldArr $newArrName newArr -#------------------------------------------------------------------------------ -# tablelist::replaceColInCellList -# -# Returns the list obtained from a given list of cell indices by replacing the -# occurrences of oldCol in the column components with newCol. -#------------------------------------------------------------------------------ -proc tablelist::replaceColInCellList {cellList oldCol newCol} { - set cellList [deleteColFromCellList $cellList $newCol] - set newCellList {} - foreach cellIdx $cellList { - scan $cellIdx "%d,%d" cellRow cellCol - if {$cellCol == $oldCol} { - lappend newCellList $cellRow,$newCol - } else { - lappend newCellList $cellIdx - } + # + # Move the elements of oldArr having names of the form k*,$oldCol + # to those of newArr having names of the form k*,$newCol + # + arrayUnset newArr k*,$newCol + foreach oldName [array names oldArr k*,$oldCol] { + regsub -- ",$oldCol" $oldName ",$newCol" newName + set newArr($newName) $oldArr($oldName) + unset oldArr($oldName) } - - return $newCellList } #------------------------------------------------------------------------------ @@ -1053,7 +1006,7 @@ proc tablelist::replaceColInCellList {cellList oldCol newCol} { #------------------------------------------------------------------------------ proc tablelist::condUpdateListVar win { upvar ::tablelist::ns${win}::data data - if {$data(hasListVar)} { + if {$data(hasListVar) && [info exists ::$data(-listvariable)]} { upvar #0 $data(-listvariable) var trace vdelete var wu $data(listVarTraceCmd) set var {} @@ -1314,7 +1267,8 @@ proc tablelist::displayIndent {win key col width} { # Create a label widget and replace the binding tag Label with # $data(bodyTag) and TablelistBody in the list of its binding tags # - tk::label $w -anchor w -borderwidth 0 -height 0 -highlightthickness 0 \ + tk::label $w -anchor w -background $data(-background) -borderwidth 0 \ + -height 0 -highlightthickness 0 \ -image $data($key,$col-indent) -padx 0 -pady 0 \ -relief flat -takefocus 0 -width $width bindtags $w [lreplace [bindtags $w] 1 1 $data(bodyTag) TablelistBody] @@ -1341,13 +1295,14 @@ proc tablelist::displayImage {win key col anchor width} { if {![winfo exists $w]} { # - # Create a label widget and replace the binding tag - # Label with either $data(bodyTag) and TablelistBody - # or data(headerTag) in the list of its binding tags + # Create a label widget and replace the binding tag Label + # with either $data(bodyTag) and TablelistBody or data(headerTag) + # and TablelistHeader in the list of its binding tags # - tk::label $w -anchor $anchor -borderwidth 0 -height 0 \ - -highlightthickness 0 -image $data($key,$col-image) \ - -padx 0 -pady 0 -relief flat -takefocus 0 -width $width + tk::label $w -anchor $anchor -background $data(-background) \ + -borderwidth 0 -height 0 -highlightthickness 0 \ + -image $data($key,$col-image) -padx 0 -pady 0 \ + -relief flat -takefocus 0 -width $width if {$inBody} { bindtags $w [lreplace [bindtags $w] 1 1 $data(bodyTag) \ TablelistBody] @@ -1382,12 +1337,13 @@ proc tablelist::displayText {win key col text font pixels alignment} { if {![winfo exists $w]} { # - # Create a message widget and replace the binding tag - # Message with either $data(bodyTag) and TablelistBody - # or data(headerTag) in the list of its binding tags + # Create a message widget and replace the binding tag Message + # with either $data(bodyTag) and TablelistBody or data(headerTag) + # and TablelistHeader in the list of its binding tags # - message $w -borderwidth 0 -highlightthickness 0 -padx 0 -pady 0 \ - -relief flat -takefocus 0 + message $w -background $data(-background) -borderwidth 0 \ + -highlightthickness 0 -padx 0 -pady 0 -relief flat \ + -takefocus 0 if {$inBody} { bindtags $w [lreplace [bindtags $w] 1 1 $data(bodyTag) \ TablelistBody] @@ -1759,11 +1715,6 @@ proc tablelist::insertMlElem {w index msgScript aux auxType alignment #------------------------------------------------------------------------------ proc tablelist::updateCell {w index1 index2 text aux auxType auxWidth indent indentWidth alignment valignment} { - set tagNames [$w tag names $index2] - if {[lsearch -exact $tagNames select] >= 0} { ;# selected - $w tag add select $index1 $index2 - } - variable pu if {$indentWidth != 0} { if {[insertOrUpdateIndent $w $index1 $indent $indentWidth]} { @@ -1901,11 +1852,6 @@ proc tablelist::updateCell {w index1 index2 text aux auxType auxWidth #------------------------------------------------------------------------------ proc tablelist::updateMlCell {w index1 index2 msgScript aux auxType auxWidth indent indentWidth alignment valignment} { - set tagNames [$w tag names $index2] - if {[lsearch -exact $tagNames select] >= 0} { ;# selected - $w tag add select $index1 $index2 - } - variable pu if {$indentWidth != 0} { if {[insertOrUpdateIndent $w $index1 $indent $indentWidth]} { @@ -2508,8 +2454,8 @@ proc tablelist::setupColumns {win columns createLabels} { set data(hasFmtCmds) [expr {[lsearch -exact $data(fmtCmdFlagList) 1] >= 0}] # - # Clean up the images, data, and attributes - # associated with the deleted columns + # Clean up the images, data, attributes, and selection + # states associated with the deleted columns # set imgNames [image names] for {set col $data(colCount)} {$col < $oldColCount} {incr col} { @@ -2523,6 +2469,7 @@ proc tablelist::setupColumns {win columns createLabels} { deleteColData $win $col deleteColAttribs $win $col + deleteColSelStates $win $col } # @@ -2980,6 +2927,14 @@ proc tablelist::adjustColumns {win whichWidths stretchCols} { updateScrlColOffsetWhenIdle $win } updateHScrlbarWhenIdle $win + + set cornerFrmWidth [getTitleColsWidth $win] + if {$cornerFrmWidth == 0} { + set cornerFrmWidth 1 + } else { + incr cornerFrmWidth -1 + } + $data(cornerFrm-sw) configure -width $cornerFrmWidth } #------------------------------------------------------------------------------ @@ -3501,9 +3456,7 @@ proc tablelist::adjustHeaderHeight win { place configure $data(hdrTxt) -y 0 place configure $data(hdrFrm) -y 0 - - $data(corner) configure -height $maxLabelHeight - place configure $data(cornerLbl) -y 0 + place configure $data(cornerLbl) -height $maxLabelHeight -y 0 } else { $data(hdrTxtFrm) configure -height 1 if {$data(hdr_itemCount) == 0} { @@ -3517,10 +3470,19 @@ proc tablelist::adjustHeaderHeight win { place configure $data(hdrTxt) -y -1 place configure $data(hdrFrm) -y -1 + place configure $data(cornerLbl) -height 1 -y -1 + } - $data(corner) configure -height 1 - place configure $data(cornerLbl) -y -1 + set cornerFrmHeight $hdrHeight + if {$data(hdr_itemCount) != 0} { + variable usingTile + if {$usingTile && [string compare [getCurrentTheme] "aqua"] == 0} { + incr cornerFrmHeight -1 + } else { + incr cornerFrmHeight -2 + } } + $data(cornerFrm-ne) configure -height $cornerFrmHeight adjustSepsWhenIdle $win } @@ -3557,7 +3519,7 @@ proc tablelist::stretchColumns {win colOfFixedDelta} { set forceAdjust $data(forceAdjust) set data(forceAdjust) 0 - if {$data(hdrWidth) == 0 || $data(-width) <= 0} { + if {$data(hdrWidth) == 0} { return "" } @@ -3752,6 +3714,8 @@ proc tablelist::updateColors {win {fromTextIdx ""} {toTextIdx ""}} { set fromTextIdx "$topTextIdx linestart" set toTextIdx "$btmTextIdx lineend" + $w tag remove select $fromTextIdx $toTextIdx + if {$data(isDisabled)} { $w tag add disabled $fromTextIdx $toTextIdx } @@ -3811,7 +3775,10 @@ proc tablelist::updateColors {win {fromTextIdx ""} {toTextIdx ""}} { } } - set selected [expr {[lsearch -exact $cellTagNames select] >= 0}] + set selected [cellSelection $win includes $row $col $row $col] + if {$selected} { + $w tag add select $tabIdx1 $textIdx2 + } foreach optTail {background foreground} { set normalOpt -$optTail set selectOpt -select$optTail @@ -4643,7 +4610,7 @@ proc tablelist::redisplayWhenIdle win { # # Redisplays the items of the tablelist widget win. #------------------------------------------------------------------------------ -proc tablelist::redisplay {win {getSelCells 1} {selCells {}}} { +proc tablelist::redisplay win { upvar ::tablelist::ns${win}::data data if {[info exists data(redispId)]} { after cancel $data(redispId) @@ -4730,13 +4697,6 @@ proc tablelist::redisplay {win {getSelCells 1} {selCells {}}} { set data(hdr_itemList) $hdr_newItemList - # - # Save the indices of the selected cells - # - if {$getSelCells} { - set selCells [curCellSelection $win] - } - # # Save some data of the edit window if present # @@ -4751,6 +4711,7 @@ proc tablelist::redisplay {win {getSelCells 1} {selCells {}}} { set isSimple [expr {$data(imgCount) == 0 && $data(winCount) == 0 && $data(indentCount) == 0}] set w $data(body) + displayItems $win set padY [expr {[$w cget -spacing1] == 0}] set newItemList {} set row 0 @@ -4850,8 +4811,8 @@ proc tablelist::redisplay {win {getSelCells 1} {selCells {}}} { if {$multiline} { lappend insertArgs "\t\t" $cellTags - lappend multilineData $col $text $cellFont $pixels \ - $alignment + lappend multilineData \ + $col $text $cellFont $pixels $alignment } elseif {$data(-displayondemand)} { lappend insertArgs "\t\t" $cellTags } else { @@ -4954,16 +4915,6 @@ proc tablelist::redisplay {win {getSelCells 1} {selCells {}}} { set data(itemList) $newItemList - # - # Select the cells that were selected before - # - foreach cellIdx $selCells { - scan $cellIdx "%d,%d" row col - if {$col < $data(colCount)} { - cellSelection $win set $row $col $row $col - } - } - # # Conditionally move the "active" tag to the active line or cell # @@ -4994,7 +4945,7 @@ proc tablelist::redisplay {win {getSelCells 1} {selCells {}}} { #------------------------------------------------------------------------------ proc tablelist::redisplayVisibleItems win { upvar ::tablelist::ns${win}::data data - if {!$data(-displayondemand) || $data(itemCount) == 0} { + if {$data(itemCount) == 0} { return "" } @@ -5003,13 +4954,8 @@ proc tablelist::redisplayVisibleItems win { return "" } - variable canElide - variable elide - variable snipSides - variable pu - - displayItems $win set w $data(body) + displayItems $win set topTextIdx [$w index @0,0] set btmTextIdx [$w index @0,$data(btmY)] @@ -5017,6 +4963,15 @@ proc tablelist::redisplayVisibleItems win { set toTextIdx "$btmTextIdx lineend" $w tag remove elidedWin $fromTextIdx $toTextIdx + if {!$data(-displayondemand)} { + return "" + } + + variable canElide + variable elide + variable snipSides + variable pu + set rightCol [colIndex $win @$data(rightX),0 0 0] set topLine [expr {int($topTextIdx)}] set btmLine [expr {int($btmTextIdx)}] @@ -5157,7 +5112,7 @@ proc tablelist::redisplayColWhenIdle {win col} { # the range specified by first and last. Prior to that, it redisplays the # elements of the specified column in the header text widget. #------------------------------------------------------------------------------ -proc tablelist::redisplayCol {win col first last} { +proc tablelist::redisplayCol {win col first last {inBody 1}} { upvar ::tablelist::ns${win}::data data set allRows [expr {$first == 0 && [string compare $last "last"] == 0}] if {$allRows && [info exists data($col-redispId)]} { @@ -5165,11 +5120,10 @@ proc tablelist::redisplayCol {win col first last} { unset data($col-redispId) } - if {$col > $data(lastCol) || $data($col-hide)} { + if {$col > $data(lastCol) || $data($col-hide) || $first < 0} { return "" } - displayItems $win set fmtCmdFlag [lindex $data(fmtCmdFlagList) $col] set colFont [lindex $data(colFontList) $col] set snipStr $data(-snipstring) @@ -5190,9 +5144,17 @@ proc tablelist::redisplayCol {win col first last} { set snipSide $snipSides($alignment,$data($col-changesnipside)) variable pu + if {$inBody} { + set hdr_first 0 + set hdr_last $data(hdr_lastRow) + } else { + set hdr_first $first + set hdr_last $last + } + set w $data(hdrTxt) - for {set row 0; set line 2} {$row < $data(hdr_itemCount)} \ - {incr row; incr line} { + for {set row $hdr_first; set line [expr {$hdr_first + 2}]} \ + {$row <= $hdr_last} {incr row; incr line} { set item [lindex $data(hdr_itemList) $row] set key [lindex $item end] @@ -5273,14 +5235,16 @@ proc tablelist::redisplayCol {win col first last} { } } - if {$first < 0} { + if {!$inBody} { return "" } + if {[string compare $last "last"] == 0} { set last $data(lastRow) } set w $data(body) + displayItems $win for {set row $first; set line [expr {$first + 1}]} {$row <= $last} \ {set row $line; incr line} { if {$row == $data(editRow) && $col == $data(editCol)} { @@ -5616,6 +5580,12 @@ proc tablelist::synchronize win { unset data(syncId) upvar #0 $data(-listvariable) var + if {[catch {foreach item $var {llength $item}}] != 0} { + condUpdateListVar $win + return -code error "value of variable \"$data(-listvariable)\" is not\ + a list of lists" + } + set newCount [llength $var] if {$newCount < $data(itemCount)} { # @@ -6185,22 +6155,36 @@ proc tablelist::getScrlContentWidth {win scrlColOffset lastCol} { } #------------------------------------------------------------------------------ -# tablelist::getScrlWindowWidth +# tablelist::getTitleColsWidth # -# Returns the number of pixels obtained by subtracting the widths of the non- -# hidden title columns from the width of the header frame of the tablelist +# Returns the total width of the non-hidden title columns of the tablelist # widget win. #------------------------------------------------------------------------------ -proc tablelist::getScrlWindowWidth win { +proc tablelist::getTitleColsWidth win { upvar ::tablelist::ns${win}::data data - set scrlWindowWidth [winfo width $data(hdr)] + set titleColsWidth 0 for {set col 0} {$col < $data(-titlecolumns) && $col < $data(colCount)} \ {incr col} { if {!$data($col-hide)} { - incr scrlWindowWidth -[colWidth $win $col -total] + incr titleColsWidth [colWidth $win $col -total] } } + return $titleColsWidth +} + +#------------------------------------------------------------------------------ +# tablelist::getScrlWindowWidth +# +# Returns the number of pixels obtained by subtracting the total width of the +# non-hidden title columns from the width of the header frame of the tablelist +# widget win. +#------------------------------------------------------------------------------ +proc tablelist::getScrlWindowWidth win { + upvar ::tablelist::ns${win}::data data + set scrlWindowWidth [winfo width $data(hdr)] + incr scrlWindowWidth -[getTitleColsWidth $win] + return $scrlWindowWidth } diff --git a/modules/tablelist/scripts/tablelistWidget.tcl b/modules/tablelist/scripts/tablelistWidget.tcl index e5bf41db..3f181f1c 100644 --- a/modules/tablelist/scripts/tablelistWidget.tcl +++ b/modules/tablelist/scripts/tablelistWidget.tcl @@ -162,6 +162,7 @@ namespace eval tablelist { -setfocus {setFocus SetFocus w} -setgrid {setGrid SetGrid w} -showarrow {showArrow ShowArrow w} + -showbusycursor {showBusyCursor ShowBusyCursor w} -showeditcursor {showEditCursor ShowEditCursor w} -showhorizseparator {showHorizSeparator ShowHorizSeparator w} -showlabels {showLabels ShowLabels w} @@ -311,9 +312,18 @@ namespace eval tablelist { if {$::tk_version >= 8.3} { set canElide 1 set elide -elide + + interp alias {} ::tablelist::arrayUnset {} array unset } else { set canElide 0 set elide -- + + proc arrayUnset {arrName pattern} { + upvar $arrName arr + foreach name [array names arr $pattern] { + unset arr($name) + } + } } # @@ -440,13 +450,14 @@ namespace eval tablelist { insertlist iselemsnipped isexpanded istitlesnipped isviewable \ itemlistvar itemtodict labelpath labels labeltag move movecolumn \ nearest nearestcell nearestcolumn noderow parentkey refreshsorting \ - rejectinput resetsortinfo rowattrib rowcget rowconfigure scan \ - searchcolumn see seecell seecolumn selection separatorpath separators \ - showtargetmark size sort sortbycolumn sortbycolumnlist sortcolumn \ - sortcolumnlist sortorder sortorderlist targetmarkpath targetmarkpos \ - togglecolumnhide togglerowhide toplevelkey unsetattrib \ - unsetcellattrib unsetcolumnattrib unsetrowattrib viewablerowcount \ - windowpath xview yview] + rejectinput resetsortinfo restorecursor rowattrib rowcget \ + rowconfigure scan searchcolumn see seecell seecolumn selection \ + separatorpath separators setbusycursor showtargetmark size sort \ + sortbycolumn sortbycolumnlist sortcolumn sortcolumnlist sortorder \ + sortorderlist targetmarkpath targetmarkpos togglecolumnhide \ + togglerowhide toplevelkey unsetattrib unsetcellattrib \ + unsetcolumnattrib unsetrowattrib viewablerowcount windowpath xview \ + yview] proc restrictCmdOpts {} { variable canElide @@ -491,6 +502,7 @@ namespace eval tablelist { sunken12x11] variable arrowTypes [list up down] variable colWidthOpts [list -requested -stretched -total] + variable cornerOpts [list -ne -sw] variable curSelOpts [list -all -nonhidden -viewable] variable expCollOpts [list -fully -partly] variable findOpts [list -descend -parent] @@ -713,7 +725,9 @@ proc tablelist::tablelist args { variable usingTile variable configSpecs variable configOpts + variable cornerOpts variable canElide + variable helpLabel if {[llength $args] == 0} { mwutil::wrongNumArgs "tablelist pathName ?options?" @@ -744,8 +758,8 @@ proc tablelist::tablelist args { # variable data array set data { - arrowWidth 10 - arrowHeight 9 + arrowWidth 8 + arrowHeight 4 hasListVar 0 isDisabled 0 ownsFocus 0 @@ -818,6 +832,12 @@ proc tablelist::tablelist args { # variable attribs + # + # The following array is used to hold the + # selection state of the rows and cells + # + variable selStates + # # The following array is used to hold the selection # state of embedded checkbutton windows created via @@ -877,13 +897,16 @@ proc tablelist::tablelist args { set data(hsep) $win.hsep # - # Get a unique name for the corner frame (a sibling of the tablelist widget) + # Get unique names for the north-east and south-west corner + # frames (which will be siblings of the tablelist widget) # - set data(corner) $win-corner - for {set n 2} {[winfo exists $data(corner)]} {incr n} { - set data(corner) $data(corner)$n + foreach opt $cornerOpts { + set data(cornerFrm$opt) ${win}_cf$opt + for {set n 2} {[winfo exists $data(cornerFrm$opt)]} {incr n} { + set data(cornerFrm$opt) ${win}_cf$opt$n + } } - set data(cornerLbl) $data(corner).l + set data(cornerLbl) $data(cornerFrm-ne).l # # Create a child hierarchy used to hold the column labels. The @@ -893,14 +916,14 @@ proc tablelist::tablelist args { # (whose width and height can be set arbitrarily in pixels). # - set w $data(hdr) ;# header frame + set w $data(hdr) ;# header frame tk::frame $w -borderwidth 0 -container 0 -height 0 -highlightthickness 0 \ -relief flat -takefocus 0 -width 0 catch {$w configure -padx 0 -pady 0} bind $w { tablelist::hdrConfigure %W %w } pack $w -fill x - set w $data(hdrTxt) ;# text widget within the header frame + set w $data(hdrTxt) ;# text widget within the header frame text $w -borderwidth 0 -highlightthickness 0 -insertwidth 0 \ -padx 0 -pady 0 -state normal -takefocus 0 -wrap none catch {$w configure -undo 0}; # because of a text widget issue in Tk 8.6.6 @@ -920,13 +943,13 @@ proc tablelist::tablelist args { $w tag configure hiddenCol -elide 1 ;# used for hiding a column $w tag configure elidedCol -elide 1 ;# used for horizontal scrolling - set w $data(hdrFrm) ;# filler frame within the header frame + set w $data(hdrFrm) ;# filler frame within the header frame tk::frame $w -borderwidth 0 -container 0 -height 0 -highlightthickness 0 \ -relief flat -takefocus 0 -width 0 catch {$w configure -padx 0 -pady 0} place $w -relwidth 1.0 - set w $data(hdrFrmLbl) ;# label within the filler frame + set w $data(hdrFrmLbl) ;# label within the filler frame set x 0 if {$usingTile} { ttk::label $w -style TablelistHeader.TLabel -image "" \ @@ -942,12 +965,12 @@ proc tablelist::tablelist args { } place $w -x $x -relheight 1.0 -relwidth 1.0 - set w $data(corner) ;# corner frame (outside the tablelist) + set w $data(cornerFrm-ne) ;# north-east corner frame tk::frame $w -borderwidth 0 -container 0 -height 0 -highlightthickness 0 \ -relief flat -takefocus 0 -width 0 catch {$w configure -padx 0 -pady 0} - set w $data(cornerLbl) ;# label within the corner frame + set w $data(cornerLbl) ;# label within the north-east corner frame if {$usingTile} { ttk::label $w -style TablelistHeader.TLabel -image "" \ -padding {1 1 1 1} -takefocus 0 -text "" \ @@ -957,7 +980,17 @@ proc tablelist::tablelist args { -takefocus 0 -text "" -textvariable "" -underline -1 \ -wraplength 0 } - place $w -relheight 1.0 -relwidth 1.0 + place $w -relwidth 1.0 + + set w $data(cornerFrm-sw) ;# south-west corner frame + if {$usingTile} { + ttk::frame $w -borderwidth 0 -height 0 -padding 0 -relief flat \ + -takefocus 0 -width 0 + } else { + tk::frame $w -borderwidth 0 -container 0 -height 0 \ + -highlightthickness 0 -relief flat -takefocus 0 -width 0 + catch {$w configure -padx 0 -pady 0} + } if {$::tk_version >= 8.5} { # @@ -1033,7 +1066,6 @@ proc tablelist::tablelist args { # Take into account that some scripts start by # destroying all children of the root window # - variable helpLabel if {![winfo exists $helpLabel]} { if {$usingTile} { ttk::label $helpLabel -takefocus 0 @@ -1321,7 +1353,6 @@ proc tablelist::cellconfigureSubCmd {win argList} { } synchronize $win - displayItems $win variable cellConfigSpecs foreach {row col} [cellIndex $win [lindex $argList 0] 1] {} return [mwutil::configureSubCmd $win cellConfigSpecs \ @@ -1353,7 +1384,6 @@ proc tablelist::cellselectionSubCmd {win argList} { } synchronize $win - displayItems $win variable selectionOpts set opt [mwutil::fullOpt "option" [lindex $argList 0] $selectionOpts] set first [lindex $argList 1] @@ -1689,7 +1719,6 @@ proc tablelist::columnconfigureSubCmd {win argList} { } synchronize $win - displayItems $win variable colConfigSpecs set col [colIndex $win [lindex $argList 0] 1] return [mwutil::configureSubCmd $win colConfigSpecs \ @@ -1731,6 +1760,7 @@ proc tablelist::columnwidthSubCmd {win argList} { } synchronize $win + displayItems $win set col [colIndex $win [lindex $argList 0] 1] if {$argCount == 1} { set opt -requested @@ -1757,7 +1787,6 @@ proc tablelist::configcelllistSubCmd {win argList} { #------------------------------------------------------------------------------ proc tablelist::configcellsSubCmd {win argList} { synchronize $win - displayItems $win variable cellConfigSpecs set argCount [llength $argList] @@ -1793,7 +1822,6 @@ proc tablelist::configcolumnlistSubCmd {win argList} { #------------------------------------------------------------------------------ proc tablelist::configcolumnsSubCmd {win argList} { synchronize $win - displayItems $win variable colConfigSpecs set argCount [llength $argList] @@ -1829,7 +1857,6 @@ proc tablelist::configrowlistSubCmd {win argList} { #------------------------------------------------------------------------------ proc tablelist::configrowsSubCmd {win argList} { synchronize $win - displayItems $win variable rowConfigSpecs set argCount [llength $argList] @@ -1917,12 +1944,20 @@ proc tablelist::cornerlabelpathSubCmd {win argList} { # tablelist::cornerpathSubCmd #------------------------------------------------------------------------------ proc tablelist::cornerpathSubCmd {win argList} { - if {[llength $argList] != 0} { - mwutil::wrongNumArgs "$win cornerpath" + set argCount [llength $argList] + if {$argCount > 1} { + mwutil::wrongNumArgs "$win cornerpath ?-ne|-sw?" + } + + if {$argCount == 0} { + set opt "-ne" + } else { + variable cornerOpts + set opt [mwutil::fullOpt "option" [lindex $argList 0] $cornerOpts] } upvar ::tablelist::ns${win}::data data - return $data(corner) + return $data(cornerFrm$opt) } #------------------------------------------------------------------------------ @@ -1932,7 +1967,7 @@ proc tablelist::curcellselectionSubCmd {win argList} { set argCount [llength $argList] if {$argCount > 1} { mwutil::wrongNumArgs \ - "$win curcellselection ?-all|-nonhidden||-viewable?" + "$win curcellselection ?-all|-nonhidden|-viewable?" } if {$argCount == 0} { @@ -1945,8 +1980,7 @@ proc tablelist::curcellselectionSubCmd {win argList} { synchronize $win - displayItems $win - return [curCellSelection $win 0 $constraint] + return [curCellSelection $win $constraint] } #------------------------------------------------------------------------------ @@ -1968,7 +2002,6 @@ proc tablelist::curselectionSubCmd {win argList} { } synchronize $win - displayItems $win return [curSelection $win $constraint] } @@ -2056,9 +2089,8 @@ proc tablelist::deletecolumnsSubCmd {win argList} { if {$argCount == 1} { if {[llength $first] == 1} { ;# just to save time set col [colIndex $win [lindex $first 0] 1] - set selCells [curCellSelection $win] - deleteCols $win $col $col selCells - redisplay $win 0 $selCells + deleteCols $win $col $col + redisplay $win } elseif {$data(colCount) == 0} { ;# no columns present return "" } else { ;# a bit more work @@ -2075,27 +2107,25 @@ proc tablelist::deletecolumnsSubCmd {win argList} { # # Traverse the sorted column index list and ignore any duplicates # - set selCells [curCellSelection $win] set deleted 0 set prevCol -1 foreach col $colList { if {$col != $prevCol} { - deleteCols $win $col $col selCells + deleteCols $win $col $col set deleted 1 set prevCol $col } } if {$deleted} { - redisplay $win 0 $selCells + redisplay $win } } } else { set first [colIndex $win $first 1] set last [colIndex $win [lindex $argList 1] 1] if {$first <= $last} { - set selCells [curCellSelection $win] - deleteCols $win $first $last selCells - redisplay $win 0 $selCells + deleteCols $win $first $last + redisplay $win } } @@ -2221,7 +2251,6 @@ proc tablelist::embedcheckbuttonSubCmd {win argList} { } synchronize $win - displayItems $win foreach {row col} [cellIndex $win [lindex $argList 0] 1] {} if {$argCount == 1} { @@ -2245,7 +2274,6 @@ proc tablelist::embedcheckbuttonsSubCmd {win argList} { } synchronize $win - displayItems $win set col [colIndex $win [lindex $argList 0] 1] if {$argCount == 1} { @@ -2273,7 +2301,6 @@ proc tablelist::embedttkcheckbuttonSubCmd {win argList} { } synchronize $win - displayItems $win foreach {row col} [cellIndex $win [lindex $argList 0] 1] {} if {$argCount == 1} { @@ -2297,7 +2324,6 @@ proc tablelist::embedttkcheckbuttonsSubCmd {win argList} { } synchronize $win - displayItems $win set col [colIndex $win [lindex $argList 0] 1] if {$argCount == 1} { @@ -2545,7 +2571,6 @@ proc tablelist::fillcolumnSubCmd {win argList} { } synchronize $win - displayItems $win set col [colIndex $win [lindex $argList 0] 1] set text [lindex $argList 1] @@ -4829,8 +4854,6 @@ proc tablelist::nearestSubCmd {win argList} { } set y [format "%d" [lindex $argList 0]] - synchronize $win - displayItems $win return [rowIndex $win @0,$y 0] } @@ -4844,8 +4867,6 @@ proc tablelist::nearestcellSubCmd {win argList} { set x [format "%d" [lindex $argList 0]] set y [format "%d" [lindex $argList 1]] - synchronize $win - displayItems $win return [join [cellIndex $win @$x,$y 0] ","] } @@ -4954,13 +4975,30 @@ proc tablelist::resetsortinfoSubCmd {win argList} { if {[llength $whichWidths] > 0} { synchronize $win - displayItems $win adjustColumns $win $whichWidths 1 } return "" } +#------------------------------------------------------------------------------ +# tablelist::restorecursorSubCmd +#------------------------------------------------------------------------------ +proc tablelist::restorecursorSubCmd {win argList} { + if {[llength $argList] != 0} { + mwutil::wrongNumArgs "$win restorecursor" + } + + upvar ::tablelist::ns${win}::data data + if {[info exists data(origCursor)]} { + doConfig $win -cursor $data(origCursor) + unset data(origCursor) + return 1 + } else { + return 0 + } +} + #------------------------------------------------------------------------------ # tablelist::rowattribSubCmd #------------------------------------------------------------------------------ @@ -5002,7 +5040,6 @@ proc tablelist::rowconfigureSubCmd {win argList} { } synchronize $win - displayItems $win variable rowConfigSpecs set row [rowIndex $win [lindex $argList 0] 0 1] return [mwutil::configureSubCmd $win rowConfigSpecs \ @@ -5046,14 +5083,14 @@ proc tablelist::searchcolumnSubCmd {win argList} { set mode -glob ;# possible values: -exact, -glob, -regexp set checkCmd "" set parentKey root - set allMatches 0 ;# boolean - set backwards 0 ;# boolean - set descend 0 ;# boolean - set formatted 0 ;# boolean - set noCase 0 ;# boolean - set negated 0 ;# boolean - set numeric 0 ;# boolean - set gotStartRow 0 ;# boolean + set allMatches 0 ;# boolean + set backwards 0 ;# boolean + set descend 0 ;# boolean + set formatted 0 ;# boolean + set noCase 0 ;# boolean + set negated 0 ;# boolean + set numeric 0 ;# boolean + set gotStartRow 0 ;# boolean # # Parse the argument list @@ -5301,7 +5338,6 @@ proc tablelist::selectionSubCmd {win argList} { } synchronize $win - displayItems $win variable selectionOpts set opt [mwutil::fullOpt "option" [lindex $argList 0] $selectionOpts] set first [lindex $argList 1] @@ -5379,6 +5415,37 @@ proc tablelist::separatorsSubCmd {win argList} { return [lsort -dictionary $sepList] } +#------------------------------------------------------------------------------ +# tablelist::setbusycursorSubCmd +#------------------------------------------------------------------------------ +proc tablelist::setbusycursorSubCmd {win argList} { + if {[llength $argList] != 0} { + mwutil::wrongNumArgs "$win setbusycursor" + } + + upvar ::tablelist::ns${win}::data data + set data(origCursor) $data(-cursor) + + variable winSys + switch $winSys { + x11 - + classic { set busyCursor watch } + win32 { set busyCursor wait } + aqua { + variable helpLabel + if {[catch {$helpLabel configure -cursor wait}] == 0} { + set busyCursor wait + } else { + set busyCursor watch + } + } + } + + doConfig $win -cursor $busyCursor + update idletasks + return [expr {![destroyed $win]}] +} + #------------------------------------------------------------------------------ # tablelist::showtargetmarkSubCmd #------------------------------------------------------------------------------ @@ -5387,6 +5454,8 @@ proc tablelist::showtargetmarkSubCmd {win argList} { mwutil::wrongNumArgs "$win showtargetmark before|inside index" } + synchronize $win + displayItems $win variable targetOpts set opt [mwutil::fullOpt "option" [lindex $argList 0] $targetOpts] set index [lindex $argList 1] @@ -5696,16 +5765,11 @@ proc tablelist::togglecolumnhideSubCmd {win argList} { } synchronize $win - displayItems $win set first [lindex $argList 0] # # Toggle the value of the -hide option of the specified columns # - variable canElide - if {!$canElide} { - set selCells [curCellSelection $win] - } upvar ::tablelist::ns${win}::data data set colIdxList {} if {$argCount == 1} { @@ -5751,13 +5815,9 @@ proc tablelist::togglecolumnhideSubCmd {win argList} { adjustColumns $win $colIdxList 1 adjustColIndex $win data(anchorCol) 1 adjustColIndex $win data(activeCol) 1 + variable canElide if {!$canElide} { - redisplay $win 0 $selCells - } - if {[string compare $data(-selecttype) "row"] == 0} { - foreach row [curSelection $win] { - rowSelection $win set $row $row - } + redisplay $win } updateViewWhenIdle $win @@ -5777,7 +5837,6 @@ proc tablelist::togglerowhideSubCmd {win argList} { } synchronize $win - displayItems $win set first [lindex $argList 0] # @@ -6215,7 +6274,8 @@ proc tablelist::yviewSubCmd {win argList} { # Processes the tablelist cellselection subcommand. #------------------------------------------------------------------------------ proc tablelist::cellSelection {win opt firstRow firstCol lastRow lastCol} { - upvar ::tablelist::ns${win}::data data + upvar ::tablelist::ns${win}::data data \ + ::tablelist::ns${win}::selStates selStates if {$data(isDisabled) && [string compare $opt "includes"] != 0} { return "" } @@ -6235,13 +6295,14 @@ proc tablelist::cellSelection {win opt firstRow firstCol lastRow lastCol} { } clear { + if {$data(itemCount) == 0 || $data(colCount) == 0} { + return "" + } + # # Adjust the row and column indices # to fit within the existing elements # - if {$data(itemCount) == 0 || $data(colCount) == 0} { - return "" - } adjustRowIndex $win firstRow adjustColIndex $win firstCol adjustRowIndex $win lastRow @@ -6261,42 +6322,28 @@ proc tablelist::cellSelection {win opt firstRow firstCol lastRow lastCol} { set lastCol $tmp } - set fromTextIdx [expr {$firstRow + 1}].0 - set toTextIdx [expr {$lastRow + 1}].end - - # - # Find the (partly) selected lines of the body text widget - # in the text range specified by the two cell indices - # - set w $data(body) - variable canElide - variable elide - variable pu - set selRange [$w tag nextrange select $fromTextIdx $toTextIdx] - while {[llength $selRange] != 0} { - set selStart [lindex $selRange 0] - set line [expr {int($selStart)}] - set row [expr {$line - 1}] - set key [lindex $data(keyList) $row] + if {$firstRow == 0 && $firstCol == 0 && + $lastRow == $data(lastRow) && $lastCol == $data(lastCol)} { + arrayUnset selStates * ;# this works much faster + } else { + for {set row $firstRow} {$row <= $lastRow} {incr row} { + set key [lindex $data(keyList) $row] - # - # Deselect the relevant elements of the row - # - findTabs $win $w $line $firstCol $lastCol firstTabIdx lastTabIdx - set textIdx1 $firstTabIdx - for {set col $firstCol} {$col <= $lastCol} {incr col} { - if {$data($col-hide) && !$canElide} { - continue + for {set col $firstCol} {$col <= $lastCol} {incr col} { + arrayUnset selStates $key,$col } - set textIdx2 [$w search $elide "\t" $textIdx1+1$pu \ - $lastTabIdx+1$pu]+1$pu - $w tag remove select $textIdx1 $textIdx2 - set textIdx1 $textIdx2 + if {[info exists selStates($key)]} { + unset selStates($key) + for {set col 0} {$col < $firstCol} {incr col} { + set selStates($key,$col) 1 + } + for {set col [expr {$lastCol + 1}]} \ + {$col < $data(colCount)} {incr col} { + set selStates($key,$col) 1 + } + } } - - set selRange \ - [$w tag nextrange select "$selStart lineend" $toTextIdx] } updateColorsWhenIdle $win @@ -6304,30 +6351,21 @@ proc tablelist::cellSelection {win opt firstRow firstCol lastRow lastCol} { } includes { - variable canElide - if {$firstRow < 0 || $firstRow > $data(lastRow) || \ - $firstCol < 0 || $firstCol > $data(lastCol) || - ($data($firstCol-hide) && !$canElide)} { - return 0 - } - - findTabs $win $data(body) [expr {$firstRow + 1}] \ - $firstCol $firstCol tabIdx1 tabIdx2 - if {[lsearch -exact [$data(body) tag names $tabIdx2] select] < 0} { - return 0 - } else { - return 1 - } + set key [lindex $data(keyList) $firstRow] + return [expr {[info exists selStates($key)] && + $firstCol >= 0 && $firstCol < $data(colCount) || + [info exists selStates($key,$firstCol)]}] } set { + if {$data(itemCount) == 0 || $data(colCount) == 0} { + return "" + } + # # Adjust the row and column indices # to fit within the existing elements # - if {$data(itemCount) == 0 || $data(colCount) == 0} { - return "" - } adjustRowIndex $win firstRow adjustColIndex $win firstCol adjustRowIndex $win lastRow @@ -6347,34 +6385,23 @@ proc tablelist::cellSelection {win opt firstRow firstCol lastRow lastCol} { set lastCol $tmp } - set w $data(body) - variable canElide - variable elide - variable pu - for {set row $firstRow; set line [expr {$firstRow + 1}]} \ - {$row <= $lastRow} {set row $line; incr line} { + set wholeRows [expr {$firstCol == 0 && $lastCol == $data(lastCol)}] + for {set row $firstRow} {$row <= $lastRow} {incr row} { # - # Check whether the row is selectable + # Nothing to do if the row is selected or is not selectable # set key [lindex $data(keyList) $row] - if {[info exists data($key-selectable)]} { + if {[info exists selStates($key)] || + [info exists data($key-selectable)]} { ;# not selectable continue } - # - # Select the relevant elements of the row - # - findTabs $win $w $line $firstCol $lastCol firstTabIdx lastTabIdx - set textIdx1 $firstTabIdx - for {set col $firstCol} {$col <= $lastCol} {incr col} { - if {$data($col-hide) && !$canElide} { - continue + if {$wholeRows} { + set selStates($key) 1 + } else { + for {set col $firstCol} {$col <= $lastCol} {incr col} { + set selStates($key,$col) 1 } - - set textIdx2 [$w search $elide "\t" $textIdx1+1$pu \ - $lastTabIdx+1$pu]+1$pu - $w tag add select $textIdx1 $textIdx2 - set textIdx1 $textIdx2 } } @@ -6384,8 +6411,7 @@ proc tablelist::cellSelection {win opt firstRow firstCol lastRow lastCol} { # PRIMARY selection and register a callback to be invoked # when it loses ownership of the PRIMARY selection # - if {$data(-exportselection) && - [llength [$w tag nextrange select 1.0]] != 0} { + if {$data(-exportselection) && [array size selStates] != 0} { selection own -command \ [list ::tablelist::lostSelection $win] $win } @@ -6520,79 +6546,68 @@ proc tablelist::containingCol {win x} { #------------------------------------------------------------------------------ # tablelist::curCellSelection # -# Processes the tablelist curcellselection subcommand. Meaning of the last -# optional argument: 0: all; 1: nonhidden only; 2: viewable only. +# Processes the tablelist curcellselection subcommand. Meaning of the optional +# argument: 0: all; 1: nonhidden only; 2: viewable only. #------------------------------------------------------------------------------ -proc tablelist::curCellSelection {win {getKeys 0} {constraint 0}} { - variable canElide - variable elide - variable pu - upvar ::tablelist::ns${win}::data data - - # - # Find the (partly) selected lines of the body text widget - # - set result {} - set w $data(body) - for {set selRange [$w tag nextrange select 1.0]} \ - {[llength $selRange] != 0} \ - {set selRange [$w tag nextrange select $selEnd]} { - foreach {selStart selEnd} $selRange {} - set line [expr {int($selStart)}] - set row [expr {$line - 1}] - if {$getKeys || $constraint != 0} { - set key [lindex $data(keyList) $row] - } - if {($constraint == 1 && [info exists data($key-hide)]) || - ($constraint == 2 && ([info exists data($key-hide)] || - [info exists data($key-elide)]))} { - continue - } - - # - # Get the index of the column containing the text position selStart - # - set tabIdx1 $line.0 - for {set col 0} {$col < $data(colCount)} {incr col} { - if {$data($col-hide) && !$canElide} { - continue - } - - set tabIdx2 [$w search $elide "\t" $tabIdx1+1$pu $selEnd] - if {[$w compare $selStart >= $tabIdx1] && - [$w compare $selStart <= $tabIdx2]} { - set firstCol $col - break +proc tablelist::curCellSelection {win {constraint 0}} { + upvar ::tablelist::ns${win}::data data \ + ::tablelist::ns${win}::selStates selStates + + set pairList {} + if {$constraint == 0} { ;# speed optimization + foreach name [array names selStates] { + set lst [split $name ","] + set key [lindex $lst 0] + set row [keyToRow $win $key] + + if {[llength $lst] == 2} { + set col [lindex $lst 1] + lappend pairList [list $row $col] } else { - set tabIdx1 [$w index $tabIdx2+1$pu] + for {set col 0} {$col < $data(colCount)} {incr col} { + lappend pairList [list $row $col] + } } } - - # - # Process the columns, starting at the found one - # and ending just before the text position selEnd - # - set textIdx $tabIdx2+1$pu - for {set col $firstCol} {$col < $data(colCount)} {incr col} { - if {$data($col-hide) && !$canElide} { + } else { + foreach name [array names selStates] { + set lst [split $name ","] + set key [lindex $lst 0] + if {[info exists data($key-hide)] || + ($constraint == 2 && [info exists data($key-elide)])} { continue } - if {$constraint == 0 || !$data($col-hide)} { - if {$getKeys} { - lappend result $key $col - } else { - lappend result $row,$col + if {[llength $lst] == 2} { + set col [lindex $lst 1] + if {!$data($col-hide)} { + set row [keyToRow $win $key] + lappend pairList [list $row $col] } - } - if {[$w compare $textIdx == $selEnd]} { - break } else { - set textIdx [$w search $elide "\t" $textIdx+1$pu $selEnd]+1$pu + set row [keyToRow $win $key] + for {set col 0} {$col < $data(colCount)} {incr col} { + if {!$data($col-hide)} { + lappend pairList [list $row $col] + } + } } } } + set pairList [lsort -integer -index 1 $pairList] + set pairList [lsort -integer -index 0 $pairList] + + set result {} + set prevCellIdx "" + foreach pair $pairList { + set cellIdx [join $pair ","] + if {[string compare $cellIdx $prevCellIdx] != 0} { + lappend result $cellIdx + set prevCellIdx $cellIdx + } + } + return $result } @@ -6603,28 +6618,40 @@ proc tablelist::curCellSelection {win {getKeys 0} {constraint 0}} { # argument: 0: all; 1: nonhidden only; 2: viewable only. #------------------------------------------------------------------------------ proc tablelist::curSelection {win {constraint 0}} { - # - # Find the (partly) selected lines of the body text widget - # - set result {} - upvar ::tablelist::ns${win}::data data - set w $data(body) - set selRange [$w tag nextrange select 1.0] - while {[llength $selRange] != 0} { - set selStart [lindex $selRange 0] - set row [expr {int($selStart) - 1}] - if {$constraint == 0} { - lappend result $row - } else { - set key [lindex $data(keyList) $row] - if {($constraint == 1 && ![info exists data($key-hide)]) || - ($constraint == 2 && ![info exists data($key-hide)] && - ![info exists data($key-elide)])} { - lappend result $row + upvar ::tablelist::ns${win}::data data \ + ::tablelist::ns${win}::selStates selStates + + if {$data(colCount) == 0} { + return {} + } + + set rowList {} + if {$constraint == 0} { ;# speed optimization + foreach name [array names selStates] { + set key [lindex [split $name ","] 0] + lappend rowList [keyToRow $win $key] + } + } else { + foreach name [array names selStates] { + set key [lindex [split $name ","] 0] + if {[info exists data($key-hide)] || + ($constraint == 2 && [info exists data($key-elide)])} { + continue } + + lappend rowList [keyToRow $win $key] } + } + + set rowList [lsort -integer $rowList] - set selRange [$w tag nextrange select "$selStart lineend"] + set result {} + set prevRow -1 + foreach row $rowList { + if {$row != $prevRow} { + lappend result $row + set prevRow $row + } } return $result @@ -6643,7 +6670,8 @@ proc tablelist::deleteRows {win first last updateListVar} { set first 0 } upvar ::tablelist::ns${win}::data data \ - ::tablelist::ns${win}::attribs attribs + ::tablelist::ns${win}::attribs attribs \ + ::tablelist::ns${win}::selStates selStates if {$last > $data(lastRow)} { set last $data(lastRow) } @@ -6749,19 +6777,17 @@ proc tablelist::deleteRows {win first last updateListVar} { } # - # Unset the elements of data corresponding to the deleted items + # Unset the elements of data, attribs, and + # selStates corresponding to the deleted items # if {$count == $data(itemCount)} { - foreach name [array names data {k[0-9]*}] { - unset data($name) - } + arrayUnset data {k[0-9]*} array set data {rowTagRefCount 0 nonViewableRowCount 0 cellTagRefCount 0 imgCount 0 winCount 0 indentCount 0 root-children {}} - foreach name [array names attribs {k[0-9]*}] { - unset attribs($name) - } + arrayUnset attribs {k[0-9]*} + arrayUnset selStates * } else { for {set row $first} {$row <= $last} {incr row} { set item [lindex $data(itemList) $row] @@ -6770,9 +6796,7 @@ proc tablelist::deleteRows {win first last updateListVar} { foreach opt {-background -foreground -name -selectable -selectbackground -selectforeground} { - if {[info exists data($key$opt)]} { - unset data($key$opt) - } + arrayUnset data $key$opt } if {[info exists data($key-font)]} { @@ -6823,18 +6847,12 @@ proc tablelist::deleteRows {win first last updateListVar} { unset data($key$prop) } - foreach name [array names attribs $key-*] { - unset attribs($name) - } - for {set col 0} {$col < $data(colCount)} {incr col} { foreach opt {-background -foreground -editable -editwindow -imagebackground -selectbackground -selectforeground -valign -windowdestroy -windowupdate} { - if {[info exists data($key,$col$opt)]} { - unset data($key,$col$opt) - } + arrayUnset data $key,$col$opt } if {[info exists data($key,$col-font)]} { @@ -6860,9 +6878,8 @@ proc tablelist::deleteRows {win first last updateListVar} { } } - foreach name [array names attribs $key,*-*] { - unset attribs($name) - } + arrayUnset attribs $key* + arrayUnset selStates $key* } } @@ -6876,7 +6893,7 @@ proc tablelist::deleteRows {win first last updateListVar} { # # Delete the given items from the list variable if needed # - if {$updateListVar} { + if {$updateListVar && [info exists ::$data(-listvariable)]} { upvar #0 $data(-listvariable) var trace vdelete var wu $data(listVarTraceCmd) set var [lreplace $var $first $last] @@ -7041,28 +7058,20 @@ proc tablelist::hdr_deleteRows {win first last} { } # - # Unset the elements of data corresponding to the deleted items + # Unset the elements of data and attribs corresponding to the deleted items # for {set row $first} {$row <= $last} {incr row} { set item [lindex $data(hdr_itemList) $row] set key [lindex $item end] foreach opt {-background -foreground -font -name} { - if {[info exists data($key$opt)]} { - unset data($key$opt) - } - } - - foreach name [array names attribs $key-*] { - unset attribs($name) + arrayUnset data $key$opt } for {set col 0} {$col < $data(colCount)} {incr col} { foreach opt {-background -foreground -font -image -imagebackground -valign -windowdestroy -windowupdate} { - if {[info exists data($key,$col$opt)]} { - unset data($key,$col$opt) - } + arrayUnset data $key,$col$opt } if {[info exists data($key,$col-window)]} { @@ -7072,9 +7081,7 @@ proc tablelist::hdr_deleteRows {win first last} { } } - foreach name [array names attribs $key,*-*] { - unset attribs($name) - } + arrayUnset attribs $key* } # @@ -7101,12 +7108,14 @@ proc tablelist::hdr_deleteRows {win first last} { # # Processes the tablelist deletecolumns subcommand. #------------------------------------------------------------------------------ -proc tablelist::deleteCols {win first last selCellsName} { +proc tablelist::deleteCols {win first last} { upvar ::tablelist::ns${win}::data data \ - ::tablelist::ns${win}::attribs attribs $selCellsName selCells + ::tablelist::ns${win}::attribs attribs \ + ::tablelist::ns${win}::selStates selStates # - # Delete the data and attributes corresponding to the given range + # Delete the data, attributes, and selection + # states corresponding to the given range # for {set col $first} {$col <= $last} {incr col} { if {$data($col-hide)} { @@ -7114,18 +7123,18 @@ proc tablelist::deleteCols {win first last selCellsName} { } deleteColData $win $col deleteColAttribs $win $col - set selCells [deleteColFromCellList $selCells $col] + deleteColSelStates $win $col } # - # Shift the elements of data and attribs corresponding to the - # column indices > last to the left by last - first + 1 positions + # Shift the elements of data, attribs, and selStates corresponding to + # the column indices > last to the left by last - first + 1 positions # for {set oldCol [expr {$last + 1}]; set newCol $first} \ {$oldCol < $data(colCount)} {incr oldCol; incr newCol} { moveColData data data imgs $oldCol $newCol moveColAttribs attribs attribs $oldCol $newCol - set selCells [replaceColInCellList $selCells $oldCol $newCol] + moveColSelStates selStates selStates $oldCol $newCol } # @@ -7211,7 +7220,7 @@ proc tablelist::insertRows {win index argList updateListVar parentKey \ set childIdx $childCount } - if {$updateListVar} { + if {$updateListVar && [info exists ::$data(-listvariable)]} { upvar #0 $data(-listvariable) var trace vdelete var wu $data(listVarTraceCmd) } @@ -7358,8 +7367,11 @@ proc tablelist::hdr_insertRows {win index argList} { set widgetFont $data(-font) set snipStr $data(-snipstring) set padY [expr {[$w cget -spacing1] == 0}] + set insertArgs {} + set multilineData {} + set indexLine [expr {$index + 2}] set row $index - set line [expr {$index + 2}] + set line $indexLine foreach item $argList { # # Adjust and extend the item, and insert @@ -7379,11 +7391,9 @@ proc tablelist::hdr_insertRows {win index argList} { set item [mapTabs $item] } - $w insert $line.0 "\n" + lappend insertArgs "\n" {} - set multilineData {} set col 0 - set insertArgs {} foreach text $item \ colFont $data(colFontList) \ colTags $data(colTagsList) \ @@ -7444,28 +7454,13 @@ proc tablelist::hdr_insertRows {win index argList} { if {$multiline} { lappend insertArgs "\t\t" $colTags - lappend multilineData $col $text $colFont $pixels $alignment + lappend multilineData \ + $line $col $text $colFont $pixels $alignment } else { lappend insertArgs "\t$text\t" $colTags } - incr col - } - - # - # Insert the item into the header text widget - # - if {[llength $insertArgs] != 0} { - eval [list $w insert $line.0] $insertArgs - } - # - # Embed the message widgets displaying multiline elements - # - foreach {col text font pixels alignment} $multilineData { - findTabs $win $w $line $col $col tabIdx1 tabIdx2 - set msgScript [list ::tablelist::displayText $win $key \ - $col $text $font $pixels $alignment] - $w window create $tabIdx2 -align top -pady $padY -create $msgScript + incr col } lappend result $key @@ -7476,6 +7471,21 @@ proc tablelist::hdr_insertRows {win index argList} { incr data(hdr_itemCount) $argCount set data(hdr_lastRow) [expr {$data(hdr_itemCount) - 1}] + # + # Insert the items into the header text widget + # + eval [list $w insert $indexLine.0] $insertArgs + + # + # Embed the message widgets displaying multiline elements + # + foreach {line col text font pixels alignment} $multilineData { + findTabs $win $w $line $col $col tabIdx1 tabIdx2 + set msgScript [list ::tablelist::displayText $win $key $col $text \ + $font $pixels $alignment] + $w window create $tabIdx2 -align top -pady $padY -create $msgScript + } + # # Check whether the width of any column has changed # @@ -7542,14 +7552,33 @@ proc tablelist::displayItems win { set wasEmpty [$w compare end-1$pu == 1.0] set isEmpty $wasEmpty foreach {startRow rowCount} $data(segmentsToDisplay) { - for {set row $startRow; set line [expr {$row + 1}]} {$rowCount != 0} \ + set startLine [expr {$startRow + 1}] + if {$isEmpty} { + set isEmpty 0 + } else { + $w insert $startLine.0 "\n" + $w tag remove elidedRow $startLine.0 + $w tag remove hiddenRow $startLine.0 + } + + set insertArgs {} + set insertStr "" + set multilineData {} + for {set row $startRow; set line $startLine} {$rowCount != 0} \ {set row $line; incr line; incr rowCount -1} { - set item [lindex $data(itemList) $row] - set key [lindex $item end] + if {$row != $startRow} { + if {$data(hasColTags)} { + lappend insertArgs "\n" {} + } else { + append insertStr "\n" + } + } # - # Format the item + # Get and format the item # + set item [lindex $data(itemList) $row] + set key [lindex $item end] set dispItem [lrange $item 0 $data(lastCol)] if {$data(hasFmtCmds)} { set dispItem [formatItem $win $key $row $dispItem] @@ -7558,19 +7587,8 @@ proc tablelist::displayItems win { set dispItem [mapTabs $dispItem] } - if {$isEmpty} { - set isEmpty 0 - } else { - $w insert $line.0 "\n" - } - if {$data(nonViewableRowCount) != 0} { - $w tag remove elidedRow $line.0 - $w tag remove hiddenRow $line.0 - } - set multilineData {} set col 0 if {$data(hasColTags)} { - set insertArgs {} foreach text $dispItem \ colFont $data(colFontList) \ colTags $data(colTagsList) \ @@ -7632,7 +7650,7 @@ proc tablelist::displayItems win { if {$multiline} { lappend insertArgs "\t\t" $colTags lappend multilineData \ - $col $text $colFont $pixels $alignment + $line $col $text $colFont $pixels $alignment } elseif {$data(-displayondemand)} { lappend insertArgs "\t\t" $colTags } else { @@ -7642,15 +7660,7 @@ proc tablelist::displayItems win { incr col } - # - # Insert the item into the body text widget - # - if {[llength $insertArgs] != 0} { - eval [list $w insert $line.0] $insertArgs - } - } else { - set insertStr "" foreach text $dispItem {pixels alignment} $data(colList) { if {$data($col-hide) && !$canElide} { incr col @@ -7708,8 +7718,8 @@ proc tablelist::displayItems win { if {$multiline} { append insertStr "\t\t" - lappend multilineData $col $text $widgetFont \ - $pixels $alignment + lappend multilineData \ + $line $col $text $widgetFont $pixels $alignment } elseif {$data(-displayondemand)} { append insertStr "\t\t" } else { @@ -7718,24 +7728,27 @@ proc tablelist::displayItems win { incr col } - - # - # Insert the item into the body text widget - # - $w insert $line.0 $insertStr } + } - # - # Embed the message widgets displaying multiline elements - # - foreach {col text font pixels alignment} $multilineData { - findTabs $win $w $line $col $col tabIdx1 tabIdx2 - set msgScript [list ::tablelist::displayText $win $key \ - $col $text $font $pixels $alignment] - $w window create $tabIdx2 -align top -pady $padY \ - -create $msgScript - $w tag add elidedWin $tabIdx2 - } + # + # Insert the items into the body text widget + # + if {$data(hasColTags)} { + eval [list $w insert $startLine.0] $insertArgs + } else { + $w insert $startLine.0 $insertStr + } + + # + # Embed the message widgets displaying multiline elements + # + foreach {line col text font pixels alignment} $multilineData { + findTabs $win $w $line $col $col tabIdx1 tabIdx2 + set msgScript [list ::tablelist::displayText $win $key $col $text \ + $font $pixels $alignment] + $w window create $tabIdx2 -align top -pady $padY -create $msgScript + $w tag add elidedWin $tabIdx2 } } unset data(segmentsToDisplay) @@ -7796,7 +7809,8 @@ proc tablelist::insertCols {win colIdx argList} { } upvar ::tablelist::ns${win}::data data \ - ::tablelist::ns${win}::attribs attribs + ::tablelist::ns${win}::attribs attribs \ + ::tablelist::ns${win}::selStates selStates # # Check the syntax of argList and get the number of columns to be inserted @@ -7833,15 +7847,13 @@ proc tablelist::insertCols {win colIdx argList} { } # - # Shift the elements of data and attribs corresponding to the - # column indices >= colIdx to the right by count positions + # Shift the elements of data, attribs, and selStates corresponding + # to the column indices >= colIdx to the right by count positions # - set selCells [curCellSelection $win] for {set oldCol $data(lastCol); set newCol [expr {$oldCol + $count}]} \ {$oldCol >= $colIdx} {incr oldCol -1; incr newCol -1} { moveColData data data imgs $oldCol $newCol - moveColAttribs attribs attribs $oldCol $newCol - set selCells [replaceColInCellList $selCells $oldCol $newCol] + moveColSelStates selStates selStates $oldCol $newCol } # @@ -7880,7 +7892,7 @@ proc tablelist::insertCols {win colIdx argList} { # # Redisplay the items # - redisplay $win 0 $selCells + redisplay $win # # Reconfigure the relevant column labels @@ -8276,7 +8288,8 @@ proc tablelist::seeCell {win row col} { # Processes the tablelist selection subcommand. #------------------------------------------------------------------------------ proc tablelist::rowSelection {win opt first last} { - upvar ::tablelist::ns${win}::data data + upvar ::tablelist::ns${win}::data data \ + ::tablelist::ns${win}::selStates selStates if {$data(isDisabled) && [string compare $opt "includes"] != 0} { return "" } @@ -8302,19 +8315,23 @@ proc tablelist::rowSelection {win opt first last} { set last $tmp } - set fromTextIdx [expr {$first + 1}].0 - set toTextIdx [expr {$last + 1}].end - $data(body) tag remove select $fromTextIdx $toTextIdx + if {$first == 0 && $last == $data(lastRow)} { + arrayUnset selStates * ;# this works much faster + } else { + for {set row $first} {$row <= $last} {incr row} { + set key [lindex $data(keyList) $row] + arrayUnset selStates $key* + } + } updateColorsWhenIdle $win return "" } includes { - set w $data(body) - set line [expr {$first + 1}] - set selRange [$w tag nextrange select $line.0 $line.end] - return [expr {[llength $selRange] > 0}] + set key [lindex $data(keyList) $first] + return [expr {[llength [array names selStates $key*]] != 0 && + $data(colCount) != 0}] } set { @@ -8334,17 +8351,13 @@ proc tablelist::rowSelection {win opt first last} { set last $data(lastRow) } - set w $data(body) - variable canElide - variable elide - for {set row $first; set line [expr {$first + 1}]} \ - {$row <= $last} {set row $line; incr line} { + for {set row $first} {$row <= $last} {incr row} { # # Check whether the row is selectable # set key [lindex $data(keyList) $row] - if {![info exists data($key-selectable)]} { - $w tag add select $line.0 $line.end + if {![info exists data($key-selectable)]} { ;# selectable + set selStates($key) 1 } } @@ -8354,8 +8367,8 @@ proc tablelist::rowSelection {win opt first last} { # PRIMARY selection and register a callback to be invoked # when it loses ownership of the PRIMARY selection # - if {$data(-exportselection) && - [llength [$w tag nextrange select 1.0]] != 0} { + if {$data(-exportselection) && $data(colCount) != 0 && + [array size selStates] != 0} { selection own -command \ [list ::tablelist::lostSelection $win] $win } @@ -8500,19 +8513,19 @@ proc tablelist::seeTextIdx {win textIdx} { set w $data(body) $w see $textIdx - if {[llength [$w tag nextrange elidedWin 1.0]] == 0} { - return 1 - } + if {[llength [$w tag nextrange elidedWin 1.0]] != 0} { + set fromTextIdx "[$w index @0,0] linestart" + set toTextIdx "[$w index @0,$data(btmY)] lineend" + $w tag remove elidedWin $fromTextIdx $toTextIdx + update idletasks + if {[destroyed $win]} { + return 0 + } - set fromTextIdx "[$w index @0,0] linestart" - set toTextIdx "[$w index @0,$data(btmY)] lineend" - $w tag remove elidedWin $fromTextIdx $toTextIdx - update idletasks - if {[destroyed $win]} { - return 0 + $w see $textIdx } - $w see $textIdx + $w yview [getVertComplTopRow $win] return 1 } @@ -8603,7 +8616,7 @@ proc tablelist::fetchSelection {win offset maxChars} { set selection "" set prevRow -1 - foreach cellIdx [curCellSelection $win 0 2] { + foreach cellIdx [curCellSelection $win 2] { scan $cellIdx "%d,%d" row col if {$row != $prevRow} { if {$prevRow != -1} { From 0cf5cbb05d1f7ba356d3189a54f8fd1d9799b362 Mon Sep 17 00:00:00 2001 From: csaba Date: Thu, 16 Aug 2018 15:36:33 +0000 Subject: [PATCH 065/150] * scripts/tclIndex: Newly generated. --- modules/tablelist/scripts/tclIndex | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/tablelist/scripts/tclIndex b/modules/tablelist/scripts/tclIndex index ce44bac0..9df16ba9 100644 --- a/modules/tablelist/scripts/tclIndex +++ b/modules/tablelist/scripts/tclIndex @@ -106,6 +106,7 @@ set auto_index(::tablelist::doRowCget) [list source [file join $dir tablelistCon set auto_index(::tablelist::doCellConfig) [list source [file join $dir tablelistConfig.tcl]] set auto_index(::tablelist::doCellCget) [list source [file join $dir tablelistConfig.tcl]] set auto_index(::tablelist::makeListVar) [list source [file join $dir tablelistConfig.tcl]] +set auto_index(::tablelist::updateListboxSetgridOpt) [list source [file join $dir tablelistConfig.tcl]] set auto_index(::tablelist::isRowViewable) [list source [file join $dir tablelistConfig.tcl]] set auto_index(::tablelist::getCellFont) [list source [file join $dir tablelistConfig.tcl]] set auto_index(::tablelist::reconfigWindows) [list source [file join $dir tablelistConfig.tcl]] @@ -318,11 +319,10 @@ set auto_index(::tablelist::findTabs) [list source [file join $dir tablelistUtil set auto_index(::tablelist::sortStretchableColList) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::deleteColData) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::deleteColAttribs) [list source [file join $dir tablelistUtil.tcl]] +set auto_index(::tablelist::deleteColSelStates) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::moveColData) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::moveColAttribs) [list source [file join $dir tablelistUtil.tcl]] -set auto_index(::tablelist::deleteColFromCellList) [list source [file join $dir tablelistUtil.tcl]] -set auto_index(::tablelist::extractColFromCellList) [list source [file join $dir tablelistUtil.tcl]] -set auto_index(::tablelist::replaceColInCellList) [list source [file join $dir tablelistUtil.tcl]] +set auto_index(::tablelist::moveColSelStates) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::condUpdateListVar) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::reconfigColLabels) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::charsToPixels) [list source [file join $dir tablelistUtil.tcl]] @@ -401,6 +401,7 @@ set auto_index(::tablelist::getShadows) [list source [file join $dir tablelistUt set auto_index(::tablelist::raiseArrow) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::isHdrTxtFrXPosVisible) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::getScrlContentWidth) [list source [file join $dir tablelistUtil.tcl]] +set auto_index(::tablelist::getTitleColsWidth) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::getScrlWindowWidth) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::getMaxScrlColOffset) [list source [file join $dir tablelistUtil.tcl]] set auto_index(::tablelist::changeScrlColOffset) [list source [file join $dir tablelistUtil.tcl]] @@ -572,6 +573,7 @@ set auto_index(::tablelist::parentkeySubCmd) [list source [file join $dir tablel set auto_index(::tablelist::refreshsortingSubCmd) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::rejectinputSubCmd) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::resetsortinfoSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::restorecursorSubCmd) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::rowattribSubCmd) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::rowcgetSubCmd) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::rowconfigureSubCmd) [list source [file join $dir tablelistWidget.tcl]] @@ -583,6 +585,7 @@ set auto_index(::tablelist::seecolumnSubCmd) [list source [file join $dir tablel set auto_index(::tablelist::selectionSubCmd) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::separatorpathSubCmd) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::separatorsSubCmd) [list source [file join $dir tablelistWidget.tcl]] +set auto_index(::tablelist::setbusycursorSubCmd) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::showtargetmarkSubCmd) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::sizeSubCmd) [list source [file join $dir tablelistWidget.tcl]] set auto_index(::tablelist::sortSubCmd) [list source [file join $dir tablelistWidget.tcl]] From 63d124e241f945175e5c88b7851636654ff5a2cb Mon Sep 17 00:00:00 2001 From: csaba Date: Thu, 16 Aug 2018 15:38:52 +0000 Subject: [PATCH 066/150] * doc/browseTree.png: Updated screenshots. * doc/dirViewer.png: * doc/embeddedWindows.png: * doc/embeddedWindows_tile.png: --- modules/tablelist/doc/browseTree.png | Bin 9265 -> 9322 bytes modules/tablelist/doc/dirViewer.png | Bin 11124 -> 11101 bytes modules/tablelist/doc/embeddedWindows.png | Bin 7526 -> 7525 bytes .../tablelist/doc/embeddedWindows_tile.png | Bin 7473 -> 7362 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/modules/tablelist/doc/browseTree.png b/modules/tablelist/doc/browseTree.png index ae57bdbe75d18bf6e4c1f322a4ba176b403ee366..4ff3ea877fd8d16105ed5453459e08de921cec89 100644 GIT binary patch literal 9322 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 literal 9265 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�w7jbV&Z1;8_7l>Ys3rj|`6U-Y zb1Mek8HuA4xi1{o%qa8EbuO&Ma=+K#(#c))-8eoz<+gA8(%6(4pFPCK6MERILPOIT z%f!n&OR)gmr%gLiyC8lA;kjKn8!}7d1DKGJ|AV>B@*~kWK(TwYY3vCfK(ZS#077Cq zNlP4PE4h*-kdQkS2PQy=Ix~e5z$@>^wPq~o%)=g)=dfTD@kX*C3P4=*tcX0-%s%y-IOC%}V0L%nj@+;|ZGVo*8f}TObf*D zd^hjDS=D8Nu_5`XZodG+wyY*bo>Urri|}~|uU|-{D;gDb943tOHX?NYl0adHet5*c z?>7SFoDgC+fWVGtC1)o@-br4`sxvx+V`7Erd;*CQ`b8I0W|vj{uCpa z1H%G{dtQ6+m+-}hIw;iPk{%hcJL50G4c%*CCd@l9>nxcZUy^{P23u4UpL-1KDi98) z;<`=$UO<4hOFmqdgG6(Q>vob9i6V~wS%PdBXkM2*y8Zq_ceiTQ{X$(_C)Av?C#E>9r1#7GmJHL|PI~t-Q$~Z-O14O2!uBTS6Y8U=LJlhjp diff --git a/modules/tablelist/doc/dirViewer.png b/modules/tablelist/doc/dirViewer.png index 254331c304264911ffe3dbac0d1089f05cdb305c..199a80ed05ee1589282fe62145c7e2e2a7d9ca06 100644 GIT binary patch literal 11101 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 literal 11124 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 diff --git a/modules/tablelist/doc/embeddedWindows.png b/modules/tablelist/doc/embeddedWindows.png index 9f1e948112915d28b54210226f8d0dee5eb5e247..884e89d519890df217213cc2235ffd1afd6c2d60 100644 GIT binary patch literal 7525 zcmZ8`2UHVV)NUHR_a2IrD^fy{-mVluB0Y#S1JVhC^eTxUT@(iD(R0I5=jE+C2` z5I{O2lF$?a7RZbD|JPgVy;*D4teNwjJ?HG1{q23elWJvgnT1i15d;FUn3)>cfIwh8 z^;DyWQlF?tsV`D5fECit7y<<`GjntBD(G`)K7oMXk|;q*jF^IotB8!Kf|-%5psxhn zRG2~mfx_h3T-25I40L&~<|$wCQa7iBTgcm?Y}H-vv)o)SwBY#1za=0LlX4GSd6Uu~ zc3wY)aw%i-ZsJ|9-2Sd~bZ&kQB|gr*c4z77)&A03k*_{4J)zX&>pHqRBFBF1_XZVA zZhRfe7#STQOjeKvD6?}jORGy~D-Sw%$nUm({#d4bBW?ZMYoJiTM|-_{2fLKBy;I7c znF8w@AdoQH%;;ac$oZW@2E#Sv!=wb(vDN3+NgNUU^-^M&Kna5<948ctUrqJvkRZ{2 zIcp2fJ!JZ5c`fX5Xm{Pj9H*z_R^d3Wp%Yz(xirJuR|th<`EXv73YwtR86~H;Z*TI# zq;L0mrOSIs=SK~yj;05#lEs~BkqE9g+=w;f_Mivqt^7|slHS0SXqY1}ir$)A^Svs$ z34Yuqr;vA2@P*?Xnw?!-IJj|eR!q*u$_TxI28j35rFzIFgOfw5-_VA%yn$%LZ|<-R z;o9*b&KpEoK3gD(S#B3d;>^!T30#!sGtc;awB^ptbx~158Q%^)$2a9+L{i2_LWyJf z|KM;5LqZPo!i$QvWBt`UH4!bO)nxeG`VY*+=DrQ+v62!QXcDCkF`R+qWIV^fY_RAinb%A1GR2^V_E@s>A?6lFS>Bfy)pcyXt8H6{>c;$KM?yY ztRsvKdph*!BBrP1{jQrS26s&vm*a8b1hVg{bN}Y_@#2PKq>R9nc-Xk#(sHhJC~bVR zmh-bFOpB;HJEtNIVKVprq|M70s=nry)i-^9bV`KPI9vW=ARz{S7x@peAv^@t@SFYfv})`FCxCUwGmPZdm7?RU!HpskiTV6 z%aGb`JM9P4{=Jg(@w{lf?Z^uw4ftK)uK4X^*RNUnugH5dGF<#Tir^Sx`0L~9*?p5j z)^BbtnWCKFdmEs|RP~g~Pv7`?4S}tol%jnVmQJ}a;vc|X6RnI}WMt#euei+V@LEq; zt<2lwAZ(GYqVs&)gTm6InaGmzc{!KH%*9^|moaPjkY)MdCiX`#QvQv_r*|$~<^>Bl z7}-ZJ2rlzGJge>0?NLIg(GCv-{QN@Dn>W$S89TKA!5wn}*GO-I31GoDOOC34{rX0@ zexmpH$!TWgy(J|C?O!-_frs#_#CIO$T`Ik{>pgSC(z2ni@}cD zje28pfle*ATn_FJ4)u#OU2X|E?C^ibBX@R5fTDg&ExtBBQ70rDsIJ^p@}Ex!Y&?&D z<4|?0KPEhU4Zl?D3AdV$Kx-Z~U7BJRy*QSgG~h+2j)8hjw#6tk%!Pg9ntt*EX2P`U z_TqUsN+kVAaaJ0fFjlyuF@==Rlf9pIelZ;K+L-O__HzD~)tr{|j=93sgt_misGo}a zQpgMK-Ie7w(~CH>VS46<=SIZezP5epHYj^}Ffm!5TP4b1zh(xXC zUx>#2`gI5N)TJn$v9`fqGa*l~7X#?3r(cyUBp_!J{i&}jd^1oGXum!@82oVBk=I8r zfU^rA>*~IxQM}cAx`%nf(8ZxKeq!;}nt&i{i)@BJ9A#Ig;H6yen+(hz>w26jbqXmTWNzP3*u1 z>ZDkHz>!8zze^s*{D;l2iASR^1oh|otofkIc-)sYQ}i8E$ysZn)4P?$*a*VFzS`JEgYm0pQ;J7&9cF%qDS@>wiufZth8 z{%g-#$i6E&@-0n#_=i0NJIiJ2h}{O87yrf6>sUchsgHg}nZCB$l6zqdi3&f?>|MPi>V#$M5a# zo{f5%*Tte5cB9WyH;54gQCHeF$v1j?MVleVtUGMZB3t3mp&Mt0}ZY#}^kRMpI;5fkplH6S)0kFO0OyR!d2qZP!q- ztGy%VWNN~Pt_YR6XK2Hr9H<{h7`&sCqV{fQyIJ$Vadft z&{hjzXIj=SZtzYQ)IQ{-oN=u#`g<+M;KGSvEck1FoyGW}J6DpD-FO}YgAkA|jSllX z?XfLtp*P;0nRNc`h0h-dTW-opXJ#;j_0X38GK$ZSD9XTXWwFLg`XNf@Y$Wb`D28U> z11(osUkr|^kwjm)7QTNcpm<9^L|?x&uJx;{RBW5R=bw}GtjT+K4cJ0%>=2TSNZ-U8 zEURNEywER15f|tw@;ZcU7N9bGnwV&$&pRfV#D^ZsoL$uakkr>=RXW%@)i>N$L7=iB zl{+yqFfza^y5N}tKx-}xzUlN?qlCdXn}$Z{r=Q`BZ)txv*M#Jw(v=W9PIAF$r_20s zRt&4m0~I_)``$!HQh6OfsQC3im?s)=D|DbGz8>PpUtHi!WR)VRVP&J2E(!s)M}u!i$vrZ@_cx z(4mX>sw+c-eLo}jeu=d?gG_+X%oi4?^54B zd<5s+%DhEa!D!F@O#o|sWzt~G&k9A?%c)`N6316L z(?h)3rp~TCX*DJSKPAzePtX8Ya`pWHl*Ez0)Xgmv7C-^?A@Fb&f4iY`pse9{d_0|op zkpp6#VKr;+mXwzone*EBc~*>zP^&hAM4^dEUF%8^u2miAHri6N8OLl?=2c3y=V_EX z-x)c5Q*s%#h%Rp+eb+`hP55i$!@37`v4up7kq*N(>j*9TL-ow=DUKL)uLaty=ORx8 zI`)V9b%66%q$lyQDJ?k!j#kExLxvL`uc=z3Q5h#?Cnh>ID}HC^kue_=W_;?@loX6Z zjs5U-EjRqxaF^Hlb@T&WTtJW6!Bt?t%7|AX>6Y;-WGNhdq_PNI0$~=}aeGiT;=De4 ze%5ZgVT@kQ%EZ!AtfNXHIgFYouCe(oXc?^tVOfH!Y_fDPCbo?1nYhZ^!9w;!X}MQg z@X{4ykJG_w@+r05ir9-a+1+6vOo*wowh?+!CT^7-ED~#(uRNtgqCjv;IYa-pO(%wNHr zOplJEpKkVUU@>(339qZoo>pUXxG{J%4$ke%;`O}kLhJIGyCH&>W~O~N-~f;M+jT&q zCdJaGCzc;keT|2Q({>)kV>`$^#q9Ax7ryP0*6yX$mg(EnW|>UEF(~Doe^;e`u;O^mY{h} z`J4(>k+(CYrQrDqqp~)Psd}2DF%}nK%@Nr%!GSP*9UVJbkPy4wNMGXhzG@*knNzL> zW9`(_|G0{t1Z7s~hF=v6x@UPqW(u-Mfr%-0JoT_as{;AjHS}-0Y_g4YhkOT`H*vs9jQbbm-tU6!Q`H*y^@H++ z!1%oRd_6~YK5=zW8)?s(sEj>QxyDwBcgL!;e0LNult{V++p;&ZICf-PxNcmcXl~8Z zQtIiiIJblY_FrFrzh%R|zb|XFk z!)p=W@rx*!$NB2#N$~p>mzdyG7&&fMYi7jMIhU3j9hpb-4!g$ z1Ew8jL(IKn&Y-i|7ZYw}q8)~sJ*FjXa6(1}tGns&dS2z2(SsB<@woE>YqJ8lxDBP( ztRYv%xGZ%IEOhW-he26L3}``0`^#P2M3HD{*0GwbUEC3mUzE2l4cG-rEXqG_ z8jRYNm;ij6H6`qcpYSQp|B6`v%!`w8JUH~uMYV6CMs*VSm&xZpfJ!+^ux^(&-;ldx zwPbT(Yvml_S@L^*ax1sB$9+kHqDhv4?PV9D-@Pn1qgZ$_wJ)mR;ZkYR#HnP<%w5}%_XyTFsr8^jlF+^ys zK}aRqBGxtZl3+rW6ik6U!@c~+6V3NWI1vRS&=bfE%k9}~ung}cQ$ju~ZTNGyTTVOf zxW+VtkJv)zODpa&vHo9ertg&w^^Fo$x(oHgi_P{TERs&b7||An8)f6-;8%B>Q2WEy zqvY8J8s5e<01iC+x;=ci7m41fe>T*i1%IF<`p=>OTR;Km&clXZM0GE8ktZusP-4>7 z_HEDSuUEL}>_6xcw z-xM4X-wZ60pIs|wep^V5s-c%n_tCl64-pq{gn*^eYx-^RO{>TW{4Klv2#)l#``3Q#37au<^0? zkEC*OCfEAMuixC`*F~2Bs*C=cmqw%@`99oZyO%4Bm;YS2A;P86afe!BG^YW~{(|W;(XD3$85B78_6?A&Ip{&@ z6)YhrMeApuhB&~I8HwFS9SWb!%Vf4IvJ0QPRO-<_NLRdyE490wGR55}tOVEp|0fQPmU z0&bdxR}yi)LXGlAMREOYwye`A4tr`KIBNTv0Ui_HiPwU=S0Du;RU&rx}yr!Jg z=kC~uK*rrH5iZjC8QHbDEYw6(&n3L)j;x z8bVya)1zRS-|_5tO*01P>f|V(i;S$KgP~|C^_-N23zmomuXs44e{wKcGn+0TV^A}$5()Mv1q)J;gB3Sb4DFG1OKTl3#JDL()bUu;uXC z2-4eS0p7ioK=}Wy6<US~2eHU@nJYJ-}S&n>y>LrXDGu*}shu zrsDyNiA_D?dj(6h!O~$yK7UCBzs}N}pbo^T^Y22zNr$8(3ki~ba<98YN{p5+lKK^3 z(z?hhs*hpM@~i3PV)Dm^rOL76WW==B`6Fye8n)T4_P~mxL=7o@mi*T+(6bFP154Y% zD)ZmMT;ow|$*fflAKLPFsSn z9RGB`L};{i+s$P@AQ}PLX&^7>&9KJ1UiXUAK6466SS`ayv9b_zcd$Mr-;M)N?V*Et zm1*xz7QL5^RB2Z)W*ONP>y;Y$Nd>tzVilEIuwx#-+IJ`PQ{1Qt-J5RH8!gyb`ny?; zZW>x4EwCxoTuXQV*8Uf^ZZW|4Pvozo=BudE*A^HY3teO?3)63v1u2l z892zTFd5>+z1T+P)na;bMtiI+^5Jag<|{eMgZj$PAN}f>sGm}}+8RlivxD`!gFhwp zMRms>->DY#Y0EH&Bn`=6Q?G2t5MtBuW7koC5$SNX2}+Lxn~IHK>eVWL)>gOXa`(a! z6Js$+UUq6A=$8uy-K46NpCFO6)KGM_08HL67<%v5HxNXH97a{Y44* zG>{PVH4?4!@GjlzA1pQD-KTr>-QZ(8wa9$lEXsx~ueTc;cZz0GY~6TN*FAMWbi$1~ zb84=FMwzVKkH>@`M^@64ZeF>);*P!gWBOpFGud|T!N^Sqw=(VZ(w(~HXSgV79&p#J z6P(9ZL;sXs)_(dnU58zjsadn2ox0%&!>-Z*1H+quB^zOhL|U?ya0(qFhwZ#qN|5ok zJNmSO`E7F*J@S2J2KX|5pnX`5X#Ocz5pgwp^| zi98DeohucVU8!5%a z3*w?$CgMsj7Fe^bplOY44NB)->Xu1=yGP1Y2C${-D*bFNef?K2G_Htw;)s@?zFYUc z?n;iA-CpJ2!E@4jNz(Ask}=kioc6sBkmjQXk;K`yzXmE*W;=g_nBFivJTAK`8@jG^ zv%j~r4(7oCzU#BNtfz3udBCp8)%Pw9O3mVvFlfCUOVAM0R%qoB5og>W zAtpkaTz0F0^o#!<)R%;ZzFddNLPA#2bYP)*3(EXwUS#WDGsoWwiZjChiU#3dfcd1) zdHK7*Ytn#v{4rRq&5yd+@62{{J*}c>Gb4j`Ggwj&meL_(?t;L!*+nl&qvceyN6R1M_!qXQrPR>XeC+`#p3Z( zRoW4~o~kWoxfwuuurkYBw?KKl05{am@)({J$oQoPHVUjQm>Y!$IE1nby`rkD3vOto zQ<0g2nACvSK*#Lc6NRijQ+a#oS82sN!wuV6b|L$!SP$$$FCxdru8wb{y zYZpXlaarlN8wUmWHS+0@!$u0Z`A{KkNIqt;(^>AIrQWaKIbe6lXe;8ApQ55-@0|Nh z>CILs?# zC}EG~1KSR=3sA8St|yMKOJOH`D^wl`I6ceo`S9s!h$!K6&YOn}7?=v^%KA#(7sDGP=ij4{afzW7csT)HeP(10B zp@5SpH-c_VkuIR2uBiqL4xyo8q+^k|MK6~LgK%FqWfgF<;Sl5zm*y7NQWs`(xy*eI zf#`6a`-#!syCJ2dtawo`Q(DJS^3J)xzL=?*iL`BMjy@gVqk2K-b2ksy=m=>3gYz~& zVddC!jl{vH;ZL2@37_KZ(lTD2KM9@A(rta~ejmT>T{DwY2A1Q?reB>md};{zdbIu7 zBWrN6tGjEZGoCn5xY2PwHa_>+oPD zB$+v7{88~i*5eRFY`4^rXtPyNm5)*gT!t$naDNHy~rPDtz7+mx*z4)qQ zPEr1oJC=Ej$^fhh;J$$l-;1zlNx1_&*slP4DeHOA5EKlk_@+kGe*ARmC9+MyN%QPp_|y<4p$2TA!GJS*oecoW!F%A;ne7A057pd=$AK&eA8kw6< zC8LOER^G1*SNE}Z-$7T`U&W2|jo%;HR2c1ZGO$?EMs$mTsZmQG=@p*XooDFZmY+lq z;)wJNWcc#BDwOTjoXVpVm~D>dj}Tmtn*E{e&zKulQ3312l<~bfpzZBIf>eR$avbQ70SAY-yLGOi84rCA^fLpIxlI(6foEzMcX2ne0M^q zx%PstpUHO1_~Xs#VPm(n^26|{U?NtJ1J6Ff@G$%uRAH%HVZ~OilHv=P=iPVuI{_z9 zTz$}WgS;~W=Y;{N<1fG$+CUbTbW5CNkhyzvdMMEZ-K&ZnF3cM zNoFORiLxwgXuOH9m3#O@Oh%^Kef!k=)EC$+yWQu#*S#3T(rLG=fEaO(Jnfv7=0^5j zWN^B^S*Xao&h0@18x?b;fyz3F5Lw%ob(ITPjuNcZAy#OEG^w? zOTu2y-MlWA@{pTcH&XpmtbEyPN16yDB=`4UOuuR+!06rGQ6E?{>}T0w3DzfEzUoNo zqi6YoDbV8`O4~`lew-i(4UxfMM0;L#T(iJBge;A3QiB78H~RK>5JVNzM-BrF<>8?> zCzH0(P*-#Eo|n1pL0*t(d1jj|r^zv1*_-h-0LKO6p$G8@a9>sCdlAOBFIteQ?$BA`gKWfn|O7IgH@->s1P!13gD0M zkFA!JpU8Jdb$_wAa}_-qMIqn`(?8+bh&fG#|%8Ux0n`6p^^hg z*T=pV{M2~Xqy1#QDEqlu%)DyzWD;%6g2Izqs2?ofG+q)u_swW~m|5{Ll;l{MVJ-Gf zsn6*>9UCfa)XAyYg&xWHj@I#n@#K7*A>3@r=^|`526Lfy_86@B?29*ZYiDO=sIwE~ zJ%_vAuE{DtQN1STG8y^zy{ohKm{p^-DEr^z zH551co4b<>!6oz9WiVtiqE6cEfTSJoO|B`O)H*HVz=IE$ep<2BuI9SEs%v$4upozn z7>}PN{ORp)x&AZkj}~y^9Q#^8>R)`YSgv6eyNow1ryC}jZ%r#L^#n#M&m+mu_*5u6 zhW@;c)$$H@{5kyiOfxQNYvu{z^`DFBU$B`uhTz#>TF7E$g?Y>FY4WEh=Q|f_C5EUr z7LK2}RkYm4tsm|{;vy{f6*ae67ow>-Ed7}|Qa()W9|azL57 z{GyYcZJy<>LuJ01C#?+SKaV}oZLjVlDkR0psgDmx&UEVdbRdn+?6fUwwDy*|;w1}g z$+Wsw``+iJtkmt`punKyC!u!HR!I5<)LFuF!Xre@Cu;PoUq4i#Y9Z_l*{%g|*zDgJ zh9UL_&K7piQ0g^-?T1w;%D?}_-PD7GY_rc*atZ#bR={A(lx+EPkaxSz zJ~i*2?{WgZa{Gd4tMfnGKVJ-sCt zNrxS<%=c5lhxtmub>9Y&5qyV{fmm_x zmRChoH_MR-BdE^!?zLWDZ9M&jy3x+Io?pcNs;*{G$rhh}_$q8Z{i^gw4}&@JH#Aiw za~-)q%Q=+UfKU8HMNl;!e17{geCimr!pK%mFO%Tq2;>Txgka0K+Cz!Rk>(jY_)llgt(nzp&@D%nZKrI&CxXxf0; za&^4#TmeeUlix7Fh_O1}RB#28@fo&zV(3ji0dFAWHj5yPSb0r0u*ViS&n+kojlhMT z`cmP~71aJRF%TQAzq?P2y2PwLHz*l#qCEW=^Qy3c%F^ZTuzT)PZ0j%Tji;ck(9Xl+ z&sP4CjtBcRKfP;|d;-PR|0qJNZ=m0X;Mp_wU!T6FZem78vg+)0xZLq`$qW%?n!9M) z+S{jGh7iqX$5sVc)AUZH-!5QexfjqNCY)ol7I5L@NdXy1$0g{qMecYmbWTaB%W9sr zivUvf{ay}IaDTgqsH;P{9# zuwbo5|6>y~{~8bGV+ynlATmt1E-;&yXd|rjATrq@7DKkd9ZUKOrSP)ZS8H63hhxbq)LQ1G@~_;uoHw0Rk%HO+vH?B9ar#o@9Xr9=hX3bfD|49 z+d*~D8JWazUv~)Mzste`k9%WNn9lO|+qA@8Usj;3uvxU2L+PO6p2IoUF^=r>kEBAI z>-arq`e;Iv3aJ-;nR$K|R zRy6MMkpZ?Qt;YYZ`(^xWa=lM9SnhGut9W*0wAHD=A&FE()NFbgLD>7ojyUH*ZpG$M zg4?jo@ZJZ9h6XEx@-D)(hgW1InP_WjaD@G=LffMUQX{Qgs7ZNsKnU+mW~VzoR4D{u zS1Yo;k*$v$5^f&+YHs4@gH6z|`OF10e1!?WtryP`caIrsB7f%RF|!{?tmTC%;NEsy z&A%FLVOlW+cBQTLwc4+e-SMz@&~WqNS+zix8Za*fv$Q--JAJO{W58bP77hMNzJk^6 z(OkeRl;Vs|CH~;Qy?`uNW5g>IL4O*0B67nQWt~R8AEFI;mXhFce2MYnZ|@1bUjWa< z&qt34_<(3$qdkVPYwhrIA6dHtnA&_fFYK5!WA1mIljjv5Z0*lltkyjC8Hy`cJJ#0) zCVIpZeLa5>7L%bTS_k)=aGPv=cocE9xxM+Nrv>Uj7|VH_fBz>PF5|U;K3bFQCzR>X z`!%;7CsJ3!J&F2c`^H&ZMjqj?WkkniB70;cllXz-ryeWC@c4?c9pMv^-RTCt5){ws$P0&3%YoXOCGaQzw*mf0$ML}N0d?iDy zY_3=8e!I20a8K>gJ6C1vZH5L@J`>R;uG&f~3fH?Wyf=oROru?XYBnPw;*TKJj)vrp z&WyO4`x+0|1P%iV0S-#)Fd=jCg{u6in@lw_E{Uex$iv@G%~7lG9K7hg;hrKVqWcwa zqHKUqk~fol;Ba;RbxD5vE9%&iv@fgEtC+WDh|ZzduiqQZS8g&*Cn6$0_qo2&Q2_}h zbk9*rwHh=WB{O0&12y?AG$!D+GKg1!SRNAAb1v#~15W13wSvKzAyOG%7QYRqj=CMy zo_5$NNWTs1X&D@K6dB&H#Z*q;qr~%ttJmj^95qO%^3u)Ls0CRDGD06}IJi8XEObEL z4zXlPv5BO`*T5VN(VwqQvx+?0b^StPv4nXo0Hto#o!hFpij8{(RB9mcQos&iy|kFVXkxx9!EXij1yb2d%1+< zjL-{%Iycodl&y?1gKYvgzE|&4Hmk2pveBZA={&J3Y>kZ2i|o$l)dvh>^f_9}r4409D2Ajq{&MK#-CW9VuLiVDl9|-y3E<7EeSz*|q6*uQtt)?CrNF71W2M^P3q*5?R0M;^qo3-1iYYkI z53j;@V#(`4=SnE^i?9fAdM=BO=v16wq8@nf(dFSMRWxyi8nep4D=tBiR^yYyl09^m zC67k8aEU>z$Hi=U1rr#`wTJy( zE8ay?j27W|92|4U0xQUFnXRJ2V|0M2q1vSCxq;zGO`B9UB1 z%wYn0|A|kRURJ$FrN-t41I$8UZn87={aN=q3gZ7I|KM#3Z%Yn5V}wy|)msZv_QsWw zO&A?8wuNB&7z;v4iQ!lRG0HB3z}IFxF#kr|7lW&?Tpl)_yvLn^W9{L{kX4^u*3*+b zwiF#@HizFv6a_u-;e0Hz+?y!ObogN-vM{&#p>-h3i1Cb940$1}$7ifn`9n zXI(SIpm7i?46B?^al4%1z@!*2$lSt7+JVWP`AXGh6*t(}^?v;&ZZFx-CNkW9BrCG_ z8$DK{+P|HB3CPri_6iAcC|k~ALY+e2L`9g>)0wG`r%?y;p#wC1<>aaZ#CKZ)B0Xxp z(EjvhZdPrQ1y%ds=28Qr&a$hjMSEunCo zkmN)4xc$ce0OF!BE$;7Drv!4i1gQruc_CcoTCQgcJCVT@v^0R>M5Ag<0}fvL!+(+w znMc$RbyO?GR`m!|F&U60-Ew|opf*rYk^Zy#?_i>xL?sOLsNC%1B z7ff$YLvWHX3rbf-tBu7uS0AE!S}vEZ#P3N~?AvmO6ypGr=;c&kH1-`Aj~SUiJkC;s zCpNkMWnT@1zzgFWi|s6*yZ`8Ukmz@K>IY>{a>twFBF_FVnKg@bglF!BtMdx*JV4}q zzZlJ&A-1HQ>VgeubJ1=0UG}5>0>+za%%Xwm-k!-DLNimDi(&h72ly-Ak|{9VB613V z@%b##*NhCND0+txN5FRP8fJzyi54&F!!(UyVSv#C1tCO+DGhi440Gtc5dRL(|DcSI z>UhToaZDd4O0|Y&?!Yeo<2)LH_}I8u^;~jU#H6aMn=ulnB1vrcRg4lKqfKd35+w(^ zeh$W3m;vcg9R+-|4+-i|kKdy*k{NhdaawzbdGbh)CvFzk0V%tHE$WD`MvN5Oc%mty zc9)?Ud=RYol|uc45S=tyQXMp+0jE7i@b~s0LE}xh(u zsv6A@#`|31W{7$;ejU*XzZyu_Z-?%6^O(cs-%Q?Jzu8~#>;a7Shayn49~2HRe^Ru6 zG%kxU_67S>&OI|?A%(?;;xVQuPg4YNtT#yoVR{`4;%xl{Kn_OSS6Ed|YB2U4-?sc) zo1e4Py@8b$$ylvbtH0HVRAUgg23ds^N}(fMlsk-2hB~5E-U?{Av^XP_XO>^@s2UM& zj9oC}l@=K$(=GTSya%btkN+&T!zHAm0ipO(y(nP?Q@sj8nWO^b96&83^h{_3p1t%{ zDrB#N3l(=;1Jci5h5zhKIWP+${FOQt#%ZHW)}XeGIK3)CHB!hBOl8EclG)Tn70c-2 zc8V!nGp@4=!|W!|7COpT$T&XGCNlx58j#=^pA7+$bPEkYYK!riJm+r`>#9JkNnH4m z+6dGbru%`S{s5z@2$t}9?p*TZ?i7YGqhj7Gt^$lWkDnO<*p#8aa}uO46oX^R-%4?pg3%YDfPT0 z>w74=Gqu+gQJU~vn}Q!nlyU;vK4v>Z(lUhOx>v8M^AHIn$=h*ckL|Cp#Ela^)|Rmc zWp1!9g|Bu)BFAon-gz$?8~Q{_m`UlpBo=EYik(2qR-|kx^;auyriJN|euDN0ywbhQ zb<92&=B1_CKOOB9UGE+R)o>L$feKQxg=&zUTFg34)kKUD{dNqQA^WK3pQ*Wk1%o70 zRURl99t%!XmYO^0H>**{d`Q>2NVE7x@zUXPxZNK*r>B8(cexXO$8( z6>LxIEq*gqhZ<3;3x}Xa{27rlI62ogLHyR^q2HT%-~;iPY)|YWnN&n;B1g*iA_`Z7 z$R=_iV>gnuYh80PZ;?+?;hIonm69x6T96SMJgQLQAZ*y`c>TrujJB*St*nT(LW@!d z)-%HUc6d$S-B`8o0T3Ds?}ljpO-@*jb&Tf0y3HKDq3$I```1Iww}4@6NQ2z#mq)1r zmf<}tnQ388pJv3SkY`HosXs8z&49H3nfXZArB5fnW`2Rfw{--bVEmDH%>? z7s$4wbPX<`sY%exHh*c@RzpiF&U0+b{of3RPQT)5q07%N@@#e6?@ZdQj$}j6X;SC0 zdn1Gve|h5t4AuA8EW0d^j$-$9MK{ZKVc6GJT9~HWH`k&Gp__kYhwT#LWGA3XhL1NY z3I#ma1!-GHkLWsZ;ShL}??@w_(NHnY8%olOwqbQS2rUsbw(8~5OHh=kT)P`@-UK38Ef{%xDgLsS{8C3Lp zy%^R0F4s3(MFV7_^}mF!_v4sp*`yTY-KRwOyHn!6D`qkLqc_*@wf43iZxd$Ju;Y$V zb`|P08>PZ9PV%&J<_yj-TqYa9%cV!!fh{I(6UloQUl9Kx?acq6cS*GPKj{5FVDldV zd|}p~w)7S3M{E#FoJgoViQyld$U@>EJqWN7MQ;GWDr8i|C9~}!T;~FQv~T#qP>D1? z74qukgud3sT!zBG!dxER(kKk_tLAb8XebSxk>IymDoee0g)slKNUVrAZ50 zdI1W)qlfEA;Rl`P$uz|~9kr#3(=}}|?YT>vdDdpT`bvPW zd{R=u2WS3L+hP+ zwq{|Z5B7N+r9JI6aW7_-XMwn9R{?QJ*RD&_;@wxY5T0_ME}{7~_4noHUljeh^DE*L z2Wfa$D!fxbk}M{J%NC(aulArlUdKCDyPm@qmZ2w|BiCEcUrZ;K6+G;Z8yAV8&h*kY f{m3ug+H=PJ*;%;kM_41)lyN-t+?4 diff --git a/modules/tablelist/doc/embeddedWindows_tile.png b/modules/tablelist/doc/embeddedWindows_tile.png index 1777cafa29aa4b6f74144bdb2aa04cc49a90f156..af2ef5a6c2eb0f8f631f8dce23136afaba9d13fd 100644 GIT binary patch literal 7362 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 Q0pv?Z18=q?Q~&?~ literal 7473 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 lc`{joXmc2M!;P2gr;K?`sJ?uj=^YUDGSoA>QK Date: Thu, 16 Aug 2018 15:40:02 +0000 Subject: [PATCH 067/150] * doc/scrollbars.png: Added screenshot. --- modules/tablelist/doc/scrollbars.png | Bin 0 -> 5092 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 modules/tablelist/doc/scrollbars.png diff --git a/modules/tablelist/doc/scrollbars.png b/modules/tablelist/doc/scrollbars.png new file mode 100644 index 0000000000000000000000000000000000000000..908da0f16abe79cd2f633f72d45da3223a597da2 GIT binary patch literal 5092 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 Bcy0gy literal 0 HcmV?d00001 From 5d6ff82d3b162e5ee22e0a16aacf1c4827614220 Mon Sep 17 00:00:00 2001 From: csaba Date: Fri, 17 Aug 2018 14:47:17 +0000 Subject: [PATCH 068/150] * tablelistPublic.tcl: Adapted to some changes in future Tcl and Tk * tablelist.tcl releases (TIP 278, independent Tcl and Tk * tablelist_tile.tcl versions). * scripts/mwutil.tcl --- modules/tablelist/ChangeLog | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/tablelist/ChangeLog b/modules/tablelist/ChangeLog index d14a4aa0..1ea301ba 100644 --- a/modules/tablelist/ChangeLog +++ b/modules/tablelist/ChangeLog @@ -1,3 +1,10 @@ +2018-08-17 Csaba Nemethi + + * tablelistPublic.tcl: Adapted to some changes in future Tcl and Tk + * tablelist.tcl releases (TIP 278, independent Tcl and Tk + * tablelist_tile.tcl versions). + * scripts/mwutil.tcl + 2018-08-16 Csaba Nemethi * *.tcl: Bumped the version number to 6.3. From 920799968b056b0a8c08998e04b091728b787166 Mon Sep 17 00:00:00 2001 From: csaba Date: Fri, 17 Aug 2018 14:49:31 +0000 Subject: [PATCH 069/150] * tablelistPublic.tcl: Adapted to some changes in future Tcl and Tk * tablelist.tcl releases (TIP 278, independent Tcl and Tk * tablelist_tile.tcl versions). * scripts/mwutil.tcl --- modules/tablelist/scripts/mwutil.tcl | 5 ++--- modules/tablelist/tablelist.tcl | 3 +-- modules/tablelist/tablelistPublic.tcl | 2 +- modules/tablelist/tablelist_tile.tcl | 3 +-- 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/modules/tablelist/scripts/mwutil.tcl b/modules/tablelist/scripts/mwutil.tcl index 45e4c9c0..c73ce416 100644 --- a/modules/tablelist/scripts/mwutil.tcl +++ b/modules/tablelist/scripts/mwutil.tcl @@ -8,8 +8,7 @@ # Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require Tcl 8 -package require Tk 8 +package require Tk 8 # # Namespace initialization @@ -20,7 +19,7 @@ namespace eval mwutil { # # Public variables: # - variable version 2.9 + variable version 2.10 variable library [file dirname [info script]] # diff --git a/modules/tablelist/tablelist.tcl b/modules/tablelist/tablelist.tcl index 05bde749..89e04a37 100644 --- a/modules/tablelist/tablelist.tcl +++ b/modules/tablelist/tablelist.tcl @@ -4,8 +4,7 @@ # Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require Tcl 8 -package require Tk 8 +package require Tk 8 package require -exact tablelist::common 6.3 package provide tablelist $::tablelist::version diff --git a/modules/tablelist/tablelistPublic.tcl b/modules/tablelist/tablelistPublic.tcl index d1291a06..aec87417 100644 --- a/modules/tablelist/tablelistPublic.tcl +++ b/modules/tablelist/tablelistPublic.tcl @@ -26,7 +26,7 @@ namespace eval ::tablelist { # variable version 6.3 variable library - if {$tcl_version >= 8.4} { + if {$::tcl_version >= 8.4} { set library [file normalize [DIR]] } else { set library [DIR] ;# no "file normalize" yet diff --git a/modules/tablelist/tablelist_tile.tcl b/modules/tablelist/tablelist_tile.tcl index 58e8b926..6ff49467 100644 --- a/modules/tablelist/tablelist_tile.tcl +++ b/modules/tablelist/tablelist_tile.tcl @@ -4,8 +4,7 @@ # Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require Tcl 8.4 -package require Tk 8.4 +package require Tk 8.4 if {$::tk_version < 8.5 || [regexp {^8\.5a[1-5]$} $::tk_patchLevel]} { package require tile 0.6 } From fb070b64a2d3435b0b91b38a4653e6cc42e8a0f8 Mon Sep 17 00:00:00 2001 From: csaba Date: Sat, 18 Aug 2018 11:16:03 +0000 Subject: [PATCH 070/150] * CHANGES.txt: Updated to reflect the changes committed yesterday. --- modules/tablelist/CHANGES.txt | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/modules/tablelist/CHANGES.txt b/modules/tablelist/CHANGES.txt index 0397d75e..1e1d7bf1 100644 --- a/modules/tablelist/CHANGES.txt +++ b/modules/tablelist/CHANGES.txt @@ -25,24 +25,27 @@ What is new in Tablelist 6.3? 5. Significant optimizations in the item insertion as well as in the selection-related code. -6. Further improvements related to the interactive cell editing with +6. Adapted to some changes in future Tcl and Tk releases (for example, + made sure that it works with Tcl 9.0 and Tk 8.7). + +7. Further improvements related to the interactive cell editing with the aid of the ctext widget (thanks to Sait Dogru for discussions on this subject). -7. Made the overall handling of the "-listvariable" option much more +8. Made the overall handling of the "-listvariable" option much more robust (thanks to Ulrich Seidl for his bug report). -8. Fixed a long-standing bug related to the "-maxwidth" column +9. Fixed a long-standing bug related to the "-maxwidth" column configuration option (again, thanks to Ulrich Seidl for his bug report). -9. Fixed a bug related to the "-displayondemand" configuration option +10. Fixed a bug related to the "-displayondemand" configuration option (thanks to "tombert" for his bug report). -10. Fixed a bug related to the tooltip support (thanks to Bo Berggren +11. Fixed a bug related to the tooltip support (thanks to Bo Berggren for his bug report). -11. Numerous further improvements and minor bug fixes. +12. Numerous further improvements and minor bug fixes. What was new in Tablelist 6.2? ------------------------------ From cf07157da2ce68c29226c0196c19947600647d33 Mon Sep 17 00:00:00 2001 From: csaba Date: Tue, 28 Aug 2018 08:46:41 +0000 Subject: [PATCH 071/150] * CHANGES.txt: Slightly extended. * scripts/tablelistWidget.tcl: Bugfixes and further optimizations. --- modules/tablelist/ChangeLog | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/modules/tablelist/ChangeLog b/modules/tablelist/ChangeLog index 1ea301ba..a404c209 100644 --- a/modules/tablelist/ChangeLog +++ b/modules/tablelist/ChangeLog @@ -1,3 +1,13 @@ +2018-08-28 Csaba Nemethi + + * CHANGES.txt: Slightly extended. + + * scripts/tablelistWidget.tcl: Bugfixes and further optimizations. + +2018-08-18 Csaba Nemethi + + * CHANGES.txt: Updated to reflect the changes committed yesterday. + 2018-08-17 Csaba Nemethi * tablelistPublic.tcl: Adapted to some changes in future Tcl and Tk From bf7ffbea35db5a503fdd760ed4ca423e889a6950 Mon Sep 17 00:00:00 2001 From: csaba Date: Tue, 28 Aug 2018 08:47:35 +0000 Subject: [PATCH 072/150] * CHANGES.txt: Slightly extended. --- modules/tablelist/CHANGES.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/tablelist/CHANGES.txt b/modules/tablelist/CHANGES.txt index 1e1d7bf1..2ae855d3 100644 --- a/modules/tablelist/CHANGES.txt +++ b/modules/tablelist/CHANGES.txt @@ -23,7 +23,8 @@ What is new in Tablelist 6.3? accepts the corner specification as optional argument. 5. Significant optimizations in the item insertion as well as in the - selection-related code. + selection-related code (thanks to Johann Oberdorfer for testing and + discussions on this subject). 6. Adapted to some changes in future Tcl and Tk releases (for example, made sure that it works with Tcl 9.0 and Tk 8.7). From 8b89d126e903a7156700a556d66562cd1bc88930 Mon Sep 17 00:00:00 2001 From: csaba Date: Tue, 28 Aug 2018 08:49:41 +0000 Subject: [PATCH 073/150] * scripts/tablelistWidget.tcl: Bugfixes and further optimizations. --- modules/tablelist/scripts/tablelistWidget.tcl | 67 ++++++++++++++----- 1 file changed, 51 insertions(+), 16 deletions(-) diff --git a/modules/tablelist/scripts/tablelistWidget.tcl b/modules/tablelist/scripts/tablelistWidget.tcl index 3f181f1c..5ef3b9ce 100644 --- a/modules/tablelist/scripts/tablelistWidget.tcl +++ b/modules/tablelist/scripts/tablelistWidget.tcl @@ -7203,10 +7203,6 @@ proc tablelist::insertRows {win index argList updateListVar parentKey \ } upvar ::tablelist::ns${win}::data data - if {$index < $data(itemCount)} { - displayItems $win - } - if {$index < 0} { set index 0 } elseif {$index > $data(itemCount)} { @@ -7289,7 +7285,24 @@ proc tablelist::insertRows {win index argList updateListVar parentKey \ incr row incr childIdx } - lappend data(segmentsToDisplay) $index $argCount + + # + # Update or extend the list data(segmentList) + # + if {[info exists data(segmentList)]} { + set lastSegment [lindex $data(segmentList) end] + foreach {startRow rowCount} $lastSegment {} + if {$index == $startRow + $rowCount} { + incr rowCount $argCount + set data(segmentList) \ + [lreplace $data(segmentList) end end [list $startRow $rowCount]] + } else { + lappend data(segmentList) [list $index $argCount] + } + } else { + lappend data(segmentList) [list $index $argCount] + } + incr data(itemCount) $argCount set data(lastRow) [expr {$data(itemCount) - 1}] @@ -7455,7 +7468,7 @@ proc tablelist::hdr_insertRows {win index argList} { if {$multiline} { lappend insertArgs "\t\t" $colTags lappend multilineData \ - $line $col $text $colFont $pixels $alignment + $line $key $col $text $colFont $pixels $alignment } else { lappend insertArgs "\t$text\t" $colTags } @@ -7479,7 +7492,7 @@ proc tablelist::hdr_insertRows {win index argList} { # # Embed the message widgets displaying multiline elements # - foreach {line col text font pixels alignment} $multilineData { + foreach {line key col text font pixels alignment} $multilineData { findTabs $win $w $line $col $col tabIdx1 tabIdx2 set msgScript [list ::tablelist::displayText $win $key $col $text \ $font $pixels $alignment] @@ -7525,8 +7538,7 @@ proc tablelist::displayItems win { # Nothing to do if there are no items to display # upvar ::tablelist::ns${win}::data data - if {![info exists data(dispId)] || - ![info exists data(segmentsToDisplay)]} { + if {![info exists data(dispId)]} { return "" } @@ -7539,6 +7551,29 @@ proc tablelist::displayItems win { after cancel $data(dispId) ;# no harm if data(dispId) is no longer valid unset data(dispId) + if {![info exists data(segmentList)]} { + return "" + } + + # + # Keep the memory consumption within reasonable + # limits by splitting the segments into chunks + # + set chunkSize 5000 + set segmentList {} + foreach segment $data(segmentList) { + foreach {startRow rowCount} $segment {} + while {$rowCount >= $chunkSize} { + lappend segmentList [list $startRow $chunkSize] + incr startRow $chunkSize + incr rowCount -$chunkSize + } + if {$rowCount != 0} { + lappend segmentList [list $startRow $rowCount] + } + } + unset data(segmentList) + # # Insert the items into the body text widget # @@ -7551,7 +7586,8 @@ proc tablelist::displayItems win { variable pu set wasEmpty [$w compare end-1$pu == 1.0] set isEmpty $wasEmpty - foreach {startRow rowCount} $data(segmentsToDisplay) { + foreach segment $segmentList { + foreach {startRow rowCount} $segment {} set startLine [expr {$startRow + 1}] if {$isEmpty} { set isEmpty 0 @@ -7649,8 +7685,8 @@ proc tablelist::displayItems win { if {$multiline} { lappend insertArgs "\t\t" $colTags - lappend multilineData \ - $line $col $text $colFont $pixels $alignment + lappend multilineData $line $key $col $text \ + $colFont $pixels $alignment } elseif {$data(-displayondemand)} { lappend insertArgs "\t\t" $colTags } else { @@ -7718,8 +7754,8 @@ proc tablelist::displayItems win { if {$multiline} { append insertStr "\t\t" - lappend multilineData \ - $line $col $text $widgetFont $pixels $alignment + lappend multilineData $line $key $col $text \ + $widgetFont $pixels $alignment } elseif {$data(-displayondemand)} { append insertStr "\t\t" } else { @@ -7743,7 +7779,7 @@ proc tablelist::displayItems win { # # Embed the message widgets displaying multiline elements # - foreach {line col text font pixels alignment} $multilineData { + foreach {line key col text font pixels alignment} $multilineData { findTabs $win $w $line $col $col tabIdx1 tabIdx2 set msgScript [list ::tablelist::displayText $win $key $col $text \ $font $pixels $alignment] @@ -7751,7 +7787,6 @@ proc tablelist::displayItems win { $w tag add elidedWin $tabIdx2 } } - unset data(segmentsToDisplay) # # Adjust the heights of the body text widget From 65a5e1c88e4d91f68a86b44700153fa884bf0b31 Mon Sep 17 00:00:00 2001 From: csaba Date: Sat, 1 Sep 2018 14:54:56 +0000 Subject: [PATCH 074/150] * scripts/tablelistConfig.tcl: Minor changes for TIP 278 conformance. * scripts/tablelistThemes.tcl: * scripts/tablelistUtil.tcl: --- modules/tablelist/ChangeLog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/tablelist/ChangeLog b/modules/tablelist/ChangeLog index a404c209..775d0ea1 100644 --- a/modules/tablelist/ChangeLog +++ b/modules/tablelist/ChangeLog @@ -1,3 +1,9 @@ +2018-09-01 Csaba Nemethi + + * scripts/tablelistConfig.tcl: Minor changes for TIP 278 conformance. + * scripts/tablelistThemes.tcl: + * scripts/tablelistUtil.tcl: + 2018-08-28 Csaba Nemethi * CHANGES.txt: Slightly extended. From 41916c233b46b3dec7cdaf9aeb9f34a2aef4b2db Mon Sep 17 00:00:00 2001 From: csaba Date: Sat, 1 Sep 2018 14:56:03 +0000 Subject: [PATCH 075/150] * scripts/tablelistConfig.tcl: Minor changes for TIP 278 conformance. * scripts/tablelistThemes.tcl: * scripts/tablelistUtil.tcl: --- modules/tablelist/scripts/tablelistConfig.tcl | 4 ++-- modules/tablelist/scripts/tablelistThemes.tcl | 16 ++++++++-------- modules/tablelist/scripts/tablelistUtil.tcl | 10 +++++----- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/modules/tablelist/scripts/tablelistConfig.tcl b/modules/tablelist/scripts/tablelistConfig.tcl index d253bf41..e73dd872 100644 --- a/modules/tablelist/scripts/tablelistConfig.tcl +++ b/modules/tablelist/scripts/tablelistConfig.tcl @@ -133,8 +133,8 @@ proc tablelist::extendConfigSpecs {} { 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} { + if {[info exists ::tile::patchlevel] && + [string compare $::tile::patchlevel "0.6.4"] < 0} { style layout TablelistHeader.TLabel { Treeheading.cell Label.padding -children { diff --git a/modules/tablelist/scripts/tablelistThemes.tcl b/modules/tablelist/scripts/tablelistThemes.tcl index 9d8d5fa6..a63f8088 100644 --- a/modules/tablelist/scripts/tablelistThemes.tcl +++ b/modules/tablelist/scripts/tablelistThemes.tcl @@ -423,8 +423,8 @@ proc tablelist::classicTheme {} { -treestyle gtk \ ] - if {[info exists tile::version] && - [string compare $tile::version 0.8] < 0} { + if {[info exists ::tile::version] && + [string compare $::tile::version 0.8] < 0} { set themeDefaults(-font) TkClassicDefaultFont set themeDefaults(-labelfont) TkClassicDefaultFont } @@ -1734,8 +1734,8 @@ proc tablelist::xpnativeTheme {} { set arrowStyle flat9x5 set treeStyle winxpBlue - if {[info exists tile::version] && - [string compare $tile::version 0.7] < 0} { + if {[info exists ::tile::version] && + [string compare $::tile::version 0.7] < 0} { set labelBd 0 } } @@ -1753,8 +1753,8 @@ proc tablelist::xpnativeTheme {} { set arrowStyle flat9x5 set treeStyle winxpOlive - if {[info exists tile::version] && - [string compare $tile::version 0.7] < 0} { + if {[info exists ::tile::version] && + [string compare $::tile::version 0.7] < 0} { set labelBd 0 } } @@ -1772,8 +1772,8 @@ proc tablelist::xpnativeTheme {} { set arrowStyle flat9x5 set treeStyle winxpSilver - if {[info exists tile::version] && - [string compare $tile::version 0.7] < 0} { + if {[info exists ::tile::version] && + [string compare $::tile::version 0.7] < 0} { set labelBd 0 } } diff --git a/modules/tablelist/scripts/tablelistUtil.tcl b/modules/tablelist/scripts/tablelistUtil.tcl index b8f2ee8d..6221083e 100644 --- a/modules/tablelist/scripts/tablelistUtil.tcl +++ b/modules/tablelist/scripts/tablelistUtil.tcl @@ -61,10 +61,10 @@ namespace eval tablelist { # Returns the current tile theme. #------------------------------------------------------------------------------ proc tablelist::getCurrentTheme {} { - if {[info exists ttk::currentTheme]} { - return $ttk::currentTheme - } elseif {[info exists tile::currentTheme]} { - return $tile::currentTheme + if {[info exists ::ttk::currentTheme]} { + return $::ttk::currentTheme + } elseif {[info exists ::tile::currentTheme]} { + return $::tile::currentTheme } else { return "" } @@ -6729,7 +6729,7 @@ proc tablelist::makeTileCheckbutton w { xpnative { set height [winfo reqheight $w] $frm configure -width $height -height $height - if {[info exists tile::version]} { + if {[info exists ::tile::version]} { place $w -x -2 } else { place $w -x 0 From eeaaf1ef67fe67f422f2ed53329bacd5d6dcdbe1 Mon Sep 17 00:00:00 2001 From: csaba Date: Wed, 19 Sep 2018 16:39:51 +0000 Subject: [PATCH 076/150] * CHANGES.txt: Slightly extended. * scripts/tablelistConfig.tcl: Fixed a bug related to the "rowconfigure" * scripts/tablelistWidget.tcl: subcommand, introduced in Tablelist 6.0. --- modules/tablelist/ChangeLog | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/tablelist/ChangeLog b/modules/tablelist/ChangeLog index 775d0ea1..f5e4acf2 100644 --- a/modules/tablelist/ChangeLog +++ b/modules/tablelist/ChangeLog @@ -1,3 +1,10 @@ +2018-09-19 Csaba Nemethi + + * CHANGES.txt: Slightly extended. + + * scripts/tablelistConfig.tcl: Fixed a bug related to the "rowconfigure" + * scripts/tablelistWidget.tcl: subcommand, introduced in Tablelist 6.0. + 2018-09-01 Csaba Nemethi * scripts/tablelistConfig.tcl: Minor changes for TIP 278 conformance. From ccf23f5b6a4124611f1b7d06a49027e297a1725a Mon Sep 17 00:00:00 2001 From: csaba Date: Wed, 19 Sep 2018 16:41:15 +0000 Subject: [PATCH 077/150] * CHANGES.txt: Slightly extended. --- modules/tablelist/CHANGES.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/tablelist/CHANGES.txt b/modules/tablelist/CHANGES.txt index 2ae855d3..3228c8d0 100644 --- a/modules/tablelist/CHANGES.txt +++ b/modules/tablelist/CHANGES.txt @@ -46,7 +46,10 @@ What is new in Tablelist 6.3? 11. Fixed a bug related to the tooltip support (thanks to Bo Berggren for his bug report). -12. Numerous further improvements and minor bug fixes. +12. Fixed a bug related to the "rowconfigure" subcommand, introduced in + Tablelist version 6.0 (thanks to Ulrich Seidl for his bug report). + +13. Numerous further improvements and minor bug fixes. What was new in Tablelist 6.2? ------------------------------ From 1269661c64a17a1d03c05ee4276e92e147f2a32c Mon Sep 17 00:00:00 2001 From: csaba Date: Wed, 19 Sep 2018 16:42:27 +0000 Subject: [PATCH 078/150] * scripts/tablelistConfig.tcl: Fixed a bug related to the "rowconfigure" * scripts/tablelistWidget.tcl: subcommand, introduced in Tablelist 6.0. --- modules/tablelist/scripts/tablelistConfig.tcl | 6 +++--- modules/tablelist/scripts/tablelistWidget.tcl | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/tablelist/scripts/tablelistConfig.tcl b/modules/tablelist/scripts/tablelistConfig.tcl index e73dd872..41a9ad53 100644 --- a/modules/tablelist/scripts/tablelistConfig.tcl +++ b/modules/tablelist/scripts/tablelistConfig.tcl @@ -2165,7 +2165,7 @@ proc tablelist::doRowConfig {row win opt val} { # set tag row$opt-$val $w tag configure $tag $opt $val - $w tag lower $tag disabled + $w tag lower $tag active # # Save val in data($name) @@ -2328,7 +2328,7 @@ proc tablelist::doRowConfig {row win opt val} { # set tag row$opt-$val $w tag configure $tag $opt $val - $w tag lower $tag disabled + $w tag lower $tag active set line [expr {$row + $diff}] $w tag add $tag $line.0 $line.end @@ -2662,7 +2662,7 @@ proc tablelist::doRowConfig {row win opt val} { 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 disabled + $w tag lower $tag active # # Save val in data($name) diff --git a/modules/tablelist/scripts/tablelistWidget.tcl b/modules/tablelist/scripts/tablelistWidget.tcl index 5ef3b9ce..9ec99f69 100644 --- a/modules/tablelist/scripts/tablelistWidget.tcl +++ b/modules/tablelist/scripts/tablelistWidget.tcl @@ -939,6 +939,7 @@ proc tablelist::tablelist args { $w tag add noSpacings 1.0 $w tag configure tinyFont -font "Courier -1" $w tag add tinyFont 1.0 end + $w tag configure active -borderwidth "" ;# used for the priority order $w tag configure disabled -foreground "" ;# will be changed $w tag configure hiddenCol -elide 1 ;# used for hiding a column $w tag configure elidedCol -elide 1 ;# used for horizontal scrolling From a057a7f8361cccf8186a5c390b272452dc0b488f Mon Sep 17 00:00:00 2001 From: Keith Nash Date: Fri, 21 Sep 2018 12:28:19 +0000 Subject: [PATCH 079/150] Bugfix to widgetPlus - adapt to stricter error checking in lreplace; bump version to 1.0b2 --- modules/widgetPlus/pkgIndex.tcl | 2 +- modules/widgetPlus/widgetPlus.tcl | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/widgetPlus/pkgIndex.tcl b/modules/widgetPlus/pkgIndex.tcl index 70950b28..72ffaa8f 100644 --- a/modules/widgetPlus/pkgIndex.tcl +++ b/modules/widgetPlus/pkgIndex.tcl @@ -1 +1 @@ -package ifneeded widgetPlus 1.0b1 [list source [file join $dir widgetPlus.tcl]] +package ifneeded widgetPlus 1.0b2 [list source [file join $dir widgetPlus.tcl]] diff --git a/modules/widgetPlus/widgetPlus.tcl b/modules/widgetPlus/widgetPlus.tcl index d9d998fb..716e3bbd 100644 --- a/modules/widgetPlus/widgetPlus.tcl +++ b/modules/widgetPlus/widgetPlus.tcl @@ -1503,7 +1503,10 @@ method {edit reset} {} { method Push {new} { incr My(,pointer) - set My(,list) [lreplace $My(,list) $My(,pointer) end $new] + if {$My(,pointer) < [llength $My(,list)]} { + set My(,list) [lreplace $My(,list) $My(,pointer) end] + } + lappend My(,list) $new $self ResizeStack return @@ -1670,4 +1673,4 @@ method selection {args} { #indent+4 } -package provide widgetPlus 1.0b1 +package provide widgetPlus 1.0b2 From 7c63825470840af954dfdc35f405cb040f6b7c4a Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 8 Oct 2018 11:28:45 +0000 Subject: [PATCH 080/150] * *.tcl: Bumped the version number to 3.6; adapted to some changes in future Tcl and Tk releases (TIP 278, independent Tcl and Tk versions); updated the copyright information. * COPYRIGHT.txt: Bumped the version number to 3.6. * README.txt: * CHANGES.txt: Updated to reflect the changes. * doc/*.html: * doc/*.png: Updated the screenshots. * scripts/*.tcl: Adapted to TIP 278; updated the copyright information. * scripts/tclIndex: Newly generated. * ../../examples/wcb/*.tcl: Various updates. --- modules/wcb/ChangeLog | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/modules/wcb/ChangeLog b/modules/wcb/ChangeLog index fc0febb5..8f6c656b 100644 --- a/modules/wcb/ChangeLog +++ b/modules/wcb/ChangeLog @@ -1,3 +1,23 @@ +2018-10-08 Csaba Nemethi + + * *.tcl: Bumped the version number to 3.6; adapted to some changes in + future Tcl and Tk releases (TIP 278, independent Tcl and Tk versions); + updated the copyright information. + + * COPYRIGHT.txt: Bumped the version number to 3.6. + * README.txt: + + * CHANGES.txt: Updated to reflect the changes. + * doc/*.html: + + * doc/*.png: Updated the screenshots. + + * scripts/*.tcl: Adapted to TIP 278; updated the copyright information. + + * scripts/tclIndex: Newly generated. + + * ../../examples/wcb/*.tcl: Various updates. + 2014-02-16 Csaba Nemethi * *.tcl: Bumped the version number to 3.5. From f861b5986101049a1465ddd5ff8b8917258f3e61 Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 8 Oct 2018 11:29:59 +0000 Subject: [PATCH 081/150] * *.tcl: Bumped the version number to 3.6; adapted to some changes in future Tcl and Tk releases (TIP 278, independent Tcl and Tk versions); updated the copyright information. --- modules/wcb/pkgIndex.tcl | 6 +++--- modules/wcb/wcb.tcl | 23 +++++++++++------------ 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/modules/wcb/pkgIndex.tcl b/modules/wcb/pkgIndex.tcl index dae5b069..fb4e604e 100644 --- a/modules/wcb/pkgIndex.tcl +++ b/modules/wcb/pkgIndex.tcl @@ -1,15 +1,15 @@ #============================================================================== # Wcb package index file. # -# Copyright (c) 1999-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 1999-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # # Regular package: # -package ifneeded wcb 3.5 [list source [file join $dir wcb.tcl]] +package ifneeded wcb 3.6 [list source [file join $dir wcb.tcl]] # # Alias: # -package ifneeded Wcb 3.5 { package require -exact wcb 3.5 } +package ifneeded Wcb 3.6 { package require -exact wcb 3.6 } diff --git a/modules/wcb/wcb.tcl b/modules/wcb/wcb.tcl index a7578bd8..5a863cc0 100644 --- a/modules/wcb/wcb.tcl +++ b/modules/wcb/wcb.tcl @@ -1,19 +1,18 @@ #============================================================================== # Main Wcb package module. # -# Copyright (c) 1999-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 1999-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require Tcl 8 -package require Tk 8 +package require Tk 8 namespace eval wcb { # # Public variables: # - variable version 3.5 + variable version 3.6 variable library - if {$tcl_version >= 8.4} { + if {$::tcl_version >= 8.4} { set library [file dirname [file normalize [info script]]] } else { set library [file dirname [info script]] ;# no "file normalize" yet @@ -26,29 +25,29 @@ namespace eval wcb { extend replace pathname # - # Utility procedures for Tk entry, tile entry, - # BWidget Entry, spinbox, and tile combobox widgets: + # Utility procedures for Tk entry, tile entry, BWidget Entry, + # Tk spinbox, tile spinbox, and tile combobox widgets: # namespace export changeEntryText postInsertEntryLen \ postInsertEntryText postDeleteEntryText # - # Simple before-insert callback routines for Tk entry, tile - # entry, BWidget Entry, spinbox, and tile combobox widgets: + # Simple before-insert callback routines for Tk entry, tile entry, + # BWidget Entry, Tk spinbox, tile spinbox, and tile combobox widgets: # namespace export checkStrForRegExp checkStrForAlpha checkStrForNum \ checkStrForAlnum convStrToUpper convStrToLower # - # Further before-insert callback routines for Tk entry, tile - # entry, BWidget Entry, spinbox, and tile combobox widgets: + # Further before-insert callback routines for Tk entry, tile entry, + # BWidget Entry, Tk spinbox, tile spinbox, and tile combobox widgets: # namespace export checkEntryForInt checkEntryForUInt \ checkEntryForReal checkEntryForFixed \ checkEntryLen # - # Simple before-insert callback routines for text widgets: + # Simple before-insert callback routines for text and ctext widgets: # namespace export checkStrsForRegExp checkStrsForAlpha checkStrsForNum \ checkStrsForAlnum convStrsToUpper convStrsToLower From acd666068788753082b0f8151360a92dd2b4d18a Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 8 Oct 2018 11:30:52 +0000 Subject: [PATCH 082/150] * COPYRIGHT.txt: Bumped the version number to 3.6. * README.txt: --- modules/wcb/COPYRIGHT.txt | 4 ++-- modules/wcb/README.txt | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/modules/wcb/COPYRIGHT.txt b/modules/wcb/COPYRIGHT.txt index 871cb826..00dff62a 100644 --- a/modules/wcb/COPYRIGHT.txt +++ b/modules/wcb/COPYRIGHT.txt @@ -1,5 +1,5 @@ -Widget callback package Wcb, version 3.5 -Copyright (c) 1999-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +Widget callback package Wcb, version 3.6 +Copyright (c) 1999-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) This library is free software; you can use, modify, and redistribute it for any purpose, provided that existing copyright notices are retained diff --git a/modules/wcb/README.txt b/modules/wcb/README.txt index 687b8464..2d6c76aa 100644 --- a/modules/wcb/README.txt +++ b/modules/wcb/README.txt @@ -7,7 +7,7 @@ csaba.nemethi@t-online.de -What is Wcb? +What Is Wcb? ------------ Wcb is a library package for Tcl/Tk versions 8.0 or higher, written in @@ -65,14 +65,14 @@ well as ready-to-use before-insert callbacks for Tk entry, tile entry, BWidget Entry, Tk spinbox, tile spinbox, tile combobox, text, and ctext widgets. -How to get it? +How to Get It? -------------- Wcb is available for free download from the Web page http://www.nemethi.de -The distribution file is "wcb3.5.tar.gz" for UNIX and "wcb3_5.zip" for +The distribution file is "wcb3.6.tar.gz" for UNIX and "wcb3_6.zip" for Windows. These files contain the same information, except for the additional carriage return character preceding the linefeed at the end of each line in the text files for Windows. @@ -81,7 +81,7 @@ Wcb is also included in tklib, which has the address http://core.tcl.tk/tklib -How to install it? +How to Install It? ------------------ Install the package as a subdirectory of one of the directories given @@ -91,18 +91,18 @@ locations of these library directories are given by the "tcl_library" and "tk_library" variables, respectively. To install Wcb on UNIX, "cd" to the desired directory and unpack the -distribution file "wcb3.5.tar.gz": +distribution file "wcb3.6.tar.gz": - gunzip -c wcb3.5.tar.gz | tar -xf - + gunzip -c wcb3.6.tar.gz | tar -xf - -This command will create a directory named "wcb3.5", with the +This command will create a directory named "wcb3.6", with the subdirectories "demos", "doc", and "scripts". On Windows, use WinZip or some other program capable of unpacking the -distribution file "wcb3_5.zip" into the directory "wcb3.5", with the +distribution file "wcb3_6.zip" into the directory "wcb3.6", with the subdirectories "demos", "doc", and "scripts". -How to use it? +How to Use It? -------------- To be able to use the commands and variables implemented in the package From a2f986029805da8cf160b676abe3ed506ff7d7f6 Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 8 Oct 2018 11:31:57 +0000 Subject: [PATCH 083/150] * CHANGES.txt: Updated to reflect the changes. * doc/*.html: --- modules/wcb/CHANGES.txt | 10 +++++++++- modules/wcb/doc/index.html | 4 ++-- modules/wcb/doc/wcb.html | 26 +++++++++++++------------- modules/wcb/doc/wcbRef.html | 2 +- 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/modules/wcb/CHANGES.txt b/modules/wcb/CHANGES.txt index 27ce7aec..8af6e892 100644 --- a/modules/wcb/CHANGES.txt +++ b/modules/wcb/CHANGES.txt @@ -1,6 +1,14 @@ -What is new in Wcb 3.5? +What is new in Wcb 3.6? ----------------------- +1. Adapted to some changes in future Tcl and Tk releases (for example, + made sure that it works with Tcl 9.0 and Tk 8.7). + +2. Updated the demo-scripts and the documentation. + +What was new in Wcb 3.5? +------------------------ + 1. Support for the tile treeview widget. 2. Minor performance improvements. diff --git a/modules/wcb/doc/index.html b/modules/wcb/doc/index.html index 63176642..e93f474a 100644 --- a/modules/wcb/doc/index.html +++ b/modules/wcb/doc/index.html @@ -1,6 +1,6 @@ - The Widget Callback Package Wcb 3.5 + The Widget Callback Package Wcb 3.6
    -

    The Widget Callback Package Wcb 3.5

    +

    The Widget Callback Package Wcb 3.6

    by

    diff --git a/modules/wcb/doc/wcb.html b/modules/wcb/doc/wcb.html index 6770e2b1..adc88c6f 100644 --- a/modules/wcb/doc/wcb.html +++ b/modules/wcb/doc/wcb.html @@ -13,7 +13,7 @@

    Wcb Programmer's Guide

    -

    For Wcb Version 3.5

    +

    For Wcb Version 3.6

    by

    @@ -161,8 +161,8 @@

    How to Get It?

    -

    The distribution file is wcb3.5.tar.gz for UNIX and - wcb3_5.zip for Windows.  These files contain the same +

    The distribution file is wcb3.6.tar.gz for UNIX and + wcb3_6.zip for Windows.  These files contain the same information, except for the additional carriage return character preceding the linefeed at the end of each line in the text files for Windows.

    @@ -184,21 +184,21 @@

    How to Install It?

    respectively.

    To install Wcb on UNIX, cd to the desired directory - and unpack the distribution file wcb3.5.tar.gz:

    + and unpack the distribution file wcb3.6.tar.gz:

    -gunzip -c wcb3.5.tar.gz | tar -xf -
    +gunzip -c wcb3.6.tar.gz | tar -xf -
     
    -

    This command will create a directory named wcb3.5, with the +

    This command will create a directory named wcb3.6, with the subdirectories demos, doc, and scripts.

    On Windows, use WinZip or some other program capable of unpacking - the distribution file wcb3_5.zip into the directory - wcb3.5, with the subdirectories demos, + the distribution file wcb3_6.zip into the directory + wcb3.6, with the subdirectories demos, doc, and scripts.

    Notice that in tklib the Wcb demos directory is replaced with @@ -280,7 +280,7 @@

    Some before-insert Callbacks for entry figure:

    - entrytest + entrytest

    For the topmost entry .e1 we define two @@ -381,7 +381,7 @@

    A selset Callback for a listbox Widget

    the corresponding bitmap in the label .picture.

    - listboxtest1 + listboxtest1

    Here is the relevant code fragment from the script @@ -452,7 +452,7 @@

    An activate Callback for a listbox within the listbox.

    - listboxtest2 + listboxtest2

    To solve this problem, we can either change the selection mode to have the @@ -521,7 +521,7 @@

    Seven Callbacks for a text Widget

    creates the text widget shown in the following figure:

    - texttest1 + texttest1

    Here is the relevant code fragment:

    @@ -708,7 +708,7 @@

    Seven Callbacks for a text Widget

    shown in the following figure:

    - texttest2 + texttest2

    Most of the code contained in the script texttest2.tcl is diff --git a/modules/wcb/doc/wcbRef.html b/modules/wcb/doc/wcbRef.html index 34a37ac6..1dce6987 100644 --- a/modules/wcb/doc/wcbRef.html +++ b/modules/wcb/doc/wcbRef.html @@ -13,7 +13,7 @@

    Wcb Command Reference

    -

    For Wcb Version 3.5

    +

    For Wcb Version 3.6

    by

    From 3767848dcb287e451a43598288419c878e9b1952 Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 8 Oct 2018 11:33:15 +0000 Subject: [PATCH 084/150] * doc/*.png: Updated the screenshots. --- modules/wcb/doc/entrytest.png | Bin 4306 -> 4683 bytes modules/wcb/doc/listboxtest1.png | Bin 2771 -> 2755 bytes modules/wcb/doc/listboxtest2.png | Bin 4377 -> 4369 bytes modules/wcb/doc/texttest1.png | Bin 5748 -> 6522 bytes modules/wcb/doc/texttest2.png | Bin 5375 -> 6009 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/modules/wcb/doc/entrytest.png b/modules/wcb/doc/entrytest.png index a12330e9b24f22ee28401be8786f5882161e5f5e..46597398096902a5ea7dfc2d8c2de1ed30f7bbe9 100644 GIT binary patch literal 4683 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 QJH(=Q$4I;6*8PzG0J@mGL;wH) literal 4306 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 diff --git a/modules/wcb/doc/listboxtest1.png b/modules/wcb/doc/listboxtest1.png index 0e6cec696bbd1a47cc4688d52fb06ac5cb65ffcf..fcd9f852fa1667758fc3c56fb60ea536672f027a 100644 GIT binary patch literal 2755 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 JPDHLkV1gq+C$|6q literal 2771 zcmV;^3M}=BP)Px#!%$3AMbH2M0096H5)K<28YLzqD=aBIG8r^AGC@N?HA-quP)=e|HbY*7Zd@W@ zVqZvUlC@J&RCA!3WOs0KZ*X{|dV6?WfU~20J+gIYV}-I^hroh^fn$fe$97U=j#(AaLpQ4|FrP_$5!qcHM zh^^e8wav1$u)xBL;#2d9Y_EG010qNS#tmY4#WTe4#WYKD-Ig~011yt zL_t(|+U=bWd!jrNz?Xk7l-*^|W9hyX-wKs_?y=NeKq0~rzW=AXNk9dm8ql`-Jd74d z9OI8+l8gh`PoF;B-Ija;x%+claz~K=dt3754w#>BODOY{$lS6ln{G`VYfe_9FI5>$ z&y!|rEbX`HQ055{CyFAEZasLR1FO+!{%bGu(P(mxG+Se7zg34akEuL`K`{INeLQ&z zEK>e9f2qp++xQ%5w#L$at4@V^;st?c&c;??6#6f9Ig`238cX}FIu+)Je|etwGRcFuq^KT&04MY0^g&EN&T{X{t zxh^a~O6J)E#q#q!ffw>gK1-7Mc%EQb#{SrkNhK-TW4F*LKK)l+zLo8}L~?i6{sHr^ z0)im#boS%(&%dWrRZ%5Ld6-V0$k15qqgyUsior3TkwHASaBTUhozJX%?W_|!UcquQ zPu;|JpfdIyKe0=lVxT>+^Qdg!-7VV&=+XXIyDwXvJ@fB>>~DW5sw~OcbUHi5Jo9n9 zw5+{H2?)1s=e{q}4 zw!cn&Fe#YYvGELBWNG_&?Ldu6ISWftgr&_pTbV^ZWN#YdU@S4A4(h zzlfs9JLpE8Iq{t}CV2VAUBy)FKhQ@CW~xO$;yItWX`cI5Ot90$wcHfLGWIP$oAZ)!anwgQq{yek6fx#ch zCTux#TAVu$)IURIS)@AjZOztRX}>0|Iu&MhWIxTxzNxB8nO|z^FJ+q!5gSOz>e(in zjsx$rY0-Y3+jE<~Kwzm(@#&4$UTMG1+@@2HpXXKmhe=I+GCnKlZMMeJeyh&0n16g< zmFbz0db2f__Sv`}P? zm3fEQ-_9E_X{2P>lW`!XSQqF@lW-uUK$jUh)`S2Hn}|b1iHNFc8VKJ0TBVSd}WyUJRb4zHP+ ztBrE!^uhe`f{zo-2ishK<_pR(=EETaalM%@iJW&~=K3?|Yn&u(NXzsLJMTQ0+xv2F zJ7afwDdzknbA8?0&Uvx|=2eoUOS)QTk7Os{Z<)k#vLrBm`sgJ7GK&)^Lv@n)NfP(4 zbKO05J70o1r_7J84<>$GtzfHS=f^FX zlfvH6GPn}#22m^y!FhH@=h!)0Ey2#~CNp*jjGF=bN#+(i?}vxtJ4x~6s$W)WnV}AL zUV(GQg>S5~M;AaziTDC=0(IgO&%xBzz3sgF`gh3O&(3a=Br6OoX+m6eoso{Y%%B!r zBU_SPN>CK!oGw)*k z!>)N%@kZOY(X3^(^CbhjHs(YBtw(kU)qUnF;^&Gxw2sdQZhjpx|Lb;cB453oIgV=} zpUJ!sMLEJ)<9J>$WJPjR zGcfj46c7ZQa*Cj!W4TZ^J6FF8?k2y!cHXADIFyyi(MZU!LQ}S?ju8MG(y?49t3Ow* zxn=HY=Q6EGk9m9` z9La@#fStF#L2~^?aujERkm8Nt(LTp-uqhwQg?@mY%Ty@Mo0rK^Owyh@jBz}l;)NiR z4BqRx&=0V4ODZ&z!;8;@ZFX+k9VX^xDm38rx0nYTcIME<=fO9#bLCqhcjfU0)8mTm z{3`PGpQFFhYa#Nk!ZgZEb zDPtJ=p3HAMrwq&k^T0eXUn4V1WO^jN`(WnRBh!y(-d+S+T$gqvGR+ub()VI6E&?sD z4LuT>vc#nC#avwIS6&->Br;`*Nk4#@kB&vA3^D2ZGMCqe9*Im@V$vFO-dh-%t9`IN zGG&QL>&$&^Yku6EGB6L!1M|Rqwah1Sqg~E-A21st&ua*I;-#5S84_qJFtCxx2Z4pK^Ei Z>Hlvyv*tuTN2~w<002ovPDHLkV1l_sWc~mE diff --git a/modules/wcb/doc/listboxtest2.png b/modules/wcb/doc/listboxtest2.png index ca3ed64020ef05596f5c4fbcbf5c4ddab9cd803f..05e1e9f0f1ed2b058437cbf8eb54cd9ea86bf440 100644 GIT binary patch literal 4369 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 DTsJ>( literal 4377 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 TBH!X200000NkvXXu0mjfCH%!Q diff --git a/modules/wcb/doc/texttest1.png b/modules/wcb/doc/texttest1.png index e2a1ad4fe1bdbf84fa6fb15a994286bffd996294..ebf85ac46e2612b25bb56676f775b73b2dd93432 100644 GIT binary patch literal 6522 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 Date: Mon, 8 Oct 2018 11:34:04 +0000 Subject: [PATCH 085/150] * scripts/*.tcl: Adapted to TIP 278; updated the copyright information. --- modules/wcb/scripts/wcbCommon.tcl | 2 +- modules/wcb/scripts/wcbEntry.tcl | 4 ++-- modules/wcb/scripts/wcbListbox.tcl | 2 +- modules/wcb/scripts/wcbTablelist.tcl | 2 +- modules/wcb/scripts/wcbText.tcl | 4 ++-- modules/wcb/scripts/wcbTreeview.tcl | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/wcb/scripts/wcbCommon.tcl b/modules/wcb/scripts/wcbCommon.tcl index 667bdc69..f3275ba2 100644 --- a/modules/wcb/scripts/wcbCommon.tcl +++ b/modules/wcb/scripts/wcbCommon.tcl @@ -1,7 +1,7 @@ #============================================================================== # Contains common Wcb procedures. # -# Copyright (c) 1999-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 1999-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # diff --git a/modules/wcb/scripts/wcbEntry.tcl b/modules/wcb/scripts/wcbEntry.tcl index e5db3ac6..cb77d696 100644 --- a/modules/wcb/scripts/wcbEntry.tcl +++ b/modules/wcb/scripts/wcbEntry.tcl @@ -6,7 +6,7 @@ # BWidget Entry widgets, too. Similarly, everything stated below for # spinbox widgets is valid for tile spinbox widgets, too. # -# Copyright (c) 1999-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 1999-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # @@ -18,7 +18,7 @@ namespace eval wcb { # # Some regexp patterns: # - if {$tk_version >= 8.1} { + if {$::tk_version >= 8.1} { variable alphaPat {^[[:alpha:]]*$} variable digitPat {^[[:digit:]]*$} variable alnumPat {^[[:alnum:]]*$} diff --git a/modules/wcb/scripts/wcbListbox.tcl b/modules/wcb/scripts/wcbListbox.tcl index 6fa5f125..d56ffed5 100644 --- a/modules/wcb/scripts/wcbListbox.tcl +++ b/modules/wcb/scripts/wcbListbox.tcl @@ -1,7 +1,7 @@ #============================================================================== # Contains Wcb procedures for listbox widgets. # -# Copyright (c) 1999-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 1999-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # diff --git a/modules/wcb/scripts/wcbTablelist.tcl b/modules/wcb/scripts/wcbTablelist.tcl index 71e01517..1c5f4014 100644 --- a/modules/wcb/scripts/wcbTablelist.tcl +++ b/modules/wcb/scripts/wcbTablelist.tcl @@ -1,7 +1,7 @@ #============================================================================== # Contains Wcb procedures for tablelist widgets. # -# Copyright (c) 2002-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2002-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # diff --git a/modules/wcb/scripts/wcbText.tcl b/modules/wcb/scripts/wcbText.tcl index dc529c27..f4c59179 100644 --- a/modules/wcb/scripts/wcbText.tcl +++ b/modules/wcb/scripts/wcbText.tcl @@ -4,7 +4,7 @@ # REMARK: Everything stated below for text widgets is valid for ctext widgets, # too. # -# Copyright (c) 1999-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 1999-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # @@ -16,7 +16,7 @@ namespace eval wcb { # # Some regexp patterns: # - if {$tk_version >= 8.1} { + if {$::tk_version >= 8.1} { variable alphaOrNlPat {^[[:alpha:]\n]*$} variable digitOrNlPat {^[[:digit:]\n]*$} variable alnumOrNlPat {^[[:alnum:]\n]*$} diff --git a/modules/wcb/scripts/wcbTreeview.tcl b/modules/wcb/scripts/wcbTreeview.tcl index fb555e4d..677638b2 100644 --- a/modules/wcb/scripts/wcbTreeview.tcl +++ b/modules/wcb/scripts/wcbTreeview.tcl @@ -1,7 +1,7 @@ #============================================================================== # Contains Wcb procedures for tile treeview widgets. # -# Copyright (c) 2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2014-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # From b0f554d7667ccb36a3e00d9bf28abcd99e1af31f Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 8 Oct 2018 11:34:59 +0000 Subject: [PATCH 086/150] * scripts/tclIndex: Newly generated. --- modules/wcb/scripts/tclIndex | 42 ++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/modules/wcb/scripts/tclIndex b/modules/wcb/scripts/tclIndex index f66c5cf2..39328cfc 100644 --- a/modules/wcb/scripts/tclIndex +++ b/modules/wcb/scripts/tclIndex @@ -6,14 +6,19 @@ # element name is the name of a command and the value is # a script that loads the command. -set auto_index(::wcb::tablelistWidgetCmd) [list source [file join $dir wcbTablelist.tcl]] -set auto_index(::wcb::checkStrsForRegExp) [list source [file join $dir wcbText.tcl]] -set auto_index(::wcb::checkStrsForAlpha) [list source [file join $dir wcbText.tcl]] -set auto_index(::wcb::checkStrsForNum) [list source [file join $dir wcbText.tcl]] -set auto_index(::wcb::checkStrsForAlnum) [list source [file join $dir wcbText.tcl]] -set auto_index(::wcb::convStrsToUpper) [list source [file join $dir wcbText.tcl]] -set auto_index(::wcb::convStrsToLower) [list source [file join $dir wcbText.tcl]] -set auto_index(::wcb::textWidgetCmd) [list source [file join $dir wcbText.tcl]] +set auto_index(::wcb::callback) [list source [file join $dir wcbCommon.tcl]] +set auto_index(::wcb::cbappend) [list source [file join $dir wcbCommon.tcl]] +set auto_index(::wcb::cbprepend) [list source [file join $dir wcbCommon.tcl]] +set auto_index(::wcb::cancel) [list source [file join $dir wcbCommon.tcl]] +set auto_index(::wcb::canceled) [list source [file join $dir wcbCommon.tcl]] +set auto_index(::wcb::extend) [list source [file join $dir wcbCommon.tcl]] +set auto_index(::wcb::replace) [list source [file join $dir wcbCommon.tcl]] +set auto_index(::wcb::pathname) [list source [file join $dir wcbCommon.tcl]] +set auto_index(::wcb::cleanup) [list source [file join $dir wcbCommon.tcl]] +set auto_index(::wcb::fullCallbackOpt) [list source [file join $dir wcbCommon.tcl]] +set auto_index(::wcb::areAllEmptyStrings) [list source [file join $dir wcbCommon.tcl]] +set auto_index(::wcb::redefWidgetCmd) [list source [file join $dir wcbCommon.tcl]] +set auto_index(::wcb::processCmd) [list source [file join $dir wcbCommon.tcl]] set auto_index(::wcb::changeEntryText) [list source [file join $dir wcbEntry.tcl]] set auto_index(::wcb::postInsertEntryLen) [list source [file join $dir wcbEntry.tcl]] set auto_index(::wcb::postInsertEntryText) [list source [file join $dir wcbEntry.tcl]] @@ -30,18 +35,13 @@ set auto_index(::wcb::checkEntryForReal) [list source [file join $dir wcbEntry.t set auto_index(::wcb::checkEntryForFixed) [list source [file join $dir wcbEntry.tcl]] set auto_index(::wcb::checkEntryLen) [list source [file join $dir wcbEntry.tcl]] set auto_index(::wcb::entryWidgetCmd) [list source [file join $dir wcbEntry.tcl]] -set auto_index(::wcb::callback) [list source [file join $dir wcbCommon.tcl]] -set auto_index(::wcb::cbappend) [list source [file join $dir wcbCommon.tcl]] -set auto_index(::wcb::cbprepend) [list source [file join $dir wcbCommon.tcl]] -set auto_index(::wcb::cancel) [list source [file join $dir wcbCommon.tcl]] -set auto_index(::wcb::canceled) [list source [file join $dir wcbCommon.tcl]] -set auto_index(::wcb::extend) [list source [file join $dir wcbCommon.tcl]] -set auto_index(::wcb::replace) [list source [file join $dir wcbCommon.tcl]] -set auto_index(::wcb::pathname) [list source [file join $dir wcbCommon.tcl]] -set auto_index(::wcb::cleanup) [list source [file join $dir wcbCommon.tcl]] -set auto_index(::wcb::fullCallbackOpt) [list source [file join $dir wcbCommon.tcl]] -set auto_index(::wcb::areAllEmptyStrings) [list source [file join $dir wcbCommon.tcl]] -set auto_index(::wcb::redefWidgetCmd) [list source [file join $dir wcbCommon.tcl]] -set auto_index(::wcb::processCmd) [list source [file join $dir wcbCommon.tcl]] set auto_index(::wcb::listboxWidgetCmd) [list source [file join $dir wcbListbox.tcl]] +set auto_index(::wcb::tablelistWidgetCmd) [list source [file join $dir wcbTablelist.tcl]] +set auto_index(::wcb::checkStrsForRegExp) [list source [file join $dir wcbText.tcl]] +set auto_index(::wcb::checkStrsForAlpha) [list source [file join $dir wcbText.tcl]] +set auto_index(::wcb::checkStrsForNum) [list source [file join $dir wcbText.tcl]] +set auto_index(::wcb::checkStrsForAlnum) [list source [file join $dir wcbText.tcl]] +set auto_index(::wcb::convStrsToUpper) [list source [file join $dir wcbText.tcl]] +set auto_index(::wcb::convStrsToLower) [list source [file join $dir wcbText.tcl]] +set auto_index(::wcb::textWidgetCmd) [list source [file join $dir wcbText.tcl]] set auto_index(::wcb::treeviewWidgetCmd) [list source [file join $dir wcbTreeview.tcl]] From 4f2ce2c39df31508aac2dbb2a9813bd132e64a20 Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 8 Oct 2018 11:35:58 +0000 Subject: [PATCH 087/150] * ../../examples/wcb/*.tcl: Various updates. --- examples/wcb/entrytest.tcl | 4 ++-- examples/wcb/listboxtest1.tcl | 4 ++-- examples/wcb/listboxtest2.tcl | 4 ++-- examples/wcb/option.tcl | 4 ++-- examples/wcb/texttest1.tcl | 4 ++-- examples/wcb/texttest2.tcl | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/examples/wcb/entrytest.tcl b/examples/wcb/entrytest.tcl index cb65985d..2e31b4a4 100755 --- a/examples/wcb/entrytest.tcl +++ b/examples/wcb/entrytest.tcl @@ -1,11 +1,11 @@ #!/usr/bin/env wish -## -*- tcl -*- + #============================================================================== # Demo: wcb::callback before insert ... # wcb::postInsertEntryText # wcb::cancel # -# Copyright (c) 1999-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 1999-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== package require wcb diff --git a/examples/wcb/listboxtest1.tcl b/examples/wcb/listboxtest1.tcl index 0a89a541..0118e213 100755 --- a/examples/wcb/listboxtest1.tcl +++ b/examples/wcb/listboxtest1.tcl @@ -1,9 +1,9 @@ #!/usr/bin/env wish -## -*- tcl -*- + #============================================================================== # Demo: wcb::callback before selset # -# Copyright (c) 1999-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 1999-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== package require wcb diff --git a/examples/wcb/listboxtest2.tcl b/examples/wcb/listboxtest2.tcl index 93edce2d..82ac4df2 100755 --- a/examples/wcb/listboxtest2.tcl +++ b/examples/wcb/listboxtest2.tcl @@ -1,9 +1,9 @@ #!/usr/bin/env wish -## -*- tcl -*- + #============================================================================== # Demo: wcb::callback before activate # -# Copyright (c) 1999-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 1999-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== package require wcb diff --git a/examples/wcb/option.tcl b/examples/wcb/option.tcl index de0e56ee..cf1a7d39 100644 --- a/examples/wcb/option.tcl +++ b/examples/wcb/option.tcl @@ -1,7 +1,7 @@ #============================================================================== # Contains some Tk option database settings. # -# Copyright (c) 2010-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2010-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # @@ -26,7 +26,7 @@ switch $winSys { catch {font create TkDefaultFont -family Helvetica -size -12} option add *Font TkDefaultFont - option add *selectBackground #678db2 + option add *selectBackground #5294e2 option add *selectForeground white } classic { diff --git a/examples/wcb/texttest1.tcl b/examples/wcb/texttest1.tcl index 9a2c354d..bea08a22 100755 --- a/examples/wcb/texttest1.tcl +++ b/examples/wcb/texttest1.tcl @@ -1,5 +1,5 @@ #!/usr/bin/env wish -## -*- tcl -*- + #============================================================================== # Demo: wcb::callback before insert ... # wcb::callback before delete @@ -10,7 +10,7 @@ # wcb::cancel # wcb::extend # -# Copyright (c) 1999-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 1999-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== package require wcb diff --git a/examples/wcb/texttest2.tcl b/examples/wcb/texttest2.tcl index 5ac1ef9d..ee89ae63 100755 --- a/examples/wcb/texttest2.tcl +++ b/examples/wcb/texttest2.tcl @@ -1,5 +1,5 @@ #!/usr/bin/env wish -## -*- tcl -*- + #============================================================================== # Demo: wcb::callback before insert ... # wcb::callback before delete @@ -10,7 +10,7 @@ # wcb::cancel # wcb::extend # -# Copyright (c) 2004-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2004-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== package require Tk 8.4 ;# because of the undo mechanism for text widgets From 6f1ed965884f581d9cd20d62779e30fdd1d7cc0a Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 8 Oct 2018 11:48:54 +0000 Subject: [PATCH 088/150] * *.tcl: Bumped the version number to 3.8; adapted to some changes in future Tcl and Tk releases (TIP 278, independent Tcl and Tk versions); updated the copyright information. * COPYRIGHT.txt: Bumped the version number to 3.8. * README.txt: * CHANGES.txt: Updated to reflect the changes. * doc/*.html: * doc/*.png: Updated the screenshots. * scripts/*.tcl: Added support for the themes "aquativo", "Arc", and "clearlooks"; updated the support for several other themes; included the same version of "mwutil.tcl" as in Tablelist release 6.3; several code improvements and minor bug fixes; updated the copyright information. * scripts/tclIndex: Newly generated. * ../../examples/mentry/*.tcl: Various updates. --- modules/mentry/ChangeLog | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/modules/mentry/ChangeLog b/modules/mentry/ChangeLog index 183ccb28..b0b1d039 100644 --- a/modules/mentry/ChangeLog +++ b/modules/mentry/ChangeLog @@ -1,3 +1,27 @@ +2018-10-08 Csaba Nemethi + + * *.tcl: Bumped the version number to 3.8; adapted to some changes in + future Tcl and Tk releases (TIP 278, independent Tcl and Tk versions); + updated the copyright information. + + * COPYRIGHT.txt: Bumped the version number to 3.8. + * README.txt: + + * CHANGES.txt: Updated to reflect the changes. + * doc/*.html: + + * doc/*.png: Updated the screenshots. + + * scripts/*.tcl: Added support for the themes "aquativo", "Arc", and + "clearlooks"; updated the support for several other themes; included + the same version of "mwutil.tcl" as in Tablelist release 6.3; several + code improvements and minor bug fixes; updated the copyright + information. + + * scripts/tclIndex: Newly generated. + + * ../../examples/mentry/*.tcl: Various updates. + 2014-02-16 Csaba Nemethi * *.tcl: Bumped the version number to 3.7; updated the From e2687e2c8280bde8c3b29a65ed2e0348c8f92a3e Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 8 Oct 2018 11:56:58 +0000 Subject: [PATCH 089/150] * *.tcl: Bumped the version number to 3.8; adapted to some changes in future Tcl and Tk releases (TIP 278, independent Tcl and Tk versions); updated the copyright information. --- modules/mentry/mentry.tcl | 4 ++-- modules/mentry/mentryPublic.tcl | 6 +++--- modules/mentry/mentry_tile.tcl | 7 +++---- modules/mentry/pkgIndex.tcl | 16 ++++++++-------- 4 files changed, 16 insertions(+), 17 deletions(-) diff --git a/modules/mentry/mentry.tcl b/modules/mentry/mentry.tcl index 7d0f1a58..f65a4931 100644 --- a/modules/mentry/mentry.tcl +++ b/modules/mentry/mentry.tcl @@ -1,10 +1,10 @@ #============================================================================== # Main Mentry package module. # -# Copyright (c) 1999-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 1999-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require -exact mentry::common 3.7 +package require -exact mentry::common 3.8 package provide Mentry $::mentry::version package provide mentry $::mentry::version diff --git a/modules/mentry/mentryPublic.tcl b/modules/mentry/mentryPublic.tcl index 8c2d13d0..afbdff8a 100644 --- a/modules/mentry/mentryPublic.tcl +++ b/modules/mentry/mentryPublic.tcl @@ -1,7 +1,7 @@ #============================================================================== # Main Mentry and Mentry_tile package module. # -# Copyright (c) 1999-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 1999-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== if {[catch {package require Wcb 3.1} result1] != 0 && @@ -13,9 +13,9 @@ namespace eval ::mentry { # # Public variables: # - variable version 3.7 + variable version 3.8 variable library - if {$tcl_version >= 8.4} { + if {$::tcl_version >= 8.4} { set library [file normalize [DIR]] } else { set library [DIR] ;# no "file normalize" yet diff --git a/modules/mentry/mentry_tile.tcl b/modules/mentry/mentry_tile.tcl index 4a74ab7c..bff7dc4c 100644 --- a/modules/mentry/mentry_tile.tcl +++ b/modules/mentry/mentry_tile.tcl @@ -1,15 +1,14 @@ #============================================================================== # Main Mentry_tile package module. # -# Copyright (c) 1999-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 1999-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require Tcl 8.4 -package require Tk 8.4 +package require Tk 8.4 if {$::tk_version < 8.5 || [regexp {^8\.5a[1-5]$} $::tk_patchLevel]} { package require tile 0.6 } -package require -exact mentry::common 3.7 +package require -exact mentry::common 3.8 package provide Mentry_tile $::mentry::version package provide mentry_tile $::mentry::version diff --git a/modules/mentry/pkgIndex.tcl b/modules/mentry/pkgIndex.tcl index 10122621..5c91ad9a 100644 --- a/modules/mentry/pkgIndex.tcl +++ b/modules/mentry/pkgIndex.tcl @@ -1,28 +1,28 @@ #============================================================================== # Mentry and Mentry_tile package index file. # -# Copyright (c) 1999-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 1999-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # # Regular packages: # -package ifneeded mentry 3.7 \ +package ifneeded mentry 3.8 \ [list source [file join $dir mentry.tcl]] -package ifneeded mentry_tile 3.7 \ +package ifneeded mentry_tile 3.8 \ [list source [file join $dir mentry_tile.tcl]] # # Aliases: # -package ifneeded Mentry 3.7 \ - [list package require -exact mentry 3.7] -package ifneeded Mentry_tile 3.7 \ - [list package require -exact mentry_tile 3.7] +package ifneeded Mentry 3.8 \ + [list package require -exact mentry 3.8] +package ifneeded Mentry_tile 3.8 \ + [list package require -exact mentry_tile 3.8] # # Code common to all packages: # -package ifneeded mentry::common 3.7 \ +package ifneeded mentry::common 3.8 \ "namespace eval ::mentry { proc DIR {} {return [list $dir]} } ;\ source [list [file join $dir mentryPublic.tcl]]" From 5a347957db8950cea48946c84dc455d00eeb321d Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 8 Oct 2018 11:57:40 +0000 Subject: [PATCH 090/150] * COPYRIGHT.txt: Bumped the version number to 3.8. * README.txt: --- modules/mentry/COPYRIGHT.txt | 4 ++-- modules/mentry/README.txt | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/modules/mentry/COPYRIGHT.txt b/modules/mentry/COPYRIGHT.txt index d54dac7d..56f8d16c 100644 --- a/modules/mentry/COPYRIGHT.txt +++ b/modules/mentry/COPYRIGHT.txt @@ -1,5 +1,5 @@ -Multi-entry widget package Mentry, version 3.7 -Copyright (c) 1999-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +Multi-entry widget package Mentry, version 3.8 +Copyright (c) 1999-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) This library is free software; you can use, modify, and redistribute it for any purpose, provided that existing copyright notices are retained diff --git a/modules/mentry/README.txt b/modules/mentry/README.txt index 371fcdfa..95c02984 100644 --- a/modules/mentry/README.txt +++ b/modules/mentry/README.txt @@ -7,7 +7,7 @@ csaba.nemethi@t-online.de -What is Mentry? +What Is Mentry? --------------- Mentry is a library package for Tcl/Tk versions 8.0 or higher, written @@ -50,11 +50,11 @@ is http://www.nemethi.de -How to get it? +How to Get It? -------------- Mentry is available for free download from the same URL as Wcb. The -distribution file is "mentry3.7.tar.gz" for UNIX and "mentry3_7.zip" +distribution file is "mentry3.8.tar.gz" for UNIX and "mentry3_8.zip" for Windows. These files contain the same information, except for the additional carriage return character preceding the linefeed at the end of each line in the text files for Windows. @@ -63,7 +63,7 @@ Mentry is also included in tklib, which has the address http://core.tcl.tk/tklib -How to install it? +How to Install It? ------------------ Install the package as a subdirectory of one of the directories given @@ -73,21 +73,21 @@ locations of these library directories are given by the "tcl_library" and "tk_library" variables, respectively. To install Mentry on UNIX, "cd" to the desired directory and unpack the -distribution file "mentry3.7.tar.gz": +distribution file "mentry3.8.tar.gz": - gunzip -c mentry3.7.tar.gz | tar -xf - + gunzip -c mentry3.8.tar.gz | tar -xf - -This command will create a directory named "mentry3.7", with the +This command will create a directory named "mentry3.8", with the subdirectories "demos", "doc", and "scripts". On Windows, use WinZip or some other program capable of unpacking the -distribution file "mentry3_7.zip" into the directory "mentry3.7", with +distribution file "mentry3_8.zip" into the directory "mentry3.8", with the subdirectories "demos", "doc", and "scripts". The file "mentryThemes.tcl" in the "scripts" directory is only needed for applications using the package Mentry_tile (see next section). -How to use it? +How to Use It? -------------- The Mentry distribution provides two packages, called Mentry and From 22e24b37ececbe23e9816b2e39dca68b6c17548a Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 8 Oct 2018 11:58:52 +0000 Subject: [PATCH 091/150] * CHANGES.txt: Updated to reflect the changes. * doc/*.html: --- modules/mentry/CHANGES.txt | 18 +++++++++- modules/mentry/doc/index.html | 4 +-- modules/mentry/doc/mentry.html | 44 ++++++++++++------------ modules/mentry/doc/mentryDateTime.html | 2 +- modules/mentry/doc/mentryFixedPoint.html | 2 +- modules/mentry/doc/mentryIPAddr.html | 2 +- modules/mentry/doc/mentryIPv6Addr.html | 2 +- modules/mentry/doc/mentryThemes.html | 2 +- modules/mentry/doc/mentryWidget.html | 16 ++++++--- modules/mentry/doc/wcbRef.html | 2 +- 10 files changed, 58 insertions(+), 36 deletions(-) diff --git a/modules/mentry/CHANGES.txt b/modules/mentry/CHANGES.txt index d7033813..ebca6d6e 100644 --- a/modules/mentry/CHANGES.txt +++ b/modules/mentry/CHANGES.txt @@ -1,6 +1,22 @@ -What is new in Mentry 3.7? +What is new in Mentry 3.8? -------------------------- +1. Added support for the themes "aquativo", "Arc", and "clearlooks"; + updated the support for several other themes. + +2. Adapted to some changes in future Tcl and Tk releases (for example, + made sure that it works with Tcl 9.0 and Tk 8.7). + +3. Included the same version of the general mega-widget utility module + "mwutil.tcl" as in the most recent Tablelist release 6.3. + +4. Updated the demo-scripts and the documentation. + +5. Several code improvements and minor bug fixes. + +What was new in Mentry 3.7? +--------------------------- + 1. Minor performance improvements. 2. Included the same version of the general mega-widget utility module diff --git a/modules/mentry/doc/index.html b/modules/mentry/doc/index.html index 0a4d7bf1..dd7fcddf 100644 --- a/modules/mentry/doc/index.html +++ b/modules/mentry/doc/index.html @@ -1,6 +1,6 @@ - The Multi-Entry Widget Package Mentry 3.7 + The Multi-Entry Widget Package Mentry 3.8 @@ -8,7 +8,7 @@
    -

    The Multi-Entry Widget Package Mentry 3.7

    +

    The Multi-Entry Widget Package Mentry 3.8

    by

    diff --git a/modules/mentry/doc/mentry.html b/modules/mentry/doc/mentry.html index f12231c9..489c5d5f 100644 --- a/modules/mentry/doc/mentry.html +++ b/modules/mentry/doc/mentry.html @@ -12,7 +12,7 @@

    Mentry Programmer's Guide

    -

    For Mentry Version 3.7

    +

    For Mentry Version 3.8

    by

    @@ -29,7 +29,7 @@

    Contents

    Overview

      -
    • What is Mentry?
    • +
    • What Is Mentry?
    • How to Get It?
    • @@ -60,7 +60,7 @@

      Examples

      Overview

      -

      What is Mentry?

      +

      What Is Mentry?

      Mentry is a library package for Tcl/Tk versions 8.0 or higher, written in pure Tcl/Tk code.  It contains:

      @@ -145,8 +145,8 @@

      What is Mentry?

      How to Get It?

      Mentry is available for free download from the same URL as Wcb.  The - distribution file is mentry3.7.tar.gz for UNIX and - mentry3_7.zip for Windows.  These files contain the same + distribution file is mentry3.8.tar.gz for UNIX and + mentry3_8.zip for Windows.  These files contain the same information, except for the additional carriage return character preceding the linefeed at the end of each line in the text files for Windows.

      @@ -168,21 +168,21 @@

      How to Install It?

      respectively.

      To install Mentry on UNIX, cd to the desired directory - and unpack the distribution file mentry3.7.tar.gz:

      + and unpack the distribution file mentry3.8.tar.gz:

      -gunzip -c mentry3.7.tar.gz | tar -xf -
      +gunzip -c mentry3.8.tar.gz | tar -xf -
       
      -

      This command will create a directory named mentry3.7, with +

      This command will create a directory named mentry3.8, with the subdirectories demos, doc, and scripts.

      On Windows, use WinZip or some other program capable of unpacking - the distribution file mentry3_7.zip into the directory - mentry3.7, with the subdirectories demos, + the distribution file mentry3_8.zip into the directory + mentry3.8, with the subdirectories demos, doc, and scripts.

      The file mentryThemes.tcl in the scripts @@ -608,7 +608,7 @@

      A mentry Widget for Phone Numbers

      application displaying the following figure:

      - Phone Number + Phone Number

      Here is the relevant code fragment:

      @@ -661,7 +661,7 @@

      A mentry Widget for Phone Numbers

      # # Label .num displaying the result of getPhoneNumber # -label .num -textvariable num +label .num -textvariable num -background white . . . @@ -818,8 +818,8 @@

      A mentry Widget for Ethernet Addresses

      Ethernet addresses looks like in the following figure:

      - Ethernet Address + Ethernet Address

      Using mentry Widgets for Date and Time

      @@ -941,7 +941,7 @@

      Using mentry Widgets for Date and Time

      2  and  timeIdx = 1:

      - Date & Time + Date & Time

      The demo script datetime2.tcl displays both the date and time @@ -963,7 +963,7 @@

      Using mentry Widgets for Date and Time

      - Date & Time + Date & Time

      The Mentry package exports two further commands for date, time, and date @@ -1043,7 +1043,7 @@

      Using mentry Widgets for Date and Time

      # # Label .dateTime displaying the result of mentry::getClockVal # -label .dateTime -textvariable dateTime +label .dateTime -textvariable dateTime -background white . . . @@ -1060,7 +1060,7 @@

      Using mentry Widgets for Date and Time

      of the -base option when passing the name of the time mentry to the same procedure.

      -

      The demo script datetime2.tcl is more simple:

      +

      The demo script datetime2.tcl is simpler:

      @@ -1082,7 +1082,7 @@ 

      Using mentry Widgets for Date and Time

      # # Label .dateTime displaying the result of mentry::getClockVal # -label .dateTime -textvariable dateTime +label .dateTime -textvariable dateTime -background white . . . @@ -1157,7 +1157,7 @@

      Tile-Based Demo Scripts

      # # Label .base.num displaying the result of getPhoneNumber # -ttk::label .base.num -textvariable num +ttk::label .base.num -textvariable num -background white . . . @@ -1170,8 +1170,8 @@

      Tile-Based Demo Scripts

      appearance:

      - Phone Number + Phone Number

      The only Mentry-specific change in the code above consists of the use of diff --git a/modules/mentry/doc/mentryDateTime.html b/modules/mentry/doc/mentryDateTime.html index b0618a49..1699ca85 100644 --- a/modules/mentry/doc/mentryDateTime.html +++ b/modules/mentry/doc/mentryDateTime.html @@ -12,7 +12,7 @@

      Multi-Entry Widgets for Date and Time

      -

      For Mentry Version 3.7

      +

      For Mentry Version 3.8

      by

      diff --git a/modules/mentry/doc/mentryFixedPoint.html b/modules/mentry/doc/mentryFixedPoint.html index 16a77c73..e278b621 100644 --- a/modules/mentry/doc/mentryFixedPoint.html +++ b/modules/mentry/doc/mentryFixedPoint.html @@ -13,7 +13,7 @@

      Multi-Entry Widgets for Real Numbers
      in Fixed-Point Format

      -

      For Mentry Version 3.7

      +

      For Mentry Version 3.8

      by

      diff --git a/modules/mentry/doc/mentryIPAddr.html b/modules/mentry/doc/mentryIPAddr.html index 37583883..02c985b5 100644 --- a/modules/mentry/doc/mentryIPAddr.html +++ b/modules/mentry/doc/mentryIPAddr.html @@ -12,7 +12,7 @@

      Multi-Entry Widgets for IP Addresses

      -

      For Mentry Version 3.7

      +

      For Mentry Version 3.8

      by

      diff --git a/modules/mentry/doc/mentryIPv6Addr.html b/modules/mentry/doc/mentryIPv6Addr.html index 909206b9..fb06caa7 100644 --- a/modules/mentry/doc/mentryIPv6Addr.html +++ b/modules/mentry/doc/mentryIPv6Addr.html @@ -12,7 +12,7 @@

      Multi-Entry Widgets for IPv6 Addresses

      -

      For Mentry Version 3.7

      +

      For Mentry Version 3.8

      by

      diff --git a/modules/mentry/doc/mentryThemes.html b/modules/mentry/doc/mentryThemes.html index 0fc1eb15..dfbe0612 100644 --- a/modules/mentry/doc/mentryThemes.html +++ b/modules/mentry/doc/mentryThemes.html @@ -12,7 +12,7 @@

      Commands Related to Tile Themes

      -

      For Mentry Version 3.7

      +

      For Mentry Version 3.8

      by

      diff --git a/modules/mentry/doc/mentryWidget.html b/modules/mentry/doc/mentryWidget.html index 6e99dc8c..7901d0b2 100644 --- a/modules/mentry/doc/mentryWidget.html +++ b/modules/mentry/doc/mentryWidget.html @@ -12,7 +12,7 @@

      The mentry::mentry Command

      -

      For Mentry Version 3.7

      +

      For Mentry Version 3.8

      by

      @@ -234,7 +234,7 @@

      Detailed Reference

      These options (described in the options manual entry) specify - the values of the options with the same names for all entry and label + the values of the options of the same names for all entry and label children of the given multi-entry widget.  These values may be changed for an individual child by using the configure subcommand of the Tcl command corresponding to that child.  However, @@ -251,6 +251,12 @@

      Detailed Reference

      -fg (for -foreground) are supported for both classical and tile-based mentry widgets.
      +
      REMARK:  Please take into account that for some + themes (like Arc, plastik, + tileqt, vista, and + xpnative), the -background option + will be ignored for the entry children of a tile-based mentry widget.
      +
      OPTIONS FOR ALL ENTRY CHILDREN
      @@ -264,14 +270,14 @@

      Detailed Reference

      -
      These options specify the values of the options with the same names for +
      These options specify the values of the options of the same names for all entry children of the given multi-entry widget.  These values may be changed for an individual entry child by using the configure subcommand of the Tcl command corresponding to that entry.  The -invalidcommand, -validate, and -validatecommand options are only supported if Tk version 8.3 or higher is used, because the - options with the same names for entry widgets were introduced in Tk + options of the same names for entry widgets were introduced in Tk 8.3.  The options -insertbackground, -insertborderwidth, -insertofftime, -insertontime, -insertwidth, @@ -453,7 +459,7 @@

      Detailed Reference

      This option determines whether the widget accepts the focus during keyboard traversal.  It is almost identical to the standard option - with the same name (see the options manual entry for + of the same name (see the options manual entry for details).  The only difference is that not the widget itself but its first enabled entry child will receive the focus during keyboard traversal with the standard keys (Tab and diff --git a/modules/mentry/doc/wcbRef.html b/modules/mentry/doc/wcbRef.html index 34a37ac6..1dce6987 100644 --- a/modules/mentry/doc/wcbRef.html +++ b/modules/mentry/doc/wcbRef.html @@ -13,7 +13,7 @@

      Wcb Command Reference

      -

      For Wcb Version 3.5

      +

      For Wcb Version 3.6

      by

      From c8f3583f91d9359cf92855062a271444b87f5fa9 Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 8 Oct 2018 11:59:37 +0000 Subject: [PATCH 092/150] * doc/*.png: Updated the screenshots. --- modules/mentry/doc/datetime1.png | Bin 2757 -> 2880 bytes modules/mentry/doc/datetime2.png | Bin 2846 -> 2881 bytes modules/mentry/doc/ethernetaddr.png | Bin 3520 -> 3638 bytes modules/mentry/doc/phonenumber.png | Bin 2963 -> 2950 bytes modules/mentry/doc/phonenumber_tile.png | Bin 2962 -> 2954 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/modules/mentry/doc/datetime1.png b/modules/mentry/doc/datetime1.png index 70582d2f9fcb9dc91bbe9959c11585d07d2481e5..d1cca3ef3b240a8025a0fef61f4fd9d62ad9647c 100644 GIT binary patch literal 2880 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 a(viRyB@fZ8bkXCLm`)FFq*JVo4*L)Ck(h7* literal 2757 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 literal 2846 zcmY*b2{aUH8y;a~8ImR0vhN|=pe8dymS`-IJ!9X-KAEx%V=4QRDMK1Yh>Sv`8HV3- z$x;Sa#+DG7y5UzGOzFQ=z;Q0%iIaTd5@K=+vZ`vz7qm|6 z=xH09z;rExZ0+F)TfIvjDM&XNFYg=Xfdwz@ZIR(fhbRKx=cXH`DK7ptBDouXv^+rUu&(A4V0)Y}is zi*p~>4!?zb-q_eb+zar-_Ws&Mw4IGT0J_ZZ`$Z5|mrVe7*d@%52xqvta})r;+w&_} zid1>UjU6C+b|$t*G1-i-kH=(65GeAfE1MQP<`sX{}W7vq>jSklGmT1ZxE z73=<&j+Oo0VeiA)*6oSFnNQpb8gF6M(T$}LAs%_JbngqNyE1m0ufGAqV48vQ+w@FR zt%L`2)yk?yf9zs{?1wcljRzsF^-01;?TIO;4)!F?!(Mu{t@)pgEoV<%L>?m|-oQSB zqSd!XV-2j<=fi5S3VS1#?`caR278n^^D*hHeVuGi=4cWRWCF2o34f`%~ z_3(#nV|DHsqwmh{$p-!Gya;=14{`U)-F( ztviI&e`ZM!ef1e;Qak0frT9V)#b;}%u(4>NTrNY`y{-d573$K4(MBzk{yJa-i%d{*yS8*zirQ)$U;6)@hxl(3bM%$dJTNkMnnG z90hvg?UbGhIV`8CVP0KWg8R0c-SowEPpz|X-FRFaBfUx}wlco@vt-8?9t^X}RKH@} z4e*!*ODS9{Y<;*ZDt%8~UW!anC)$kV4>r0HDJqQXf30&{%9P~&hg@I!15$nWMs8-p z)1et58t7m~rf7|V`e1M|xXaYfyplV48l&=tLt*m>uNUDmQ`D6*VAQ7 z{5AM%uEN35PCefP!(M0v_~s3yzL$6#^>`Lgetq?O7rEMN#nH?YfW7y)A?^U0YXNXdZ-B`7+x>l|ERJv^lKHUJZCd()#T(Ku)%1)OMw5>7H7)GAmDF^F=I zksUYE9IBb;B0L1-`2=Ak-T+iRPX7MKG1!q{she9}1SmRS#s_3*+wO&uGwFoDAV-u0go zp?_t|<_*5gx^K_(+i(9GPY`w(M<3O_5+*y{8q>N(U8+*~saCvzWe8on_Qkir)X;cP zxCLq4k2u^K4z<#M`K*55hMqPnIJ@5H24SH_v~J};TDiT4*lz(H z)u?-??i?&Obf&nkfv=kRt{8*KV6#<%7O{@+DP3`uFhf-pi?z6#lFXVj1oz+`iIp_q z3h2KS+4xs)K*g;3S#4_EXA8mfx$c<&2wu63BnNwp)h#+-O`gOfpGhKD-U7uRJ$8;c z>RFgSw1RWIv{UxhY~8lXYdd2iTjj+iCqos6M!UxH^D9G`pdC(Lz0=RfGUq?+WRL7H zO_wp3LbayYd|Ag93-eVh5&`l1#nJN>h~CB z(kq=E3(Mw&uz?f*J9V_c*7W$@X)yb(onDwxDc0S?&8;leeGk;ewpo(mqR4&p^#fR# L+L(}xZzTU0{K{2x diff --git a/modules/mentry/doc/ethernetaddr.png b/modules/mentry/doc/ethernetaddr.png index ad58cfe07fd35e28488f2e1af3ccd98862680109..62af86b9868a21131e298bca321f6187fa0eea75 100644 GIT binary patch literal 3638 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 literal 3520 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 literal 2963 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 S7|+Rb&0q{S(|-qZj{6tzUy=d< literal 2962 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 PZh{Q;OyPJPm#F^$$^Mg4 From 2310dda8d3b4454e5218086e1b1d8387e2f4a651 Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 8 Oct 2018 12:00:32 +0000 Subject: [PATCH 093/150] * scripts/*.tcl: Added support for the themes "aquativo", "Arc", and "clearlooks"; updated the support for several other themes; included the same version of "mwutil.tcl" as in Tablelist release 6.3; several code improvements and minor bug fixes; updated the copyright information. --- modules/mentry/scripts/mentryDateTime.tcl | 2 +- modules/mentry/scripts/mentryFixedPoint.tcl | 2 +- modules/mentry/scripts/mentryIPAddr.tcl | 2 +- modules/mentry/scripts/mentryIPv6Addr.tcl | 2 +- modules/mentry/scripts/mentryThemes.tcl | 120 +++++++---- modules/mentry/scripts/mentryWidget.tcl | 210 ++++++++++---------- modules/mentry/scripts/mwutil.tcl | 10 +- 7 files changed, 202 insertions(+), 146 deletions(-) diff --git a/modules/mentry/scripts/mentryDateTime.tcl b/modules/mentry/scripts/mentryDateTime.tcl index 3b4e4951..cf5e0563 100644 --- a/modules/mentry/scripts/mentryDateTime.tcl +++ b/modules/mentry/scripts/mentryDateTime.tcl @@ -1,7 +1,7 @@ #============================================================================== # Contains the implementation of multi-entry widgets for date and time. # -# Copyright (c) 1999-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 1999-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # diff --git a/modules/mentry/scripts/mentryFixedPoint.tcl b/modules/mentry/scripts/mentryFixedPoint.tcl index f7dc76e2..6418d5af 100644 --- a/modules/mentry/scripts/mentryFixedPoint.tcl +++ b/modules/mentry/scripts/mentryFixedPoint.tcl @@ -2,7 +2,7 @@ # Contains the implementation of a multi-entry widget for real numbers in # fixed-point format. # -# Copyright (c) 1999-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 1999-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # diff --git a/modules/mentry/scripts/mentryIPAddr.tcl b/modules/mentry/scripts/mentryIPAddr.tcl index 63e82814..e80645db 100644 --- a/modules/mentry/scripts/mentryIPAddr.tcl +++ b/modules/mentry/scripts/mentryIPAddr.tcl @@ -1,7 +1,7 @@ #============================================================================== # Contains the implementation of a multi-entry widget for IP addresses. # -# Copyright (c) 1999-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 1999-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # diff --git a/modules/mentry/scripts/mentryIPv6Addr.tcl b/modules/mentry/scripts/mentryIPv6Addr.tcl index baa50b5d..c8e1afb1 100644 --- a/modules/mentry/scripts/mentryIPv6Addr.tcl +++ b/modules/mentry/scripts/mentryIPv6Addr.tcl @@ -1,7 +1,7 @@ #============================================================================== # Contains the implementation of a multi-entry widget for IPv6 addresses. # -# Copyright (c) 2009-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2009-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # diff --git a/modules/mentry/scripts/mentryThemes.tcl b/modules/mentry/scripts/mentryThemes.tcl index e5041457..13d8ecc7 100644 --- a/modules/mentry/scripts/mentryThemes.tcl +++ b/modules/mentry/scripts/mentryThemes.tcl @@ -7,7 +7,7 @@ # - Private procedures related to tile themes # - Private procedures related to global KDE configuration options # -# Copyright (c) 2006-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2006-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # @@ -15,19 +15,6 @@ # ======================================== # -#------------------------------------------------------------------------------ -# mentry::getCurrentTheme -# -# Returns the current tile theme. -#------------------------------------------------------------------------------ -proc mentry::getCurrentTheme {} { - if {[info exists ttk::currentTheme]} { - return $ttk::currentTheme - } else { - return $tile::currentTheme - } -} - #------------------------------------------------------------------------------ # mentry::setThemeDefaults # @@ -36,6 +23,10 @@ proc mentry::getCurrentTheme {} { #------------------------------------------------------------------------------ proc mentry::setThemeDefaults {} { variable themeDefaults + if {[info exists themeDefaults(-readonlybackground)]} { + unset themeDefaults(-readonlybackground) + } + if {[catch {[getCurrentTheme]Theme}] != 0} { # # Fall back to the "default" theme (which is the root of all @@ -45,8 +36,11 @@ proc mentry::setThemeDefaults {} { array set themeDefaults [style configure .] } - set themeDefaults(-readonlybackground) $themeDefaults(-disabledbackground) - set themeDefaults(-font) TkTextFont + if {![info exists themeDefaults(-readonlybackground)]} { + set themeDefaults(-readonlybackground) \ + $themeDefaults(-disabledbackground) + } + set themeDefaults(-font) TkTextFont variable configSpecs foreach opt {-background -foreground -font} { @@ -88,13 +82,13 @@ proc mentry::altTheme {} { proc mentry::aquaTheme {} { variable themeDefaults array set themeDefaults [list \ - -background white \ - -disabledbackground white \ - -foreground black \ - -foreground,background #a3a3a3 \ - -disabledforeground #a3a3a3 \ + -background systemWindowBody \ + -disabledbackground "" \ + -foreground systemModelessDialogActiveText \ + -foreground,background systemModelessDialogInactiveText \ + -disabledforeground systemModelessDialogInactiveText \ -selectbackground systemHighlight \ - -selectforeground systemHighlightText \ + -selectforeground systemModelessDialogActiveText \ -selectborderwidth 0 \ -borderwidth 4 \ -labelpady {4 4} \ @@ -108,7 +102,7 @@ proc mentry::AquativoTheme {} { variable themeDefaults array set themeDefaults [list \ -background white \ - -disabledbackground white \ + -disabledbackground "" \ -foreground black \ -foreground,background black \ -disabledforeground black \ @@ -120,6 +114,44 @@ proc mentry::AquativoTheme {} { ] } +#------------------------------------------------------------------------------ +# mentry::aquativoTheme +#------------------------------------------------------------------------------ +proc mentry::aquativoTheme {} { + variable themeDefaults + array set themeDefaults [list \ + -background white \ + -disabledbackground "" \ + -foreground black \ + -foreground,background black \ + -disabledforeground #565248 \ + -selectbackground #000000 \ + -selectforeground #ffffff \ + -selectborderwidth 0 \ + -borderwidth 2 \ + -labelpady {2 2} \ + ] +} + +#------------------------------------------------------------------------------ +# mentry::ArcTheme +#------------------------------------------------------------------------------ +proc mentry::ArcTheme {} { + variable themeDefaults + array set themeDefaults [list \ + -background white \ + -disabledbackground #fbfcfc \ + -foreground #5c616c \ + -foreground,background #5c616c \ + -disabledforeground #a9acb2 \ + -selectbackground #5294e2 \ + -selectforeground #ffffff \ + -selectborderwidth 0 \ + -borderwidth 3 \ + -labelpady {1 1} \ + ] +} + #------------------------------------------------------------------------------ # mentry::blueTheme #------------------------------------------------------------------------------ @@ -127,7 +159,7 @@ proc mentry::blueTheme {} { variable themeDefaults array set themeDefaults [list \ -background #e6f3ff \ - -disabledbackground #e6f3ff \ + -disabledbackground "" \ -foreground black \ -foreground,background black \ -disabledforeground #666666 \ @@ -146,7 +178,7 @@ proc mentry::clamTheme {} { variable themeDefaults array set themeDefaults [list \ -background white \ - -disabledbackground white \ + -disabledbackground "" \ -foreground black \ -foreground,background black \ -disabledforeground #999999 \ @@ -177,6 +209,26 @@ proc mentry::classicTheme {} { ] } +#------------------------------------------------------------------------------ +# mentry::clearlooksTheme +#------------------------------------------------------------------------------ +proc mentry::clearlooksTheme {} { + variable themeDefaults + array set themeDefaults [list \ + -background white \ + -disabledbackground "" \ + -readonlybackground #efebe7 \ + -foreground black \ + -foreground,background black \ + -disabledforeground #b5b3ac \ + -selectbackground #7c99ad \ + -selectforeground #ffffff \ + -selectborderwidth 0 \ + -borderwidth 2 \ + -labelpady {2 2} \ + ] +} + #------------------------------------------------------------------------------ # mentry::defaultTheme #------------------------------------------------------------------------------ @@ -203,7 +255,7 @@ proc mentry::keramikTheme {} { variable themeDefaults array set themeDefaults [list \ -background white \ - -disabledbackground white \ + -disabledbackground "" \ -foreground black \ -foreground,background black \ -disabledforeground #aaaaaa \ @@ -222,7 +274,7 @@ proc mentry::keramik_altTheme {} { variable themeDefaults array set themeDefaults [list \ -background white \ - -disabledbackground white \ + -disabledbackground "" \ -foreground black \ -foreground,background black \ -disabledforeground #aaaaaa \ @@ -241,7 +293,7 @@ proc mentry::krocTheme {} { variable themeDefaults array set themeDefaults [list \ -background white \ - -disabledbackground white \ + -disabledbackground "" \ -foreground black \ -foreground,background black \ -disabledforeground #b2b2b2 \ @@ -260,7 +312,7 @@ proc mentry::plastikTheme {} { variable themeDefaults array set themeDefaults [list \ -background white \ - -disabledbackground white \ + -disabledbackground "" \ -foreground black \ -foreground,background black \ -disabledforeground #aaaaaa \ @@ -268,7 +320,7 @@ proc mentry::plastikTheme {} { -selectforeground #ffffff \ -selectborderwidth 0 \ -borderwidth 2 \ - -labelpady {3 3} \ + -labelpady {2 2} \ ] } @@ -279,7 +331,7 @@ proc mentry::srivTheme {} { variable themeDefaults array set themeDefaults [list \ -background #e6f3ff \ - -disabledbackground #e6f3ff \ + -disabledbackground "" \ -foreground black \ -foreground,background black \ -disabledforeground #666666 \ @@ -298,7 +350,7 @@ proc mentry::srivlgTheme {} { variable themeDefaults array set themeDefaults [list \ -background #e6f3ff \ - -disabledbackground #e6f3ff \ + -disabledbackground "" \ -foreground black \ -foreground,background black \ -disabledforeground #666666 \ @@ -317,7 +369,7 @@ proc mentry::stepTheme {} { variable themeDefaults array set themeDefaults [list \ -background white \ - -disabledbackground white \ + -disabledbackground "" \ -foreground black \ -foreground,background black \ -disabledforeground #808080 \ @@ -400,7 +452,7 @@ proc mentry::winxpblueTheme {} { variable themeDefaults array set themeDefaults [list \ -background white \ - -disabledbackground white \ + -disabledbackground "" \ -foreground black \ -foreground,background black \ -disabledforeground #565248 \ diff --git a/modules/mentry/scripts/mentryWidget.tcl b/modules/mentry/scripts/mentryWidget.tcl index 261f9849..93598b57 100644 --- a/modules/mentry/scripts/mentryWidget.tcl +++ b/modules/mentry/scripts/mentryWidget.tcl @@ -11,7 +11,7 @@ # - Private procedures used in bindings # - Private utility procedures # -# Copyright (c) 1999-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 1999-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # @@ -125,6 +125,19 @@ namespace eval mentry { -vcmd -validatecommand } + # + # Public utility procedure. Returns the current tile theme. + # + proc getCurrentTheme {} { + if {[info exists ::ttk::currentTheme]} { + return $::ttk::currentTheme + } elseif {[info exists ::tile::currentTheme]} { + return $::tile::currentTheme + } else { + return "" + } + } + # # Extend the elements of the array configSpecs # @@ -168,19 +181,6 @@ namespace eval mentry { # lappend configSpecs(-takefocus) {} - # - # Define a special tile entry layout - # - style theme settings "default" { - style layout MentryHull.TEntry { - Entry.highlight -children { - Entry.field -border 1 -children { - Entry.padding - } - } - } - } - catch {lappend configSpecs(-cursor) [ttk::cursor text]} ttk::entry $helpEntry -takefocus 0 @@ -238,7 +238,7 @@ namespace eval mentry { # MentryEntry, and MentryLabel. #------------------------------------------------------------------------------ proc mentry::createBindings {} { - + # # Define some Mentry class bindings # bind Mentry continue @@ -248,16 +248,16 @@ proc mentry::createBindings {} { } } bind Mentry { - namespace delete mentry::ns%W + namespace delete ::mentry::ns%W catch {rename ::%W ""} } + bind Mentry <> { + after idle [list mentry::updateConfigSpecs %W] + } variable usingTile if {$usingTile} { bind Mentry { mentry::updateAppearance %W } bind Mentry { mentry::updateAppearance %W } - bind Mentry <> { - after idle [list mentry::updateConfigSpecs %W] - } } # @@ -366,12 +366,12 @@ proc mentry::mentry args { } # - # Create a hull (a frame or special tile entry widget) of the class Mentry + # Create a hull (a frame or tile entry) of the class Mentry # set win [lindex $args 0] if {[catch { if {$usingTile} { - ttk::entry $win -style MentryHull.TEntry -class Mentry + ttk::entry $win -style Hull$win.TEntry -class Mentry } else { tk::frame $win -class Mentry -container 0 -height 0 -width 0 catch {$win configure -padx 0 -pady 0} @@ -410,27 +410,25 @@ proc mentry::mentry args { foreach opt $configOpts { set data($opt) [lindex $configSpecs($opt) 3] } + set data(currentTheme) [getCurrentTheme] + if {[string compare $data(currentTheme) "tileqt"] == 0} { + set data(widgetStyle) [tileqt_currentThemeName] + if {[info exists ::env(KDE_SESSION_VERSION)] && + [string length $::env(KDE_SESSION_VERSION)] != 0} { + set data(colorScheme) [getKdeConfigVal "General" "ColorScheme"] + } else { + set data(colorScheme) [getKdeConfigVal "KDE" "colorScheme"] + } + } else { + set data(widgetStyle) "" + set data(colorScheme) "" + } if {$usingTile} { setThemeDefaults variable themeDefaults - foreach opt {-disabledbackground -disabledforeground \ - -readonlybackground} { - set data($opt) $themeDefaults($opt) - } - - set data(currentTheme) [getCurrentTheme] set data(themeDefaults) [array get themeDefaults] - if {[string compare $data(currentTheme) "tileqt"] == 0} { - set data(widgetStyle) [tileqt_currentThemeName] - if {[info exists ::env(KDE_SESSION_VERSION)] && - [string length $::env(KDE_SESSION_VERSION)] != 0} { - set data(colorScheme) [getKdeConfigVal "General" "ColorScheme"] - } else { - set data(colorScheme) [getKdeConfigVal "KDE" "colorScheme"] - } - } else { - set data(widgetStyle) "" - set data(colorScheme) "" + foreach opt {-disabledbackground -readonlybackground} { + set data($opt) $themeDefaults($opt) } } @@ -509,10 +507,12 @@ proc mentry::doConfig {win opt val} { # Some options need special handling # if {[string compare $opt "-font"] == 0 && $usingTile} { - mentry::adjustChildren $win + adjustChildren $win } elseif {[string compare $opt "-foreground"] == 0 && $usingTile && !$data(inActiveWin)} { - updateAppearance $win + foreach w [labels $win] { + $w configure $opt $themeDefaults(-foreground,background) + } } } @@ -551,10 +551,11 @@ proc mentry::doConfig {win opt val} { set data($opt) $val if {[string compare $opt "-background"] == 0 && $usingTile} { # - # Most themes support the -fieldbackground option for the - # style element Entry.field. The aqua theme supports the - # -background option instead. Some themes (like plastik, - # tileqt, vista, and xpnative) don't support either of them. + # Most themes support the -fieldbackground option + # for the style element Entry.field. The aqua + # theme supports the -background option instead. + # Some themes (like Arc, plastik, tileqt, vista, + # and xpnative) don't support either of them. # styleConfig $win.TEntry -fieldbackground $val \ -background $val @@ -594,7 +595,12 @@ proc mentry::doConfig {win opt val} { # Set also the hull's background, because # of the shadow colors of its 3-D border # - $win configure $opt $labelBg + if {$usingTile} { + styleConfig Hull$win.TEntry -fieldbackground $labelBg \ + -background $labelBg + } else { + $win configure $opt $labelBg + } } elseif {[regexp \ {^-(disabledbackground|readonlybackground|state)$} \ $opt] && $::tk_version >= 8.4} { @@ -829,6 +835,9 @@ proc mentry::createChildren {win body} { } $w configure -background $labelBg -state $labelState } + if {$usingTile} { + $w configure -disabledforeground $themeDefaults(-disabledforeground) + } # # Replace the binding tag Label with MentryLabel @@ -1425,28 +1434,18 @@ proc mentry::updateAppearance {win event} { switch $event { { set data(inActiveWin) 1 - if {[string compare $data(-state) "disabled"] == 0} { - set labelFg $themeDefaults(-disabledforeground) - } else { - set labelFg $data(-foreground) - } - foreach w [labels $win] { - $w configure -foreground $labelFg - } + set labelFg $data(-foreground) } { set data(inActiveWin) 0 - if {[string compare $data(-state) "disabled"] == 0} { - set labelFg $themeDefaults(-disabledforeground) - } else { - set labelFg $themeDefaults(-foreground,background) - } - foreach w [labels $win] { - $w configure -foreground $labelFg - } + set labelFg $themeDefaults(-foreground,background) } } + + foreach w [labels $win] { + $w configure -foreground $labelFg + } } #------------------------------------------------------------------------------ @@ -1463,9 +1462,8 @@ proc mentry::updateConfigSpecs win { return "" } - upvar ::mentry::ns${win}::data data - set currentTheme [getCurrentTheme] + upvar ::mentry::ns${win}::data data if {[string compare $currentTheme $data(currentTheme)] == 0} { if {[string compare $currentTheme "tileqt"] == 0} { set widgetStyle [tileqt_currentThemeName] @@ -1484,53 +1482,56 @@ proc mentry::updateConfigSpecs win { } } - # - # Populate the array tmp with values corresponding to the old theme - # and the array themeDefaults with values corresponding to the new one - # - array set tmp $data(themeDefaults) - setThemeDefaults + variable usingTile + if {$usingTile} { + # + # Populate the array tmp with values corresponding to the old theme + # and the array themeDefaults with values corresponding to the new one + # + array set tmp $data(themeDefaults) + setThemeDefaults - # - # Set those configuration options whose values equal the old - # theme-specific defaults to the new theme-specific ones - # - variable themeDefaults - foreach opt {-disabledbackground -disabledforeground -readonlybackground} { - set data($opt) $themeDefaults($opt) - } - foreach opt {-background -foreground -font} { - if {[string compare $data($opt) $tmp($opt)] == 0} { - doConfig $win $opt $themeDefaults($opt) + # + # Set those configuration options whose values equal the old + # theme-specific defaults to the new theme-specific ones + # + variable themeDefaults + foreach opt {-disabledbackground -readonlybackground} { + set data($opt) $themeDefaults($opt) } - } - mentry::adjustChildren $win + foreach opt {-background -foreground -font} { + if {[string compare $data($opt) $tmp($opt)] == 0} { + doConfig $win $opt $themeDefaults($opt) + } + } + adjustChildren $win - # - # Most themes support the -fieldbackground option for the - # style element Entry.field. The aqua theme supports the - # -background option instead. Some themes (like plastik, - # tileqt, vista, and xpnative) don't support either of them. - # - styleConfig $win.TEntry -fieldbackground $data(-background) \ - -background $data(-background) + # + # Most themes support the -fieldbackground option for the + # style element Entry.field. The aqua theme supports the + # -background option instead. Some themes (like Arc, plastik, + # tileqt, vista, and xpnative) don't support either of them. + # + foreach style [list $win.TEntry Hull$win.TEntry] { + styleConfig $style -fieldbackground $data(-background) \ + -background $data(-background) + } - # - # Set the foreground color of the label children - # - if {[string compare $data(-state) "disabled"] == 0} { - set labelFg $themeDefaults(-disabledforeground) - } elseif {$data(inActiveWin)} { - set labelFg $data(-foreground) - } else { - set labelFg $themeDefaults(-foreground,background) - } - foreach w [labels $win] { - $w configure -foreground $labelFg + # + # Set the foreground color of the label children + # + if {$data(inActiveWin)} { + set labelFg $data(-foreground) + } else { + set labelFg $themeDefaults(-foreground,background) + } + foreach w [labels $win] { + $w configure -foreground $labelFg \ + -disabledforeground $themeDefaults(-disabledforeground) + } } set data(currentTheme) $currentTheme - set data(themeDefaults) [array get themeDefaults] if {[string compare $currentTheme "tileqt"] == 0} { set data(widgetStyle) [tileqt_currentThemeName] if {[info exists ::env(KDE_SESSION_VERSION)] && @@ -1543,6 +1544,9 @@ proc mentry::updateConfigSpecs win { set data(widgetStyle) "" set data(colorScheme) "" } + if {$usingTile} { + set data(themeDefaults) [array get themeDefaults] + } } #------------------------------------------------------------------------------ diff --git a/modules/mentry/scripts/mwutil.tcl b/modules/mentry/scripts/mwutil.tcl index 3d461fb3..c73ce416 100644 --- a/modules/mentry/scripts/mwutil.tcl +++ b/modules/mentry/scripts/mwutil.tcl @@ -5,11 +5,10 @@ # - Namespace initialization # - Public utility procedures # -# Copyright (c) 2000-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== -package require Tcl 8 -package require Tk 8 +package require Tk 8 # # Namespace initialization @@ -20,7 +19,7 @@ namespace eval mwutil { # # Public variables: # - variable version 2.8 + variable version 2.10 variable library [file dirname [info script]] # @@ -491,7 +490,8 @@ proc mwutil::getScrollInfo argList { wrongNumArgs "moveto fraction" } - set fraction [format "%f" [lindex $argList 1]] + set fraction [lindex $argList 1] + format "%f" $fraction ;# floating-point number check with error message return [list moveto $fraction] } elseif {[string first $opt "scroll"] == 0} { if {$argCount != 3} { From 5f6aa5228faf952862b2ff187d0fa28b8c78bb3a Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 8 Oct 2018 12:01:17 +0000 Subject: [PATCH 094/150] * scripts/tclIndex: Newly generated. --- modules/mentry/scripts/tclIndex | 66 ++++++++++++++++----------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/modules/mentry/scripts/tclIndex b/modules/mentry/scripts/tclIndex index c8571a6c..baf135dd 100644 --- a/modules/mentry/scripts/tclIndex +++ b/modules/mentry/scripts/tclIndex @@ -6,6 +6,17 @@ # element name is the name of a command and the value is # a script that loads the command. +set auto_index(::mentry::dateMentry) [list source [file join $dir mentryDateTime.tcl]] +set auto_index(::mentry::timeMentry) [list source [file join $dir mentryDateTime.tcl]] +set auto_index(::mentry::dateTimeMentry) [list source [file join $dir mentryDateTime.tcl]] +set auto_index(::mentry::putClockVal) [list source [file join $dir mentryDateTime.tcl]] +set auto_index(::mentry::getClockVal) [list source [file join $dir mentryDateTime.tcl]] +set auto_index(::mentry::checkIfDateOrTimeMentry) [list source [file join $dir mentryDateTime.tcl]] +set auto_index(::mentry::getClockValFromDateMentry) [list source [file join $dir mentryDateTime.tcl]] +set auto_index(::mentry::getClockValFromTimeMentry) [list source [file join $dir mentryDateTime.tcl]] +set auto_index(::mentry::getClockValFromDateTimeMentry) [list source [file join $dir mentryDateTime.tcl]] +set auto_index(::mentry::incrDateTimeComp) [list source [file join $dir mentryDateTime.tcl]] +set auto_index(::mentry::setMeridian) [list source [file join $dir mentryDateTime.tcl]] set auto_index(::mentry::fixedPointMentry) [list source [file join $dir mentryFixedPoint.tcl]] set auto_index(::mentry::putReal) [list source [file join $dir mentryFixedPoint.tcl]] set auto_index(::mentry::getReal) [list source [file join $dir mentryFixedPoint.tcl]] @@ -15,7 +26,11 @@ set auto_index(::mentry::putIPAddr) [list source [file join $dir mentryIPAddr.tc set auto_index(::mentry::getIPAddr) [list source [file join $dir mentryIPAddr.tcl]] set auto_index(::mentry::checkIfIPAddrMentry) [list source [file join $dir mentryIPAddr.tcl]] set auto_index(::mentry::incrIPAddrComp) [list source [file join $dir mentryIPAddr.tcl]] -set auto_index(::mentry::getCurrentTheme) [list source [file join $dir mentryThemes.tcl]] +set auto_index(::mentry::ipv6AddrMentry) [list source [file join $dir mentryIPv6Addr.tcl]] +set auto_index(::mentry::putIPv6Addr) [list source [file join $dir mentryIPv6Addr.tcl]] +set auto_index(::mentry::getIPv6Addr) [list source [file join $dir mentryIPv6Addr.tcl]] +set auto_index(::mentry::checkIfIPv6AddrMentry) [list source [file join $dir mentryIPv6Addr.tcl]] +set auto_index(::mentry::incrIPv6AddrComp) [list source [file join $dir mentryIPv6Addr.tcl]] set auto_index(::mentry::setThemeDefaults) [list source [file join $dir mentryThemes.tcl]] set auto_index(::mentry::altTheme) [list source [file join $dir mentryThemes.tcl]] set auto_index(::mentry::aquaTheme) [list source [file join $dir mentryThemes.tcl]] @@ -39,39 +54,8 @@ set auto_index(::mentry::xpnativeTheme) [list source [file join $dir mentryTheme set auto_index(::mentry::getKdeConfigVal) [list source [file join $dir mentryThemes.tcl]] set auto_index(::mentry::makeKdeDirList) [list source [file join $dir mentryThemes.tcl]] set auto_index(::mentry::readKdeConfigVal) [list source [file join $dir mentryThemes.tcl]] -set auto_index(::mwutil::makeFocusProcs) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::getChildren) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::wrongNumArgs) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::getAncestorByClass) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::convEventFields) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::defineKeyNav) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::processTraversal) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::configureWidget) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::fullConfigOpt) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::fullOpt) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::enumOpts) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::configureSubCmd) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::attribSubCmd) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::hasattribSubCmd) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::unsetattribSubCmd) [list source [file join $dir mwutil.tcl]] -set auto_index(::mwutil::getScrollInfo) [list source [file join $dir mwutil.tcl]] -set auto_index(::mentry::ipv6AddrMentry) [list source [file join $dir mentryIPv6Addr.tcl]] -set auto_index(::mentry::putIPv6Addr) [list source [file join $dir mentryIPv6Addr.tcl]] -set auto_index(::mentry::getIPv6Addr) [list source [file join $dir mentryIPv6Addr.tcl]] -set auto_index(::mentry::checkIfIPv6AddrMentry) [list source [file join $dir mentryIPv6Addr.tcl]] -set auto_index(::mentry::incrIPv6AddrComp) [list source [file join $dir mentryIPv6Addr.tcl]] -set auto_index(::mentry::dateMentry) [list source [file join $dir mentryDateTime.tcl]] -set auto_index(::mentry::timeMentry) [list source [file join $dir mentryDateTime.tcl]] -set auto_index(::mentry::dateTimeMentry) [list source [file join $dir mentryDateTime.tcl]] -set auto_index(::mentry::putClockVal) [list source [file join $dir mentryDateTime.tcl]] -set auto_index(::mentry::getClockVal) [list source [file join $dir mentryDateTime.tcl]] -set auto_index(::mentry::checkIfDateOrTimeMentry) [list source [file join $dir mentryDateTime.tcl]] -set auto_index(::mentry::getClockValFromDateMentry) [list source [file join $dir mentryDateTime.tcl]] -set auto_index(::mentry::getClockValFromTimeMentry) [list source [file join $dir mentryDateTime.tcl]] -set auto_index(::mentry::getClockValFromDateTimeMentry) [list source [file join $dir mentryDateTime.tcl]] -set auto_index(::mentry::incrDateTimeComp) [list source [file join $dir mentryDateTime.tcl]] -set auto_index(::mentry::setMeridian) [list source [file join $dir mentryDateTime.tcl]] set auto_index(::mentry::createTileAliases) [list source [file join $dir mentryWidget.tcl]] +set auto_index(::mentry::getCurrentTheme) [list source [file join $dir mentryWidget.tcl]] set auto_index(::mentry::extendConfigSpecs) [list source [file join $dir mentryWidget.tcl]] set auto_index(::mentry::createBindings) [list source [file join $dir mentryWidget.tcl]] set auto_index(::mentry::mentry) [list source [file join $dir mentryWidget.tcl]] @@ -115,3 +99,19 @@ set auto_index(::mentry::entrySetCursor) [list source [file join $dir mentryWidg set auto_index(::mentry::entryViewCursor) [list source [file join $dir mentryWidget.tcl]] set auto_index(::mentry::configEntry) [list source [file join $dir mentryWidget.tcl]] set auto_index(::mentry::reqEntryWidth) [list source [file join $dir mentryWidget.tcl]] +set auto_index(::mwutil::makeFocusProcs) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::getChildren) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::wrongNumArgs) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::getAncestorByClass) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::convEventFields) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::defineKeyNav) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::processTraversal) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::configureWidget) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::fullConfigOpt) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::fullOpt) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::enumOpts) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::configureSubCmd) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::attribSubCmd) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::hasattribSubCmd) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::unsetattribSubCmd) [list source [file join $dir mwutil.tcl]] +set auto_index(::mwutil::getScrollInfo) [list source [file join $dir mwutil.tcl]] From 89aa720a42fb65bd00b50ea143263a89e4c21acf Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 8 Oct 2018 12:01:55 +0000 Subject: [PATCH 095/150] * ../../examples/mentry/*.tcl: Various updates. --- examples/mentry/datetime1.tcl | 6 +++--- examples/mentry/datetime1_tile.tcl | 6 +++--- examples/mentry/datetime2.tcl | 4 ++-- examples/mentry/datetime2_tile.tcl | 12 ++++++------ examples/mentry/ethernetaddr.tcl | 6 +++--- examples/mentry/ethernetaddr_tile.tcl | 6 +++--- examples/mentry/option.tcl | 4 ++-- examples/mentry/option_tile.tcl | 2 +- examples/mentry/phonenumber.tcl | 6 +++--- examples/mentry/phonenumber_tile.tcl | 6 +++--- 10 files changed, 29 insertions(+), 29 deletions(-) diff --git a/examples/mentry/datetime1.tcl b/examples/mentry/datetime1.tcl index ed02252b..e4649a44 100755 --- a/examples/mentry/datetime1.tcl +++ b/examples/mentry/datetime1.tcl @@ -1,10 +1,10 @@ #!/usr/bin/env wish -## -*- tcl -*- + #============================================================================== # Demo: mentry::dateMentry, mentry::timeMentry, mentry::putClockVal, # mentry::getClockVal. # -# Copyright (c) 1999-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 1999-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== package require mentry @@ -90,7 +90,7 @@ button .get -text "Get from mentries" -command { # # Label .dateTime displaying the result of mentry::getClockVal # -label .dateTime -textvariable dateTime +label .dateTime -textvariable dateTime -background white # # Frame .sep and button .close diff --git a/examples/mentry/datetime1_tile.tcl b/examples/mentry/datetime1_tile.tcl index 2bc1a9df..295f27b7 100755 --- a/examples/mentry/datetime1_tile.tcl +++ b/examples/mentry/datetime1_tile.tcl @@ -1,10 +1,10 @@ #!/usr/bin/env wish -## -*- tcl -*- + #============================================================================== # Demo: mentry::dateMentry, mentry::timeMentry, mentry::putClockVal, # mentry::getClockVal. # -# Copyright (c) 1999-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 1999-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== package require mentry_tile @@ -97,7 +97,7 @@ ttk::button .base.get -text "Get from mentries" -command { # # Label .base.dateTime displaying the result of mentry::getClockVal # -ttk::label .base.dateTime -textvariable dateTime +ttk::label .base.dateTime -textvariable dateTime -background white # # Separator .base.sep and button .base.close diff --git a/examples/mentry/datetime2.tcl b/examples/mentry/datetime2.tcl index f4b16da9..1367d3d2 100755 --- a/examples/mentry/datetime2.tcl +++ b/examples/mentry/datetime2.tcl @@ -1,5 +1,5 @@ #!/usr/bin/env wish -## -*- tcl -*- + #============================================================================== # Demo: mentry::dateTimeMentry, mentry::putClockVal, mentry::getClockVal. # @@ -85,7 +85,7 @@ button .get -text "Get from mentry" -command { # # Label .dateTime displaying the result of mentry::getClockVal # -label .dateTime -textvariable dateTime +label .dateTime -textvariable dateTime -background white # # Frame .sep and button .close diff --git a/examples/mentry/datetime2_tile.tcl b/examples/mentry/datetime2_tile.tcl index ceaf1b9a..e49c2ae3 100755 --- a/examples/mentry/datetime2_tile.tcl +++ b/examples/mentry/datetime2_tile.tcl @@ -1,9 +1,9 @@ #!/usr/bin/env wish -## -*- tcl -*- + #============================================================================== # Demo: mentry::dateMentry, mentry::putClockVal, mentry::getClockVal. # -# Copyright (c) 2008-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2008-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== package require mentry_tile @@ -56,10 +56,10 @@ wm deiconify . # Frame .base.f with a mentry displaying the date & time # ttk::frame .base.f -ttk::label .base.f.l -text "A mentry widget for date & time:" +ttk::label .base.f.l -text "Date & time: " mentry::dateTimeMentry .base.f.me $dateFmts($dateIdx)$timeFmts($timeIdx) \ $dateSeps($dateIdx) $timeSeps($timeIdx) -justify center -pack .base.f.l .base.f.me +pack .base.f.l .base.f.me -side left # # Message strings corresponding to the values @@ -75,7 +75,7 @@ array set msgs { # # Button .base.get invoking the procedure mentry::getClockVal # -ttk::button .base.get -text "Get from mentries" -command { +ttk::button .base.get -text "Get from mentry" -command { if {[catch { set dateTime "" set clockVal [mentry::getClockVal .base.f.me] @@ -90,7 +90,7 @@ ttk::button .base.get -text "Get from mentries" -command { # # Label .base.dateTime displaying the result of mentry::getClockVal # -ttk::label .base.dateTime -textvariable dateTime +ttk::label .base.dateTime -textvariable dateTime -background white # # Separator .base.sep and button .base.close diff --git a/examples/mentry/ethernetaddr.tcl b/examples/mentry/ethernetaddr.tcl index fe68f852..2bd2b075 100755 --- a/examples/mentry/ethernetaddr.tcl +++ b/examples/mentry/ethernetaddr.tcl @@ -1,9 +1,9 @@ #!/usr/bin/env wish -## -*- tcl -*- + #============================================================================== # Demonstrates how to implement a multi-entry widget for Ethernet addresses. # -# Copyright (c) 1999-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 1999-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== package require mentry @@ -162,7 +162,7 @@ button .get -text "Get from mentry" -command { # # Label .addr displaying the result of getEthernetAddr # -label .addr -textvariable addr +label .addr -textvariable addr -background white # # Frame .sep and button .close diff --git a/examples/mentry/ethernetaddr_tile.tcl b/examples/mentry/ethernetaddr_tile.tcl index 406c65e5..006f33c5 100755 --- a/examples/mentry/ethernetaddr_tile.tcl +++ b/examples/mentry/ethernetaddr_tile.tcl @@ -1,9 +1,9 @@ #!/usr/bin/env wish -## -*- tcl -*- + #============================================================================== # Demonstrates how to implement a multi-entry widget for Ethernet addresses. # -# Copyright (c) 1999-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 1999-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== package require mentry_tile @@ -168,7 +168,7 @@ ttk::button .base.get -text "Get from mentry" -command { # # Label .base.addr displaying the result of getEthernetAddr # -ttk::label .base.addr -textvariable addr +ttk::label .base.addr -textvariable addr -background white # # Separator .sep and button .close diff --git a/examples/mentry/option.tcl b/examples/mentry/option.tcl index f72ea991..0475de44 100644 --- a/examples/mentry/option.tcl +++ b/examples/mentry/option.tcl @@ -1,7 +1,7 @@ #============================================================================== # Contains some Tk option database settings. # -# Copyright (c) 2004-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2004-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # @@ -25,6 +25,6 @@ if {[string compare $winSys "x11"] == 0} { catch {font create TkDefaultFont -family Helvetica -size -12} option add *Font TkDefaultFont - option add *selectBackground #678db2 + option add *selectBackground #5294e2 option add *selectForeground white } diff --git a/examples/mentry/option_tile.tcl b/examples/mentry/option_tile.tcl index 32014d54..998874e0 100644 --- a/examples/mentry/option_tile.tcl +++ b/examples/mentry/option_tile.tcl @@ -1,7 +1,7 @@ #============================================================================== # Contains some Tk option database settings. # -# Copyright (c) 2004-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2004-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # diff --git a/examples/mentry/phonenumber.tcl b/examples/mentry/phonenumber.tcl index 37534101..39a04900 100755 --- a/examples/mentry/phonenumber.tcl +++ b/examples/mentry/phonenumber.tcl @@ -1,9 +1,9 @@ #!/usr/bin/env wish -## -*- tcl -*- + #============================================================================== # Demonstrates how to implement a multi-entry widget for 10-digit phone numbers. # -# Copyright (c) 1999-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 1999-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== package require mentry @@ -155,7 +155,7 @@ button .get -text "Get from mentry" -command { # # Label .num displaying the result of getPhoneNumber # -label .num -textvariable num +label .num -textvariable num -background white # # Frame .sep and button .close diff --git a/examples/mentry/phonenumber_tile.tcl b/examples/mentry/phonenumber_tile.tcl index e1d7bebb..914f943c 100755 --- a/examples/mentry/phonenumber_tile.tcl +++ b/examples/mentry/phonenumber_tile.tcl @@ -1,9 +1,9 @@ #!/usr/bin/env wish -## -*- tcl -*- + #============================================================================== # Demonstrates how to implement a multi-entry widget for 10-digit phone numbers. # -# Copyright (c) 1999-2014 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 1999-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== package require mentry_tile @@ -161,7 +161,7 @@ ttk::button .base.get -text "Get from mentry" -command { # # Label .base.num displaying the result of getPhoneNumber # -ttk::label .base.num -textvariable num +ttk::label .base.num -textvariable num -background white # # Separator .base.sep and button .base.close From 0ea8a8184f7a70cc9fe9432710c02a5d23bc1d88 Mon Sep 17 00:00:00 2001 From: csaba Date: Wed, 10 Oct 2018 10:07:00 +0000 Subject: [PATCH 096/150] * Added code for copying the file pencil.cur. --- support/installation/actions.tcl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/support/installation/actions.tcl b/support/installation/actions.tcl index b200ea59..db6f0ec9 100644 --- a/support/installation/actions.tcl +++ b/support/installation/actions.tcl @@ -50,6 +50,11 @@ proc _tab {module libdir} { [file join $distribution modules $module scripts tclIndex] \ [file join $libdir $module scripts] + set cursorFile [file join $distribution modules $module scripts pencil.cur] + if {[file exists $cursorFile]} { + xcopyfile $cursorFile [file join $libdir $module scripts] + } + return } From c0df2aef00cbc10adeadb1c0a1e9c5344d6ebd75 Mon Sep 17 00:00:00 2001 From: markus Date: Thu, 27 Dec 2018 16:15:09 +0000 Subject: [PATCH 097/150] Apply the patches by Alexandru - http://core.tcl.tk/tcllib/tktview/8c91e46800f569566ac60c7ded7c321b52f67a15 --- modules/plotchart/ChangeLog | 5 +++++ modules/plotchart/plotbind.tcl | 4 ++++ modules/plotchart/plotchart.tcl | 6 ++++++ 3 files changed, 15 insertions(+) diff --git a/modules/plotchart/ChangeLog b/modules/plotchart/ChangeLog index 10d87211..aa2129f4 100644 --- a/modules/plotchart/ChangeLog +++ b/modules/plotchart/ChangeLog @@ -1,3 +1,8 @@ +2018-12-27 Arjen Markus + * plotchart.tcl: Add missing method definitions for binding events to log(x)-y, x-log(y) and log(x)-log(y) plots, + as reported by Alexandru + * plotbind.tcl: Apply the patch provided by Alexandru + 2017-09-16 Arjen Markus * plotchart.man: Added description of the normal plot and associated commands. The implementation was already available, so no change in version number. diff --git a/modules/plotchart/plotbind.tcl b/modules/plotchart/plotbind.tcl index f06e71a9..d6310f8a 100755 --- a/modules/plotchart/plotbind.tcl +++ b/modules/plotchart/plotbind.tcl @@ -20,6 +20,10 @@ proc ::Plotchart::BindPlot {w event cmd} { variable scaling + if {![info exists scaling($w,eventobj)]} { + set scaling($w,eventobj) "" + } + if { $scaling($w,eventobj) == "" } { set pxmin $scaling($w,pxmin) diff --git a/modules/plotchart/plotchart.tcl b/modules/plotchart/plotchart.tcl index c9d3c256..5cd26a9d 100755 --- a/modules/plotchart/plotchart.tcl +++ b/modules/plotchart/plotchart.tcl @@ -131,6 +131,8 @@ namespace eval ::Plotchart { set methodProc(xlogyplot,plaintextconfig) ConfigPlainText set methodProc(xlogyplot,canvas) GetCanvas set methodProc(xlogyplot,deletedata) DeleteData + set methodProc(xlogyplot,bindplot) BindPlot + set methodProc(xlogyplot,bindlast) BindLast set methodProc(logxyplot,title) DrawTitle set methodProc(logxyplot,subtitle) DrawSubtitle set methodProc(logxyplot,xtext) DrawXtext @@ -164,6 +166,8 @@ namespace eval ::Plotchart { set methodProc(logxyplot,plaintextconfig) ConfigPlainText set methodProc(logxyplot,canvas) GetCanvas set methodProc(logxyplot,deletedata) DeleteData + set methodProc(logxyplot,bindplot) BindPlot + set methodProc(logxyplot,bindlast) BindLast set methodProc(logxlogyplot,title) DrawTitle set methodProc(logxlogyplot,subtitle) DrawSubtitle set methodProc(logxlogyplot,xtext) DrawXtext @@ -197,6 +201,8 @@ namespace eval ::Plotchart { set methodProc(logxlogyplot,plaintextconfig) ConfigPlainText set methodProc(logxlogyplot,canvas) GetCanvas set methodProc(logxlogyplot,deletedata) DeleteData + set methodProc(logxlogyplot,bindplot) BindPlot + set methodProc(logxlogyplot,bindlast) BindLast set methodProc(piechart,title) DrawTitle set methodProc(piechart,subtitle) DrawSubtitle set methodProc(piechart,plot) DrawPie From db0016605a792460b4a3fa221a0d650649190095 Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 7 Jan 2019 19:17:59 +0000 Subject: [PATCH 098/150] * *.tcl: Bumped the version number to 6.4; updated the * COPYRIGHT.txt: copyright information. * README.txt: * CHANGES.txt: Updated to reflect the changes. * doc/*.html: * scripts/*.tcl: Added the "-xmousewheelwindow" and "-ymousewheelwindow" configuration options; optimized the deletion of a list of items; improved the performance of the vertical scrolling; eliminated a potential endless loop triggered by key navigation with the "aqua" theme and selection type "cell"; fixed two regressions introduced in Tablelist 6.3, related to (1) the handling of the "-listvariable" option when using Itcl 3.x and (2) clearing the multiple or extended selection; further improvements and minor bug fixes; updated the copyright information. * scripts/tclIndex: Newly generated. * ../../examples/tablelist/*.tcl: Bumped the version number to 6.4; minor bug fixes; updated the copyright information. --- modules/tablelist/ChangeLog | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/modules/tablelist/ChangeLog b/modules/tablelist/ChangeLog index f5e4acf2..7d69b557 100644 --- a/modules/tablelist/ChangeLog +++ b/modules/tablelist/ChangeLog @@ -1,3 +1,27 @@ +2018-08-16 Csaba Nemethi + + * *.tcl: Bumped the version number to 6.4; updated the + * COPYRIGHT.txt: copyright information. + * README.txt: + + * CHANGES.txt: Updated to reflect the changes. + * doc/*.html: + + * scripts/*.tcl: Added the "-xmousewheelwindow" and + "-ymousewheelwindow" configuration options; optimized the deletion of + a list of items; improved the performance of the vertical scrolling; + eliminated a potential endless loop triggered by key navigation with + the "aqua" theme and selection type "cell"; fixed two regressions + introduced in Tablelist 6.3, related to (1) the handling of the + "-listvariable" option when using Itcl 3.x and (2) clearing the + multiple or extended selection; further improvements and minor bug + fixes; updated the copyright information. + + * scripts/tclIndex: Newly generated. + + * ../../examples/tablelist/*.tcl: Bumped the version number to 6.4; + minor bug fixes; updated the copyright information. + 2018-09-19 Csaba Nemethi * CHANGES.txt: Slightly extended. From 1d66a9f9848c1c6a3d358c8ceec8a940d77e1ea0 Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 7 Jan 2019 19:19:06 +0000 Subject: [PATCH 099/150] * *.tcl: Bumped the version number to 6.4; updated the * COPYRIGHT.txt: copyright information. * README.txt: --- modules/tablelist/COPYRIGHT.txt | 4 ++-- modules/tablelist/README.txt | 16 ++++++++++------ modules/tablelist/pkgIndex.tcl | 16 ++++++++-------- modules/tablelist/tablelist.tcl | 4 ++-- modules/tablelist/tablelistPublic.tcl | 4 ++-- modules/tablelist/tablelist_tile.tcl | 4 ++-- 6 files changed, 26 insertions(+), 22 deletions(-) diff --git a/modules/tablelist/COPYRIGHT.txt b/modules/tablelist/COPYRIGHT.txt index 03bb8356..307d5ad6 100644 --- a/modules/tablelist/COPYRIGHT.txt +++ b/modules/tablelist/COPYRIGHT.txt @@ -1,5 +1,5 @@ -Multi-column listbox and tree widget package Tablelist, version 6.3 -Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +Multi-column listbox and tree widget package Tablelist, version 6.4 +Copyright (c) 2000-2019 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) This library is free software; you can use, modify, and redistribute it for any purpose, provided that existing copyright notices are retained diff --git a/modules/tablelist/README.txt b/modules/tablelist/README.txt index 1d4733a4..a048149e 100644 --- a/modules/tablelist/README.txt +++ b/modules/tablelist/README.txt @@ -88,8 +88,8 @@ How to Get It? -------------- Tablelist is available for free download from the same URL as Wcb. The -distribution file is "tablelist6.3.tar.gz" for UNIX and -"tablelist6_3.zip" for Windows. These files contain the same +distribution file is "tablelist6.4.tar.gz" for UNIX and +"tablelist6_4.zip" for Windows. These files contain the same information, except for the additional carriage return character preceding the linefeed at the end of each line in the text files for Windows. @@ -108,15 +108,19 @@ locations of these library directories are given by the "tcl_library" and "tk_library" variables, respectively. To install Tablelist on UNIX, "cd" to the desired directory and unpack -the distribution file "tablelist6.3.tar.gz": +the distribution file "tablelist6.4.tar.gz": - gunzip -c tablelist6.3.tar.gz | tar -xf - + gunzip -c tablelist6.4.tar.gz | tar -xf - -This command will create a directory named "tablelist6.3 with the +On most UNIX systems this can be replaced with + + tar -zxf tablelist6.4.tar.gz + +Both commands will create a directory named "tablelist6.4 with the subdirectories "demos", "doc", and "scripts". On Windows, use WinZip or some other program capable of unpacking the -distribution file "tablelist6_3.zip" into the directory "tablelist6.3", +distribution file "tablelist6_4.zip" into the directory "tablelist6.4", with the subdirectories "demos", "doc", and "scripts". The file "tablelistEdit.tcl" in the "scripts" directory is only needed diff --git a/modules/tablelist/pkgIndex.tcl b/modules/tablelist/pkgIndex.tcl index ef7602df..1c81dbfb 100644 --- a/modules/tablelist/pkgIndex.tcl +++ b/modules/tablelist/pkgIndex.tcl @@ -1,28 +1,28 @@ #============================================================================== # Tablelist and Tablelist_tile package index file. # -# Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2000-2019 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== # # Regular packages: # -package ifneeded tablelist 6.3 \ +package ifneeded tablelist 6.4 \ [list source [file join $dir tablelist.tcl]] -package ifneeded tablelist_tile 6.3 \ +package ifneeded tablelist_tile 6.4 \ [list source [file join $dir tablelist_tile.tcl]] # # Aliases: # -package ifneeded Tablelist 6.3 \ - [list package require -exact tablelist 6.3] -package ifneeded Tablelist_tile 6.3 \ - [list package require -exact tablelist_tile 6.3] +package ifneeded Tablelist 6.4 \ + [list package require -exact tablelist 6.4] +package ifneeded Tablelist_tile 6.4 \ + [list package require -exact tablelist_tile 6.4] # # Code common to all packages: # -package ifneeded tablelist::common 6.3 \ +package ifneeded tablelist::common 6.4 \ "namespace eval ::tablelist { proc DIR {} {return [list $dir]} } ;\ source [list [file join $dir tablelistPublic.tcl]]" diff --git a/modules/tablelist/tablelist.tcl b/modules/tablelist/tablelist.tcl index 89e04a37..34533c88 100644 --- a/modules/tablelist/tablelist.tcl +++ b/modules/tablelist/tablelist.tcl @@ -1,11 +1,11 @@ #============================================================================== # Main Tablelist package module. # -# Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2000-2019 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== package require Tk 8 -package require -exact tablelist::common 6.3 +package require -exact tablelist::common 6.4 package provide tablelist $::tablelist::version package provide Tablelist $::tablelist::version diff --git a/modules/tablelist/tablelistPublic.tcl b/modules/tablelist/tablelistPublic.tcl index aec87417..44f80ac4 100644 --- a/modules/tablelist/tablelistPublic.tcl +++ b/modules/tablelist/tablelistPublic.tcl @@ -1,7 +1,7 @@ #============================================================================== # Main Tablelist and Tablelist_tile package module. # -# Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2000-2019 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== namespace eval ::tablelist { @@ -24,7 +24,7 @@ namespace eval ::tablelist { # # Public variables: # - variable version 6.3 + variable version 6.4 variable library if {$::tcl_version >= 8.4} { set library [file normalize [DIR]] diff --git a/modules/tablelist/tablelist_tile.tcl b/modules/tablelist/tablelist_tile.tcl index 6ff49467..40ffd66e 100644 --- a/modules/tablelist/tablelist_tile.tcl +++ b/modules/tablelist/tablelist_tile.tcl @@ -1,14 +1,14 @@ #============================================================================== # Main Tablelist_tile package module. # -# Copyright (c) 2000-2018 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) +# Copyright (c) 2000-2019 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de) #============================================================================== package require Tk 8.4 if {$::tk_version < 8.5 || [regexp {^8\.5a[1-5]$} $::tk_patchLevel]} { package require tile 0.6 } -package require -exact tablelist::common 6.3 +package require -exact tablelist::common 6.4 package provide tablelist_tile $::tablelist::version package provide Tablelist_tile $::tablelist::version From b7d6cb9fe638ddeb40ff0e61d145596e59a709b3 Mon Sep 17 00:00:00 2001 From: csaba Date: Mon, 7 Jan 2019 19:19:48 +0000 Subject: [PATCH 100/150] * CHANGES.txt: Updated to reflect the changes. * doc/*.html: --- modules/tablelist/CHANGES.txt | 32 ++- modules/tablelist/doc/index.html | 4 +- modules/tablelist/doc/tablelist.html | 97 +++++---- modules/tablelist/doc/tablelistBWidget.html | 2 +- modules/tablelist/doc/tablelistBinding.html | 2 +- modules/tablelist/doc/tablelistColSort.html | 2 +- modules/tablelist/doc/tablelistCombobox.html | 2 +- modules/tablelist/doc/tablelistCtext.html | 8 +- modules/tablelist/doc/tablelistIwidgets.html | 7 +- modules/tablelist/doc/tablelistMentry.html | 2 +- modules/tablelist/doc/tablelistThemes.html | 2 +- modules/tablelist/doc/tablelistTile.html | 2 +- modules/tablelist/doc/tablelistTkCore.html | 6 +- modules/tablelist/doc/tablelistWidget.html | 196 +++++++++++++++++-- 14 files changed, 289 insertions(+), 75 deletions(-) diff --git a/modules/tablelist/CHANGES.txt b/modules/tablelist/CHANGES.txt index 3228c8d0..2ba58ef1 100644 --- a/modules/tablelist/CHANGES.txt +++ b/modules/tablelist/CHANGES.txt @@ -1,6 +1,36 @@ -What is new in Tablelist 6.3? +What is new in Tablelist 6.4? ----------------------------- +1. Added the "-xmousewheelwindow" and "-ymousewheelwindow" configuration + options, which make it possible to redirect the mouse wheel events of + the tablelist's body to the containing scrollable window or toplevel + widget in case the focus is outside the tablelist (thanks to Michael + Niehren for discussions on this subject). + +2. Optimized the deletion of a list of items (thanks to Martin Lemburg + for his proposal). + +3. Improved the performance of the vertical scrolling (thanks to Olivier + Jolet for discussions on this subject). + +4. Eliminated a potential endless loop triggered by key navigation with + the "aqua" theme and selection type "cell" (thanks to Michael + Grundler for his bug report). + +5. Fixed a regression introduced in Tablelist 6.3, related to the + handling of the "-listvariable" option when using Itcl 3.x (thanks to + Ralf Fassel for his bug report and valuable contribution). + +6. Fixed another regression introduced in Tablelist 6.3, related to + clearing the multiple or extended selection (thanks to Martin Lemburg + for his bug report). + +7. Several further improvements and minor bug fixes in the code and + demo scripts. + +What was new in Tablelist 6.3? +------------------------------ + 1. Added the "-showbusycursor" configuration option, used to control whether the default bindings should display a busy cursor during the actions that can take a long time to complete, using the new diff --git a/modules/tablelist/doc/index.html b/modules/tablelist/doc/index.html index d483d558..f5d019f0 100644 --- a/modules/tablelist/doc/index.html +++ b/modules/tablelist/doc/index.html @@ -1,6 +1,6 @@ - The Multi-Column Listbox and Tree Widget Package Tablelist 6.3 + The Multi-Column Listbox and Tree Widget Package Tablelist 6.4
      -

      The Multi-Column Listbox and Tree Widget Package Tablelist 6.3

      +

      The Multi-Column Listbox and Tree Widget Package Tablelist 6.4

      by

      diff --git a/modules/tablelist/doc/tablelist.html b/modules/tablelist/doc/tablelist.html index 7a381573..f82183b0 100644 --- a/modules/tablelist/doc/tablelist.html +++ b/modules/tablelist/doc/tablelist.html @@ -13,7 +13,7 @@

      Tablelist Programmer's Guide

      -

      For Tablelist Version 6.3

      +

      For Tablelist Version 6.4

      by

      @@ -170,8 +170,8 @@

      What Is Tablelist?

      How to Get It?

      Tablelist is available for free download from the same URL as Wcb.  - The distribution file is tablelist6.3.tar.gz for UNIX and - tablelist6_3.zip for Windows.  These files contain the same + The distribution file is tablelist6.4.tar.gz for UNIX and + tablelist6_4.zip for Windows.  These files contain the same information, except for the additional carriage return character preceding the linefeed at the end of each line in the text files for Windows.

      @@ -194,21 +194,29 @@

      How to Install It?

      To install Tablelist on UNIX, cd to the desired directory and unpack the distribution file - tablelist6.3.tar.gz:

      + tablelist6.4.tar.gz:

      -gunzip -c tablelist6.3.tar.gz | tar -xf -
      +gunzip -c tablelist6.4.tar.gz | tar -xf -
       
      -

      This command will create a directory named tablelist6.3, with - the subdirectories demos, doc, and +

      On most UNIX systems this can be replaced with

      + +
      +
      +tar -zxf tablelist6.4.tar.gz
      +
      +
      + +

      Both commands will create a directory named tablelist6.4, + with the subdirectories demos, doc, and scripts.

      On Windows, use WinZip or some other program capable of unpacking - the distribution file tablelist6_3.zip into the directory - tablelist6.3, with the subdirectories demos, + the distribution file tablelist6_4.zip into the directory + tablelist6.4, with the subdirectories demos, doc, and scripts.

      The file tablelistEdit.tcl in the scripts @@ -305,14 +313,14 @@

      How to Use It?

      tablelist and tablelist_tile.

      REMARK:  If you have an earlier Tablelist version as part of - ActiveTcl 8.5 or above and the new Tablelist release 6.3, then it is highly - recommended to specify the version number 6.3 in the  + ActiveTcl 8.5 or above and the new Tablelist release 6.4, then it is highly + recommended to specify the version number 6.4 in the  package require  command, because otherwise the interpreter will load the old Tablelist version included in ActiveTcl as Tcl Module.  The examples below use the - statement  package require tablelist 6.3,  and their + statement  package require tablelist 6.4,  and their tile-based counterparts invoke the command  package require - tablelist_tile 6.3.

      + tablelist_tile 6.4.

      Since the packages Tablelist and Tablelist_tile are implemented in the tablelist namespace, you must either invoke the

      @@ -473,7 +481,7 @@

      A tablelist Widget for Displaying and Editing

      The file config.tcl in the demos directory contains a procedure demo::displayConfig that displays the configuration options of an arbitrary widget in a tablelist contained in a - newly created top-level widget and allows you to edit these options.  + newly created toplevel widget and allows you to edit these options.  This procedure can prove to be quite useful during interactive GUI development.  To test it, start wish and evaluate the file by using the source command as follows:

      @@ -499,7 +507,7 @@

      A tablelist Widget for Displaying and Editing
      -package require tablelist 6.3
      +package require tablelist 6.4
       source [file join $tablelist::library demos config.tcl]
       
      @@ -555,13 +563,13 @@

      A tablelist Widget for Displaying and Editing
      -package require tablelist 6.3
      +package require tablelist 6.4
       
       namespace eval demo {
           #
           # Get the current windowing system ("x11", "win32", "classic", or "aqua")
           # and add some entries to the Tk option database for the following
      -    # widget hierarchy within a top-level widget of the class DemoTop:
      +    # widget hierarchy within a toplevel widget of the class DemoTop:
           #
           # Name              Class
           # -----------------------------
      @@ -604,7 +612,7 @@ 

      A tablelist Widget for Displaying and Editing # demo::displayConfig # # Displays the configuration options of the widget w in a tablelist widget -# contained in a newly created top-level widget. Returns the name of the +# contained in a newly created toplevel widget. Returns the name of the # tablelist widget. #------------------------------------------------------------------------------ proc demo::displayConfig w { @@ -616,7 +624,7 @@

      A tablelist Widget for Displaying and Editing } # - # Create a top-level widget of the class DemoTop + # Create a toplevel widget of the class DemoTop # set top .configTop for {set n 2} {[winfo exists $top]} {incr n} { @@ -627,7 +635,7 @@

      A tablelist Widget for Displaying and Editing # # Create a scrolled tablelist widget with 5 dynamic-width - # columns and interactive sort capability within the top-level + # columns and interactive sort capability within the toplevel # set tf $top.tf frame $tf @@ -652,7 +660,7 @@

      A tablelist Widget for Displaying and Editing scrollbar $hsb -orient horizontal -command [list $tbl xview] # - # Create three buttons within a frame child of the top-level widget + # Create three buttons within a frame child of the toplevel widget # set bf $top.bf frame $bf @@ -974,7 +982,7 @@

      Two Widget Browsers Based on a tablelist

      demos directory contain a procedure demo::displayChildren that displays information about the children of an arbitrary widget in a tablelist contained in a newly created - top-level widget.  To test it, start wish and evaluate the + toplevel widget.  To test it, start wish and evaluate the chosen file by using the source command, in a similar way as in the case of the previous example.

      @@ -1036,7 +1044,7 @@

      Two Widget Browsers Based on a tablelist

       package require Tk 8.3
      -package require tablelist 6.3
      +package require tablelist 6.4
       
       namespace eval demo {
           variable dir [file dirname [info script]]
      @@ -1056,7 +1064,7 @@ 

      Two Widget Browsers Based on a tablelist

      # demo::displayChildren # # Displays information on the children of the widget w in a tablelist widget -# contained in a newly created top-level widget. Returns the name of the +# contained in a newly created toplevel widget. Returns the name of the # tablelist widget. #------------------------------------------------------------------------------ proc demo::displayChildren w { @@ -1068,7 +1076,7 @@

      Two Widget Browsers Based on a tablelist

      } # - # Create a top-level widget of the class DemoTop + # Create a toplevel widget of the class DemoTop # set top .browseTop for {set n 2} {[winfo exists $top]} {incr n} { @@ -1078,7 +1086,7 @@

      Two Widget Browsers Based on a tablelist

      # # Create a vertically scrolled tablelist widget with 9 dynamic-width - # columns and interactive sort capability within the top-level + # columns and interactive sort capability within the toplevel # set tf $top.tf frame $tf @@ -1136,7 +1144,7 @@

      Two Widget Browsers Based on a tablelist

      bind $bodyTag <<Button3>> +[list demo::postPopupMenu $top %X %Y] # - # Create three buttons within a frame child of the top-level widget + # Create three buttons within a frame child of the toplevel widget # set bf $top.bf frame $bf @@ -1634,7 +1642,7 @@

      A Directory Viewer Based on a tablelist

       package require Tk 8.3
      -package require tablelist 6.3
      +package require tablelist 6.4
       
       #
       # Add some entries to the Tk option database
      @@ -2022,7 +2030,7 @@ 

      Advanced Interactive tablelist Cell Editing

       package require Tk 8.4                          ;# because of "-compound"
      -package require tablelist 6.3
      +package require tablelist 6.4
       package require BWidget
       
       wm title . "Serial Line Configuration"
      @@ -2386,7 +2394,7 @@ 

      A tablelist Widget Containing Embedded Windows

      -package require tablelist 6.3
      +package require tablelist 6.4
       
       wm title . "Tk Library Scripts"
       
      @@ -2457,8 +2465,10 @@ 

      A tablelist Widget Containing Embedded Windows

      set maxSize $fileSize } } -$tbl header insert 0 [list "[$tbl size] *.tcl files" "" $totalSize "" ""] -$tbl header rowconfigure 0 -foreground blue +if {$tk_version >= 8.5} { + $tbl header insert 0 [list "[$tbl size] *.tcl files" "" $totalSize "" ""] + $tbl header rowconfigure 0 -foreground blue +}
      @@ -2556,6 +2566,7 @@

      A tablelist Widget Containing Embedded Windows

      set top .top$key if {[winfo exists $top]} { raise $top + focus $top return "" } @@ -2579,7 +2590,7 @@

      A tablelist Widget Containing Embedded Windows

      # Insert the file's content into the text widget # set chan [open $fileName] - $txt insert end [read $chan] + $txt insert end [read -nonewline $chan] close $chan . . . @@ -2593,14 +2604,14 @@

      A tablelist Widget Containing Embedded Windows

      -

      Each file will be displayed in a text widget contained in a top-level - whose name is .top$key, where $key is obtained with - the aid of the getkeys subcommand.  By using - the key instead of the row number, we will have a unique name for the - top-level, even if the order of the items changes due to interactive sorting - by a column.  (Remember that the embedded windows will be destroyed and - automatically recreated when sorting the items or moving the columns.)

      +

      Each file will be displayed in a text widget contained in a toplevel whose + name is .top$key, where $key is obtained with the + aid of the getkeys + subcommand.  By using the key instead of the row number, we will have a + unique name for the toplevel, even if the order of the items changes due to + interactive sorting by a column.  (Remember that the embedded windows + will be destroyed and automatically recreated when sorting the items or + moving the columns.)

      Having implemented the creation scripts for the frames and buttons, we can now use the Tile-Based Demo Scripts

       package require Tk 8.3                          ;# because of entry validation
      -package require tablelist 6.3
      +package require tablelist 6.4
       
      @@ -2649,7 +2660,7 @@

      Tile-Based Demo Scripts

      -package require tablelist_tile 6.3
      +package require tablelist_tile 6.4
       
      diff --git a/modules/tablelist/doc/tablelistBWidget.html b/modules/tablelist/doc/tablelistBWidget.html index 5f5f9233..46dd26a9 100644 --- a/modules/tablelist/doc/tablelistBWidget.html +++ b/modules/tablelist/doc/tablelistBWidget.html @@ -12,7 +12,7 @@

      Interactive Tablelist Cell Editing Using the BWidget Package

      -

      For Tablelist Version 6.3

      +

      For Tablelist Version 6.4

      by

      diff --git a/modules/tablelist/doc/tablelistBinding.html b/modules/tablelist/doc/tablelistBinding.html index c1d50eef..5c1a2f52 100644 --- a/modules/tablelist/doc/tablelistBinding.html +++ b/modules/tablelist/doc/tablelistBinding.html @@ -12,7 +12,7 @@

      Commands Related to Binding Scripts

      -

      For Tablelist Version 6.3

      +

      For Tablelist Version 6.4

      by

      diff --git a/modules/tablelist/doc/tablelistColSort.html b/modules/tablelist/doc/tablelistColSort.html index 9cc9096f..35ae9781 100644 --- a/modules/tablelist/doc/tablelistColSort.html +++ b/modules/tablelist/doc/tablelistColSort.html @@ -12,7 +12,7 @@

      Commands for Interactive Sorting by One or More Columns

      -

      For Tablelist Version 6.3

      +

      For Tablelist Version 6.4

      by

      diff --git a/modules/tablelist/doc/tablelistCombobox.html b/modules/tablelist/doc/tablelistCombobox.html index a0d25b2c..d43e4f51 100644 --- a/modules/tablelist/doc/tablelistCombobox.html +++ b/modules/tablelist/doc/tablelistCombobox.html @@ -12,7 +12,7 @@
      + tablelist configuration option to override the initial settings (except + the height) according to your needs.
      If the ctext widget's -wrap option was set to word or char (either by @@ -128,7 +128,7 @@

      The tablelist::addCtext Command

      interactive column resizing), its height will be set automatically to the number of display lines contained in it.  (The number of display lines is retrieved with the aid of the  count - -displaylines  ctext widget subcommand, introduced in Tk + -displaylines
        text widget subcommand, introduced in Tk 8.5.)
      If the widget callback package Wcb was loaded into the diff --git a/modules/tablelist/doc/tablelistIwidgets.html b/modules/tablelist/doc/tablelistIwidgets.html index e2e62ada..dc48cc7a 100644 --- a/modules/tablelist/doc/tablelistIwidgets.html +++ b/modules/tablelist/doc/tablelistIwidgets.html @@ -12,7 +12,7 @@

      Interactive Tablelist Cell Editing Using the Iwidgets Package

      -

      For Tablelist Version 6.3

      +

      For Tablelist Version 6.4

      by

      @@ -333,8 +333,9 @@

      The tablelist::addIncrCombobox
      The temporary embedded combobox widget associated with the above name will be created with its - -editable option set to 1.  You can - use the script corresponding to the -editable option set to 1 and its + -grab option set to global.  + You can use the script corresponding to the -editstartcommand tablelist configuration option to make the combobox non-editable or define validations for it, as well as for populating its listbox component (by diff --git a/modules/tablelist/doc/tablelistMentry.html b/modules/tablelist/doc/tablelistMentry.html index e2bad904..94aee89a 100644 --- a/modules/tablelist/doc/tablelistMentry.html +++ b/modules/tablelist/doc/tablelistMentry.html @@ -12,7 +12,7 @@

      Interactive Tablelist Cell Editing Using the Mentry Package

      -

      For Tablelist Version 6.3

      +

      For Tablelist Version 6.4

      by

      diff --git a/modules/tablelist/doc/tablelistThemes.html b/modules/tablelist/doc/tablelistThemes.html index ef14313a..31e1c58b 100644 --- a/modules/tablelist/doc/tablelistThemes.html +++ b/modules/tablelist/doc/tablelistThemes.html @@ -12,7 +12,7 @@

      Commands Related to Tile Themes

      -

      For Tablelist Version 6.3

      +

      For Tablelist Version 6.4

      by

      diff --git a/modules/tablelist/doc/tablelistTile.html b/modules/tablelist/doc/tablelistTile.html index 703b18b8..034c7ca9 100644 --- a/modules/tablelist/doc/tablelistTile.html +++ b/modules/tablelist/doc/tablelistTile.html @@ -12,7 +12,7 @@

      Interactive Tablelist Cell Editing Using Tile Widgets

      -

      For Tablelist Version 6.3

      +

      For Tablelist Version 6.4

      by

      diff --git a/modules/tablelist/doc/tablelistTkCore.html b/modules/tablelist/doc/tablelistTkCore.html index aee9be48..29808f1e 100644 --- a/modules/tablelist/doc/tablelistTkCore.html +++ b/modules/tablelist/doc/tablelistTkCore.html @@ -12,7 +12,7 @@

      Interactive Tablelist Cell Editing Using Tk Core Widgets

      -

      For Tablelist Version 6.3

      +

      For Tablelist Version 6.4

      by

      @@ -120,8 +120,8 @@

      Interactive Cell Editing Using the text Widget

      display lines (taking into account the line wraps) contained in it.  You can use the script corresponding to the -editstartcommand - tablelist configuration option to override the initial settings according - to your needs.
      + tablelist configuration option to override the initial settings (except + the height) according to your needs.

      If the text widget's -wrap option was set to word or char (either by diff --git a/modules/tablelist/doc/tablelistWidget.html b/modules/tablelist/doc/tablelistWidget.html index ad5a917b..3166be18 100644 --- a/modules/tablelist/doc/tablelistWidget.html +++ b/modules/tablelist/doc/tablelistWidget.html @@ -13,7 +13,7 @@

      The tablelist::tablelist Command

      -

      For Tablelist Version 6.3

      +

      For Tablelist Version 6.4

      by

      @@ -304,6 +304,12 @@

      Quick Reference

      -width characters
      +
      -xmousewheelwindow + window
      + +
      -ymousewheelwindow + window
      +
      COLUMN CONFIGURATION OPTIONS
      -align @@ -3334,11 +3340,12 @@

      Detailed Reference

      differences between them are as follows:

        -
      1. The command specified by the -populatecommand - option is only invoked for rows whose children have not been inserted - yet, while the one specified by -expandcommand is - always invoked before expanding a row, regardless of whether the - children of that row are already present in the widget or not.
      2. +
      3. The command specified by the + -populatecommand option is only invoked for rows + whose children have not been inserted yet, while the one specified by + -expandcommand is always invoked before expanding + a row, regardless of whether the children of that row are already + present in the widget or not.
      4. The command specified by the -expandcommand option may perform visual changes @@ -5604,6 +5611,158 @@

        Detailed Reference

      +
      + + + + + + + + + + + + + + + + + + +
      Command-Line Name: -xmousewheelwindow
      Database Name: xMouseWheelWindow
      Database Class: MouseWheelWindow
      + +
      +

      This option is only relevant if the mouse wheel events are reported + to the widget under the pointer rather than to the one having the + focus.  This condition is fulfilled on X11 and Mac OS X, and for + Tk 8.6b2 and later on Windows, too (in earlier Tk versions the mouse + wheel events on Windows were sent to the widget having the focus).

      + +

      The -xmousewheelwindow option specifies the path + name of the window to which the default bindings for the binding tags + TablelistBody and + TablelistEdit should + redirect the mouse wheel events along the x axis via  + event generate  if the focus window on the + display containing the tablelist widget is outside the tablelist.  + The default is an empty string, meaning that the mouse wheel events + along the x axis received by a widget having one of the two + above-mentioned binding tags will give rise to horizontal scrolling of + the tablelist or its edit window, regardless of whether the focus is + inside or outside the tablelist widget.

      + +

      REMARK 1:  The mouse wheel events along the horizontal + axis are <Shift-MouseWheel> on Windows, + <Shift-MouseWheel> and + <Shift-Option-MouseWheel> on Mac OS X, and + <Shift-MouseWheel>, + <Shift-Button-4> and + <Shift-Button-5> on X11 (where + <Shift-MouseWheel> is not triggered by the X + server, but can be produced using  + event generate).

      + +

      REMARK 2:  If the tablelist is contained in a scrollable + widget container like a BWidget ScrollableFrame or + iwidgets::scrolledframe, and you set this option to the path name of + that container window or that of the containing toplevel widget, then a + horizontal mouse wheel event over the tablelist's body will be handled + as follows:

      + +
        +
      • If the focus is inside the tablelist widget then the + event will scroll the tablelist or its edit window horizontally and + no further processing of the event will take place.
      • + +
      • If the focus is outside the tablelist widget then no + scrolling of the tablelist's body or edit window will happen.  + Instead, the event will be redirected to the widget container with + the aid of the  event generate  + command.  This in turn will give rise to horizontal scrolling of + the widget container, provided that the containing toplevel widget or + the binding tag all has the necessary mouse wheel + event bindings.
      • +
      +
      +
      + +
      + + + + + + + + + + + + + + + + + + +
      Command-Line Name: -ymousewheelwindow
      Database Name: yMouseWheelWindow
      Database Class: MouseWheelWindow
      + +
      +

      This option is only relevant if the mouse wheel events are reported + to the widget under the pointer rather than to the one having the + focus.  This condition is fulfilled on X11 and Mac OS X, and for + Tk 8.6b2 and later on Windows, too (in earlier Tk versions the mouse + wheel events on Windows were sent to the widget having the focus).

      + +

      The -ymousewheelwindow option specifies the path + name of the window to which the default bindings for the binding tags + TablelistBody and + TablelistEdit should + redirect the mouse wheel events along the y axis via  + event generate  if the focus window on the + display containing the tablelist widget is outside the tablelist.  + The default is an empty string, meaning that the mouse wheel events + along the y axis received by a widget having one of the two + above-mentioned binding tags will give rise to vertical scrolling of + the tablelist or its edit window, regardless of whether the focus is + inside or outside the tablelist widget.

      + +

      REMARK 1:  The mouse wheel events along the vertical + axis are <MouseWheel> on Windows, + <MouseWheel> and + <Option-MouseWheel> on Mac OS X, and + <MouseWheel>, + <Button-4> and + <Button-5> on X11 (where + <MouseWheel> is not triggered by the X + server, but can be produced using  + event generate).

      + +

      REMARK 2:  If the tablelist is contained in a scrollable + widget container like a BWidget ScrollableFrame or + iwidgets::scrolledframe, and you set this option to the path name of + that container window or that of the containing toplevel widget, then a + vertical mouse wheel event over the tablelist's body will be handled as + follows:

      + +
        +
      • If the focus is inside the tablelist widget then the + event will scroll the tablelist or its edit window vertically and no + further processing of the event will take place.
      • + +
      • If the focus is outside the tablelist widget then no + scrolling of the tablelist's body or edit window will happen.  + Instead, the event will be redirected to the widget container with + the aid of the  event generate  + command.  This in turn will give rise to vertical scrolling of + the widget container, provided that the containing toplevel widget or + the binding tag all has the necessary mouse wheel + event bindings.
      • +
      +
      +
      +
      COLUMN CONFIGURATION OPTIONS
      The following options are currently supported by the Detailed Reference <<TablelistViewUpdated>> Generated whenever the tablelist widget has finished updating its - view.  Updating the view of a tablelist widget is a complex - operation, which, for performance reasons, is performed at idle - time. + view (which, for performance reasons, is performed at idle + time). Not used. @@ -7999,6 +8157,9 @@

      Detailed Reference

      . . . } } + +# Make sure to register the tablelist's body explicitly as a drag source: +registerDragSrc [$tbl bodypath]
      @@ -8033,10 +8194,20 @@

      Detailed Reference

      . . . } } + +# Make sure to register the tablelist's body explicitly as a drag source: +registerDragSrc [$tbl bodypath] +
      In both examples above we also invoke the procedure + registerDragSrc explicitly for the tablelist's body, + because the widget registered as a drag source by its invocation on a + <Button-1> event can be different from the body + component, and the default bindings need the information whether + the tablelist's body was registered as a drag source.
      +
      pathName canceledediting
      @@ -10372,7 +10543,7 @@

      Detailed Reference

      cell being edited is brought into view; (b) else, if exactly one item is selected then the view is shifted to bring that item into view; (c) else, if the tablelist's body is the most recent window to have the - input focus among all the windows in the same top-level as the widget + input focus among all the windows in the same toplevel as the widget itself then the currently active item is brought into view.
      pathName @@ -10798,8 +10969,9 @@

      Detailed Reference

      HEADER-RELATED SUBCOMMANDS
      - The header tablelist command, used to invoke various - operations on the header items, has the following general form: + The header tablelist command, + used to invoke various operations on the header items, has the following + general form:
      
      From 68b9d35dae9cac3352380f94b28f9e66e2d64c53 Mon Sep 17 00:00:00 2001
      From: csaba 
      Date: Mon, 7 Jan 2019 19:20:55 +0000
      Subject: [PATCH 101/150] 	* scripts/*.tcl: Added the
       "-xmousewheelwindow" and 	  "-ymousewheelwindow" configuration options;
       optimized the deletion of 	  a list of items; improved the performance of
       the vertical scrolling; 	  eliminated a potential endless loop
       triggered by key navigation with 	  the "aqua" theme and selection type
       "cell"; fixed two regressions 	  introduced in Tablelist 6.3, related to (1)
       the handling of the 	  "-listvariable" option when using Itcl 3.x and (2)
       clearing the 	  multiple or extended selection; further improvements and
       minor bug 	  fixes; updated the copyright information.
      
      ---
       modules/tablelist/scripts/mwutil.tcl          |  60 +++++-
       modules/tablelist/scripts/repair.tcl          |   2 +-
       modules/tablelist/scripts/tablelistBind.tcl   | 199 +++++++++++++-----
       modules/tablelist/scripts/tablelistConfig.tcl |  30 ++-
       modules/tablelist/scripts/tablelistEdit.tcl   | 195 +++++++++++------
       modules/tablelist/scripts/tablelistImages.tcl |   2 +-
       modules/tablelist/scripts/tablelistMove.tcl   |  29 +--
       modules/tablelist/scripts/tablelistSort.tcl   |   8 +-
       modules/tablelist/scripts/tablelistThemes.tcl |   2 +-
       modules/tablelist/scripts/tablelistUtil.tcl   | 107 +++++-----
       modules/tablelist/scripts/tablelistWidget.tcl | 144 ++++++++-----
       11 files changed, 522 insertions(+), 256 deletions(-)
      
      diff --git a/modules/tablelist/scripts/mwutil.tcl b/modules/tablelist/scripts/mwutil.tcl
      index c73ce416..b2926784 100644
      --- a/modules/tablelist/scripts/mwutil.tcl
      +++ b/modules/tablelist/scripts/mwutil.tcl
      @@ -5,7 +5,7 @@
       #   - Namespace initialization
       #   - Public utility procedures
       #
      -# Copyright (c) 2000-2018  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
      +# Copyright (c) 2000-2019  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
       #==============================================================================
       
       package require Tk 8
      @@ -19,8 +19,13 @@ namespace eval mwutil {
           #
           # Public variables:
           #
      -    variable version	2.10
      -    variable library	[file dirname [info script]]
      +    variable version	2.11
      +    variable library
      +    if {$::tcl_version >= 8.4} {
      +	set library	[file dirname [file normalize [info script]]]
      +    } else {
      +	set library	[file dirname [info script]] ;# no "file normalize" yet
      +    }
       
           #
           # Public procedures:
      @@ -29,7 +34,8 @@ namespace eval mwutil {
       			defineKeyNav processTraversal focusNext focusPrev \
       			configureWidget fullConfigOpt fullOpt enumOpts \
       			configureSubCmd attribSubCmd hasattribSubCmd \
      -			unsetattribSubCmd getScrollInfo
      +			unsetattribSubCmd getScrollInfo hasFocus \
      +			genMouseWheelEvent
       
           #
           # Make modified versions of the procedures tk_focusNext and
      @@ -44,10 +50,10 @@ namespace eval mwutil {
       	#
       	# Build the procedures focusNext and focusPrev
       	#
      -	foreach direction {Next Prev} {
      -	    set procBody [info body tk_focus$direction]
      +	foreach dir {Next Prev} {
      +	    set procBody [info body tk_focus$dir]
       	    regsub -all {winfo children} $procBody {getChildren $class} procBody
      -	    proc focus$direction {w class} $procBody
      +	    proc focus$dir {w class} $procBody
       	}
           }
           makeFocusProcs 
      @@ -140,7 +146,7 @@ proc mwutil::defineKeyNav class {
       #
       # Processes the given traversal event for the mega-widget of the specified
       # class containing the widget w if that mega-widget is not the only widget
      -# receiving the focus during keyboard traversal within its top-level widget.
      +# receiving the focus during keyboard traversal within its toplevel widget.
       #------------------------------------------------------------------------------
       proc mwutil::processTraversal {w class event} {
           set win [getAncestorByClass $w $class]
      @@ -152,9 +158,9 @@ proc mwutil::processTraversal {w class event} {
           }
       
           if {[string compare $target $win] != 0} {
      -	set focus [focus]
      -	if {[string length $focus] != 0} {
      -	    event generate $focus <>
      +	set focusWin [focus -displayof $win]
      +	if {[string length $focusWin] != 0} {
      +	    event generate $focusWin <>
       	}
       
       	focus $target
      @@ -511,3 +517,35 @@ proc mwutil::getScrollInfo argList {
       	return -code error "unknown option \"$opt\": must be moveto or scroll"
           }
       }
      +
      +#------------------------------------------------------------------------------
      +# mwutil::hasFocus
      +#
      +# Returns a boolean value indicating whether the focus window is (a descendant
      +# of) the widget w.
      +#------------------------------------------------------------------------------
      +proc mwutil::hasFocus w {
      +    return [expr {[string first $w. [focus -displayof $w].] == 0}]
      +}
      +
      +#------------------------------------------------------------------------------
      +# mwutil::genMouseWheelEvent
      +#
      +# Generates a mouse wheel event with the given root coordinates and delta on
      +# the widget w.
      +#------------------------------------------------------------------------------
      +proc mwutil::genMouseWheelEvent {w event rootX rootY delta} {
      +    set needsFocus [expr {[package vcompare $::tk_patchLevel "8.6b2"] < 0 &&
      +	[string compare $::tcl_platform(platform) "windows"] == 0}]
      +
      +    if {$needsFocus} {
      +	set focusWin [focus -displayof $w]
      +	focus $w
      +    }
      +
      +    event generate $w $event -rootx $rootX -rooty $rootY -delta $delta
      +
      +    if {$needsFocus} {
      +	focus $focusWin
      +    }
      +}
      diff --git a/modules/tablelist/scripts/repair.tcl b/modules/tablelist/scripts/repair.tcl
      index aa43be53..20624ebc 100755
      --- a/modules/tablelist/scripts/repair.tcl
      +++ b/modules/tablelist/scripts/repair.tcl
      @@ -10,7 +10,7 @@
       # 8.4a2), which causes excessive memory use when calling "info exists" on
       # non-existent array elements.
       #
      -# Copyright (c) 2001-2018  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
      +# Copyright (c) 2001-2019  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
       #==============================================================================
       
       set procDef {
      diff --git a/modules/tablelist/scripts/tablelistBind.tcl b/modules/tablelist/scripts/tablelistBind.tcl
      index f5b2a8ea..b45b8b55 100644
      --- a/modules/tablelist/scripts/tablelistBind.tcl
      +++ b/modules/tablelist/scripts/tablelistBind.tcl
      @@ -9,7 +9,7 @@
       #   - Binding tag TablelistHeader
       #   - Binding tags TablelistLabel, TablelistSubLabel, and TablelistArrow
       #
      -# Copyright (c) 2000-2018  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
      +# Copyright (c) 2000-2019  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
       #==============================================================================
       
       #
      @@ -277,7 +277,8 @@ proc tablelist::cleanup win {
           # If there is a list variable associated with the
           # widget then remove the trace set on this variable
           #
      -    if {$data(hasListVar) && [info exists ::$data(-listvariable)]} {
      +    if {$data(hasListVar) &&
      +	[uplevel #0 [list info exists $data(-listvariable)]]} {
       	upvar #0 $data(-listvariable) var
       	trace vdelete var wu $data(listVarTraceCmd)
           }
      @@ -760,7 +761,6 @@ proc tablelist::defineTablelistBody {} {
           foreach event {