QuickWho

Check-in [166533de43]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Moving ahead on macOS
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: 166533de43e3027e7684784779b3cf05df87c919
User & Date: kevin 2020-02-06 03:32:21
Context
2020-02-06
14:27
Work on Services integration for macOS check-in: 61fd87e53e user: kevin tags: trunk
03:32
Moving ahead on macOS check-in: 166533de43 user: kevin tags: trunk
2020-01-29
14:11
Add new user help check-in: f9d851e0a1 user: kevin tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to QuickWho.py.

10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27


28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from tkinter import filedialog
from tkinter import messagebox
import os
import sys
from tkinter import ttk as Tile
import time
import pickle
import bwidget
import re
import pythonwhois
import webbrowser
import urllib.request, urllib.error, urllib.parse
import socket
import json
import shutil
import hashlib
import tempfile
from distutils.dir_util import copy_tree





#custom class for configuring hyperlinks, based on http://stackoverflow.com/questions/3781670/tkinter-text-highlighting-in-python
class CustomText(Text):
    '''A text widget with a new method, HighlightPattern 

    example:

    text = CustomText()
    text.tag_configure("red",foreground="#ff0000")
    text.HighlightPattern("this should be red", "red")

    The highlight_pattern method is a simplified python 
    version of the tcl code at http://wiki.tcl.tk/3246
    '''
    def __init__(self, *args, **kwargs):
        Text.__init__(self, *args, **kwargs)

    def highlight_pattern(self, pattern, tag, start="1.0", end="end", regexp=False):
        '''Apply the given tag to all text that matches the given pattern







<










>
>





|







|







10
11
12
13
14
15
16

17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
from tkinter import filedialog
from tkinter import messagebox
import os
import sys
from tkinter import ttk as Tile
import time
import pickle

import re
import pythonwhois
import webbrowser
import urllib.request, urllib.error, urllib.parse
import socket
import json
import shutil
import hashlib
import tempfile
from distutils.dir_util import copy_tree
import ToolTip




#custom class for configuring hyperlinks, based on http://stackoverflow.com/questions/3781670/tkinter-text-highlighting-in-python
class CustomText(Text):
    '''A text widget with a new method, HighlightPattern

    example:

    text = CustomText()
    text.tag_configure("red",foreground="#ff0000")
    text.HighlightPattern("this should be red", "red")

    The highlight_pattern method is a simplified python
    version of the tcl code at http://wiki.tcl.tk/3246
    '''
    def __init__(self, *args, **kwargs):
        Text.__init__(self, *args, **kwargs)

    def highlight_pattern(self, pattern, tag, start="1.0", end="end", regexp=False):
        '''Apply the given tag to all text that matches the given pattern
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91

92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
        while True:
            index = self.search(pattern, "matchEnd","searchLimit",
                                count=count, regexp=regexp)
            if index == "": break
            self.mark_set("matchStart", index)
            self.mark_set("matchEnd", "%s+%sc" % (index,count.get()))
            self.tag_add(tag, "matchStart","matchEnd")
            


class quickwhoApp(Tk):

    def __init__(self, parent):
        Tk.__init__(self, parent)
        try:
            self.tk.call('console', 'hide')
        except TclError:
            pass
        self.setAppName('QuickWho', '7.0')
        self.makeImages()
        if self.isAqua():
            self.tk.call('package', 'require', 'cocoaprint')
			self.tk.call('package', 'require', 'darkaqua')
		if self.isWindows():
			self.tk.call('package require dde')
            self.tk.eval('dde servername QuickWho')
			
        self.tk.createcommand('getDomain', self.getDomain)
         
        self.tk.call('package', 'require', 'softwareupdate')
        self.tk.call('softwareupdate::setVersion', self.appname, self.appversion)  
        self.tk.call('package', 'require', 'xplat')

        self.prefsdir = str(self.tk.call('xplat::appconfig', 'QuickWho'))
        self.cachedir = tempfile.gettempdir()
        
        if sys.platform == "darwin": self.accelkey = "Command-"
        else: self.accelkey ="Control-"

        self.drawGUI()
        self.tk.call('package', 'require', 'machelp')
        self.tk.call('machelp::setAppName', self.appname, self.appversion)
  
        self.printfile=os.path.join(self.cachedir, 'whois_output.txt')
        

    #test for Windows
    def isWindows(self):
        return  'win32' in self.tk.call('tk', 'windowingsystem')

    def isAqua(self):
        return 'aqua' in self.tk.call('tk', 'windowingsystem')







|














|
|
|

<

|

|

>


|






|

|







61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86

87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
        while True:
            index = self.search(pattern, "matchEnd","searchLimit",
                                count=count, regexp=regexp)
            if index == "": break
            self.mark_set("matchStart", index)
            self.mark_set("matchEnd", "%s+%sc" % (index,count.get()))
            self.tag_add(tag, "matchStart","matchEnd")



class quickwhoApp(Tk):

    def __init__(self, parent):
        Tk.__init__(self, parent)
        try:
            self.tk.call('console', 'hide')
        except TclError:
            pass
        self.setAppName('QuickWho', '7.0')
        self.makeImages()
        if self.isAqua():
            self.tk.call('package', 'require', 'cocoaprint')
            self.tk.call('package', 'require', 'darkaqua')
        if self.isWindows():
            self.tk.call('package require dde')
            self.tk.eval('dde servername QuickWho')

        self.tk.createcommand('getDomain', self.getDomain)
        self.tk.call('package', 'require', 'regproc')
        self.tk.call('package', 'require', 'softwareupdate')
        self.tk.call('softwareupdate::setVersion', self.appname, self.appversion)
        self.tk.call('package', 'require', 'xplat')
        self.tk.call('package', 'require', 'Img')
        self.prefsdir = str(self.tk.call('xplat::appconfig', 'QuickWho'))
        self.cachedir = tempfile.gettempdir()

        if sys.platform == "darwin": self.accelkey = "Command-"
        else: self.accelkey ="Control-"

        self.drawGUI()
        self.tk.call('package', 'require', 'machelp')
        self.tk.call('machelp::setAppName', self.appname, self.appversion)

        self.printfile=os.path.join(self.cachedir, 'whois_output.txt')


    #test for Windows
    def isWindows(self):
        return  'win32' in self.tk.call('tk', 'windowingsystem')

    def isAqua(self):
        return 'aqua' in self.tk.call('tk', 'windowingsystem')
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266

        #icon data
        icondata = """
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
      """

        self.logo = PhotoImage("logo", data=icondata)

  		
		update_icon = """
		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
		"""
		
		self.updateicon = PhotoImage("updateicon", data = update_icon)
 
        #magnifying glass
        glassdata = """
#define xbm_search_32_width 32
#define xbm_search_32_height 32
static char xbm_search_32_bits[] = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 
  0xC0, 0xFF, 0x00, 0x00, 0xF0, 0xE1, 0x03, 0x00, 0x70, 0x80, 0x07, 0x00, 
  0x38, 0x00, 0x07, 0x00, 0x1C, 0x00, 0x06, 0x00, 0x1C, 0x00, 0x0E, 0x00, 
  0x1C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 
  0x0C, 0x00, 0x0C, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x18, 0x00, 0x0E, 0x00, 
  0x38, 0x00, 0x07, 0x00, 0x70, 0x80, 0x0F, 0x00, 0xE0, 0xE3, 0x3F, 0x00, 
  0xE0, 0xFF, 0x7F, 0x00, 0x00, 0xBF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x01, 
  0x00, 0x00, 0xFE, 0x03, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0xF8, 0x0F, 
  0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0xC0, 0x3F, 
  0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x06, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };

      """

        self.searchphoto = BitmapImage("glass", data=glassdata)

		#glass for search field
		searchdata = """
		
		#define xbm_search_16_width 16
#define xbm_search_16_height 16
static char xbm_search_16_bits[] = {
  0x00, 0x00, 0xF8, 0x00, 0x8C, 0x01, 0x06, 0x03, 0x06, 0x02, 0x02, 0x03, 
  0x02, 0x02, 0x06, 0x03, 0x9C, 0x07, 0xF8, 0x0F, 0x00, 0x1F, 0x00, 0x3E, 
  0x00, 0x7C, 0x00, 0x78, 0x00, 0x30, 0x00, 0x00, };
  """
		self.smallsearch= BitmapImage("searchglass", data = searchdata)

        compassdata = """
#define xbm_bookmark_32_width 32
#define xbm_bookmark_32_height 32
static char xbm_bookmark_32_bits[] = {
  0xFE, 0xFF, 0x0F, 0x00, 0xFF, 0xFF, 0x0F, 0x00, 0x03, 0x00, 0x03, 0x00, 
  0x07, 0x00, 0x03, 0x00, 0xFF, 0xFF, 0x0F, 0x00, 0xFF, 0xFF, 0x0F, 0x00, 
  0x0F, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0C, 0x00, 
  0x0F, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0C, 0x00, 
  0x0F, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0C, 0x00, 
  0x0F, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0C, 0x00, 
  0x0F, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0C, 0x00, 
  0x0F, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0C, 0x00, 
  0xFF, 0xFF, 0x0F, 0x00, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0xFC, 0x00, 0x00, 
  0x00, 0xFC, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 
  0x00, 0xDC, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, };



"""
        self.compassphoto = BitmapImage("compass", data=compassdata)

    #aboutwindow

    def aboutWindow(self):
       
        messagebox.showinfo(title='About QuickWho',   message='QuickWho: Domain Name Service', 
		icon='info', parent=self, detail='Version 7.0\n(c) 2019 WordTech Communications LLC')
        

    #draw the GUI
    def drawGUI(self):

        self.title('QuickWho')
        self.option_add('*tearOff', FALSE)
        if self.isWindows():
            self.tk.call('wm', 'iconphoto', self, '-default', self.logo)
        else:
            self.tk.call('wm', 'iconphoto', self, '-default', self.maclogo)
 
        #make the menu
        self.mb = Menu(self)

        if self.isAqua():
            self.createcommand('::tk::mac::Quit', self.closeApp)
            self.createcommand('::tk::mac::ReopenApplication', self.reopenApp)
            self.protocol('WM_DELETE_WINDOW', self.hideWindow)
            self.bind("<{}-W>".format(self.accelkey), lambda event: self.hideWindow())
            self.bind("<{}-w>".format(self.accelkey), lambda event: self.hideWindow())
        self.bind("<{}-q>".format(self.accelkey), lambda event: self.closeApp())
        self.bind("<{}-Q>".format(self.accelkey), lambda event: self.closeApp())
        
        if self.isAqua():
            self.applemenu = Menu(self.mb, name='apple')
            self.mb.add_cascade(label='QuickWho', menu=self.applemenu)
            self.applemenu.add_command(label='About QuickWho', command=self.aboutWindow)
            self.applemenu.add_command(label='Check for Updates', command=self.checkUpdate)
            self.applemenu.add_separator()
            
        self.infomenu = Menu(self.mb)
        self.mb.add_cascade(label='Whois', menu=self.infomenu)
        self.infomenu.add_command(label='Get Information', accelerator=self.accelkey + 'I', command=self.getInfo)
        self.bind("<{}-I>".format(self.accelkey), lambda event: self.getInfo())
        self.bind("<{}-i>".format(self.accelkey), lambda event: self.getInfo())
        self.infomenu.add_command(label='Save Log', command=self.saveLog, accelerator=self.accelkey + 'S')
        self.bind("<{}-s>".format(self.accelkey),lambda event: self.saveLog())
        self.bind("<{}-S>".format(self.accelkey), lambda event: self.saveLog())
        self.infomenu.add_separator()
        if self.isAqua():
            self.infomenu.add_command(label="Page Setup", command=self.pageSetup)
        self.infomenu.add_command(label='Print Log', accelerator=self.accelkey +'P', command=lambda: self.printLog())
        self.bind("<{}-p>".format(self.accelkey), lambda event: self.printLog())
        self.bind("<{}-P>".format(self.accelkey), lambda event: self.printLog())
        if self.isWindows():
            self.infomenu.add_command(label="Exit", command=self.closeApp)
            
        self.helpmenu = Menu(self.mb, name='help')
        self.mb.add_cascade(label='Help', menu=self.helpmenu)
        if self.isWindows():
            self.helpmenu.add_command(label='Help', command=self.showHelp)
        self.helpmenu.add_command(label='Contact Code by Kevin', command=self.getHelp)
        self.helpmenu.add_command(label='Web Site', command=self.getWebSite)
        if self.isWindows():  
            self.helpmenu.add_command(label='About QuickWho', command=self.aboutWindow)
            self.helpmenu.add_command(label='Check for Updates', command=self.checkUpdate)
 
        self.configure(menu=self.mb)


        self.mainframe = Tile.Frame(self)
        self.mainframe.pack(side=TOP, fill=BOTH, expand=YES)
        
        #main frame
        self.bottomframe=Tile.Frame(self.mainframe)
        self.bottomframe.pack(side=BOTTOM, fill=BOTH, expand=YES)


        #configure the searchfield
        style = Tile.Style()







<
<
|
|
|
<
|
<





|
|
|
|
|
|
|
|
|
|






|
|
<
|
|
|
|
|


|





|
|
|
|
|
|
|
|
|
|










|
|
|
|








<
<
|











|






|
















|






|


|





|







122
123
124
125
126
127
128


129
130
131

132

133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155

156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200


201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260

        #icon data
        icondata = """
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
      """

        self.logo = PhotoImage("logo", data=icondata)


        update_icon = """
                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
                """

        self.updateicon = PhotoImage("updateicon", data=update_icon)

        #magnifying glass
        glassdata = """
#define xbm_search_32_width 32
#define xbm_search_32_height 32
static char xbm_search_32_bits[] = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00,
  0xC0, 0xFF, 0x00, 0x00, 0xF0, 0xE1, 0x03, 0x00, 0x70, 0x80, 0x07, 0x00,
  0x38, 0x00, 0x07, 0x00, 0x1C, 0x00, 0x06, 0x00, 0x1C, 0x00, 0x0E, 0x00,
  0x1C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00,
  0x0C, 0x00, 0x0C, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x18, 0x00, 0x0E, 0x00,
  0x38, 0x00, 0x07, 0x00, 0x70, 0x80, 0x0F, 0x00, 0xE0, 0xE3, 0x3F, 0x00,
  0xE0, 0xFF, 0x7F, 0x00, 0x00, 0xBF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x01,
  0x00, 0x00, 0xFE, 0x03, 0x00, 0x00, 0xFC, 0x07, 0x00, 0x00, 0xF8, 0x0F,
  0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0xC0, 0x3F,
  0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x06,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };

      """

        self.searchphoto = BitmapImage("glass", data=glassdata)

        #glass for search field
        searchdata = """

        #define xbm_search_16_width 16
        #define xbm_search_16_height 16
        static char xbm_search_16_bits[] = {
  0x00, 0x00, 0xF8, 0x00, 0x8C, 0x01, 0x06, 0x03, 0x06, 0x02, 0x02, 0x03,
  0x02, 0x02, 0x06, 0x03, 0x9C, 0x07, 0xF8, 0x0F, 0x00, 0x1F, 0x00, 0x3E,
  0x00, 0x7C, 0x00, 0x78, 0x00, 0x30, 0x00, 0x00, };
  """
        self.smallsearch= BitmapImage("searchglass", data = searchdata)

        compassdata = """
#define xbm_bookmark_32_width 32
#define xbm_bookmark_32_height 32
static char xbm_bookmark_32_bits[] = {
  0xFE, 0xFF, 0x0F, 0x00, 0xFF, 0xFF, 0x0F, 0x00, 0x03, 0x00, 0x03, 0x00,
  0x07, 0x00, 0x03, 0x00, 0xFF, 0xFF, 0x0F, 0x00, 0xFF, 0xFF, 0x0F, 0x00,
  0x0F, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0C, 0x00,
  0x0F, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0C, 0x00,
  0x0F, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0C, 0x00,
  0x0F, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0C, 0x00,
  0x0F, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0C, 0x00,
  0x0F, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0C, 0x00,
  0xFF, 0xFF, 0x0F, 0x00, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0xFC, 0x00, 0x00,
  0x00, 0xFC, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00,
  0x00, 0xDC, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, };



"""
        self.compassphoto = BitmapImage("compass", data=compassdata)

    #aboutwindow

    def aboutWindow(self):

        messagebox.showinfo(title='About QuickWho',   message='QuickWho: Domain Name Service',
                icon='info', parent=self, detail='Version 7.0\n(c) 2020 WordTech Communications LLC')


    #draw the GUI
    def drawGUI(self):

        self.title('QuickWho')
        self.option_add('*tearOff', FALSE)
        if self.isWindows():
            self.tk.call('wm', 'iconphoto', self, '-default', self.logo)



        #make the menu
        self.mb = Menu(self)

        if self.isAqua():
            self.createcommand('::tk::mac::Quit', self.closeApp)
            self.createcommand('::tk::mac::ReopenApplication', self.reopenApp)
            self.protocol('WM_DELETE_WINDOW', self.hideWindow)
            self.bind("<{}-W>".format(self.accelkey), lambda event: self.hideWindow())
            self.bind("<{}-w>".format(self.accelkey), lambda event: self.hideWindow())
        self.bind("<{}-q>".format(self.accelkey), lambda event: self.closeApp())
        self.bind("<{}-Q>".format(self.accelkey), lambda event: self.closeApp())

        if self.isAqua():
            self.applemenu = Menu(self.mb, name='apple')
            self.mb.add_cascade(label='QuickWho', menu=self.applemenu)
            self.applemenu.add_command(label='About QuickWho', command=self.aboutWindow)
            self.applemenu.add_command(label='Check for Updates', command=self.checkUpdate)
            self.applemenu.add_separator()

        self.infomenu = Menu(self.mb)
        self.mb.add_cascade(label='Whois', menu=self.infomenu)
        self.infomenu.add_command(label='Get Information', accelerator=self.accelkey + 'I', command=self.getInfo)
        self.bind("<{}-I>".format(self.accelkey), lambda event: self.getInfo())
        self.bind("<{}-i>".format(self.accelkey), lambda event: self.getInfo())
        self.infomenu.add_command(label='Save Log', command=self.saveLog, accelerator=self.accelkey + 'S')
        self.bind("<{}-s>".format(self.accelkey),lambda event: self.saveLog())
        self.bind("<{}-S>".format(self.accelkey), lambda event: self.saveLog())
        self.infomenu.add_separator()
        if self.isAqua():
            self.infomenu.add_command(label="Page Setup", command=self.pageSetup)
        self.infomenu.add_command(label='Print Log', accelerator=self.accelkey +'P', command=lambda: self.printLog())
        self.bind("<{}-p>".format(self.accelkey), lambda event: self.printLog())
        self.bind("<{}-P>".format(self.accelkey), lambda event: self.printLog())
        if self.isWindows():
            self.infomenu.add_command(label="Exit", command=self.closeApp)

        self.helpmenu = Menu(self.mb, name='help')
        self.mb.add_cascade(label='Help', menu=self.helpmenu)
        if self.isWindows():
            self.helpmenu.add_command(label='Help', command=self.showHelp)
        self.helpmenu.add_command(label='Contact Code by Kevin', command=self.getHelp)
        self.helpmenu.add_command(label='Web Site', command=self.getWebSite)
        if self.isWindows():
            self.helpmenu.add_command(label='About QuickWho', command=self.aboutWindow)
            self.helpmenu.add_command(label='Check for Updates', command=self.checkUpdate)

        self.configure(menu=self.mb)


        self.mainframe = Tile.Frame(self)
        self.mainframe.pack(side=TOP, fill=BOTH, expand=YES)

        #main frame
        self.bottomframe=Tile.Frame(self.mainframe)
        self.bottomframe.pack(side=BOTTOM, fill=BOTH, expand=YES)


        #configure the searchfield
        style = Tile.Style()
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303

        self.status=StringVar()

        self.bottomlabel=Tile.Label(self.topframe, text='', textvariable=self.status, padding=2)
        self.bottomlabel.pack(side=RIGHT, fill=BOTH, expand=YES, anchor='e')

        self.status.set('No domain results displayed')
 
        #the rest of the GUI
        self.windowsep = Tile.Separator(self.mainframe, orient='vertical')
        self.windowsep.pack(side=BOTTOM, fill=BOTH, expand=NO)


        self.bottom_pw = Tile.PanedWindow(self.bottomframe, orient='horizontal')
        self.bottom_pw.pack(side=TOP, fill=BOTH, expand=YES)







|







283
284
285
286
287
288
289
290
291
292
293
294
295
296
297

        self.status=StringVar()

        self.bottomlabel=Tile.Label(self.topframe, text='', textvariable=self.status, padding=2)
        self.bottomlabel.pack(side=RIGHT, fill=BOTH, expand=YES, anchor='e')

        self.status.set('No domain results displayed')

        #the rest of the GUI
        self.windowsep = Tile.Separator(self.mainframe, orient='vertical')
        self.windowsep.pack(side=BOTTOM, fill=BOTH, expand=NO)


        self.bottom_pw = Tile.PanedWindow(self.bottomframe, orient='horizontal')
        self.bottom_pw.pack(side=TOP, fill=BOTH, expand=YES)
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348



349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
                                borderwidth=0,
                                wrap='word',
                                highlightcolor='SlateGray3',
                                )

        self.textdisplay.pack(side=LEFT, fill=BOTH, expand=YES)
        self.textdisplay.configure(state='disabled')
                            
        self.textscroll = Tile.Scrollbar(self.bottomright)
        self.textscroll.pack(side=RIGHT, fill=Y, expand=NO)

        self.textdisplay.configure(yscrollcommand=self.textscroll.set)
        self.textscroll.configure(command=self.textdisplay.yview)

        self.lefttop = Tile.Frame(self.bottomleft)
        self.lefttop.pack(side=TOP, fill=BOTH, expand=YES)
        self.bottomcanvas = Canvas(self.lefttop, background='white')
        self.bottomcanvas.pack(fill=BOTH, expand=YES, side=LEFT)

        self.t1=ToolTip.ToolTip(self.bottomcanvas, 'Geolocation map for domain')
        
        self.bottom_pw.add(self.bottomright)
        self.bottom_pw.add(self.bottomleft)

        self.wm_geometry('1100x600')
		
		if self.isAqua():
            self.tk.call('darkaqua::checkDarkMode')

      def geo_ip_lookup(self, domain):

        service = 'http://ip-api.com/'
        kind = '/json/'
        ip = domain

        url = service + kind + ip
        return json.loads(urllib.request.urlopen(url).read().decode('utf-8'))




        
    #get the whois data
    def getInfo(self):
     
        if self.searchfield.get() == "":
            return

        domain = self.searchterm.get()

        self.status.set('Displaying domain information for ' + (str(domain.strip('='))))
        self.clearData()

        #First, check to make sure domain name isn't hijacked by squatters, cf 'apple.com', add '=' if it is.
        try:
            self.pyurl = pythonwhois.get_whois(domain, normalized=True)
        except:
            self.inserturltext('Unable to retrieve some domain information for ' + (str(domain.strip('='))) + '.\n\n')
    
            try:
                 self.bottomcanvas.delete(self.displaymap)
                 self.map.destroy()
            except:
                 pass
             
        #Ok, we have a usable domain. Retrieve and parse data. 
        try:
            self.pyurl = pythonwhois.get_whois(domain, normalized=True)
            self.search_ip = domain.strip('=')
            self.domaindata =  self.geo_ip_lookup(self.search_ip)
            try:
                self.latitude = self.domaindata['lat']
                self.longitude = self.domaindata['lon']







|












|




|
|


|

|
<


|
|
>
>
>

|


|













|





|
|







306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337

338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
                                borderwidth=0,
                                wrap='word',
                                highlightcolor='SlateGray3',
                                )

        self.textdisplay.pack(side=LEFT, fill=BOTH, expand=YES)
        self.textdisplay.configure(state='disabled')

        self.textscroll = Tile.Scrollbar(self.bottomright)
        self.textscroll.pack(side=RIGHT, fill=Y, expand=NO)

        self.textdisplay.configure(yscrollcommand=self.textscroll.set)
        self.textscroll.configure(command=self.textdisplay.yview)

        self.lefttop = Tile.Frame(self.bottomleft)
        self.lefttop.pack(side=TOP, fill=BOTH, expand=YES)
        self.bottomcanvas = Canvas(self.lefttop, background='white')
        self.bottomcanvas.pack(fill=BOTH, expand=YES, side=LEFT)

        self.t1=ToolTip.ToolTip(self.bottomcanvas, 'Geolocation map for domain')

        self.bottom_pw.add(self.bottomright)
        self.bottom_pw.add(self.bottomleft)

        self.wm_geometry('1100x600')

        if self.isAqua():
            self.tk.call('darkaqua::checkDarkMode')

    def geo_ip_lookup(self, domain):

        service = 'http://ip-api.com/json/'

        ip = domain

        url = service + ip
        uh = urllib.request.urlopen(url)
        data = uh.read()
        js = json.loads(data.decode("utf-8"))
        return js


    #get the whois data
    def getInfo(self):

        if self.searchfield.get() == "":
            return

        domain = self.searchterm.get()

        self.status.set('Displaying domain information for ' + (str(domain.strip('='))))
        self.clearData()

        #First, check to make sure domain name isn't hijacked by squatters, cf 'apple.com', add '=' if it is.
        try:
            self.pyurl = pythonwhois.get_whois(domain, normalized=True)
        except:
            self.inserturltext('Unable to retrieve some domain information for ' + (str(domain.strip('='))) + '.\n\n')

            try:
                 self.bottomcanvas.delete(self.displaymap)
                 self.map.destroy()
            except:
                 pass

        #Ok, we have a usable domain. Retrieve and parse data.
        try:
            self.pyurl = pythonwhois.get_whois(domain, normalized=True)
            self.search_ip = domain.strip('=')
            self.domaindata =  self.geo_ip_lookup(self.search_ip)
            try:
                self.latitude = self.domaindata['lat']
                self.longitude = self.domaindata['lon']
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
                mapimage.write(f.read())
                mapimage.close()
                self.map=PhotoImage(file=baseimage)
                self.displaymap=self.bottomcanvas.create_image(0,0, image=self.map, anchor='nw')
            except:
                self.inserturltext('Unable to retrieve map data for ' + self.searchterm.get() + '.\n\n')
                self.inserturltext('* * * * *\n\n')
                
            #Finally, display the text output.
            try:     
                self.inserturltext(
                "Administrative Contact:\n",\
                "\t" + "Name: "+ self.pyurl["contacts"]["admin"]["name"] + "\n",\
                "\t" + "E-mail: "+ self.pyurl["contacts"]["admin"]["email"] + "\n",\
                "\t" + "Organization: "+ self.pyurl["contacts"]["admin"]["organization"] + "\n",\
                "\t" + "Phone: "+ self.pyurl["contacts"]["admin"]["phone"] + "\n",\
                "\t" + "Street: "+ self.pyurl["contacts"]["admin"]["street"] + "\n",\







|

|







389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
                mapimage.write(f.read())
                mapimage.close()
                self.map=PhotoImage(file=baseimage)
                self.displaymap=self.bottomcanvas.create_image(0,0, image=self.map, anchor='nw')
            except:
                self.inserturltext('Unable to retrieve map data for ' + self.searchterm.get() + '.\n\n')
                self.inserturltext('* * * * *\n\n')

            #Finally, display the text output.
            try:
                self.inserturltext(
                "Administrative Contact:\n",\
                "\t" + "Name: "+ self.pyurl["contacts"]["admin"]["name"] + "\n",\
                "\t" + "E-mail: "+ self.pyurl["contacts"]["admin"]["email"] + "\n",\
                "\t" + "Organization: "+ self.pyurl["contacts"]["admin"]["organization"] + "\n",\
                "\t" + "Phone: "+ self.pyurl["contacts"]["admin"]["phone"] + "\n",\
                "\t" + "Street: "+ self.pyurl["contacts"]["admin"]["street"] + "\n",\
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
                "\t" + "Street: "+ self.pyurl["contacts"]["tech"]["street"] + "\n",\
                "\t" + "City: "+ self.pyurl["contacts"]["tech"]["city"] + "\n",\
                "\t" + "State: "+ self.pyurl["contacts"]["tech"]["state"] + "\n",\
                "\t" + "Postal Code: "+ self.pyurl["contacts"]["tech"]["postalcode"] + "\n\n"
                )

                self.inserturltext("Creation Date: " + "\t" +  ", ".join(['%s' % i for i in self.pyurl["creation_date"]]) + "\n")
                self.inserturltext("Expiration Date: "+ "\t"  + ", ".join(['%s' % i for i in self.pyurl["expiration_date"]]) + "\n") 
                self.inserturltext("Name Servers: " + "\t"  + ", ".join(['%s' % i for i in self.pyurl["nameservers"]]) + "\n" )
                self.inserturltext("Updated: " + "\t" + ", ".join(['%s' % i for i in self.pyurl["updated_date"]]) + "\n") 
                self.inserturltext("Whois Server: " + "\t" +  ", ".join(['%s' % i for i in self.pyurl["whois_server"]]) + "\n")
                self.inserturltext('IP Address:\t\t ' + self.domaindata['query'] + '\n\n')
                self.inserturltext('Latitude:\t\t ' + str(self.domaindata['lat']) + '\n')
                self.inserturltext('Longitude:\t\t ' +  str(self.domaindata['lon']) + '\n')
                self.inserturltext('City:\t\t ' + self.domaindata['city'] + '\n')
                self.inserturltext('Region:\t\t '+ self.domaindata['region'] + '\n')
                self.inserturltext('Country:\t\t ' + self.domaindata['country'] + '\n\n')

                self.inserturltext('* * * * *\n\n')
                self.inserturltext('Geolocation powered by http://ip-api.com')
                self.inserturltext('\n\n')
                self.update()

            except (KeyError, TypeError):
                self.inserturltext('\n'.join(self.pyurl['raw']) + '\n\n')
                self.inserturltext('* * * * *\n\n')
                self.inserturltext('Geolocation powered by http://ip-api.com')
                self.inserturltext('\n\n')
                self.update()
 
        #If everything goes haywire, return an error message.
        except:
            raise
            self.inserturltext('Unable to retrieve domain information for' + (str(domain.strip('='))) + '.\n\n')
            try:
                self.bottomcanvas.delete(self.displaymap)
                self.map.destroy()
            except:
                raise
                self.inserturltext('Unable to retrieve map data.\n\n')
                
 
    #insert text into urltext widget
    def inserturltext(self, *args):
        text="".join(args)
        self.textdisplay.configure(state='normal')                       
        self.textdisplay.tag_configure("hyper",foreground="blue")
        mail = ('[A-Za-z0-9_-]+(\.[A-Za-z0-9_-]+)*@[A-Za-z0-9_-]+(\.[A-Za-z0-9_-]+)+') #('^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,4}$')
        web =  ('((https?):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)')
        self.textdisplay.highlight_pattern(web, "hyper", regexp=True)
        self.textdisplay.highlight_pattern(mail, "hyper", regexp=True)
        self.textdisplay.tag_bind("hyper", "<Button-1>", lambda event: self.clickLink(self.textdisplay, event.x, event.y, 'hyper'))
        self.textdisplay.insert(END, text)







|

|



















|










|
|



|







429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
                "\t" + "Street: "+ self.pyurl["contacts"]["tech"]["street"] + "\n",\
                "\t" + "City: "+ self.pyurl["contacts"]["tech"]["city"] + "\n",\
                "\t" + "State: "+ self.pyurl["contacts"]["tech"]["state"] + "\n",\
                "\t" + "Postal Code: "+ self.pyurl["contacts"]["tech"]["postalcode"] + "\n\n"
                )

                self.inserturltext("Creation Date: " + "\t" +  ", ".join(['%s' % i for i in self.pyurl["creation_date"]]) + "\n")
                self.inserturltext("Expiration Date: "+ "\t"  + ", ".join(['%s' % i for i in self.pyurl["expiration_date"]]) + "\n")
                self.inserturltext("Name Servers: " + "\t"  + ", ".join(['%s' % i for i in self.pyurl["nameservers"]]) + "\n" )
                self.inserturltext("Updated: " + "\t" + ", ".join(['%s' % i for i in self.pyurl["updated_date"]]) + "\n")
                self.inserturltext("Whois Server: " + "\t" +  ", ".join(['%s' % i for i in self.pyurl["whois_server"]]) + "\n")
                self.inserturltext('IP Address:\t\t ' + self.domaindata['query'] + '\n\n')
                self.inserturltext('Latitude:\t\t ' + str(self.domaindata['lat']) + '\n')
                self.inserturltext('Longitude:\t\t ' +  str(self.domaindata['lon']) + '\n')
                self.inserturltext('City:\t\t ' + self.domaindata['city'] + '\n')
                self.inserturltext('Region:\t\t '+ self.domaindata['region'] + '\n')
                self.inserturltext('Country:\t\t ' + self.domaindata['country'] + '\n\n')

                self.inserturltext('* * * * *\n\n')
                self.inserturltext('Geolocation powered by http://ip-api.com')
                self.inserturltext('\n\n')
                self.update()

            except (KeyError, TypeError):
                self.inserturltext('\n'.join(self.pyurl['raw']) + '\n\n')
                self.inserturltext('* * * * *\n\n')
                self.inserturltext('Geolocation powered by http://ip-api.com')
                self.inserturltext('\n\n')
                self.update()

        #If everything goes haywire, return an error message.
        except:
            raise
            self.inserturltext('Unable to retrieve domain information for' + (str(domain.strip('='))) + '.\n\n')
            try:
                self.bottomcanvas.delete(self.displaymap)
                self.map.destroy()
            except:
                raise
                self.inserturltext('Unable to retrieve map data.\n\n')


    #insert text into urltext widget
    def inserturltext(self, *args):
        text="".join(args)
        self.textdisplay.configure(state='normal')
        self.textdisplay.tag_configure("hyper",foreground="blue")
        mail = ('[A-Za-z0-9_-]+(\.[A-Za-z0-9_-]+)*@[A-Za-z0-9_-]+(\.[A-Za-z0-9_-]+)+') #('^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,4}$')
        web =  ('((https?):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)')
        self.textdisplay.highlight_pattern(web, "hyper", regexp=True)
        self.textdisplay.highlight_pattern(mail, "hyper", regexp=True)
        self.textdisplay.tag_bind("hyper", "<Button-1>", lambda event: self.clickLink(self.textdisplay, event.x, event.y, 'hyper'))
        self.textdisplay.insert(END, text)
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615

        if 'http' in link:
            self.launchurl(link)
        elif '@' in link:
            newlink = "mailto:" + link
            self.launchurl(newlink)
        widget.configure(cursor='arrow')
       
    #clear text display
    def clearData(self):
        self.textdisplay.configure(state='normal')
        self.textdisplay.delete('1.0', END)
        self.textdisplay.configure(state='disabled')
        try:
            self.bottomcanvas.delete(self.displaymap)
            self.map.destroy()
        except:
            pass

    #get all text
    def getData(self):
        return self.textdisplay.get('1.0', END)
      

    #set app name and version at startup
    def setAppName(self, appname, appversion):
        self.appname = appname
        self.appversion = appversion
        return self.appname, self.appversion
            
    #read license
    def readLic(self, application, appversion):
       self.tk.call('package', 'require', 'regproc')
       self.tk.call('regproc::readLic', self.appname,  self.appversion)


    #get the serial number from the user
    def getLic(self):
        self.tk.call('package', 'require', 'regproc')
        self.tk.call('regproc::getReg')


    #check to see if new verson of software exists
    def checkUpdate(self):
        self.tk.call('package', 'require', 'softwareupdate')
        self.tk.call('softwareupdate::setIcon', self.updateicon)
        self.tk.call('softwareupdate::checkVersion', self.appname,  self.appversion)
        
    #e-mail the developer for help
    def getHelp(self):
        self.tk.call('machelp::usermail')

    #get web site
    def getWebSite(self):
        self.tk.call('machelp::appweb')

    #show help
    def showHelp(self):
        self.tk.call('machelp::userhelp')

    #save data in log to file  
    def saveLog(self):
        
        filename = filedialog.asksaveasfilename(title='Save Log Output', initialdir=os.path.expanduser('~/'), initialfile='QuickWho log.txt', parent=self)
        if filename == "":
             return
        else:
            alltext=self.getData()
            finaltext = open(filename, 'w').write(alltext)
            

    #page setup dialog for printing
    def pageSetup(self):
        if self.isAqua():
            self.tk.call('cocoaprint::pagesetup', self)
            
    #print data in log file
    def printLog(self):
        alltext=self.getData()
        fo=open(self.printfile, 'w')
        fo.write(alltext)
        fo.close()
        if self.isWindows():
            self.tk.call('xplat::print', self.printfile)
        if self.isAqua():
	catch {exec /usr/sbin/cupsfilter -i "text/plain" $cachedir/$manitem-man.txt  > $cachedir/manprint.pdf 2>$cachedir/pdferr}
            pdfcmd = '/usr/sbin/cupsfilter' + ' -i ' + ' text/plain ' +  '"' + self.printfile +  '"' + ' > ' +  '"' +   os.path.join(self.cachedir, 'whois.pdf') +  '"'
            os.system(pdfcmd)
            pdf = os.path.join(self.cachedir, 'whois.pdf')
            self.tk.call('cocoaprint::print', pdf, self)

    #binding to the "quit" command
    def closeApp(self):
        self.tk.call('regproc::makePitch; exit')

    #binding to the "reopen app" event
    def reopenApp(self):
        if self.wm_state("withdrawn"):
            self.wm_deiconify()
            self.wm_state("normal")
            self.lift()
        else:
            self.wm_deiconify()
            self.lift()

    #dummy def for hiding windows
    def hideWindow(self):
        self.wm_state('withdrawn')

    #expose basic functionality to AppleScript and dde
    def getDomain(self, domain):
        self.searchfield.delete(0, 'end')
        self.searchfield.insert(0, domain)
        self.getInfo()
        alltext=self.getData()     
        return alltext

if __name__== '__main__':
    app = quickwhoApp(None)
    app.mainloop()
    







|














|






<
<
<
<
<
<
<
<
<
<
<







|












|

|






|





|









<

|
|
|



|




















|





|
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519











520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564

565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599

        if 'http' in link:
            self.launchurl(link)
        elif '@' in link:
            newlink = "mailto:" + link
            self.launchurl(newlink)
        widget.configure(cursor='arrow')

    #clear text display
    def clearData(self):
        self.textdisplay.configure(state='normal')
        self.textdisplay.delete('1.0', END)
        self.textdisplay.configure(state='disabled')
        try:
            self.bottomcanvas.delete(self.displaymap)
            self.map.destroy()
        except:
            pass

    #get all text
    def getData(self):
        return self.textdisplay.get('1.0', END)


    #set app name and version at startup
    def setAppName(self, appname, appversion):
        self.appname = appname
        self.appversion = appversion
        return self.appname, self.appversion













    #check to see if new verson of software exists
    def checkUpdate(self):
        self.tk.call('package', 'require', 'softwareupdate')
        self.tk.call('softwareupdate::setIcon', self.updateicon)
        self.tk.call('softwareupdate::checkVersion', self.appname,  self.appversion)

    #e-mail the developer for help
    def getHelp(self):
        self.tk.call('machelp::usermail')

    #get web site
    def getWebSite(self):
        self.tk.call('machelp::appweb')

    #show help
    def showHelp(self):
        self.tk.call('machelp::userhelp')

    #save data in log to file
    def saveLog(self):

        filename = filedialog.asksaveasfilename(title='Save Log Output', initialdir=os.path.expanduser('~/'), initialfile='QuickWho log.txt', parent=self)
        if filename == "":
             return
        else:
            alltext=self.getData()
            finaltext = open(filename, 'w').write(alltext)


    #page setup dialog for printing
    def pageSetup(self):
        if self.isAqua():
            self.tk.call('cocoaprint::pagesetup', self)

    #print data in log file
    def printLog(self):
        alltext=self.getData()
        fo=open(self.printfile, 'w')
        fo.write(alltext)
        fo.close()
        if self.isWindows():
            self.tk.call('xplat::print', self.printfile)
        if self.isAqua():

            pdfcmd = '/usr/sbin/cupsfilter' + ' -i ' + ' text/plain ' +  '"' + self.printfile +  '"' + ' > ' +  '"' +   os.path.join(self.cachedir, 'whois.pdf') +  '"'
        os.system(pdfcmd)
        pdf = os.path.join(self.cachedir, 'whois.pdf')
        self.tk.call('cocoaprint::print', pdf, self)

    #binding to the "quit" command
    def closeApp(self):
        self.tk.call("regproc::makePitch")

    #binding to the "reopen app" event
    def reopenApp(self):
        if self.wm_state("withdrawn"):
            self.wm_deiconify()
            self.wm_state("normal")
            self.lift()
        else:
            self.wm_deiconify()
            self.lift()

    #dummy def for hiding windows
    def hideWindow(self):
        self.wm_state('withdrawn')

    #expose basic functionality to AppleScript and dde
    def getDomain(self, domain):
        self.searchfield.delete(0, 'end')
        self.searchfield.insert(0, domain)
        self.getInfo()
        alltext=self.getData()
        return alltext

if __name__== '__main__':
    app = quickwhoApp(None)
    app.mainloop()

Changes to buildapp.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/bin/sh

echo "Starting dist process..."

if [ -a QuickWho.dmg ]
 then
    rm QuickWho.dmg
fi

if [ -a dist ]
	then
	rm -rf dist
fi

if [ -a build ]
then
    rm -rf build
fi


cat << EOT > Info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>English</string>
	<key>CFBundleDisplayName</key>
	<string>QuickWho</string>
	<key>CFBundleExecutable</key>
	<string>_quickwho</string>
	<key>CFBundleGetInfoString</key>
	<string>QuickWho $1</string>
	<key>CFBundleIconFile</key>
	<string>QuickWho.icns</string>
	<key>CFBundleIdentifier</key>
	<string>com.codebykevin.quickwho</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>QuickWho</string>
	<key>CFBundlePackageType</key>


|






|

|






<











|



|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/bin/sh

echo "Starting build process..."

if [ -a QuickWho.dmg ]
 then
    rm QuickWho.dmg
fi

if [ -a build ]
	then
	rm -rf build
fi

if [ -a build ]
then
    rm -rf build
fi


cat << EOT > Info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>English</string>
	<key>CFBundleDisplayName</key>
	<string>QuickWho</string>
	<key>CFBundleExecutable</key>
	<string>QuickWho</string>
	<key>CFBundleGetInfoString</key>
	<string>QuickWho $1</string>
	<key>CFBundleIconFile</key>
	<string>icon.icns</string>
	<key>CFBundleIdentifier</key>
	<string>com.codebykevin.quickwho</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>QuickWho</string>
	<key>CFBundlePackageType</key>
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127


128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
	<key>LSApplicationCategoryType</key>
	<string>public.app-category.utilities</string>
	<key>LSArchitecturePriority</key>
	<string>x86_64</string>
	<key>LSHasLocalizedDisplayName</key>
	<false/>
	<key>LSMinimumSystemVersion</key>
	<string>10.13</string>
	<key>LSMinimumSystemVersionByArchitecture</key>
	<dict>
		<key>x86_64</key>
		<string>10.13</string>
	</dict>
	<key>NSAppleScriptEnabled</key>
	<string>YES</string>
	<key>NSHighResolutionCapable</key>
	<string>YES</string>
	<key>NSHumanReadableCopyright</key>
	<string>Copyright (c) 2018 WordTech Communications LLC</string>
	<key>NSMainNibFile</key>
	<string>MainMenu</string>
	<key>NSPrincipalClass</key>
	<string>NSApplication</string>
	<key>OSAScriptingDefinition</key>
	<string>Wish.sdef</string>
</dict>
</plist>
EOT

gcc main.m -o _quickwho -framework Carbon -framework Cocoa -framework CoreFoundation

mkdir dist
mkdir dist/QuickWho.app
mkdir dist/QuickWho.app/Contents
mkdir dist/QuickWho.app/Contents/MacOS
mkdir dist/QuickWho.app/Contents/Resources
mkdir dist/QuickWho.app/Contents/Frameworks

cp Info.plist dist/QuickWho.app/Contents/Info.plist
cp _quickwho dist/QuickWho.app/Contents/MacOS/_quickwho
cp launcher dist/QuickWho.app/Contents/Resources/launcher
cp QuickWho.icns dist/QuickWho.app/Contents/Resources/QuickWho.icns
cp Wish.sdef dist/QuickWho.app/Contents/Resources/Wish.sdef
cp QuickWho.py  dist/QuickWho.app/Contents/Resources/QuickWho.py
cp ToolTip.py  dist/QuickWho.app/Contents/Resources/ToolTip.py
cp -R  -f "QuickWho - Get Domain Info.workflow" dist/QuickWho.app/Contents/Resources/"QuickWho - Get Domain Info.workflow"

#copy the frameworks
cp -R -f /Library/Frameworks/Tcl.framework  dist/QuickWho.app/Contents/Frameworks/Tcl.framework
cp -R -f /Library/Frameworks/Tk.framework  dist/QuickWho.app/Contents/Frameworks/Tk.framework
cp -R -f /Library/Frameworks/Python.framework  dist/QuickWho.app/Contents/Frameworks/Python.framework
cp -f /usr/local/lib/libcrypto.42.dylib  dist/QuickWho.app/Contents/Frameworks/libcrypto.42.dylib
cp -f /usr/local/lib/libssl.44.dylib  dist/QuickWho.app/Contents/Frameworks/libssl.44.dylib
cd  dist/QuickWho.app/Contents/Resources/
ln -s ../Frameworks/Python.framework/Versions/3.6/Resources/Python.app/Contents/MacOS/Python QuickWho
cd ../../../../


#copy the supporting libraries
for lib in scriptlibs/*
do
  echo "Copying $lib library..."
  cp -R -f $lib dist/QuickWho.app/Contents/Frameworks/Tcl.framework/Versions/8.6/Resources/Scripts
done

#copy the supporting libraries
for lib in maclibs/*
do
  echo "Copying $lib library..."
  cp -R -f $lib dist/QuickWho.app/Contents/Frameworks/Tcl.framework/Versions/8.6/Resources/Scripts
done



find dist/QuickWho.app  -name "*.a"  -exec rm -rf {} \;
find dist/QuickWho.app  -name "*debug"  -exec rm -rf {} \;
find dist/QuickWho.app  -name "*.sh"  -exec rm -rf {} \; 



find dist/QuickWho.app -type f -name "*.so"  -exec strip -x {} \;
find dist/QuickWho.app -type f -name "*.so"  -exec codesign --verbose --signature-size 9400 -f -s "Developer ID Application: Kevin Walzer" {} \;
find dist/QuickWho.app -type f -name "*.dylib"  -exec strip -x  {} \;
find dist/QuickWho.app -type f -name "*.dylib"  -exec codesign --verbose --signature-size 9400 -f -s "Developer ID Application: Kevin Walzer" {} \; 

codesign  --verbose --signature-size 9400 -f -s "Developer ID Application: Kevin Walzer" dist/QuickWho.app/Contents/Frameworks/Tk.framework/Versions/8.6/Resources/Wish.app/Contents/MacOS/Wish
codesign  --verbose --signature-size 9400 -f -s "Developer ID Application: Kevin Walzer" dist/QuickWho.app/Contents/Frameworks/Tk.framework/Versions/Current
codesign --verbose --signature-size 9400 -f -s "Developer ID Application: Kevin Walzer" dist/QuickWho.app/Contents/Frameworks/Tcl.framework/Versions/Current
codesign --verbose --signature-size 9400 -f -s "Developer ID Application: Kevin Walzer" dist/QuickWho.app/Contents/Frameworks/Python.framework/Versions/Current
codesign  --verbose --signature-size 9400 -f -s "Developer ID Application: Kevin Walzer" dist/QuickWho.app/Contents/MacOS/_quickwho
xattr -cr dist/QuickWho.app

codesign  --signature-size 9400 -f -s "Developer ID Application: Kevin Walzer" --verbose=2  dist/QuickWho.app

cp readme.txt dist/readme.txt
cd dist
ln -s /Applications Applications
cd ../
 

echo "Creating and signing DMG file..."

hdiutil create  -srcfolder dist -fs HFS+ -volname QuickWho QuickWho.dmg

codesign  --signature-size 9400 -f -s "Developer ID Application: Kevin Walzer" --verbose=2  QuickWho.dmg

echo "Uploading DMG..."

upload QuickWho.dmg updates

upload quickwho-changes.tcl

upload quickwho-version.tcl


cd ../

#create archive of entire source tree
tar cvfz QuickWho-$1.tgz QuickWho

echo "Done."







|



|






|










<
|
<
<
<
<
<
<

|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






|






|


|

|
|
|

>
>
|
|
|
|

|
|
|
|
|
<

|

|
|
|
|




|

|



|

|

|


|


|


49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77

78






79
80

















81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114

115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
	<key>LSApplicationCategoryType</key>
	<string>public.app-category.utilities</string>
	<key>LSArchitecturePriority</key>
	<string>x86_64</string>
	<key>LSHasLocalizedDisplayName</key>
	<false/>
	<key>LSMinimumSystemVersion</key>
	<string>10.15</string>
	<key>LSMinimumSystemVersionByArchitecture</key>
	<dict>
		<key>x86_64</key>
		<string>10.15</string>
	</dict>
	<key>NSAppleScriptEnabled</key>
	<string>YES</string>
	<key>NSHighResolutionCapable</key>
	<string>YES</string>
	<key>NSHumanReadableCopyright</key>
	<string>Copyright (c) 2020 WordTech Communications LLC</string>
	<key>NSMainNibFile</key>
	<string>MainMenu</string>
	<key>NSPrincipalClass</key>
	<string>NSApplication</string>
	<key>OSAScriptingDefinition</key>
	<string>Wish.sdef</string>
</dict>
</plist>
EOT


python3 setup.py bdist_mac







cp Info.plist build/QuickWho.app/Contents/Info.plist



















#copy the supporting libraries
for lib in scriptlibs/*
do
  echo "Copying $lib library..."
  cp -R -f $lib  build/QuickWho.app/Contents/lib/tk8.6
done

#copy the supporting libraries
for lib in maclibs/*
do
  echo "Copying $lib library..."
  cp -R -f $lib build/QuickWho.app/Contents/lib/tk8.6
done

rmdir build/QuickWho.app/Contents/Frameworks

find build/QuickWho.app  -name "*.a"  -exec rm -rf {} \;
find build/QuickWho.app  -name "*debug"  -exec rm -rf {} \;
find build/QuickWho.app  -name "*.sh"  -exec rm -rf {} \; 

xattr -cr build/QuickWho.app

find build/QuickWho.app -type f -name "*.so"  -exec strip -x {} \;
find build/QuickWho.app -type f -name "*.so"  -exec codesign --verbose --signature-size 9400 -f -s "Developer ID Application: Kevin Walzer" {} \;
find build/QuickWho.app -type f -name "*.dylib"  -exec strip -x  {} \;
find build/QuickWho.app -type f -name "*.dylib"  -exec codesign --verbose --signature-size 9400 -f -s "Developer ID Application: Kevin Walzer" {} \; 

codesign  --verbose --signature-size 9400 -f -s "Developer ID Application: Kevin Walzer" build/Quickwho.app/Contents/MacOS/Tk
codesign  --verbose --signature-size 9400 -f -s "Developer ID Application: Kevin Walzer" build/Quickwho.app/Contents/MacOS/Tcl
codesign --verbose --signature-size 9400 -f -s "Developer ID Application: Kevin Walzer" build/Quickwho.app/Contents/MacOS/Python
codesign --verbose --signature-size 9400 -f -s "Developer ID Application: Kevin Walzer" build/Quickwho.app/Contents/MacOS/QuickWho



codesign   --deep --signature-size 9400 -f -s "Developer ID Application: Kevin Walzer" --verbose=2  --entitlements entitlements.plist build/QuickWho.app

#cp readme.txt build/readme.txt
#cd build
#ln -s /Applications Applications
#cd ../
 

echo "Creating and signing DMG file..."

#hdiutil create  -srcfolder build -fs HFS+ -volname QuickWho QuickWho.dmg

#codesign  --signature-size 9400 -f -s "Developer ID Application: Kevin Walzer" --verbose=2  QuickWho.dmg

echo "Uploading DMG..."

#upload QuickWho.dmg updates

#upload quickwho-changes.tcl

#upload quickwho-version.tcl


#cd ../

#create archive of entire source tree
#tar cvfz QuickWho-$1.tgz QuickWho

echo "Done."

Deleted maclibs/Img1.4.2/libjpegtcl8.4.dylib.

cannot compute difference between binary files

Deleted maclibs/Img1.4.2/libpngtcl1.4.12.dylib.

cannot compute difference between binary files

Deleted maclibs/Img1.4.2/libtifftcl3.9.4.dylib.

cannot compute difference between binary files

Deleted maclibs/Img1.4.2/libtkimg1.4.2.dylib.

cannot compute difference between binary files

Deleted maclibs/Img1.4.2/libtkimgbmp1.4.2.dylib.

cannot compute difference between binary files

Deleted maclibs/Img1.4.2/libtkimgdted1.4.2.dylib.

cannot compute difference between binary files

Deleted maclibs/Img1.4.2/libtkimggif1.4.2.dylib.

cannot compute difference between binary files

Deleted maclibs/Img1.4.2/libtkimgico1.4.2.dylib.

cannot compute difference between binary files

Deleted maclibs/Img1.4.2/libtkimgjpeg1.4.2.dylib.

cannot compute difference between binary files

Deleted maclibs/Img1.4.2/libtkimgpcx1.4.2.dylib.

cannot compute difference between binary files

Deleted maclibs/Img1.4.2/libtkimgpixmap1.4.2.dylib.

cannot compute difference between binary files

Deleted maclibs/Img1.4.2/libtkimgpng1.4.2.dylib.

cannot compute difference between binary files

Deleted maclibs/Img1.4.2/libtkimgppm1.4.2.dylib.

cannot compute difference between binary files

Deleted maclibs/Img1.4.2/libtkimgps1.4.2.dylib.

cannot compute difference between binary files

Deleted maclibs/Img1.4.2/libtkimgraw1.4.2.dylib.

cannot compute difference between binary files

Deleted maclibs/Img1.4.2/libtkimgsgi1.4.2.dylib.

cannot compute difference between binary files

Deleted maclibs/Img1.4.2/libtkimgsun1.4.2.dylib.

cannot compute difference between binary files

Deleted maclibs/Img1.4.2/libtkimgtga1.4.2.dylib.

cannot compute difference between binary files

Deleted maclibs/Img1.4.2/libtkimgtiff1.4.2.dylib.

cannot compute difference between binary files

Deleted maclibs/Img1.4.2/libtkimgwindow1.4.2.dylib.

cannot compute difference between binary files

Deleted maclibs/Img1.4.2/libtkimgxbm1.4.2.dylib.

cannot compute difference between binary files

Deleted maclibs/Img1.4.2/libtkimgxpm1.4.2.dylib.

cannot compute difference between binary files

Deleted maclibs/Img1.4.2/libzlibtcl1.2.8.dylib.

cannot compute difference between binary files

Deleted maclibs/Img1.4.2/pkgIndex.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package ifneeded zlibtcl 1.2.8     [list load [file join $dir libzlibtcl1.2.8.dylib]]
package ifneeded pngtcl 1.4.12     [list load [file join $dir libpngtcl1.4.12.dylib]]
package ifneeded tifftcl 3.9.4     [list load [file join $dir libtifftcl3.9.4.dylib]]
package ifneeded jpegtcl 8.4     [list load [file join $dir libjpegtcl8.4.dylib]]
# -*- tcl -*- Tcl package index file
# --- --- --- Handcrafted, final generation by configure.
#
# $Id: pkgIndex.tcl.in 209 2009-03-03 17:19:05Z nijtmans $

package ifneeded img::base 1.4.2 [list load [file join $dir libtkimg1.4.2.dylib]]

# Compatibility hack. When asking for the old name of the package
# then load all format handlers and base libraries provided by tkImg.
# Actually we ask only for the format handlers, the required base
# packages will be loaded automatically through the usual package
# mechanism.

# When reading images without specifying it's format (option -format),
# the available formats are tried in reversed order as listed here.
# Therefore file formats with some "magic" identifier, which can be
# recognized safely, should be added at the end of this list.

package ifneeded Img 1.4.2 {
    package require img::window
    package require img::tga
    package require img::ico
    package require img::pcx
    package require img::sgi
    package require img::sun
    package require img::xbm
    package require img::xpm
    package require img::ps
    package require img::jpeg
    package require img::png
    package require img::tiff
    package require img::bmp
    package require img::ppm
    package require img::gif
    package require img::pixmap
    package provide Img 1.4.2
}

package ifneeded img::bmp 1.4.2     [list load [file join $dir libtkimgbmp1.4.2.dylib]]
package ifneeded img::gif 1.4.2     [list load [file join $dir libtkimggif1.4.2.dylib]]
package ifneeded img::ico 1.4.2     [list load [file join $dir libtkimgico1.4.2.dylib]]
package ifneeded img::jpeg 1.4.2     [list load [file join $dir libtkimgjpeg1.4.2.dylib]]
package ifneeded img::pcx 1.4.2     [list load [file join $dir libtkimgpcx1.4.2.dylib]]
package ifneeded img::pixmap 1.4.2     [list load [file join $dir libtkimgpixmap1.4.2.dylib]]
package ifneeded img::png 1.4.2     [list load [file join $dir libtkimgpng1.4.2.dylib]]
package ifneeded img::ppm 1.4.2     [list load [file join $dir libtkimgppm1.4.2.dylib]]
package ifneeded img::ps 1.4.2     [list load [file join $dir libtkimgps1.4.2.dylib]]
package ifneeded img::sgi 1.4.2     [list load [file join $dir libtkimgsgi1.4.2.dylib]]
package ifneeded img::sun 1.4.2     [list load [file join $dir libtkimgsun1.4.2.dylib]]
package ifneeded img::tga 1.4.2     [list load [file join $dir libtkimgtga1.4.2.dylib]]
package ifneeded img::tiff 1.4.2     [list load [file join $dir libtkimgtiff1.4.2.dylib]]
package ifneeded img::window 1.4.2     [list load [file join $dir libtkimgwindow1.4.2.dylib]]
package ifneeded img::xbm 1.4.2     [list load [file join $dir libtkimgxbm1.4.2.dylib]]
package ifneeded img::xpm 1.4.2     [list load [file join $dir libtkimgxpm1.4.2.dylib]]
package ifneeded img::dted 1.4.2     [list load [file join $dir libtkimgdted1.4.2.dylib]]
package ifneeded img::raw 1.4.2     [list load [file join $dir libtkimgraw1.4.2.dylib]]
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
























































































































Deleted maclibs/Img1.4.2/regproc/pkgIndex.tcl.

1
2
3
4
5
6
7
8
9
10
11
# Tcl package index file, version 1.1
# This file is generated by the "pkg_mkIndex" command
# and sourced either when an application starts up or
# by a "package unknown" script.  It invokes the
# "package ifneeded" command to set up package-related
# information so that packages will be loaded automatically
# in response to "package require" commands.  When this
# script is sourced, the variable $dir must contain the
# full path name of this file's directory.

package ifneeded regproc 1.4 [list source [file join $dir regproc.tcl]]
<
<
<
<
<
<
<
<
<
<
<






















Deleted maclibs/Img1.4.2/regproc/regproc.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
#regproc.tcl  routines to register serial numbers

#Copyright 2015 WordTech Communications LLC

#MIT license

package provide regproc 1.4
package require http
package require xplat

image create photo _unlock -data  {
    R0lGODlhGAAgAIABAAAAAP///yH+GkNyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFj
    ACH5BAEKAAEALAAAAAAYACAAAAJRjI+gq+jO4npQWmqsBvQenzBYVE1YQH7imWbm
    ib5xA89cPcp4uPX+DwwKh7SdbWXUGF2S5VHn6oBURWrL+lBmb6UrTpucfsE14u85
    tKZ5wkMBADs=
}

image create photo _check -data {
    R0lGODlhIAAaAIABAAQHB////yH+GkNyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFj
    ACH5BAEKAAEALAAAAAAgABoAAAJMjI+pCeuvgIR0yVtzuFxDDnoWGIoHWZobikUV
    2zLTA89yfLNjetY7iag1Ir4VzCFMfpI6ChOYeeJeTxVTZRBie6htEOrl2sJcsmVb
    AAA7
}


namespace eval regproc {

    if {![info exists library]} {
	variable library [file dirname [info script]]
    }
    variable datadir
    variable expired
    set expired 0


    #set the 30-day clock for application/version
    proc setClock {} {
	variable datadir 
	variable appname
	variable appversion
	variable appstore
	puts "datadir is $datadir"

	set launchTime [clock seconds]
	set saveTime [open $datadir/$appname$appversion.dat w]
	puts $saveTime $launchTime
	close $saveTime
    }

    #read the time set
    proc readClock {} {
	variable datadir 
	variable appstatus 
	variable expstatus 
	variable appname
	variable appversion
	variable appstore
	variable expired

	set curTime [clock seconds]
	set oldTime [read [open $datadir/$appname$appversion.dat r]]
	set expDate [clock scan "30 days" -base $oldTime]
	if {$curTime < $expDate } {
	    set expired 0
	    regproc::makePitch	
	} else {
	    set expired 1
	    regproc::expiredPitch
	}
    }
    
    #check to see if a time has been set
    proc checkClock {} {
	variable datadir 
	variable appname
	variable appversion
	variable appstore
	variable expired

	if {[file exists $datadir/.$appname$appversion.rc]} {
	    
	    catch "file rename $datadir/.$appname$appversion.rc $datadir/$appname$appversion.dat"
	    regproc::readClock
	    return
	}

	if  {![file exists  $datadir/$appname$appversion.dat]} {
	    regproc::setClock 
	    regproc::readClock
	} else {
	    regproc::readClock
	}
    }

    #dialog before demo has expired
    proc makePitch {} {
	variable version 
	variable appname
	variable appstore

	toplevel .purchase
	wm title .purchase "Purchase $appname"
	wm resizable .purchase 0 0

	wm withdraw .purchase
	wm transient .purchase .

	wm protocol .purchase WM_DELETE_WINDOW {}

	ttk::frame .purchase.top -padding 10
	pack .purchase.top -side top -fill both -expand yes
	ttk::label .purchase.top.label -text "You are currently using a demo of $appname. This version will give you the chance to try \n$appname free of charge for 30 days. Would you like to buy $appname now?" -image _unlock -compound left -anchor n 

	pack .purchase.top.label  -side top -fill x -expand yes

	ttk::frame .purchase.bottom -padding 5
	pack .purchase.bottom -side bottom -fill both -expand yes

	ttk::frame .purchase.bottom.upper
	pack .purchase.bottom.upper -side top -fill both -expand no


	ttk::frame .purchase.bottom.lower -padding 5
	pack .purchase.bottom.lower -side bottom -fill both -expand no

	ttk::button .purchase.bottom.lower.install -text "Purchase" -default active -command "xplat::launch  http://www.codebykevin.com/$appname.html; regproc::getReg; destroy .purchase"
	ttk::button .purchase.bottom.lower.cancel -text "Cancel" -command " destroy .purchase; raise ."
	pack  .purchase.bottom.lower.install .purchase.bottom.lower.cancel  -side right -fill both -expand no
	
	::tk::PlaceWindow .purchase widget .

	wm deiconify .purchase
	focus .purchase.bottom.lower.install

	if {[tk windowingsystem] eq "aqua"} {
	    after idle [list after 0 wm attributes .purchase -notify 1]

	    bind all <FocusIn> [list add [list  wm attributes . -notify 0]]
	}

    }

    #dialog after demo has expired
    proc expiredPitch {} {
	variable version 
	variable appname
	variable appstore
	variable expired

	toplevel .expired
	wm title .expired "Purchase $appname"
	wm resizable .expired 0 0

	wm withdraw .expired
	wm transient .expired .

	wm protocol .expired WM_DELETE_WINDOW {}

	ttk::frame .expired.top -padding 10
	pack .expired.top -side top -fill both -expand yes
	ttk::label .expired.top.label -text "This demo of $appname is now expired. Would you like to buy $appname now?" -image _unlock -compound left -anchor n 

	pack .expired.top.label  -side top -fill x -expand yes

	ttk::frame .expired.bottom -padding 5
	pack .expired.bottom -side bottom -fill both -expand yes

	ttk::frame .expired.bottom.upper
	pack .expired.bottom.upper -side top -fill both -expand no


	ttk::frame .expired.bottom.lower -padding 5
	pack .expired.bottom.lower -side bottom -fill both -expand no

	ttk::button .expired.bottom.lower.install -text "Purchase" -default active -command "xplat::launch http://www.codebykevin.com/$appname.html; regproc::getReg; destroy .expired"
	ttk::button .expired.bottom.lower.cancel -text "Cancel" -command " destroy .expired; exit"
	pack  .expired.bottom.lower.install .expired.bottom.lower.cancel  -side right -fill both -expand no
	
	::tk::PlaceWindow .expired widget .

	wm deiconify .expired
	focus .expired.bottom.lower.install

	if {[tk windowingsystem] eq "aqua"} {
	    after idle [list after 0 wm attributes .expired -notify 1]

	    bind all <FocusIn> [list add [list  wm attributes . -notify 0]]
	}
    }

    #check for license, validate if found, set demo pitch if not found
    proc readLic {application version} {

	variable serial 
	variable datadir
	variable appname
	variable appversion
	variable appstore

	set appname $application
	set appversion $version

	set datadir [xplat::appconfig $appname]

	if {[file exists $datadir/.lic] } {
	    file rename $datadir/.lic $datadir/lic.dat
	}

	if {[file exists $datadir/lic.dat]} {
	    
	    set licnum [open $datadir/lic.dat r]
	    set serial [read $licnum]
	    close $licnum
	    return
	} else {
	    set serial "Demo"
	    regproc::checkClock
	    
	}
    }


    #write license to file
    proc setLic {} {
	variable serial
	variable serialbase
	variable datadir
	variable appname
	variable regwindow
	variable appstore

	if {$serial == ""} {
	    tk_messageBox -icon warning -title "Incorrect Serial Number" -message "Incorrect Serial Number" -detail "Incorrect serial number. The application will exit now." -parent .number
	    exit
	}

	set count 20000

	for {set i 1} {$i < $count} {incr i 1} {

	    lappend serialbase [string toupper $appname]-[expr $i * 5]-[expr $i/11]-[expr $i - 1]-[string toupper [string trim [string range $appname 0 1]]]
	}
	

	set output [lsearch  -inline $serialbase $serial]
	puts $serial
	puts $output
	
	if {$output >= 0} {
	    cd $datadir
	    set lic [open $datadir/lic.dat w]
	    puts $lic "$serial"
	    close $lic
	    tk_messageBox -icon info -title "Thank You" -message "Thank You" -detail "Thank you for registering $appname." -parent .number
	    destroy .number
	    #display window that was hidden
	    catch {wm deiconify .}

	} else {
	    if {$expired == 1} {
		tk_messageBox -icon warning -title "Incorrect Serial Number" -message "Incorrect Serial Number" -detail "Incorrect serial number. The application will exit now." -parent .number
		exit
	    }
	    
	    tk_messageBox -icon warning -title "Incorrect Serial Number" -message "Incorrect Serial Number" -detail "Incorrect serial number. Please try again." -parent .number
	    regproc::getReg
	}
    }



    #generate license numbers
    proc genList {application} {

	variable appname
	variable regwindow
	variable appstore

	set appname $application

	set count 20000

	for {set i 1} {$i < $count} {incr i 1} {

	    lappend serialbase [string toupper $appname]-[expr $i * 5]-[expr $i/11]-[expr $i - 1]-[string toupper [string trim [string range $appname 0 1]]]
	}


	if [file exists  $::env(HOME)/[list $appname]-list] {
	    file delete  $::env(HOME)/[list $appname]-list
	}

	foreach item $serialbase {
	    split $item\n
	    set keylist [open $::env(HOME)/[list $appname]-list a]
	    puts $keylist $item
	    close $keylist
	}
    }

    #dialog to input registration number from demo prompt
    proc getReg {} {


	variable serial
	variable regwindow
	variable appstore
	variable expired
	variable appname

	toplevel .number
	wm title .number "License"
	wm resizable .number 0 0

	wm withdraw .number
	wm transient .number .

	wm protocol .number WM_DELETE_WINDOW {}

	ttk::frame .number.top -padding 10
	pack .number.top -side top -fill both -expand yes

	
	ttk::label .number.top.label -text "Please enter your serial number for $appname\nin the field below:" -image _check -compound left -anchor n -padding 10
	pack .number.top.label -side top -fill both -expand yes

	ttk::entry .number.top.entry -textvariable [namespace current]::serial
	pack .number.top.entry -side bottom -fill both -expand yes

	ttk::frame .number.bottom -padding 5
	pack .number.bottom -side bottom -fill both -expand yes

	ttk::frame .number.bottom.upper
	pack .number.bottom.upper -side top -fill both -expand no


	ttk::frame .number.bottom.lower -padding 5
	pack .number.bottom.lower -side bottom -fill both -expand no

	bind .number <Return> {regproc::setLic; destroy .number; raise .}
	ttk::button .number.bottom.lower.install -text "Register" -default active -command {regproc::setLic; destroy .number; raise .}
	ttk::button .number.bottom.lower.cancel -text "Cancel" -command "regproc::exitIfExpired; destroy .number; raise ."
	pack  .number.bottom.lower.install .number.bottom.lower.cancel  -side right -fill both -expand no
	
	::tk::PlaceWindow .number widget .

	wm deiconify .number
	focus .number.bottom.lower.install
	if {[tk windowingsystem] eq "aqua"} {
	    after idle [list after 0 wm attributes .number -notify 1]
	    bind all <FocusIn>  [list  wm attributes . -notify 0]
	}
    }

    proc exitIfExpired {} {

	variable expired
	if {$expired == 1} {
	    exit
	} 

    }

    namespace export *
}

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




























































































































































































































































































































































































































































































































































































































































































































































Deleted maclibs/aem1.0/libaem1.0.dylib.

cannot compute difference between binary files

Deleted maclibs/aem1.0/pkgIndex.tcl.

1
2
3
4
5
6
7
#
# Tcl package index file
#
package ifneeded aem 1.0 "
    package require Tk 8.5-
    if {\"AppKit\" ni \[winfo server .\]} {error {TkAqua Cocoa required}}
        load [list [file join $dir libaem1.0.dylib]] aem"
<
<
<
<
<
<
<














Deleted maclibs/tclservices1.0/libtclservices1.0.dylib.

cannot compute difference between binary files

Deleted maclibs/tclservices1.0/pkgIndex.tcl.

1
2
3
4
5
6
#
# Tcl package index file
#
package ifneeded tclservices 1.0 "
    package require Tk 8.5-
     [list load [file join $dir libtclservices1.0.dylib] tclservices]"
<
<
<
<
<
<












Added maclibs/tcltls1.7.19/pkgIndex.tcl.

































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if {[package vsatisfies [package present Tcl] 8.5]} {
	package ifneeded tls 1.7.19 [list apply {{dir} {
		if {{shared} eq "static"} {
			load {} Tls
		} else {
			load [file join $dir tcltls.dylib] Tls
		}

		set tlsTclInitScript [file join $dir tls.tcl]
		if {[file exists $tlsTclInitScript]} {
			source $tlsTclInitScript
		}
	}} $dir]
} elseif {[package vsatisfies [package present Tcl] 8.4]} {
	package ifneeded tls 1.7.19 [list load [file join $dir tcltls.dylib] Tls]
}

Added maclibs/tcltls1.7.19/tcltls.dylib.

cannot compute difference between binary files

Deleted maclibs/tkdnd2.7/libtkdnd2.7.dylib.

cannot compute difference between binary files

Deleted maclibs/tkdnd2.7/pkgIndex.tcl.

1
2
3
4
5
6
#
# Tcl package index file
#
package ifneeded tkdnd 2.7 \
  "source \{$dir/tkdnd.tcl\} ; \
   tkdnd::initialise \{$dir\} libtkdnd2.7.dylib tkdnd"
<
<
<
<
<
<












Deleted maclibs/tkdnd2.7/tkdnd.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
#
# tkdnd.tcl --
#
#    This file implements some utility procedures that are used by the TkDND
#    package.
#
# This software is copyrighted by:
# George Petasis, National Centre for Scientific Research "Demokritos",
# Aghia Paraskevi, Athens, Greece.
# e-mail: petasis@iit.demokritos.gr
#
# The following terms apply to all files associated
# with the software unless explicitly disclaimed in individual files.
#
# The authors hereby grant permission to use, copy, modify, distribute,
# and license this software and its documentation for any purpose, provided
# that existing copyright notices are retained in all copies and that this
# notice is included verbatim in any distributions. No written agreement,
# license, or royalty fee is required for any of the authorized uses.
# Modifications to this software may be copyrighted by their authors
# and need not follow the licensing terms described here, provided that
# the new terms are clearly indicated on the first page of each file where
# they apply.
#
# 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.
#

package require Tk

namespace eval ::tkdnd {
  variable _topw ".drag"
  variable _tabops
  variable _state
  variable _x0
  variable _y0
  variable _platform_namespace
  variable _drop_file_temp_dir
  variable _auto_update 1

  variable _windowingsystem

  bind TkDND_Drag1 <ButtonPress-1> {tkdnd::_begin_drag press  1 %W %s %X %Y}
  bind TkDND_Drag1 <B1-Motion>     {tkdnd::_begin_drag motion 1 %W %s %X %Y}
  bind TkDND_Drag2 <ButtonPress-2> {tkdnd::_begin_drag press  2 %W %s %X %Y}
  bind TkDND_Drag2 <B2-Motion>     {tkdnd::_begin_drag motion 2 %W %s %X %Y}
  bind TkDND_Drag3 <ButtonPress-3> {tkdnd::_begin_drag press  3 %W %s %X %Y}
  bind TkDND_Drag3 <B3-Motion>     {tkdnd::_begin_drag motion 3 %W %s %X %Y}

  # ----------------------------------------------------------------------------
  #  Command tkdnd::initialise: Initialise the TkDND package.
  # ----------------------------------------------------------------------------
  proc initialise { dir PKG_LIB_FILE PACKAGE_NAME} {
    variable _platform_namespace
    variable _drop_file_temp_dir
    variable _windowingsystem
    global env

    switch [tk windowingsystem] {
      x11 {
        set _windowingsystem x11
      }
      win32 -
      windows {
        set _windowingsystem windows
      }
      aqua  {
        set _windowingsystem aqua
      }
      default {
        error "unknown Tk windowing system"
      }
    }

    ## Get User's home directory: We try to locate the proper path from a set of
    ## environmental variables...
    foreach var {HOME HOMEPATH USERPROFILE ALLUSERSPROFILE APPDATA} {
      if {[info exists env($var)]} {
        if {[file isdirectory $env($var)]} {
          set UserHomeDir $env($var)
          break
        }
      }
    }

    ## Should use [tk windowingsystem] instead of tcl platform array:
    ## OS X returns "unix," but that's not useful because it has its own
    ## windowing system, aqua
    ## Under windows we have to also combine HOMEDRIVE & HOMEPATH...
    if {![info exists UserHomeDir] &&
        [string equal $_windowingsystem windows] &&
        [info exists env(HOMEDRIVE)] && [info exists env(HOMEPATH)]} {
      if {[file isdirectory $env(HOMEDRIVE)$env(HOMEPATH)]} {
        set UserHomeDir $env(HOMEDRIVE)$env(HOMEPATH)
      }
    }
    ## Have we located the needed path?
    if {![info exists UserHomeDir]} {
      set UserHomeDir [pwd]
    }
    set UserHomeDir [file normalize $UserHomeDir]

    ## Try to locate a temporary directory...
    foreach var {TKDND_TEMP_DIR TEMP TMP} {
      if {[info exists env($var)]} {
        if {[file isdirectory $env($var)] && [file writable $env($var)]} {
          set _drop_file_temp_dir $env($var)
          break
        }
      }
    }
    if {![info exists _drop_file_temp_dir]} {
      foreach _dir [list "$UserHomeDir/Local Settings/Temp" \
                         "$UserHomeDir/AppData/Local/Temp" \
                         /tmp \
                         C:/WINDOWS/Temp C:/Temp C:/tmp \
                         D:/WINDOWS/Temp D:/Temp D:/tmp] {
        if {[file isdirectory $_dir] && [file writable $_dir]} {
          set _drop_file_temp_dir $_dir
          break
        }
      }
    }
    if {![info exists _drop_file_temp_dir]} {
      set _drop_file_temp_dir $UserHomeDir
    }
    set _drop_file_temp_dir [file native $_drop_file_temp_dir]

    source $dir/tkdnd_generic.tcl
    switch $_windowingsystem {
      x11 {
        source $dir/tkdnd_unix.tcl
        set _platform_namespace xdnd
      }
      win32 -
      windows {
        source $dir/tkdnd_windows.tcl
        set _platform_namespace olednd
      }
      aqua  {
        source $dir/tkdnd_macosx.tcl
        set _platform_namespace macdnd
      }
      default {
        error "unknown Tk windowing system"
      }
    }
    load $dir/$PKG_LIB_FILE $PACKAGE_NAME
    source $dir/tkdnd_compat.tcl
    ${_platform_namespace}::initialise
  };# initialise

  proc GetDropFileTempDirectory { } {
    variable _drop_file_temp_dir
    return $_drop_file_temp_dir
  }
  proc SetDropFileTempDirectory { dir } {
    variable _drop_file_temp_dir
    set _drop_file_temp_dir $dir
  }
 
};# namespace ::tkdnd

# ----------------------------------------------------------------------------
#  Command tkdnd::drag_source
# ----------------------------------------------------------------------------
proc ::tkdnd::drag_source { mode path { types {} } { event 1 } } {
  set tags [bindtags $path]
  set idx  [lsearch $tags "TkDND_Drag*"]
  switch -- $mode {
    register {
      if { $idx != -1 } {
        bindtags $path [lreplace $tags $idx $idx TkDND_Drag$event]
      } else {
        bindtags $path [concat $tags TkDND_Drag$event]
      }
      set types [platform_specific_types $types]
      set old_types [bind $path <<DragSourceTypes>>]
      foreach type $types {
        if {[lsearch $old_types $type] < 0} {lappend old_types $type}
      }
      bind $path <<DragSourceTypes>> $old_types
    }
    unregister {
      if { $idx != -1 } {
        bindtags $path [lreplace $tags $idx $idx]
      }
    }
  }
};# tkdnd::drag_source

# ----------------------------------------------------------------------------
#  Command tkdnd::drop_target
# ----------------------------------------------------------------------------
proc ::tkdnd::drop_target { mode path { types {} } } {
  variable _windowingsystem
  set types [platform_specific_types $types]
  switch -- $mode {
    register {
      switch $_windowingsystem {
        x11 {
          _register_types $path [winfo toplevel $path] $types
        }
        win32 -
        windows {
          _RegisterDragDrop $path
          bind <Destroy> $path {+ tkdnd::_RevokeDragDrop %W}
        }
        aqua {
          macdnd::registerdragwidget [winfo toplevel $path] $types
        }
        default {
          error "unknown Tk windowing system"
        }
      }
      set old_types [bind $path <<DropTargetTypes>>]
      set new_types {}
      foreach type $types {
        if {[lsearch -exact $old_types $type] < 0} {lappend new_types $type}
      }
      if {[llength $new_types]} {
        bind $path <<DropTargetTypes>> [concat $old_types $new_types]
      }
    }
    unregister {
      switch $_windowingsystem {
        x11 {
        }
        win32 -
        windows {
          _RevokeDragDrop $path
        }
        aqua {
          error todo
        }
        default {
          error "unknown Tk windowing system"
        }
      }
      bind $path <<DropTargetTypes>> {}
    }
  }
};# tkdnd::drop_target

# ----------------------------------------------------------------------------
#  Command tkdnd::_begin_drag
# ----------------------------------------------------------------------------
proc ::tkdnd::_begin_drag { event button source state X Y } {
  variable _x0
  variable _y0
  variable _state

  switch -- $event {
    press {
      set _x0    $X
      set _y0    $Y
      set _state "press"
    }
    motion {
      if { ![info exists _state] } {
        # This is just extra protection. There seem to be
        # rare cases where the motion comes before the press.
        return
      }
      if { [string equal $_state "press"] } {
        if { abs($_x0-$X) > 3 || abs($_y0-$Y) > 3 } {
          set _state "done"
          _init_drag $button $source $state $X $Y
        }
      }
    }
  }
};# tkdnd::_begin_drag

# ----------------------------------------------------------------------------
#  Command tkdnd::_init_drag
# ----------------------------------------------------------------------------
proc ::tkdnd::_init_drag { button source state rootX rootY } {
  # Call the <<DragInitCmd>> binding.
  set cmd [bind $source <<DragInitCmd>>]
  if {[string length $cmd]} {
    set cmd [string map [list %W $source %X $rootX %Y $rootY \
                              %S $state  %e <<DragInitCmd>> %A \{\} \
                              %t [bind $source <<DragSourceTypes>>]] $cmd]
    set info [uplevel \#0 $cmd]
    set len [llength $info]
    if {$len == 3} {
      foreach { actions types _data } $info { break }
      set types [platform_specific_types $types]
      set data [list]
      foreach type $types {
        lappend data $_data
      }
      unset _data
    } elseif {$len == 2} {
      foreach { actions _data } $info { break }
      set data [list]; set types [list]
      foreach {t d} $_data {
        foreach t [platform_specific_types $t] {
          lappend types $t; lappend data $d
        }
      }
      unset _data t d
    } else {
      error "not enough items in the result of the <<DragInitCmd>>\
             event binding. Either 2 or 3 items are expected."
    }
    set action refuse_drop
    variable _windowingsystem
    switch $_windowingsystem {
      x11 {
        set action [xdnd::_dodragdrop $source $actions $types $data $button]
      }
      win32 -
      windows {
        set action [_DoDragDrop $source $actions $types $data $button]
      }
      aqua {
        set action [macdnd::dodragdrop $source $actions $types $data $button]
      }
      default {
        error "unknown Tk windowing system"
      }
    }
    ## Call _end_drag to notify the widget of the result of the drag
    ## operation...
    _end_drag $button $source {} $action {} $data {} $state $rootX $rootY
  }
};# tkdnd::_init_drag

# ----------------------------------------------------------------------------
#  Command tkdnd::_end_drag
# ----------------------------------------------------------------------------
proc ::tkdnd::_end_drag { button source target action type data result
                          state rootX rootY } {
  set rootX 0
  set rootY 0
  # Call the <<DragEndCmd>> binding.
  set cmd [bind $source <<DragEndCmd>>]
  if {[string length $cmd]} {
    set cmd [string map [list %W $source %X $rootX %Y $rootY \
                              %S $state %e <<DragEndCmd>> %A \{$action\}] $cmd]
    set info [uplevel \#0 $cmd]
    # if { $info != "" } {
    #   variable _windowingsystem
    #   foreach { actions types data } $info { break }
    #   set types [platform_specific_types $types]
    #   switch $_windowingsystem {
    #     x11 {
    #       error "dragging from Tk widgets not yet supported"
    #     }
    #     win32 -
    #     windows {
    #       set action [_DoDragDrop $source $actions $types $data $button]
    #     }
    #     aqua {
    #       macdnd::dodragdrop $source $actions $types $data
    #     }
    #     default {
    #       error "unknown Tk windowing system"
    #     }
    #   }
    #   ## Call _end_drag to notify the widget of the result of the drag
    #   ## operation...
    #   _end_drag $button $source {} $action {} $data {} $state $rootX $rootY
    # }
  }
};# tkdnd::_end_drag

# ----------------------------------------------------------------------------
#  Command tkdnd::platform_specific_types
# ----------------------------------------------------------------------------
proc ::tkdnd::platform_specific_types { types } {
  variable _platform_namespace
  ${_platform_namespace}::platform_specific_types $types
}; # tkdnd::platform_specific_types

# ----------------------------------------------------------------------------
#  Command tkdnd::platform_independent_types
# ----------------------------------------------------------------------------
proc ::tkdnd::platform_independent_types { types } {
  variable _platform_namespace
  ${_platform_namespace}::platform_independent_types $types
}; # tkdnd::platform_independent_types

# ----------------------------------------------------------------------------
#  Command tkdnd::platform_specific_type
# ----------------------------------------------------------------------------
proc ::tkdnd::platform_specific_type { type } {
  variable _platform_namespace
  ${_platform_namespace}::platform_specific_type $type
}; # tkdnd::platform_specific_type

# ----------------------------------------------------------------------------
#  Command tkdnd::platform_independent_type
# ----------------------------------------------------------------------------
proc ::tkdnd::platform_independent_type { type } {
  variable _platform_namespace
  ${_platform_namespace}::platform_independent_type $type
}; # tkdnd::platform_independent_type

# ----------------------------------------------------------------------------
#  Command tkdnd::bytes_to_string
# ----------------------------------------------------------------------------
proc ::tkdnd::bytes_to_string { bytes } {
  set string {}
  foreach byte $bytes {
    append string [binary format c $byte]
  }
  return $string
};# tkdnd::bytes_to_string

# ----------------------------------------------------------------------------
#  Command tkdnd::urn_unquote
# ----------------------------------------------------------------------------
proc ::tkdnd::urn_unquote {url} {
  set result ""
  set start 0
  while {[regexp -start $start -indices {%[0-9a-fA-F]{2}} $url match]} {
    foreach {first last} $match break
    append result [string range $url $start [expr {$first - 1}]]
    append result [format %c 0x[string range $url [incr first] $last]]
    set start [incr last]
  }
  append result [string range $url $start end]
  return $result
};# tkdnd::urn_unquote
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<










































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted maclibs/tkdnd2.7/tkdnd_compat.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#
# tkdnd_compat.tcl --
# 
#    This file implements some utility procedures, to support older versions
#    of the TkDND package.
#
# This software is copyrighted by:
# George Petasis, National Centre for Scientific Research "Demokritos",
# Aghia Paraskevi, Athens, Greece.
# e-mail: petasis@iit.demokritos.gr
#
# The following terms apply to all files associated
# with the software unless explicitly disclaimed in individual files.
#
# The authors hereby grant permission to use, copy, modify, distribute,
# and license this software and its documentation for any purpose, provided
# that existing copyright notices are retained in all copies and that this
# notice is included verbatim in any distributions. No written agreement,
# license, or royalty fee is required for any of the authorized uses.
# Modifications to this software may be copyrighted by their authors
# and need not follow the licensing terms described here, provided that
# the new terms are clearly indicated on the first page of each file where
# they apply.
# 
# 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.
#

namespace eval compat {

};# namespace compat

# ----------------------------------------------------------------------------
#  Command ::dnd
# ----------------------------------------------------------------------------
proc ::dnd {method window args} {
  switch $method {
    bindtarget {
      switch [llength $args] {
        0 {return [tkdnd::compat::bindtarget0 $window]}
        1 {return [tkdnd::compat::bindtarget1 $window [lindex $args 0]]}
        2 {return [tkdnd::compat::bindtarget2 $window [lindex $args 0] \
                                                      [lindex $args 1]]}
        3 {return [tkdnd::compat::bindtarget3 $window [lindex $args 0] \
                                     [lindex $args 1] [lindex $args 2]]}
        4 {return [tkdnd::compat::bindtarget4 $window [lindex $args 0] \
                    [lindex $args 1] [lindex $args 2] [lindex $args 3]]}
      }
    }
    cleartarget {
      return [tkdnd::compat::cleartarget $window]
    }
    bindsource {
      switch [llength $args] {
        0 {return [tkdnd::compat::bindsource0 $window]}
        1 {return [tkdnd::compat::bindsource1 $window [lindex $args 0]]}
        2 {return [tkdnd::compat::bindsource2 $window [lindex $args 0] \
                                                      [lindex $args 1]]}
        3 {return [tkdnd::compat::bindsource3 $window [lindex $args 0] \
                                     [lindex $args 1] [lindex $args 2]]}
      }
    }
    clearsource {
      return [tkdnd::compat::clearsource $window]
    }
    drag {
      return [tkdnd::_init_drag $window "press" 0 0]
    }
  }
  error "invalid number of arguments!"
};# ::dnd

# ----------------------------------------------------------------------------
#  Command compat::bindtarget
# ----------------------------------------------------------------------------
proc compat::bindtarget0 {window} {
  return [bind $window <<DropTargetTypes>>]
};# compat::bindtarget0

proc compat::bindtarget1 {window type} {
  return [bindtarget2 $window $type <Drop>]
};# compat::bindtarget1

proc compat::bindtarget2 {window type event} {
  switch $event {
    <DragEnter> {return [bind $window <<DropEnter>>]}
    <Drag>      {return [bind $window <<DropPosition>>]}
    <DragLeave> {return [bind $window <<DropLeave>>]}
    <Drop>      {return [bind $window <<Drop>>]}
  }
};# compat::bindtarget2

proc compat::bindtarget3 {window type event script} {
  set type [normalise_type $type]
  ::tkdnd::drop_target register $window [list $type]
  switch $event {
    <DragEnter> {return [bind $window <<DropEnter>> $script]}
    <Drag>      {return [bind $window <<DropPosition>> $script]}
    <DragLeave> {return [bind $window <<DropLeave>> $script]}
    <Drop>      {return [bind $window <<Drop>> $script]}
  }
};# compat::bindtarget3

proc compat::bindtarget4 {window type event script priority} {
  return [bindtarget3 $window $type $event $script]
};# compat::bindtarget4

proc compat::normalise_type { type } {
  switch $type {
    text/plain -
    {text/plain;charset=UTF-8} -
    Text                       {return DND_Text}
    text/uri-list -
    Files                      {return DND_Files}
    default                    {return $type}
  }
};# compat::normalise_type

# ----------------------------------------------------------------------------
#  Command compat::bindsource
# ----------------------------------------------------------------------------
proc compat::bindsource0 {window} {
  return [bind $window <<DropTargetTypes>>]
};# compat::bindsource0

proc compat::bindsource1 {window type} {
  return [bindsource2 $window $type <Drop>]
};# compat::bindsource1

proc compat::bindsource2 {window type script} {
  ::tkdnd::drag_source register $window $type 2
  bind $window <<DragInitCmd>> "list {copy} %t \[$script\]"
};# compat::bindsource2

proc compat::bindsource3 {window type script priority} {
  return [bindsource2 $window $type $script]
};# compat::bindsource3

# ----------------------------------------------------------------------------
#  Command compat::cleartarget
# ----------------------------------------------------------------------------
proc compat::cleartarget {window} {
};# compat::cleartarget

# ----------------------------------------------------------------------------
#  Command compat::clearsource
# ----------------------------------------------------------------------------
proc compat::clearsource {window} {
};# compat::clearsource
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






























































































































































































































































































































Deleted maclibs/tkdnd2.7/tkdnd_generic.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
#
# tkdnd_generic.tcl --
#
#    This file implements some utility procedures that are used by the TkDND
#    package.
#
# This software is copyrighted by:
# George Petasis, National Centre for Scientific Research "Demokritos",
# Aghia Paraskevi, Athens, Greece.
# e-mail: petasis@iit.demokritos.gr
#
# The following terms apply to all files associated
# with the software unless explicitly disclaimed in individual files.
#
# The authors hereby grant permission to use, copy, modify, distribute,
# and license this software and its documentation for any purpose, provided
# that existing copyright notices are retained in all copies and that this
# notice is included verbatim in any distributions. No written agreement,
# license, or royalty fee is required for any of the authorized uses.
# Modifications to this software may be copyrighted by their authors
# and need not follow the licensing terms described here, provided that
# the new terms are clearly indicated on the first page of each file where
# they apply.
#
# 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.
#

namespace eval generic {
  variable _types {}
  variable _typelist {}
  variable _codelist {}
  variable _actionlist {}
  variable _pressedkeys {}
  variable _action {}
  variable _common_drag_source_types {}
  variable _common_drop_target_types {}
  variable _drag_source {}
  variable _drop_target {}

  variable _last_mouse_root_x 0
  variable _last_mouse_root_y 0

  variable _tkdnd2platform
  variable _platform2tkdnd

  proc debug {msg} {
    puts $msg
  };# debug

  proc initialise { } {
  };# initialise

  proc initialise_platform_to_tkdnd_types { types } {
    variable _platform2tkdnd
    variable _tkdnd2platform
    set _platform2tkdnd [dict create {*}$types]
    set _tkdnd2platform [dict create]
    foreach type [dict keys $_platform2tkdnd] {
      dict lappend _tkdnd2platform [dict get $_platform2tkdnd $type] $type
    }
  };# initialise_platform_to_tkdnd_types

  proc initialise_tkdnd_to_platform_types { types } {
    variable _tkdnd2platform
    set _tkdnd2platform [dict create {*}$types]
  };# initialise_tkdnd_to_platform_types

};# namespace generic

# ----------------------------------------------------------------------------
#  Command generic::HandleEnter
# ----------------------------------------------------------------------------
proc generic::HandleEnter { drop_target drag_source typelist codelist
                            actionlist pressedkeys } {
  variable _typelist;                 set _typelist    $typelist
  variable _pressedkeys;              set _pressedkeys $pressedkeys
  variable _action;                   set _action      refuse_drop
  variable _common_drag_source_types; set _common_drag_source_types {}
  variable _common_drop_target_types; set _common_drop_target_types {}
  variable _actionlist
  variable _drag_source;              set _drag_source $drag_source
  variable _drop_target;              set _drop_target {}
  variable _actionlist;               set _actionlist  $actionlist
  variable _codelist                  set _codelist    $codelist

  variable _last_mouse_root_x;        set _last_mouse_root_x 0
  variable _last_mouse_root_y;        set _last_mouse_root_y 0
  # debug "\n==============================================================="
  # debug "generic::HandleEnter: drop_target=$drop_target,\
  #        drag_source=$drag_source,\
  #        typelist=$typelist"
  # debug "generic::HandleEnter: ACTION: default"
  return default
};# generic::HandleEnter

# ----------------------------------------------------------------------------
#  Command generic::HandlePosition
# ----------------------------------------------------------------------------
proc generic::HandlePosition { drop_target drag_source pressedkeys
                               rootX rootY } {
  variable _types
  variable _typelist
  variable _codelist
  variable _actionlist
  variable _pressedkeys
  variable _action
  variable _common_drag_source_types
  variable _common_drop_target_types
  variable _drag_source
  variable _drop_target

  variable _last_mouse_root_x;        set _last_mouse_root_x $rootX
  variable _last_mouse_root_y;        set _last_mouse_root_y $rootY

  # debug "generic::HandlePosition: drop_target=$drop_target,\
  #            _drop_target=$_drop_target, rootX=$rootX, rootY=$rootY"

  if {![info exists _drag_source] && ![string length $_drag_source]} {
    # debug "generic::HandlePosition: no or empty _drag_source:\
    #               return refuse_drop"
    return refuse_drop
  }

  if {$drag_source ne "" && $drag_source ne $_drag_source} {
    debug "generic position event from unexpected source: $_drag_source\
           != $drag_source"
    return refuse_drop
  }

  set _pressedkeys $pressedkeys

  ## Does the new drop target support any of our new types?
  # foreach {common_drag_source_types common_drop_target_types} \
  #         [GetWindowCommonTypes $drop_target $_typelist] {break}
  foreach {drop_target common_drag_source_types common_drop_target_types} \
          [FindWindowWithCommonTypes $drop_target $_typelist] {break}

  # debug "\t($_drop_target) -> ($drop_target)"
  if {$drop_target != $_drop_target} {
    if {[string length $_drop_target]} {
      ## Call the <<DropLeave>> event.
      # debug "\t<<DropLeave>> on $_drop_target"
      set cmd [bind $_drop_target <<DropLeave>>]
      if {[string length $cmd]} {
        set cmd [string map [list %W $_drop_target %X $rootX %Y $rootY \
          %CST \{$_common_drag_source_types\} \
          %CTT \{$_common_drop_target_types\} \
          %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \
          %ST  \{$_typelist\}    %TT \{$_types\} \
          %A   \{$_action\}      %a \{$_actionlist\} \
          %b   \{$_pressedkeys\} %m \{$_pressedkeys\} \
          %D   \{\}              %e <<DropLeave>> \
          %L   \{$_typelist\}    %% % \
          %t   \{$_typelist\}    %T  \{[lindex $_common_drag_source_types 0]\} \
          %c   \{$_codelist\}    %C  \{[lindex $_codelist 0]\} \
          ] $cmd]
        uplevel \#0 $cmd
      }
    }
    set _drop_target $drop_target
    set _action      refuse_drop

    if {[llength $common_drag_source_types]} {
      set _action [lindex $_actionlist 0]
      set _common_drag_source_types $common_drag_source_types
      set _common_drop_target_types $common_drop_target_types
      ## Drop target supports at least one type. Send a <<DropEnter>>.
      # puts "<<DropEnter>> -> $drop_target"
      set cmd [bind $drop_target <<DropEnter>>]
      if {[string length $cmd]} {
        focus $drop_target
        set cmd [string map [list %W $drop_target %X $rootX %Y $rootY \
          %CST \{$_common_drag_source_types\} \
          %CTT \{$_common_drop_target_types\} \
          %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \
          %ST  \{$_typelist\}    %TT \{$_types\} \
          %A   $_action          %a  \{$_actionlist\} \
          %b   \{$_pressedkeys\} %m  \{$_pressedkeys\} \
          %D   \{\}              %e  <<DropEnter>> \
          %L   \{$_typelist\}    %%  % \
          %t   \{$_typelist\}    %T  \{[lindex $_common_drag_source_types 0]\} \
          %c   \{$_codelist\}    %C  \{[lindex $_codelist 0]\} \
          ] $cmd]
        set _action [uplevel \#0 $cmd]
        switch -exact -- $_action {
          copy - move - link - ask - private - refuse_drop - default {}
          default {set _action copy}
        }
      }
    }
  }

  set _drop_target {}
  if {[llength $common_drag_source_types]} {
    set _common_drag_source_types $common_drag_source_types
    set _common_drop_target_types $common_drop_target_types
    set _drop_target $drop_target
    ## Drop target supports at least one type. Send a <<DropPosition>>.
    set cmd [bind $drop_target <<DropPosition>>]
    if {[string length $cmd]} {
      set cmd [string map [list %W $drop_target %X $rootX %Y $rootY \
        %CST \{$_common_drag_source_types\} \
        %CTT \{$_common_drop_target_types\} \
        %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \
        %ST  \{$_typelist\}    %TT \{$_types\} \
        %A   $_action          %a  \{$_actionlist\} \
        %b   \{$_pressedkeys\} %m  \{$_pressedkeys\} \
        %D   \{\}              %e  <<DropPosition>> \
        %L   \{$_typelist\}    %%  % \
        %t   \{$_typelist\}    %T  \{[lindex $_common_drag_source_types 0]\} \
        %c   \{$_codelist\}    %C  \{[lindex $_codelist 0]\} \
        ] $cmd]
      set _action [uplevel \#0 $cmd]
    }
  }
  # Return values: copy, move, link, ask, private, refuse_drop, default
  # debug "generic::HandlePosition: ACTION: $_action"
  switch -exact -- $_action {
    copy - move - link - ask - private - refuse_drop - default {}
    default {set _action copy}
  }
  return $_action
};# generic::HandlePosition

# ----------------------------------------------------------------------------
#  Command generic::HandleLeave
# ----------------------------------------------------------------------------
proc generic::HandleLeave { } {
  variable _types
  variable _typelist
  variable _codelist
  variable _actionlist
  variable _pressedkeys
  variable _action
  variable _common_drag_source_types
  variable _common_drop_target_types
  variable _drag_source
  variable _drop_target
  variable _last_mouse_root_x
  variable _last_mouse_root_y
  if {![info exists _drop_target]} {set _drop_target {}}
  # debug "generic::HandleLeave: _drop_target=$_drop_target"
  if {[info exists _drop_target] && [string length $_drop_target]} {
    set cmd [bind $_drop_target <<DropLeave>>]
    if {[string length $cmd]} {
      set cmd [string map [list %W $_drop_target \
        %X $_last_mouse_root_x %Y $_last_mouse_root_y \
        %CST \{$_common_drag_source_types\} \
        %CTT \{$_common_drop_target_types\} \
        %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \
        %ST  \{$_typelist\}    %TT \{$_types\} \
        %A   \{$_action\}      %a  \{$_actionlist\} \
        %b   \{$_pressedkeys\} %m  \{$_pressedkeys\} \
        %D   \{\}              %e  <<DropLeave>> \
        %L   \{$_typelist\}    %%  % \
        %t   \{$_typelist\}    %T  \{[lindex $_common_drag_source_types 0]\} \
        %c   \{$_codelist\}    %C  \{[lindex $_codelist 0]\} \
        ] $cmd]
      set _action [uplevel \#0 $cmd]
    }
  }
  foreach var {_types _typelist _actionlist _pressedkeys _action
               _common_drag_source_types _common_drop_target_types
               _drag_source _drop_target} {
    set $var {}
  }
};# generic::HandleLeave

# ----------------------------------------------------------------------------
#  Command generic::HandleDrop
# ----------------------------------------------------------------------------
proc generic::HandleDrop {drop_target drag_source pressedkeys rootX rootY time } {
  variable _types
  variable _typelist
  variable _codelist
  variable _actionlist
  variable _pressedkeys
  variable _action
  variable _common_drag_source_types
  variable _common_drop_target_types
  variable _drag_source
  variable _drop_target
  variable _last_mouse_root_x
  variable _last_mouse_root_y
  variable _last_mouse_root_x;        set _last_mouse_root_x $rootX
  variable _last_mouse_root_y;        set _last_mouse_root_y $rootY

  set _pressedkeys $pressedkeys

  # puts "generic::HandleDrop: $time"

  if {![info exists _drag_source] && ![string length $_drag_source]} {
    return refuse_drop
  }
  if {![info exists _drop_target] && ![string length $_drop_target]} {
    return refuse_drop
  }
  if {![llength $_common_drag_source_types]} {return refuse_drop}
  ## Get the dropped data.
  set data [GetDroppedData $time]
  ## Try to select the most specific <<Drop>> event.
  foreach type [concat $_common_drag_source_types $_common_drop_target_types] {
    set type [platform_independent_type $type]
    set cmd [bind $_drop_target <<Drop:$type>>]
    if {[string length $cmd]} {
      set cmd [string map [list %W $_drop_target %X $rootX %Y $rootY \
        %CST \{$_common_drag_source_types\} \
        %CTT \{$_common_drop_target_types\} \
        %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \
        %ST  \{$_typelist\}    %TT \{$_types\} \
        %A   $_action          %a \{$_actionlist\} \
        %b   \{$_pressedkeys\} %m \{$_pressedkeys\} \
        %D   [list $data]      %e <<Drop:$type>> \
        %L   \{$_typelist\}    %% % \
        %t   \{$_typelist\}    %T  \{[lindex $_common_drag_source_types 0]\} \
        %c   \{$_codelist\}    %C  \{[lindex $_codelist 0]\} \
        ] $cmd]
      set _action [uplevel \#0 $cmd]
      # Return values: copy, move, link, ask, private, refuse_drop
      switch -exact -- $_action {
        copy - move - link - ask - private - refuse_drop - default {}
        default {set _action copy}
      }
      return $_action
    }
  }
  set cmd [bind $_drop_target <<Drop>>]
  if {[string length $cmd]} {
    set cmd [string map [list %W $_drop_target %X $rootX %Y $rootY \
      %CST \{$_common_drag_source_types\} \
      %CTT \{$_common_drop_target_types\} \
      %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \
      %ST  \{$_typelist\}    %TT \{$_types\} \
      %A   $_action          %a \{$_actionlist\} \
      %b   \{$_pressedkeys\} %m \{$_pressedkeys\} \
      %D   [list $data]      %e <<Drop>> \
      %L   \{$_typelist\}    %% % \
      %t   \{$_typelist\}    %T  \{[lindex $_common_drag_source_types 0]\} \
      %c   \{$_codelist\}    %C  \{[lindex $_codelist 0]\} \
      ] $cmd]
    set _action [uplevel \#0 $cmd]
  }
  # Return values: copy, move, link, ask, private, refuse_drop
  switch -exact -- $_action {
    copy - move - link - ask - private - refuse_drop - default {}
    default {set _action copy}
  }
  return $_action
};# generic::HandleDrop

# ----------------------------------------------------------------------------
#  Command generic::GetWindowCommonTypes
# ----------------------------------------------------------------------------
proc generic::GetWindowCommonTypes { win typelist } {
  set types [bind $win <<DropTargetTypes>>]
  # debug ">> Accepted types: $win $_types"
  set common_drag_source_types {}
  set common_drop_target_types {}
  if {[llength $types]} {
    ## Examine the drop target types, to find at least one match with the drag
    ## source types...
    set supported_types [supported_types $typelist]
    foreach type $types {
      foreach matched [lsearch -glob -all -inline $supported_types $type] {
        ## Drop target supports this type.
        lappend common_drag_source_types $matched
        lappend common_drop_target_types $type
      }
    }
  }
  list $common_drag_source_types $common_drop_target_types
};# generic::GetWindowCommonTypes

# ----------------------------------------------------------------------------
#  Command generic::FindWindowWithCommonTypes
# ----------------------------------------------------------------------------
proc generic::FindWindowWithCommonTypes { win typelist } {
  set toplevel [winfo toplevel $win]
  while {![string equal $win $toplevel]} {
    foreach {common_drag_source_types common_drop_target_types} \
            [GetWindowCommonTypes $win $typelist] {break}
    if {[llength $common_drag_source_types]} {
      return [list $win $common_drag_source_types $common_drop_target_types]
    }
    set win [winfo parent $win]
  }
  return { {} {} {} }
};# generic::FindWindowWithCommonTypes

# ----------------------------------------------------------------------------
#  Command generic::GetDroppedData
# ----------------------------------------------------------------------------
proc generic::GetDroppedData { time } {
  variable _dropped_data
  return  $_dropped_data
};# generic::GetDroppedData

# ----------------------------------------------------------------------------
#  Command generic::SetDroppedData
# ----------------------------------------------------------------------------
proc generic::SetDroppedData { data } {
  variable _dropped_data
  set _dropped_data $data
};# generic::SetDroppedData

# ----------------------------------------------------------------------------
#  Command generic::GetDragSource
# ----------------------------------------------------------------------------
proc generic::GetDragSource { } {
  variable _drag_source
  return  $_drag_source
};# generic::GetDragSource

# ----------------------------------------------------------------------------
#  Command generic::GetDropTarget
# ----------------------------------------------------------------------------
proc generic::GetDropTarget { } {
  variable _drop_target
  return $_drop_target
};# generic::GetDropTarget

# ----------------------------------------------------------------------------
#  Command generic::GetDragSourceCommonTypes
# ----------------------------------------------------------------------------
proc generic::GetDragSourceCommonTypes { } {
  variable _common_drag_source_types
  return  $_common_drag_source_types
};# generic::GetDragSourceCommonTypes

# ----------------------------------------------------------------------------
#  Command generic::GetDropTargetCommonTypes
# ----------------------------------------------------------------------------
proc generic::GetDropTargetCommonTypes { } {
  variable _common_drag_source_types
  return  $_common_drag_source_types
};# generic::GetDropTargetCommonTypes

# ----------------------------------------------------------------------------
#  Command generic::platform_specific_types
# ----------------------------------------------------------------------------
proc generic::platform_specific_types { types } {
  set new_types {}
  foreach type $types {
    set new_types [concat $new_types [platform_specific_type $type]]
  }
  return $new_types
}; # generic::platform_specific_types

# ----------------------------------------------------------------------------
#  Command generic::platform_specific_type
# ----------------------------------------------------------------------------
proc generic::platform_specific_type { type } {
  variable _tkdnd2platform
  if {[dict exists $_tkdnd2platform $type]} {
    return [dict get $_tkdnd2platform $type]
  }
  list $type
}; # generic::platform_specific_type

# ----------------------------------------------------------------------------
#  Command tkdnd::platform_independent_types
# ----------------------------------------------------------------------------
proc ::tkdnd::platform_independent_types { types } {
  set new_types {}
  foreach type $types {
    set new_types [concat $new_types [platform_independent_type $type]]
  }
  return $new_types
}; # tkdnd::platform_independent_types

# ----------------------------------------------------------------------------
#  Command generic::platform_independent_type
# ----------------------------------------------------------------------------
proc generic::platform_independent_type { type } {
  variable _platform2tkdnd
  if {[dict exists $_platform2tkdnd $type]} {
    return [dict get $_platform2tkdnd $type]
  }
  return $type
}; # generic::platform_independent_type

# ----------------------------------------------------------------------------
#  Command generic::supported_types
# ----------------------------------------------------------------------------
proc generic::supported_types { types } {
  set new_types {}
  foreach type $types {
    if {[supported_type $type]} {lappend new_types $type}
  }
  return $new_types
}; # generic::supported_types

# ----------------------------------------------------------------------------
#  Command generic::supported_type
# ----------------------------------------------------------------------------
proc generic::supported_type { type } {
  variable _platform2tkdnd
  if {[dict exists $_platform2tkdnd $type]} {
    return 1
  }
  return 0
}; # generic::supported_type
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted maclibs/tkdnd2.7/tkdnd_macosx.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#
# tkdnd_macosx.tcl --
#
#    This file implements some utility procedures that are used by the TkDND
#    package.

#   This software is copyrighted by:
#   Georgios Petasis, Athens, Greece.
#   e-mail: petasisg@yahoo.gr, petasis@iit.demokritos.gr
#
#   Mac portions (c) 2009 Kevin Walzer/WordTech Communications LLC,
#   kw@codebykevin.com
#
#
# The following terms apply to all files associated
# with the software unless explicitly disclaimed in individual files.
#
# The authors hereby grant permission to use, copy, modify, distribute,
# and license this software and its documentation for any purpose, provided
# that existing copyright notices are retained in all copies and that this
# notice is included verbatim in any distributions. No written agreement,
# license, or royalty fee is required for any of the authorized uses.
# Modifications to this software may be copyrighted by their authors
# and need not follow the licensing terms described here, provided that
# the new terms are clearly indicated on the first page of each file where
# they apply.
#
# 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.
#

#basic API for Mac Drag and Drop

#two data types supported: strings and file paths

#two commands at C level: ::tkdnd::macdnd::registerdragwidget, ::tkdnd::macdnd::unregisterdragwidget

#data retrieval mechanism: text or file paths are copied from drag clipboard to system clipboard and retrieved via [clipboard get]; array of file paths is converted to single tab-separated string, can be split into Tcl list

if {[tk windowingsystem] eq "aqua" && "AppKit" ni [winfo server .]} {
  error {TkAqua Cocoa required}
}

namespace eval macdnd {

  proc initialise { } {
     ## Mapping from platform types to TkDND types...
    ::tkdnd::generic::initialise_platform_to_tkdnd_types [list \
       NSPasteboardTypeString  DND_Text  \
       NSFilenamesPboardType   DND_Files \
       NSPasteboardTypeHTML    DND_HTML  \
    ]
  };# initialise

};# namespace macdnd

# ----------------------------------------------------------------------------
#  Command macdnd::HandleEnter
# ----------------------------------------------------------------------------
proc macdnd::HandleEnter { path drag_source typelist } {
  variable _pressedkeys
  variable _actionlist
  set _pressedkeys 1
  set _actionlist  { copy move link ask private }
  ::tkdnd::generic::HandleEnter $path $drag_source $typelist $typelist \
           $_actionlist $_pressedkeys
};# macdnd::HandleEnter

# ----------------------------------------------------------------------------
#  Command macdnd::HandlePosition
# ----------------------------------------------------------------------------
proc macdnd::HandlePosition { drop_target rootX rootY {drag_source {}} } {
  variable _pressedkeys
  variable _last_mouse_root_x; set _last_mouse_root_x $rootX
  variable _last_mouse_root_y; set _last_mouse_root_y $rootY
  ::tkdnd::generic::HandlePosition $drop_target $drag_source \
                                   $_pressedkeys $rootX $rootY
};# macdnd::HandlePosition

# ----------------------------------------------------------------------------
#  Command macdnd::HandleLeave
# ----------------------------------------------------------------------------
proc macdnd::HandleLeave { args } {
  ::tkdnd::generic::HandleLeave
};# macdnd::HandleLeave

# ----------------------------------------------------------------------------
#  Command macdnd::HandleDrop
# ----------------------------------------------------------------------------
proc macdnd::HandleDrop { drop_target data args } {
  variable _pressedkeys
  variable _last_mouse_root_x
  variable _last_mouse_root_y
  ## Get the dropped data...
  ::tkdnd::generic::SetDroppedData $data
  ::tkdnd::generic::HandleDrop {} {} $_pressedkeys \
                               $_last_mouse_root_x $_last_mouse_root_y 0
};# macdnd::HandleDrop

# ----------------------------------------------------------------------------
#  Command macdnd::GetDragSourceCommonTypes
# ----------------------------------------------------------------------------
proc macdnd::GetDragSourceCommonTypes { } {
  ::tkdnd::generic::GetDragSourceCommonTypes
};# macdnd::GetDragSourceCommonTypes

# ----------------------------------------------------------------------------
#  Command macdnd::platform_specific_types
# ----------------------------------------------------------------------------
proc macdnd::platform_specific_types { types } {
  ::tkdnd::generic::platform_specific_types $types
}; # macdnd::platform_specific_types

# ----------------------------------------------------------------------------
#  Command macdnd::platform_specific_type
# ----------------------------------------------------------------------------
proc macdnd::platform_specific_type { type } {
  ::tkdnd::generic::platform_specific_type $type
}; # macdnd::platform_specific_type

# ----------------------------------------------------------------------------
#  Command tkdnd::platform_independent_types
# ----------------------------------------------------------------------------
proc ::tkdnd::platform_independent_types { types } {
  ::tkdnd::generic::platform_independent_types $types
}; # tkdnd::platform_independent_types

# ----------------------------------------------------------------------------
#  Command macdnd::platform_independent_type
# ----------------------------------------------------------------------------
proc macdnd::platform_independent_type { type } {
  ::tkdnd::generic::platform_independent_type $type
}; # macdnd::platform_independent_type
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






























































































































































































































































































Deleted maclibs/tkdnd2.7/tkdnd_unix.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
#
# tkdnd_unix.tcl --
#
#    This file implements some utility procedures that are used by the TkDND
#    package.
#
# This software is copyrighted by:
# George Petasis, National Centre for Scientific Research "Demokritos",
# Aghia Paraskevi, Athens, Greece.
# e-mail: petasis@iit.demokritos.gr
#
# The following terms apply to all files associated
# with the software unless explicitly disclaimed in individual files.
#
# The authors hereby grant permission to use, copy, modify, distribute,
# and license this software and its documentation for any purpose, provided
# that existing copyright notices are retained in all copies and that this
# notice is included verbatim in any distributions. No written agreement,
# license, or royalty fee is required for any of the authorized uses.
# Modifications to this software may be copyrighted by their authors
# and need not follow the licensing terms described here, provided that
# the new terms are clearly indicated on the first page of each file where
# they apply.
#
# 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.
#

namespace eval xdnd {
  variable _dragging 0

  proc initialise { } {
    ## Mapping from platform types to TkDND types...
    ::tkdnd::generic::initialise_platform_to_tkdnd_types [list \
       text/plain\;charset=utf-8     DND_Text  \
       UTF8_STRING                   DND_Text  \
       text/plain                    DND_Text  \
       STRING                        DND_Text  \
       TEXT                          DND_Text  \
       COMPOUND_TEXT                 DND_Text  \
       text/uri-list                 DND_Files \
       text/html\;charset=utf-8      DND_HTML  \
       text/html                     DND_HTML  \
       application/x-color           DND_Color \
    ]
  };# initialise

};# namespace xdnd

# ----------------------------------------------------------------------------
#  Command xdnd::HandleXdndEnter
# ----------------------------------------------------------------------------
proc xdnd::HandleXdndEnter { path drag_source typelist } {
  variable _pressedkeys
  variable _actionlist
  set _pressedkeys 1
  set _actionlist  { copy move link ask private }
  ::tkdnd::generic::HandleEnter $path $drag_source $typelist $typelist \
           $_actionlist $_pressedkeys
};# xdnd::HandleXdndEnter

# ----------------------------------------------------------------------------
#  Command xdnd::HandleXdndPosition
# ----------------------------------------------------------------------------
proc xdnd::HandleXdndPosition { drop_target rootX rootY {drag_source {}} } {
  variable _pressedkeys
  variable _last_mouse_root_x; set _last_mouse_root_x $rootX
  variable _last_mouse_root_y; set _last_mouse_root_y $rootY
  ::tkdnd::generic::HandlePosition $drop_target $drag_source \
                                   $_pressedkeys $rootX $rootY
};# xdnd::HandleXdndPosition

# ----------------------------------------------------------------------------
#  Command xdnd::HandleXdndLeave
# ----------------------------------------------------------------------------
proc xdnd::HandleXdndLeave { } {
  ::tkdnd::generic::HandleLeave
};# xdnd::HandleXdndLeave

# ----------------------------------------------------------------------------
#  Command xdnd::_HandleXdndDrop
# ----------------------------------------------------------------------------
proc xdnd::HandleXdndDrop { time } {
  variable _pressedkeys
  variable _last_mouse_root_x
  variable _last_mouse_root_y
  ## Get the dropped data...
  ::tkdnd::generic::SetDroppedData [GetDroppedData $time]
  ::tkdnd::generic::HandleDrop {} {} $_pressedkeys \
                               $_last_mouse_root_x $_last_mouse_root_y $time
};# xdnd::HandleXdndDrop

# ----------------------------------------------------------------------------
#  Command xdnd::_GetDroppedData
# ----------------------------------------------------------------------------
proc xdnd::GetDroppedData { time } {
  set _drag_source              [::tkdnd::generic::GetDragSource]
  set _drop_target              [::tkdnd::generic::GetDropTarget]
  set _common_drag_source_types [::tkdnd::generic::GetDragSourceCommonTypes]
  if {![llength $_common_drag_source_types]} {
    error "no common data types between the drag source and drop target widgets"
  }
  ## Is drag source in this application?
  if {[catch {winfo pathname -displayof $_drop_target $_drag_source} p]} {
    set _use_tk_selection 0
  } else {
    set _use_tk_selection 1
  }
  foreach type $_common_drag_source_types {
    # puts "TYPE: $type ($_drop_target)"
    # _get_selection $_drop_target $time $type
    if {$_use_tk_selection} {
      if {![catch {
        selection get -displayof $_drop_target -selection XdndSelection \
                      -type $type
                                              } result options]} {
        return [normalise_data $type $result]
      }
    } else {
      # puts "_selection_get -displayof $_drop_target -selection XdndSelection \
      #                 -type $type -time $time"
      #after 100 [list focus -force $_drop_target]
      #after 50 [list raise [winfo toplevel $_drop_target]]
      if {![catch {
        _selection_get -displayof $_drop_target -selection XdndSelection \
                      -type $type -time $time
                                              } result options]} {
        return [normalise_data $type $result]
      }
    }
  }
  return -options $options $result
};# xdnd::GetDroppedData

# ----------------------------------------------------------------------------
#  Command xdnd::platform_specific_types
# ----------------------------------------------------------------------------
proc xdnd::platform_specific_types { types } {
  ::tkdnd::generic::platform_specific_types $types
}; # xdnd::platform_specific_types

# ----------------------------------------------------------------------------
#  Command xdnd::platform_specific_type
# ----------------------------------------------------------------------------
proc xdnd::platform_specific_type { type } {
  ::tkdnd::generic::platform_specific_type $type
}; # xdnd::platform_specific_type

# ----------------------------------------------------------------------------
#  Command tkdnd::platform_independent_types
# ----------------------------------------------------------------------------
proc ::tkdnd::platform_independent_types { types } {
  ::tkdnd::generic::platform_independent_types $types
}; # tkdnd::platform_independent_types

# ----------------------------------------------------------------------------
#  Command xdnd::platform_independent_type
# ----------------------------------------------------------------------------
proc xdnd::platform_independent_type { type } {
  ::tkdnd::generic::platform_independent_type $type
}; # xdnd::platform_independent_type

# ----------------------------------------------------------------------------
#  Command xdnd::_normalise_data
# ----------------------------------------------------------------------------
proc xdnd::normalise_data { type data } {
  # Tk knows how to interpret the following types:
  #    STRING, TEXT, COMPOUND_TEXT
  #    UTF8_STRING
  # Else, it returns a list of 8 or 32 bit numbers...
  switch -glob $type {
    STRING - UTF8_STRING - TEXT - COMPOUND_TEXT {return $data}
    text/html {
      if {[catch {
            encoding convertfrom unicode $data
           } string]} {
        set string $data
      }
      return [string map {\r\n \n} $string]
    }
    text/html\;charset=utf-8  -
    text/plain\;charset=utf-8 -
    text/plain {
      if {[catch {
            encoding convertfrom utf-8 [tkdnd::bytes_to_string $data]
           } string]} {
        set string $data
      }
      return [string map {\r\n \n} $string]
    }
    text/uri-list* {
      if {[catch {
            encoding convertfrom utf-8 [tkdnd::bytes_to_string $data
          } string]} {
        set string $data
      }
      ## Get rid of \r\n
      set string [string trim [string map {\r\n \n} $string]]
      set files {}
      foreach quoted_file [split $string] {
        set file [tkdnd::urn_unquote $quoted_file]
        switch -glob $file {
          file://*  {lappend files [string range $file 7 end]}
          ftp://*   -
          https://* -
          http://*  {lappend files $quoted_file}
          default   {lappend files $file}
        }
      }
      return $files
    }
    application/x-color {
      return $data
    }
    text/x-moz-url -
    application/q-iconlist -
    default    {return $data}
  }
}; # xdnd::normalise_data

#############################################################################
##
##  XDND drag implementation
##
#############################################################################

# ----------------------------------------------------------------------------
#  Command xdnd::_selection_ownership_lost
# ----------------------------------------------------------------------------
proc xdnd::_selection_ownership_lost {} {
  variable _dragging
  set _dragging 0
};# _selection_ownership_lost

# ----------------------------------------------------------------------------
#  Command xdnd::_dodragdrop
# ----------------------------------------------------------------------------
proc xdnd::_dodragdrop { source actions types data button } {
  variable _dragging

  # puts "xdnd::_dodragdrop: source: $source, actions: $actions, types: $types,\
  #       data: \"$data\", button: $button"
  if {$_dragging} {
    ## We are in the middle of another drag operation...
    error "another drag operation in progress"
  }

  variable _dodragdrop_drag_source                $source
  variable _dodragdrop_drop_target                0
  variable _dodragdrop_drop_target_proxy          0
  variable _dodragdrop_actions                    $actions
  variable _dodragdrop_action_descriptions        $actions
  variable _dodragdrop_actions_len                [llength $actions]
  variable _dodragdrop_types                      $types
  variable _dodragdrop_types_len                  [llength $types]
  variable _dodragdrop_data                       $data
  variable _dodragdrop_transfer_data              {}
  variable _dodragdrop_button                     $button
  variable _dodragdrop_time                       0
  variable _dodragdrop_default_action             refuse_drop
  variable _dodragdrop_waiting_status             0
  variable _dodragdrop_drop_target_accepts_drop   0
  variable _dodragdrop_drop_target_accepts_action refuse_drop
  variable _dodragdrop_current_cursor             $_dodragdrop_default_action
  variable _dodragdrop_drop_occured               0
  variable _dodragdrop_selection_requestor        0

  ##
  ## If we have more than 3 types, the property XdndTypeList must be set on
  ## the drag source widget...
  ##
  if {$_dodragdrop_types_len > 3} {
    _announce_type_list $_dodragdrop_drag_source $_dodragdrop_types
  }

  ##
  ## Announce the actions & their descriptions on the XdndActionList &
  ## XdndActionDescription properties...
  ##
  _announce_action_list $_dodragdrop_drag_source $_dodragdrop_actions \
                        $_dodragdrop_action_descriptions

  ##
  ## Arrange selection handlers for our drag source, and all the supported types
  ##
  registerSelectionHandler $source $types

  ##
  ## Step 1: When a drag begins, the source takes ownership of XdndSelection.
  ##
  selection own -command ::tkdnd::xdnd::_selection_ownership_lost \
                -selection XdndSelection $source
  set _dragging 1

  ## Grab the mouse pointer...
  _grab_pointer $source $_dodragdrop_default_action

  ## Register our generic event handler...
  #  The generic event callback will report events by modifying variable
  #  ::xdnd::_dodragdrop_event: a dict with event information will be set as
  #  the value of the variable...
  _register_generic_event_handler

  ## Set a timeout for debugging purposes...
  #  after 60000 {set ::tkdnd::xdnd::_dragging 0}

  tkwait variable ::tkdnd::xdnd::_dragging
  _SendXdndLeave

  set _dragging 0
  _ungrab_pointer $source
  _unregister_generic_event_handler
  catch {selection clear -selection XdndSelection}
  unregisterSelectionHandler $source $types
  return $_dodragdrop_drop_target_accepts_action
};# xdnd::_dodragdrop

# ----------------------------------------------------------------------------
#  Command xdnd::_process_drag_events
# ----------------------------------------------------------------------------
proc xdnd::_process_drag_events {event} {
  # The return value from proc is normally 0. A non-zero return value indicates
  # that the event is not to be handled further; that is, proc has done all
  # processing that is to be allowed for the event
  variable _dragging
  if {!$_dragging} {return 0}
  # puts $event

  variable _dodragdrop_time
  set time [dict get $event time]
  set type [dict get $event type]
  if {$time < $_dodragdrop_time && ![string equal $type SelectionRequest]} {
    return 0
  }
  set _dodragdrop_time $time

  variable _dodragdrop_drag_source
  variable _dodragdrop_drop_target
  variable _dodragdrop_drop_target_proxy
  variable _dodragdrop_default_action
  switch $type {
    MotionNotify {
      set rootx  [dict get $event x_root]
      set rooty  [dict get $event y_root]
      set window [_find_drop_target_window $_dodragdrop_drag_source \
                                           $rootx $rooty]
      if {[string length $window]} {
        ## Examine the modifiers to suggest an action...
        set _dodragdrop_default_action [_default_action $event]
        ## Is it a Tk widget?
        # set path [winfo containing $rootx $rooty]
        # puts "Window under mouse: $window ($path)"
        if {$_dodragdrop_drop_target != $window} {
          ## Send XdndLeave to $_dodragdrop_drop_target
          _SendXdndLeave
          ## Is there a proxy? If not, _find_drop_target_proxy returns the
          ## target window, so we always get a valid "proxy".
          set proxy [_find_drop_target_proxy $_dodragdrop_drag_source $window]
          ## Send XdndEnter to $window
          _SendXdndEnter $window $proxy
          ## Send XdndPosition to $_dodragdrop_drop_target
          _SendXdndPosition $rootx $rooty $_dodragdrop_default_action
        } else {
          ## Send XdndPosition to $_dodragdrop_drop_target
          _SendXdndPosition $rootx $rooty $_dodragdrop_default_action
        }
      } else {
        ## No window under the mouse. Send XdndLeave to $_dodragdrop_drop_target
        _SendXdndLeave
      }
    }
    ButtonPress {
    }
    ButtonRelease {
      variable _dodragdrop_button
      set button [dict get $event button]
      if {$button == $_dodragdrop_button} {
        ## The button that initiated the drag was released. Trigger drop...
        _SendXdndDrop
      }
      return 1
    }
    KeyPress {
    }
    KeyRelease {
      set keysym [dict get $event keysym]
      switch $keysym {
        Escape {
          ## The user has pressed escape. Abort...
          if {$_dragging} {set _dragging 0}
        }
      }
    }
    SelectionRequest {
      variable _dodragdrop_selection_requestor
      variable _dodragdrop_selection_property
      variable _dodragdrop_selection_selection
      variable _dodragdrop_selection_target
      variable _dodragdrop_selection_time
      set _dodragdrop_selection_requestor [dict get $event requestor]
      set _dodragdrop_selection_property  [dict get $event property]
      set _dodragdrop_selection_selection [dict get $event selection]
      set _dodragdrop_selection_target    [dict get $event target]
      set _dodragdrop_selection_time      $time
      return 0
    }
    default {
      return 0
    }
  }
  return 0
};# _process_drag_events

# ----------------------------------------------------------------------------
#  Command xdnd::_SendXdndEnter
# ----------------------------------------------------------------------------
proc xdnd::_SendXdndEnter {window proxy} {
  variable _dodragdrop_drag_source
  variable _dodragdrop_drop_target
  variable _dodragdrop_drop_target_proxy
  variable _dodragdrop_types
  variable _dodragdrop_waiting_status
  variable _dodragdrop_drop_occured
  if {$_dodragdrop_drop_target > 0} _SendXdndLeave
  if {$_dodragdrop_drop_occured} return
  set _dodragdrop_drop_target       $window
  set _dodragdrop_drop_target_proxy $proxy
  set _dodragdrop_waiting_status    0
  if {$_dodragdrop_drop_target < 1} return
  # puts "XdndEnter: $_dodragdrop_drop_target $_dodragdrop_drop_target_proxy"
  _send_XdndEnter $_dodragdrop_drag_source $_dodragdrop_drop_target \
                  $_dodragdrop_drop_target_proxy $_dodragdrop_types
};# xdnd::_SendXdndEnter

# ----------------------------------------------------------------------------
#  Command xdnd::_SendXdndPosition
# ----------------------------------------------------------------------------
proc xdnd::_SendXdndPosition {rootx rooty action} {
  variable _dodragdrop_drag_source
  variable _dodragdrop_drop_target
  if {$_dodragdrop_drop_target < 1} return
  variable _dodragdrop_drop_occured
  if {$_dodragdrop_drop_occured} return
  variable _dodragdrop_drop_target_proxy
  variable _dodragdrop_waiting_status
  ## Arrange a new XdndPosition, to be send periodically...
  variable _dodragdrop_xdnd_position_heartbeat
  catch {after cancel $_dodragdrop_xdnd_position_heartbeat}
  set _dodragdrop_xdnd_position_heartbeat [after 200 \
    [list ::tkdnd::xdnd::_SendXdndPosition $rootx $rooty $action]]
  if {$_dodragdrop_waiting_status} {return}
  # puts "XdndPosition: $_dodragdrop_drop_target $rootx $rooty $action"
  _send_XdndPosition $_dodragdrop_drag_source $_dodragdrop_drop_target \
                     $_dodragdrop_drop_target_proxy $rootx $rooty $action
  set _dodragdrop_waiting_status 1
};# xdnd::_SendXdndPosition

# ----------------------------------------------------------------------------
#  Command xdnd::_HandleXdndStatus
# ----------------------------------------------------------------------------
proc xdnd::_HandleXdndStatus {event} {
  variable _dodragdrop_drop_target
  variable _dodragdrop_waiting_status

  variable _dodragdrop_drop_target_accepts_drop
  variable _dodragdrop_drop_target_accepts_action
  set _dodragdrop_waiting_status 0
  foreach key {target accept want_position action x y w h} {
    set $key [dict get $event $key]
  }
  set _dodragdrop_drop_target_accepts_drop   $accept
  set _dodragdrop_drop_target_accepts_action $action
  if {$_dodragdrop_drop_target < 1} return
  variable _dodragdrop_drop_occured
  if {$_dodragdrop_drop_occured} return
  _update_cursor
  # puts "XdndStatus: $event"
};# xdnd::_HandleXdndStatus

# ----------------------------------------------------------------------------
#  Command xdnd::_HandleXdndFinished
# ----------------------------------------------------------------------------
proc xdnd::_HandleXdndFinished {event} {
  variable _dodragdrop_xdnd_finished_event_after_id
  catch {after cancel $_dodragdrop_xdnd_finished_event_after_id}
  set _dodragdrop_xdnd_finished_event_after_id {}
  variable _dodragdrop_drop_target
  set _dodragdrop_drop_target 0
  variable _dragging
  if {$_dragging} {set _dragging 0}

  variable _dodragdrop_drop_target_accepts_drop
  variable _dodragdrop_drop_target_accepts_action
  if {[dict size $event]} {
    foreach key {target accept action} {
      set $key [dict get $event $key]
    }
    set _dodragdrop_drop_target_accepts_drop   $accept
    set _dodragdrop_drop_target_accepts_action $action
  } else {
    set _dodragdrop_drop_target_accepts_drop 0
  }
  if {!$_dodragdrop_drop_target_accepts_drop} {
    set _dodragdrop_drop_target_accepts_action refuse_drop
  }
  # puts "XdndFinished: $event"
};# xdnd::_HandleXdndFinished

# ----------------------------------------------------------------------------
#  Command xdnd::_SendXdndLeave
# ----------------------------------------------------------------------------
proc xdnd::_SendXdndLeave {} {
  variable _dodragdrop_drag_source
  variable _dodragdrop_drop_target
  if {$_dodragdrop_drop_target < 1} return
  variable _dodragdrop_drop_target_proxy
  # puts "XdndLeave: $_dodragdrop_drop_target"
  _send_XdndLeave $_dodragdrop_drag_source $_dodragdrop_drop_target \
                  $_dodragdrop_drop_target_proxy
  set _dodragdrop_drop_target 0
  variable _dodragdrop_drop_target_accepts_drop
  variable _dodragdrop_drop_target_accepts_action
  set _dodragdrop_drop_target_accepts_drop   0
  set _dodragdrop_drop_target_accepts_action refuse_drop
  variable _dodragdrop_drop_occured
  if {$_dodragdrop_drop_occured} return
  _update_cursor
};# xdnd::_SendXdndLeave

# ----------------------------------------------------------------------------
#  Command xdnd::_SendXdndDrop
# ----------------------------------------------------------------------------
proc xdnd::_SendXdndDrop {} {
  variable _dodragdrop_drag_source
  variable _dodragdrop_drop_target
  if {$_dodragdrop_drop_target < 1} {
    ## The mouse has been released over a widget that does not accept drops.
    _HandleXdndFinished {}
    return
  }
  variable _dodragdrop_drop_occured
  if {$_dodragdrop_drop_occured} {return}
  variable _dodragdrop_drop_target_proxy
  variable _dodragdrop_drop_target_accepts_drop
  variable _dodragdrop_drop_target_accepts_action

  set _dodragdrop_drop_occured 1
  _update_cursor clock

  if {!$_dodragdrop_drop_target_accepts_drop} {
    _SendXdndLeave
    _HandleXdndFinished {}
    return
  }
  # puts "XdndDrop: $_dodragdrop_drop_target"
  variable _dodragdrop_drop_timestamp
  set _dodragdrop_drop_timestamp [_send_XdndDrop \
                 $_dodragdrop_drag_source $_dodragdrop_drop_target \
                 $_dodragdrop_drop_target_proxy]
  set _dodragdrop_drop_target 0
  # puts "XdndDrop: $_dodragdrop_drop_target"
  ## Arrange a timeout for receiving XdndFinished...
  variable _dodragdrop_xdnd_finished_event_after_id
  set _dodragdrop_xdnd_finished_event_after_id \
    [after 10000 [list ::tkdnd::xdnd::_HandleXdndFinished {}]]
};# xdnd::_SendXdndDrop

# ----------------------------------------------------------------------------
#  Command xdnd::_update_cursor
# ----------------------------------------------------------------------------
proc xdnd::_update_cursor { {cursor {}}} {
  # puts "_update_cursor $cursor"
  variable _dodragdrop_current_cursor
  variable _dodragdrop_drag_source
  variable _dodragdrop_drop_target_accepts_drop
  variable _dodragdrop_drop_target_accepts_action

  if {![string length $cursor]} {
    set cursor refuse_drop
    if {$_dodragdrop_drop_target_accepts_drop} {
      set cursor $_dodragdrop_drop_target_accepts_action
    }
  }
  if {![string equal $cursor $_dodragdrop_current_cursor]} {
    _set_pointer_cursor $_dodragdrop_drag_source $cursor
    set _dodragdrop_current_cursor $cursor
  }
};# xdnd::_update_cursor

# ----------------------------------------------------------------------------
#  Command xdnd::_default_action
# ----------------------------------------------------------------------------
proc xdnd::_default_action {event} {
  variable _dodragdrop_actions
  variable _dodragdrop_actions_len
  if {$_dodragdrop_actions_len == 1} {return [lindex $_dodragdrop_actions 0]}

  set alt     [dict get $event Alt]
  set shift   [dict get $event Shift]
  set control [dict get $event Control]

  if {$shift && $control && [lsearch $_dodragdrop_actions link] != -1} {
    return link
  } elseif {$control && [lsearch $_dodragdrop_actions copy] != -1} {
    return copy
  } elseif {$shift && [lsearch $_dodragdrop_actions move] != -1} {
    return move
  } elseif {$alt && [lsearch $_dodragdrop_actions link] != -1} {
    return link
  }
  return default
};# xdnd::_default_action

# ----------------------------------------------------------------------------
#  Command xdnd::getFormatForType
# ----------------------------------------------------------------------------
proc xdnd::getFormatForType {type} {
  switch -glob [string tolower $type] {
    text/plain\;charset=utf-8 -
    text/html\;charset=utf-8  -
    utf8_string               {set format UTF8_STRING}
    text/html                 -
    text/plain                -
    string                    -
    text                      -
    compound_text             {set format STRING}
    text/uri-list*            {set format UTF8_STRING}
    application/x-color       {set format $type}
    default                   {set format $type}
  }
  return $format
};# xdnd::getFormatForType

# ----------------------------------------------------------------------------
#  Command xdnd::registerSelectionHandler
# ----------------------------------------------------------------------------
proc xdnd::registerSelectionHandler {source types} {
  foreach type $types {
    selection handle -selection XdndSelection \
                     -type $type \
                     -format [getFormatForType $type] \
                     $source [list ::tkdnd::xdnd::_SendData $type]
  }
};# xdnd::registerSelectionHandler

# ----------------------------------------------------------------------------
#  Command xdnd::unregisterSelectionHandler
# ----------------------------------------------------------------------------
proc xdnd::unregisterSelectionHandler {source types} {
  foreach type $types {
    catch {
      selection handle -selection XdndSelection \
                       -type $type \
                       -format [getFormatForType $type] \
                       $source {}
    }
  }
};# xdnd::unregisterSelectionHandler

# ----------------------------------------------------------------------------
#  Command xdnd::_convert_to_unsigned
# ----------------------------------------------------------------------------
proc xdnd::_convert_to_unsigned {data format} {
  switch $format {
    8  { set mask 0xff }
    16 { set mask 0xffff }
    32 { set mask 0xffffff }
    default {error "unsupported format $format"}
  }
  ## Convert signed integer into unsigned...
  set d [list]
  foreach num $data {
    lappend d [expr { $num & $mask }]
  }
  return $d
};# xdnd::_convert_to_unsigned

# ----------------------------------------------------------------------------
#  Command xdnd::_SendData
# ----------------------------------------------------------------------------
proc xdnd::_SendData {type offset bytes args} {
  variable _dodragdrop_drag_source
  variable _dodragdrop_types
  variable _dodragdrop_data
  variable _dodragdrop_transfer_data

  ## The variable _dodragdrop_data contains a list of data, one for each
  ## type in the _dodragdrop_types variable. We have to search types, and find
  ## the corresponding entry in the _dodragdrop_data list.
  set index [lsearch $_dodragdrop_types $type]
  if {$index < 0} {
    error "unable to locate data suitable for type \"$type\""
  }
  set typed_data [lindex $_dodragdrop_data $index]
  set format 8
  if {$offset == 0} {
    ## Prepare the data to be transfered...
    switch -glob $type {
      text/plain* - UTF8_STRING - STRING - TEXT - COMPOUND_TEXT {
        binary scan [encoding convertto utf-8 $typed_data] \
                    c* _dodragdrop_transfer_data
        set _dodragdrop_transfer_data \
           [_convert_to_unsigned $_dodragdrop_transfer_data $format]
      }
      text/uri-list* {
        set files [list]
        foreach file $typed_data {
          switch -glob $file {
            *://*     {lappend files $file}
            default   {lappend files file://$file}
          }
        }
        binary scan [encoding convertto utf-8 "[join $files \r\n]\r\n"] \
                    c* _dodragdrop_transfer_data
        set _dodragdrop_transfer_data \
           [_convert_to_unsigned $_dodragdrop_transfer_data $format]
      }
      application/x-color {
        set format 16
        ## Try to understand the provided data: we accept a standard Tk colour,
        ## or a list of 3 values (red green blue) or a list of 4 values
        ## (red green blue opacity).
        switch [llength $typed_data] {
          1 { set color [winfo rgb $_dodragdrop_drag_source $typed_data]
              lappend color 65535 }
          3 { set color $typed_data; lappend color 65535 }
          4 { set color $typed_data }
          default {error "unknown color data: \"$typed_data\""}
        }
        ## Convert the 4 elements into 16 bit values...
        set _dodragdrop_transfer_data [list]
        foreach c $color {
          lappend _dodragdrop_transfer_data [format 0x%04X $c]
        }
      }
      default {
        set format 32
        binary scan $typed_data c* _dodragdrop_transfer_data
      }
    }
  }

  ##
  ## Data has been split into bytes. Count the bytes requested, and return them
  ##
  set data [lrange $_dodragdrop_transfer_data $offset [expr {$offset+$bytes-1}]]
  switch $format {
    8  {
      set data [encoding convertfrom utf-8 [binary format c* $data]]
    }
    16 {
      variable _dodragdrop_selection_requestor
      if {$_dodragdrop_selection_requestor} {
        ## Tk selection cannot process this format (only 8 & 32 supported).
        ## Call our XChangeProperty...
        set numItems [llength $data]
        variable _dodragdrop_selection_property
        variable _dodragdrop_selection_selection
        variable _dodragdrop_selection_target
        variable _dodragdrop_selection_time
        XChangeProperty $_dodragdrop_drag_source \
                        $_dodragdrop_selection_requestor \
                        $_dodragdrop_selection_property \
                        $_dodragdrop_selection_target \
                        $format \
                        $_dodragdrop_selection_time \
                        $data $numItems
        return -code break
      }
    }
    32 {
    }
    default {
      error "unsupported format $format"
    }
  }
  # puts "SendData: $type $offset $bytes $args ($typed_data)"
  # puts "          $data"
  return $data
};# xdnd::_SendData
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<












































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted maclibs/tkdnd2.7/tkdnd_windows.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#
# tkdnd_windows.tcl --
#
#    This file implements some utility procedures that are used by the TkDND
#    package.
#
# This software is copyrighted by:
# George Petasis, National Centre for Scientific Research "Demokritos",
# Aghia Paraskevi, Athens, Greece.
# e-mail: petasis@iit.demokritos.gr
#
# The following terms apply to all files associated
# with the software unless explicitly disclaimed in individual files.
#
# The authors hereby grant permission to use, copy, modify, distribute,
# and license this software and its documentation for any purpose, provided
# that existing copyright notices are retained in all copies and that this
# notice is included verbatim in any distributions. No written agreement,
# license, or royalty fee is required for any of the authorized uses.
# Modifications to this software may be copyrighted by their authors
# and need not follow the licensing terms described here, provided that
# the new terms are clearly indicated on the first page of each file where
# they apply.
#
# 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.
#

namespace eval olednd {

  proc initialise { } {
    ## Mapping from platform types to TkDND types...
    ::tkdnd::generic::initialise_platform_to_tkdnd_types [list \
       CF_UNICODETEXT          DND_Text  \
       CF_TEXT                 DND_Text  \
       CF_HDROP                DND_Files \
       FileGroupDescriptor     DND_Files \
       FileGroupDescriptorW    DND_Files \
       CF_HTML                 DND_HTML  \
       {HTML Format}           DND_HTML  \
       CF_RTF                  DND_RTF   \
       CF_RTFTEXT              DND_RTF   \
       {Rich Text Format}      DND_RTF   \
    ]

    ## Mapping from TkDND types to platform types...
    ::tkdnd::generic::initialise_tkdnd_to_platform_types [list \
       DND_Text  {CF_UNICODETEXT CF_TEXT}               \
       DND_Files {CF_HDROP}                             \
       DND_HTML  {CF_HTML {HTML Format}}                \
       DND_RTF   {CF_RTF CF_RTFTEXT {Rich Text Format}} \
    ]
  };# initialise

};# namespace olednd

# ----------------------------------------------------------------------------
#  Command olednd::HandleDragEnter
# ----------------------------------------------------------------------------
proc olednd::HandleDragEnter { drop_target typelist actionlist pressedkeys
                               rootX rootY codelist } {
  focus $drop_target
  ::tkdnd::generic::HandleEnter $drop_target 0 $typelist \
                                $codelist $actionlist $pressedkeys
  set action [::tkdnd::generic::HandlePosition $drop_target {} \
                                               $pressedkeys $rootX $rootY]
  if {$::tkdnd::_auto_update} {update}
  return $action
};# olednd::HandleDragEnter

# ----------------------------------------------------------------------------
#  Command olednd::HandleDragOver
# ----------------------------------------------------------------------------
proc olednd::HandleDragOver { drop_target pressedkeys rootX rootY } {
  set action [::tkdnd::generic::HandlePosition $drop_target {} \
                                               $pressedkeys $rootX $rootY]
  if {$::tkdnd::_auto_update} {update}
  return $action
};# olednd::HandleDragOver

# ----------------------------------------------------------------------------
#  Command olednd::HandleDragLeave
# ----------------------------------------------------------------------------
proc olednd::HandleDragLeave { drop_target } {
  ::tkdnd::generic::HandleLeave
  if {$::tkdnd::_auto_update} {update}
};# olednd::HandleDragLeave

# ----------------------------------------------------------------------------
#  Command olednd::HandleXdndDrop
# ----------------------------------------------------------------------------
proc olednd::HandleDrop { drop_target pressedkeys rootX rootY type data } {
  ::tkdnd::generic::SetDroppedData [normalise_data $type $data]
  set action [::tkdnd::generic::HandleDrop $drop_target {} \
                                           $pressedkeys $rootX $rootY 0]
  if {$::tkdnd::_auto_update} {update}
  return $action
};# olednd::HandleXdndDrop

# ----------------------------------------------------------------------------
#  Command olednd::GetDragSourceCommonTypes
# ----------------------------------------------------------------------------
proc olednd::GetDragSourceCommonTypes { drop_target } {
  ::tkdnd::generic::GetDragSourceCommonTypes
};# olednd::GetDragSourceCommonTypes

# ----------------------------------------------------------------------------
#  Command olednd::platform_specific_types
# ----------------------------------------------------------------------------
proc olednd::platform_specific_types { types } {
  ::tkdnd::generic::platform_specific_types $types
}; # olednd::platform_specific_types

# ----------------------------------------------------------------------------
#  Command olednd::platform_specific_type
# ----------------------------------------------------------------------------
proc olednd::platform_specific_type { type } {
  ::tkdnd::generic::platform_specific_type $type
}; # olednd::platform_specific_type

# ----------------------------------------------------------------------------
#  Command tkdnd::platform_independent_types
# ----------------------------------------------------------------------------
proc ::tkdnd::platform_independent_types { types } {
  ::tkdnd::generic::platform_independent_types $types
}; # tkdnd::platform_independent_types

# ----------------------------------------------------------------------------
#  Command olednd::platform_independent_type
# ----------------------------------------------------------------------------
proc olednd::platform_independent_type { type } {
  ::tkdnd::generic::platform_independent_type $type
}; # olednd::platform_independent_type

# ----------------------------------------------------------------------------
#  Command olednd::normalise_data
# ----------------------------------------------------------------------------
proc olednd::normalise_data { type data } {
  switch [lindex [::tkdnd::generic::platform_independent_type $type] 0] {
    DND_Text   {return $data}
    DND_Files  {return $data}
    DND_HTML   {return [encoding convertfrom utf-8 $data]}
    default    {return $data}
  }
}; # olednd::normalise_data
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






















































































































































































































































































































Deleted maclibs/tls1.6.7/libtls1.6.7.dylib.

cannot compute difference between binary files

Deleted maclibs/tls1.6.7/pkgIndex.tcl.

1
package ifneeded tls 1.6.7     "[list source [file join $dir tls.tcl]] ;      [list tls::initlib $dir libtls1.6.7.dylib]"
<


Deleted maclibs/tls1.6.7/tls.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
#
# Copyright (C) 1997-2000 Matt Newman <matt@novadigm.com> 
#
# $Header: /cvsroot/tls/tls/tls.tcl,v 1.14 2015/07/07 17:16:03 andreas_kupries Exp $
#
namespace eval tls {
    variable logcmd tclLog
    variable debug 0
 
    # Default flags passed to tls::import
    variable defaults {}

    # Maps UID to Server Socket
    variable srvmap
    variable srvuid 0

    # Over-ride this if you are using a different socket command
    variable socketCmd
    if {![info exists socketCmd]} {
        set socketCmd [info command ::socket]
    }
}

proc tls::initlib {dir dll} {
    # Package index cd's into the package directory for loading.
    # Irrelevant to unixoids, but for Windows this enables the OS to find
    # the dependent DLL's in the CWD, where they may be.
    set cwd [pwd]
    catch {cd $dir}
    if {[string equal $::tcl_platform(platform) "windows"] &&
	![string equal [lindex [file system $dir] 0] "native"]} {
	# If it is a wrapped executable running on windows, the openssl
	# dlls must be copied out of the virtual filesystem to the disk
	# where Windows will find them when resolving the dependency in
	# the tls dll. We choose to make them siblings of the executable.
	package require starkit
	set dst [file nativename [file dirname $starkit::topdir]]
	foreach sdll [glob -nocomplain -directory $dir -tails *eay32.dll] {
	    catch {file delete -force            $dst/$sdll}
	    catch {file copy   -force $dir/$sdll $dst/$sdll}
	}
    }
    set res [catch {uplevel #0 [list load [file join [pwd] $dll]]} err]
    catch {cd $cwd}
    if {$res} {
	namespace eval [namespace parent] {namespace delete tls}
	return -code $res $err
    }
    rename tls::initlib {}
}

#
# Backwards compatibility, also used to set the default
# context options
#
proc tls::init {args} {
    variable defaults

    set defaults $args
}
#
# Helper function - behaves exactly as the native socket command.
#
proc tls::socket {args} {
    variable socketCmd
    variable defaults
    set idx [lsearch $args -server]
    if {$idx != -1} {
	set server 1
	set callback [lindex $args [expr {$idx+1}]]
	set args [lreplace $args $idx [expr {$idx+1}]]

	set usage "wrong # args: should be \"tls::socket -server command ?options? port\""
	set options "-cadir, -cafile, -certfile, -cipher, -command, -dhparams, -keyfile, -myaddr, -password, -request, -require, -servername, -ssl2, -ssl3, -tls1, -tls1.1 or -tls1.2"
    } else {
	set server 0

	set usage "wrong # args: should be \"tls::socket ?options? host port\""
	set options "-async, -cadir, -cafile, -certfile, -cipher, -command, -dhparams, -keyfile, -myaddr, -myport, -password, -request, -require, -servername, -ssl2, -ssl3, -tls1, -tls1.1 or -tls1.2"
    }
    set argc [llength $args]
    set sopts {}
    set iopts [concat [list -server $server] $defaults]	;# Import options

    for {set idx 0} {$idx < $argc} {incr idx} {
	set arg [lindex $args $idx]
	switch -glob -- $server,$arg {
	    0,-async	{lappend sopts $arg}
	    0,-myport	-
	    *,-type	-
	    *,-myaddr	{lappend sopts $arg [lindex $args [incr idx]]}
	    *,-cadir	-
	    *,-cafile	-
	    *,-certfile	-
	    *,-cipher	-
	    *,-command	-
	    *,-dhparams -
	    *,-keyfile	-
	    *,-password	-
	    *,-request	-
	    *,-require	-
            *,-servername -
	    *,-ssl2	-
	    *,-ssl3	-
	    *,-tls1	-
	    *,-tls1.1	-
	    *,-tls1.2	{lappend iopts $arg [lindex $args [incr idx]]}
	    -*		{return -code error "bad option \"$arg\": must be one of $options"}
	    default	{break}
	}
    }
    if {$server} {
	if {($idx + 1) != $argc} {
	    return -code error $usage
	}
	set uid [incr ::tls::srvuid]

	set port [lindex $args [expr {$argc-1}]]
	lappend sopts $port
	#set sopts [linsert $sopts 0 -server $callback]
	set sopts [linsert $sopts 0 -server [list tls::_accept $iopts $callback]]
	#set sopts [linsert $sopts 0 -server [list tls::_accept $uid $callback]]
    } else {
	if {($idx + 2) != $argc} {
	    return -code error $usage
	}
	set host [lindex $args [expr {$argc-2}]]
	set port [lindex $args [expr {$argc-1}]]
	lappend sopts $host $port
    }
    #
    # Create TCP/IP socket
    #
    set chan [eval $socketCmd $sopts]
    if {!$server && [catch {
	#
	# Push SSL layer onto socket
	#
	eval [list tls::import] $chan $iopts
    } err]} {
	set info ${::errorInfo}
	catch {close $chan}
	return -code error -errorinfo $info $err
    }
    return $chan
}

# tls::_accept --
#
#   This is the actual accept that TLS sockets use, which then calls
#   the callback registered by tls::socket.
#
# Arguments:
#   iopts	tls::import opts
#   callback	server callback to invoke
#   chan	socket channel to accept/deny
#   ipaddr	calling IP address
#   port	calling port
#
# Results:
#   Returns an error if the callback throws one.
#
proc tls::_accept { iopts callback chan ipaddr port } {
    log 2 [list tls::_accept $iopts $callback $chan $ipaddr $port]

    set chan [eval [list tls::import $chan] $iopts]

    lappend callback $chan $ipaddr $port
    if {[catch {
	uplevel #0 $callback
    } err]} {
	log 1 "tls::_accept error: ${::errorInfo}"
	close $chan
	error $err $::errorInfo $::errorCode
    } else {
	log 2 "tls::_accept - called \"$callback\" succeeded"
    }
}
#
# Sample callback for hooking: -
#
# error
# verify
# info
#
proc tls::callback {option args} {
    variable debug

    #log 2 [concat $option $args]

    switch -- $option {
	"error"	{
	    foreach {chan msg} $args break

	    log 0 "TLS/$chan: error: $msg"
	}
	"verify"	{
	    # poor man's lassign
	    foreach {chan depth cert rc err} $args break

	    array set c $cert

	    if {$rc != "1"} {
		log 1 "TLS/$chan: verify/$depth: Bad Cert: $err (rc = $rc)"
	    } else {
		log 2 "TLS/$chan: verify/$depth: $c(subject)"
	    }
	    if {$debug > 0} {
		return 1;	# FORCE OK
	    } else {
		return $rc
	    }
	}
	"info"	{
	    # poor man's lassign
	    foreach {chan major minor state msg} $args break

	    if {$msg != ""} {
		append state ": $msg"
	    }
	    # For tracing
	    upvar #0 tls::$chan cb
	    set cb($major) $minor

	    log 2 "TLS/$chan: $major/$minor: $state"
	}
	default	{
	    return -code error "bad option \"$option\":\
		    must be one of error, info, or verify"
	}
    }
}

proc tls::xhandshake {chan} {
    upvar #0 tls::$chan cb

    if {[info exists cb(handshake)] && \
	$cb(handshake) == "done"} {
	return 1
    }
    while {1} {
	vwait tls::${chan}(handshake)
	if {![info exists cb(handshake)]} {
	    return 0
	}
	if {$cb(handshake) == "done"} {
	    return 1
	}
    }
}

proc tls::password {} {
    log 0 "TLS/Password: did you forget to set your passwd!"
    # Return the worlds best kept secret password.
    return "secret"
}

proc tls::log {level msg} {
    variable debug
    variable logcmd

    if {$level > $debug || $logcmd == ""} {
	return
    }
    set cmd $logcmd
    lappend cmd $msg
    uplevel #0 $cmd
}

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


























































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/ArrowButton.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
<HTML>
<HEAD><TITLE>ArrowButton</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>ArrowButton</B>
 - Button widget with an arrow shape.
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>ArrowButton</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I>STANDARD OPTIONS</I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-activebackground">-activebackground</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-activeforeground">-activeforeground</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-background">-background or -bg</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-borderwidth">-borderwidth or -bd</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-disabledforeground">-disabledforeground</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-foreground">-foreground or -fg</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-highlightbackground">-highlightbackground</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-highlightcolor">-highlightcolor</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-highlightthickness">-highlightthickness</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-relief">-relief</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-repeatdelay">-repeatdelay</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-repeatinterval">-repeatinterval</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-takefocus">-takefocus</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-troughcolor">-troughcolor</A></TR>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-armcommand">-armcommand</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-arrowbd">-arrowbd</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-arrowrelief">-arrowrelief</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-clean">-clean</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-command">-command</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-dir">-dir</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-disarmcommand">-disarmcommand</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-height">-height</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-helptext">-helptext</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-helptype">-helptype</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-helpvar">-helpvar</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-ipadx">-ipadx</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-ipady">-ipady</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-state">-state</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-type">-type</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-width">-width</A></TR>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
<DD><I>pathName</I> <A HREF="#invoke"><B>invoke</B></A>
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

ArrowButton can be of two types following <B>type</B> option:
for <B>button</B> type, it is standard button with an arrow drawn on it;
for <B>arrow</B> type, it is an arrow like scrollbar's arrow.
</P>
<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-armcommand"><B>-armcommand</B></A></DT>
<DD>

Specifies a Tcl command to associate with the ArrowButton when mouse button 1 is pressed
over the ArrowButton. When <B>repeatdelay</B> or <B>repeatinterval</B> option is positive
integer, this command is repeatedly called if mouse pointer is over the button and until
mouse button 1 is released.
</DD>
</DL>
<DL><DT><A NAME="-arrowbd"><B>-arrowbd</B></A></DT>
<DD>

When ArrowButton <B>type</B> is <I>arrow</I>, specifies the border width of the
arrow. Must be 1 or 2.

</DD>
</DL>
<DL><DT><A NAME="-arrowrelief"><B>-arrowrelief</B></A></DT>
<DD>

When ArrowButton <B>type</B> is <I>arrow</I>, specifies the relief of the arrow.
Must be <B>raised</B> or <B>sunken</B>.

</DD>
</DL>
<DL><DT><A NAME="-clean"><B>-clean</B></A></DT>
<DD>

Specifies a level of quality, between 0 and 2, for the arrow.
If 0, the arrow is drawn with its maximum width and height.
If 1, the base of arrow is arranged to be odd to have same edges.
If 2, the base of arrow is arranged to be odd and the orthogonal to be (base+1)/2 to
have 'straight' diagonal for edges.
</DD>
</DL>
<DL><DT><A NAME="-command"><B>-command</B></A></DT>
<DD>

Specifies a Tcl command to associate with the ArrowButton.  This command
is typically invoked when mouse button 1 is released over the ArrowButton
window.
</DD>
</DL>
<DL><DT><A NAME="-dir"><B>-dir</B></A></DT>
<DD>

Specifies the direction of the arrow: <B>top</B>, <B>bottom</B>, <B>left</B>
or <B>right</B>.
</DD>
</DL>
<DL><DT><A NAME="-disarmcommand"><B>-disarmcommand</B></A></DT>
<DD>

Specifies a Tcl command to associate with the ArrowButton when mouse button 1 is released.
This command is called even if pointer is not over the ArrowButton, and always before
the command specified by <B>command</B> option.
It is typically used in conjuntion with <B>armcommand</B>, <B>repeatdelay</B> and
<B>repeatinterval</B>.
</DD>
</DL>
<DL><DT><A NAME="-height"><B>-height</B></A></DT>
<DD>

Specifies a desired height for the ArrowButton. The value is in screen units.
</DD>
</DL>
<DL><DT><A NAME="-helptext"><B>-helptext</B></A></DT>
<DD>

Text for dynamic help. If empty, no help is available for this widget.
See also <A HREF="DynamicHelp.html">DynamicHelp</A>.
</DD>
</DL>
<DL><DT><A NAME="-helptype"><B>-helptype</B></A></DT>
<DD>
Type of dynamic help. Use <I>balloon</I> or <I>variable</I>.
See also <A HREF="DynamicHelp.html">DynamicHelp</A>.
</DD>
</DL>
<DL><DT><A NAME="-helpvar"><B>-helpvar</B></A></DT>
<DD>
Variable to use when <B>helptype</B> option is <I>variable</I>.
See also <A HREF="DynamicHelp.html">DynamicHelp</A>.
</DD>
</DL>
<DL><DT><A NAME="-ipadx"><B>-ipadx</B></A></DT>
<DD>

Specifies a minimun pad between the ArrowButton border and the right and left side
of the arrow. The value is in screen units.
</DD>
</DL>
<DL><DT><A NAME="-ipady"><B>-ipady</B></A></DT>
<DD>

Specifies a minimun pad between the ArrowButton border and the top and bottom side
of the arrow. The value is in screen units.
</DD>
</DL>
<DL><DT><A NAME="-state"><B>-state</B></A></DT>
<DD>

Specifies one of three states for the ArrowButton: <B>normal</B>, <B>active</B>,
or <B>disabled</B>.
<DL><DT>If ArrowButton <B>type</B> is <I>button</I>:</DT>
<DD>In normal state the ArrowButton is displayed using the
<B>foreground</B> and <B>background</B> options. The active state is
typically used when the pointer is over the ArrowButton. In active state
the ArrowButton is displayed using the <B>activeforeground</B> and
<B>activebackground</B> options. In disabled state the <B>disabledforeground</B> and
<B>background</B> options determine how the ArrowButton is displayed.
</DD>
<DT>If ArrowButton <B>type</B> is <I>arrow</I>:</DT>
<DD>Only colors of arrow change. The background of ArrowButton is always
displayed using <B>troughcolor</B> option.
In normal state the ArrowButton is displayed using the <B>background</B> option. The active
state is typically used when the pointer is over the ArrowButton. In active state
the ArrowButton is displayed using the <B>activebackground</B> option. In disabled state
the ArrowButton is displayed with a dark stipple.
</DD>
</DL>
Disabled state means that the ArrowButton
should be insensitive: the default bindings will refuse to activate
the widget and will ignore mouse button presses.
</DD>
</DL>
<DL><DT><A NAME="-type"><B>-type</B></A></DT>
<DD>

Determines the type of the ArrowButton: <B>button</B> for standard button look, or
<B>arrow</B> scrollbar's arrow look.
</DD>
</DL>
<DL><DT><A NAME="-width"><B>-width</B></A></DT>
<DD>

Specifies a desired width for the ArrowButton. The value is in screen units.
</DD>
</DL>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>

Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD></DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no <I>option</I> is specified,
returns a list describing all of the available options for <I>pathName</I>.
If <I>option</I> is specified with no <I>value</I>, then the command returns a list
describing the one named <I>option</I> (this list will be identical to the corresponding
sublist of the value returned if no <I>option</I> is specified). If one or
more <I>option-value</I> pairs are specified, then the command modifies the given widget
option(s) to have the given value(s); in this case the command returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.

</DD></DL>
<DL><DT><A NAME="invoke"><I>pathName</I> <B>invoke</B></A>
</DT><DD>

If ArrowButton <B>state</B> is not disabled, this invoke the commands of the button.
ArrowButton is redisplayed with active color and sunken relief, and
<B>armcommand</B> is called. Then ArrowButton is redisplayed with
normal color and its defined relief, and <B>disarmcommand</B> then <B>command</B>
are called.
<P><B>invoke</B> is called when ArrowButton has input focus and user press the space bar.
</DD></DL>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<








































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/BWidget.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
<HTML>
<HEAD><TITLE>BWidget</TITLE></HEAD>
<BODY BGCOLOR=white>
<IMG SRC="constr.gif" WIDTH="40" HEIGHT="40"> Under construction ...<BR>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>BWidget</B>
 - Description text
</DD></DL>
<DL>
<DT><I><A HREF="#wc">COMMAND</A></I></DT>
<DD>BWidget::<A HREF="#XLFDfont"><B>XLFDfont</B></A>
 <I>cmd</I>
 ?<I>arg...</I>?
</DD>
<DD>BWidget::<A HREF="#assert"><B>assert</B></A>
 <I>exp</I>
 ?<I>msg</I>?
</DD>
<DD>BWidget::<A HREF="#badOptionString"><B>badOptionString</B></A>
 <I>type</I>
 <I>value</I>
 <I>list</I>
</DD>
<DD>BWidget::<A HREF="#bindMouseWheel"><B>bindMouseWheel</B></A>
 <I>widget</I>
</DD>
<DD>BWidget::<A HREF="#classes"><B>classes</B></A>
 <I>class</I>
</DD>
<DD>BWidget::<A HREF="#clonename"><B>clonename</B></A>
 <I>menu</I>
</DD>
<DD>BWidget::<A HREF="#focus"><B>focus</B></A>
 <I>option</I>
 <I>path</I>
</DD>
<DD>BWidget::<A HREF="#get3dcolor"><B>get3dcolor</B></A>
 <I>path</I>
 <I>bgcolor</I>
</DD>
<DD>BWidget::<A HREF="#getname"><B>getname</B></A>
 <I>name</I>
</DD>
<DD>BWidget::<A HREF="#grab"><B>grab</B></A>
 <I>option</I>
 <I>path</I>
</DD>
<DD>BWidget::<A HREF="#inuse"><B>inuse</B></A>
 <I>class</I>
</DD>
<DD>BWidget::<A HREF="#library"><B>library</B></A>
 <I>class</I> ?<i>class ...</i>?
</DD>
<DD>BWidget::<A HREF="#lreorder"><B>lreorder</B></A>
 <I>list</I>
 <I>neworder</I>
</DD>
<DD>BWidget::<A HREF="#parsetext"><B>parsetext</B></A>
 <I>text</I>
</DD>
<DD>BWidget::<A HREF="#place"><B>place</B></A>
 <I>path</I>
 <I>w</I>
 <I>h</I>
 ?<I>arg...</I>?
</DD>
<DD>BWidget::<A HREF="#write"><B>write</B></A>
 <I>filename</I> ?<i>mode</i>?
</DD>
<DD>BWidget::<A HREF="#wrongNumArgsString"><B>wrongNumArgsString</B></A>
 <I>string</I>
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>
Description text
</P>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">COMMAND</A></B><BR>
<DL><DT><A NAME="XLFDfont">BWidget::<B>XLFDfont</B></A>
 <I>cmd</I>
 ?<I>arg...</I>?
</DT><DD>
Description text
</DD></DL>
<DL><DT><A NAME="assert">BWidget::<B>assert</B></A>
 <I>exp</I>
 ?<I>msg</I>?
</DT><DD>
Description text
</DD></DL>
<DL><DT><A NAME="badOptionString">BWidget::<B>badOptionString</B></A>
 <I>type</I>
 <I>value</I>
 <I>list</I>
</DT><DD>
Return a proper error string for a <i>value</i> of <i>type</i> that doesn't
match <i>list</i>.
</DD></DL>

<DL><DT><A NAME="bindMouseWheel">BWidget::<B>bindMouseWheel</B></A>
 <I>widget</I>
</DT><DD>
    Bind the given <i>widget</i> with the standard mouse wheel bindings.
</DD></DL>

<DL><DT><A NAME="classes">BWidget::<B>classes</B></A>
 <I>class</I>
</DT><DD>
    Returns a list of classes needed by the given <i>class</i>.
</DD></DL>

<DL><DT><A NAME="clonename">BWidget::<B>clonename</B></A>
 <I>menu</I>
</DT><DD>
Description text
</DD></DL>
<DL><DT><A NAME="focus">BWidget::<B>focus</B></A>
 <I>option</I>
 <I>path</I>
</DT><DD>
Description text
</DD></DL>
<DL><DT><A NAME="get3dcolor">BWidget::<B>get3dcolor</B></A>
 <I>path</I>
 <I>bgcolor</I>
</DT><DD>
Description text
</DD></DL>
<DL><DT><A NAME="getname">BWidget::<B>getname</B></A>
 <I>name</I>
</DT><DD>
Description text
</DD></DL>
<DL><DT><A NAME="grab">BWidget::<B>grab</B></A>
 <I>option</I>
 <I>path</I>
</DT><DD>
Description text
</DD></DL>

<DL><DT><A NAME="inuse">BWidget::<B>inuse</B></A>
 <I>class</I>
</DT><DD>
    Returns true or false if the given <i>class</i> is being used by the
    current running program.
</DD></DL>

<DL><DT><A NAME="library">BWidget::<B>library</B></A>
 <I>class</I>
 ?<i>class ...</i>?
</DT><DD>
    Returns a string of code that contains all the libraries needed to
    use the widgets given by <i>class</i>.  Each class's code and the
    code of its dependent classes is appended to the string and returned.
    This is mostly useful for saving BWidgets to another project.
</DD></DL>

<DL><DT><A NAME="lreorder">BWidget::<B>lreorder</B></A>
 <I>list</I>
 <I>neworder</I>
</DT><DD>
Description text
</DD></DL>
<DL><DT><A NAME="parsetext">BWidget::<B>parsetext</B></A>
 <I>text</I>
</DT><DD>
Description text
</DD></DL>
<DL><DT><A NAME="place">BWidget::<B>place</B></A>
 <I>path</I>
 <I>w</I>
 <I>h</I>
 ?<I>arg...</I>?
</DT><DD>
Used to position and resize the widget specified by
<I>path</I>. <I>w</I> and <I>h</I> are used to specify the requested
width and height of the <I>path</I> widget for use by <B>wm
geometry</B> (set to 0 to use current values). The placement of the widget relative to other widgets or
the screen is controlled by additional arguments:
<DL>
 <DT><B>at</B> <I>x</I> <I>y</I></DT>
 <DD>Place the widget specified by the <I>path</I> argument at screen
 position x,y. See <B>wm geometry</B> for information about window
 placement values.</DD>

 <DT><B>center</B> <I>?widget?</I></DT>
 <DD>Place the <I>path</I> widget centered against <I>widget</I> or against the
 root widget if <I>widget</I> is not given.</DD>

 <DT><B>left</B> <I>?widget?</I></DT>
 <DT><B>right</B> <I>?widget?</I></DT>
 <DD>Place the <I>path</I> widget either left or right of the
 reference widget (or the root widget if <I>widget</I> is not
 specified). If the reference widget's position is such that the newly
 placed window might be obscured then the opposite side will be tried.</DD>

 <DT><B>above</B> <I>?widget?</I></DT>
 <DT><B>below</B> <I>?widget?</I></DT>
 <DD>As for left/right above, this option causes the widget to be
 placed either above or below the reference widget with the opposite
 placement being attempted if the newly placed widget will not be visible.
</DL>
</DL>

<DL><DT><A NAME="write">BWidget::<B>write</B></A>
 <I>filename</I>
 ?<i>mode</i>?
</DT><DD>
    Writes the currently used set of BWidget class code to the given
    <i>filename</i>.  All the code necessary to run the BWidgets
    currently in use is written to the file.  This is mostly useful
    for saving BWidget code to another project as a single file instead
    of the entire BWidget package.
</DD></DL>

<DL>
<DT><A NAME="wrongNumArgsString">BWidget::<B>wrongNumArgsString</B></A>
 <I>string</I>
</DT>
<DD>
    Returns a standard error string for the wrong number of arguments.
    <i>string</i> is appended to the standard string.
</DD>
</DL>

</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<








































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/Button.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
<HTML>
<HEAD><TITLE>Button</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>Button</B>
 - Button widget with enhanced options
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>Button</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I>STANDARD OPTIONS</I></DT>
<DT><I>Not themed</I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-activebackground">-activebackground</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-activeforeground">-activeforeground</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-anchor">-anchor</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-background">-background or -bg</A></TD>
</TD>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-bitmap">-bitmap</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-borderwidth">-borderwidth or -bd</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-cursor">-cursor</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-disabledforeground">-disabledforeground</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-font">-font</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-foreground">-foreground or -fg</A></TD>
</TD>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-highlightbackground">-highlightbackground</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-highlightcolor">-highlightcolor</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-highlightthickness">-highlightthickness</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-image">-image</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-justify">-justify</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-padx">-padx</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-pady">-pady</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-repeatdelay">-repeatdelay</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-repeatinterval">-repeatinterval</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-takefocus">-takefocus</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-text">-text</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-textvariable">-textvariable</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-wraplength">-wraplength</A></TD>
</TABLE></DD>
<DT><I>Themed</I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-compound">-compound</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-cursor">-cursor</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-image">-image</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-style">-style</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-repeatdelay">-repeatdelay</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-repeatinterval">-repeatinterval</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-takefocus">-takefocus</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-text">-text</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-textvariable">-textvariable</A></TD>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-armcommand">-armcommand</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-command">-command</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-default">-default</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-disarmcommand">-disarmcommand</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-height">-height</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-helptext">-helptext</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-helptype">-helptype</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-helpvar">-helpvar</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-name">-name</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-relief">-relief</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-state">-state</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-underline">-underline</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-width">-width</A></TD>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
<DD><I>pathName</I> <A HREF="#invoke"><B>invoke</B></A>
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

Button widget extends the Tk button with new options.
<A HREF="DynamicHelp.html">DynamicHelp</A> options,
a new relief style, callback for <B>arm</B>/<B>disarm</B>, and
<B>repeatdelay</B>/<B>repeatinterval</B> options has been added.
</P>
<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-armcommand"><B>-armcommand</B></A></DT>
<DD>

Specifies a Tcl command to associate with the Button when mouse button 1 is pressed over the
Button. When <B>repeatdelay</B> or <B>repeatinterval</B> option is positive integer,
this command is repeatedly called if mouse pointer is over the Button and until mouse
button 1 is released.
</DD>
</DL>
<DL><DT><A NAME="-command"><B>-command</B></A></DT>
<DD>

Specifies a Tcl command to associate with the Button.  This command
is typically invoked when mouse button 1 is released over the Button
window.
</DD>
</DL>
<DL><DT><A NAME="-default"><B>-default</B></A></DT>
<DD>

Specifies one of three states for the default ring: <B>normal</B>, <B>active</B>,
or <B>disabled</B>. In active state, the button is drawn with the platform specific
appearance for a default button. In normal state, the button is drawn with the platform
specific appearance for a non-default button, leaving enough space to draw the default
button appearance. The normal and active states will result in buttons of the same size.
In disabled state, the button is drawn with the non-default button appearance without
leaving space for the default appearance. The disabled state may result
in a smaller button than the active state.
</DD>
</DL>
<DL><DT><A NAME="-disarmcommand"><B>-disarmcommand</B></A></DT>
<DD>

Specifies a Tcl command to associate with the Button when mouse button 1 is released.
This command is called even if pointer is not over the Button, and always before
the command specified by <B>command</B> option.
It is typically used in conjuntion with <B>armcommand</B>, <B>repeatdelay</B> and
<B>repeatinterval</B>.
</DD>
</DL>
<DL><DT><A NAME="-height"><B>-height</B></A></DT>
<DD>

Specifies a desired height for the Button.
If an image or bitmap is being displayed in the Button then the value is in
screen units;
for text it is in lines of text.
If this option isn't specified, the Button's desired height is computed
from the size of the image or bitmap or text being displayed in it.<BR>
Option not available when widget is <I>themed</I>.
</DD>
</DL>
<DL><DT><A NAME="-helptext"><B>-helptext</B></A></DT>
<DD>

Text for dynamic help. If empty, no help is available for this widget.
See also <A HREF="DynamicHelp.html">DynamicHelp</A>.
</DD>
</DL>
<DL><DT><A NAME="-helptype"><B>-helptype</B></A></DT>
<DD>
Type of dynamic help. Use <I>balloon</I> or <I>variable</I>.
See also <A HREF="DynamicHelp.html">DynamicHelp</A>.
</DD>
</DL>
<DL><DT><A NAME="-helpvar"><B>-helpvar</B></A></DT>
<DD>
Variable to use when <B>helptype</B> option is <I>variable</I>.
See also <A HREF="DynamicHelp.html">DynamicHelp</A>.
</DD>
</DL>
<DL><DT><A NAME="-name"><B>-name</B></A></DT>
<DD>

Specifies a standard name for the button. If the option <B>*<I>name</I>Name</B> is
found in the resources database, then <B>text</B> and <B>underline</B> options
are extracted from its value.

</DD>
</DL>
<DL><DT><A NAME="-relief"><B>-relief</B></A></DT>
<DD>

Specifies the 3-D effect desired for the widget. Acceptable values are standard values for
button relief (<B>raised</B>, <B>sunken</B>, <B>flat</B>, <B>ridge</B>, <B>solid</B>, and <B>groove</B>) and <B>link</B>, which specifies that button relief is <B>flat</B> when pointer
is outside the button and <B>raised</B> when pointer is inside.<BR>
This option has only the following effect if the widget is <I>themed</I>:
The value <B>link</B> used a style <B>Toolbutton</B> while any other value uses the standard effect.
</DD>
</DL>
<DL><DT><A NAME="-state"><B>-state</B></A></DT>
<DD>

Specifies one of three states for the Button:  <B>normal</B>, <B>active</B>,
or <B>disabled</B>.  In normal state the Button is displayed using the
<B>foreground</B> and <B>background</B> options.  The active state is
typically used when the pointer is over the Button.  In active state
the Button is displayed using the <B>activeforeground</B> and
<B>activebackground</B> options.  Disabled state means that the Button
should be insensitive:  the default bindings will refuse to activate
the widget and will ignore mouse button presses.
In this state the <B>disabledforeground</B> and
<B>background</B> options determine how the Button is displayed.
</DD>
</DL>
<DL><DT><A NAME="-underline"><B>-underline</B></A></DT>
<DD>

Specifies the integer index of a character to underline in the label of the button.
0 corresponds to the first character of the text displayed, 1 to the next character,
and so on.
<BR>The binding <B>&lt;Alt-<I>char</I>&gt;</B> is automatically set on the toplevel
of the Button to call Button::<B>setfocus</B>.

</DD>
</DL>
<DL><DT><A NAME="-width"><B>-width</B></A></DT>
<DD>

If an image or bitmap is being displayed in the Button then the value is in
screen units;
for text it is in characters.
If this option isn't specified, the Button's desired width is computed
from the size of the image or bitmap or text being displayed in it.
</DD>
</DL>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>

Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD></DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no <I>option</I> is specified,
returns a list describing all of the available options for <I>pathName</I>.
If <I>option</I> is specified with no <I>value</I>, then the command returns a list
describing the one named <I>option</I> (this list will be identical to the corresponding
sublist of the value returned if no <I>option</I> is specified). If one or
more <I>option-value</I> pairs are specified, then the command modifies the given widget
option(s) to have the given value(s); in this case the command returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.

</DD></DL>
<DL><DT><A NAME="invoke"><I>pathName</I> <B>invoke</B></A>
</DT><DD>

If Button <B>state</B> is not disabled, this invoke the commands of the Button.
Button is redisplayed with active color and sunken relief, and
<B>armcommand</B> is called. Then Button is redisplayed with
normal color and its defined relief, and <B>disarmcommand</B> then <B>command</B>
are called.
<P><B>invoke</B> is called when Button has input focus and user press the space bar.

</DD></DL>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">BINDINGS</A></B><BR>
<DL><DT><A NAME="Invoke"><I>&lt;&lt;Invoke&gt;&gt;</I></A>
</DT><DD>

Invoke the <B>invoke</B> widget command.
</DD></DL>
<HR WIDTH="50%"><BR>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/ButtonBox.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
<HTML>
<HEAD><TITLE>ButtonBox</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>ButtonBox</B>
 - Set of buttons with horizontal or vertical layout
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>ButtonBox</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-background">-background or -bg</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-default">-default</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-homogeneous">-homogeneous</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-orient">-orient</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-padx">-padx</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-pady">-pady</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-spacing">-spacing</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-state">-state</A></TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#add"><B>add</B></A>
 ?<I>option value...</I>?
</DD>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
<DD><I>pathName</I> <A HREF="#delete"><B>delete</B></A>
 <I>index</I>
</DD>
<DD><I>pathName</I> <A HREF="#index"><B>index</B></A>
 <I>index</I>
</DD>
<DD><I>pathName</I> <A HREF="#insert"><B>insert</B></A>
  <i>index</i> ?<I>option value...</I>?
</DD>
<DD><I>pathName</I> <A HREF="#invoke"><B>invoke</B></A>
 <I>index</I>
</DD>
<DD><I>pathName</I> <A HREF="#itemcget"><B>itemcget</B></A>
 <I>index</I>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#itemconfigure"><B>itemconfigure</B></A>
 <I>index</I>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
<DD><I>pathName</I> <A HREF="#setfocus"><B>setfocus</B></A>
 <I>index</I>
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

ButtonBox layouts Button horizontally or vertically.
Some commands take an <I>index</I> as argument indicating on which
Button it work. This index may be specified in any of the following forms:
<P>
<DL COMPACT>
<DT>
<I>number</I>
<DD>
Specifies the Button numerically, where 0 corresponds
to the first added Button, 1 to the next, and so on.
<DT>
<B>end</B> or <B>last</B>
<DD>
Indicates the last item added.
<DT><B>default</B>
<DD>
Indicates the default Button.

<DT>
<i>name</i>
<DD>
Indicates the button whose <b>-name</b> option is <i>name</i>.

<DT>
<i>text</i>
<DD>
Indicates the button whose <b>-text</b> option is <i>text</i>.
</DL>

</P>
<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-background"><B>-background</B></A></DT>
<DD>

Specifies a default background color for all added buttons and for the frame.<BR>
For <I>themed</I> wigets, the button color is not set.

</DD>
</DL>
<DL><DT><A NAME="-default"><B>-default</B></A></DT>
<DD>

Specifies the default button of the button box. The value is an integer
referencing the n-th added button, starting from 0.
If this value is -1 (the default), all button wil be drawn with their -default
option set to disabled, and this value can not be changed. <BR>If this value is 
not -1, the associated button is drawn with -default option set to active and
the others are drawn with -default option set to normal. The value can be changed
by configure.

</DD>
</DL>
<DL><DT><A NAME="-homogeneous"><B>-homogeneous (read-only)</B></A></DT>
<DD>

Specifies wether or not buttons must have the same width for horizontal layout.

</DD>
</DL>
<DL><DT><A NAME="-orient"><B>-orient (read-only)</B></A></DT>
<DD>

Specifies the orientation of the button box. If this option is <B>horizontal</B>
(the default), buttons are added from top to bottom. 
If this option is <B>vertical</B>, buttons are added from left to right.

</DD>
</DL>
<DL><DT><A NAME="-padx"><B>-padx</B></A></DT>
<DD>

Specifies a default value for the -padx option of all added buttons.<BR>
Option has no effect for <I>themed</I> wigets.
</DD>
</DL>
<DL><DT><A NAME="-pady"><B>-pady</B></A></DT>
<DD>

Specifies a default value for the -pady option of all added buttons.<BR>
Option has no effect for <I>themed</I> wigets.

</DD>
</DL>
<DL><DT><A NAME="-spacing"><B>-spacing</B></A></DT>
<DD>

Specifies the default spacing between buttons. This value can be changed before each
call to <B>add</B>.

</DD>
</DL>

<DL><DT><A NAME="-state"><B>-state</B></A></DT>
<DD>

Specifies a state for all the buttons in the button box.  Can be any state supported by buttons.

</DD>
</DL>

<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="add"><I>pathName</I> <B>add</B></A>
 ?<I>option value...</I>?
</DT><DD>

Add a button to the button box.
<P>
See <A HREF="Button.html"><B>Button</B></A> for description of options.
</DD></DL>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>

Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD></DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no <I>option</I> is specified,
returns a list describing all of the available options for <I>pathName</I>.
If <I>option</I> is specified with no <I>value</I>, then the command returns a list
describing the one named <I>option</I> (this list will be identical to the corresponding
sublist of the value returned if no <I>option</I> is specified). If one or
more <I>option-value</I> pairs are specified, then the command modifies the given widget
option(s) to have the given value(s); in this case the command returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.

</DD></DL>

<DL><DT><A NAME="delete"><I>pathName</I> <B>delete</B></A>
 <I>index</I>
</DT><DD>

Delete the button at <i>index</i> from the button box.

</DD></DL>

<DL><DT><A NAME="index"><I>pathName</I> <B>index</B></A>
 <I>index</I>
</DT><DD>

Return the numerical index corresponding to the item.

</DD></DL>

<DL><DT><A NAME="insert"><I>pathName</I> <B>insert</B></A>
 <I>index</I> ?<I>option value...</I>?
</DT><DD>

Insert a new button into the button box before the given index.

</DD></DL>

<DL><DT><A NAME="invoke"><I>pathName</I> <B>invoke</B></A>
 <I>index</I>
</DT><DD>

Invoke the Button given by <I>index</I>.

</DD></DL>
<DL><DT><A NAME="itemcget"><I>pathName</I> <B>itemcget</B></A>
 <I>index</I>
 <I>option</I>
</DT><DD>

Returns the current value of a configuration option for the item.
<I>Option</I> may have any of the values accepted by the item creation command.

</DD></DL>
<DL><DT><A NAME="itemconfigure"><I>pathName</I> <B>itemconfigure</B></A>
 <I>index</I>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

This command is similar to the <B>configure</B> command, except that it applies to the
options for an individual item, whereas <B>configure</B> applies to the options for
the widget as a whole. <B>Options</B> may have any of the values accepted by the 
item creation widget command. If options are specified, options are modified as indicated
in the command and the command returns an empty string. If no options are specified,
returns a list describing the current options for the item.
Read-only options are not be modified.

</DD></DL>
<DL><DT><A NAME="setfocus"><I>pathName</I> <B>setfocus</B></A>
 <I>index</I>
</DT><DD>

Set the focus to the Button given by <I>index</I>.

</DD></DL>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




















































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/ComboBox.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
<HTML>
<HEAD><TITLE>ComboBox</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>ComboBox</B>
 - ComboBox widget
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>ComboBox</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I><A HREF="ArrowButton.html">OPTIONS from <B>ArrowButton</B></A></I></DT>
<DD><TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;-background or -bg</TD>
<TD>&nbsp;&nbsp;-disabledforeground</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-foreground or -fg</TD>
<TD>&nbsp;&nbsp;-state</TD>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="Entry.html">OPTIONS from <B>Entry</B></A></I></DT>
<DD><TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;-command</TD>
<TD>&nbsp;&nbsp;-disabledforeground</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-dragenabled</TD>
<TD>&nbsp;&nbsp;-dragendcmd</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-dragevent</TD>
<TD>&nbsp;&nbsp;-draginitcmd</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-dragtype</TD>
<TD>&nbsp;&nbsp;-dropcmd</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-dropenabled</TD>
<TD>&nbsp;&nbsp;-dropovercmd</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-droptypes</TD>
<TD>&nbsp;&nbsp;-editable</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-entrybg (see <B>-background</B>)</TD>
<TD>&nbsp;&nbsp;-entryfg (see <B>-foreground</B>)</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-exportselection</TD>
<TD>&nbsp;&nbsp;-font</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-helptext</TD>
<TD>&nbsp;&nbsp;-helptype</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-helpvar</TD>
<TD>&nbsp;&nbsp;-highlightbackground</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-highlightcolor</TD>
<TD>&nbsp;&nbsp;-highlightthickness</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-insertbackground</TD>
<TD>&nbsp;&nbsp;-insertborderwidth</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-insertofftime</TD>
<TD>&nbsp;&nbsp;-insertontime</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-insertwidth</TD>
<TD>&nbsp;&nbsp;-justify</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-selectbackground</TD>
<TD>&nbsp;&nbsp;-selectborderwidth</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-selectforeground</TD>
<TD>&nbsp;&nbsp;-show</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-state</TD>
<TD>&nbsp;&nbsp;-takefocus</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-text</TD>
<TD>&nbsp;&nbsp;-textvariable</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-width</TD>
<TD>&nbsp;&nbsp;-xscrollcommand</TD>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-autocomplete">-autocomplete</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-autopost">-autopost</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-bwlistbox">-bwlistbox</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-expand">-expand</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-height">-height</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-hottrack">-hottrack</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-images">-images</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-listboxwidth">-listboxwidth</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-modifycmd">-modifycmd</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-postcommand">-postcommand</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-values">-values</A></TD>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#bind"><B>bind</B></A>
 ?<I>arg...</I>?
</DD>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#clearvalue"><B>clearvalue</B></A>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
<DD><I>pathName</I> <A HREF="#get"><B>get</B></A></DD>
<DD><I>pathName</I> <A HREF="#getentry"><B>getentry</B></A></DD>
<DD><I>pathName</I> <A HREF="#getlistbox"><B>getlistbox</B></A></DD>
<DD><I>pathName</I> <A HREF="#getvalue"><B>getvalue</B></A></DD>
<DD><I>pathName</I> <A HREF="#icursor"><B>icursor</B></A>
<I>index</I>
</DD>
<DD><I>pathName</I> <A HREF="#post"><B>post</B></A></DD>
<DD><I>pathName</I> <A HREF="#setvalue"><B>setvalue</B></A>
 <I>index</I>
</DD>
<DD><I>pathName</I> <A HREF="#unpost"><B>unpost</B></A></DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

ComboBox widget enables the user to select a value among a list given by
the <B>values</B> option.  The list of possible values can be popped by
pressing the ArrowButton or by clicking in the entry when <B>editable</B>
value of the ComboBox is <B>false</B>.<BR> If <B>editable</B> value of the
ComboBox is <B>true</B> and the entry has the focus, the user can press the
top and bottom arrow keys to modify its value. If the current value exactly
match a value in the list, then the previous (for top arrow key) or then
next (for bottom arrow key) value in the list is displayed.  If the current
value match the beginning of a value in the list, then this value is
displayed.  If the current value doesnt match anything, then the first
value is displayed.

</P>
<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL>
    <DT><A NAME="-autocomplete"><B>-autocomplete</B></A></DT>
    <DD>
    Specifies whether or not the combobox should attempt to auto-complete
    the value in the entry field as the user types.  If true, the combobox
    will fill in a value that it finds in its value list as the user types
    into the entry.
    </DD>
</DL>

<DL>
    <DT><A NAME="-autopost"><B>-autopost</B></A></DT>
    <DD>
    Specifies whether or not the combobox should post the drop down as
    the user types.  If true, the combobox will post and scroll to the
    entry that most closely matches the user entry.
    </DD>
</DL>

<DL>
    <DT><A NAME="-bwlistbox"><B>-bwlistbox</B></A></DT>
    <DD>
    Specifies that the combobox should use a BWidget listbox in its drop
    down instead of the standard Tk option.  This option is enabled by
    default if the <b>-images</b> option is not empty.
    </DD>
</DL>

<DL><DT><A NAME="-expand"><B>-expand</B></A></DT>
<DD>

Specifies the value expansion behavior for the window. It must be
<B>none</B> (default) or <B>tab</B>. If <B>tab</B> is specified, then
a Tab binding is added to attempt to expand the current value based on
the other values in <B>-values</B>.
</DD>
</DL>

<DL><DT><A NAME="-height"><B>-height</B></A></DT>
<DD>

Specifies the desired height for the window, in lines. If zero or less,
then the desired height for the window is made just large enough to hold
all the elements in the listbox.
</DD>

<DL>
    <DT><A NAME="-hottrack"><B>-hottrack</B></A></DT>
    <DD>
    The selection in the drop down listbox will follow the mouse cursor
    as it moves.
    </DD>
</DL>

<DL>
    <DT><A NAME="-images"><B>-images</B></A></DT>
    <DD>
    A list of images that correspond to the <b>-values</b> option.  Each
    image will be drawn next to its value in the drop down.  This option
    enables the <b>-bwlistbox</b> by default as it is needed to display
    images.
    </DD>
</DL>

<DL>
    <DT><A NAME="-listboxwidth"><B>-listboxwidth</B></A></DT>
    <DD>
    Specifies the width of the listbox in the drop down.  Defaults to the
    same size as the combobox.
    </DD>
</DL>

</DL>
<DL><DT><A NAME="-modifycmd"><B>-modifycmd</B></A></DT>
<DD>

Specifies a Tcl command called when the user modify the value of the ComboBox by selecting it in the listbox or pressing arrow key.
</DD>
</DL>
<DL><DT><A NAME="-postcommand"><B>-postcommand</B></A></DT>
<DD>

Specifies a Tcl command called before the listbox of the ComboBox is mapped.
</DD>
</DL>
<DL><DT><A NAME="-values"><B>-values</B></A></DT>
<DD>

Specifies the values to display in the listbox of the ComboBox.
</DD>
</DL>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="bind"><I>pathName</I> <B>bind</B></A>
 ?<I>arg...</I>?
</DT><DD>

Set bindings on the entry widget.

</DD></DL>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>

Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.

</DD></DL>

<DL><DT><A NAME="clearvalue"><I>pathName</I> <B>clearvalue</B></A>
</DT><DD>

Clears the current text of the ComboBox.

</DD></DL>

<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no
<I>option</I> is specified, returns a list describing all of the available
options for <I>pathName</I>.  If <I>option</I> is specified with no
<I>value</I>, then the command returns a list describing the one named
<I>option</I> (this list will be identical to the corresponding sublist of
the value returned if no <I>option</I> is specified). If one or more
<I>option-value</I> pairs are specified, then the command modifies the
given widget option(s) to have the given value(s); in this case the command
returns an empty string.  <I>Option</I> may have any of the values accepted
by the creation command.  Read-only options are not be modified.

</DD></DL>

<DL><DT><A NAME="get"><I>pathName</I> <B>get</B></A>
</DT><DD>

Returns the current contents of the entry.

</DD></DL>

<DL><DT><A NAME="getentry"><I>pathName</I> <B>getentry</B></A>
</DT><DD>

Returns the path to the contained entry widget.

</DD></DL>

<DL><DT><A NAME="getlistbox"><I>pathName</I> <B>getlistbox</B></A>
</DT><DD>

Returns the path to the listbox in the drop down.

</DD></DL>

<DL><DT><A NAME="getvalue"><I>pathName</I> <B>getvalue</B></A>
</DT><DD>

Returns the index of the current text of the ComboBox in the list of values,
or -1 if it doesn't match any value.

</DD></DL>

<DL><DT><A NAME="icursor"><I>pathName</I> <B>icursor</B></A>
 <I>index</I>
</DT><DD>

Arrange for the insertion cursor to be displayed just before the
character given by <i>index</i>.  Returns an empty string.

</DD></DL>

<DL><DT><A NAME="post"><I>pathName</I> <B>post</B></A>
</DT><DD>

Post the drop down.

</DD></DL>

<DL><DT><A NAME="setvalue"><I>pathName</I> <B>setvalue</B></A>
 <I>index</I>
</DT><DD>

Set the text of the ComboBox to the value indicated by <I>index</I> in the list of values.
<I>index</I> may be specified in any of the following forms:
<P>
<DL COMPACT>
<DT>
<B>last</B>
<DD>
Specifies the last element of the list of values.
<DT><B>first</B>
<DD>
Specifies the first element of the list of values.
<DT>
<B>next</B>
<DD>
Specifies the element following the current (ie returned by <B>getvalue</B>) in the list
of values.
<DT><B>previous</B>
<DD>
Specifies the element preceding the current (ie returned by <B>getvalue</B>) in the list
of values.
<DT>
@<I>number</I>
<DD>
Specifies the integer index in the list of values.
</DL>

</DD></DL>

<DL><DT><A NAME="unpost"><I>pathName</I> <B>unpost</B></A>
</DT><DD>

Unpost the drop down.

</DD></DL>

<HR><BR><B>BINDINGS</B><BR><BR>

When Entry of the ComboBox has the input focus, it has the following bindings, in addition
to the default Entry bindings:
<UL>
<LI>Page up set the value of the ComboBox to the first value.
<LI>Page down set the value of the ComboBox to the last value.
<LI>Arrow up set the value of the ComboBox to the previous value.
<LI>Arrow down set the value of the ComboBox to the next value.
<LI>If <B>-autopost</B> is enabled, Escape unposts the listbox.
</UL>
If the listbox is not mapped and ComboBox is not editable or disabled,
mouse button 1 on the Entry cause the listbox to popup, as if the user press the ArrowButton.

</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




















































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/Dialog.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
<HTML>
<HEAD><TITLE>Dialog</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>Dialog</B>
 - Dialog abstraction with custom buttons
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>Dialog</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I><A HREF="ButtonBox.html">OPTIONS from <B>ButtonBox</B></A></I></DT>
<DD><TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;-background or -bg</TD>
<TD>&nbsp;&nbsp;-homogeneous</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-padx</TD>
<TD>&nbsp;&nbsp;-pady</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-spacing</TD>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-anchor">-anchor</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-bitmap">-bitmap</A></TR>
</TR>
<TR>

<TD>&nbsp;&nbsp;<A HREF="#-cancel">-cancel</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-default">-default</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-geometry">-geometry</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-image">-image</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-modal">-modal</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-parent">-parent</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-place">-place</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-separator">-separator</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-side">-side</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-title">-title</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-transient">-transient</A></TR>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#add"><B>add</B></A>
 ?<I>arg...</I>?
</DD>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
<DD><I>pathName</I> <A HREF="#draw"><B>draw</B></A>
 ?<I>focus</I>?
</DD>
<DD><I>pathName</I> <A HREF="#enddialog"><B>enddialog</B></A>
 <I>result</I>
</DD>
<DD><I>pathName</I> <A HREF="#getframe"><B>getframe</B></A>
</DD>
<DD><I>pathName</I> <A HREF="#invoke"><B>invoke</B></A>
 <I>index</I>
</DD>
<DD><I>pathName</I> <A HREF="#itemcget"><B>itemcget</B></A>
 <I>index</I>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#itemconfigure"><B>itemconfigure</B></A>
 <I>index</I>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
<DD><I>pathName</I> <A HREF="#setfocus"><B>setfocus</B></A>
 <I>index</I>
</DD>
<DD><I>pathName</I> <A HREF="#withdraw"><B>withdraw</B></A>
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

Dialog widget enables the user to create a dialog box.
Some commands take an <I>index</I> as argument indicating on which
Button it work. This index is the same specified for equivalent ButtonBox command:
<P>
<DL COMPACT>
<DT>
<I>number</I>
<DD>
Specifies the Button numerically, where 0 corresponds
to the first added Button, 1 to the next, and so on.
<DT>
<B>end</B> or <B>last</B>
<DD>
Indicates the last item added.
<DT><B>default</B>
<DD>
Indicates the default Button.
</DL>

</P>
<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-anchor"><B>-anchor (read-only)</B></A></DT>
<DD>

Specifies the anchor point of the ButtonBox.
Must be one of <B>w</B>, <B>e</B>, <B>n</B>, <B>s</B> or <B>c</B>.
If <B>side</B> option is set to <I>top</I> or <I>bottom</I>,
<B>anchor</B> values <I>n</I>, <I>s</I> and <I>c</I> have the same effect.
If <B>side</B> option is set to <I>left</I> or <I>right</I>,
<B>anchor</B> values <I>w</I>, <I>e</I> and <I>c</I> have the same effect.

</DD>
</DL>
<DL><DT><A NAME="-bitmap"><B>-bitmap (read-only)</B></A></DT>
<DD>

Specifies a bitmap to display at the left of the user frame.
<B>image</B> option override <B>bitmap</B>.
</DD>
</DL>
<DL><DT><A NAME="-cancel"><B>-cancel</B></A></DT>
<DD>

Specifies the number of the cancel button of the Dialog. When user presses Esc or the windows close button,
this button is invoked.<BR>
If set to <B>-1</B>, Esc does not invoke anything.
The window close button <I>destroys</I> the dialog in this case and returns <B>-1</B>.
</DD>
</DL>
<DL><DT><A NAME="-default"><B>-default</B></A></DT>
<DD>

Specifies the number of the default button of the Dialog.
When user press Return in the Dialog, this button is invoked.
</DD>
</DL>
</DL>
<DL><DT><A NAME="-geometry"><B>-geometry</B></A></DT>
<DD>

Set the <B>geometry</B> used when method <B>draw</B> is called.
See <B>wm geometry</B> for a parameter description.
</DD>
</DL>
<DL><DT><A NAME="-image"><B>-image (read-only)</B></A></DT>
<DD>

Specifies an image to display at the left of the user frame.
<B>image</B> option override <B>bitmap</B>.
</DD>
</DL>
<DL><DT><A NAME="-modal"><B>-modal</B></A></DT>
<DD>

This option must be <B>none</B>, <B>local</B> or <B>global</B>. The value of this option
specifies the grab mode of the dialog and how works Dialog::<B>draw</B>.

</DD>
</DL>
<DL><DT><A NAME="-parent"><B>-parent</B></A></DT>
<DD>

Parent of the Dialog. Dialog is placed relative to its parent. If empty, it is
placed relative to the root window. Also see <B>place</B> option.

</DD>
</DL>
<DL><DT><A NAME="-place"><B>-place</B></A></DT>
<DD>
Specifies where to draw the Dialog toplevel relative to the dialog's
parent. Must be one of <B>none</B>, <B>center</B>, <B>left</B>, <B>right</B>,
<B>above</B>, <B>below</B>. Default value of <B>place</B> is <I>center</I>.

</DD>
</DL>
<DL><DT><A NAME="-separator"><B>-separator (read-only)</B></A></DT>
<DD>

Specifies wether or not to draw a separator between the user frame and the ButtonBox.

</DD>
</DL>
<DL><DT><A NAME="-side"><B>-side (read-only)</B></A></DT>
<DD>

Specifies where to draw the ButtonBox relative to the user frame. Must be one of
<B>top</B>, <B>left</B>, <B>bottom</B> or <B>right</B>.
</DD>
</DL>
<DL><DT><A NAME="-title"><B>-title</B></A></DT>
<DD>

Title of the Dialog toplevel.

</DD>
</DL>
<DL><DT><A NAME="-transient"><B>-transient (read-only)</B></A></DT>
<DD>

Specifies if the Dialog Toplevel should be a transient window or not. Default
value of <B>transient</B> is <I>true</I>.

</DD>
</DL>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="add"><I>pathName</I> <B>add</B></A>
 ?<I>arg...</I>?
</DT><DD>

Add a button to the button box of the dialog box. Default -command option is
<I>Dialog::enddialog $path index</I> where <I>index</I> is number of button added.
</DD></DL>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>

Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD></DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no <I>option</I> is specified,
returns a list describing all of the available options for <I>pathName</I>.
If <I>option</I> is specified with no <I>value</I>, then the command returns a list
describing the one named <I>option</I> (this list will be identical to the corresponding
sublist of the value returned if no <I>option</I> is specified). If one or
more <I>option-value</I> pairs are specified, then the command modifies the given widget
option(s) to have the given value(s); in this case the command returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.

</DD></DL>
<DL><DT><A NAME="draw"><I>pathName</I> <B>draw</B></A>
 ?<I>focus</I>?
</DT><DD>

This command draw the Dialog, and set grab to it following <B>modal</B> option.
If <B>modal</B> option is set to <I>none</I>, the command returns immediatly
an empty string. In all other case, the command returns when Dialog::<B>enddialog</B>
is called or when Dialog is destroyed.
The return value is the result argument of Dialog::<B>enddialog</B> or -1 if it is destroyed.
<P>
By default, the focus is set to the default button referenced by <B>default</B> option,
or to the toplevel of Dialog if no default button has been set.
If <I>focus</I> is present, it must be a pathname, or an index to a button.
Initial focus is set on this pathname or corresponding button.

</DD></DL>
<DL><DT><A NAME="enddialog"><I>pathName</I> <B>enddialog</B></A>
 <I>result</I>
</DT><DD>

This command is typically called within a command of a button to make Dialog::<B>draw</B>
return.

</DD></DL>
<DL><DT><A NAME="getframe"><I>pathName</I> <B>getframe</B></A>
</DT><DD>

Returns the pathname of the user window.
</DD></DL>
<DL><DT><A NAME="invoke"><I>pathName</I> <B>invoke</B></A>
 <I>index</I>
</DT><DD>

Invoke the Button given by <I>index</I>.

</DD></DL>
<DL><DT><A NAME="itemcget"><I>pathName</I> <B>itemcget</B></A>
 <I>index</I>
 <I>option</I>
</DT><DD>

Returns the current value of a configuration option for the item.
<I>Option</I> may have any of the values accepted by the item creation command.

</DD></DL>
<DL><DT><A NAME="itemconfigure"><I>pathName</I> <B>itemconfigure</B></A>
 <I>index</I>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

This command is similar to the <B>configure</B> command, except that it applies to the
options for an individual item, whereas <B>configure</B> applies to the options for
the widget as a whole. <B>Options</B> may have any of the values accepted by the 
item creation widget command. If options are specified, options are modified as indicated
in the command and the command returns an empty string. If no options are specified,
returns a list describing the current options for the item.
Read-only options are not be modified.

</DD></DL>
<DL><DT><A NAME="setfocus"><I>pathName</I> <B>setfocus</B></A>
 <I>index</I>
</DT><DD>

Set the focus to the Button given by <I>index</I>.

</DD></DL>
<DL><DT><A NAME="withdraw"><I>pathName</I> <B>withdraw</B></A>
</DT><DD>

Call this command to hide the dialog box.

</DD></DL>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
















































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/DragSite.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<HTML>
<HEAD><TITLE>DragSite</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>DragSite</B>
 - Commands set for Drag facilities
</DD></DL>
<DL>
<DT><I><A HREF="#wc">COMMAND</A></I></DT>
<DD>DragSite::<A HREF="#include"><B>include</B></A>
 <I>class</I>
 <I>type</I>
 <I>event</I>
</DD>
<DD>DragSite::<A HREF="#register"><B>register</B></A>
 <I>path</I>
 ?<I>option value...</I>?
</DD>
<DD>DragSite::<A HREF="#setdrag"><B>setdrag</B></A>
 <I>path</I>
 <I>subpath</I>
 <I>initcmd</I>
 <I>endcmd</I>
 ?<I>force</I>?
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

Commands of this namespace enable user to define a BWidget or a Tk widget as a drag site.



</P>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">COMMAND</A></B><BR>
<DL><DT><A NAME="include">DragSite::<B>include</B></A>
 <I>class</I>
 <I>type</I>
 <I>event</I>
</DT><DD>

This command provides a simple way to include options relatives to a drag site into
BWidget resources definition.
It includes the options needed for <B>register</B>: <I>-dragevent</I>, initialized to
<I>event</I>, <I>-draginitcmd</I> and <I>-dragendcmd</I>, initialized to empty string,
and two new options:
<TABLE BORDER=0 CELLSPACING=1>
<TR><TD><I>-dragenabled</I><TD>Specifies wether or not drag is active (initialized to 0)
<TR><TD><I>-dragtype</I><TD>Default or alternate dragged data type (initialized to <I>type</I>)
</TABLE>

</DD></DL>
<DL><DT><A NAME="register">DragSite::<B>register</B></A>
 <I>path</I>
 ?<I>option value...</I>?
</DT><DD>

This command is used to declare <I>path</I> as a drag site. Options are:

<P>
<DL><DT><A NAME="DragSite-dragendcmd"><B>-dragendcmd</B></A></DT>
<DD>

Command called when drag terminates (ie when user release drag icon).
This command is called with the following arguments:
<UL>
<LI>the pathname of the drag source (the widget itself),
<LI>the pathname of the drop target,
<LI>the operation,
<LI>the type of the dragged data,
<LI>the dragged data,
<LI>result of the drop (result of the call to <B>-dropcmd</B> of the target),
</UL>
If the drop does not occurs, the target and the operation are empty string and the result
is 0.

</DD>
</DL>
<DL><DT><A NAME="DragSite-dragevent"><B>-dragevent</B></A></DT>
<DD>

Specifies the number of the mouse button associated to the drag.
Must be <B>1</B>, <B>2</B> or <B>3</B>.

</DD>
</DL>
<DL><DT><A NAME="DragSite-draginitcmd"><B>-draginitcmd</B></A></DT>
<DD>

Command called when drag initiates. When the event of option <B>dragevent</B> occurs on
<I>path</I>, this command is called with the following arguments:
<UL>
<LI>pathname of the drag source (<I>path</I>),
<LI>root x-coordinate of pointer,
<LI>root y-coordinate of pointer,
<LI>a toplevel created to represent dragged data. When returning, if it
has no children, a bitmap is automatically displayed.
</UL>
If the command returns an empty string, then the drag will be
suppressed.  Otherwise the command must return a list containing three
elements:
<UL>
<LI>the type of the data,
<LI>the list of acceptable basic operations (<B>copy</B>, <B>move</B> and <B>link</B>)
<LI>and the data.
</UL>
Note that even if <B>copy</B> does not appear in the list of basic
operation, it is considered as an acceptable operation, since
<B>copy</B> semantic does not modify the drag source.

</DD>
</DL>
</DD></DL>
<DL><DT><A NAME="setdrag">DragSite::<B>setdrag</B></A>
 <I>path</I>
 <I>subpath</I>
 <I>initcmd</I>
 <I>endcmd</I>
 ?<I>force</I>?
</DT><DD>

This command provides a simple way to call <B>register</B> during a BWidget creation or
configuration.
<UL>
<LI><I>path</I> is the pathname of the BWidget,
<LI><I>subpath</I> is the pathname of the tk widget where drag event occurs,
<LI><I>initcmd</I> BWidget command for <I>drag-init</I> event,
<LI><I>endcmd</I> BWidget command for <I>drag-end</I> event,
<LI><I>force</I> specifies wether or not to call <B>register</B> whenever no option value has
changed (0 by default - for BWidget configuration, use 1 for BWidget creation).
</UL>
<B>setdrag</B> verifies the modification flag of options <B>dragenabled</B> and
<B>dragevent</B> and calls <B>register</B> if needed according to the options values and
<I>initcmd</I> and <I>endcmd</I> arguments. <B>draginitcmd</B> and <B>dragendcmd</B> are not
taken from options of widget  because they are considered as user command, called by
BWidget implementation of <I>drag-init</I> and <I>drag-end</I> events.

</DD></DL>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


























































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/DropSite.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
<HTML>
<HEAD><TITLE>DropSite</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>DropSite</B>
 - Commands set for Drop facilities
</DD></DL>
<DL>
<DT><I><A HREF="#wc">COMMAND</A></I></DT>
<DD>DropSite::<A HREF="#include"><B>include</B></A>
 <I>class</I>
 <I>types</I>
</DD>
<DD>DropSite::<A HREF="#register"><B>register</B></A>
 <I>path</I>
 ?<I>option value...</I>?
</DD>
<DD>DropSite::<A HREF="#setcursor"><B>setcursor</B></A>
 <I>cursor</I>
</DD>
<DD>DropSite::<A HREF="#setdrop"><B>setdrop</B></A>
 <I>path</I>
 <I>subpath</I>
 <I>dropover</I>
 <I>drop</I>
 ?<I>force</I>?
</DD>
<DD>DropSite::<A HREF="#setoperation"><B>setoperation</B></A>
 <I>op</I>
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

Commands of this namespace enable user to define a BWidget or a Tk widget as a drop site.
A drop site is composed of the type of object that can be dropped and associated operation,
a command called when drop occurs, and a command when an object is dragged over the widget.
A drop site must have at least one type of acceptable object and a drop command.

</P>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">COMMAND</A></B><BR>
<DL><DT><A NAME="include">DropSite::<B>include</B></A>
 <I>class</I>
 <I>types</I>
</DT><DD>

This command provides a simple way to include options relatives to a drop site into
BWidget resources definition.
It includes the options needed for <B>register</B>, <I>-dropovercmd</I> and <I>-dropcmd</I>,
initialized to empty string, and <I>-droptypes</I>, initialized to <I>types</I>,
and one new option:
<TABLE BORDER=0 CELLSPACING=1>
<TR><TD><I>-dropenabled</I><TD>Specifies wether or not drop is active (initialized to 0)
</TABLE>

</DD></DL>
<DL><DT><A NAME="register">DropSite::<B>register</B></A>
 <I>path</I>
 ?<I>option value...</I>?
</DT><DD>

This command is used to declare <I>path</I> as a drop site. Options are:

<P>
<DL><DT><A NAME="DropSite-dropcmd"><B>-dropcmd</B></A></DT>
<DD>

This command is called when user release the drag icon over a valid
drop target widget.  Arguments passed to the command are:

<UL>
<LI>pathname of the drop target (the widget itself),
<LI>pathname of the drag source,
<LI>root x-coordinate of the pointer,
<LI>root y-coordinate of the pointer,
<LI>operation,
<LI>type of the dragged data,
<LI>dragged data.
</UL>

Its return values is passed as a result to the <B>-dragendcmd</B>
command of the drag source widget.

</DD>
</DL>
<DL><DT><A NAME="DropSite-dropovercmd"><B>-dropovercmd</B></A></DT>
<DD>

This command can be used to provide a dynamic drag while <I>drag-over</I> events.
While a drag occurs, events &lt;Enter&gt;, &lt;Motion&gt; and &lt;Leave&gt; are catched.
Arguments passed to the command are:
<UL>
<LI>pathname of the drop target (the widget itself),
<LI>pathname of the drag source,
<LI>event over the drop target: <I>enter</I>, <I>motion</I> or <I>leave</I>,
<LI>root x-coordinate of the pointer,
<LI>root y-coordinate of the pointer,
<LI>operation,
<LI>type of the dragged data,
<LI>dragged data.
</UL>
Command must the new status of the drag:
<UL>
<LI>0  if widget refuse this drag. Command will not be recalled on motion/leave event.
<LI>1  if widget accept this drag. Command will not be recalled on motion/leave event.
<LI>2  if widget refuse this drag. Command will be recalled on each motion event to reevaluate.
<LI>3  if widget accept this drag. Command will be recalled on each motion event to reevaluate.

</UL>
Here is a list of events and associated actions on a DropSite widget. This example
assumes that dragged data type is valid for the drop target.
<B>status</B> is the status of the drag on a DropSite. Its value is:
<BR><BR>

<TABLE BORDER CELLSPACING=1 CELLPADDING=4>
<TR>
<TD WIDTH="18%" VALIGN="TOP" ALIGN="CENTER">Event</TD>
<TD WIDTH="10%" VALIGN="TOP" ALIGN="CENTER">Old status</TD>
<TD WIDTH="48%" VALIGN="TOP" ALIGN="CENTER">Action</TD>
<TD WIDTH="24%" VALIGN="TOP" ALIGN="CENTER">New status</TD>
</TR>
<TR><TD WIDTH="18%" VALIGN="TOP" ROWSPAN=2>
<FONT SIZE=2>&lt;Enter&gt;</FONT></TD>
<TD WIDTH="10%" VALIGN="TOP" ROWSPAN=2>
<FONT SIZE=2>-</FONT></TD>
<TD WIDTH="48%" VALIGN="TOP">
<FONT SIZE=2>if DropSite has <B>dropovercmd</B>, call it with <I>enter</I></FONT></TD>
<TD WIDTH="24%" VALIGN="TOP">
<FONT SIZE=2>result of <B>dropovercmd</B></FONT></TD>
</TR>
<TR><TD WIDTH="48%" VALIGN="TOP">
<FONT SIZE=2>else</FONT></TD>
<TD WIDTH="24%" VALIGN="TOP">
<FONT SIZE=2>1</FONT></TD>
</TR>
<TR><TD WIDTH="18%" VALIGN="TOP" ROWSPAN=2>
<FONT SIZE=2>&lt;Motion&gt;</FONT></TD>
<TD WIDTH="10%" VALIGN="TOP">
<FONT SIZE=2>0 or 1</FONT></TD>
<TD WIDTH="48%" VALIGN="TOP">&nbsp;</TD>
<TD WIDTH="24%" VALIGN="TOP">
<FONT SIZE=2>unchanged</FONT></TD>
</TR>
<TR><TD WIDTH="10%" VALIGN="TOP">
<FONT SIZE=2>2 or 3</FONT></TD>
<TD WIDTH="48%" VALIGN="TOP">
<FONT SIZE=2>call <B>dropovercmd</B> with <I>motion</I></FONT></TD>
<TD WIDTH="24%" VALIGN="TOP">
<FONT SIZE=2>result of <B>dropovercmd</B></FONT></TD>
</TR>
<TR><TD WIDTH="18%" VALIGN="TOP" ROWSPAN=2>
<FONT SIZE=2>&lt;Leave&gt;</FONT>&nbsp;</TD>
<TD WIDTH="10%" VALIGN="TOP">
<FONT SIZE=2>0 or 1</FONT></TD>
<TD WIDTH="48%" VALIGN="TOP">&nbsp;</TD>
<TD WIDTH="24%" VALIGN="TOP">
<FONT SIZE=2>-</FONT></TD>
</TR>
<TR><TD WIDTH="10%" VALIGN="TOP">
<FONT SIZE=2>2 or 3</FONT></TD>
<TD WIDTH="48%" VALIGN="TOP">
<FONT SIZE=2>call <B>dropovercmd</B> with <I>leave</I></FONT></TD>
<TD WIDTH="24%" VALIGN="TOP">
<FONT SIZE=2>-</FONT></TD>
</TR>
<TR><TD WIDTH="18%" VALIGN="TOP" ROWSPAN=4>
<FONT SIZE=2>&lt;Drop&gt;</FONT></TD>
<TD WIDTH="10%" VALIGN="TOP">
<FONT SIZE=2>0</FONT></TD>
<TD WIDTH="48%" VALIGN="TOP">
<FONT SIZE=2>call <B>dragendcmd</B> of drag source</FONT></TD>
<TD WIDTH="24%" VALIGN="TOP" ROWSPAN=4>
<FONT SIZE=2>-</FONT></TD>
</TR>
<TR><TD WIDTH="10%" VALIGN="TOP">
<FONT SIZE=2>1</FONT></TD>
<TD WIDTH="48%" VALIGN="TOP">
<FONT SIZE=2>call <B>dropcmd</B> and call <B>dragendcmd</B> of drag source</FONT></TD>
</TR>
<TR><TD WIDTH="10%" VALIGN="TOP">
<FONT SIZE=2>2</FONT></TD>
<TD WIDTH="48%" VALIGN="TOP">
<FONT SIZE=2>call <B>dropovercmd</B> with <I>leave</I> and call <B>dragendcmd</B> of drag source</FONT></TD>
</TR>
<TR><TD WIDTH="10%" VALIGN="TOP">
<FONT SIZE=2>3</FONT></TD>
<TD WIDTH="48%" VALIGN="TOP">
<FONT SIZE=2>call <B>dropcmd</B> and call <B>dragendcmd</B> of drag source</FONT></TD>
</TR>
</TABLE>
<BR>

</DD>
</DL>
<DL><DT><A NAME="DropSite-droptypes"><B>-droptypes</B></A></DT>
<DD>

Specifies a list {<I>type</I> <I>oplist</I> ?<I>type</I> <I>oplist</I>? ...} of acceptable
types and associated operations for the drop target.
For each type, <I>oplist</I> is a list
{<I>descops</I> <I>mod</I> ?<I>descops</I> <I>mod</I>? ...} describing operations and
modifier keys for these operations.
<I>descops</I> describe an operation. It can be a predefined operations (<B>copy</B>,
<B>move</B> or <B>link</B>) or a new user defined operation, of the form {<I>subop</I>
<B>baseop</B> ?<I>bitmap</I>?}.
<I>subop</I> is the name given to the sub operation, <I>baseop</I> is the name of the
base operation (<B>copy</B>, <B>move</B> or <B>link</B>) and <I>bitmap</I> is a bitmap
to display for the operation.
<BR>If <I>bitmap</I> is empty, the default bitmap of the base operation is used for the
sub operation.
<BR><I>subop</I> can be a base operation, in order to change the bitmap of a base operation.
In this case, <I>baseop</I> must be empty or equal to <I>subop</I>.
<BR><I>mod</I> is the modifer key for the operation. It can be:
<UL>
<LI><B>none</B> to specify that no modifier key is pressed. This modifier can only be used
with a sub operation named <B>default</B> (and vice versa), which has the behaviour of not
display any bitmap operation. For all type, if the modifier <B>none</B> is not given, it is
automatically associated to the <B>default</B> sub operation of a <B>copy</B> base operation.
<LI><B>program</B> to specifies a sub operation accessible only by <B>DropSite::setoperation</B>.
<LI>A list combining <B>shift</B>, <B>control</B> and <B>alt</B>, which means their 
corresponding key.
</UL>

</DD>
</DL>
</DD></DL>
<DL><DT><A NAME="setcursor">DropSite::<B>setcursor</B></A>
 <I>cursor</I>
</DT><DD>

This command can be used within the script <B>dragovercmd</B>. It is usefull to provide
visual effect about the state of the drag.
</DD></DL>
<DL><DT><A NAME="setdrop">DropSite::<B>setdrop</B></A>
 <I>path</I>
 <I>subpath</I>
 <I>dropover</I>
 <I>drop</I>
 ?<I>force</I>?
</DT><DD>

This command provides a simple way to call <B>register</B> during a BWidget creation or
configuration.
<UL>
<LI><I>path</I> is the pathname of the BWidget,
<LI><I>subpath</I> is the pathname of the tk widget where drag event occurs,
<LI><I>dropover</I> is a command for <I>drag-over</I> event,
<LI><I>drop</I> is a command for <I>drop</I> event,
<LI><I>force</I> specifies wether or not to call <B>register</B> whenever no option value
has changed (0 by default - for BWidget configuration, use 1 for BWidget creation).
</UL>
<B>setdrop</B> verifies the modification flag of options <B>dropenabled</B> and
<B>droptypes</B> and calls <B>register</B> if needed according to the options values and
<I>dropover</I> and <I>drop</I> arguments. <B>dropovercmd</B> and <B>dropcmd</B> are not
taken from options of widget because they are considered as user command, called by
BWidget implementation of <I>drag-over</I> and <I>drop</I> events.

</DD></DL>
<DL><DT><A NAME="setoperation">DropSite::<B>setoperation</B></A>
 <I>op</I>
</DT><DD>
Description text
</DD></DL>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




















































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/DynamicHelp.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
<HTML>
<HEAD><TITLE>DynamicHelp</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>DynamicHelp</B>
 - Provide help to Tk widget or BWidget
</DD></DL>
<DL>
<DT><I><A HREF="#wc">COMMAND</A></I></DT>
<DD>DynamicHelp::<A HREF="#add"><B>add</B></A>
<i>widget</i> ?<I>option value ...</I>?
</DD>
<DD>DynamicHelp::<A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
<DD>DynamicHelp::<A HREF="#delete"><B>delete</B></A>
<i>widget</i>
</DD>
<DD>DynamicHelp::<A HREF="#include"><B>include</B></A>
 <I>class</I>
 <I>type</I>
</DD>
<DD>DynamicHelp::<A HREF="#register"><B>register</B></A>
 <I>path</I>
 <I>type</I>
 ?<I>arg...</I>?
</DD>
<DD>DynamicHelp::<A HREF="#sethelp"><B>sethelp</B></A>
 <I>path</I>
 <I>subpath</I>
 ?<I>force</I>?
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>
Description text
</P>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">COMMAND</A></B><BR>

<DL><DT><A NAME="add">DynamicHelp::<B>add</B></A>
 ?<I>option value ...</I>?
</DT><DD>
<p>
This command adds dynamic help to the given <i>widget</i>.
</p>
    <DL><DT><A NAME="add-command"><B>-command</B></A></DT>
    <DD>
    	If specified, refers to a command to execute to get the help
	text to display.  The command must return a string to display.
	If the command returns an empty string, no help is displayed.
    </DD>
    </DL>

    <DL><DT><A NAME="add-index"><B>-index</B></A></DT>
    <DD>
	If specified, refers to a menu index to bind the help to instead of
	a widget.  If <b>-type</b> is not menu, this option is ignored.
    </DD>
    </DL>

    <DL><DT><A NAME="add-item"><B>-item</B></A></DT>
    <DD>
    	If specified, refers to an item or tag on a canvas widget or to a tag
        in a text widget to bind the help to instead of to a widget.
    </DD>
    </DL>

    <DL><DT><A NAME="add-type"><B>-type</B></A></DT>
    <DD>
	Specifies the type of help.  Can be:
	<b>balloon</b>, <b>variable</b> or <b>menu</b>.
	Default is <b>balloon</b>.
    </DD>
    </DL>

    <DL><DT><A NAME="add-text"><B>-text</B></A></DT>
    <DD>
    	The text to be displayed as help.
    </DD>
    </DL>

    <DL><DT><A NAME="add-variable"><B>-variable</B></A></DT>
    <DD>
    	Specifies a variable name to which the help string will be
        written.  Some other widget (e.g., a status bar) is
        responsible for displaying this variable.
    </DD>
    </DL>

    <p>
    Creating dynamic help for a menu is a two-step process.  The menu
    itself must first be added and then each menu entry must be added
    separately.  Here is a brief example.
    </p>

    <TABLE BORDER=2 CELLSPACING=2 WIDTH="80%">
    <TR><TD><PRE>
    <FONT COLOR=red><I># create menu</I></FONT>
    menu .m -type menubar
    <FONT COLOR=red><I># associate menubar to toplevel BEFORE DynamicHelp::register</I></FONT>
    <FONT COLOR=red><I># to make it works with menu clone name</I></FONT>
    . configure -menu .m
    .m add cascade -label "File" -menu .m.file
    menu .m.file
    .m.file add command -label "Open..."
    .m.file add command -label "Quit"
    <FONT COLOR=red><I># create label for help, using variable varinfo</I></FONT>
    label .l -textvariable varinfo
    <FONT COLOR=red><I># associate all entries of menu .m.file to variable varinfo</I></FONT>
    DynamicHelp::add .m.file -type menu -variable varinfo
    <FONT COLOR=red><I># then declare entries of .m.file</I></FONT>
    DynamicHelp::add .m.file -type menu -index 0 -text "Detach menu"
    DynamicHelp::add .m.file -type menu -index 1 -text "Open a file"
    DynamicHelp::add .m.file -type menu -index 2 -text "Exit demo"
    </PRE></TD></TR></TABLE></CENTER>

</DL>

<DL><DT><A NAME="configure">DynamicHelp::<B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>
This command configure the ballon help.
<P>
<DL><DT><A NAME="DynamicHelp-borderwidth"><B>-borderwidth</B></A></DT>
<DD>
Width of the black border around the balloon.
</DD>
</DL>
<DL><DT><A NAME="DynamicHelp-delay"><B>-delay</B></A></DT>
<DD>
Define the delay in millisecond of mouse inactivity before displaying
the balloon.
</DD>
</DL>
<dl>
    <dt><a name="DynamicHelp-state"><b>-state</b></a></dt>
    <dd>
    Specifies one of two states for help balloons: <b>normal</b> and
    <b>disabled</b>.
    </dd>
    <dd>
    If <b>state</b> is <b>disabled</b>, help balloons will not be displayed
    for any registered widget.
    </dd>
</dl>
<DL><DT><A NAME="DynamicHelp-topbackground"><B>-topbackground</B></A></DT>
<DD>
The background color of the toplevel window created for a balloon.
</DD>
</DL>
<BR>Other standard options are:
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-background">-background or -bg</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-font">-font</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-foreground">-foreground or -fg</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-justify">-justify</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-padx">-padx</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-pady">-pady</A></TR>
</TR>
</TABLE></DD>
</DD></DL>

<DL><DT><A NAME="delete">DynamicHelp::<B>delete</B></A>
 <I>widget</I>
</DT><DD>
    Delete all dynamic help for the given <i>widget</i>.
</DD></DL>

<DL><DT><A NAME="include">DynamicHelp::<B>include</B></A>
 <I>class</I>
 <I>type</I>
</DT><DD>
Description text
</DD></DL>
<DL><DT><A NAME="register">DynamicHelp::<B>register</B></A>
 <I>path</I>
 <I>type</I>
 ?<I>arg...</I>?
</DT><DD>
<p>
<b>Its use is deprecated.  Use <i>DynamicHelp::add</i> instead.</b>
</p>

Register a help text to the widget <I>path</I>.
<I>type</I> determines the type of the help or the type of the widget.
Depending on <I>type</I>, other options must be provided.
<BR>
<TABLE CELLSPACING=5 CELLPADDING=0 BORDER=0>
<TR><TD><B>    type      </B></TD><TD><B>     options      </B></TD></TR>
<TR><TD><B><I> balloon   </I></B></TD><TD><I> ?tagOrItem? text </I></TD></TR>
<TR><TD><B><I> variable  </I></B></TD><TD><I> ?tagOrItem? varName text </I></TD></TR>
<TR><TD><B><I> menu      </I></B></TD><TD><I> varName      </I></TD></TR>
<TR><TD><B><I> menuentry </I></B></TD><TD><I> index text   </I></TD></TR>
</TABLE>
<BR>If one of the option is missing or is empty, help is removed for this widget.
<p>

If <i>tagOrItem</i> is specified, then <i>path</i> is a canvas or a text. In
case of a canvas, <i>tagOrItem</i> is the name of a tag or item on the canvas
to which the help will be bound. In case of a text, <i>tagOrItem</i> is the
name of a tag on the text to which the help will be bound.

</p>
For type other than <I>balloon</I>, <I>varName</I> is typically a variable
linked to a label.
<BR>For menu, balloon type help is not available. To declare a help for menu,
you first declare the menu, and then entries of this menu.
<BR>For example:
<BR><BR>
<CENTER>
<TABLE BORDER=2 CELLSPACING=2 WIDTH="80%">
<TR><TD><PRE>
     <FONT COLOR=red><I># create menu</I></FONT>
menu .m -type menubar
<FONT COLOR=red><I># associate menubar to toplevel BEFORE DynamicHelp::register</I></FONT>
<FONT COLOR=red><I># to make it works with menu clone name</I></FONT>
. configure -menu .m
.m add cascade -label "File" -menu .m.file
menu .m.file
.m.file add command -label "Open..."
.m.file add command -label "Quit"
<FONT COLOR=red><I># create label for help, using variable varinfo</I></FONT>
label .l -textvariable varinfo
<FONT COLOR=red><I># associate all entries of menu .m.file to variable varinfo</I></FONT>
DynamicHelp::register .m.file menu varinfo
<FONT COLOR=red><I># then declare entries of .m.file</I></FONT>
DynamicHelp::register .m.file menuentry 0 "Detach menu"
DynamicHelp::register .m.file menuentry 1 "Open a file"
DynamicHelp::register .m.file menuentry 2 "Exit demo"
</PRE></TD></TR></TABLE></CENTER>
<BR>
<BR>Notice that if popup menu is owned by a menubar, you must associate first the menubar
to its toplevel. In this case, when you create a menu popup, its clone window is also
created, and DynamicHelp::register detects the exitence of the clone window and maps
events to it.
</DD></DL>
<DL><DT><A NAME="sethelp">DynamicHelp::<B>sethelp</B></A>
 <I>path</I>
 <I>subpath</I>
 ?<I>force</I>?
</DT><DD>
Description text
</DD></DL>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






















































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/Entry.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
<HTML>
<HEAD><TITLE>Entry</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>Entry</B>
 - Entry widget with <B>state</B> option, dynamic help and drag and drop facilities
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>Entry</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I>STANDARD OPTIONS</I></DT>
<DT><I>Not themed</I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-background">-background or -bg</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-borderwidth">-borderwidth or -bd</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-disabledbackground">-disabledbackground</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-disabledforeground">-disabledforeground</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-exportselection">-exportselection</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-font">-font</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-foreground">-foreground or -fg</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-highlightbackground">-highlightbackground</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-highlightcolor">-highlightcolor</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-highlightthickness">-highlightthickness</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-insertbackground">-insertbackground</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-insertborderwidth">-insertborderwidth</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-insertofftime">-insertofftime</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-insertontime">-insertontime</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-insertwidth">-insertwidth</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-justify">-justify</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-relief">-relief</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-selectbackground">-selectbackground</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-selectborderwidth">-selectborderwidth</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-selectforeground">-selectforeground</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-takefocus">-takefocus</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-text">-text</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-textvariable">-textvariable</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-xscrollcommand">-xscrollcommand</A></TD>
</TABLE></DD>
</DL>
<DL>
<DT><I>Themed</I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-exportselection">-exportselection</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-font">-font</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-insertofftime">-insertofftime</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-insertontime">-insertontime</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-insertwidth">-insertwidth</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-justify">-justify</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-takefocus">-takefocus</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-text">-text</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-textvariable">-textvariable</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-xscrollcommand">-xscrollcommand</A></TD>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-command">-command</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-dragenabled">-dragenabled</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-dragendcmd">-dragendcmd</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-dragevent">-dragevent</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-draginitcmd">-draginitcmd</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-dragtype">-dragtype</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-dropcmd">-dropcmd</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-dropenabled">-dropenabled</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-dropovercmd">-dropovercmd</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-droptypes">-droptypes</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-editable">-editable</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-helptext">-helptext</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-helptype">-helptype</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-helpvar">-helpvar</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-show">-show</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-state">-state</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-width">-width</A></TD>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
<DD><I>pathName</I> <A HREF="#invoke"><B>invoke</B></A>
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

The <B>Entry</B> widget extends the default Tk entry. Options have been added to provide
visual effect depending on the state of the Entry,
<A HREF="DynamicHelp.html">DynamicHelp</A> options,
and <A HREF="DragSite.html">Drag</A> and
<A HREF="DropSite.html">Drop</A>.
Entry behaves much like a Label, with <B>text</B> option to set its contents.
<BR>Tk entry command can also be used on Entry widget.

</P>
<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-command"><B>-command</B></A></DT>
<DD>

Specifies a command when user press &lt;Return&gt; in the Entry.
</DD>
</DL>
<DL><DT><A NAME="-dragenabled"><B>-dragenabled</B></A></DT>
<DD>
A boolean specifying if drag is enabled.
</DD>
</DL>
<DL><DT><A NAME="-dragendcmd"><B>-dragendcmd</B></A></DT>
<DD>

Specifies a command to be called when drag ended.
<B>dragendcmd</B> must be a command conforming to the description of the
option <B>dragendcmd</B> of <B>DragSite::<A HREF="DragSite.html#register">register</A></B>.

<BR>If <B>dragendcmd</B> is empty, the internal <I>dragend</I> command updates the entry
following the operation (<B>move</B> or <B>copy</B>) and the dragged data
(whole or selected part of the entry).

</DD>
</DL>
<DL><DT><A NAME="-dragevent"><B>-dragevent</B></A></DT>
<DD>

Specifies the number of the mouse button associated to the drag.
Must be <B>1</B>, <B>2</B> or <B>3</B>.

</DD>
</DL>
<DL><DT><A NAME="-draginitcmd"><B>-draginitcmd</B></A></DT>
<DD>

Specifies a command to be called when <B>dragevent</B> occurs on widget.
<B>draginitcmd</B> must be a command conforming to the description of the
option <B>draginitcmd</B> of <B>DragSite::<A HREF="DragSite.html#register">register</A></B>.

<BR>if <B>draginitcmd</B> is empty, the command refuse the drag if entry is empty or if
portion of text is selected and event doesn't occur above the selection. In all other cases,
the command returns:
<UL>
<LI>as the data type, the value of option <B>dragtype</B> or <I>TEXT</I> if empty,
<LI>as the operations, <I>{copy move}</I> if <B>state</B> is normal and <B>editable</B>
is true, or <I>{copy}</I> only in other cases, 
<LI>as the data, the whole content or the selected portion of the entry.
</UL>

</DD>
</DL>
<DL><DT><A NAME="-dragtype"><B>-dragtype</B></A></DT>
<DD>

Specifies an alternate type of dragged object.

</DD>
</DL>
<DL><DT><A NAME="-dropcmd"><B>-dropcmd</B></A></DT>
<DD>

Entry has a command wrapper for <I>drop</I> events. This command stops auto scrolling
and extract current position.
<BR>If <B>dropcmd</B> is not empty, it is called with the following arguments:
<UL>
<LI>the pathname of the Entry,
<LI>the pathname of the drag source,
<LI>the numeric index in the entry designated by the cursor,
<LI>the current operation,
<LI>the data type,
<LI>the data.
</UL>
and must return a value conforming to <B>dropcmd</B> option described in
<B>DropSite::<A HREF="DropSite.html#register">register</A></B>.
If <B>dropcmd</B> is empty, the wrapper updates the entry following the type of data:
<DL><DD><TABLE BORDER=0 CELLSPACING=1>
<TR><TD><I>COLOR</I> or <I>FGCOLOR</I></TD>
<TD>reconfigure the <B>foreground</B> of the Entry</TD>
<TR><TD><I>BGCOLOR</I></TD>
<TD>reconfigure the <B>background</B> of the Entry</TD>
<TR><TD><I>TEXT</I>,<BR>or any other tag</TD>
<TD>reconfigure the Entry to display the associated string.</TD>
</TABLE></DL>
and returns 1.

</DD>
</DL>
<DL><DT><A NAME="-dropenabled"><B>-dropenabled</B></A></DT>
<DD>
A boolean specifying if drop is enabled.
</DD>
</DL>
<DL><DT><A NAME="-dropovercmd"><B>-dropovercmd</B></A></DT>
<DD>

Entry has a command wrapper for <I>drag-over</I> events. This command enables auto scrolling
and position extraction during the <I>drag-over</I>.
<BR>If <B>dropovercmd</B> is empty, the wrapper accepts the drop if <B>editable</b> option is
true and <B>state</B> option is normal.
<BR>If <B>dropovercmd</B> is not empty, it is called with the following arguments:
<UL>
<LI>the pathname of the Entry,
<LI>the pathname of the drag source,
<LI>the event,
<LI>the numeric index in the entry designated by the cursor,
<LI>the current operation,
<LI>the data type,
<LI>the data.
</UL>
and must return a value conforming to <B>dropovercmd</B> option described in
<B>DropSite::<A HREF="DropSite.html#register">register</A></B>.

</DD>
</DL>
<DL><DT><A NAME="-droptypes"><B>-droptypes</B></A></DT>
<DD>

Specifies a list of accepted dropped object/operation.
See option <B>droptypes</B> of
<B>DropSite::<A HREF="DropSite.html#register">register</A></B>.
for more infromation.

Default accepts <I>FGCOLOR</I>, <I>COLOR</I>, <I>BGCOLOR</I> and <I>TEXT</I>,
all with <B>copy</B> and <B>move</B> operations.

</DD>
</DL>
<DL><DT><A NAME="-editable"><B>-editable</B></A></DT>
<DD>

Specifies whether the Entry is editable by the user. Equivalent to the <B>state</B> option
of the Tk entry widget.
</DD>
</DL>
<DL><DT><A NAME="-helptext"><B>-helptext</B></A></DT>
<DD>

Text for dynamic help. If empty, no help is available for this widget.
See also <A HREF="DynamicHelp.html">DynamicHelp</A>.
</DD>
</DL>
<DL><DT><A NAME="-helptype"><B>-helptype</B></A></DT>
<DD>
Type of dynamic help. Use <I>balloon</I> or <I>variable</I>.
See also <A HREF="DynamicHelp.html">DynamicHelp</A>.
</DD>
</DL>
<DL><DT><A NAME="-helpvar"><B>-helpvar</B></A></DT>
<DD>
Variable to use when <B>helptype</B> option is <I>variable</I>.
See also <A HREF="DynamicHelp.html">DynamicHelp</A>.
</DD>
</DL>
<DL><DT><A NAME="-show"><B>-show</B></A></DT>
<DD>

If this option is specified, then the true contents of the entry are not displayed in the
window. Instead, each character in the entry's value will be displayed as the first character
in the value of this option, such as ``*''. This is useful, for example, if the entry is to
be used to enter a password. If characters in the entry are selected and copied elsewhere, the
information copied will be what is displayed, not the true contents of the entry.
</DD>
</DL>
<DL><DT><A NAME="-state"><B>-state</B></A></DT>
<DD>

Specifies one of two states for the Entry:  <B>normal</B> or <B>disabled</B>.
In normal state the text of the Entry is displayed using the <B>foreground</B> option.
In disabled state the text of the Entry is displayed using the <B>disabledforeground</B>
option. If the entry is disabled then the value may not be changed by user input
and no insertion cursor will be displayed, even if the input focus is in the widget.
Disabled state is the same as not editable with visual effect.
</DD>
</DL>
<DL><DT><A NAME="-width"><B>-width</B></A></DT>
<DD>

Specifies an integer value indicating the desired width of the entry window, in average-size
characters of the widget's font. If the value is less than or equal to zero, the widget picks
a size just large enough to hold its current text.
</DD>
</DL>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>

Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD></DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no <I>option</I> is specified,
returns a list describing all of the available options for <I>pathName</I>.
If <I>option</I> is specified with no <I>value</I>, then the command returns a list
describing the one named <I>option</I> (this list will be identical to the corresponding
sublist of the value returned if no <I>option</I> is specified). If one or
more <I>option-value</I> pairs are specified, then the command modifies the given widget
option(s) to have the given value(s); in this case the command returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.

</DD></DL>
<DL><DT><A NAME="invoke"><I>pathName</I> <B>invoke</B></A>
</DT><DD>

Calls the command specified by the option <B>-command</B>.

</DD></DL>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




























































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/Label.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
<HTML>
<HEAD><TITLE>Label</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>Label</B>
 - Label widget with <B>state</B> option, dynamic help and drag and drop facilities
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>Label</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I>STANDARD OPTIONS</I></DT>
<DT><I>Not themed</I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-anchor">-anchor</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-background">-background or -bg</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-bitmap">-bitmap</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-borderwidth">-borderwidth or -bd</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-cursor">-cursor</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-disabledforeground">-disabledforeground</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-font">-font</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-foreground">-foreground or -fg</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-highlightbackground">-highlightbackground</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-highlightcolor">-highlightcolor</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-highlightthickness">-highlightthickness</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-image">-image</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-justify">-justify</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-padx">-padx</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-pady">-pady</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-relief">-relief</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-takefocus">-takefocus</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-text">-text</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-textvariable">-textvariable</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-wraplength">-wraplength</A></TR>
</TR>
</TABLE></DD>
<DT><I>Themed</I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-anchor">-anchor</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-background">-background or -bg</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-cursor">-cursor</A></TD></TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-font">-font</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-foreground">-foreground or -fg</A></TD>
</TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-image">-image</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-justify">-justify</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-relief">-relief</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-takefocus">-takefocus</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-text">-text</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-textvariable">-textvariable</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-wraplength">-wraplength</A></TR>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-dragenabled">-dragenabled</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-dragendcmd">-dragendcmd</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-dragevent">-dragevent</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-draginitcmd">-draginitcmd</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-dragtype">-dragtype</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-dropcmd">-dropcmd</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-dropenabled">-dropenabled</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-dropovercmd">-dropovercmd</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-droptypes">-droptypes</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-focus">-focus</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-height">-height</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-helptext">-helptext</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-helptype">-helptype</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-helpvar">-helpvar</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-name">-name</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-state">-state</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-underline">-underline</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-width">-width</A></TR>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
<DD><I>pathName</I> <A HREF="#setfocus"><B>setfocus</B></A>
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

The <B>Label</B> widget extends the default Tk label. Options have been added to provide
visual effect depending on the state of the Label, <A HREF="DynamicHelp.html">DynamicHelp</A> options, and <A HREF="DragSite.html">Drag
</A> and <A HREF="DropSite.html">Drop</A>.
</P>
<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-dragenabled"><B>-dragenabled</B></A></DT>
<DD>
A boolean specifying if drag is enabled.
</DD>
</DL>
<DL><DT><A NAME="-dragendcmd"><B>-dragendcmd</B></A></DT>
<DD>

Specifies a command to be called when drag ended.
<B>dragendcmd</B> must be a command conforming to the description of the
option <B>dragendcmd</B> of <B>DragSite::<A HREF="DragSite.html#register">register</A></B>.

</DD>
</DL>
<DL><DT><A NAME="-dragevent"><B>-dragevent</B></A></DT>
<DD>

Specifies the number of the mouse button associated to the drag.
Must be <B>1</B>, <B>2</B> or <B>3</B>.

</DD>
</DL>
<DL><DT><A NAME="-draginitcmd"><B>-draginitcmd</B></A></DT>
<DD>

Specifies a command to be called when <B>dragevent</B> occurs on widget.
<B>draginitcmd</B> must be a command conforming to the description of the
option <B>draginitcmd</B> of <B>DragSite::<A HREF="DragSite.html#register">register</A></B>.

<BR>If <B>draginitcmd</B> is empty, the internal <B>draginitcmd</B> command is used instead
and returns:
<DL><DD><TABLE BORDER=0 CELLSPACING=1>
<TR><TD valign=top><I>IMAGE&nbsp;{copy}&nbsp;&lt;image&nbsp;name&gt;</I>
<TD>if an image is displayed.
<TR><TD valign=top><I>BITMAP&nbsp;{copy}&nbsp;&lt;bitmap&nbsp;name&gt;</I>
<TD>if a bitmap is displayed.
<TR><TD valign=top><I>TEXT&nbsp;{copy}&nbsp;&lt;text&gt;</I>
<TD>if a text is displayed.
</TABLE></DL>
Note that if <B>dragtype</B> option is not empty, its value is used instead of those above.

</DD>
</DL>
<DL><DT><A NAME="-dragtype"><B>-dragtype</B></A></DT>
<DD>

Specifies an alternate type of dragged object.

</DD>
</DL>
<DL><DT><A NAME="-dropcmd"><B>-dropcmd</B></A></DT>
<DD>

Specifies a command to be called when drop occurs on the widget.
<B>dropcmd</B> must be a command conforming to the description of the
option <B>dropcmd</B> of <B>DropSite::<A HREF="DropSite.html#register">register</A></B>.

<BR>If <B>dropcmd</B> is empty, the command updates the label following the type of the data:
<DL><DD><TABLE BORDER=0 CELLSPACING=1>
<TR><TD><I>COLOR</I> or <I>FGCOLOR</I></TD>
<TD>reconfigure the <B>foreground</B> of the Label.</TD>
<TR><TD><I>BGCOLOR</I></TD>
<TD>reconfigure the <B>background</B> of the Label.</TD>
<TR><TD><I>IMAGE</I></TD>
<TD>reconfigure the Label to display the associated image.</TD>
<TR><TD><I>BITMAP</I></TD>
<TD>reconfigure the Label to display the associated bitmap.
<B>image</B> option is set to empty.</TD>
<TR><TD><I>TEXT</I>,<BR>or any other tag</TD>
<TD>reconfigure the Label to display the associated string.
<B>image</B> and <B>bitmap</B> options are set to empty.</TD>
</TABLE></DL>
and returns 1.

</DD>
</DL>
<DL><DT><A NAME="-dropenabled"><B>-dropenabled</B></A></DT>
<DD>
A boolean specifying if drop is enabled.
</DD>
</DL>
<DL><DT><A NAME="-dropovercmd"><B>-dropovercmd</B></A></DT>
<DD>

Specifies a command to be called when drag icon is over the widget.
<B>dropovercmd</B> must be a command conforming to the description of the
option <B>dropovercmd</B> of <B>DropSite::<A HREF="DropSite.html#register">register</A></B>.

<BR>If <B>dropovercmd</B> is empty, Label always accepts the drop if data type is
<I>FGCOLOR</I>, <I>COLOR</I>, <I>BGCOLOR</I>, and accepts all other data type only if
<B>state</B> is normal.

</DD>
</DL>
<DL><DT><A NAME="-droptypes"><B>-droptypes</B></A></DT>
<DD>

Specifies a list of accepted dropped object/operation.
See option <B>droptypes</B> of
<B>DropSite::<A HREF="DropSite.html#register">register</A></B>.
for more infromation.

Default accepts <I>FGCOLOR</I>, <I>COLOR</I>, <I>BGCOLOR</I>, <I>TEXT</I>, <I>BITMAP</I>
and <I>IMAGE</I>, all with <B>copy</B> and <B>move</B> operations.

</DD>
</DL>
<DL><DT><A NAME="-focus"><B>-focus</B></A></DT>
<DD>

Specifies a pathname to set the focus on for Label::<B>setfocus</B> command.

</DD>
</DL>
<DL><DT><A NAME="-height"><B>-height</B></A></DT>
<DD>

Specifies a desired height for the label.
If an image or bitmap is being displayed in the label then the value is in
screen units, for text it is in lines of text.
If this option isn't specified, the label's desired height is computed
from the size of the image or bitmap or text being displayed in it.<BR>
Option not available for <I>themed</I> widgets.
</DD>
</DL>
<DL><DT><A NAME="-helptext"><B>-helptext</B></A></DT>
<DD>

Text for dynamic help. If empty, no help is available for this widget.
See also <A HREF="DynamicHelp.html">DynamicHelp</A>.
</DD>
</DL>
<DL><DT><A NAME="-helptype"><B>-helptype</B></A></DT>
<DD>
Type of dynamic help. Use <I>balloon</I> or <I>variable</I>.
See also <A HREF="DynamicHelp.html">DynamicHelp</A>.
</DD>
</DL>
<DL><DT><A NAME="-helpvar"><B>-helpvar</B></A></DT>
<DD>
Variable to use when <B>helptype</B> option is <I>variable</I>.
See also <A HREF="DynamicHelp.html">DynamicHelp</A>.
</DD>
</DL>
<DL><DT><A NAME="-name"><B>-name</B></A></DT>
<DD>

Specifies a standard name for the label. If the option <B>*<I>name</I>Name</B> is
found in the resource database, then <B>text</B> and <B>underline</B> options
are extracted from its value.

</DD>
</DL>
<DL><DT><A NAME="-state"><B>-state</B></A></DT>
<DD>

Specifies one of two states for the Label:  <B>normal</B> or <B>disabled</B>.
In normal state the text of the Label is displayed using the <B>foreground</B> option.
In disabled state the text of the Label is displayed using the <B>disabledforeground</B> option.
</DD>
</DL>
<DL><DT><A NAME="-underline"><B>-underline</B></A></DT>
<DD>

Specifies the integer index of a character to underline in the label.
0 corresponds to the first character of the text displayed, 1 to the next character,
and so on.
<BR>The binding <B>&lt;Alt-<I>char</I>&gt;</B> is automatically set on the toplevel
of the Label to call Label::<B>setfocus</B>.

</DD>
</DL>
<DL><DT><A NAME="-width"><B>-width</B></A></DT>
<DD>

Specifies a desired width for the label.
If an image or bitmap is being displayed in the label then the value is in
screen units, for text it is in characters.
If this option isn't specified, the label's desired width is computed
from the size of the image or bitmap or text being displayed in it.

</DD>
</DL>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>

Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD></DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no <I>option</I> is specified,
returns a list describing all of the available options for <I>pathName</I>.
If <I>option</I> is specified with no <I>value</I>, then the command returns a list
describing the one named <I>option</I> (this list will be identical to the corresponding
sublist of the value returned if no <I>option</I> is specified). If one or
more <I>option-value</I> pairs are specified, then the command modifies the given widget
option(s) to have the given value(s); in this case the command returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.

</DD></DL>
<DL><DT><A NAME="setfocus"><I>pathName</I> <B>setfocus</B></A>
</DT><DD>

Set the focus on the pathname given by <B>-focus</B> option if <B>-state</B> is <I>normal</I>.

</DD></DL>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




















































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/LabelEntry.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
<HTML>
<HEAD><TITLE>LabelEntry</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>LabelEntry</B>
 - 
LabelFrame containing an Entry widget.

</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>LabelEntry</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I><A HREF="Entry.html">OPTIONS from <B>Entry</B></A></I></DT>
<DD><TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;-borderwidth or -bd</TD>
<TD>&nbsp;&nbsp;-command</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-disabledforeground</TD>
<TD>&nbsp;&nbsp;-dragenabled</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-dragendcmd</TD>
<TD>&nbsp;&nbsp;-dragevent</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-draginitcmd</TD>
<TD>&nbsp;&nbsp;-dragtype</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-dropcmd</TD>
<TD>&nbsp;&nbsp;-dropenabled</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-dropovercmd</TD>
<TD>&nbsp;&nbsp;-droptypes</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-editable</TD>
<TD>&nbsp;&nbsp;-entrybg (see <B>-background</B>)</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-entryfg (see <B>-foreground</B>)</TD>
<TD>&nbsp;&nbsp;-exportselection</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-font</TD>
<TD>&nbsp;&nbsp;-helptext</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-helptype</TD>
<TD>&nbsp;&nbsp;-helpvar</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-highlightbackground</TD>
<TD>&nbsp;&nbsp;-highlightcolor</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-highlightthickness</TD>
<TD>&nbsp;&nbsp;-insertbackground</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-insertborderwidth</TD>
<TD>&nbsp;&nbsp;-insertofftime</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-insertontime</TD>
<TD>&nbsp;&nbsp;-insertwidth</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-justify</TD>
<TD>&nbsp;&nbsp;-relief</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-selectbackground</TD>
<TD>&nbsp;&nbsp;-selectborderwidth</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-selectforeground</TD>
<TD>&nbsp;&nbsp;-show</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-state</TD>
<TD>&nbsp;&nbsp;-takefocus</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-text</TD>
<TD>&nbsp;&nbsp;-textvariable</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-width</TD>
<TD>&nbsp;&nbsp;-xscrollcommand</TD>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="LabelFrame.html">OPTIONS from <B>LabelFrame</B></A></I></DT>
<DD><TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;-background or -bg</TD>
<TD>&nbsp;&nbsp;-disabledforeground</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-foreground or -fg</TD>
<TD>&nbsp;&nbsp;-helptext</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-helptype</TD>
<TD>&nbsp;&nbsp;-helpvar</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-label (see <B>-text</B>)</TD>
<TD>&nbsp;&nbsp;-labelanchor (see <B>-anchor</B>)</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-labelfont (see <B>-font</B>)</TD>
<TD>&nbsp;&nbsp;-labelheight (see <B>-height</B>)</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-labeljustify (see <B>-justify</B>)</TD>
<TD>&nbsp;&nbsp;-labelwidth (see <B>-width</B>)</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-name</TD>
<TD>&nbsp;&nbsp;-padx</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-pady</TD>
<TD>&nbsp;&nbsp;-side</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-state</TD>
<TD>&nbsp;&nbsp;-underline</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-wraplength</TD>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#bind"><B>bind</B></A>
 ?<I>arg...</I>?
</DD>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

LabelEntry is a widget composed of <A HREF="LabelFrame.html">LabelFrame</A> widget
containing an <A HREF="Entry.html">Entry</A> widget.
Tk entry command can also be used on LabelEntry widget.

</P>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="bind"><I>pathName</I> <B>bind</B></A>
 ?<I>arg...</I>?
</DT><DD>

Set bindings on the entry widget.

</DD></DL>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>

Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD></DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no <I>option</I> is specified,
returns a list describing all of the available options for <I>pathName</I>.
If <I>option</I> is specified with no <I>value</I>, then the command returns a list
describing the one named <I>option</I> (this list will be identical to the corresponding
sublist of the value returned if no <I>option</I> is specified). If one or
more <I>option-value</I> pairs are specified, then the command modifies the given widget
option(s) to have the given value(s); in this case the command returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.

</DD></DL>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/LabelFrame.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<HTML>
<HEAD><TITLE>LabelFrame</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>LabelFrame</B>
 - Frame with a Label
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>LabelFrame</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I>STANDARD OPTIONS</I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-borderwidth">-borderwidth or -bd</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-relief">-relief</A></TR>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="Label.html">OPTIONS from <B>Label</B></A></I></DT>
<DD><TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;-anchor</TD>
<TD>&nbsp;&nbsp;-background or -bg</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-bitmap</TD>
<TD>&nbsp;&nbsp;-disabledforeground</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-focus</TD>
<TD>&nbsp;&nbsp;-font</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-foreground or -fg</TD>
<TD>&nbsp;&nbsp;-height</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-helptext</TD>
<TD>&nbsp;&nbsp;-helptype</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-helpvar</TD>
<TD>&nbsp;&nbsp;-image</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-justify</TD>
<TD>&nbsp;&nbsp;-name</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-padx</TD>
<TD>&nbsp;&nbsp;-pady</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-state</TD>
<TD>&nbsp;&nbsp;-text</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-textvariable</TD>
<TD>&nbsp;&nbsp;-underline</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-width</TD>
<TD>&nbsp;&nbsp;-wraplength</TD>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-side">-side</A></TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD>LabelFrame::<A HREF="#align"><B>align</B></A>
 ?<I>arg...</I>?
</DD>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
<DD><I>pathName</I> <A HREF="#getframe"><B>getframe</B></A>
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

LabelFrame enables user to create a frame with a
<A HREF="Label.html">Label</A> positionned at any side.
LabelFrame is used by <A HREF="ComboBox.html">ComboBox</A>
and <A HREF="SpinBox.html">SpinBox</A>.
</P>
<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-side"><B>-side (read-only)</B></A></DT>
<DD>

Specifies where to position the Label relative to the user frame: <B>top</B>, <B>bottom</B>, <B>left</B> or <B>right</B>.
</DD>
</DL>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="align">LabelFrame::<B>align</B></A>
 ?<I>arg...</I>?
</DT><DD>

This command align label of all widget given by <I>args</I> of class LabelFrame
(or "derived") by setting their width to the max one +1

</DD></DL>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>

Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD></DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no <I>option</I> is specified,
returns a list describing all of the available options for <I>pathName</I>.
If <I>option</I> is specified with no <I>value</I>, then the command returns a list
describing the one named <I>option</I> (this list will be identical to the corresponding
sublist of the value returned if no <I>option</I> is specified). If one or
more <I>option-value</I> pairs are specified, then the command modifies the given widget
option(s) to have the given value(s); in this case the command returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.

</DD></DL>
<DL><DT><A NAME="getframe"><I>pathName</I> <B>getframe</B></A>
</DT><DD>

Return the frame where the user can create any other widget.
</DD></DL>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/ListBox.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
<HTML>
<HEAD><TITLE>ListBox</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>ListBox</B>
 - ListBox widget
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>ListBox</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I>STANDARD OPTIONS</I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-background">-background or -bg</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-borderwidth">-borderwidth or -bd</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-cursor">-cursor</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-highlightbackground">-highlightbackground</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-highlightcolor">-highlightcolor</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-highlightthickness">-highlightthickness</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-relief">-relief</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-selectbackground">-selectbackground</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-selectforeground">-selectforeground</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-takefocus">-takefocus</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-xscrollcommand">-xscrollcommand</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-yscrollcommand">-yscrollcommand</A></TD>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-autofocus">-autofocus</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-deltax">-deltax</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-deltay">-deltay</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-dragenabled">-dragenabled</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-dragendcmd">-dragendcmd</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-dragevent">-dragevent</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-draginitcmd">-draginitcmd</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-dragtype">-dragtype</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-dropcmd">-dropcmd</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-dropenabled">-dropenabled</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-dropovercmd">-dropovercmd</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-dropovermode">-dropovermode</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-droptypes">-droptypes</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-height">-height</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-multicolumn">-multicolumn</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-padx">-padx</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-redraw">-redraw</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-selectfill">-selectfill</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-selectmode">-selectmode</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-width">-width</A></TD>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#bindImage"><B>bindImage</B></A>
 <I>event</I>
 <I>script</I>
</DD>
<DD><I>pathName</I> <A HREF="#bindText"><B>bindText</B></A>
 <I>event</I>
 <I>script</I>
</DD>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
<DD><I>pathName</I> <A HREF="#delete"><B>delete</B></A>
 ?<I>arg...</I>?
</DD>
<DD><I>pathName</I> <A HREF="#edit"><B>edit</B></A>
 <I>item</I>
 <I>text</I>
 ?<I>verifycmd</I>?
 ?<I>clickres</I>?
 ?<I>select</I>?
</DD>
<DD><I>pathName</I> <A HREF="#exists"><B>exists</B></A>
 <I>item</I>
</DD>
<DD><I>pathName</I> <A HREF="#index"><B>index</B></A>
 <I>item</I>
</DD>
<DD><I>pathName</I> <A HREF="#insert"><B>insert</B></A>
 <I>index</I>
 <I>item</I>
 ?<I>option value...</I>?
</DD>
<DD><I>pathName</I> <A HREF="#item"><B>item</B></A>
 <I>first</I>
 ?<I>last</I>?
</DD>
<DD><I>pathName</I> <A HREF="#itemcget"><B>itemcget</B></A>
 <I>item</I>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#itemconfigure"><B>itemconfigure</B></A>
 <I>item</I>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
<DD><I>pathName</I> <A HREF="#items"><B>items</B></A>
 ?<I>first</I>?
 ?<I>last</I>?
</DD>
<DD><I>pathName</I> <A HREF="#move"><B>move</B></A>
 <I>item</I>
 <I>index</I>
</DD>
<DD><I>pathName</I> <A HREF="#reorder"><B>reorder</B></A>
 <I>neworder</I>
</DD>
<DD><I>pathName</I> <A HREF="#see"><B>see</B></A>
 <I>item</I>
</DD>
<DD><I>pathName</I> <A HREF="#selection"><B>selection</B></A>
 <I>cmd</I>
 ?<I>arg...</I>?
</DD>
<DD><I>pathName</I> <A HREF="#xview"><B>xview</B></A>
 ?<I>arg...</I>?
</DD>
<DD><I>pathName</I> <A HREF="#yview"><B>yview</B></A>
 ?<I>arg...</I>?
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

<B>ListBox</B> widget uses canvas to display a list of items.
Each item is composed of a label with its own font and foreground attributes, and an optional
image or window. Each item is drawn in a single line, whose height is defined by the
<B>deltay</B> option, so they must have at most this height.
A item is uniquely identified by a string given at creation (by the
<B>insert</B> command). The ListBox can have one or more columns, depending on
<B>multicolumn</B> option. The user do not handle columns; the number of columns
is determined following the height of the ListBox in order to see each item vertically.

</P>
<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-autofocus"><B>-autofocus (read-only)</B></A></DT>
<DD>
    If this option is true, the listbox will take focus any time the user
    clicks in it.  Without focus, the listbox's mouse wheel bindings will
    not work properly.  The default is true.
</DD>
</DL>

<DL><DT><A NAME="-deltax"><B>-deltax</B></A></DT>
<DD>

Specifies horizontal pad between each columns.

</DD>
</DL>
<DL><DT><A NAME="-deltay"><B>-deltay</B></A></DT>
<DD>

Specifies vertical size of the items.

</DD>
</DL>
<DL><DT><A NAME="-dragenabled"><B>-dragenabled</B></A></DT>
<DD>
A boolean specifying if drag is enabled.
</DD>
</DL>
<DL><DT><A NAME="-dragendcmd"><B>-dragendcmd</B></A></DT>
<DD>

Specifies a command to be called when drag ended.
<B>dragendcmd</B> must be a command conforming to the description of the
option <B>dragendcmd</B> of <B>DragSite::<A HREF="DragSite.html#register">register</A></B>.

</DD>
</DL>
<DL><DT><A NAME="-dragevent"><B>-dragevent</B></A></DT>
<DD>

Specifies the number of the mouse button associated to the drag.
Must be <B>1</B>, <B>2</B> or <B>3</B>.

</DD>
</DL>
<DL><DT><A NAME="-draginitcmd"><B>-draginitcmd</B></A></DT>
<DD>

ListBox has a command wrapper for <I>drag-init</I> events. This command refused the drag
if no item is designated. In other cases:
<BR>If <B>draginitcmd</B> is empty, it returns:
<UL>
<LI>the value of option <B>dragtype</B> or <I>LISTBOX_ITEM</I> if empty as the data type, 
<LI><I>{move copy link}</I> as the operations, 
<LI>the item identifier as the data.
</UL>
If <B>draginitcmd</B> is not empty, it is called with the following arguments:
<UL>
<LI>the pathname of the listbox,
<LI>the identifier of the dragged item,
<LI>the toplevel created to represent dragged data.
</UL>
and must return a value conforming to <B>draginitcmd</B> option described in
<B>DragSite::<A HREF="DragSite.html#register">register</A></B>.

</DD>
</DL>
<DL><DT><A NAME="-dragtype"><B>-dragtype</B></A></DT>
<DD>

Specifies an alternate type of dragged object.

</DD>
</DL>
<DL><DT><A NAME="-dropcmd"><B>-dropcmd</B></A></DT>
<DD>

ListBox has a command wrapper for <I>drop</I> events. This command stops auto scrolling
and extract item and position.
<BR>If <B>dropcmd</B> is not empty, it is called with the following arguments:
<UL>
<LI>the pathname of the listbox,
<LI>the pathname of the drag source,
<LI>a list describing where the drop occurs. It can be:
<UL>
<LI><I>{</I><B>widget</B><I>}</I>,
<LI><I>{</I><B>item</B> <I>item}</I> or
<LI><I>{</I><B>position</B> <I>index}</I>.
</UL>
<LI>the current operation,
<LI>the data type,
<LI>the data.
</UL>

<p>
The default drop command allows for drag-and-drop within the listbox but
not to or from other widgets.
</p>

</DD>
</DL>
<DL><DT><A NAME="-dropenabled"><B>-dropenabled</B></A></DT>
<DD>
A boolean specifying if drop is enabled.
</DD>
</DL>
<DL><DT><A NAME="-dropovercmd"><B>-dropovercmd</B></A></DT>
<DD>

LsitBox has a command wrapper for <I>drag-over</I> events. This command enables auto scrolling
and position extraction during the <I>drag-over</I>.
If <B>dropovercmd</B> is not empty, the command is called with the following aguments:
<UL>
<LI>the pathname of the listbox,
<LI>the pathname of the drag source,
<LI>a list describing where the drop can occur, whose elements are:
<UL>
<LI>the string <I>widget</I> if <B>dropovertype</B> option contains <I>w</I>, else empty string.
<LI>the targeted item if drag icon points an item and <B>dropovertype</B> option contains
<I>i</I>, else empty string.
<LI>an index within two items where drag icon points to if <B>dropovertype</B> option
contains <I>p</I>, else empty string.
<LI>optionally, the preferred method if drop can occur both inside an item and between two
items. The value is <I>position</I> or <I>item</I>.
</UL>
<LI>the current operation,
<LI>the data type,
<LI>the data.
</UL>
The command must return a list with two elements:
<UL>
<LI>the drop status, conforming to those described in <B>dropovercmd</B> option of
<B>DropSite::<A HREF="DropSite.html#register">register</A></B>,
<LI>the choosen method: <I>widget</I>, <I>item</I> or <I>position</I>.
</UL>

</DD>
</DL>
<DL><DT><A NAME="-dropovermode"><B>-dropovermode</B></A></DT>
<DD>

Specifies the type of <I>drop-over</I> interaction. Must be a combination of
<B>w</B>, which specifies that drop can occurs everywhere on widget,
<B>p</B>, which specifies that drop can occurs between two items,
and <B>i</B>, which specifies that drop occurs inside items.

</DD>
</DL>
<DL><DT><A NAME="-droptypes"><B>-droptypes</B></A></DT>
<DD>

Specifies a list of accepted dropped object/operation.
See option <B>droptypes</B> of
<B>DropSite::<A HREF="DropSite.html#register">register</A></B>.
for more infromation.

<BR>Default is <I>LISTBOX_ITEM</I> with operations <B>copy</B> and <B>move</B>.

</DD>
</DL>
<DL><DT><A NAME="-height"><B>-height</B></A></DT>
<DD>

Specifies the desired height for the listbox in units of <B>deltay</B> pixels.

</DD>
</DL>
<DL><DT><A NAME="-multicolumn"><B>-multicolumn</B></A></DT>
<DD>

Specifies wether or not ListBox layouts items in order to see each one vertically.

</DD>
</DL>
<DL><DT><A NAME="-padx"><B>-padx</B></A></DT>
<DD>

Specifies distance between image or window and text of the items.

</DD>
</DL>
<DL><DT><A NAME="-redraw"><B>-redraw</B></A></DT>
<DD>

Specifies wether or not the listbox should be redrawn when entering idle.
Set it to false if you call <B>update</B> while modifying the listbox.

</DD>
</DL>

<DL><DT><A NAME="-selectfill"><B>-selectfill (read-only)</B></A></DT>
<DD>
    If true, the listbox will draw a selection rectangle that fills the
    listbox from left-to-right instead of just drawing a box around the
    selected item.  This more closely mimics the standard Tk listbox.
</DD>
</DL>

<DL><DT><A NAME="-selectmode"><B>-selectmode</B></A></DT>
<DD>

Specifies the desired selection-mode for the listbox. Must be one of
<B>none</B>, <B>single</B> or <B>multiple</B>. <B>selectmode</B> <I>single</I>
allows to select 1 item by its text or image. <B>selectmode</B> <I>multiple</I>
allows to select multiple items by their text or image. For more info on
selectmodes <I>single</I> or <I>multiple</I>, see the Tk <B>listbox</B>
command. Default value for <B>selectmode</B> is <I>none</I>.

</DD>
</DL>
<DL><DT><A NAME="-width"><B>-width</B></A></DT>
<DD>

Specifies the desired width for the listbox in units of 8 pixels.

</DD>
</DL>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="bindImage"><I>pathName</I> <B>bindImage</B></A>
 <I>event</I>
 <I>script</I>
</DT><DD>

This command associates a command to execute whenever the event
sequence given by <I>event</I> occurs on the image of a item.
The item idenfier on which the event occurs is appended to the command.

<p>
Any occurrence of <b>%W</b> in <i>script</i> is substituted with the
path of the listbox.
</p>

</DD></DL>
<DL><DT><A NAME="bindText"><I>pathName</I> <B>bindText</B></A>
 <I>event</I>
 <I>script</I>
</DT><DD>

This command associates a command to execute whenever the event
sequence given by <I>event</I> occurs on the label of a item.
The item idenfier on which the event occurs is appended to the command.

<p>
Any occurrence of <b>%W</b> in <i>script</i> is substituted with the
path of the listbox.
</p>

</DD></DL>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>

Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD></DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no <I>option</I> is specified,
returns a list describing all of the available options for <I>pathName</I>.
If <I>option</I> is specified with no <I>value</I>, then the command returns a list
describing the one named <I>option</I> (this list will be identical to the corresponding
sublist of the value returned if no <I>option</I> is specified). If one or
more <I>option-value</I> pairs are specified, then the command modifies the given widget
option(s) to have the given value(s); in this case the command returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.

</DD></DL>
<DL><DT><A NAME="delete"><I>pathName</I> <B>delete</B></A>
 ?<I>arg...</I>?
</DT><DD>

Deletes all items in <I>arg</I>. <I>arg</I> can be a list
of items or a list of list of items.
To delete all items, do <I>$pathName delete [$pathName items]</I>.

</DD></DL>
<DL><DT><A NAME="edit"><I>pathName</I> <B>edit</B></A>
 <I>item</I>
 <I>text</I>
 ?<I>verifycmd</I>?
 ?<I>clickres</I>?
 ?<I>select</I>?
</DT><DD>

Provides a way for the user to edit in place the label of an item.
<BR>The command takes the initial text as argument and does not modify the label of the
edited node, but returns an empty string if edition is canceled, or the typed text
if edition is accepted.
<BR>When editing, the user can cancel by pressing Escape, or accept by pressing Return.
<BR><I>clickres</I> specifies what to do if the user click outside the editable area.
If <I>clickres</I> is 0 (the default), the edition is canceled.
If <I>clickres</I> is 1, the edition is accepted.
In all other case, the edition continues.
<BR>If edition is accepted and <I>modifycmd</I> is not empty, then it is called with
the new text as argument and must return 1 to accept the new text, 0 to refuse it
and continue edition.
<BR><I>select</I> specifies wether or not the initial text should be selected. Default is 1.

</DD></DL>
<DL><DT><A NAME="exists"><I>pathName</I> <B>exists</B></A>
 <I>item</I>
</DT><DD>

Returns 1 if <I>item</I> exists in the listbox, else 0.

</DD></DL>
<DL><DT><A NAME="index"><I>pathName</I> <B>index</B></A>
 <I>item</I>
</DT><DD>

Returns the position of <I>item</I> in the list.

</DD></DL>
<DL><DT><A NAME="insert"><I>pathName</I> <B>insert</B></A>
 <I>index</I>
 <I>item</I>
 ?<I>option value...</I>?
</DT><DD>

<p>
Inserts a new item identified by <I>item</I> in the list at position <I>index</I>.
</p>

<p>
Any instance of <i>#auto</i> within the item name will be replaced by the
number of the item in the order of insertion.
</p>

<P>
<DL><DT><A NAME="Item-data"><B>-data</B></A></DT>
<DD>

User data associated to the item.

</DD>
</DL>
<DL><DT><A NAME="Item-fill"><B>-fill</B></A></DT>
<DD>

Specifies the foreground color of the label of the item.

</DD>
</DL>
<DL><DT><A NAME="Item-font"><B>-font</B></A></DT>
<DD>

Specifies a font for the label of the item.

</DD>
</DL>
<DL><DT><A NAME="Item-image"><B>-image</B></A></DT>
<DD>

Specifies an image to display at the left of the label of the item.
<B>window</B> option override <B>image</B>.
</DD>
</DL>
<DL><DT><A NAME="Item-indent"><B>-indent</B></A></DT>
<DD>

Specifies the amount of extra space in pixels at the left of the item.

</DD>
</DL>
<DL><DT><A NAME="Item-text"><B>-text</B></A></DT>
<DD>

Specifies the label of the item.

</DD>
</DL>
<DL><DT><A NAME="Item-window"><B>-window</B></A></DT>
<DD>

Specifies a pathname to display at the left of the label of the item.
<B>window</B> option override <B>image</B>.
</DD>
</DL>
</DD></DL>
<DL><DT><A NAME="item"><I>pathName</I> <B>item</B></A>
 <I>first</I>
 ?<I>last</I>?
</DT><DD>

<B>Its use is deprecated. Use <I>items</I> instead.</B><BR>
If <I>last</I> is omitted, returns the item at index <I>first</I> in the list, 
or an empty string if <I>first</I> refers to a non-existent element.
If <I>last</I> is specified, the command returns a list whose elements are all
of the items between <I>first</I> and <I>last</I>, inclusive. 
Both <I>first</I> and <I>last</I> may have any of the standard forms for indices.

</DD></DL>
<DL><DT><A NAME="itemcget"><I>pathName</I> <B>itemcget</B></A>
 <I>item</I>
 <I>option</I>
</DT><DD>

Returns the current value of a configuration option for the item.
<I>Option</I> may have any of the values accepted by the item creation command.

</DD></DL>
<DL><DT><A NAME="itemconfigure"><I>pathName</I> <B>itemconfigure</B></A>
 <I>item</I>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

This command is similar to the <B>configure</B> command, except that it applies to the
options for an individual item, whereas <B>configure</B> applies to the options for
the widget as a whole. <B>Options</B> may have any of the values accepted by the 
item creation widget command. If options are specified, options are modified as indicated
in the command and the command returns an empty string. If no options are specified,
returns a list describing the current options for the item.
Read-only options are not be modified.

</DD></DL>
<DL><DT><A NAME="items"><I>pathName</I> <B>items</B></A>
 ?<I>first</I>?
 ?<I>last</I>?
</DT><DD>

If <I>first</I> and <I>last</I> are omitted, returns the list of all items.
If <I>first</I> is specified and <I>last</I> omitted, returns the item at index
<I>first</I>, or an empty string if <I>first</I> refers to a non-existent element.
If <I>first</I> and <I>last</I> are specified, the command returns a list whose elements
are all of the items between <I>first</I> and <I>last</I>,
inclusive. Both <I>first</I> and <I>last</I> may have any of the standard
forms for indices.

</DD></DL>
<DL><DT><A NAME="move"><I>pathName</I> <B>move</B></A>
 <I>item</I>
 <I>index</I>
</DT><DD>

Moves <I>item</I> at position <I>index</I> in the list.

</DD></DL>
<DL><DT><A NAME="reorder"><I>pathName</I> <B>reorder</B></A>
 <I>neworder</I>
</DT><DD>

Modifies the order of items in the listbox given by <I>neworder</I>. Items that do not
appear in <I>neworder</I> are no moved.

</DD></DL>
<DL><DT><A NAME="see"><I>pathName</I> <B>see</B></A>
 <I>item</I>
</DT><DD>

Arrange the scrolling area to make <I>item</I> visible.

</DD></DL>
<DL><DT><A NAME="selection"><I>pathName</I> <B>selection</B></A>
 <I>cmd</I>
 ?<I>arg...</I>?
</DT><DD>

Modifies the list of selected items following <I>cmd</I>:
<DL>
<DT><B>clear</B>
<DD>remove all items of the selection.
<DT><B>set</B>
<DD>set the selection to all items in <I>arg</I>
<DT><B>add</B>
<DD>add all items of <I>arg</I> in the selection
<DT><B>remove</B>
<DD>remove all items of <I>arg</I> of the selection
<DT><B>get</B>
<DD>return the current selected items
</DL>

</DD></DL>
<DL><DT><A NAME="xview"><I>pathName</I> <B>xview</B></A>
 ?<I>arg...</I>?
</DT><DD>

Standard command to enable horizontal scrolling of <I>pathName</I>.

</DD></DL>
<DL><DT><A NAME="yview"><I>pathName</I> <B>yview</B></A>
 ?<I>arg...</I>?
</DT><DD>

Standard command to enable vertical scrolling of <I>pathName</I>.

</DD></DL>


<b>BINDINGS</b>

<p>
A <b>&lt;&lt;ListboxSelect&gt;&gt;</b> virtual event is generated any time the
selection in the listbox changes.
</p>

<p>
The listbox has all the standard mouse wheel bindings when it has focus.
</p>
</p>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/MainFrame.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
<HTML>
<HEAD><TITLE>MainFrame</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>MainFrame</B>
 - Manage toplevel with menu, toolbar and statusbar 
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>MainFrame</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I><A HREF="ProgressBar.html">OPTIONS from <B>ProgressBar</B></A></I></DT>
<DD><TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;-background or -bg</TD>
<TD>&nbsp;&nbsp;-progressfg (see <B>-foreground</B>)</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-progressmax (see <B>-maximum</B>)</TD>
<TD>&nbsp;&nbsp;-progresstype (see <B>-type</B>)</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-progressvar (see <B>-variable</B>)</TD>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-height">-height</A></TD></TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-menu">-menu</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-separator">-separator</A></TD></TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-textvariable">-textvariable</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-width">-width</A></TD></TR>
<TD>&nbsp;&nbsp;<A HREF="#-sizegrip">-sizegrip</A></TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#addindicator"><B>addindicator</B></A>
 ?<I>arg...</I>?
</DD>
<DD><I>pathName</I> <A HREF="#addtoolbar"><B>addtoolbar</B></A>
</DD>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
<DD><I>pathName</I> <A HREF="#getframe"><B>getframe</B></A>
</DD>
<DD><I>pathName</I> <A HREF="#getindicator"><B>getindicator</B></A>
 <I>index</I>
</DD>
<DD><I>pathName</I> <A HREF="#getmenu"><B>getmenu</B></A>
 <I>menuid</I>
</DD>
<DD><I>pathName</I> <A HREF="#gettoolbar"><B>gettoolbar</B></A>
 <I>index</I>
</DD>
<DD><I>pathName</I> <A HREF="#setmenustate"><B>setmenustate</B></A>
 <I>tag</I>
 <I>state</I>
</DD>
<DD><I>pathName</I> <A HREF="#showstatusbar"><B>showstatusbar</B></A>
 <I>name</I>
</DD>
<DD><I>pathName</I> <A HREF="#showtoolbar"><B>showtoolbar</B></A>
 <I>index</I>
 <I>bool</I>
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

MainFrame manage toplevel to have:<BR>
<UL>
<LI>simple menu creation, with automatic accelerator bindings and
<A HREF="DynamicHelp.html">DynamicHelp</A> association,</LI>
<LI>one or more toolbars that user can hide,</LI>
<LI>a status bar, displaying a user message or a menu description, and optionally a
<A HREF="ProgressBar.html">ProgressBar</A>.</LI>
</UL>
</P>
<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-height"><B>-height</B></A></DT>
<DD>

Specifies the desired height for the user frame in any of the forms acceptable to
Tk_GetPixels. If this option is less than or equal to zero (the default) then the window
will not request any size at all.
</DD>
</DL>
<DL><DT><A NAME="-menu"><B>-menu (read-only)</B></A></DT>
<DD>

This option describes the menu. This is a list whose each five elements describe
one cascade menu. It has the following form:
{<I>menuname</I> <I>tags</I> <I>menuId</I> <I>tearoff</I> <I>menuentries</I>...}
where <I>menuentries</I> is a list where each element describe one menu entry, which can be:
<UL>
<LI>for a separator:<BR>
  {<B>separator</B>}</LI>
<LI>for a command:<BR>
  {<B>command</B> <I>menuname</I> ?<I>tags</I>? ?<I>description</I>? ?<I>accelerator</I>? ?<I>option</I> <I>value</I>? ...}</LI>
<LI>for a check button:<BR>
  {<B>checkbutton</B> <I>menuname</I> ?<I>tags</I>? ?<I>description</I>? ?<I>accelerator</I>? ?<I>option</I> <I>value</I>? ...}</LI>
<LI>for a radio button:<BR>
  {<B>radiobutton</B> <I>menuname</I> ?<I>tags</I>? ?<I>description</I>? ?<I>accelerator</I> ?<I>option</I> <I>value</I>? ...}</LI>
<LI>for a cascade menu:<BR>
  {<B>cascade</B> <I>menuname</I> <I>tags</I> <I>menuId</I> <I>tearoff</I> <I>menuentries</I>}</LI>
</UL>
where:
<UL>
<LI><I>menuname</I> is the name of the menu. If it contains a &amp;, the following character
is automatically converted to the corresponding <B>-underline</B> option of <B>menu add</B>
command.</LI>
<LI><I>tags</I> is the tags list for the entry, used for enabling or disabling menu
entries with <B>MainFrame::setmenustate</B>.</LI>
<LI><I>menuId</I> is an id for the menu, from which you can get menu pathname with
 <B>MainFrame::getmenu</B>.</LI>
<LI><I>tearoff</I> specifies if menu has tearoff entry.</LI>
<LI><I>description</I> specifies a string for <A HREF=\"DynamicHelp.html\">DynamicHelp</A>.</LI>
<LI><I>accelerator</I> specifies a key sequence. It is a list of two elements, where the first
is one of <B>Shift</B>, <B>Ctrl</B>, <B>Alt</B>, <B>CtrlAlt</B>, <B>Cmd</B>,  or <B>ShiftCmd</B>, and the second as letter
(see <A HREF="#-casesensitive">-casesensitive</A> option for interpretation),  digit or
a special key name.
An accelerator string is build and corresponding binding set on the toplevel to invoke the
menu entry.</LI>
<LI><I>option value</I> specifies additionnal options for the entry (see <B>menu add</B>
command).</LI>
</UL>
Each value enclosed by ? are optional and defaulted to empty string, but must be
provided if one or more following options is not empty.
<BR>Example:
<PRE>
set descmenu {
    "&File" {} {} 0 {
        {command "&New"     {} "Create a new document"     {Ctrl n} -command Menu::new}
        {command "&Open..." {} "Open an existing document" {Ctrl o} -command Menu::open}
        {command "&Save"    open "Save the document" {Ctrl s} -command Menu::save}
        {cascade  "&Export"  {} export 0 {
            {command "Format &1" open "Export document to format 1" {} -command {Menu::export 1}}
            {command "Format &2" open "Export document to format 2" {} -command {Menu::export 2}}
        }}
        {separator}
        {cascade "&Recent files" {} recent 0 {}}
        {separator}
        {command "E&xit" {} "Exit the application" {} -command Menu::exit}
    }
    "&Options" {} {} 0 {
        {checkbutton "Toolbar" {} "Show/hide toolbar" {}
            -variable Menu::_drawtoolbar
            -command  {$Menu::_mainframe showtoolbar toolbar $Menu::_drawtoolbar}
        }
    }
}
</PRE>

</DD>
</DL>
<DL><DT><A NAME="-separator"><B>-separator (read-only)</B></A></DT>
<DD>

Specifies if separator should be drawn at the top and/or at the bottom of the user window.
Must be one of the values <B>none</B>, <B>top</B>, <B>bottom</B> or <B>both</B>.
It depends on the relief of subwidgets of user window.
</DD>
</DL>
<DL><DT><A NAME="-textvariable"><B>-textvariable</B></A></DT>
<DD>

Specifies the textvariable option for the label of the status bar.
<A HREF="DynamicHelp.html">DynamicHelp</A> description
of menu entries are mapped to this variable at the creation of the MainFrame.
If this variable is changed by MainFrame::configure, menu description will
not be available.
<BR>You change the text of the label by modifying the value of the variable.
</DD>
</DL>
<DL><DT><A NAME="-width"><B>-width</B></A></DT>
<DD>

Specifies the desired width for the user frame in any of the forms acceptable to
Tk_GetPixels. If this option is less than or equal to zero (the default) then the window
will not request any size at all.
</DD>
</DL>
<DL><DT><A NAME="-sizegrip"><B>-sizegrip (themed, read-only)</B></A></DT>
<DD>

If bool argument is true and themed mode, show a ttk sizegrip widget in the lower-right corner.
</DD>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="addindicator"><I>pathName</I> <B>addindicator</B></A>
 ?<I>arg...</I>?
</DT><DD>

Add an indicator box at the right of the status bar. Each indicator are added from left
to right. An indicator is a Tk label widget configured with option-value pair
given by ?<I>arg...</I>?. <B>-relief</B> and <B>-borderwidth</B> options are respetively
defaulted to <I>sunken</I> and 1. Returns the pathname of the created label.
</DD></DL>
<DL><DT><A NAME="addtoolbar"><I>pathName</I> <B>addtoolbar</B></A>
</DT><DD>

Add a toolbar to the MainFrame. Returns the pathname of the new window where to place
toolbar items.
</DD></DL>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>

Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD></DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no <I>option</I> is specified,
returns a list describing all of the available options for <I>pathName</I>.
If <I>option</I> is specified with no <I>value</I>, then the command returns a list
describing the one named <I>option</I> (this list will be identical to the corresponding
sublist of the value returned if no <I>option</I> is specified). If one or
more <I>option-value</I> pairs are specified, then the command modifies the given widget
option(s) to have the given value(s); in this case the command returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.

</DD></DL>
<DL><DT><A NAME="getframe"><I>pathName</I> <B>getframe</B></A>
</DT><DD>

Returns the pathname of the user window.
</DD></DL>
<DL><DT><A NAME="getindicator"><I>pathName</I> <B>getindicator</B></A>
 <I>index</I>
</DT><DD>

Returns the pathname of the <I>index</I>th added indicator.
</DD></DL>
<DL><DT><A NAME="getmenu"><I>pathName</I> <B>getmenu</B></A>
 <I>menuid</I>
</DT><DD>

Returns the pathname of the menu whose id is <I>menuid</I>.
</DD></DL>
<DL><DT><A NAME="getmenustate"><I>pathName</I> <B>getmenustate</B></A>
 <I>tag</I>
 <I>state</I>
</DT><DD>

Returns the state of the given menu <I>tag</I>.
</DD></DL>
<DL><DT><A NAME="gettoolbar"><I>pathName</I> <B>gettoolbar</B></A>
 <I>index</I>
</DT><DD>

Returns the pathname of the <I>index</I>th added toolbar.
</DD></DL>
<DL><DT><A NAME="setmenustate"><I>pathName</I> <B>setmenustate</B></A>
 <I>tag</I>
 <I>state</I>
</DT><DD>

Set the <B>-state</B> option value of all the menu entries that have the tag <I>tag</I>
to <I>state</I>.
A menu entry is disabled, if one of its associated tags have state <B>disabled</B>.

</DD></DL>
<DL><DT><A NAME="showstatusbar"><I>pathName</I> <B>showstatusbar</B></A>
 <I>name</I>
</DT><DD>

<I>name</I> is one of <B>none</B>, <B>status</B> or <B>progression</B>.
Use <B>none</B> to hide the status bar, <B>status</B> to display the label only, or
<B>progression</B> to display the label and the
<A HREF="ProgressBar.html">ProgressBar</A>.
</DD></DL>
<DL><DT><A NAME="showtoolbar"><I>pathName</I> <B>showtoolbar</B></A>
 <I>index</I>
 <I>bool</I>
</DT><DD>

Hide if <I>bool</I> is 0, or show if <I>bool</I> is 1 the <I>index</I>th added toolbar.
To prevent your toplevel from resizing while hiding/showing toolbar,
do [wm geometry $top [wm geometry $top]] when it is managed.
</DD></DL>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




























































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/MessageDlg.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
<HTML>
<HEAD><TITLE>MessageDlg</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>MessageDlg</B>
 - Message dialog box
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>MessageDlg</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I>STANDARD OPTIONS</I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-anchor">-anchor</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-font">-font</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-foreground">-foreground or -fg</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-padx">-padx</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-pady">-pady</A></TD>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="Dialog.html">OPTIONS from <B>Dialog</B></A></I></DT>
<DD><TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;-background or -bg</TD>
<TD>&nbsp;&nbsp;-cancel</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-default</TD>
<TD>&nbsp;&nbsp;-parent</TD>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-aspect">-aspect</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-buttons">-buttons</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-buttonwidth">-buttonwidth</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-icon">-icon</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-justify">-justify</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-message">-message</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-title">-title</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-type">-type</A></TD>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-width">-width</A></TD>
</TR>
</TR>
</TABLE></DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

MessageDlg provides a simple way to display a message dialog.
MessageDlg::<B>create</B> creates the message dialog, displays
it and return the index of the pressed button, or -1 if it is destroyed.
When returning, the dialog no longer exists.

</P>
<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-aspect"><B>-aspect</B></A></DT>
<DD>

Specifies a non-negative integer value indicating desired
aspect ratio for the text.  The aspect ratio is specified as
100*width/height.  100 means the text should
be as wide as it is tall, 200 means the text should
be twice as wide as it is tall, 50 means the text should
be twice as tall as it is wide, and so on.
Used to choose line length for text if <B>width</B> option
isn't specified.
Defaults to 150.

</DD>
</DL>
<DL><DT><A NAME="-buttons"><B>-buttons</B></A></DT>
<DD>

Specifies a list of buttons to display when <B>type</B> option is <I>user</I>.
If a button has a symbolic name, its associated text will be displayed.

</DD>
</DL>

<DL><DT><A NAME="-buttonwidth"><B>-buttonwidth</B></A></DT>
<DD>
    Specifies the standard width of the buttons in the dialog.
</DD>
</DL>

<DL><DT><A NAME="-icon"><B>-icon</B></A></DT>
<DD>

Specifies an icon to display. Must be one of the following: <B>error</B>, <B>info</B>,
<B>question</B> or <B>warning</B>.

</DD>
</DL>
<DL><DT><A NAME="-justify"><B>-justify</B></A></DT>
<DD>

Specifies how to justify lines of text.
Must be one of <B>left</B>, <B>center</B>, or <B>right</B>.  Defaults
to <B>left</B>.
This option works together with the <B>anchor</B>, <B>aspect</B>,
<B>padx</B>, <B>pady</B>, and <B>width</B> options to provide a variety
of arrangements of the text within the window.
The <B>aspect</B> and <B>width</B> options determine the amount of
screen space needed to display the text.
The <B>anchor</B>, <B>padx</B>, and <B>pady</B> options determine where this
rectangular area is displayed within the widget's window, and the
<B>justify</B> option determines how each line is displayed within that
rectangular region.
For example, suppose <B>anchor</B> is <B>e</B> and <B>justify</B> is
<B>left</B>, and that the message window is much larger than needed
for the text.
The the text will displayed so that the left edges of all the lines
line up and the right edge of the longest line is <B>padx</B> from
the right side of the window;  the entire text block will be centered
in the vertical span of the window.

</DD>
</DL>
<DL><DT><A NAME="-message"><B>-message</B></A></DT>
<DD>

Specifies the message to display in this message box.

</DD>
</DL>
<DL><DT><A NAME="-title"><B>-title</B></A></DT>
<DD>

Specifies a string to display as the title of the message box.
If the value is empty (the default), a default title will be set corresponding
to the <B>icon</B> option.
The default associated title is in english, and can be modified to set it in
another language by specifying the resource:
<PRE>    *MessageDlg.<I>name</I>Title:   <I>value</I></PRE>
or the equivalent tcl command:
<PRE>    option add *MessageDlg.<I>name</I>Title <I>value</I></PRE>
where <I>name</I> is the name of an icon as defined in the <B>icon</B> option.
<BR>For example, for french language, you can specify for a warning dialog:
<PRE>    option add *MessageDlg.warningTitle  "Attention"</PRE>

</DD>
</DL>
<DL><DT><A NAME="-type"><B>-type</B></A></DT>
<DD>

Specifies a set of buttons to be displayed. The following values are possible:
<DD>
<P>
<DL COMPACT>
<DT>
<B>abortretryignore</B>
<DD>
Displays three buttons whose symbolic names are <B>abort</B>,
<B>retry</B> and <B>ignore</B>.<P>
<DT>
<B>ok</B>
<DD>
Displays one button whose symbolic name is <B>ok</B>.<P>
<DT>
<B>okcancel</B>
<DD>
Displays two buttons whose symbolic names are <B>ok</B> and <B>cancel</B>.<P>
<DT>
<B>retrycancel</B>
<DD>
Displays two buttons whose symbolic names are <B>retry</B> and <B>cancel</B>.<P>
<DT>
<B>yesno</B>
<DD>
Displays two buttons whose symbolic names are <B>yes</B> and <B>no</B>.<P>
<DT>
<B>yesnocancel</B>
<DD>
Displays three buttons whose symbolic names are <B>yes</B>, <B>no</B>
and <B>cancel</B>.
<P>
<DT>
<B>user</B>
<DD>
Displays buttons of <B>-buttons</B> option.<P>
<DT>
</DL COMPACT>

</DD>
</DL>
<DL><DT><A NAME="-width"><B>-width</B></A></DT>
<DD>

Specifies the length of lines in the window.
If this option has a value greater than zero then the <B>aspect</B>
option is ignored and the <B>width</B> option determines the line
length.
If this option has a value less than or equal to zero, then
the <B>aspect</B> option determines the line length.

</DD>
</DL>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




















































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/NoteBook.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
<HTML>
<HEAD><TITLE>NoteBook</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>NoteBook</B>
 - Notebook manager widget
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>NoteBook</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I>STANDARD OPTIONS</I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-font">-font</A></TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="ArrowButton.html">OPTIONS from <B>ArrowButton</B></A></I></DT>
<DD><TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;-activebackground</TD>
<TD>&nbsp;&nbsp;-activeforeground</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-background or -bg</TD>
<TD>&nbsp;&nbsp;-borderwidth or -bd</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-disabledforeground</TD>
<TD>&nbsp;&nbsp;-foreground or -fg</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-repeatdelay</TD>
<TD>&nbsp;&nbsp;-repeatinterval</TD>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-arcradius">-arcradius</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-height">-height</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-homogeneous">-homogeneous</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-side">-side</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-tabbevelsize">-tabbevelsize</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-tabpady">-tabpady</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-width">-width</A></TD>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#bindtabs"><B>bindtabs</B></A>
 <I>event</I>
 <I>script</I>
</DD>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#compute_size"><B>compute_size</B></A>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
<DD><I>pathName</I> <A HREF="#delete"><B>delete</B></A>
 <I>page</I>
 ?<I>destroyframe</I>?
</DD>
<DD><I>pathName</I> <A HREF="#getframe"><B>getframe</B></A>
 <I>page</I>
</DD>
<DD><I>pathName</I> <A HREF="#index"><B>index</B></A>
 <I>page</I>
</DD>
<DD><I>pathName</I> <A HREF="#insert"><B>insert</B></A>
 <I>index</I>
 <I>page</I>
 ?<I>option value...</I>?
</DD>
<DD><I>pathName</I> <A HREF="#itemcget"><B>itemcget</B></A>
 <I>page</I>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#itemconfigure"><B>itemconfigure</B></A>
 <I>page</I>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
<DD><I>pathName</I> <A HREF="#move"><B>move</B></A>
 <I>page</I>
 <I>index</I>
</DD>
<DD><I>pathName</I> <A HREF="#page"><B>page</B></A>
 <I>first</I>
 ?<I>last</I>?
</DD>
<DD><I>pathName</I> <A HREF="#pages"><B>pages</B></A>
 ?<I>first</I>?
 ?<I>last</I>?
</DD>
<DD><I>pathName</I> <A HREF="#raise"><B>raise</B></A>
 ?<I>page</I>?
</DD>
<DD><I>pathName</I> <A HREF="#see"><B>see</B></A>
 <I>page</I>
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

NoteBook widget manage a set of pages and displays one of them.

</P>
<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-arcradius"><B>-arcradius</B></A></DT>
<DD>

Specifies the amount of rounding effect at the corners of a tab. This value
can be adjusted from 0 to 8 pixels with the default being 2 pixels. Usually,
small values are preferable.
</DD>
</DL>
<DL><DT><A NAME="-height"><B>-height</B></A></DT>
<DD>

Specifies the desired height for the pages. If this option is equal to zero (the default)
then the window will not request any size at all.
In this case, user may want to call NoteBook::<B>compute_size</B> to make NoteBook larger
enough to contains the largest page.
</DD>
</DL>
<DL><DT><A NAME="-homogeneous"><B>-homogeneous</B></A></DT>
<DD>

Specifies wether or not the label of the pages must have the same width.

</DD>
</DL>
<DL><DT><A NAME="-side"><B>-side</B></A></DT>
<DD>

Specifies the side where to place the label of the pages. Must be one
of <B>top</B> or <B>bottom</B>.

</DD>
</DL>
<DL><DT><A NAME="-tabbevelsize"><B>-tabbevelsize</B></A></DT>
<DD>

Specifies the amount of bevel the tabs should have. This value can be adjusted from
0 to 8 pixels with the default being 0 pixels. A zero pixel bevel is essentially rectangular
while non-zero bevel size will look trapezoidal.
</DD>
</DL>

<DL><DT><A NAME="-tabpady"><B>-tabpady</B></A></DT>
<DD>
    Specifies the padding between the text in the tab and the top and bottom
    of the tab.  Padding may be a list of two values to specify padding for
    top and bottom separately.  Padding defaults to {0 6}.
</DD>
</DL>

<DL><DT><A NAME="-width"><B>-width</B></A></DT>
<DD>

Specifies the desired width for the pages. If this option is equal to zero (the default)
then the window will not request any size at all.
In this case, user may want to call NoteBook::<B>compute_size</B> to make NoteBook larger
enough to contains the largest page.
</DD>
</DL>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="bindtabs"><I>pathName</I> <B>bindtabs</B></A>
 <I>event</I>
 <I>script</I>
</DT><DD>

This command associates a command to execute whenever the event
sequence given by <I>event</I> occurs on a tab. The page identifier on which
the event occurs is appended to the command.

</DD></DL>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>

Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD></DL>
<DL><DT><A NAME="compute_size"><I>pathName</I> <B>compute_size</B></A>
</DT><DD>

This command can be called to make the NoteBook large enough to contain the largest page.
Note that if all pages use -createcmd, they will have no requested size.

</DD></DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no <I>option</I> is specified,
returns a list describing all of the available options for <I>pathName</I>.
If <I>option</I> is specified with no <I>value</I>, then the command returns a list
describing the one named <I>option</I> (this list will be identical to the corresponding
sublist of the value returned if no <I>option</I> is specified). If one or
more <I>option-value</I> pairs are specified, then the command modifies the given widget
option(s) to have the given value(s); in this case the command returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.

</DD></DL>
<DL><DT><A NAME="delete"><I>pathName</I> <B>delete</B></A>
 <I>page</I>
 ?<I>destroyframe</I>?
</DT><DD>

Deletes the page <I>page</I>. If <I>destroyframe</I> is 1 (the default), the frame
associated to <I>page</I> is destroyed. If <I>destroyframe</I> is 0, the frame is not
destroyed and is reused by further call to <B>insert</B> with the same <I>page</I>.

</DD></DL>
<DL><DT><A NAME="getframe"><I>pathName</I> <B>getframe</B></A>
 <I>page</I>
</DT><DD>

Returns the pathname of the page <I>page</I>.

</DD></DL>
<DL><DT><A NAME="index"><I>pathName</I> <B>index</B></A>
 <I>page</I>
</DT><DD>

Return the numerical index corresponding to the item.

</DD></DL>
<DL><DT><A NAME="insert"><I>pathName</I> <B>insert</B></A>
 <I>index</I>
 <I>page</I>
 ?<I>option value...</I>?
</DT><DD>

Insert a new page idendified by <I>page</I> at position <I>index</I> in the pages list.
<I>index</I> must be numeric or <B>end</B>. The pathname of the new page is returned.

<P>
<DL><DT><A NAME="Page-createcmd"><B>-createcmd</B></A></DT>
<DD>

Specifies a command to be called the first time the page is raised.

</DD>
</DL>
<DL><DT><A NAME="Page-image"><B>-image</B></A></DT>
<DD>

Specifies an image to display for the page at the left of the label

</DD>
</DL>
<DL><DT><A NAME="Page-leavecmd"><B>-leavecmd</B></A></DT>
<DD>

Specifies a command to be called when a page is about to be leaved.
The command must return 0 if the page can not be leaved, or 1 if it can.

</DD>
</DL>
<DL><DT><A NAME="Page-raisecmd"><B>-raisecmd</B></A></DT>
<DD>

Specifies a command to be called each time the page is raised.

</DD>
</DL>
<DL><DT><A NAME="Page-state"><B>-state</B></A></DT>
<DD>

Specifies the state of the page. Must be <B>normal</B> or <B>disabled</B>.

</DD>
</DL>
<DL><DT><A NAME="Page-text"><B>-text</B></A></DT>
<DD>

Specifies a label to display for the page.

</DD>
</DL>
</DD></DL>
<DL><DT><A NAME="itemcget"><I>pathName</I> <B>itemcget</B></A>
 <I>page</I>
 <I>option</I>
</DT><DD>

Returns the current value of a configuration option for the item.
<I>Option</I> may have any of the values accepted by the item creation command.

</DD></DL>
<DL><DT><A NAME="itemconfigure"><I>pathName</I> <B>itemconfigure</B></A>
 <I>page</I>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

This command is similar to the <B>configure</B> command, except that it applies to the
options for an individual item, whereas <B>configure</B> applies to the options for
the widget as a whole. <B>Options</B> may have any of the values accepted by the 
item creation widget command. If options are specified, options are modified as indicated
in the command and the command returns an empty string. If no options are specified,
returns a list describing the current options for the item.
Read-only options are not be modified.

</DD></DL>
<DL><DT><A NAME="move"><I>pathName</I> <B>move</B></A>
 <I>page</I>
 <I>index</I>
</DT><DD>

Moves <I>page</I> tab to index <I>index</I>.

</DD></DL>
<DL><DT><A NAME="page"><I>pathName</I> <B>page</B></A>
 <I>first</I>
 ?<I>last</I>?
</DT><DD>

<B>Its use is deprecated. Use <I>pages</I> instead.</B><BR>
If <I>last</I> is omitted, returns the page at index <I>first</I>, or an empty string if
<I>first</I> refers to a non-existent element. If <I>last</I> is specified, the command
returns a list whose elements are all of the pages between <I>first</I> and <I>last</I>,
inclusive. Both <I>first</I> and <I>last</I> may have any of the standard
forms for indices.

</DD></DL>
<DL><DT><A NAME="pages"><I>pathName</I> <B>pages</B></A>
 ?<I>first</I>?
 ?<I>last</I>?
</DT><DD>

If <I>first</I> and <I>last</I> are omitted, returns the list of all pages.
If <I>first</I> is specified and <I>last</I> omitted, returns the page at index
<I>first</I>, or an empty string if <I>first</I> refers to a non-existent element.
If <I>first</I> and <I>last</I> are specified, the command returns a list whose elements
are all of the pages between <I>first</I> and <I>last</I>,
inclusive. Both <I>first</I> and <I>last</I> may have any of the standard
forms for indices.

</DD></DL>
<DL><DT><A NAME="raise"><I>pathName</I> <B>raise</B></A>
 ?<I>page</I>?
</DT><DD>

Raise the page <I>page</I>, or return the raised page if <I>page</I> is omitted.

</DD></DL>
<DL><DT><A NAME="see"><I>pathName</I> <B>see</B></A>
 <I>page</I>
</DT><DD>

Scrolls labels to make the label of the page <I>page</I> visible.

</DD></DL>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<












































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/PagesManager.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
<HTML>
<HEAD><TITLE>PagesManager</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>PagesManager</B>
 - Pages manager widget
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>PagesManager</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I>STANDARD OPTIONS</I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-background">-background</A></TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-height">-height</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-width">-width</A></TR>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#add"><B>add</B></A>
 <I>page</I>
</DD>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#compute_size"><B>compute_size</B></A>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
<DD><I>pathName</I> <A HREF="#delete"><B>delete</B></A>
 <I>page</I>
</DD>
<DD><I>pathName</I> <A HREF="#getframe"><B>getframe</B></A>
 <I>page</I>
</DD>
<DD><I>pathName</I> <A HREF="#page"><B>page</B></A>
 <I>first</I>
 ?<I>last</I>?
</DD>
<DD><I>pathName</I> <A HREF="#pages"><B>pages</B></A>
 ?<I>first</I>?
 ?<I>last</I>?
</DD>
<DD><I>pathName</I> <A HREF="#raise"><B>raise</B></A>
 ?<I>page</I>?
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

PagesManager widget manages a set of pages and displays one of them.
PagesManager does not provide any user access method, as NoteBook
does, so it can be done through a listbox, a menu, radiobutton, or
whatever.  The widget shows no pages during creation; there must be an
explicit call to <B>raise</B> to display one.

</P>
<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-height"><B>-height</B></A></DT>
<DD>

Specifies the desired height for the pages. If this option is equal to zero (the default)
then the window will not request any size at all.
In this case, user may want to call PagesManager::<B>compute_size</B> to make PagesManager
larger enough to contains the largest page.
</DD>
</DL>
<DL><DT><A NAME="-width"><B>-width</B></A></DT>
<DD>

Specifies the desired width for the pages. If this option is equal to zero (the default)
then the window will not request any size at all.
In this case, user may want to call PagesManager::<B>compute_size</B> to make PagesManager
larger enough to contains the largest page.
</DD>
</DL>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="add"><I>pathName</I> <B>add</B></A>
 <I>page</I>
</DT><DD>

Add a new page identified by <I>page</I>, which is an arbitrary
identifier.  The pathname of the new page is returned and widgets for
the page should be created with this as the parent or ancestor.
However, PagesManager manages its own geometry. <B>pack</B>,
<B>grid</B> or an equivalent should not be used with the pathname
returned by <B>add</B>.

</DD></DL>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>

Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD></DL>
<DL><DT><A NAME="compute_size"><I>pathName</I> <B>compute_size</B></A>
</DT><DD>

This command can be called to make the PagesManager large enough to contain the largest page.

</DD></DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no <I>option</I> is specified,
returns a list describing all of the available options for <I>pathName</I>.
If <I>option</I> is specified with no <I>value</I>, then the command returns a list
describing the one named <I>option</I> (this list will be identical to the corresponding
sublist of the value returned if no <I>option</I> is specified). If one or
more <I>option-value</I> pairs are specified, then the command modifies the given widget
option(s) to have the given value(s); in this case the command returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.

</DD></DL>
<DL><DT><A NAME="delete"><I>pathName</I> <B>delete</B></A>
 <I>page</I>
</DT><DD>

Deletes the page <I>page</I>.

</DD></DL>
<DL><DT><A NAME="getframe"><I>pathName</I> <B>getframe</B></A>
 <I>page</I>
</DT><DD>

Returns the pathname of the page <I>page</I>.

</DD></DL>
<DL><DT><A NAME="page"><I>pathName</I> <B>page</B></A>
 <I>first</I>
 ?<I>last</I>?
</DT><DD>

<B>Its use is deprecated. Use <I>pages</I> instead.</B><BR>
If <I>last</I> is omitted, returns the page at index <I>first</I>, or an empty string if
<I>first</I> refers to a non-existent element. If <I>last</I> is specified, the command
returns a list whose elements are all of the pages between <I>first</I> and <I>last</I>,
inclusive. Both <I>first</I> and <I>last</I> may have any of the standard
forms for indices.

</DD></DL>
<DL><DT><A NAME="pages"><I>pathName</I> <B>pages</B></A>
 ?<I>first</I>?
 ?<I>last</I>?
</DT><DD>

If <I>first</I> and <I>last</I> are omitted, returns the list of all pages.
If <I>first</I> is specified and <I>last</I> omitted, returns the page at index
<I>first</I>, or an empty string if <I>first</I> refers to a non-existent element.
If <I>first</I> and <I>last</I> are specified, the command returns a list whose elements
are all of the pages between <I>first</I> and <I>last</I>,
inclusive. Both <I>first</I> and <I>last</I> may have any of the standard
forms for indices.

</DD></DL>
<DL><DT><A NAME="raise"><I>pathName</I> <B>raise</B></A>
 ?<I>page</I>?
</DT><DD>

Raise the page <I>page</I>, or return the raised page if <I>page</I> is omitted.

</DD></DL>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<








































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/PanedWindow.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
<HTML>
<HEAD><TITLE>PanedWindow</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>PanedWindow</B>
 - Tiled layout manager widget
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>PanedWindow</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I>STANDARD OPTIONS</I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-background">-background or -bg</A></TD>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-activator">-activator</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-pad">-pad</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-side">-side</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-weights">-weights</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-width">-width</A></TD>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#add"><B>add</B></A>
 ?<I>option value...</I>?
</DD>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
<DD><I>pathName</I> <A HREF="#getframe"><B>getframe</B></A>
 <I>index</I>
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

PanedWindow is a widget that lays out children in
a vertically or horizontally tiled format.
The user can adjust the size of the panes, with a pane control sash created
between children.
</P>
<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-activator"><B>-activator (read-only)</B></A></DT>
<DD>

By default, the control sash is either a button or a line depending
upon the underlying operating system.  This sash may be explicitly set
using this option.  If set to <B>line</B> then the sash consists of
just a dividing line.  Otherwise if set to <B>button</B> then it
constists of a knob that can be dragged.

</DD>
</DL>
<DL><DT><A NAME="-pad"><B>-pad (read-only)</B></A></DT>
<DD>

Specifies additional space between the button of the sash and children.

</DD>
</DL>
<DL><DT><A NAME="-side"><B>-side (read-only)</B></A></DT>
<DD>

Specifies the side of the sash, which implies the layout: <B>top</B> or <B>bottom</B>
(horizontal layout), <B>left</B> or <B>right</B> (vertical layout).
</DD>
</DL>
<DL><DT><A NAME="-weights"><B>-weights (read-only)</B></A></DT>
<DD>

Specifies how the weights specified when adding panes should be used. Must be
<B>extra</B> or <B>available</B>. When using <I>extra</I>, only extra space is
devided among the diffferent panes relative to their weight. When using
<I>available</I>, all space is devided among the diffferent panes relative to
their weight. Default value for <B>weights</B> is <I>extra</I>.

</DD>
</DL>
<DL><DT><A NAME="-width"><B>-width (read-only)</B></A></DT>
<DD>

Specifies the width of the button of the sash.  This option is ignored
if the activator is set to <B>line</B>.

</DD>
</DL>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="add"><I>pathName</I> <B>add</B></A>
 ?<I>option value...</I>?
</DT><DD>

This command add a new pane. The new pane is placed below the previous pane for
vertical layout or at right for horizontal layout. This command returns a frame
where user can place its widget. Valid options are:
<P>
<DL><DT><A NAME="Pane-minsize"><B>-minsize</B></A></DT>
<DD>

Specifies the minimum size requested for the pane.
See the <B>grid</B> command for more information.
</DD>
</DL>
<DL><DT><A NAME="Pane-weight"><B>-weight</B></A></DT>
<DD>

Specifies the relative weight for apportioning any extra spaces among panes.
See the <B>grid</B> command for more information.
</DD>
</DL>
</DD></DL>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>

Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD></DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no <I>option</I> is specified,
returns a list describing all of the available options for <I>pathName</I>.
If <I>option</I> is specified with no <I>value</I>, then the command returns a list
describing the one named <I>option</I> (this list will be identical to the corresponding
sublist of the value returned if no <I>option</I> is specified). If one or
more <I>option-value</I> pairs are specified, then the command modifies the given widget
option(s) to have the given value(s); in this case the command returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.

</DD></DL>
<DL><DT><A NAME="getframe"><I>pathName</I> <B>getframe</B></A>
 <I>index</I>
</DT><DD>

Returns the pathname of the <I>index</I>th added pane.
</DD></DL>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




























































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/PanelFrame.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
<HTML>
<HEAD><TITLE>PanelFrame</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>PanelFrame</B>
 - Frame with a boxed title area
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>PanelFrame</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I>STANDARD OPTIONS</I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-background">-background or -bg</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-borderwidth">-borderwidth or -bd</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-text">-text</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-textvariable">-textvariable</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-font">-font</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-relief">-relief</A></TD>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-height">-height</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-width">-width</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-panelbackground">-panelbackground</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-panelforeground">-panelforeground</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-ipad">-ipad</A></TR>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>

<P>
PanelFrame creates a frame area with a boxed title area.  The boxed title
area contains a label ands allows for other items to be placed in it.  This
can serve like a mini-toolbar.
</P>

<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-height"><B>-height</B></A></DT>
<DD>
Specifies the desired height for the widget.
</DD>
<DT><A NAME="-ipad"><B>-ipad</B></A></DT>
<DD>
The spacing to place around individual panel area items.
</DD>
<DT><A NAME="-panelbackground"><B>-panelbackground</B></A></DT>
<DD>
The color for the panel area background.
Defaults to the selection highlight background color.
</DD>
<DT><A NAME="-panelforeground"><B>-panelforeground</B></A></DT>
<DD>
The color for the title text.
Defaults to the selection highlight foreground color.
</DD>
<DT><A NAME="-width"><B>-width</B></A></DT>
<DD>
Specifies the desired width for the widget.
</DD>
</DL>

<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="add"><I>pathName</I> <B>add</B></A> <B>widget</B>
 ?<I>option</I> <I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>
Add a widget to the panel. Widgets are <B>pack</B>ed in.
Possible options are:
<DL>
<DT><B>-side</B></DT>
<DD>Side to place item on (defaults to <B>right</B>).</DD>
<DT><B>-fill</B></DT>
<DD>Whether to fill space (defaults to <B>none</B>).</DD>
<DT><B>-expand</B></DT>
<DD>Whether to expand space (defaults to <B>0</B>).</DD>
<DT><B>-pad</B></DT>
<DD>Override of the widget's <B>-ipad</B> option for this item.</DD>
</DL>
</DD>
</DL>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>
Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD>
</DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no
<I>option</I> is specified, returns a list describing all of the available
options for <I>pathName</I>.  If <I>option</I> is specified with no
<I>value</I>, then the command returns a list describing the one named
<I>option</I> (this list will be identical to the corresponding sublist of
the value returned if no <I>option</I> is specified). If one or more
<I>option-value</I> pairs are specified, then the command modifies the
given widget option(s) to have the given value(s); in this case the command
returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.
</DD>
</DL>
<DL><DT><A NAME="delete"><I>pathName</I> <B>delete</B></A>
<B>widget</B> ?<I>widget</I> ...?
</DT><DD>
Delete a widget and associated state from the panel.</DD>
</DL>
<DL><DT><A NAME="getframe"><I>pathName</I> <B>getframe</B></A>
</DT><DD>
Get the frame widget for the status bar in which status bar items should be
created.</DD>
</DD>
</DL>
<DL><DT><A NAME="items"><I>pathName</I> <B>items</B></A>
</DT><DD>List of items in the status bar.</DD>
<DL>
<DL><DT><A NAME="remove"><I>pathName</I> <B>remove</B></A>
<B>widget</B> ?<I>widget</I> ...?
</DT><DD>
Remove a widget item and associated state from the panel without destroying
the item.</DD>
</DL>

</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


















































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/PasswdDlg.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
<HTML>
<HEAD><TITLE>PasswdDlg</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>PasswdDlg</B>
 - Login/Password dialog box
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>PasswdDlg</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I><A HREF="Dialog.html">OPTIONS from <B>Dialog</B></A></I></DT>
<DD><TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;-anchor</TD>
<TD>&nbsp;&nbsp;-background or -bg</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-homogeneous</TD>
<TD>&nbsp;&nbsp;-modal</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-padx</TD>
<TD>&nbsp;&nbsp;-pady</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-parent</TD>
<TD>&nbsp;&nbsp;-spacing</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-title</TD>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="LabelEntry.html">OPTIONS from <B>LabelEntry</B></A></I></DT>
<DD><TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;-background or -bg</TD>
<TD>&nbsp;&nbsp;-borderwidth or -bd</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-disabledforeground</TD>
<TD>&nbsp;&nbsp;-entrybg</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-entryfg</TD>
<TD>&nbsp;&nbsp;-exportselection</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-font</TD>
<TD>&nbsp;&nbsp;-foreground or -fg</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-helptype</TD>
<TD>&nbsp;&nbsp;-highlightbackground</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-highlightcolor</TD>
<TD>&nbsp;&nbsp;-highlightthickness</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-insertbackground</TD>
<TD>&nbsp;&nbsp;-insertborderwidth</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-insertofftime</TD>
<TD>&nbsp;&nbsp;-insertontime</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-insertwidth</TD>
<TD>&nbsp;&nbsp;-labelanchor</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-labelfont</TD>
<TD>&nbsp;&nbsp;-labelheight</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-labeljustify</TD>
<TD>&nbsp;&nbsp;-labelwidth</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-loginhelptext (see <B>-helptext</B>)</TD>
<TD>&nbsp;&nbsp;-loginhelpvar (see <B>-helpvar</B>)</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-loginlabel (see <B>-label</B>)</TD>
<TD>&nbsp;&nbsp;-logintext (see <B>-text</B>)</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-logintextvariable (see <B>-textvariable</B>)</TD>
<TD>&nbsp;&nbsp;-loginunderline (see <B>-underline</B>)</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-passwdeditable (see <B>-editable</B>)</TD>
<TD>&nbsp;&nbsp;-passwdhelptext (see <B>-helptext</B>)</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-passwdhelpvar (see <B>-helpvar</B>)</TD>
<TD>&nbsp;&nbsp;-passwdlabel (see <B>-label</B>)</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-passwdstate (see <B>-state</B>)</TD>
<TD>&nbsp;&nbsp;-passwdtext (see <B>-text</B>)</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-passwdtextvariable (see <B>-textvariable</B>)</TD>
<TD>&nbsp;&nbsp;-passwdunderline (see <B>-underline</B>)</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-relief</TD>
<TD>&nbsp;&nbsp;-selectbackground</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-selectborderwidth</TD>
<TD>&nbsp;&nbsp;-selectforeground</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-wraplength</TD>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-command">-command</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-type">-type</A></TR>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

PasswdDlg provides a simple way to display a login/password dialog.
PasswdDlg::<B>create</B> creates the dialog, displays it, and return the value of login
and password in a list, or an empty list if it is destroyed or user press cancel.
When returning, the dialog no longer exists.
<BR>Additionnal resources can be set to modify other text:
<PRE>
    *loginName     Label for login LabelEntry
    *passwordName  Label for password LabelEntry
</PRE>

</P>
<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-command"><B>-command</B></A></DT>
<DD>

Specifies a command to call when user press ok button.

</DD>
</DL>
<DL><DT><A NAME="-type"><B>-type</B></A></DT>
<DD>

Specifies a set of buttons to be displayed. The following values are possible:
<DD>
<P>
<DL COMPACT>
<DT>
<B>ok</B>
<DD>
Displays one button whose symbolic name is <B>ok</B>.<P>
<DT>
<B>okcancel</B>
<DD>
Displays two buttons whose symbolic names are <B>ok</B> and <B>cancel</B>.<P>
</DL COMPACT>

</DD>
</DL>

</DD>
</DL>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>

Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD></DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no <I>option</I> is specified,
returns a list describing all of the available options for <I>pathName</I>.
If <I>option</I> is specified with no <I>value</I>, then the command returns a list
describing the one named <I>option</I> (this list will be identical to the corresponding
sublist of the value returned if no <I>option</I> is specified). If one or
more <I>option-value</I> pairs are specified, then the command modifies the given widget
option(s) to have the given value(s); in this case the command returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.

</DD></DL>
<HR>

<ADRESS>Stephane Lavirotte <A HREF="mailto:Stephane.Lavirotte@sophia.inria.fr">(Stephane.Lavirotte@sophia.inria.fr)</A></ADRESS>

</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<












































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/ProgressBar.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
<HTML>
<HEAD><TITLE>ProgressBar</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>ProgressBar</B>
 - Progress indicator widget
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>ProgressBar</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I>STANDARD OPTIONS</I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-background">-background or -bg</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-borderwidth">-borderwidth or -bd</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-foreground">-foreground or -fg</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-orient">-orient</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-relief">-relief</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-troughcolor">-troughcolor</A></TR>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-height">-height</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-maximum">-maximum</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-type">-type</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-variable">-variable</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-width">-width</A></TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

ProgressBar widget indicates the user the progress of a lengthly operation.
It is used by <A HREF="MainFrame.html">MainFrame</A>
and <A HREF="ProgressDlg.html">ProgressDlg</A>.
</P>
<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-height"><B>-height</B></A></DT>
<DD>

Specifies the desired height for the progress indicator.
</DD>
</DL>
<DL><DT><A NAME="-maximum"><B>-maximum</B></A></DT>
<DD>

Specifies the maximum value of the variable.  This value must be
greater than zero.

</DD>
</DL>
<DL><DT><A NAME="-type"><B>-type</B></A></DT>
<DD>

Specifies the type of the ProgressBar. Must be one of <B>normal</B>,
<B>incremental</B>,  <B>infinite</B> or <B>nonincremental_infinite</B>.

<BR><BR>If <B>type</B> is <I>normal</I>, the progress indicator is drawn
proportional to the variable value and <B>maximum</B> option each time the
variable is set.

<BR><BR>If <B>type</B> is <I>incremental</I>, the value of the progress
indicator is maintained internally, and incremented each time the variable is
set by its value. The progress indicator is drawn proportional to the internal
value and
<B>maximum</B> option.

<BR><BR>If <B>type</B> is <I>infinite</I>, the value of the progress indicator
is maintained internally, and incremented each time the variable is set by its
value. The progress indicator moves from left to right if internal value
(modulo <B>maximum</B>) is less than <B>maximum</B>/2, and from right to left
if internal value is greater than <B>maximum</B>/2.

<BR><BR>If <B>type</B> is <I>nonincremental_infinite</I>, the value of the
progress indicator taken from the variable value, The progress indicator moves
from left to right if variable value (modulo <B>maximum</B>) is less than
<B>maximum</B>/2, and from right to left if internal value is greater than
<B>maximum</B>/2.

<BR><BR>See <B>-variable</B> option for special case of its value,

<BR><BR>Default value for <B>type</B> is <I>normal</I>.

</DD>
</DL>
<DL><DT><A NAME="-variable"><B>-variable</B></A></DT>
<DD>

Specifies the variable attached to the progress indicator.  Progress indicator
is updated when the value of the variable changes.  If the value of the
variable is negative, the progress indicator is not displayed (it is drawn flat
with <B>background</B> color - usefull for ProgressDlg to make it
invisible). If its value 0, progress indicator is reinitialized.

</DD>
</DL>
<DL><DT><A NAME="-width"><B>-width</B></A></DT>
<DD>

Specifies the desired width for the progress indicator.
</DD>
</DL>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>

Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD></DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no <I>option</I> is specified,
returns a list describing all of the available options for <I>pathName</I>.
If <I>option</I> is specified with no <I>value</I>, then the command returns a list
describing the one named <I>option</I> (this list will be identical to the corresponding
sublist of the value returned if no <I>option</I> is specified). If one or
more <I>option-value</I> pairs are specified, then the command modifies the given widget
option(s) to have the given value(s); in this case the command returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.

</DD></DL>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
















































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/ProgressDlg.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
<HTML>
<HEAD><TITLE>ProgressDlg</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>ProgressDlg</B>
 - Progress indicator dialog box
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>ProgressDlg</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I>STANDARD OPTIONS</I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-font">-font</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-textvariable">-textvariable</A></TR>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="Dialog.html">OPTIONS from <B>Dialog</B></A></I></DT>
<DD><TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;-background or -bg</TD>
<TD>&nbsp;&nbsp;-parent</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-separator</TD>
<TD>&nbsp;&nbsp;-title</TD>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="ProgressBar.html">OPTIONS from <B>ProgressBar</B></A></I></DT>
<DD><TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;-background or -bg</TD>
<TD>&nbsp;&nbsp;-borderwidth or -bd</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-foreground or -fg</TD>
<TD>&nbsp;&nbsp;-maximum</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-relief</TD>
<TD>&nbsp;&nbsp;-troughcolor</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-type</TD>
<TD>&nbsp;&nbsp;-variable</TD>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-command">-command</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-height">-height</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-stop">-stop</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-width">-width</A></TR>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

ProgressDlg provides a simple way to display a progress indicator dialog.
ProgressDlg::<B>create</B> creates the dialog, displays it, set a local
grab to it and immediatly return. The dialog is updated by modifying the 
value of the variable of options <B>-textvariable</B> and <B>-variable</B>.
You have to destroy the dialog after use.

</P>
<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-command"><B>-command</B></A></DT>
<DD>

Specifies a command to call when user press stop button.  Note that it
is the program's responsibility to periodically call <B>update</B> so
that button press events can be generated.

</DD>
</DL>
<DL><DT><A NAME="-height"><B>-height</B></A></DT>
<DD>

Specifies a desired height for the label in lines of text.

</DD>
</DL>
<DL><DT><A NAME="-stop"><B>-stop</B></A></DT>
<DD>

Specifies the text of the button typically used to stop process. If empty, no button will
be drawn. This can be a symbolic name.

</DD>
</DL>
<DL><DT><A NAME="-width"><B>-width</B></A></DT>
<DD>

Specifies a desired width for the label in characters.

</DD>
</DL>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>

Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD></DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no <I>option</I> is specified,
returns a list describing all of the available options for <I>pathName</I>.
If <I>option</I> is specified with no <I>value</I>, then the command returns a list
describing the one named <I>option</I> (this list will be identical to the corresponding
sublist of the value returned if no <I>option</I> is specified). If one or
more <I>option-value</I> pairs are specified, then the command modifies the given widget
option(s) to have the given value(s); in this case the command returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.

</DD></DL>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/ScrollView.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
<HTML>
<HEAD><TITLE>ScrollView</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>ScrollView</B>
 - Display the visible area of a scrolled window
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>ScrollView</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I>STANDARD OPTIONS</I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-background">-background or -bg</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-borderwidth">-borderwidth or -bd</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-cursor">-cursor</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-relief">-relief</A></TR>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-fill">-fill</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-foreground">-foreground or -fg</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-height">-height</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-width">-width</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-window">-window</A></TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

ScrollView displays the visible area of a scrolled window within
its scroll region.

</P>
<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-fill"><B>-fill</B></A></DT>
<DD>

Specifies the fill color of the rectangle.

</DD>
</DL>
<DL><DT><A NAME="-foreground"><B>-foreground</B></A></DT>
<DD>

Specifies the color of the border of the rectangle.

</DD>
</DL>
<DL><DT><A NAME="-height"><B>-height</B></A></DT>
<DD>

Specifies the desired height for the ScrollView.
</DD>
</DL>
<DL><DT><A NAME="-width"><B>-width</B></A></DT>
<DD>

Specifies the desired width for the ScrollView.
</DD>
</DL>
<DL><DT><A NAME="-window"><B>-window</B></A></DT>
<DD>

Specifies the window to view. This widget must have <B>-xscrollcommand</B> and 
<B>-yscrollcommand</B> options, and respond to <B>xview</B> and <B>yview</B> command.
In order to make ScrollView working with other scrollbar, <B>-xscrollcommand</B> and 
<B>-yscrollcommand</B> options of the widget must be set before the widget is passed to
the <B>-window</B> option of the ScrollView (for example, if the widget is handled by
a ScrolledWindow, call <B>setwidget</B> before setting <B>-window</B> option).

</DD>
</DL>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>

Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD></DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no <I>option</I> is specified,
returns a list describing all of the available options for <I>pathName</I>.
If <I>option</I> is specified with no <I>value</I>, then the command returns a list
describing the one named <I>option</I> (this list will be identical to the corresponding
sublist of the value returned if no <I>option</I> is specified). If one or
more <I>option-value</I> pairs are specified, then the command modifies the given widget
option(s) to have the given value(s); in this case the command returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.

</DD></DL>
<HR><BR><B>BINDINGS</B><BR><BR>

<DL><DT>If mouse button 1 is pressed and dragged over the ScrollView, the top left corner of
the visible area of the scrolled window is moved proportionally to the mouse displacement.
</DT></DL>
<DL><DT>If mouse button 3 is pressed over the ScrollView, the top left corner of the visible
area is proportionally set to this point.
</DT></DL>

</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/ScrollableFrame.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
<HTML>
<HEAD><TITLE>ScrollableFrame</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>ScrollableFrame</B>
 - Scrollable frame containing widget
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>ScrollableFrame</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I>STANDARD OPTIONS</I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-background">-background or -bg</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-xscrollcommand">-xscrollcommand</A></TD></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-yscrollcommand">-yscrollcommand</A></TD></TR>
</TABLE></DD>
<BR>
Themed widget (<B>Widget::theme true</B>): Options <B>-background</B> and <B>-bg</B> are not available.
Modify style <B>TFrame</B> property <B>-background</B> instead.
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-areaheight">-areaheight</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-areawidth">-areawidth</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-constrainedheight">-constrainedheight</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-constrainedwidth">-constrainedwidth</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-height">-height</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-width">-width</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-xscrollincrement">-xscrollincrement</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-yscrollincrement">-yscrollincrement</A></TR>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
<DD><I>pathName</I> <A HREF="#getframe"><B>getframe</B></A>
</DD>
<DD><I>pathName</I> <A HREF="#see"><B>see</B></A>
 <I>widget</I>
 ?<I>vert</I>?
 ?<I>horz</I>?
</DD>
<DD><I>pathName</I> <A HREF="#xview"><B>xview</B></A>
 ?<I>arg...</I>?
</DD>
<DD><I>pathName</I> <A HREF="#yview"><B>yview</B></A>
 ?<I>arg...</I>?
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

ScrollableFrame widget containing widget.

</P>
<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-areaheight"><B>-areaheight</B></A></DT>
<DD>

Specifies the height for the scrollable area. If zero, then the height
of the scrollable area is made just large enough to hold all its children.
</DD>
</DL>
<DL><DT><A NAME="-areawidth"><B>-areawidth</B></A></DT>
<DD>

Specifies the width for the scrollable area. If zero, then the width
of the scrollable area window is made just large enough to hold all its children.
</DD>
</DL>
<DL><DT><A NAME="-constrainedheight"><B>-constrainedheight</B></A></DT>
<DD>

Specifies whether or not the scrollable area should have the same height of the
scrolled window. If true, vertical scrollbar is not needed.

</DD>
</DL>
<DL><DT><A NAME="-constrainedwidth"><B>-constrainedwidth</B></A></DT>
<DD>

Specifies whether or not the scrollable area should have the same width of the
scrolled window. If true, horizontal scrollbar is not needed.

</DD>
</DL>
<DL><DT><A NAME="-height"><B>-height</B></A></DT>
<DD>

Specifies the desired height for the window in pixels.

</DD>
</DL>
<DL><DT><A NAME="-width"><B>-width</B></A></DT>
<DD>

Specifies the desired width for the window in pixels.

</DD>
</DL>
<DL><DT><A NAME="-xscrollincrement"><B>-xscrollincrement</B></A></DT>
<DD>

See <B>xscrollincrement</B> option of <B>canvas</B> widget.

</DD>
</DL>
<DL><DT><A NAME="-yscrollincrement"><B>-yscrollincrement</B></A></DT>
<DD>

See <B>yscrollincrement</B> option of <B>canvas</B> widget.

</DD>
</DL>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>

Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD></DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no <I>option</I> is specified,
returns a list describing all of the available options for <I>pathName</I>.
If <I>option</I> is specified with no <I>value</I>, then the command returns a list
describing the one named <I>option</I> (this list will be identical to the corresponding
sublist of the value returned if no <I>option</I> is specified). If one or
more <I>option-value</I> pairs are specified, then the command modifies the given widget
option(s) to have the given value(s); in this case the command returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.

</DD></DL>
<DL><DT><A NAME="getframe"><I>pathName</I> <B>getframe</B></A>
</DT><DD>

Return the pathname of the scrolled frame where widget should be created.

</DD></DL>
<DL><DT><A NAME="see"><I>pathName</I> <B>see</B></A>
 <I>widget</I>
 ?<I>vert</I>?
 ?<I>horz</I>?
</DT><DD>

Arrange scrollable area to make <I>widget</I> visible in the window.
<I>vert</I> and <I>horz</I> specify which part of <I>widget</I> must be preferably
visible, in case where <I>widget</I> is too tall or too large to be entirely visible.
<I>vert</I> must be <B>top</B> (the default) or <B>bottom</B>,
and <I>horz</I> must be <B>left</B> (the default) or <B>right</B>.
If <I>vert</I> or <I>horz</I> is not a valid value, area is not scrolled in this direction.

</DD></DL>
<DL><DT><A NAME="xview"><I>pathName</I> <B>xview</B></A>
 ?<I>arg...</I>?
</DT><DD>

Standard command to enable horizontal scrolling of <I>pathName</I>.

</DD></DL>
<DL><DT><A NAME="yview"><I>pathName</I> <B>yview</B></A>
 ?<I>arg...</I>?
</DT><DD>

Standard command to enable vertical scrolling of <I>pathName</I>.

</DD></DL>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/ScrolledWindow.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
<HTML>
<HEAD><TITLE>ScrolledWindow</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>ScrolledWindow</B>
 - Generic scrolled widget
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>ScrolledWindow</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I>STANDARD OPTIONS</I></DT>
<DT><I>Not themed</I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-background">-background or -bg</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-borderwidth">-borderwidth or -bd</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-relief">-relief</A></TR>
</TABLE></DD>
<DT><I>Themed</I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-borderwidth">-borderwidth or -bd</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-relief">-relief</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;(<B>-bg</B> has no effect)</TD>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-auto">-auto</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-ipad">-ipad</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-managed">-managed</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-scrollbar">-scrollbar</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-sides">-sides</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-size">-size</A></TR>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
<DD><I>pathName</I> <A HREF="#getframe"><B>getframe</B></A>
</DD>
<DD><I>pathName</I> <A HREF="#setwidget"><B>setwidget</B></A>
 <I>widget</I>
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

ScrolledWindow enables user to create easily a widget with its scrollbar.
Scrollbars are created by ScrolledWindow and scroll commands are automatically associated to
a scrollable widget with <B>ScrolledWindow::setwidget</B>.
</P>
<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-auto"><B>-auto</B></A></DT>
<DD>

Specifies the desired auto managed scrollbar:
<LI><B>none</B> means scrollbar are always drawn
<LI><B>horizontal</B> means horizontal scrollbar is drawn as needed
<LI><B>vertical</B> means vertical scrollbar is drawn as needed
<LI><B>both</B> means horizontal and vertical scrollbars are drawn as needed (default value)
</DD>
</DL>
<DL><DT><A NAME="-ipad"><B>-ipad (read-only)</B></A></DT>
<DD>

Padding in pixels between client widget and scrollbars.
Default value: <B>1</B>.
</DD>
</DL>
<DL><DT><A NAME="-managed"><B>-managed (read-only)</B></A></DT>
<DD>

If true, scrollbar are managed during creation, so their size are included in the requested size of the
ScrolledWindow. If false, they are not.
Default value: <B>true</B>.
</DD>
</DL>
<DL><DT><A NAME="-scrollbar"><B>-scrollbar</B></A></DT>
<DD>

Specifies the desired scrollbar: <B>none</B>, <B>horizontal</B>, <B>vertical</B>
or <B>both</B> (default value).
</DD>
</DL>
<DL><DT><A NAME="-sides"><B>-sides (read-only)</B></A></DT>
<DD>

Side of the scrollbars.
Possible values are: <B>ne</B>, <B>en</B>, <B>nw</B>, <B>wn</B>, <B>se</B> (default value), <B>es</B>, <B>sw</B>, <B>ws</B>.
</DD>
</DL>
<DL><DT><A NAME="-size"><B>-size (read-only)</B></A></DT>
<DD>

Size of the scrollbars in pixels.
Use </B>0</B> for standard size (default value).<BR>
This option has no effect if widget is <I>themed</I>.
</DD>
</DL>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>

Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD></DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no <I>option</I> is specified,
returns a list describing all of the available options for <I>pathName</I>.
If <I>option</I> is specified with no <I>value</I>, then the command returns a list
describing the one named <I>option</I> (this list will be identical to the corresponding
sublist of the value returned if no <I>option</I> is specified). If one or
more <I>option-value</I> pairs are specified, then the command modifies the given widget
option(s) to have the given value(s); in this case the command returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.

</DD></DL>
<DL><DT><A NAME="getframe"><I>pathName</I> <B>getframe</B></A>
</DT><DD>

Return the pathname of the frame where the scrolled widget should be created. This command
is no longer needed. You can directly create the scrolled widget as the child
of <I>pathName</I>.
</DD></DL>
<DL><DT><A NAME="setwidget"><I>pathName</I> <B>setwidget</B></A>
 <I>widget</I>
</DT><DD>

Associate <I>widget</I> to the the scrollbars. <I>widget</I> becomes
managed by the ScrolledWindow.  The user should not attempt to manage
<I>widget</I> until it is no longer managed by the ScrolledWindow.
<I>widget</I> must be a scrollable widget, i.e. have the options
<B>xscrollcommand</B>/<B>yscrollcommand</B> and the command <B>xview</B>/<B>yview</B>,
such as canvas or text.
</DD></DL>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/SelectColor.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
<HTML>
<HEAD><TITLE>SelectColor</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>SelectColor</B>
 - Color selection widget
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>SelectColor</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-color">-color</A></td>
<TD>&nbsp;&nbsp;<A HREF="#-parent">-parent</A></td>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-placement">-placement</A></td>
<TD>&nbsp;&nbsp;<A HREF="#-title">-title</A></td>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-type">-type</A></td>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
<DD>SelectColor::<A HREF="#dialog"><B>dialog</B></A>
 <I>pathName</I>
 <I>?option value ...?</I>
</DD>
<DD>SelectColor::<A HREF="#menu"><B>menu</B></A>
 <I>pathName</I>
 <I>placement</I>
 <I>?option value ...?</I>
</DD>
<DD>SelectColor::<A HREF="#setcolor"><B>setcolor</B></A>
 <I>index</I>
 <I>color</I>
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

SelectColor provides a simple way to select color. It can be displayed
as a dialog box or as a menubutton.

</P>
<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-color"><B>-color</B></A></DT>
<DD>

Specifies the color value of the widget.

</DD>
</DL>
<DL><DT><A NAME="-parent"><B>-parent</B></A></DT>
<DD>

Parent of the Dialog. Dialog is centered in its parent. If empty, it is centered in
root window.
</DD>
</DL>
<DL><DT><A NAME="-placement"><B>-placement</B></A></DT>
<DD>

Where to place the <i>popup</i> color dialog when displaying it.
Must be any of: <b>at</b>, <b>center</b>, <b>left</b>,
<b>right</b>, <b>above</b>, or <b>below</b>.  If <i>-parent</i> is specified,
placement will be in relation to the parent widget.
</DD>
</DL>
<DL><DT><A NAME="-title"><B>-title</B></A></DT>
<DD>

Title of the Dialog toplevel.

</DD>
</DL>
<DL><DT><A NAME="-type"><B>-type (read-only)</B></A></DT>
<DD>

Specifies the type of the SelectColor widget. Must be <B>dialog</B> or
<B>popup</B>.  <BR>If <B>type</B> option is <I>dialog</I>,
SelectColor::<B>create</B> directly creates the dialog, displays it and
return an empty string if cancel button is pressed or if dialog is destroyed,
and the selected color if ok button is pressed. In all cases, dialog is
destroyed.  <BR>If <B>type</B> option is <I>popup</I>,
SelectColor::<B>create</B> creates a small, popup dialog with a small set of
predefined colors and a button to activate a full color dialog.

</DD>
</DL>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>

Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD></DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no <I>option</I> is specified,
returns a list describing all of the available options for <I>pathName</I>.
If <I>option</I> is specified with no <I>value</I>, then the command returns a list
describing the one named <I>option</I> (this list will be identical to the corresponding
sublist of the value returned if no <I>option</I> is specified). If one or
more <I>option-value</I> pairs are specified, then the command modifies the given widget
option(s) to have the given value(s); in this case the command returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.

</DD></DL>
<DL><DT><A NAME="dialog">SelectColor::<B>dialog</B></A>
 <I>pathName</I>
 <I>?option value ...?</I>
</DT><DD>

Creates a dialog for the user to select a custom color.

</DD></DL>

<DL><DT><A NAME="dialog">SelectColor::<B>menu</B></A>
 <I>pathName</I>
 <I>placement</I>
 <I>?option value ...?</I>
</DT><DD>

Creates a small, popup dialog for the user to select from a predefined list
of colors with an additional button to display a full color dialog.

<p>
<i>placement</i> can be any of <b>at</b>, <b>center</b>, <b>left</b>,
<b>right</b>, <b>above</b>, or <b>below</b>.  If <i>-parent</i> is specified,
placement will be in relation to the parent widget.
</p>

</DD></DL>

</DD></DL>
<DL><DT><A NAME="setcolor">SelectColor::<B>setcolor</B></A>
 <I>index</I>
 <I>color</I>
</DT><DD>

Set the value of user predefined color at index <I>index</I> to <I>color</I>.
<I>index</I> must be between 0 and 10.

</DD></DL>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<








































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/SelectFont.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
<HTML>
<HEAD><TITLE>SelectFont</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>SelectFont</B>
 - Font selection widget
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>SelectFont</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I>STANDARD OPTIONS</I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-background">-background or -bg</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-font">-font</A></TR>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-command">-command</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-initialcolor">-initialcolor</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-nosizes">-nosizes</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-parent">-parent</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-sampletext">-sampletext</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-title">-title</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-type">-type</A></TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
<DD>SelectFont::<A HREF="#loadfont"><B>loadfont</B></A>
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

SelectFont provides a simple way to choose font. It can be displayed
as a dialog box or as a toolbar.
<BR>Textual items in Dialog box uses <B>-name</B> options so they
can be translated to any language. Symbolic name used are
<B>ok</B>, <B>cancel</B>, <B>font</B>, <B>size</B>, <B>style</B>,
<B>bold</B>, <B>italic</B>, <B>underline</B> and <B>overstrike</B>.

</P>
<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-command"><B>-command</B></A></DT>
<DD>

Specifies a command to call when user select a new font when SelectFont <B>type</B>
option is <I>toolbar</I>.

</DD>
</DL>
<DL><DT><A NAME="-initialcolor"><B>-initialcolor</B></A></DT>
<DD>

If specified, add an additional button that lets the user pick a
color.  This option is ignored if <B>type</B> is <I>toolbar</I>.
</DD>
</DL>
<DL><DT><A NAME="-nosizes"><B>-nosizes</B></A></DT>
<DD>

If true, don't show the listbox containing valid font sizes.  This
option is ignored if <B>type</B> is <I>toolbar</I>.
</DD>
</DL>
<DL><DT><A NAME="-parent"><B>-parent</B></A></DT>
<DD>

Parent of the Dialog. Dialog is centered in its parent. If empty, it is centered in
root window.
</DD>
</DL>
<DL><DT><A NAME="-sampletext"><B>-sampletext</B></A></DT>
<DD>

Specifies the text displayed in the preview area.

</DD>
</DL>
<DL><DT><A NAME="-title"><B>-title</B></A></DT>
<DD>

Title of the Dialog toplevel.

</DD>
</DL>
<DL><DT><A NAME="-type"><B>-type</B></A></DT>
<DD>

Specifies the type of the SelectFont widget. Must be <B>dialog</B> or <B>toolbar</B>.
<BR>If <B>type</B> option is <I>dialog</I>, SelectFont::<B>create</B> directly creates the 
dialog, displays it and return an empty string if cancel button is
pressed or if dialog is destroyed, and the selected font (and color
if <B>initialcolor</B>) if ok button is pressed. In all cases, dialog
is destroyed.
<BR>If <B>type</B> option is <I>toolbar</I>, SelectFont::<B>create</B> returns the pathname
of the widget created.

</DD>
</DL>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>

Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD></DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no <I>option</I> is specified,
returns a list describing all of the available options for <I>pathName</I>.
If <I>option</I> is specified with no <I>value</I>, then the command returns a list
describing the one named <I>option</I> (this list will be identical to the corresponding
sublist of the value returned if no <I>option</I> is specified). If one or
more <I>option-value</I> pairs are specified, then the command modifies the given widget
option(s) to have the given value(s); in this case the command returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.

</DD></DL>
<DL><DT><A NAME="loadfont">SelectFont::<B>loadfont</B></A>
</DT><DD>

Load the font available in the system.

</DD></DL>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
















































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/Separator.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<HTML>
<HEAD><TITLE>Separator</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>Separator</B>
 - 3D separator widget
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>Separator</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I>STANDARD OPTIONS</I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-background">-background or -bg</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-orient">-orient</A></TR>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-relief">-relief</A></TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

Separator is a widget that display an horizontal or vertical 3-D line.

</P>
<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-relief"><B>-relief</B></A></DT>
<DD>

Specifies the relief of the Separator. Must be <B>groove</B> (the default) or <B>ridge</B>.

</DD>
</DL>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>

Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD></DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no <I>option</I> is specified,
returns a list describing all of the available options for <I>pathName</I>.
If <I>option</I> is specified with no <I>value</I>, then the command returns a list
describing the one named <I>option</I> (this list will be identical to the corresponding
sublist of the value returned if no <I>option</I> is specified). If one or
more <I>option-value</I> pairs are specified, then the command modifies the given widget
option(s) to have the given value(s); in this case the command returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.

</DD></DL>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


























































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/SpinBox.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
<HTML>
<HEAD><TITLE>SpinBox</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>SpinBox</B>
 - SpinBox widget
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>SpinBox</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I><A HREF="ArrowButton.html">OPTIONS from <B>ArrowButton</B></A></I></DT>
<DD><TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;-background or -bg</TD>
<TD>&nbsp;&nbsp;-disabledforeground</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-foreground or -fg</TD>
<TD>&nbsp;&nbsp;-repeatdelay</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-repeatinterval</TD>
<TD>&nbsp;&nbsp;-state</TD>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="Entry.html">OPTIONS from <B>Entry</B></A></I></DT>
<DD><TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;-command</TD>
<TD>&nbsp;&nbsp;-disabledforeground</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-dragenabled</TD>
<TD>&nbsp;&nbsp;-dragendcmd</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-dragevent</TD>
<TD>&nbsp;&nbsp;-draginitcmd</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-dragtype</TD>
<TD>&nbsp;&nbsp;-dropcmd</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-dropenabled</TD>
<TD>&nbsp;&nbsp;-dropovercmd</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-droptypes</TD>
<TD>&nbsp;&nbsp;-editable</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-entrybg (see <B>-background</B>)</TD>
<TD>&nbsp;&nbsp;-entryfg (see <B>-foreground</B>)</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-exportselection</TD>
<TD>&nbsp;&nbsp;-font</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-helptext</TD>
<TD>&nbsp;&nbsp;-helptype</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-helpvar</TD>
<TD>&nbsp;&nbsp;-highlightbackground</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-highlightcolor</TD>
<TD>&nbsp;&nbsp;-highlightthickness</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-insertbackground</TD>
<TD>&nbsp;&nbsp;-insertborderwidth</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-insertofftime</TD>
<TD>&nbsp;&nbsp;-insertontime</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-insertwidth</TD>
<TD>&nbsp;&nbsp;-justify</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-selectbackground</TD>
<TD>&nbsp;&nbsp;-selectborderwidth</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-selectforeground</TD>
<TD>&nbsp;&nbsp;-show</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-state</TD>
<TD>&nbsp;&nbsp;-takefocus</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-text</TD>
<TD>&nbsp;&nbsp;-textvariable</TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;-width</TD>
<TD>&nbsp;&nbsp;-xscrollcommand</TD>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-modifycmd">-modifycmd</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-range">-range</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-values">-values</A></TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#bind"><B>bind</B></A>
 ?<I>arg...</I>?
</DD>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
<DD><I>pathName</I> <A HREF="#getvalue"><B>getvalue</B></A>
</DD>
<DD><I>pathName</I> <A HREF="#setvalue"><B>setvalue</B></A>
 <I>index</I>
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

SpinBox widget enables the user to select a value among a list given by the <B>values</B>
option or a set of values defined by a mininum, a maximum and an increment.
Notice that <B>range</B> option defines a list of values, so <B>getvalue</B> and
<B>setvalue</B> work with both values and range.

</P>
<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-modifycmd"><B>-modifycmd</B></A></DT>
<DD>

Specifies a Tcl command called when the user modify the value of the SpinBox.
</DD>
</DL>
<DL><DT><A NAME="-range"><B>-range</B></A></DT>
<DD>

Specifies a list of three intergers (or real) describing the minimum, maximum and increment
of the SpinBox.
</DD>
</DL>
<DL><DT><A NAME="-values"><B>-values</B></A></DT>
<DD>

Specifies the values accepted by the SpinBox. This option takes precedence over
<B>range</B> option.
</DD>
</DL>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="bind"><I>pathName</I> <B>bind</B></A>
 ?<I>arg...</I>?
</DT><DD>

Set bindings on the entry widget.

</DD></DL>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>

Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD></DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no <I>option</I> is specified,
returns a list describing all of the available options for <I>pathName</I>.
If <I>option</I> is specified with no <I>value</I>, then the command returns a list
describing the one named <I>option</I> (this list will be identical to the corresponding
sublist of the value returned if no <I>option</I> is specified). If one or
more <I>option-value</I> pairs are specified, then the command modifies the given widget
option(s) to have the given value(s); in this case the command returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.

</DD></DL>
<DL><DT><A NAME="getvalue"><I>pathName</I> <B>getvalue</B></A>
</DT><DD>

Returns the index of the current text of the SpinBox in the list of values,
or -1 if it doesn't match any value.

</DD></DL>
<DL><DT><A NAME="setvalue"><I>pathName</I> <B>setvalue</B></A>
 <I>index</I>
</DT><DD>

Set the text of the SpinBox to the value indicated by <I>index</I> in the list of values.
<I>index</I> may be specified in any of the following forms:
<P>
<DL COMPACT>
<DT>
<B>last</B>
<DD>
Specifies the last element of the list of values.
<DT><B>first</B>
<DD>
Specifies the first element of the list of values.
<DT>
<B>next</B>
<DD>
Specifies the element following the current (ie returned by <B>getvalue</B>) in the list
of values.
<DT><B>previous</B>
<DD>
Specifies the element preceding the current (ie returned by <B>getvalue</B>) in the list
of values.
<DT>
@<I>number</I>
<DD>
Specifies the integer index in the list of values.
</DL>

</DD></DL>
<HR><BR><B>BINDINGS</B><BR><BR>

When Entry of the SpinBox has the input focus, it has the following bindings, in addition
to the default Entry bindings:
<UL>
<LI>Page up set the value of the SpinBox to the last value.
<LI>Page down set the value of the SpinBox to the first value.
<LI>Arrow up set the value of the SpinBox to the next value.
<LI>Arrow down set the value of the SpinBox to the previous value.
</UL>

</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




















































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/StatusBar.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
<HTML>
<HEAD><TITLE>StatusBar</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>StatusBar</B>
 - status bar widget
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>StatusBar</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I>STANDARD OPTIONS</I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-background">-background or -bg</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-borderwidth">-borderwidth or -bd</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-foreground">-foreground or -fg</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-orient">-orient</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-relief">-relief</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-troughcolor">-troughcolor</A></TR>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-height">-height</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-showresize">-showresize</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-ipad">-ipad</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-pad">-pad</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-width">-width</A>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>

<P>
StatusBar widget is a simple container widget with a corner resize control,
meant to be placed at the bottom of a toplevel dialog.
</P>

<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-height"><B>-height</B></A></DT>
<DD>
Specifies the desired height for the widget.
</DD>
</DL>
<DL><DT><A NAME="-showresize"><B>-showresize</B></A></DT>
<DD>
Specifies whether to show the corner resize control.
</DD>
</DL>
<DL><DT><A NAME="-pad"><B>-pad</B></A></DT>
<DD>
The spacing to place around the status bar.
</DD>
</DL>
<DL><DT><A NAME="-ipad"><B>-ipad</B></A></DT>
<DD>
The spacing to place around individual status bar items.
</DD>
</DL>
<DL><DT><A NAME="-width"><B>-width</B></A></DT>
<DD>
Specifies the desired width for the widget.
</DD>
</DL>

<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="add"><I>pathName</I> <B>add</B></A> <B>widget</B>
 ?<I>option</I> <I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>
Add a widget to the status bar. Possible options are:
<DL>
<DT><B>-weight</B></DT>
<DD>Weighting of this item for resizing (passed to <B>grid</B>).</DD>
<DT><B>-separator</B></DT>
<DD>Whether to use a separator for this item.</DD>
<DT><B>-sticky</B></DT>
<DD>Passed on to grid.</DD>
<DT><B>-pad</B></DT>
<DD>Override of the widget's <B>-ipad</B> option for this item.</DD>
</DL>
</DD>
</DL>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>
Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD>
</DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no
<I>option</I> is specified, returns a list describing all of the available
options for <I>pathName</I>.  If <I>option</I> is specified with no
<I>value</I>, then the command returns a list describing the one named
<I>option</I> (this list will be identical to the corresponding sublist of
the value returned if no <I>option</I> is specified). If one or more
<I>option-value</I> pairs are specified, then the command modifies the
given widget option(s) to have the given value(s); in this case the command
returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.
</DD>
</DL>
<DL><DT><A NAME="delete"><I>pathName</I> <B>delete</B></A>
<B>widget</B> ?<I>widget</I> ...?
</DT><DD>
Delete a widget and associated state from the status bar.</DD>
</DL>
<DL><DT><A NAME="getframe"><I>pathName</I> <B>getframe</B></A>
</DT><DD>
Get the frame widget for the status bar in which status bar items should be
created.</DD>
</DD>
</DL>
<DL><DT><A NAME="items"><I>pathName</I> <B>items</B></A>
</DT><DD>List of items in the status bar.</DD>
<DL>

</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/TitleFrame.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
<HTML>
<HEAD><TITLE>TitleFrame</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>TitleFrame</B>
 - Frame with a title
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>TitleFrame</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I>STANDARD OPTIONS</I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-background">-background or -bg</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-borderwidth">-borderwidth or -bd</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-font">-font</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-foreground">-foreground or -fg</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-relief">-relief</A></TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-text">-text</A></TR>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-baseline">-baseline</A></TR>
<TD>&nbsp;&nbsp;<A HREF="#-ipad">-ipad</A></TR>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-side">-side</A></TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
<DD><I>pathName</I> <A HREF="#getframe"><B>getframe</B></A>
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

TitleFrame enables user to create a frame with a title like XmFrame Motif widget.
</P>
<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-baseline"><B>-baseline</B></A></DT>
<DD>

Specifies the vertical alignment of the title: <B>top</B>, <B>center</B> or <B>bottom</B>.
</DD>
</DL>
<DL><DT><A NAME="-ipad"><B>-ipad</B></A></DT>
<DD>

Specifies a pad between the border of the frame and the user frame.
The value is in screen units.
</DD>
</DL>
<DL><DT><A NAME="-side"><B>-side</B></A></DT>
<DD>

Specifies the horizontal alignment of the title: <B>left</B>, <B>center</B> or <B>right</B>.
</DD>
</DL>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>

Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD></DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no <I>option</I> is specified,
returns a list describing all of the available options for <I>pathName</I>.
If <I>option</I> is specified with no <I>value</I>, then the command returns a list
describing the one named <I>option</I> (this list will be identical to the corresponding
sublist of the value returned if no <I>option</I> is specified). If one or
more <I>option-value</I> pairs are specified, then the command modifies the given widget
option(s) to have the given value(s); in this case the command returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.

</DD></DL>
<DL><DT><A NAME="getframe"><I>pathName</I> <B>getframe</B></A>
</DT><DD>

Return the frame where the user can create any other widget.
</DD></DL>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






















































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/Tree.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
<HTML>
<HEAD><TITLE>Tree</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>Tree</B>
 - Tree widget
</DD></DL>
<DL>
<DT><I>CREATION</I></DT>
<DD><A HREF="#descr"><B>Tree</B></A> <I>pathName</I> ?<I>option value...</I>?</DD>
</DL>
<DL>
<DT><I>STANDARD OPTIONS</I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-background">-background or -bg</A></TD>
<TD>&nbsp;&nbsp;<A HREF="options.htm#M-borderwidth">-borderwidth or -bd</A></TD>
</TR>
<TR>
    <TD>&nbsp;&nbsp;<A HREF="options.htm#M-cursor">-cursor</A></TD>
    <TD>&nbsp;&nbsp;<A HREF="options.htm#M-highlightbackground">-highlightbackground</A></TD>
</TR>
<TR>
    <TD>&nbsp;&nbsp;<A HREF="options.htm#M-highlightcolor">-highlightcolor</A></TD>
    <TD>&nbsp;&nbsp;<A HREF="options.htm#M-highlightthickness">-highlightthickness</A></TD>
</TR>
<TR>
    <TD>&nbsp;&nbsp;<A HREF="options.htm#M-relief">-relief</A></TD>
    <TD>&nbsp;&nbsp;<A HREF="options.htm#M-selectbackground">-selectbackground</A></TD>
</TR>
<TR>
    <TD>&nbsp;&nbsp;<A HREF="options.htm#M-selectforeground">-selectforeground</A></TD>
    <TD>&nbsp;&nbsp;<A HREF="options.htm#M-takefocus">-takefocus</A></TD>
</TR>
<TR>
    <TD>&nbsp;&nbsp;<A HREF="options.htm#M-xscrollcommand">-xscrollcommand</A></TD>
    <TD>&nbsp;&nbsp;<A HREF="options.htm#M-yscrollcommand">-yscrollcommand</A></TD>
</TR>
</TABLE></DD>
</DL>
<DL>
<DT><I><A HREF="#wso">WIDGET-SPECIFIC OPTIONS</A></I></DT>
<DD><TABLE CELLSPACING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-closecmd">-closecmd</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-crossfill">-crossfill</A></TD>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-crossclosebitmap">-crossclosebitmap</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-crosscloseimage">-crosscloseimage</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-crossopenbitmap">-crossopenbitmap</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-crossopenimage">-crossopenimage</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-deltax">-deltax</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-deltay">-deltay</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-dragenabled">-dragenabled</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-dragendcmd">-dragendcmd</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-dragevent">-dragevent</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-draginitcmd">-draginitcmd</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-dragtype">-dragtype</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-dropcmd">-dropcmd</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-dropenabled">-dropenabled</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-dropovercmd">-dropovercmd</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-dropovermode">-dropovermode</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-droptypes">-droptypes</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-height">-height</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-linesfill">-linesfill</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-linestipple">-linestipple</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-opencmd">-opencmd</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-padx">-padx</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-redraw">-redraw</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-selectcommand">-selectcommand</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-selectfill">-selectfill</A></TD>
</TR>
<TR>
<TD>&nbsp;&nbsp;<A HREF="#-showlines">-showlines</A></TD>
<TD>&nbsp;&nbsp;<A HREF="#-width">-width</A></TD>
</TR>
</TABLE></DD>
</DL>

<DL>
<DT><I><A HREF="#wc">WIDGET COMMAND</A></I></DT>
<DD><I>pathName</I> <A HREF="#bindArea"><B>bindArea</B></A>
 <I>event</I>
 <I>script</I>
</DD>
<DD><I>pathName</I> <A HREF="#bindImage"><B>bindImage</B></A>
 <I>event</I>
 <I>script</I>
</DD>
<DD><I>pathName</I> <A HREF="#bindText"><B>bindText</B></A>
 <I>event</I>
 <I>script</I>
</DD>
<DD><I>pathName</I> <A HREF="#cget"><B>cget</B></A>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#closetree"><B>closetree</B></A>
 <I>node</I>
</DD>
<DD><I>pathName</I> <A HREF="#configure"><B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
<DD><I>pathName</I> <A HREF="#delete"><B>delete</B></A>
 ?<I>arg...</I>?
</DD>
<DD><I>pathName</I> <A HREF="#edit"><B>edit</B></A>
 <I>node</I>
 <I>text</I>
 ?<I>verifycmd</I>?
 ?<I>clickres</I>?
 ?<I>select</I>?
</DD>
<DD><I>pathName</I> <A HREF="#exists"><B>exists</B></A>
 <I>node</I>
</DD>
<DD><I>pathName</I> <A HREF="#find"><B>find</B></A>
 <I>findinfo</I>
 ?<I>confine</I>?
</DD>
<DD><I>pathName</I> <A HREF="#index"><B>index</B></A>
 <I>node</I>
</DD>
<DD><I>pathName</I> <A HREF="#insert"><B>insert</B></A>
 <I>index</I>
 <I>parent</I>
 <I>node</I>
 ?<I>option value...</I>?
</DD>
<DD><I>pathName</I> <A HREF="#itemcget"><B>itemcget</B></A>
 <I>node</I>
 <I>option</I>
</DD>
<DD><I>pathName</I> <A HREF="#itemconfigure"><B>itemconfigure</B></A>
 <I>node</I>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DD>
<DD><I>pathName</I> <A HREF="#line"><B>line</B></A>
 <I>node</I>
</DD>
<DD><I>pathName</I> <A HREF="#move"><B>move</B></A>
 <I>parent</I>
 <I>node</I>
 <I>index</I>
</DD>
<DD><I>pathName</I> <A HREF="#nodes"><B>nodes</B></A>
 <I>node</I>
 ?<I>first</I>?
 ?<I>last</I>?
</DD>
<DD><I>pathName</I> <A HREF="#opentree"><B>opentree</B></A>
 <I>node</I>
</DD>
<DD><I>pathName</I> <A HREF="#parent"><B>parent</B></A>
 <I>node</I>
</DD>
<DD><I>pathName</I> <A HREF="#reorder"><B>reorder</B></A>
 <I>node</I>
 <I>neworder</I>
</DD>
<DD><I>pathName</I> <A HREF="#see"><B>see</B></A>
 <I>node</I>
</DD>
<DD><I>pathName</I> <A HREF="#selection"><B>selection</B></A>
 <I>cmd</I>
 ?<I>arg...</I>?
</DD>
<DD><I>pathName</I> <A HREF="#toggle"><B>toggle</B></A>
 <I>node</I>
</DD>
<DD><I>pathName</I> <A HREF="#visible"><B>visible</B></A>
 <I>node</I>
</DD>
<DD><I>pathName</I> <A HREF="#xview"><B>xview</B></A>
 ?<I>arg...</I>?
</DD>
<DD><I>pathName</I> <A HREF="#yview"><B>yview</B></A>
 ?<I>arg...</I>?
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

<B>Tree</B> widget uses canvas to display a hierarchical list of items (called nodes).
Each node is composed of a label with its own font and foreground attributes, and an optional
image or window. Each node can have a list of subnodes, which can be collapsed or expanded.
Each node is drawn in a single line, whose height is defined by the
<B>deltay</B> option, so they must have at most this height.
A node is uniquely identified by a string given at creation (by the
<B>insert</B> command). The node named <I>root</I> is the root of
the tree and is not drawn.
The tree structure is directly maintained by the widget.

</P>
<BR><HR WIDTH="50%"><BR>
<B><A NAME="wso">WIDGET-SPECIFIC OPTIONS</A></B><BR>
<DL><DT><A NAME="-closecmd"><B>-closecmd</B></A></DT>
<DD>

Specifies a command to be called when user close a node. The
closed node is appended to the command.

</DD>
</DL>

<DL>
    <DT><A NAME="-crossfill"><B>-crossfill</B></A></DT>
    <DD>
    Specifies a foreground color for the cross bitmap.
    </DD>
</DL>

<DL><DT><A NAME="-crossclosebitmap"><B>-crossclosebitmap</B></A></DT>
<DD>
    Specifies a bitmap to be displayed in place of the standard cross
    when a node is closed.
</DD>
</DL>

<DL><DT><A NAME="-crosscloseimage"><B>-crosscloseimage</B></A></DT>
<DD>
    Specifies an image to be displayed in place of the standard cross
    when a node is closed.  Overrides the -crossclosebitmap option.
</DD>
</DL>

<DL><DT><A NAME="-crossopenbitmap"><B>-crossopenbitmap</B></A></DT>
<DD>
    Specifies a bitmap to be displayed in place of the standard cross
    when a node is open.
</DD>
</DL>

<DL><DT><A NAME="-crossopenimage"><B>-crossopenimage</B></A></DT>
<DD>
    Specifies an image to be displayed in place of the standard cross
    when a node is open.  Overrides the -crossopenbitmap option.
</DD>
</DL>

<DL><DT><A NAME="-deltax"><B>-deltax</B></A></DT>
<DD>

Specifies horizontal indentation between a node and its children.

</DD>
</DL>
<DL><DT><A NAME="-deltay"><B>-deltay</B></A></DT>
<DD>

Specifies vertical size of the nodes.

</DD>
</DL>
<DL><DT><A NAME="-dragenabled"><B>-dragenabled</B></A></DT>
<DD>
A boolean specifying if drag is enabled.
</DD>
</DL>
<DL><DT><A NAME="-dragendcmd"><B>-dragendcmd</B></A></DT>
<DD>

Specifies a command to be called when drag ended.
<B>dragendcmd</B> must be a command conforming to the description of the
option <B>dragendcmd</B> of <B>DragSite::<A HREF="DragSite.html#register">register</A></B>.

</DD>
</DL>
<DL><DT><A NAME="-dragevent"><B>-dragevent</B></A></DT>
<DD>

Specifies the number of the mouse button associated to the drag.
Must be <B>1</B>, <B>2</B> or <B>3</B>.

</DD>
</DL>
<DL><DT><A NAME="-draginitcmd"><B>-draginitcmd</B></A></DT>
<DD>

Tree has a command wrapper for <I>drag-init</I> events. This command refused the drag
if no node is designated. In other cases:
<BR>If <B>draginitcmd</B> is empty, it returns:
<UL>
<LI>the value of option <B>dragtype</B> or <I>TREE_NODE</I> if empty as the data type, 
<LI><I>{copy move link}</I> as the operations, 
<LI>the node identifier as the data.
</UL>
If <B>draginitcmd</B> is not empty, it is called with the following arguments:
<UL>
<LI>the pathname of the tree,
<LI>the identifier of the dragged node,
<LI>the toplevel created to represent dragged data.
</UL>
and must return a value conforming to <B>draginitcmd</B> option described in
<B>DragSite::<A HREF="DragSite.html#register">register</A></B>.

</DD>
</DL>
<DL><DT><A NAME="-dragtype"><B>-dragtype</B></A></DT>
<DD>

Specifies an alternate type of dragged object.

</DD>
</DL>
<DL><DT><A NAME="-dropcmd"><B>-dropcmd</B></A></DT>
<DD>

Tree has a command wrapper for <I>drop</I> events. This command stops auto scrolling
and extract node and position.
<BR>If <B>dropcmd</B> is not empty, it is called with the following arguments:
<UL>
<LI>the pathname of the tree,
<LI>the pathname of the drag source,
<LI>a list describing where the drop occurs. It can be:
<UL>
<LI><I>{</I><B>widget</B><I>}</I>,
<LI><I>{</I><B>node</B> <I>node}</I> or
<LI><I>{</I><B>position</B> <I>node index}</I>.
</UL>
<LI>the current operation,
<LI>the data type,
<LI>the data.
</UL>


</DD>
</DL>
<DL><DT><A NAME="-dropenabled"><B>-dropenabled</B></A></DT>
<DD>
A boolean specifying if drop is enabled.
</DD>
</DL>
<DL><DT><A NAME="-dropovercmd"><B>-dropovercmd</B></A></DT>
<DD>

Tree has a command wrapper for <I>drag-over</I> events. This command enables auto scrolling
and position extraction during the <I>drag-over</I>.
If <B>dropovercmd</B> is not empty, the command is called with the following aguments:
<UL>
<LI>the pathname of the tree,
<LI>the pathname of the drag source,
<LI>a list describing where the drop can occur, whose elements are:
<UL>
<LI>the string <I>widget</I> if <B>dropovertype</B> option contains <I>w</I>, else empty string.
<LI>the targeted node if drag icon points a node and <B>dropovertype</B> option contains <I>n</I>, else empty string.
<LI>a list containing a node and the position within the children of the node where drag 
icon points to if <B>dropovertype</B> option contains <I>p</I>, else empty string.
<LI>optionally, the preferred method if drop can occur both inside a node and between two
nodes. The value is <I>position</I> or <I>node</I>.
</UL>
<LI>the current operation,
<LI>the data type,
<LI>the data.
</UL>
The command must return a list with two elements:
<UL>
<LI>the drop status, conforming to those described in <B>dropovercmd</B> option of
<B>DropSite::<A HREF="DropSite.html#register">register</A></B>,
<LI>the choosen method: <I>widget</I>, <I>node</I> or <I>position</I>.
</UL>

</DD>
</DL>
<DL><DT><A NAME="-dropovermode"><B>-dropovermode</B></A></DT>
<DD>

Specifies the type of <I>drop-over</I> interaction. Must be a combination of
<B>w</B>, which specifies that drop can occurs everywhere on widget,
<B>p</B>, which specifies that drop can occurs between two nodes,
and <B>n</B>, which specifies that drop occurs inside nodes.

</DD>
</DL>
<DL><DT><A NAME="-droptypes"><B>-droptypes</B></A></DT>
<DD>

Specifies a list of accepted dropped object/operation.
See option <B>droptypes</B> of
<B>DropSite::<A HREF="DropSite.html#register">register</A></B>.
for more infromation.

<BR>Default is <I>TREE_NODE</I> with operations <B>copy</B> and <B>move</B>.

</DD>
</DL>
<DL><DT><A NAME="-height"><B>-height</B></A></DT>
<DD>

Specifies the desired height for the tree in units of <B>deltay</B> pixels.

</DD>
</DL>
<DL><DT><A NAME="-linesfill"><B>-linesfill</B></A></DT>
<DD>

Specifies a foreground color for the lines between nodes.

</DD>
</DL>
<DL><DT><A NAME="-linestipple"><B>-linestipple</B></A></DT>
<DD>

Specifies a stipple bitmap for the lines between nodes.

</DD>
</DL>
<DL><DT><A NAME="-opencmd"><B>-opencmd</B></A></DT>
<DD>

Specifies a command to be called when the user opens a node. The name
of the opened node is appended to the command.

</DD>
</DL>
<DL><DT><A NAME="-padx"><B>-padx</B></A></DT>
<DD>

Specifies distance between image or window and text of the nodes.

</DD>
</DL>
<DL><DT><A NAME="-redraw"><B>-redraw</B></A></DT>
<DD>

Specifies wether or not the tree should be redrawn when entering idle.
Set it to false if you call <B>update</B> while modifying the tree.

</DD>
</DL>
<DL><DT><A NAME="-selectcommand"><B>-selectcommand</B></A></DT>
<DD>

Specifies a command to be called when the selection is changed. The
path of the tree widget and the selected nodes are appended to the
command.

</DD>
</DL>

<DL><DT><A NAME="-selectfill"><B>-selectfill</B></A></DT>
<DD>
    If true, the selection box will be drawn across the entire tree from
    left-to-right instead of just around the item text.
</DD>
</DL>

<DL><DT><A NAME="-showlines"><B>-showlines</B></A></DT>
<DD>

Specifies whether or not lines should be drawn between nodes.

</DD>
</DL>
<DL><DT><A NAME="-width"><B>-width</B></A></DT>
<DD>

Specifies the desired width for the tree in units of 8 pixels.

</DD>
</DL>
<HR WIDTH="50%"><BR>

<B><A NAME="nodes">NODE NAMES</A></B><BR>
<p>
Certain special characters in node names are automatically substituted
by the tree during operation.  These characters are <b>&amp; | ^ !</b>.
They are all substituted with a <b>_</b> character.  This is only to
avoid errors because the characters are special to the tree widget.
</p>

<B><A NAME="wc">WIDGET COMMAND</A></B><BR>
<DL><DT><A NAME="bindArea"><I>pathName</I> <B>bindArea</B></A>
 <I>event</I>
 <I>script</I>
</DT><DD>

This command associates a command to execute whenever the event
sequence given by <I>event</I> occurs anywhere within the Tree area.
</DD></DL>
<DL><DT><A NAME="bindImage"><I>pathName</I> <B>bindImage</B></A>
 <I>event</I>
 <I>script</I>
</DT><DD>

This command associates a command to execute whenever the event
sequence given by <I>event</I> occurs on the image of a node.
The node idenfier on which the event occurs is appended to the command and may be used to manipulate the tree (e.g. don't use <B>%W</B>).

<P>
If <B>-selectfill</B> is given, an eventual binding of the background box by <B>bindText</B> is overwritten.
</P>
</DD></DL>
<DL><DT><A NAME="bindText"><I>pathName</I> <B>bindText</B></A>
 <I>event</I>
 <I>script</I>
</DT><DD>

This command associates a command to execute whenever the event
sequence given by <I>event</I> occurs on the label of a node.
The node idenfier on which the event occurs is appended to the command and may be used to manipulate the tree (e.g. don't use <B>%W</B>).

<P>
If <B>-selectfill</B> is given, an eventual binding of the background box by <B>bindImage</B> is overwritten.
</P>
</DD></DL>
<DL><DT><A NAME="cget"><I>pathName</I> <B>cget</B></A>
 <I>option</I>
</DT><DD>

Returns the current value of the configuration option given by <I>option</I>.
<I>Option</I> may have any of the values accepted by the creation command.
</DD></DL>
<DL><DT><A NAME="closetree"><I>pathName</I> <B>closetree</B></A> <I>node</I>
?<I>recurse</I>?
</DT><DD>

This command close all the subtree given by <I>node</I>. Recurse
through the tree starting at <I>node</I> and set <B>open</B> option to 0
depending on <I>recurse</I>. Default value of <I>recurse</I> is <I>true</I>.

</DD></DL>
<DL><DT><A NAME="configure"><I>pathName</I> <B>configure</B></A>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

Query or modify the configuration options of the widget. If no <I>option</I> is
specified, returns a list describing all of the available options for
<I>pathName</I>.  If <I>option</I> is specified with no <I>value</I>, then the
command returns a list describing the one named <I>option</I> (this list will
be identical to the corresponding sublist of the value returned if no
<I>option</I> is specified). If one or more <I>option-value</I> pairs are
specified, then the command modifies the given widget option(s) to have the
given value(s); in this case the command returns an empty string.
<I>Option</I> may have any of the values accepted by the creation command.
Read-only options are not be modified.

</DD></DL>
<DL><DT><A NAME="delete"><I>pathName</I> <B>delete</B></A>
 ?<I>arg...</I>?
</DT><DD>

Deletes all nodes (and children of them) in <I>arg</I>. <I>arg</I> can be a list
of nodes or a list of list of nodes.
To delete all the tree, do <I>$pathName delete [$pathName nodes root]</I>.

</DD></DL>
<DL><DT><A NAME="edit"><I>pathName</I> <B>edit</B></A>
 <I>node</I>
 <I>text</I>
 ?<I>verifycmd</I>?
 ?<I>clickres</I>?
 ?<I>select</I>?
</DT><DD>

Provides a way for the user to edit in place the label of a node. This is
possible only if <I>node</I> is visible (all its parents are open).
<BR>The command takes the initial text as argument and does not modify the label of the
edited node, but returns an empty string if edition is canceled, or the typed text
if edition is accepted.
<BR>When editing, the user can cancel by pressing Escape, or accept by pressing Return.
<BR><I>clickres</I> specifies what to do if the user click outside the editable area.
If <I>clickres</I> is 0 (the default), the edition is canceled.
If <I>clickres</I> is 1, the edition is accepted.
In all other case, the edition continues.
<BR>If edition is accepted and <I>modifycmd</I> is not empty, then it is called with
the new text as argument and must return 1 to accept the new text, 0 to refuse it
and continue edition.
<BR><I>select</I> specifies wether or not the initial text should be selected. Default is 1.

</DD></DL>
<DL><DT><A NAME="exists"><I>pathName</I> <B>exists</B></A>
 <I>node</I>
</DT><DD>

Returns whether or not <I>node</I> exists in the tree.

</DD></DL>
<DL><DT><A NAME="find"><I>pathName</I> <B>find</B></A>
 <I>findinfo</I>
 ?<I>confine</I>?
</DT><DD>

<p>
Returns the node given by the position <I>findinfo</I>.
<I>findinfo</I> can take the form of a pixel position <I>@x,y</I> or
of the line number of a currently visible Tree node.  The first line
of the Tree has the value of zero.
</p>

<p>
If <I>confine</I> is non-empty, then confine <I>findinfo</I> to only
match pixel positions for the area consumed by Tree labels, not just
anywhere on their lines.  (<I>confine</I> has no effect if
<I>findinfo</I> is a line number.)
</p>

</DD></DL>
<DL><DT><A NAME="index"><I>pathName</I> <B>index</B></A>
 <I>node</I>
</DT><DD>

Returns the position of <I>node</I> in its parent.

</DD></DL>
<DL><DT><A NAME="insert"><I>pathName</I> <B>insert</B></A>
 <I>index</I>
 <I>parent</I>
 <I>node</I>
 ?<I>option value...</I>?
</DT><DD>

<p>
Inserts a new node identified by <I>node</I> in the children list of
<I>parent</I> at position <I>index</I>.
</p>

<p>
Any instance of <i>#auto</i> within the node name will be replaced by the
number of the item in the order of insertion.  The non-printable characters
\1 to \5 are reserved for internal use and should not be present in node
names.
</p>


<P>
<DL><DT><A NAME="Node-anchor"><B>-anchor</B></A></DT>
<DD>
    Specifies the anchor of the image or window of the node.  Defaults to w.
</DD>
</DL>

<DL><DT><A NAME="Node-data"><B>-data</B></A></DT>
<DD>

User data associated to the node.

</DD>
</DL>
<DL><DT><A NAME="-deltax"><B>-deltax</B></A></DT>
<DD>

Specifies the horizontal indentation of the node.  If the value is -1, the
node will be drawn with the deltax for the entire tree.

</DD>
</DL>
<DL><DT><A NAME="Node-drawcross"><B>-drawcross</B></A></DT>
<DD>

Specifies how the cross used to expand or collapse the children of a node
should be drawn. 
Must be one of <B>auto</B>, <B>always</B> or <B>never</B>.
<BR>If <B>auto</B>, the cross is drawn only if the node has children.
If <B>always</B>, the cross is always drawn.
If <B>never</B>, the cross is never drawn.
To maintain compatibility with older versions of this widget,
<B>allways</B> is a deprecated synonym to <B>always</B>.

</DD>
</DL>
<DL><DT><A NAME="Node-fill"><B>-fill</B></A></DT>
<DD>

Specifies the foreground color of the label of the node.

</DD>
</DL>
<DL><DT><A NAME="Node-font"><B>-font</B></A></DT>
<DD>

Specifies a font for the label of the node.

</DD>
</DL>
<DL><DT><A NAME="-helpcmd"><B>-helpcmd</B></A></DT>
<DD>

If specified, refers to a command to execute to get the help text to display.
The command must return a string to display.
If the command returns an empty string, no help is displayed. 
See also <A HREF="DynamicHelp.html">DynamicHelp</A>.
</DD>
</DL>
<DL><DT><A NAME="-helptext"><B>-helptext</B></A></DT>
<DD>

Text for dynamic help.
See also <A HREF="DynamicHelp.html">DynamicHelp</A>.
</DD>
</DL>
<DL><DT><A NAME="-helptype"><B>-helptype</B></A></DT>
<DD>
Type of dynamic help. Use <I>balloon</I> or <I>variable</I>.
See also <A HREF="DynamicHelp.html">DynamicHelp</A>.
</DD>
</DL>
<DL><DT><A NAME="-helpvar"><B>-helpvar</B></A></DT>
<DD>
Variable to use when <B>helptype</B> option is <I>variable</I>.
See also <A HREF="DynamicHelp.html">DynamicHelp</A>.
</DD>
</DL>
<DL><DT><A NAME="Node-image"><B>-image</B></A></DT>
<DD>

Specifies an image to display at the left of the label of the node.
<B>window</B> option override <B>image</B>.
</DD>
</DL>
<DL><DT><A NAME="Node-open"><B>-open</B></A></DT>
<DD>

Specifies wether or not the children of the node should be drawn.

</DD>
</DL>
<DL><DT><A NAME="-padx"><B>-padx</B></A></DT>
<DD>

Specifies the distance between image or window and the text of the node.  If
the value is -1, the node will be drawn with the padx for the entire tree.

</DD>
</DL>
<DL><DT><A NAME="Node-selectable"><B>-selectable</B></A></DT>
<DD>

Specifies if the node can be selected or not.

</DD>
</DL>
<DL><DT><A NAME="Node-text"><B>-text</B></A></DT>
<DD>

Specifies the label of the node.

</DD>
</DL>
<DL><DT><A NAME="Node-window"><B>-window</B></A></DT>
<DD>

Specifies a pathname to display at the left of the label of the node.
<B>window</B> option override <B>image</B>.
</DD>
</DL>
</DD></DL>
<DL><DT><A NAME="itemcget"><I>pathName</I> <B>itemcget</B></A>
 <I>node</I>
 <I>option</I>
</DT><DD>

Returns the current value of a configuration option for the item.
<I>Option</I> may have any of the values accepted by the item creation command.

</DD></DL>
<DL><DT><A NAME="itemconfigure"><I>pathName</I> <B>itemconfigure</B></A>
 <I>node</I>
 ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
</DT><DD>

This command is similar to the <B>configure</B> command, except that it applies to the
options for an individual item, whereas <B>configure</B> applies to the options for
the widget as a whole. <B>Options</B> may have any of the values accepted by the 
item creation widget command. If options are specified, options are modified as indicated
in the command and the command returns an empty string. If no options are specified,
returns a list describing the current options for the item.
Read-only options are not be modified.

</DD></DL>
<DL><DT><A NAME="line"><I>pathName</I> <B>line</B></A>
 <I>node</I>
</DT><DD>

<p>
Returns the line number where <I>node</I> was drawn.  If the node is
not visible then return -1.  The first line of the tree has the value
of 0.
</p>

</DD></DL>
<DL><DT><A NAME="move"><I>pathName</I> <B>move</B></A>
 <I>parent</I>
 <I>node</I>
 <I>index</I>
</DT><DD>

Moves <I>node</I> to the children list of <I>parent</I> at position <I>index</I>.
<I>parent</I> can not be a descendant of <I>node</I>.

</DD></DL>
<DL><DT><A NAME="nodes"><I>pathName</I> <B>nodes</B></A>
 <I>node</I>
 ?<I>first</I>?
 ?<I>last</I>?
</DT><DD>

Returns parts of the children of <I>node</I>, following <I>first</I> and <I>last</I>.<BR>
If <I>first</I> and <I>last</I> are omitted, returns the list of all children.
If <I>first</I> is specified and <I>last</I> omitted, returns the child at index
<I>first</I>, or an empty string if <I>first</I> refers to a non-existent element.
If <I>first</I> and <I>last</I> are specified, the command returns a list whose elements
are all of the children between <I>first</I> and <I>last</I>,
inclusive. Both <I>first</I> and <I>last</I> may have any of the standard
forms for indices.

</DD></DL>
<DL><DT><A NAME="opentree"><I>pathName</I> <B>opentree</B></A> <I>node</I> ?<I>recurse</I>?

</DT><DD>

This command open all the subtree given by <I>node</I>. Recurse through the
tree starting at <I>node</I> and set <B>open</B> option to 1 depending on value
of <I>recurse</I>. Default value of <I>recurse</I> is <I>true</I>.

</DD></DL>
<DL><DT><A NAME="parent"><I>pathName</I> <B>parent</B></A>
 <I>node</I>
</DT><DD>

Returns the parent of <I>node</I>.

</DD></DL>
<DL><DT><A NAME="reorder"><I>pathName</I> <B>reorder</B></A>
 <I>node</I>
 <I>neworder</I>
</DT><DD>

Modifies the order of children of <I>node</I> given by <I>neworder</I>. Children of
<I>node</I> that do not appear in <I>neworder</I> are no moved.

</DD></DL>
<DL><DT><A NAME="see"><I>pathName</I> <B>see</B></A>
 <I>node</I>
</DT><DD>

Arrange the scrolling area to make <I>node</I> visible.

</DD></DL>
<DL><DT><A NAME="selection"><I>pathName</I> <B>selection</B></A>
 <I>cmd</I>
 ?<I>arg...</I>?
</DT><DD>

Modifies the list of selected nodes following <I>cmd</I>:
<DL>
<DT><B>add</B>
<DD>Adds all nodes in <I>arg</I> to the selection.
<DT><B>clear</B>
<DD>Removes all nodes from the selection.
<DT><B>get</B>
<DD>Returns a list containing the indices of current selected nodes.
<DT><B>includes</B>
<DD>Tests if the specified node is selected. Returns true if the answer is yes, and false else.
<DT><B>range</B>
<DD>Sets the selection to all nodes between the two specified ones.
<DT><B>remove</B>
<DD>Removes all nodes in <I>arg</I> from the selection.
<DT><B>set</B>
<DD>Sets the selection to all nodes in <I>arg</I>.
<DT><B>toggle</B>
<DD>Toggles the selection status of all nodes in <I>arg</I>.
</DL>

The subcommands <B>add</B>, <B>range</B>, and <B>set</B> silently
ignore nodes which are declared unselectable. See the node option
<a href="#Node-selectable">-selectable</a> to influence this.

</DD></DL>

</DD></DL>

<DL><DT><A NAME="toggle"><I>pathName</I> <B>toggle</B></A>
 <I>node</I>
</DT><DD>
    Toggle the open/close status of the given <i>node</i>.
</DD></DL>

<DL><DT><A NAME="visible"><I>pathName</I> <B>visible</B></A>
 <I>node</I>
</DT><DD>

Returns whether or not <I>node</I> is visible (all its parents are open).

</DD></DL>
<DL><DT><A NAME="xview"><I>pathName</I> <B>xview</B></A>
 ?<I>arg...</I>?
</DT><DD>

Standard command to enable horizontal scrolling of <I>pathName</I>.

</DD></DL>
<DL><DT><A NAME="yview"><I>pathName</I> <B>yview</B></A>
 ?<I>arg...</I>?
</DT><DD>

Standard command to enable vertical scrolling of <I>pathName</I>.

</DD></DL>

<B><A NAME="nodes">BINDINGS</A></B><BR>

<p>
A <b>&lt;&lt;TreeSelect&gt;&gt;</b> virtual event is generated any time the
selection in the tree changes.  This is the default behavior of an
item in the tree, but it can be overridden with the bindText or
bindImage command.  If the button 1 binding is overridden, this event may
not be generated.
</p>

<p>
The tree has all the standard mouse wheel bindings when it has focus.
</p>

</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/Widget.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
<HTML>
<HEAD><TITLE>Widget</TITLE></HEAD>
<BODY BGCOLOR=white>
<IMG SRC="constr.gif" WIDTH="40" HEIGHT="40"> Under construction ...<BR>
<DL><DT><I><A HREF="#descr">NAME</A></I></DT>
<DD><B>Widget</B>
 - The Widget base class
</DD></DL>
<DL>
<DT><I><A HREF="#wc">COMMAND</A></I></DT>
<DD>Widget::<A HREF="#addmap"><B>addmap</B></A>
 <I>class</I>
 <I>subclass</I>
 <I>subpath</I>
 <I>options</I>
</DD>
<DD>Widget::<A HREF="#bwinclude"><B>bwinclude</B></A>
 <I>class</I>
 <I>subclass</I>
 <I>subpath</I>
 ?<I>arg...</I>?
</DD>
<DD>Widget::<A HREF="#cget"><B>cget</B></A>
 <I>path</I>
 <I>option</I>
</DD>
<DD>Widget::<A HREF="#configure"><B>configure</B></A>
 <I>path</I>
 <I>options</I>
</DD>
<DD>Widget::<A HREF="#create"><B>create</B></A>
 <I>class</I>
 <I>path</I>
 ?<I>rename</I>?
</DD>
<DD>Widget::<A HREF="#declare"><B>declare</B></A>
 <I>class</I>
 <I>optlist</I>
</DD>
<DD>Widget::<A HREF="#define"><B>define</B></A>
 <I>class</I>
 <I>filename</I>
 ?<I>class ...</I>?
</DD>
<DD>Widget::<A HREF="#destroy"><B>destroy</B></A>
 <I>path</I>
</DD>
<DD>Widget::<A HREF="#focusNext"><B>focusNext</B></A>
 <I>w</I>
</DD>
<DD>Widget::<A HREF="#focusOK"><B>focusOK</B></A>
 <I>w</I>
</DD>
<DD>Widget::<A HREF="#focusPrev"><B>focusPrev</B></A>
 <I>w</I>
</DD>
<DD>Widget::<A HREF="#generate-doc"><B>generate-doc</B></A>
 <I>dir</I>
 <I>widgetlist</I>
</DD>
<DD>Widget::<A HREF="#generate-widget-doc"><B>generate-widget-doc</B></A>
 <I>class</I>
 <I>iscmd</I>
 <I>file</I>
</DD>
<DD>Widget::<A HREF="#getoption"><B>getoption</B></A>
 <I>path</I>
 <I>option</I>
</DD>
<DD>Widget::<A HREF="#getVariable"><B>getVariable</B></A>
 <I>path</I>
 <I>varName</I>
 <I>?myVarName?</I>
</DD>
<DD>Widget::<A HREF="#hasChanged"><B>hasChanged</B></A>
 <I>path</I>
 <I>option</I>
 <I>pvalue</I>
</DD>
<DD>Widget::<A HREF="#init"><B>init</B></A>
 <I>class</I>
 <I>path</I>
 <I>options</I>
</DD>
<DD>Widget::<A HREF="#setoption"><B>setoption</B></A>
 <I>path</I>
 <I>option</I>
 <I>value</I>
</DD>
<DD>Widget::<A HREF="#subcget"><B>subcget</B></A>
 <I>path</I>
 <I>subwidget</I>
</DD>
<DD>Widget::<A HREF="#syncoptions"><B>syncoptions</B></A>
 <I>class</I>
 <I>subclass</I>
 <I>subpath</I>
 <I>options</I>
</DD>
<DD>Widget::<A HREF="#tkinclude"><B>tkinclude</B></A>
 <I>class</I>
 <I>tkwidget</I>
 <I>subpath</I>
 ?<I>arg...</I>?
</DD>
</DL>
<BR><HR WIDTH="100%"><BR>
<B><A NAME="descr"></A>DESCRIPTION</B><BR>
<P>

The <B>Widget</B> namespace handle data associated to all BWidget and provide commands
to easily define BWidget.
<BR>For commands can be used to define a BWidget:
<B>tkinclude</B>, <B>bwinclude</B>, <B>declare</B>, <B>addmap</B> and <B>syncoptions</B>.
Here is the definition of <A HREF="ComboBox.html">ComboBox</A> widget:
<BR><BR>
<CENTER>
<TABLE BORDER=2 CELSPACING=2 WIDTH=80%>
<TR><TD><PRE>
namespace eval ComboBox {
    <FONT COLOR=red><I># We're using ArrowButton, Entry and LabelFrame</I></FONT>
    ArrowButton::use
    Entry::use
    LabelFrame::use

    <FONT COLOR=red><I># Include resources of LabelFrame</I></FONT>
    Widget::bwinclude ComboBox LabelFrame .labf \ 
        rename     {-text -label} \ 
        remove     {-focus} \ 
        prefix     {label -justify -width -anchor -height -font} \ 
        initialize {-relief sunken -borderwidth 2}

    <FONT COLOR=red><I># Include resources of Entry</I></FONT>
    Widget::bwinclude ComboBox Entry .e \ 
        remove {-relief -bd -borderwidth -bg -fg} \ 
        rename {-foreground -entryfg -background -entrybg}

    <FONT COLOR=red><I># Declare new resources</I></FONT>
    Widget::declare ComboBox {
        {-height      TkResource 0  0 listbox}
        {-values      String     "" 0}
        {-modifycmd   String     "" 0}
        {-postcommand String     "" 0}
    }

    <FONT COLOR=red><I># Map resources to subwidget</I></FONT>
    Widget::addmap ComboBox "" :cmd {-background {}}
    Widget::addmap ComboBox ArrowButton .a \ 
        {-foreground {} -background {} -disabledforeground {} -state {}}

    <FONT COLOR=red><I># Synchronize subwidget options</I></FONT>
    Widget::syncoptions ComboBox Entry .e {-text {}}
    Widget::syncoptions ComboBox LabelFrame .labf {-label -text -underline {}}

    proc use {} {}
}</PRE>
</TD></TR>
</TABLE></CENTER>

</P>
<HR WIDTH="50%"><BR>
<B><A NAME="wc">COMMAND</A></B><BR>
<DL><DT><A NAME="addmap">Widget::<B>addmap</B></A>
 <I>class</I>
 <I>subclass</I>
 <I>subpath</I>
 <I>options</I>
</DT><DD>

This command map some resources to subwidget.
Mapped resources automatically configure subwidget when widget is configured.
<UL>
<LI><I>class</I> is the class of the new BWidget
<LI><I>subclass</I> is the class the subwidget (BWidget class, e.g Entry, or empty for Tk widget)
<LI><I>subpath</I> is the path of the subwidget
<LI><I>options</I> is the list <I>{option realres ...}</I> of options to map to subwidget
</UL>
</DD></DL>
<DL><DT><A NAME="bwinclude">Widget::<B>bwinclude</B></A>
 <I>class</I>
 <I>subclass</I>
 <I>subpath</I>
 ?<I>arg...</I>?
</DT><DD>

This command includes into a new BWidget the resources of another BWidget.
Arguments are:
<UL>
<LI><I>class</I> class of the new widget
<LI><I>subclass</I> class name of the BWidget to be included
<LI><I>subpath</I>  path of the widget to configure when BWidget is configured
<LI><I>options</I> is:
<UL>
<LI><I><B>include</B> {option option ...}</I>
<BR>list of options to include (all if not defined)
<LI><I><B>remove</B> {option option ...}</I>
<BR> list of options to remove
<LI><I><B>rename</B> {option name option name ...}</I>
<BR>list of options to rename
<LI><I><B>prefix</B> {prefix option option ...}</I>
<BR>pefix all <I>option</I> by <I>prefix</I>
<LI><I><B>initialize</B> {option value option value ...}</I>
<BR>default value of options
<LI><I><B>readonly</B> {option value option value ...}</I>
<BR>new readonly flag
</UL></UL>
</DD></DL>
<DL><DT><A NAME="cget">Widget::<B>cget</B></A>
 <I>path</I>
 <I>option</I>
</DT><DD>

Returns the value of <I>option</I> of BWidget <I>path</I>. <B>cget</B> tests the option
existence and takes care of synchronization with subwidget.
Typically called by the BWidget <B>cget</B> command.

</DD></DL>
<DL><DT><A NAME="configure">Widget::<B>configure</B></A>
 <I>path</I>
 <I>options</I>
</DT><DD>
Description text
</DD></DL>

<DL><DT><A NAME="create">Widget::<B>create</B></A>
 <I>class</I>
 <I>path</I>
 ?<I>rename</I>?
</DT><DD>
    The standard method for creating a BWidget.  The real widget path
    is renamed to $path:cmd, and a new proc is created to replace the
    path which points to the BWidget's commands.

    <p>
    If <i>rename</i> is false, the path will not be renamed, but the
    proc will still be created.  This is useful when inheriting another
    BWidget who will already have renamed the widget.
    </p>

    <p>
    The command returns the widget path.  This command is usually the
    last command executed in the ::create command for the widget.
    </p>
</DD></DL>

<DL><DT><A NAME="declare">Widget::<B>declare</B></A>
 <I>class</I>
 <I>optlist</I>
</DT><DD>

This command declare new resources for a BWidget.
<UL>
<LI><I>class</I> is class of the new widget
<LI><I>options</I> is the list describing new options. Each new option is a list
<B>{option type value ro ?args?}</B> where:
<UL>
<LI><I>option</I> is the name of the option
<LI><I>type</I> is the type of the option
<LI><I>value</I> is the default value of the option
<LI><I>ro</I> is the readonly flag of the option
<LI><I>args</I> depends on type
</UL></UL>
<BR>
<I>type</I> can be:
<BR>
<DL>
<DT><B>TkResource</B></DT>
<DD>
<I>value</I> of <I>option</I> denotes a resource of a Tk widget. <I>args</I> must be <I>class</I> or
<I>{class realoption}</I>. <I>class</I> is the creation command of the Tk widget, e.g.
<B>entry</B>.
The second form must be used if <I>option</I> has not the same name in Tk widget,
but <I>realoption</I>.
<BR>If <I>value</I> is empty, it is initialized to the default value of the Tk widget.
</DD>

<DT><B>BwResource</B></DT>
<DD>
<I>value</I> of <I>option</I> denotes a resource of a BWidget. <I>args</I> must be <I>class</I> or
<I>{class realoption}</I>. <I>class</I> is the name of the namespace of the BWidget, e.g.
<B>LabelFrame</B>.
The second form must be used if <I>option</I> has not the same name in BWidget,
but <I>realoption</I>.
<BR>If <I>value</I> is empty, it is initialized to the default value of the BWidget.
</DD>

<DT><B>Int</B></DT>
<DD><I>value</I> of <I>option</I> is an integer.
<I>args</I> can be <I>{?min? ?max?}</I> to force it to be in a range. The test is
<I>[expr $option &gt; $min] && [expr $option &lt; $max]</I> so
if args is <I>{0 10}</I>, value must be beetween 0 and 10 exclude,
if <I>args</I> is <I>{=0 =10}</I> , value must be beetween 0 and 10 include.
</DD>

<DT><B>Boolean</B></DT>
<DD><I>value</I> of <I>option</I> is a boolean. True values can be <B>1</B>, <B>true</B> or <B>yes</B>.
False values can be <B>0</B>, <B>false</B> or <B>no</B>. <B>Widget::cget</B> always return
0 or 1.
</DD>

<DT><B>Enum</B></DT>
<DD>
<I>value</I> of <I>option</I> is a element of a enumeration. <I>args</I> must be the list
of enumeration, e.g. <I>{top left bottom right}</I>.
</DD>

<DT><B>Flag</B></DT>
<DD>
<I>value</I> of <I>option</I> is a combination of a set of chars. <I>args</I> must be a
string defining the set.
</DD>

<DT><B>String</B></DT>
<DD>
<DD><I>value</I> of <I>option</I> is any uncontrolled string.
</DD>

<DT><B>Synonym</B></DT>
<DD>
<DD><I>option</I> is a synonym of option <I>args</I>. <I>value</I> has no effect here.
</DD>
</DL>
</DD></DL>

<DL><DT><A NAME="define">Widget::<B>define</B></A>
 <I>class</I>
 <I>filename</I>
 ?<I>class ...</I>?
</DT><DD>

    <p>
    This command is used to define a new BWidget class.  It is
    usually the first command executed in a new widget definition.
    </p>

<ul>
    <li><i>class</i> is the name of the new widget class.</li>
    <li><i>filename</i> is the name of the file (without extension) in the
    BWidget distribution that defines this class.</li>
</ul>

    <p>
    Each class defined after the filename is a class that this widget
    depends on.  The ::use command will be called for each of these
    classes after the new widget has been defined.
    </p>

    <p>
    This command does several things to setup the new class.  First, it
    creates an alias in the global namespace for the name of the class
    that points to the class's ::create subcommand.  Second, it defines
    a ::use subcommand for the class which other classes can use to load
    this class on the fly.  Lastly, it creates a default binding to the
    &lt;Destroy&gt; event for the class that calls Widget::destroy on
    the path.  This is the default setup for almost all widgets in the
    BWidget package.
    </p>

</DD></DL>

<DL><DT><A NAME="destroy">Widget::<B>destroy</B></A>
 <I>path</I>
</DT><DD>
Description text
</DD></DL>
<DL><DT><A NAME="focusNext">Widget::<B>focusNext</B></A>
 <I>w</I>
</DT><DD>
Description text
</DD></DL>
<DL><DT><A NAME="focusOK">Widget::<B>focusOK</B></A>
 <I>w</I>
</DT><DD>
Description text
</DD></DL>
<DL><DT><A NAME="focusPrev">Widget::<B>focusPrev</B></A>
 <I>w</I>
</DT><DD>
Description text
</DD></DL>
<DL><DT><A NAME="generate-doc">Widget::<B>generate-doc</B></A>
 <I>dir</I>
 <I>widgetlist</I>
</DT><DD>
Description text
</DD></DL>
<DL><DT><A NAME="generate-widget-doc">Widget::<B>generate-widget-doc</B></A>
 <I>class</I>
 <I>iscmd</I>
 <I>file</I>
</DT><DD>
Description text
</DD></DL>
<DL><DT><A NAME="getoption">Widget::<B>getoption</B></A>
 <I>path</I>
 <I>option</I>
</DT><DD>

Returns the value of <I>option</I> of BWidget <I>path</I>. This command does not test
option existence, does not handle synonym and does not take care of synchronization with
subwidget.

</DD></DL>
<DL><DT><A NAME="getVariable">Widget::<B>getVariable</B></A>
 <I>path</I>
 <I>varName</I>
 <I>?myVarName?</I>
</DT><DD>

<p>
Make the variable <i>varName</i> relational to <i>path</i> accessible in
the current procedure.  The variable will be created in the widget namespace
for <i>path</i> and can be used for storing widget-specific information.
When <i>path</i> is destroyed, any variable accessed in this manner will be
destroyed with it.
</p>

<p>
If <i>myVarName</i> is specified, the variable will be accessible in the
current procedure as that name.
</p>

</DD></DL>
<DL><DT><A NAME="hasChanged">Widget::<B>hasChanged</B></A>
 <I>path</I>
 <I>option</I>
 <I>pvalue</I>
</DT><DD>
Description text
</DD></DL>
<DL><DT><A NAME="init">Widget::<B>init</B></A>
 <I>class</I>
 <I>path</I>
 <I>options</I>
</DT><DD>
Description text
</DD></DL>
<DL><DT><A NAME="setoption">Widget::<B>setoption</B></A>
 <I>path</I>
 <I>option</I>
 <I>value</I>
</DT><DD>

Set the value of <I>option</I> of BWidget <I>path</I> without option test, subwidget mapping,
synonym handling and does not set the modification flag.

</DD></DL>
<DL><DT><A NAME="subcget">Widget::<B>subcget</B></A>
 <I>path</I>
 <I>subwidget</I>
</DT><DD>

Returns the list of all option/value of BWidget <I>path</I> that are mapped to <I>subwidget</I>.

</DD></DL>
<DL><DT><A NAME="syncoptions">Widget::<B>syncoptions</B></A>
 <I>class</I>
 <I>subclass</I>
 <I>subpath</I>
 <I>options</I>
</DT><DD>

This command synchronize options value of a subwidget.
Used when an option of a subwidget is modified out of the BWidget <B>configure</B> command.
<UL>
<LI><I>class</I> is the class of the new BWidget
<LI><I>subclass</I> is the class the subwidget (BWidget class, e.g Entry, or empty for Tk widget)
<LI><I>subpath</I> is the path of the subwidget
<LI><I>options</I> is the list <I>{option realres ...}</I> of options to synchronize 
with subwidget
</UL>
</DD></DL>
<DL><DT><A NAME="tkinclude">Widget::<B>tkinclude</B></A>
 <I>class</I>
 <I>tkwidget</I>
 <I>subpath</I>
 ?<I>arg...</I>?
</DT><DD>

This command includes into a new BWidget the resources of a Tk widget.
Arguments are:
<UL>
<LI><I>class</I> class of the new widget
<LI><I>tkwidger</I> command name of the Tk widget to be included
<LI><I>subpath</I>  path of the widget to configure when BWidget is configured
<LI><I>options</I> is:
<UL>
<LI><I><B>include</B> {option option ...}</I>
<BR>list of options to include (all if not defined)
<LI><I><B>remove</B> {option option ...}</I>
<BR>list of options to remove
<LI><I><B>rename</B> {option name option name ...}</I>
<BR>list of options to rename
<LI><I><B>prefix</B> {prefix option option ...}</I>
<BR>pefix all <I>option</I> by <I>prefix</I>
<LI><I><B>initialize</B> {option value option value ...}</I>
<BR>default value of options
<LI><I><B>readonly</B> {option value option value ...}</I>
<BR>new readonly flag
</UL></UL>
</DD></DL>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<












































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/contents.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<HTML><BODY BGCOLOR=white target=Manual>
<BR><BR><DT><B>Simple Widgets</B>
<DD><TABLE BORDER=0 CELLSPACING=0>
<TR><TD><A HREF="Label.html">Label</A></TD>
<TD>Label widget with <B>state</B> option, dynamic help and drag and drop facilities</TD></TR>
<TR><TD><A HREF="Entry.html">Entry</A></TD>
<TD>Entry widget with <B>state</B> option, dynamic help and drag and drop facilities</TD></TR>
<TR><TD><A HREF="Button.html">Button</A></TD>
<TD>Button widget with enhanced options</TD></TR>
<TR><TD><A HREF="ArrowButton.html">ArrowButton</A></TD>
<TD>Button widget with an arrow shape.</TD></TR>
<TR><TD><A HREF="ProgressBar.html">ProgressBar</A></TD>
<TD>Progress indicator widget</TD></TR>
<TR><TD><A HREF="ScrollView.html">ScrollView</A></TD>
<TD>Display the visible area of a scrolled window</TD></TR>
<TR><TD><A HREF="Separator.html">Separator</A></TD>
<TD>3D separator widget</TD></TR>
</TABLE>
<BR><BR><DT><B>Manager Widgets</B>
<DD><TABLE BORDER=0 CELLSPACING=0>
<TR><TD><A HREF="MainFrame.html">MainFrame</A></TD>
<TD>Manage toplevel with menu, toolbar and statusbar </TD></TR>
<TR><TD><A HREF="LabelFrame.html">LabelFrame</A></TD>
<TD>Frame with a Label</TD></TR>
<TR><TD><A HREF="TitleFrame.html">TitleFrame</A></TD>
<TD>Frame with a title (consider Tk 8.4+ labelframe instead)</TD></TR>
<TR><TD><A HREF="PanelFrame.html">PanelFrame</A></TD>
<TD>Frame with a boxed title area</TD></TR>
<TR><TD><A HREF="ScrolledWindow.html">ScrolledWindow</A></TD>
<TD>Generic scrolled widget</TD></TR>
<TR><TD><A HREF="ScrollableFrame.html">ScrollableFrame</A></TD>
<TD>Scrollable frame containing widget</TD></TR>
<TR><TD><A HREF="PanedWindow.html">PanedWindow</A></TD>
<TD>Tiled layout manager widget (consider Tk 8.4+ panedwindow instead)</TD></TR>
<TR><TD><A HREF="ButtonBox.html">ButtonBox</A></TD>
<TD>Set of buttons with horizontal or vertical layout</TD></TR>
<TR><TD><A HREF="PagesManager.html">PagesManager</A></TD>
<TD>Pages manager widget</TD></TR>
<TR><TD><A HREF="NoteBook.html">NoteBook</A></TD>
<TD>Notebook manager widget</TD></TR>
<TR><TD><A HREF="Dialog.html">Dialog</A></TD>
<TD>Dialog abstraction with custom buttons</TD></TR>
<TR><TD><A HREF="StatusBar.html">StatusBar</A></TD>
<TD>Status bar widget with resize control</TD></TR>
</TABLE>
<BR><BR><DT><B>Composite Widgets</B>
<DD><TABLE BORDER=0 CELLSPACING=0>
<TR><TD><A HREF="LabelEntry.html">LabelEntry</A></TD>
<TD>
LabelFrame containing an Entry widget.
</TD></TR>
<TR><TD><A HREF="ComboBox.html">ComboBox</A></TD>
<TD>ComboBox widget</TD></TR>
<TR><TD><A HREF="SpinBox.html">SpinBox</A></TD>
<TD>SpinBox widget (consider Tk 8.4+ spinbox instead)</TD></TR>
<TR><TD><A HREF="Tree.html">Tree</A></TD>
<TD>Tree widget</TD></TR>
<TR><TD><A HREF="ListBox.html">ListBox</A></TD>
<TD>ListBox widget</TD></TR>
<TR><TD><A HREF="MessageDlg.html">MessageDlg</A></TD>
<TD>Message dialog box</TD></TR>
<TR><TD><A HREF="ProgressDlg.html">ProgressDlg</A></TD>
<TD>Progress indicator dialog box</TD></TR>
<TR><TD><A HREF="PasswdDlg.html">PasswdDlg</A></TD>
<TD>Login/Password dialog box</TD></TR>
<TR><TD><A HREF="SelectFont.html">SelectFont</A></TD>
<TD>Font selection widget</TD></TR>
<TR><TD><A HREF="SelectColor.html">SelectColor</A></TD>
<TD>Color selection widget</TD></TR>
</TABLE>
<BR><BR><DT><B>Commands Classes</B>
<DD><TABLE BORDER=0 CELLSPACING=0>
<TR><TD><A HREF="Widget.html">Widget</A></TD>
<TD>The Widget base class</TD></TR>
<TR><TD><A HREF="DynamicHelp.html">DynamicHelp</A></TD>
<TD>Provide help to Tk widget or BWidget</TD></TR>
<TR><TD><A HREF="DragSite.html">DragSite</A></TD>
<TD>Commands set for Drag facilities</TD></TR>
<TR><TD><A HREF="DropSite.html">DropSite</A></TD>
<TD>Commands set for Drop facilities</TD></TR>
<TR><TD><A HREF="BWidget.html">BWidget</A></TD>
<TD>Description text</TD></TR>
</TABLE>
</DD>

<BR><HR><BR><B>Load BWidget</B><BR><BR>

Possible load sequence:
<pre>
# If package msgcat is available, its locale is used for BWidget
package require msgcat
# load BWidget
package require BWidget
</pre>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






























































































































































































Deleted scriptlibs/bwidget-1.9.8/BWman/index.html.

1
2
3
4
5
6
7
<HTML>
<HEAD><TITLE>BWidget Manual Pages</TITLE></HEAD>
  <FRAMESET COLS="180,*" BORDER=0>
    <FRAME SRC=navtree.html NAME="Menu" SCROLLING=AUTO>
      <FRAME SRC=contents.html NAME="Manual" SCROLLING=AUTO>
  </FRAMESET>
</HTML>
<
<
<
<
<
<
<














Deleted scriptlibs/bwidget-1.9.8/BWman/navtree.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<HTML><BODY BGCOLOR=white>
<FONT SIZE=1><STRONG><A HREF="contents.html" TARGET=Manual>Brief description</A></STRONG></FONT><BR>
<FONT SIZE=1><STRONG>Simple Widgets</STRONG></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="Label.html" TARGET=Manual>Label</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="Entry.html" TARGET=Manual>Entry</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="Button.html" TARGET=Manual>Button</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="ArrowButton.html" TARGET=Manual>ArrowButton</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="ProgressBar.html" TARGET=Manual>ProgressBar</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="ScrollView.html" TARGET=Manual>ScrollView</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="Separator.html" TARGET=Manual>Separator</A></FONT><BR>
<FONT SIZE=1><STRONG>Manager Widgets</STRONG></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="MainFrame.html" TARGET=Manual>MainFrame</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="LabelFrame.html" TARGET=Manual>LabelFrame</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="TitleFrame.html" TARGET=Manual>TitleFrame</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="PanelFrame.html" TARGET=Manual>PanelFrame</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="ScrolledWindow.html" TARGET=Manual>ScrolledWindow</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="ScrollableFrame.html" TARGET=Manual>ScrollableFrame</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="PanedWindow.html" TARGET=Manual>PanedWindow</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="ButtonBox.html" TARGET=Manual>ButtonBox</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="PagesManager.html" TARGET=Manual>PagesManager</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="NoteBook.html" TARGET=Manual>NoteBook</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="Dialog.html" TARGET=Manual>Dialog</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="StatusBar.html" TARGET=Manual>StatusBar</A></FONT><BR>
<FONT SIZE=1><STRONG>Composite Widgets</STRONG></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="LabelEntry.html" TARGET=Manual>LabelEntry</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="ComboBox.html" TARGET=Manual>ComboBox</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="SpinBox.html" TARGET=Manual>SpinBox</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="Tree.html" TARGET=Manual>Tree</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="ListBox.html" TARGET=Manual>ListBox</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="MessageDlg.html" TARGET=Manual>MessageDlg</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="ProgressDlg.html" TARGET=Manual>ProgressDlg</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="PasswdDlg.html" TARGET=Manual>PasswdDlg</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="SelectFont.html" TARGET=Manual>SelectFont</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="SelectColor.html" TARGET=Manual>SelectColor</A></FONT><BR>
<FONT SIZE=1><STRONG>Commands Classes</STRONG></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="Widget.html" TARGET=Manual>Widget</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="DynamicHelp.html" TARGET=Manual>DynamicHelp</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="DragSite.html" TARGET=Manual>DragSite</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="DropSite.html" TARGET=Manual>DropSite</A></FONT><BR>
&nbsp;&nbsp;<FONT SIZE=1><A HREF="BWidget.html" TARGET=Manual>BWidget</A></FONT><BR>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


















































































Deleted scriptlibs/bwidget-1.9.8/BWman/options.htm.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
<HTML><HEAD><TITLE>Tk Built-In Commands - options manual page</TITLE></HEAD>
<BODY BGCOLOR=white>
<DL>
<DD><A HREF="options.htm#M2" NAME="L2">NAME</A>
<DL><DD>options - Standard options supported by widgets</DL>
<DD><A HREF="options.htm#M3" NAME="L3">DESCRIPTION</A>
<DL>
<DD><A HREF="options.htm#M-activebackground" NAME="L4">-activebackground, activeBackground, Foreground</A>
<DD><A HREF="options.htm#M-activeborderwidth" NAME="L5">-activeborderwidth, activeBorderWidth, BorderWidth</A>
<DD><A HREF="options.htm#M-activeforeground" NAME="L6">-activeforeground, activeForeground, Background</A>
<DD><A HREF="options.htm#M-anchor" NAME="L7">-anchor, anchor, Anchor</A>
<DD><A HREF="options.htm#M-background" NAME="L8">-background or -bg, background, Background</A>
<DD><A HREF="options.htm#M-bitmap" NAME="L9">-bitmap, bitmap, Bitmap</A>
<DD><A HREF="options.htm#M-borderwidth" NAME="L10">-borderwidth or -bd, borderWidth, BorderWidth</A>
<DD><A HREF="options.htm#M-cursor" NAME="L11">-cursor, cursor, Cursor</A>
<DD><A HREF="options.htm#M-disabledbackground" NAME="L12">-disabledbackground, disabledBackground, DisabledBackground</A>
<DD><A HREF="options.htm#M-disabledforeground" NAME="L12">-disabledforeground, disabledForeground, DisabledForeground</A>
<DD><A HREF="options.htm#M-exportselection" NAME="L13">-exportselection, exportSelection, ExportSelection</A>
<DD><A HREF="options.htm#M-font" NAME="L14">-font, font, Font</A>
<DD><A HREF="options.htm#M-foreground" NAME="L15">-foreground or -fg, foreground, Foreground</A>
<DD><A HREF="options.htm#M-highlightbackground" NAME="L16">-highlightbackground, highlightBackground, HighlightBackground</A>
<DD><A HREF="options.htm#M-highlightcolor" NAME="L17">-highlightcolor, highlightColor, HighlightColor</A>
<DD><A HREF="options.htm#M-highlightthickness" NAME="L18">-highlightthickness, highlightThickness, HighlightThickness</A>
<DD><A HREF="options.htm#M-image" NAME="L19">-image, image, Image</A>
<DD><A HREF="options.htm#M-insertbackground" NAME="L20">-insertbackground, insertBackground, Foreground</A>
<DD><A HREF="options.htm#M-insertborderwidth" NAME="L21">-insertborderwidth, insertBorderWidth, BorderWidth</A>
<DD><A HREF="options.htm#M-insertofftime" NAME="L22">-insertofftime, insertOffTime, OffTime</A>
<DD><A HREF="options.htm#M-insertontime" NAME="L23">-insertontime, insertOnTime, OnTime</A>
<DD><A HREF="options.htm#M-insertwidth" NAME="L24">-insertwidth, insertWidth, InsertWidth</A>
<DD><A HREF="options.htm#M-jump" NAME="L25">-jump, jump, Jump</A>
<DD><A HREF="options.htm#M-justify" NAME="L26">-justify, justify, Justify</A>
<DD><A HREF="options.htm#M-orient" NAME="L27">-orient, orient, Orient</A>
<DD><A HREF="options.htm#M-padx" NAME="L28">-padx, padX, Pad</A>
<DD><A HREF="options.htm#M-pady" NAME="L29">-pady, padY, Pad</A>
<DD><A HREF="options.htm#M-relief" NAME="L30">-relief, relief, Relief</A>
<DD><A HREF="options.htm#M-repeatdelay" NAME="L31">-repeatdelay, repeatDelay, RepeatDelay</A>
<DD><A HREF="options.htm#M-repeatinterval" NAME="L32">-repeatinterval, repeatInterval, RepeatInterval</A>
<DD><A HREF="options.htm#M-selectbackground" NAME="L33">-selectbackground, selectBackground, Foreground</A>
<DD><A HREF="options.htm#M-selectborderwidth" NAME="L34">-selectborderwidth, selectBorderWidth, BorderWidth</A>
<DD><A HREF="options.htm#M-selectforeground" NAME="L35">-selectforeground, selectForeground, Background</A>
<DD><A HREF="options.htm#M-setgrid" NAME="L36">-setgrid, setGrid, SetGrid</A>
<DD><A HREF="options.htm#M-takefocus" NAME="L37">-takefocus, takeFocus, TakeFocus</A>
<DD><A HREF="options.htm#M-text" NAME="L38">-text, text, Text</A>
<DD><A HREF="options.htm#M-textvariable" NAME="L39">-textvariable, textVariable, Variable</A>
<DD><A HREF="options.htm#M-troughcolor" NAME="L40">-troughcolor, troughColor, Background</A>
<DD><A HREF="options.htm#M-underline" NAME="L41">-underline, underline, Underline</A>
<DD><A HREF="options.htm#M-wraplength" NAME="L42">-wraplength, wrapLength, WrapLength</A>
<DD><A HREF="options.htm#M-xscrollcommand" NAME="L43">-xscrollcommand, xScrollCommand, ScrollCommand</A>
<DD><A HREF="options.htm#M-yscrollcommand" NAME="L44">-yscrollcommand, yScrollCommand, ScrollCommand</A>
</DL>
<DD><A HREF="options.htm#M4" NAME="L45">KEYWORDS</A>
</DL><HR>
<H3><A NAME="M2">NAME</A></H3>
options - Standard options supported by widgets
<H3><A NAME="M3">DESCRIPTION</A></H3>
This manual entry describes the common configuration options supported
by widgets in the Tk toolkit.  Every widget does not necessarily support
every option (see the manual entries for individual widgets for a list
of the standard options supported by that widget), but if a widget does
support an option with one of the names listed below, then the option
has exactly the effect described below.
<P>
In the descriptions below, ``Command-Line Name'' refers to the
switch used in class commands and <B>configure</B> widget commands to
set this value.  For example, if an option's command-line switch is
<B>-foreground</B> and there exists a widget <B>.a.b.c</B>, then the
command
<PRE><B>.a.b.c  configure  -foreground black</B></PRE>
may be used to specify the value <B>black</B> for the option in the
the widget <B>.a.b.c</B>.  Command-line switches may be abbreviated,
as long as the abbreviation is unambiguous.
``Database Name'' refers to the option's name in the option database (e.g.
in .Xdefaults files).  ``Database Class'' refers to the option's class value
in the option database.
<DL>
<DT>Command-Line Name: <B><A NAME="M-activebackground">-activebackground</A></B>
<DT>Database Name: <B>activeBackground</B>
<DT>Database Class: <B>Foreground</B>
<DD>Specifies background color to use when drawing active elements.
An element (a widget or portion of a widget) is active if the
mouse cursor is positioned over the element and pressing a mouse button
will cause some action to occur.
If strict Motif compliance has been requested by setting the
<B>tk_strictMotif</B> variable, this option will normally be
ignored;  the normal background color will be used instead.
For some elements on Windows and Macintosh systems, the active color
will only be used while mouse button 1 is pressed over the element.
<P><DT>Command-Line Name: <B><A NAME="M-activeborderwidth">-activeborderwidth</A></B>
<DT>Database Name: <B>activeBorderWidth</B>
<DT>Database Class: <B>BorderWidth</B>
<DD>Specifies a non-negative value indicating
the width of the 3-D border drawn around active elements.  See above for
definition of active elements.
The value may have any of the forms acceptable to <B><A HREF="../TkLib/GetPixels.htm">Tk_GetPixels</A></B>.
This option is typically only available in widgets displaying more
than one element at a time (e.g. menus but not buttons).
<P><DT>Command-Line Name: <B><A NAME="M-activeforeground">-activeforeground</A></B>
<DT>Database Name: <B>activeForeground</B>
<DT>Database Class: <B>Background</B>
<DD>Specifies foreground color to use when drawing active elements.
See above for definition of active elements.
<P><DT>Command-Line Name: <B><A NAME="M-anchor">-anchor</A></B>
<DT>Database Name: <B>anchor</B>
<DT>Database Class: <B>Anchor</B>
<DD>Specifies how the information in a widget (e.g. text or a bitmap)
is to be displayed in the widget.
Must be one of the values <B>n</B>, <B>ne</B>, <B>e</B>, <B>se</B>,
<B>s</B>, <B>sw</B>, <B>w</B>, <B>nw</B>, or <B>center</B>.
For example, <B>nw</B> means display the information such that its
top-left corner is at the top-left corner of the widget.
<P><DT>Command-Line Name: <B><A NAME="M-background">-background or -bg</A></B>
<DT>Database Name: <B>background</B>
<DT>Database Class: <B>Background</B>
<DD>Specifies the normal background color to use when displaying the
widget.
<P><DT>Command-Line Name: <B><A NAME="M-bitmap">-bitmap</A></B>
<DT>Database Name: <B>bitmap</B>
<DT>Database Class: <B>Bitmap</B>
<DD>Specifies a bitmap to display in the widget, in any of the forms
acceptable to <B><A HREF="../TkLib/GetBitmap.htm">Tk_GetBitmap</A></B>.
The exact way in which the bitmap is displayed may be affected by
other options such as <B>anchor</B> or <B>justify</B>.
Typically, if this option is specified then it overrides other
options that specify a textual value to display in the widget;
the <B>bitmap</B> option may be reset to an empty string to re-enable
a text display.
In widgets that support both <B>bitmap</B> and <B>image</B> options,
<B>image</B> will usually override <B>bitmap</B>.
<P><DT>Command-Line Name: <B><A NAME="M-borderwidth">-borderwidth or -bd</A></B>
<DT>Database Name: <B>borderWidth</B>
<DT>Database Class: <B>BorderWidth</B>
<DD>Specifies a non-negative value indicating the width
of the 3-D border to draw around the outside of the widget (if such a
border is being drawn;  the <B>relief</B> option typically determines
this).  The value may also be used when drawing 3-D effects in the
interior of the widget.
The value may have any of the forms acceptable to <B><A HREF="../TkLib/GetPixels.htm">Tk_GetPixels</A></B>.
<P><DT>Command-Line Name: <B><A NAME="M-cursor">-cursor</A></B>
<DT>Database Name: <B>cursor</B>
<DT>Database Class: <B>Cursor</B>
<DD>Specifies the mouse cursor to be used for the widget.
The value may have any of the forms acceptable to <B><A HREF="../TkLib/GetCursor.htm">Tk_GetCursor</A></B>.
<P><DT>Command-Line Name: <B><A NAME="M-disabledforeground">-disabledforeground</A></B>
<P><DT>Command-Line Name: <B><A NAME="M-disabledbackground">-disabledbackground</A></B>
<DT>Database Name: <B>disabledBackground</B>
<DT>Database Class: <B>DisabledBackground</B>
<DD>Specifies background color to use when drawing a disabled element.
If the option is specified as an empty string (which is typically the
case on monochrome displays), disabled elements are drawn with the
normal background color but they are dimmed by drawing them
with a stippled fill pattern.
<DT>Database Name: <B>disabledForeground</B>
<DT>Database Class: <B>DisabledForeground</B>
<DD>Specifies foreground color to use when drawing a disabled element.
If the option is specified as an empty string (which is typically the
case on monochrome displays), disabled elements are drawn with the
normal foreground color but they are dimmed by drawing them
with a stippled fill pattern.
<P><DT>Command-Line Name: <B><A NAME="M-exportselection">-exportselection</A></B>
<DT>Database Name: <B>exportSelection</B>
<DT>Database Class: <B>ExportSelection</B>
<DD>Specifies whether or not a selection in the widget should also be
the X selection.
The value may have any of the forms accepted by <B><A HREF="../TclLib/GetInt.htm">Tcl_GetBoolean</A></B>,
such as <B>true</B>, <B>false</B>, <B>0</B>, <B>1</B>, <B>yes</B>, or <B>no</B>.
If the selection is exported, then selecting in the widget deselects
the current X selection, selecting outside the widget deselects any
widget selection, and the widget will respond to selection retrieval
requests when it has a selection.  The default is usually for widgets
to export selections.
<P><DT>Command-Line Name: <B><A NAME="M-font">-font</A></B>
<DT>Database Name: <B><A HREF="../TkCmd/font.htm">font</A></B>
<DT>Database Class: <B><A HREF="../TkCmd/font.htm">Font</A></B>
<DD>Specifies the font to use when drawing text inside the widget.
<P><DT>Command-Line Name: <B><A NAME="M-foreground">-foreground or -fg</A></B>
<DT>Database Name: <B>foreground</B>
<DT>Database Class: <B>Foreground</B>
<DD>Specifies the normal foreground color to use when displaying the widget.
<P><DT>Command-Line Name: <B><A NAME="M-highlightbackground">-highlightbackground</A></B>
<DT>Database Name: <B>highlightBackground</B>
<DT>Database Class: <B>HighlightBackground</B>
<DD>Specifies the color to display in the traversal highlight region when
the widget does not have the input focus.
<P><DT>Command-Line Name: <B><A NAME="M-highlightcolor">-highlightcolor</A></B>
<DT>Database Name: <B>highlightColor</B>
<DT>Database Class: <B>HighlightColor</B>
<DD>Specifies the color to use for the traversal highlight rectangle that is
drawn around the widget when it has the input focus.
<P><DT>Command-Line Name: <B><A NAME="M-highlightthickness">-highlightthickness</A></B>
<DT>Database Name: <B>highlightThickness</B>
<DT>Database Class: <B>HighlightThickness</B>
<DD>Specifies a non-negative value indicating the width of the highlight
rectangle to draw around the outside of the widget when it has the
input focus.
The value may have any of the forms acceptable to <B><A HREF="../TkLib/GetPixels.htm">Tk_GetPixels</A></B>.
If the value is zero, no focus highlight is drawn around the widget.
<P><DT>Command-Line Name: <B><A NAME="M-image">-image</A></B>
<DT>Database Name: <B>image</B>
<DT>Database Class: <B>Image</B>
<DD>Specifies an image to display in the widget, which must have been
created with the <B><A HREF="../TkCmd/image.htm">image create</A></B> command.
Typically, if the <B>image</B> option is specified then it overrides other
options that specify a bitmap or textual value to display in the widget;
the <B>image</B> option may be reset to an empty string to re-enable
a bitmap or text display.
<P><DT>Command-Line Name: <B><A NAME="M-insertbackground">-insertbackground</A></B>
<DT>Database Name: <B>insertBackground</B>
<DT>Database Class: <B>Foreground</B>
<DD>Specifies the color to use as background in the area covered by the
insertion cursor.  This color will normally override either the normal
background for the widget (or the selection background if the insertion
cursor happens to fall in the selection).
<P><DT>Command-Line Name: <B><A NAME="M-insertborderwidth">-insertborderwidth</A></B>
<DT>Database Name: <B>insertBorderWidth</B>
<DT>Database Class: <B>BorderWidth</B>
<DD>Specifies a non-negative value indicating the width
of the 3-D border to draw around the insertion cursor.
The value may have any of the forms acceptable to <B><A HREF="../TkLib/GetPixels.htm">Tk_GetPixels</A></B>.
<P><DT>Command-Line Name: <B><A NAME="M-insertofftime">-insertofftime</A></B>
<DT>Database Name: <B>insertOffTime</B>
<DT>Database Class: <B>OffTime</B>
<DD>Specifies a non-negative integer value indicating the number of
milliseconds the insertion cursor should remain ``off'' in each blink cycle.
If this option is zero then the cursor doesn't blink:  it is on
all the time.
<P><DT>Command-Line Name: <B><A NAME="M-insertontime">-insertontime</A></B>
<DT>Database Name: <B>insertOnTime</B>
<DT>Database Class: <B>OnTime</B>
<DD>Specifies a non-negative integer value indicating the number of
milliseconds the insertion cursor should remain ``on'' in each blink cycle.
<P><DT>Command-Line Name: <B><A NAME="M-insertwidth">-insertwidth</A></B>
<DT>Database Name: <B>insertWidth</B>
<DT>Database Class: <B>InsertWidth</B>
<DD>Specifies a  value indicating the total width of the insertion cursor.
The value may have any of the forms acceptable to <B><A HREF="../TkLib/GetPixels.htm">Tk_GetPixels</A></B>.
If a border has been specified for the insertion
cursor (using the <B>insertBorderWidth</B> option), the border
will be drawn inside the width specified by the <B>insertWidth</B>
option.
<P><DT>Command-Line Name: <B><A NAME="M-jump">-jump</A></B>
<DT>Database Name: <B>jump</B>
<DT>Database Class: <B>Jump</B>
<DD>For widgets with a slider that can be dragged to adjust a value,
such as scrollbars, this option determines when
notifications are made about changes in the value.
The option's value must be a boolean of the form accepted by
<B><A HREF="../TclLib/GetInt.htm">Tcl_GetBoolean</A></B>.
If the value is false, updates are made continuously as the
slider is dragged.
If the value is true, updates are delayed until the mouse button
is released to end the drag;  at that point a single notification
is made (the value ``jumps'' rather than changing smoothly).
<P><DT>Command-Line Name: <B><A NAME="M-justify">-justify</A></B>
<DT>Database Name: <B>justify</B>
<DT>Database Class: <B>Justify</B>
<DD>When there are multiple lines of text displayed in a widget, this
option determines how the lines line up with each other.
Must be one of <B>left</B>, <B>center</B>, or <B>right</B>.
<B>Left</B> means that the lines' left edges all line up, <B>center</B>
means that the lines' centers are aligned, and <B>right</B> means
that the lines' right edges line up.
<P><DT>Command-Line Name: <B><A NAME="M-orient">-orient</A></B>
<DT>Database Name: <B>orient</B>
<DT>Database Class: <B>Orient</B>
<DD>For widgets that can lay themselves out with either a horizontal
or vertical orientation, such as scrollbars, this option specifies
which orientation should be used.  Must be either <B>horizontal</B>
or <B>vertical</B> or an abbreviation of one of these.
<P><DT>Command-Line Name: <B><A NAME="M-padx">-padx</A></B>
<DT>Database Name: <B>padX</B>
<DT>Database Class: <B>Pad</B>
<DD>Specifies a non-negative value indicating how much extra space
to request for the widget in the X-direction.
The value may have any of the forms acceptable to <B><A HREF="../TkLib/GetPixels.htm">Tk_GetPixels</A></B>.
When computing how large a window it needs, the widget will
add this amount to the width it would normally need (as determined
by the width of the things displayed in the widget);  if the geometry
manager can satisfy this request, the widget will end up with extra
internal space to the left and/or right of what it displays inside.
Most widgets only use this option for padding text:  if they are
displaying a bitmap or image, then they usually ignore padding
options.
<P><DT>Command-Line Name: <B><A NAME="M-pady">-pady</A></B>
<DT>Database Name: <B>padY</B>
<DT>Database Class: <B>Pad</B>
<DD>Specifies a non-negative value indicating how much extra space
to request for the widget in the Y-direction.
The value may have any of the forms acceptable to <B><A HREF="../TkLib/GetPixels.htm">Tk_GetPixels</A></B>.
When computing how large a window it needs, the widget will add
this amount to the height it would normally need (as determined by
the height of the things displayed in the widget);  if the geometry
manager can satisfy this request, the widget will end up with extra
internal space above and/or below what it displays inside.
Most widgets only use this option for padding text:  if they are
displaying a bitmap or image, then they usually ignore padding
options.
<P><DT>Command-Line Name: <B><A NAME="M-relief">-relief</A></B>
<DT>Database Name: <B>relief</B>
<DT>Database Class: <B>Relief</B>
<DD>Specifies the 3-D effect desired for the widget.  Acceptable
values are <B>raised</B>, <B>sunken</B>, <B>flat</B>, <B>ridge</B>,
<B>solid</B>, and <B>groove</B>.
The value
indicates how the interior of the widget should appear relative
to its exterior;  for example, <B>raised</B> means the interior of
the widget should appear to protrude from the screen, relative to
the exterior of the widget.
<P><DT>Command-Line Name: <B><A NAME="M-repeatdelay">-repeatdelay</A></B>
<DT>Database Name: <B>repeatDelay</B>
<DT>Database Class: <B>RepeatDelay</B>
<DD>Specifies the number of milliseconds a button or key must be held
down before it begins to auto-repeat.  Used, for example, on the
up- and down-arrows in scrollbars.
<P><DT>Command-Line Name: <B><A NAME="M-repeatinterval">-repeatinterval</A></B>
<DT>Database Name: <B>repeatInterval</B>
<DT>Database Class: <B>RepeatInterval</B>
<DD>Used in conjunction with <B>repeatDelay</B>:  once auto-repeat
begins, this option determines the number of milliseconds between
auto-repeats.
<P><DT>Command-Line Name: <B><A NAME="M-selectbackground">-selectbackground</A></B>
<DT>Database Name: <B>selectBackground</B>
<DT>Database Class: <B>Foreground</B>
<DD>Specifies the background color to use when displaying selected
items.
<P><DT>Command-Line Name: <B><A NAME="M-selectborderwidth">-selectborderwidth</A></B>
<DT>Database Name: <B>selectBorderWidth</B>
<DT>Database Class: <B>BorderWidth</B>
<DD>Specifies a non-negative value indicating the width
of the 3-D border to draw around selected items.
The value may have any of the forms acceptable to <B><A HREF="../TkLib/GetPixels.htm">Tk_GetPixels</A></B>.
<P><DT>Command-Line Name: <B><A NAME="M-selectforeground">-selectforeground</A></B>
<DT>Database Name: <B>selectForeground</B>
<DT>Database Class: <B>Background</B>
<DD>Specifies the foreground color to use when displaying selected
items.
<P><DT>Command-Line Name: <B><A NAME="M-setgrid">-setgrid</A></B>
<DT>Database Name: <B>setGrid</B>
<DT>Database Class: <B>SetGrid</B>
<DD>Specifies a boolean value that determines whether this widget controls the
resizing grid for its top-level window.
This option is typically used in text widgets, where the information
in the widget has a natural size (the size of a character) and it makes
sense for the window's dimensions to be integral numbers of these units.
These natural window sizes form a grid.
If the <B>setGrid</B> option is set to true then the widget will
communicate with the window manager so that when the user interactively
resizes the top-level window that contains the widget, the dimensions of
the window will be displayed to the user in grid units and the window
size will be constrained to integral numbers of grid units.
See the section GRIDDED GEOMETRY MANAGEMENT in the <B><A HREF="../TkCmd/wm.htm">wm</A></B> manual
entry for more details.
<P><DT>Command-Line Name: <B><A NAME="M-takefocus">-takefocus</A></B>
<DT>Database Name: <B>takeFocus</B>
<DT>Database Class: <B>TakeFocus</B>
<DD>Determines whether the window accepts the focus during keyboard
traversal (e.g., Tab and Shift-Tab).
Before setting the focus to a window, the traversal scripts
consult the value of the <B>takeFocus</B> option.
A value of <B>0</B> means that the window should be skipped entirely
during keyboard traversal. 
<B>1</B> means that the window should receive the input
focus as long as it is viewable (it and all of its ancestors are mapped).
An empty value for the option means that the traversal scripts make
the decision about whether or not to focus on the window:  the current
algorithm is to skip the window if it is
disabled, if it has no key bindings, or if it is not viewable.
If the value has any other form, then the traversal scripts take
the value, append the name of the window to it (with a separator space),
and evaluate the resulting string as a Tcl script.
The script must return <B>0</B>, <B>1</B>, or an empty string:  a 
<B>0</B> or <B>1</B> value specifies whether the window will receive
the input focus, and an empty string results in the default decision
described above.
Note: this interpretation of the option is defined entirely by
the Tcl scripts that implement traversal:  the widget implementations
ignore the option entirely, so you can change its meaning if you
redefine the keyboard traversal scripts.
<P><DT>Command-Line Name: <B><A NAME="M-text">-text</A></B>
<DT>Database Name: <B><A HREF="../TkCmd/text.htm">text</A></B>
<DT>Database Class: <B><A HREF="../TkCmd/text.htm">Text</A></B>
<DD>Specifies a string to be displayed inside the widget.  The way in which
the string is displayed depends on the particular widget and may be
determined by other options, such as <B>anchor</B> or <B>justify</B>.
<P><DT>Command-Line Name: <B><A NAME="M-textvariable">-textvariable</A></B>
<DT>Database Name: <B>textVariable</B>
<DT>Database Class: <B><A HREF="../TclCmd/variable.htm">Variable</A></B>
<DD>Specifies the name of a variable.  The value of the variable is a text
string to be displayed inside the widget;  if the variable value changes
then the widget will automatically update itself to reflect the new value.
The way in which the string is displayed in the widget depends on the
particular widget and may be determined by other options, such as
<B>anchor</B> or <B>justify</B>.
<P><DT>Command-Line Name: <B><A NAME="M-troughcolor">-troughcolor</A></B>
<DT>Database Name: <B>troughColor</B>
<DT>Database Class: <B>Background</B>
<DD>Specifies the color to use for the rectangular trough areas
in widgets such as scrollbars and scales.
<P><DT>Command-Line Name: <B><A NAME="M-underline">-underline</A></B>
<DT>Database Name: <B>underline</B>
<DT>Database Class: <B>Underline</B>
<DD>Specifies the integer index of a character to underline in the widget.
This option is used by the default bindings to implement keyboard
traversal for menu buttons and menu entries.
0 corresponds to the first character of the text displayed in the
widget, 1 to the next character, and so on.
<P><DT>Command-Line Name: <B><A NAME="M-wraplength">-wraplength</A></B>
<DT>Database Name: <B>wrapLength</B>
<DT>Database Class: <B>WrapLength</B>
<DD>For widgets that can perform word-wrapping, this option specifies
the maximum line length.
Lines that would exceed this length are wrapped onto the next line,
so that no line is longer than the specified length.
The value may be specified in any of the standard forms for
screen distances.
If this value is less than or equal to 0 then no wrapping is done:  lines
will break only at newline characters in the text.
<P><DT>Command-Line Name: <B><A NAME="M-xscrollcommand">-xscrollcommand</A></B>
<DT>Database Name: <B>xScrollCommand</B>
<DT>Database Class: <B>ScrollCommand</B>
<DD>Specifies the prefix for a command used to communicate with horizontal
scrollbars.
When the view in the widget's window changes (or
whenever anything else occurs that could change the display in a
scrollbar, such as a change in the total size of the widget's
contents), the widget will
generate a Tcl command by concatenating the scroll command and
two numbers.
Each of the numbers is a fraction between 0 and 1, which indicates
a position in the document.  0 indicates the beginning of the document,
1 indicates the end, .333 indicates a position one third the way through
the document, and so on.
The first fraction indicates the first information in the document
that is visible in the window, and the second fraction indicates
the information just after the last portion that is visible.
The command is
then passed to the Tcl interpreter for execution.  Typically the
<B>xScrollCommand</B> option consists of the path name of a scrollbar
widget followed by ``set'', e.g. ``.x.scrollbar set'':  this will cause
the scrollbar to be updated whenever the view in the window changes.
If this option is not specified, then no command will be executed.
<P><DT>Command-Line Name: <B><A NAME="M-yscrollcommand">-yscrollcommand</A></B>
<DT>Database Name: <B>yScrollCommand</B>
<DT>Database Class: <B>ScrollCommand</B>
<DD>Specifies the prefix for a command used to communicate with vertical
scrollbars.  This option is treated in the same way as the
<B>xScrollCommand</B> option, except that it is used for vertical
scrollbars and is provided by widgets that support vertical scrolling.
See the description of <B>xScrollCommand</B> for details
on how this option is used.

</DL>
<H3><A NAME="M4">KEYWORDS</A></H3>
<A href="../Keywords/C.htm#class">class</A>, <A href="../Keywords/N.htm#name">name</A>, <A href="../Keywords/S.htm#standard option">standard option</A>, <A href="../Keywords/S.htm#switch">switch</A>
<HR><PRE>
<A HREF="../copyright.htm">Copyright</A> &#169; 1990-1994 The Regents of the University of California.
<A HREF="../copyright.htm">Copyright</A> &#169; 1994-1996 Sun Microsystems, Inc.
<A HREF="../copyright.htm">Copyright</A> &#169; 1995-1997 Roger E. Critchlow Jr.</PRE>
</BODY></HTML>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




















































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/CHANGES.txt.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
____________________________________________________________
BWidget 1.2.1 (07/09/1999)

CHANGES FROM 1.2 TO 1.2.1

  This version is the first patch of 1.2. It does not introduce
  incompatibilites.
  This patch include some new requested features, that I think
  can't wait for 1.3:
     - special menu handling (see MainFrame)
     - tabs bindings in NoteBook
     - label alignment of LabelFrame
     - -repeatdelay and -repeatinterval options on SpinBox


* Entry
    - <Destroy> event added to tag BwDisabledEntry
    - fixed bug when -textvariable use a variable containing space

* MainFrame
    - fixed bug when -textvariable use a variable containing space
    - menubar entry creation modified to use the menuid as the
      subpathname to permit special menu (help, system, apple)

* LabelFrame
    - LabelFrame::align command added

* ScrollableFrame
    - fixed typo bug

* PagesManager
    - fixed bug of window size
    - 'pages' modified to optionally include first and last indices.
      ('page' is still available but deprecated)

* NoteBook
    - new command 'bindtabs'
    - fixed bug in handling result of -leavecmd command
    - 'pages' modified to optionally include first and last indices.
      ('page' is still available but deprecated)

* ComboBox
    - little border added around the popdown list, which appeared
      to have no border under windows when popped above a widget
      with the same background color.

* SpinBox
    - options -repeatdelay and -repeatinterval added.

* Tree
    - fixed strange behaviour when editing: 'selection range'
      replaced by 'selection from'/'selection to'
    - widget is redrawn if needed in 'edit' and 'see'
    - fixed bug in see
    - nodes modified to optionally include first and last indices.
    - _subdelete modified to iterative method

* ListBox
    - fixed strange behaviour when editing: 'selection range'
      replaced by 'selection from'/'selection to'
    - ListBox is redrawn if needed in 'edit' and 'see'
    - fixed bug in see
    - 'items' modified to optionally include first and last indices.
      ('item' is still available but deprecated)

* SelectColor
    - fixed bug in call to GlobalVar::trace renamed GlobalVar::tracevar

* DragSite and DropSite
    - fixed bug introduced by new button event.

* DynamicHelp
    - restored version of 1.1, due to the bug under windows

* BWidget::place
    - fixed bug when x or y is 0.

* es.rc resource file included


____________________________________________________________
BWidget 1.2 (05/21/1999)

CHANGES FROM 1.1 TO 1.2


* 4 new widget:
    - ScrollableFrame
    - ScrollView
    - PagesManager
    - PasswdDlg (contributed by Stephane Lavirotte)

* Widget:
    - Flag option type added
    - option resource database read while widget creation,
      not while widget class creation.
    - better handling of BWidget definition using another BWidget as a top pathname.

* MainFrame
    - more options included for ProgressBar
      (INCOMPATIBILITY: option -variable renamed -progressvar)
    - -menu option modified to have tags on entries and menu id on cascad menu
      (INCOMPATIBILITY of option -menu)
    - new command: getmenu
    - new command: setmenustate

* DropSite
    - operations completly reworked
    - option -droptypes modified (INCOMPATIBILITY)
    - return code of -dropovercmd modified
      bit 'ok' and bit 'recall' reverted
      (INCOMPATIBILITY in -dropovercmd command)
    - new command: setoperation

* DragSite:
    - Drag now initiates while <ButtonPress-x> followed by <Bx-Motion> of
      4 pixels, so it is possible to have a <ButtonPress-x> event and
      drag event on the same button.
    - -dragevent option modified: must be the number of the button: 1, 2 or 3
      Option is now defaulted to 1, but Entry widget keep it to 3.
      (INCOMPATIBILITY)
    - return result of -draginitcmd modified (INCOMPATIBILITY)

* ListBox:
    - edit command improved.
      new arguments: initial text, and command to verify the text before accept it.
      (INCOMPATIBILITY in call to edit)
    - Drag and Drop modified
      (INCOMPATIBILITY in -dropovercmd command)
    - new command: reorder

* Tree:
    - edit command improved.
      new arguments: initial text, and command to verify the text before accept it.
      (INCOMPATIBILITY in call to edit)
    - Drag and Drop modified
      (INCOMPATIBILITY in -dropovercmd command)
    - new command: reorder
    - new command: visible
    - less full-redraw

* NoteBook:
    - relief reworked
    - added option -leavecmd on pages
    - option -image implemented
    - new command: move
    - delete command now accept an optionnal argument specifying 
      whether the frame of the page should be destroyed or not.
      If not, this frame is reused by insert command for the same page.

* Entry and LabelEntry:
    - direct access to entry command
    - bind command added on the entry subwidget

* ComboBox:
    - option -postcommand added
    - bind command added on the entry subwidget

* SpinBox:
    - bind command added on the entry subwidget
    - floating point fixed - work needed

* ProgressBar:
    - now can be incremental or not limited ('unknow-time' processing)

* Bitmap:
    - xpm image type added with use of xpm-to-image by Roger E. Critchlow Jr.

* Lots of focus problem solved

* ...and bugs corrected.


INCOMPATIBILITIES

  Incompatibilities are very localized, so we hope that it will
  not be painfull to upgrade to 1.2.

* MainFrame related imcompatibilities
    - Upgrade MainFrame -menu option and change -variable option
      by -progressvar.

* Drag and drop related imcompatibilities
    - Upgrade -dragevent option, and command associated to -draginitcmd
      and -dropovercmd.
    - Upgrade -dragendcmd/-dragovercmd command of Tree and ListBox widget

* Edition in Tree and ListBox
    - Verify arguments passed in call to edit command of
      Tree and ListBox


____________________________________________________________
BWidget 1.1 (03/12/1999)

CHANGES FROM 1.0 TO 1.1

WHAT'S NEW

The most important change in BWidget 1.1 is the support
of tk path command, but the old syntax is always available.
configure command now returns a valid configuration information list.

(I hope that) All submitted bugs have been corrected.

Following widget have been reworked:

* ListBox:
    - ListBox items have now a -indent option.
    - insert command modified to look more as a tk
      listbox insert command (see  INCOMPATIBILITIES)
    - item command added to retreive one or more items

* Tree:
    - insert command modified to look more as a
      listbox insert command (see  INCOMPATIBILITIES)

* LabelEntry:
    - -value and -variable options renamed to -text and -textvariable
      (see  INCOMPATIBILITIES)

* SpinBox and ComboBox:
    - -value and -variable options renamed to -text and -textvariable
      (see  INCOMPATIBILITIES)
    - New command getvalue and setvalue added to manipulate
      current value by index.

* NoteBook:
    - Pages have now an identifier.
    - insert command modififed (see  INCOMPATIBILITIES)
    - page command added to retreive one or more pages
    - getframe command added


INCOMPATIBILITIES (sorry for this)

* LabelEntry, SpinBox and ComboBox:
    - -value and -variable options renamed to -text and -textvariable

* Entry and LabelEntry:
    - setfocus doesn't exist anymore. Directly use tk command focus.

* NoteBook:
    - Pages have now an identifier, which modifies insert command:
        NoteBook::insert $nb index ?option value ...?
      is now
        $nb insert index page ?option value ...?

* Tree:
    - insert command modified:
        Tree::insert $nb $parent $node $index ?option value ...?
      becomes
        $tree insert $index $parent $node ?option value ...?

* ListBox:
    - insert command modified:
        ListBox::insert $list $item $index ?option value ...?
      becomes
        $list insert $index $item ?option value ...?


____________________________________________________________
BWidget 1.0 (02/19/1999)

  First release.

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




















































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/ChangeLog.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2014-09-10 Harald Oehlmann <oehhar@users.sourceforge.net>

	**** BWidget 1.9.8 tagged ****

2014-09-05 Harald Oehlmann <oehhar@users.sourceforge.net>

	widget.tcl: Widget::which errors when option not present.
	Ticket [397db23424]

2014-05-21 Harald Oehlmann <oehhar@users.sourceforge.net>

        widget.tcl: Don't invoke unqualified upvar in callers
        scope. Patch by Adrian Medrano Calvo. Ticket [046fa04231]

        widget.tcl: Don't double creation of temporary widget for
        default values retrieval. Use result of _get_tkwidget_options
        instead. By Adrian Medrano Calvo. Ticket [393b67ab19]

        widget.tcl: New procedure Widget::which (as in [namespace which]),
        that returns the fully qualified name for a widget option or
        widget variable. By Adrian Medrano Calvo. Ticket [a8705e5fd9]

        widget.tcl: Remove unneeded upvar. By Adrian Medrano Calvo.
        Ticket [43f93e0a97]
        
        widget.tcl et al: remove apparently unused procedure
        Widget::syncoptions and all calls. By Adrian Medrano Calvo.
        Ticket [3c2b8eafc6]


2013-12-13 Harald Oehlmann <oehhar@users.sourceforge.net>

	scrollframe.tcl: Make -constrainedwidth 1 and
	-constrainedheight 1 work together.
	Patch by Simon Bachmann. Ticket [2fa44401d5]

	2013-10-17 Harald Oehlmann <oehhar@users.sourceforge.net>
	widget.tcl: Remove temporary widget.
	By Wolfgang S. Kechel. Ticket [6cd041bcc1]

2013-10-15 Harald Oehlmann <oehhar@users.sourceforge.net>
	combobox.tcl: Themed ComboBox color specifications
	are honored. By Wolfgang S. Kechel. Ticket [6c6704e40f]

2013-10-14 Harald Oehlmann <oehhar@users.sourceforge.net>
	combobox.tcl: Fails in themed mode with "unknown
	option -bg". Patch solves this but listbox items
	are white on white when "-foreground" is specified.
	By Wolfgang S. Kechel. Ticket [6632134ce9]
	
	listbox.tcl: Update on option -deltay added.
	Set x0 to 2 to make highlight work and look nice for
	listbox with image.
	Take image into account to show selection.
	By Wolfgang S. Kechel. Ticket [ff1787af9c]

	scrollw.tcl: Raise scrolled window if it is below in
	the window hierarchy. By Wolfgang S. Kechel.
	Ticket [ff1787af9c]

2013-10-07 Harald Oehlmann <oehhar@users.sourceforge.net>
	dynhelp.tcl: Sometimes the tooltip does not occur under
	gnome/metacity on ubuntu. By Wolfgang S. Kechel.
	Ticket [a588d2f800]

2013-09-15 Harald Oehlmann <oehhar@users.sourceforge.net>

	**** BWidget 1.9.7 tagged ****

2013-09-11 Harald Oehlmann <oehhar@users.sourceforge.net>

	xpm2image.tcl: many issues fixed in xpm import
	by Mattias Hembruch. Ticket [9a8b2ee42e]
	
2013-08-14 Harald Oehlmann <oehhar@users.sourceforge.net>

	* notebook.tcl: cured error in _resize, that
	data($p,width) is not (jet) present. Ticket [a4cbba655d].

2013-06-28 Harald Oehlmann <oehhar@users.sourceforge.net>

	* mainframe.tcl: Included Patch [9f67a66609]
	curing issues of Shift-Accellerators with Shift-Lock
	on Mac. By Keith Nash, Ticket [83ce3e84e7].

2013-06-26 Harald Oehlmann <oehhar@users.sourceforge.net>

	* mainframe.tcl: Reverted Patch [1977644]
	(-casesensitive for accellerators). It has
	issues with shift-lock.

2013-06-21 Harald Oehlmann <oehhar@users.sourceforge.net>

	* labelentry.tcl: Bug fixed:
	Methods from Tk entry widget restored [Bug 1002844].
	
	* mainframe.tcl: Allow case sensitive accelerators
	by new option -casesensitive.
	Patch by cmard [Patch 1977644]
	
	* mainframe.tcl: Allow new modifiers Shift, Cmd and ShiftCmd
	for accelerators. Patch by K.J.Nash [Patch-83ce3e84e7]

	* mainframe.tcl: When changing MainFrame -background, do
	not change menu colors on Aqua.
	Fix by Keith J.Nash [Bug-a81b7afc1e]
	
	* init.tcl: Make loadable in save interpreter.
	Fix by Keith J.Nash [Bug-4365a23bd3]

	* combobox.tcl: Add method getentry to return entry
	widget path for bind purposes.
	Patch by Michael [Patch-2340355]
	
2013-01-09 Harald Oehlmann <oehhar@users.sourceforge.net>

	* widget.tcl: Bug fixed:
	Error 'invalid command name ".#BWidget.#ttk::entry"'
	arises in themed mode when an Entry widget should get
	focus by the tab key.
	The temporary widget creation fails due to the "::" in
	the command name of ttk widgets.
	Any "::" is replaced by "__" [Bug 3599955].
	
2011-07-27 Harald Oehlmann <oehhar@users.sourceforge.net>

	**** BWidget 1.9.6 tagged ****

2012-04-12 Harald Oehlmann <oehhar@users.sourceforge.net>

	* listbox.tcl ListBox::selection Only redraw if
	selection changed. Patch by Wolfgang S. Kechel [Bug 3517145]

2012-04-02 Harald Oehlmann <oehhar@users.sourceforge.net>

	* entry.tcl, BWMan/entry.tcl checkbox.tcl Themed mode:
	Invoking "configure" without arguments results in errors
	that non-ttk options are not present.
	Removed Entry options: -background -foreground -relief
	-borderwidth -fg -bg -bd. Reported by Wolfgang S. Kechel
	[Bug 3513263]
	* entry.tcl mapped entry option -state to ttk::entry
	state in themed mode to make state change visible.

2012-03-06 Harald Oehlmann <oehhar@users.sourceforge.net>

	* BWMan/ListBox.html documented options -selectfill and
	-autofocus as read-only. Reported by Wolfgang S. Kechel
	[Bug 3497592]

2011-11-14 Harald Oehlmann <oehhar@users.sourceforge.net>

	* widget.tcl (Widget::focusOK) fixed list with update.
	Arises, if a ttk widget with a widget path with spaces
	is the next widget. Reported by jaspertheperson
	[Bug 3437761]

2011-06-24 Harald Oehlmann <oehhar@users.sourceforge.net>

	**** BWidget 1.9.5 tagged ****

2011-06-23 Harald Oehlmann <oehhar@users.sourceforge.net>

	* listbox.tcl (listbox::generate_data) fixed last patch
	by ryotakatsuki [Bug 3324610]

2011-06-23 Harald Oehlmann <oehhar@users.sourceforge.net>

	* listbox.tcl Fix of Bug 3000293 broke listbox tags.
	The bindImage subcommand did not report right tag.
	Patch by ryotakatsuki [Bug 3324610]

2011-06-23 Harald Oehlmann <oehhar@users.sourceforge.net>

	* listbox.tcl, tree.tcl (_update_scrollregion) the linewise
	scrolling did not always scroll up to the end on windows 7.
	Report and patch by Wojciech Kocjan, review and modification
	by Koen Danckaert [Bug 3317772]

2011-05-25 Harald Oehlmann <oehhar@users.sourceforge.net>

	*mainframe.tcl: Add a boolean readonly option -sizegrip
	to show a sizegrip widget in themed mode.

2011-05-24 Harald Oehlmann <oehhar@users.sourceforge.net>

	*lang/pl.rc updated by Wojciech Kocjan.

2011-04-26 Harald Oehlmann <oehhar@users.sourceforge.net>

	*notebook.tcl The user frame of the notebook is now a themed
	frame in themed mode. The set background color does not apply
	to the user frame in this case.

2011-04-26 Harald Oehlmann <oehhar@users.sourceforge.net>

	label.tcl configuring foreground color caused error when
	themed [Bug 3292977]

2011-04-20 Harald Oehlmann <oehhar@users.sourceforge.net>

	lang/hu.rc by Rezso updated

2011-04-20 Harald Oehlmann <oehhar@users.sourceforge.net>

	* font.tcl, lang/*.rc: Add translation possibility
	for color picker button of font dialog.
	Used google translater to translate "Color" to all languages.
	Please check if this is correct. [Bug 3289573] reported by Rezso

2011-04-19 Harald Oehlmann <oehhar@users.sourceforge.net>

	* lang/*.rc [Bug 3289573] : Add translation (templates) for the
	Color picker widget text "Base colors" and "User colors".
	Only german and english locals are provided so far.

2011-02-14 Harald Oehlmann <oehhar@users.sourceforge.net>

	* combobox.tcl: [Bug 3182287] : ComboBox failes in themed mode
	due to the use of the themed entry widget. The following options
	are not supported (and thus called) any more: -relief
	-highlightbackground -highlightforeground

2011-02-14 Harald Oehlmann <oehhar@users.sourceforge.net>

	* entry.tcl, labelentry.tcl, labelframe.tcl, mainframe.tcl,
	pagesmgr.tcl, scrollw.tcl: [Bug 3168761]:
	entry failes when themed support activated with:
	unknown option "-highlightthickness" (reported by George
	on clt 27 Jan., 16:55).
	The patch by Wojciech Kocjan fixes this and enhances
	labelentry, labelframe and pagesmgr to also use themed frames.
	Within scrollw.tcl, a bug for empty background handling is fixed.
	The scrollbar background is not set any more for not-themed widget.

2011-01-17 Harald Oehlmann <oehhar@users.sourceforge.net>

	* pkgIndex.tcl: corrected package version in package provide

2010-12-14 Harald Oehlmann <oehhar@users.sourceforge.net>

	**** BWidget 1.9.4 tagged ****

2010-12-14  Andreas Kupries  <andreask@activestate.com>

	* tree.tcl [Bug 3106208]: Followup. Moved the fixed code of the
	last entry I did (2010-11-09) into a new command Tree::MergeFlag
	and call this from both Tree::itemconfigure and Tree::insert.
	Missing the place in Tree::insert caused another problem, found by
	Dustin Littau.

2010-11-05 Harald Oehlmann <oehhar@users.sourceforge.net>

	**** BWidget 1.9.3 tagged ****

2010-11-23 Harald Oehlmann <oehhar@users.sourceforge.net>

	* scrollw.tcl Add theming support for ScrolledWindow widget.
	* ScrolledWindow.html Themed mode documented.

2010-11-21 Harald Oehlmann <oehhar@users.sourceforge.net>

	* label.tcl Add theming support for Label widget.
	* label.html Themed mode documented.

2010-11-16 Harald Oehlmann <oehhar@users.sourceforge.net>

	* button.tcl Add theming support for Button widget.
	Option "-relief link" is mapped to "Toolbutton style.
	Option -height is not available when themed.
	Thanks to Kevin Walzer for the test on MacOS.
	* buttonbox.tcl When themed, only set themed button options.
	The widget itself is not jet themed.
	* Dialog.html Removed documentation of unavailable option -buttonwidth.

2010-11-09  Andreas Kupries  <andreask@activestate.com>

	* tree.tcl (Tree::itemconfigure): Fix intermingling of node names
	and flag values which can cause an lsearch to fail, by mistaking a
	flag value as the node searched for, and then treating a node name
	as flags. As the upd,nodes value is a dictionary it should not be
	search as a list. Now using a temporary array for quicker check
	and append/replace [Bug 3106208].

2010-11-09 Harald Oehlmann <oehhar@users.sourceforge.net>

	* mainframe.tcl Menu text shows white on white on Mac aqua
	[Bug 3105665] reported by Scott Smedley fixed by Kevin Walzer.

2010-10-15 Harald Oehlmann <oehhar@users.sourceforge.net>

	* label.tcl The frame surround the label gets under
	unknown conditions a -padx 5. A pad of 0 is now
	hard coded (Bug 3087955)

2010-08-04 Harald Oehlmann <oehhar@users.sourceforge.net>

	* dialog.tcl Changed behaviour of window close button.
	If -cancel is given, this button is invoked.
	The cancel option may now be changed using the configure
	method.

	* init.tcl If msgcat is available use its locale to load
	a lang/*.rc file instead always using en.rc.

2010-06-09 Harald Oehlmann <oehhar@users.sourceforge.net>

	* Included lang/pl.rc from HEAD.

2010-06-07 Harald Oehlmann <oehhar@users.sourceforge.net>

	**** BWidget 1.9.2 tagged ****
	Version 1.9.1 was skipped.
	This was released in ActiveTCL and thus may exist on many
	installations.

2010-05-31 Harald Oehlmann <oehhar@users.sourceforge.net>

	* listbox.html Reflected patch 2010-05-12 in documentation.
	The selection may not be disabled any more by binding button 1.

2010-05-12 Harald Oehlmann <oehhar@users.sourceforge.net>

	* listbox.tcl(ListBox::bindText and ListBox::bindImage)
	Method bindText and bindImage overwrote internal selection
	bindings [Bug 3000293] reported by Robert Karen.

2010-05-11 Harald Oehlmann <oehhar@users.sourceforge.net>

	* listbox.tcl(ListBox::see) Method see shifts image out of
	view. Showed up, by a selection click on a long item with icon
	[Bug 2999764] reported by Robert Karen.

2010-05-05 Harald Oehlmann <oehhar@users.sourceforge.net>

	* listbox.tcl(ListBox::_configureSelectmode) Drag modifies
	multiple selection [Bug 2995969] reported by Robert Karen.
	Bound events on ButtonRelease-1 instead Button-1 for multiple
	selections to avoid bug.
	* listbox.tcl(ListBox::_drag_and_drop) The default drag and drop
	routine only handled single drag and drop.
	It was extended to handle also drag and drop of multiple entries.

2009-09-03 Harald Oehlmann  <oehhar@users.sourceforge.net>

	* util.tcl(BWidget::place), BWidget.html Widget placed incorrectly,
	when bigger than current screen [Bug 2850031] by Thomas Grausgruber
	Possible incompatibility: BWidget::place w h -> w,h are reduced to
	screen width.

2009-08-12 Harald Oehlmann  <oehhar@users.sourceforge.net>

	* dynhelp.tcl Use balloon help font TkTooltipFont if tk <= 8.5.
	Otherwise use helvetica 11 on Aqua [Patch 2835180] for Kevin Walzer
	* dynhelp.tcl(DynamicHelp::_show_help)Replaced aqua conditional code
	check by $Widget::_aqua

2009-08-10 Harald Oehlmann  <oehhar@users.sourceforge.net>

	* notebook.tcl (NoteBook::delete) Method delete destroyframe=1 and
	reinsertion -> raise failed - state variables were deleted.
	[Bug 2831785] by kjnash
	* tree.tcl (Tree::_keynav) Fire virtual event <<TreeSelect>> also on
	keyboard navigation [Patch 2828086] by Kevin Walzer
	* combobox.tcl Replaced aqua conditional code check by $Widget::_aqua

2009-08-10 Harald Oehlmann  <oehhar@users.sourceforge.net>

	**** Branched to bwidget ****

	This is the bwidget branch of module bwidget of tcllib
	Use "-r bwidget" for all cvs operations
	Scope: Package BWidget compatible to tcl/tk 8.1 and tk
	(e.g. no tile/ttk).

2009-07-24 Harald Oehlmann  <oehhar@users.sourceforge.net>

	**** BWidget 1.9.0 tagged ****

	* pkgIndex.tcl, README.txt: updated to BWidget 1.9

2009-07-23 Harald Oehlmann  <oehhar@users.sourceforge.net>

	* tree.tcl (Tree::_set_help), Tree.html DynamicHelp -helpcmd added to
	tree node help
	* tree.tcl (Tree::_draw_subnodes) a vertical line to a virtual root node
	above the widget is only drawn when there are multiple child nodes.
	This reverts the modification dated 2004-04-21 for this case.
	[Patch 2825354] by Koen Danckaert

2009-07-17 Harald Oehlmann  <oehhar@users.sourceforge.net>

	* scrollframe.tcl (ScrollableFrame::create et al) ScrollableFrame.html
	Background color of canvas takes the color of the scrolled frame.
	If themed, canvas takes the themed color of the scrolled themed frame.
	If themed, parameters -background and -bg are not available(doc + code).
	[Patch 2822970] by Koen Danckaert

2009-07-15 Harald Oehlmann  <oehhar@users.sourceforge.net>

	* dynhelp.tcl (DynamicHelp) Typo from yesterday corrected
	[Patch 2820851] by Koen Danckaert

2009-07-14 Harald Oehlmann  <oehhar@users.sourceforge.net>

	* dynhelp.tcl (DynamicHelp::_leave_info et al) issues:
	- menu help sometimes not cleared when clicking off-window (unix)
	- "-helpcmd" available also when dynamichelp is included in another
	  widget.
	- given "-helpcmd" always called at global scope.
	- Protect against multiple calls of <Leave> event.
	[Patch 2820851] by Koen Danckaert

2009-07-07 Harald Oehlmann  <oehhar@users.sourceforge.net>

	* combobox.tcl (ComboBox::_select) Do not export selection if
	-exportselection 0 [Patch 981545] by Jeffrey Hobbs

2009-07-02 Harald Oehlmann  <oehhar@users.sourceforge.net>

	* widget.tcl (Widget::configure) Bug: ProgressDlg option -geometry
	not setable. The former patch was improved.
	Koen Danckaert and myself argued, that we modify symptoms without
	basic understandings. Anyway, better now than before.

2009-07-01 Harald Oehlmann  <oehhar@users.sourceforge.net>

	* mainframe.tcl, MainFrame.html (MainFrame::getmenustate)
	Added method getmenustate to return menu tag state
	[Bug 948063] reported by Rolf Ade

	* combobox.tcl (ComboBox::configure) Bug fixed: Widget did not take
	focus, when -editable false and "configure -state normal" called.
	[Bug 756334] reported by Rolf Ade
	
	* widget.tcl (Widget::configure) Bug: ProgressDlg option -bg not
	setable. The special handling of subwidgets with special class or
	path ":cmd" was improved. [Bug 611477]
	
	* notebook.tcl (NoteBook::_itemconfigure) Not honored option:
	itemconfigure ... -helptext [Patch 2814050] by Koen Danckaert
	
2009-06-30 Harald Oehlmann  <oehhar@users.sourceforge.net>

	* buttonbox.tcl (ButtonBox::_redraw) Bug corrected:
	-uniform gridding option is used if tcl version >= 8.4 (not 8.3).
	[Patch 2807147] by Koen Danckaert

	* tree.tcl (Tree::_drop_cmd) If there is no node, drop didn't work.
	[Bug 1042613] reported by Rolf Ade
	
	* Tree.html Bind commands: removed promise that %W would work in future.
	The underlying widgets should only be manipulated using the node id.
	[Bug 1224203] by Jasper Taylor, remarks by J. Tang 

	* Tree.html Bind commands: with -selectfill, the given command is
	overwritten for the background box. [Bug 1003962] by Torsten Berg
	
	* dropsite.tcl (DropSite::register) Bug fixed: fails on multiple drop
	targets [Bug 1213123] by T.Neil

	* combobox.tcl (ComboBox::_create_popup) Bug fixed: Return key in drop
	down list when -bwlistbox true [Bug 1205536] patch by Steve Landers
	
	* combobox.tcl (ComboBox::_create_popup, ComboBox::_unmapliste)
	Mac aqua and x11 fixes, multi screen issue still open.
	[Bug 1451784] report by Jasper Taylor, fix by Kevin Walzer

	* listbox.tcl (ListBox::_multiple_select) Selected item not deselected
	on control-click [Bug 1029144] reported by Konrad Rosenbaum
	

2009-06-29 Harald Oehlmann  <oehhar@users.sourceforge.net>

	* ScrolledWindow.html ScrolledWindow documentation changed:
	Documented options: -ipad, -sides, -size, -managed
	[Patch 2807160] Text by Koen Danckaert
	Removed (read only) remark of option -scrollbar.
	
	* scrollframe.tcl (ScrollableFrame::create) changed bindings
	[Patch 2807227] by Koen Danckaert (comment)
	
	* scrollw.tcl (ScrolledWindow::_set_hscroll, ScrolledWindow::_set_vscroll)
	Bug corrected: enless loop when both scrollbars where automatically
	mapped and the window size was changed by this action (on linux).
	Scrollbar unmapping and mapping secured by a locked update [Bug 2783019]

	* widget.tcl (Widget::tkinclude) : option data base entry name keeps the
	original name and not the renamed name.
	The only resulting modification is to rename the option key for
	"MessageDlg -text" from "*MessageDlg.frame.msg.message" to
	"*MessageDlg.frame.msg.text". [Bug 1266792]
	
	* widget.tcl (Widget::init) : fixed a memory leak on wrong option value.
	[Bug 1230737] 
	
2009-06-26 Harald Oehlmann  <oehhar@users.sourceforge.net>

	* listbox.tcl (ListBox::create et al) new feature: listbox option
	-listbox now read/write [Bug 1501874] reported by Stephen Huntley
	
	* dynhelp.tcl (DynamicHelp::_show_help) fixed issue (as far as possible):
	Dynamic help baloon was on the main screen, if it touched the border on
	a windows multi screen configuration.
	The fix assumes, that all screens have same dimensions and no gaps in-
	between. This is necessary, because multi-screen configuration paramters
	may not be interrogated by tk (despite of coordinates out of the screen)
	[Bug 1499135] reported by Gregor

	* notebook.tcl (NoteBook::delete) Deleted also state variables
	[Bug 1445219] reported by Eric Kemp-Benedict

2009-06-25 Harald Oehlmann  <oehhar@users.sourceforge.net>

	* combobox.tcl (ComboBox::getvalue et al) fixed bug: getvalue returned
	first apearence of current data instead of clicked index, which may not
	be the same if values is not unique. Additional variable _index(path)
	added to hold click index [Bug 1610965] reported by Martin Lemburg

2009-06-24 Harald Oehlmann  <oehhar@users.sourceforge.net>

	* scrollframe.tcl (ScrollableFrame::create, ScrollableFrame::_resize,
	ScrollableFrame::_frameConfigure) fixed two issues:
	- Scrollbar activated even if not necessary
	  Fix: update scrolling reagion on configure event of the frame
	- Disfunction if the frame got to small to be on the current view
	  Fix: update scrolling reagion on map or unmap events
	[Patch 2807227] by Koen Danckaert
	
	* buttonbox.tcl (ButtonBox::_redraw) Bug: homogeneous button width
	not honored if button size changes after creation.
	-uniform gridding option is used if tcl version >= 8.3.
	[Patch 2807147] by Koen Danckaert
	
2009-06-16 Harald Oehlmann  <oehhar@users.sourceforge.net>

	* combobox.tcl (ComboBox::_create_popup) In dropdown list,
	a vertical scrollbar was always shown if horizantal is used.
	ScrolledWindow is now called with "-managed 1".
	[Patch 2807160] by Koen Danckaert

2009-06-11 Harald Oehlmann  <oehhar@users.sourceforge.net>

	* combobox.tcl removed \ before empty line (potential
	trap) [Bug 2804961] Andreas Kupries
	
	* dialog.html Documented -geometry option.
	[Bug 1634416] Erik Leunissen

2009-06-10 Harald Oehlmann  <oehhar@users.sourceforge.net>

	* no.rc added norwegian translation file
	[Feature Request 2797153] provided by Lars Martin Hambro
	
	* passwddlg.tcl (PasswdDlg::_verifonpasswd) check for
	disabled password field and confirm directly.
	[Bug 1642050] (Calvin Bascom) Enter key did not confirm
	dialog when -passwdstate disabled.
	
	* combobox.tcl (ComboBox::_select) included [Patch 981545],
	but commented out - it works for me without it.

2009-06-10 Harald Oehlmann  <oehhar@users.sourceforge.net>

	* dialog.html Added documentation for option -buttonwidth
	of Dialog
	[Bug 1668587] (Eric Leunissen)

2009-06-10 Harald Oehlmann  <oehhar@users.sourceforge.net>

	* arrow.tcl initialised set _grab(oldstate) to "normal" to avoid
	error when there is a ArrowButton::_leave without corresponding
	ArrowButton::_enter [Bug 2762361]
	
	* entry.tcl (Entry::_path_command) Add "invoke" to the list of
	internally handled commands
	[Bug 2340320] (patch by relaxmike@users.sourceforge.net)
	
	* uitils.tcl (BWidget::place) BWidget::place used screen width
	instead window width.
	[Bug 1842346] (patch by Niels Gollesch ngoelles@users.sourceforge.net)
	
	* listbox.tcl (ListBox::_redraw_selection) Added check if redrawn
	item is on the to-delete list and thus does not exist any more as
	BWidget. [Bug 1752755] (legolas_a20@users.sourceforge.net]

2008-10-30  Jeff Hobbs  <jeffh@ActiveState.com>

	* tree.tcl (Tree::_node_name_rev): Return node names as they are
	input, and properly handle :: in node names.  This changes
	internal node name reps, but should be transparent to the user,
	except for the result of [insert].

2008-05-26  Jeff Hobbs  <jeffh@ActiveState.com>

	* tree.tcl (Tree::_redraw_selection):       do not allow empty
	* listbox.tcl (ListBox::_redraw_selection): fill color as that
	creates a transparent item that doesn't return a bbox.  This
	showed up on OS X/Aqua, where the listbox selectforeground
	defaults to empty. [AS Bug 77186 74923]

2007-10-31  Jeff Hobbs  <jeffh@ActiveState.com>

	* lang/nl.rc (new): Dutch translation [Bug 1804469]

	* lang/hu.rc (new): Hungarian translation [Bug 1821842]

	* tree.tcl (Tree::insert): do node_name on parent arg [Bug 1046955]

	* listbox.tcl: speed up ListBox insertion significantly. [Bug 1472443]

2007-05-11  Jeff Hobbs  <jeffh@ActiveState.com>

	* widget.tcl (Widget::theme): make sure Tk 8.5a6 is recognized as
	having the themed widgets

2006-12-20  J. Tang  <tang@jtang.org>

	* util.tcl: fixed BWidget::write for widgets that require
	DynamicHelp.  [bug 1518803]

2006-12-05  Andreas Kupries <andreask@activestate.com>

	* demo/demo.tcl (Demo::main): Removed the 'inscope' qualifier from
	  the 'package require Bwidget'. The package system already forces
	  loading and sourcing of package code in the global namespace, so
	  this is bogus.

2006-11-13  J. Tang  <tang@jtang.org>

	* panedw.tcl: if activator is set to line then its width is set to
	3.  --activator was an undocumented option; updated man page to
	make it documented.  Thanks to Jos Decoster for pointing this out.

2006-11-10  J. Tang  <tang@jtang.org>

	* widget.tcl: remove relative namespace resolution of variables,
	in anticipation of TIP 278.  Widget should have been doing this
	anyways.  [bug 1579744]

	* DragSite.html: noted that -draginitcmd can return an empty
	string to prevent a drag [bug 740499]
	
	* DropSite.html: fixed documentation with DropSite::register
	command [bug 740474]

	* combobox.tcl: allow autocomplete and autopost be
	enabled/disabled after the widget was created [bug 1588808]; fixed
	keysym in autopost binding [bug 1589111]

	* tree.tcl: fixed error with drag & drop's autoscroll [bug
	1408494]
	
	* listbox.tcl: fixed error with drag & drop's autoscroll; fixed
	error when dropping at the end of the list

	* Added dynamic help to text tags (man page updated); fixed resize
	bug with scrollframes.  Thanks to Jos Decoster for these patches.

2006-10-20  Jeff Hobbs  <jeffh@ActiveState.com>

	* utils.tcl (BWidget::bindMouseWheel): do not make special
	mousewheel bindings if global ones exist (like from style::as)

2006-09-28  J. Tang  <tang@jtang.org>

	**** BWIDGET 1.8.0 TAGGED ****
	
	* removed Makefile.in

	* font.tcl: correctly handle code path when user cancels dialog

	* passwd.tcl: fixed Dialog::enddialog error; fixed ordering error

	* pkgIndex.tcl, README.txt: updated to BWidget 1.8

	* removed configure.in and aclocal.m4

	* messagedlg.tcl: explicitly marked the 'Abort' button upon -type
	abortretryignore to be the default button [bug 970199]

	* Tree.html: documented [find] and [line] commands [bug 626819];
	noted bug with %W binding [bug 1224203]

	* tree.tcl: added [bindArea] procedure; updated man page [patch
	839066]

	* combobox.tcl: added [clearvalue] proc to explicitly clear a
	ComboBox value, updated man page [patch 780704]

2006-09-26  J. Tang  <tang@jtang.org>

	* passwd.tcl: don't ignore -labelwidth when calculating label
	widths; return key moves through subwidgets like most login
	managers [patch 922877, with slight change]

	* font.tcl: add options to select font color and to disable font
	sizes; updated man pages [patch 1531199]

	* font.tcl: using arrow keys to browse font family / font size
	will cause an update to the shown sample font [patch 947109]

	* demo/basic.tcl: fixed Entry's enter command callback [bug
	1400838]

2006-08-21  J. Tang  <tang@jtang.org>

	* combobox.tcl: unpost after autoposting when another Tk window
	gets the focus; unpost upon hitting the enter key

	* scrollw.tcl: allow toggling of scrollbars [bug 1488712]

	* Tree.html: corrected documentation for Tree::opencmd (callback
	does not append the path to the tree to the command) [bug 1507713]

	* tree.tcl: disable keyboard navigation for empty trees [bug 1514855]

	* tree.tcl: changed '-drawcross allways' to be '-drawcross
	always'; updated documentation

2006-06-29  Jeff Hobbs  <jeffh@ActiveState.com>

	* statusbar.tcl (StatusBar::remove): remove neighboring separator
	when removing the first item. [Bug 1512671]

2006-03-24  J. Tang  <tang@jtang.org>

	* pkgIndex.tcl: removed bogus "ControlFrame" entry [bug 1429405]

	* MainFrame man page: fixed some typos on man page

	* mainframe.tcl: fixed status bar placement when it is re-shown
	after a [showstatusbar none] command [bug 1027568]

2006-03-23  J. Tang  <tang@jtang.org>

	* dynhelp.tcl: if a widget's help balloon is being displayed when
	that widget is destroyed, also destroy the associated balloon [bug
	1448424]

	* listbox.tcl: when deleting an item from the ListBox that has
	dynamic help text, also remove its entry from the help array [bug
	1443461]

2006-02-10  J. Tang  <tang@jtang.org>

	* ProgressDlg man page: note that caller must invoke [update], the
	progressbar will not do it automatically [bug 1105778]

	* progressbar.tcl: -maximum value must now be non-zero, else
	divide by 0 occurs [bug 1145523]; use double() calculations to
	prevent integer overflow with very large -maximum values [bug
	900165]

	* PagesManager man page: clarified [add] behavior and default
	state [bug 1305988]

2006-02-08  J. Tang  <tang@jtang.org>

	* combobox.tcl: allow -autocomplete with uppercase chars [bug
	996569]; added -autopost option [patch 1359041]

	* dynamic help man page: added clarification to -variable

2006-01-25  J. Tang  <tang@jtang.org>

	* buttonbox.tcl: fixed -homogeneous calculation [bug 1362899]

2005-11-01  Jeff Hobbs  <jeffh@ActiveState.com>

	* color.tcl (SelectColor::menu): use native dialog for palette
	menu item where possible (and Widget::theme is used).

2005-10-31  Jeff Hobbs  <jeffh@ActiveState.com>

	* statusbar.tcl: correct Widget::theme typos

2005-10-12  Jeff Hobbs  <jeffh@ActiveState.com>

	* mainframe.tcl (MainFrame::configure): need to ignore -bg change
	check when themed.

2005-09-28  Jeff Hobbs  <jeffh@ActiveState.com>

	* mainframe.tcl (MainFrame::_create_menubar): ignore -bg -bd opts
	when themed

2005-09-22  Jeff Hobbs  <jeffh@ActiveState.com>

	* font.tcl (SelectFont::_getfont): fix tile compat to still set
	data(family) and data(size) in any case.

2005-09-19  Jeff Hobbs  <jeffh@ActiveState.com>

	* mainframe.tcl: 
	* font.tcl: remove tile compat options that aren't valid.

2005-08-23  Jeff Hobbs  <jeffh@ActiveState.com>

	* mainframe.tcl: extend ttk theme awareness to subframes/separators

2005-08-10  Jeff Hobbs  <jeffh@ActiveState.com>

	* mainframe.tcl (MainFrame::create): make ttk theme aware

2005-07-27  Jeff Hobbs  <jeffh@ActiveState.com>

	* statusbar.tcl: if themed, use ttk::separator
	* scrollframe.tcl: if themed, use ttk::frame
	* font.tcl: if themed, use ttk::comboboxes and ttk::checkbuttons
	* widget.tcl: encapsulate all .#BWidget* hidden widgets into a
	single frame .#BWidget to clean up main '.' childspace.
	Add 'Widget::theme ?boolean?' that, if enabled, has BWidgets try
	to use some ttk themed widgets (*very* incomplete).

	* init.tcl (Widget::_opt_defaults): make a proc for opt defaults,
	recognize aqua as a platform

2005-02-25  Jeff Hobbs  <jeffh@ActiveState.com>

	* lang/da.rc (new): Danish language file [Bug 1151534] (elhaard)

2005-01-25  Jeff Hobbs  <jeffh@ActiveState.com>

	* notebook.tcl: reverted lester patch - too many bugs related to
	deleting and reinsertion of tabs.

2004-12-01  Jeff Hobbs  <jeffh@ActiveState.com>

	* notebook.tcl: speed improvements via array hashing for many tabs
	(lester).

2004-10-09  Rolf Ade  <pointsman@users.sourceforge.net>

	* mainframe.tcl: (MainFrame::_parse_accelerator) made
	  accelerator Ctrl-f in -menu definitions work. [Bug 1043107] 

2004-09-24  Jeff Hobbs  <jeffh@ActiveState.com>

	* color.tcl: use toplevel instead of menu for dropdown color menu
	and do better focus/grab restoration.

	* utils.tcl (BWidget::RestoreFocusGrab,SetFocusGrab): add BWidget
	equivalents of what Tk uses for better stacked grab/focus mgmt.

	* dialog.tcl (Dialog::create): withdraw topleve immediately after
	creation.

2004-09-14  Jeff Hobbs  <jeffh@ActiveState.com>

	* listbox.tcl: add FocusIn redirector to %W.c, add explicit
	-takefocus 0 to the frame parent.

	* widget.tcl (Widget::focusPrev): hack to avoid focus into direct
	parent when it is a megawidget. [Bug 765667]

	* notebook.tcl (NoteBook::_draw_page): adjust height for bottom
	drawn tabs. [Bug 988628]

2004-09-09  Jeff Hobbs  <jeffh@ActiveState.com>

	* panelframe.tcl (new): new PanelFrame widget which creates a
	* pkgIndex.tcl:         frame with boxed title area that accepts
	* Makefile.in:          additional widgets.
	* BWman/contents.html: 
	* BWman/navtree.html:
	* BWman/PanelFrame.html (new): 

	* statusbar.tcl: improve init to use bwidget's automated arg
	passing for subwidgets.  Simplify delete subcommand to call remove.

	* xpm2image.tcl (xpm-to-image): correctly recognize None with
	-nocase

2004-09-02  Jeff Hobbs  <jeffh@ActiveState.com>

	* buttonbox.tcl, combobox.tcl: code safety fixes

	* dialog.tcl: default button width to -11 on Win8.4, 8 otherwise

	* color.tcl, font.tcl, messagedlg.tcl:
	* passwddlg.tcl, progressdlg.tcl: change dialogs to anchor buttons e

	* statusbar.tcl: better -bg handling (configure too), and tighten
	up spacing on resize control to place it flush bottom right

2004-09-01  Jeff Hobbs  <jeffh@ActiveState.com>

	* statusbar.tcl: add -showseparator optional horizontal separator.

2004-08-31  Jeff Hobbs  <jeffh@ActiveState.com>

	* statusbar.tcl: correct name of image for use on unix.
	Try to use of PNG image at each create (it just looks better).

2004-08-26  Jeff Hobbs  <jeffh@ActiveState.com>

	* tree.tcl (Tree::delete): call -selectcommand if we delete
	something that was selected.

2004-08-25  Jeff Hobbs  <jeffh@ActiveState.com>

	* statusbar.tcl: correct use of PNG vs. GIF image.
	Don't abort creation of statusbar when gridded - just don't try
	to resize.
	Correct example to use label -width 1

2004-08-20  Jeff Hobbs  <jeffh@ActiveState.com>

	* statusbar.tcl (new): Addition of a statusbar container widget
	* pkgIndex.tcl:        with resize control
	* Makefile.in:
	* BWman/contents.html: 
	* BWman/navtree.html:
	* BWman/StatusBar.html (new): 

2004-05-12  Jeff Hobbs  <jeffh@ActiveState.com>

	* font.tcl (SelectFont::create): don't hardcode -bd 2 when
	creating the style selectbuttons.

	* dynhelp.tcl (_show_help): account for OS X help style

2004-05-04  Jeff Hobbs  <jeffh@ActiveState.com>

	* listbox.tcl (_keyboard_navigation): make sure you can see the
	item that you key navigate to. (aas)

2004-04-26  Jeff Hobbs  <jeffh@ActiveState.com>

	* tree.tcl (_update_nodes): align with _draw_nodes code,
	specifically correcting placement of cross on new nodes and anchor
	of changed window/image.

2004-04-23  Jeff Hobbs  <jeffh@ActiveState.com>

	* listbox.tcl (create): don't force -highlightthickness 1 as it
	prevents the user changing it on creation.
	(_draw_item): pass more cached info from _redraw_items for speed.
	(_redraw_selection): correct drawing of selfill for items that
	extend beyond the width of the window.

2004-04-22  Jeff Hobbs  <jeffh@ActiveState.com>

	* tree.tcl (edit): correct inversion of verifycmd emptiness test.
	* listbox.tcl: correct eval/after/lists usage.
	(_redraw_listbox): call _update_select_fill on redraw, otherwise
	the insert of items causes wonkiness.
	(_redraw_items): call update idle after changing cursor.
	(create): Insert $path into the canvas bindings, so that anyone
	binding directly onto the widget will see their bindings activated
	when the canvas has focus. Add slightly modified up/down bindings
	to the canvas, in case it gets the focus (like with -autofocus).

2004-04-21  Jeff Hobbs  <jeffh@ActiveState.com>

	* tree.tcl (_draw_subnodes): Adjust the drawing of the line to the
	first root node to start at the vertical point (not go up).

	* entry.tcl, arrow.tcl, combobox.tcl: better space/list handling

	* entry.tcl: make the icursor not appear for non-editable and/or
	state disabled comboboxes.

2004-03-08  Joe English  <jenglish@users.sourceforge.net>

	* init.tcl: (bugfix) Use <<PrevWindow>> virtual event instead
	of <Shift-Tab> event for back-tab binding.

2004-02-07  Jeff Hobbs  <jeffh@ActiveState.com>

	* progressbar.tcl (ProgressBar::_modify): convert rect coords to
	ints to prevent left-over lines that are likely due to a bug in
	core Tk related to fractional coord refresh.

2004-02-03  Jeff Hobbs  <jeffh@ActiveState.com>

	* scrollw.tcl (ScrolledWindow::create): correctly set -relief and
	-bd at creation time. [Bug #873666]

	* init.tcl: don't modify *Listbox.background and *Button.padY
	options - leave core widgets alone.

	* mainframe.tcl (MainFrame::_create_menubar): set the bg for menus
	only on unix (otherwise disturbs menu native L&F)
	Correct some eval/list issues.

	* BWman/MainFrame.html: 
	* mainframe.tcl (MainFrame::_create_entries): correct 'cascade'
	spelling, but support old 'cascad' as well.

2004-01-28  Reinhard Max  <max@suse.de>

	* configure.in: bumped to v1.7.
	This should have happened before releasing 1.7.0.

	* Makefile.in: fixed support for DESTDIR.

2004-01-05  Damon Courtney  <damon@unreality.com>

	* init.tcl: Added a binding to the Tk spinbox to handle
	traversal as loading BWidgets seems to screw up the default
	handling for Tk.  [Bug #867604]

	* utils.tcl: Fixed a bug that would cause some geometry calculations
	in BWidget::place to behave incorrectly.  This would occasionally
	make it appear as though a drawn dialog would freeze the application.
	[Bug #868315]

2003-12-18  Bob Techentin <techentin@sourceforge.net>

	**** BWIDGET 1.7.0 TAGGED ****

	* README.txt: Changed revision to 1.7.0.  Note that
	1.7.0 does not include 2003-11-26 mod to notebook.tcl.

2003-11-26  Jeff Hobbs  <jeffh@ActiveState.com>

	* notebook.tcl (NoteBook::bindtabs): correct tab name returned.	(groth)

2003-11-17  Jeff Hobbs  <jeffh@ActiveState.com>

	* entry.tcl (Entry::create): add missing line continuation.
	[Patch #843932] (oehlmann)

2003-11-10  Damon Courtney  <damon@unreality.com>

	* entry.tcl: Use a button widget for -disabled options if
	we're using 8.3 [Bug 839469]

2003-11-05  Damon Courtney  <damon@unreality.com>

	* combobox.tcl: Fixed dropdown listbox selection for
	standard Tk listbox [Bug 831496].

2003-11-05  Jeff Hobbs  <jeffh@ActiveState.com>

	* scrollview.tcl (ScrollView::_set_view): correct :canvas to
	renamed :cmd.

2003-10-30  Jeff Hobbs  <jeffh@ActiveState.com>

	* scrollw.tcl (ScrolledWindow::setwidget): check that the old
	widget associated still exists before unconfiguring it. [Bug #833034]

2003-10-27  Damon Courtney  <damon@unreality.com>

	* combobox.tcl, listbox.tcl: Fixed keyboard navigation in the
	combobox drop down [Bug 831496].

	* listbox.tcl: Added curselection subcommand to mimic Tk listbox
	behavior.

	Added keyboard navigation to the listbox.

	* widget.tcl: Added Widget::exists command to return whether a
	widget is a BWidget (based on whether it exists in the _class array).

	Widget::destroy now properly unsets the widget's variable in
	the _class array.

2003-10-27  Joe English  <jenglish@users.sourceforge.net>
	* DragSite.html, DropSite.html: Fix markup errors [Bug #740484]

2003-10-20  Damon Courtney  <damon@unreality.com>
	* arrow.tcl, bitmap.tcl, button.tcl, buttonbox.tcl, color.tcl,
	* combobox.tcl, dialog.tcl, dragsite.tcl, dropsite.tcl, entry.tcl
	* font.tcl, label.tcl, labelentry.tcl, labelframe.tcl, listbox.tcl
	* mainframe.tcl, messagedlg.tcl, notebook.tcl, pagesmgr.tcl
	* panedw.tcl, passwddlg.tcl, progressbar.tcl, progressdlg.tcl
	* scrollframe.tcl, scrollview.tcl, scrollw.tcl, separator.tcl
	* spinbox.tcl, titleframe.tcl, tree.tcl, utils.tcl, widget.tcl
	* xpm2image.tcl: Revamp again to let core Widget commands handle
	most of the esoteric work of creating and destroying widgets
	properly in the BWidget environment.

	The command Widget::define defines a class, its filename and a
	list of classes which it uses.  This command handles creating
	the command to create new widgets, creates a ::use command for
	the class and calls the ::use command for each class included.

	The command Widget::create does the renaming of the widget to
	$path:cmd and creates the proc to redirect the widget commands.

	Widget::destroy now does the rename $path "" that almost all
	widgets do.

	* button.tcl: Added a -state option to configure the state of the
	entire box at once.

	Added new insert and delete subcommands.

	Added an after cancel to stop button repeat upon release.
	[Bug 697022]

	* combobox.tcl: Added -bwlistbox, -listboxwidth and -hottrack options.
	-images option already existed, but now it actually does something.

	Added getlistbox, get, icursor, post and unpost subcommands.

	* dynhelp.tcl: Added add subcommand to replace the (now) deprecated
	register command.  The new command adds for a lot more flexibility
	in applying dynamic help.

	Help popup now comes up -topmost 1 on Windows if available.

	* entry.tcl: Added -disabledbackground option so that the BWidget
	entry more closely resembles the standard Tk entry.
	[Bug 638236].

	* init.tcl: Moved Widget::traverseTo into widget.tcl.

	* label.tcl: Renamed BWLabel class to just Label.

	* listbox.tcl: Added a default -dropcmd so that if -dragenabled
	and -dropenabled are true, drag-and-drop within the same widget
	is possible without any other options.

	Added -autofocus option to specify that clicking within the listbox
	should draw the focus in order to handle mouse wheel events.

	Added -selectfill option for drawing a full selection rectangle
	around selected items instead of just around the item.

	Added getcanvas subcommand.  [Bug 436762].

	bindImage and bindText now map %W to $path in order to get an
	accurate path in events.  This can probably be fixed better
	when we have more control over event parameters.  [Bug 607745]

	Added mouse wheel bindings by default.

	Added <<ListboxSelect>> event when selection changes.

	* mainframe.tcl: Fixed bug for adding CTRL-F items to a mainframe
	[Bug 784269]

	* messagedlg.tcl: Added -buttonwidth option.

	* notebook.tcl: Added dynamic help to tabs.

	Added -tabpady option to specify the padding between the text and
	the tab.

	Notebooks now handle multi-line text properly.  [Bug 565284]

	* scrollview.tcl: Rewritten to use a variable per path instead of
	a big array.

	* tree.tcl: Added -anchor option to nodes to specify the anchor for
	an image or window when displayed.

	Added -crossopenimage, -crosscloseimage, -crossopenbitmap and
	-crossclosebitmap options to change the open / close cross.

	Added mouse wheel bindings by default.

	Added toggle subcommand to toggle a single tree node.

	Added <<TreeSelect>> event when selection changes.

	The characters "& | ^ !" are all converted to | silently in
	node names.  This is to avoid errors because these characters
	are special to the canvas widget.  [Bug 746960]

	bindImage and bindText now map %W to $path in order to get an
	accurate path in events.  This can probably be fixed better
	when we have more control over event parameters.  [Bug 607745]

	* utils.tcl: Added BWidget::wrongNumArgsString command to return
	a standard wrong # args error string.

	Added BWidget::classes command that returns a list of all classes
	required by a given class.

	Added BWidget::inuse command to determine if a given class is inuse.

	Added BWidget::library command to return a body of code that can
	be saved into a project or other code based on the given classes.
	When called with a list of classes, all the classes and code
	necessary to use those classes is returned in a large string which
	can then be written out to a file.

	Added BWidget::write command to write to a given file the current
	set of classes that are in use.

	Added BWidget::bindMouseWheel command to setup default mouse
	bindings on a given widget.

	* widget.tcl: Added a new option type 'Padding' which will accept
	the standard padding arguments in Tcl 8.4+.

	Added Widget::define command to define a new BWidget class.

	Added Widget::create command to create a BWidget properly.

	Widget::destroy now attempts to delete a widget command created
	through Widget::create.

	Added Widget::options command to return the current options of
	a given widget in a style that can be used to serialize a widget.

	Added Widget::getOption command to get options based on children
	having the same option.

	* wizard.tcl: Added new Wizard widget.


2003-10-17  Jeff Hobbs  <jeffh@ActiveState.com>

	* arrow.tcl, bitmap.tcl, button.tcl, buttonbox.tcl, color.tcl,
	* combobox.tcl, dialog.tcl, dragsite.tcl, dropsite.tcl, entry.tcl
	* font.tcl, label.tcl, labelentry.tcl, labelframe.tcl, listbox.tcl
	* mainframe.tcl, messagedlg.tcl, notebook.tcl, pagesmgr.tcl
	* panedw.tcl, passwddlg.tcl, progressbar.tcl, progressdlg.tcl
	* scrollframe.tcl, scrollview.tcl, scrollw.tcl, separator.tcl
	* spinbox.tcl, titleframe.tcl, tree.tcl, utils.tcl, widget.tcl
	* xpm2image.tcl: major revamp to reduce incorrect use of eval and
	other list-safetiness evils.  Also change !strcomp to streq.

2003-08-06  Jeff Hobbs  <jeffh@ActiveState.com>

	* listbox.tcl: Correct Listbox selection drawing [Bug #781652]

2003-07-17  Joe English  <jenglish@users.sourceforge.net>
	* init.tcl, combobox.tcl:  Fix for [Bug 720032] "BWidget
	breaks Tk entry behaviour".  Highlight the entry
	in a <<TraverseIn>> binding, instead of doing so
	on every <FocusIn> event.  Change the global <Tab> 
	and <Shift-Tab> bindings to generate <<TraverseIn>>
	and <<TraverseOut>> events.

2003-07-17  Jeff Hobbs  <jeffh@ActiveState.com>

	* notebook.tcl: Use list with eval for safety.
	Use lsearch -exact instead of default -glob in all uses.

	* listbox.tcl (_multiple_select): correct shift-selection when
	selectmode is multiple.  [Bug 653266]
	Use lsearch -exact instead of default -glob in all uses.
	Use list with eval for safety.

	* BWman/ScrolledWindow.html: clarify management of embedded widget.

2003-06-23  Damon Courtney <damon@unreality.com>
	* combobox.tcl: Added a little better handling of keys in the
	auto-complete.

2003-06-06  Damon Courtney <damon@unreality.com>
	* combobox.tcl: Added a rudimentary auto-complete function
	with option (-autocomplete) that is turned off by default.
	Over time, I'm sure this function can be improved, but I
	think it works pretty well for now.

	* BWman/ComboBox.tcl: Added documentation for -autocomplete.

2003-06-05  Damon Courtney <damon@unreality.com>
	* listbox.tcl: Liberal use of list where appropriate to make
	the code safe for space-containing node names.

2003-05-23  Bob Techentin <techentin@sourceforge.net>

	**** BWIDGET 1.6.0 TAGGED ****

	* README.txt: 

2003-05-18  Jeff Hobbs  <jeffh@ActiveState.com>

	* progressbar.tcl: correctly handle progressbar being quickly
	created and deleted by deleting afters and checking var existence.

2003-05-18  Joe English  <jenglish@users.sourceforge.net>

	* widget.tcl (Widget::focusOK): Don't assume that '-editable' 
	option is always 1 or 0 for all widgets. [Bug 710658]

2003-05-14  Jeff Hobbs  <jeffh@ActiveState.com>

	* demo/tree.tcl: make the tree scrollview make sense in demo.
	[Bug 684462]

	* notebook.tcl: ensure that bd is min 1 at all times. [Bug 688227]
	Correct use of eval with list.

	* tree.tcl: correct node lsearch'ing to use -exact to allow for []
	containing nodes [Bug 628041] (decoster)

2003-05-07  Jeff Hobbs  <jeffh@ActiveState.com>

	* dynhelp.tcl (DynamicHelp::_motion_balloon): correctly listify
	after delayed _show_help callback.

2003-05-06  Jeff Hobbs  <jeffh@ActiveState.com>

	* scrollw.tcl (ScrolledWindow::setwidget): remove any existing
	widget before setting the next.

2003-05-01  Jeff Hobbs  <jeffh@ActiveState.com>

	* tree.tcl (Tree::configure, Tree::_draw_node): add a full-width
	box underneath the text and image/window that will react to the
	node binding if -selectfill is true.  It is an empty box that is
	overly wide, but it could be improved to resize on Configure to
	just the window width and replace the sel box.

2003-04-23  Jeff Hobbs  <jeffh@ActiveState.com>

	* tree.tcl: liberal use of list where appropriate to make the code
	safe for space-containing node names.
	Make use of string equal instead of !string compare.
	(Tree::_redraw_selection): correct -selectfill to include the
	image, in any, in the bbox calculation since it may be larger.

2003-04-15  Damon Courtney <damon@unreality.com>

	* listbox.tcl
	* tree.tcl: Added a #auto substitution for inserting new items
	into a tree or listbox.

	* BWman/ListBox.html
	* BWman/Tree.html: Added documentation for #auto substitution.

2003-04-14  Jeff Hobbs  <jeffh@ActiveState.com>

	* utils.tcl (BWidget::focus): add optional refocus arg
	* combobox.tcl: make droplist use solid 1-pixel relief more in
	accordance with Windows style.  Set topmost attribute on droplist.
	Add bindings that unmap the droplist if we lose focus to another
	application (where [focus] == ""), without refocusing to the entry.

2003-04-11  Jeff Hobbs  <jeffh@ActiveState.com>

	* combobox.tcl (ComboBox::_expand): add tab expansion behavior
	when -expand tab is specified
	(ComboBox::_focus_in): autohighlight full contents only when no
	existing selection exists. [Bug #720024]

	* BWman/ComboBox.html: doc -expand none|tab

2003-03-12  Damon Courtney <damon@unreality.com>

	* listbox.tcl: Added dynamic help support to listbox items.

	* tree.tcl: Fixed a little inconsistency in the tree dynamic help.
	We don't need to save the whole path in the help array, just the
	node.

2003-02-25  Jeff Hobbs  <jeffh@ActiveState.com>

	* scrollw.tcl: add lock around grid remove scrollbar to prevent
	infinite loop in small window situations. (kienzle)

	* pkgIndex.tcl:
	* configure.in: bumped to v1.6

	* scrollw.tcl: complete rewrite of ScrolledWindow widget to
	address infinite loop scrollbar problems.  This one is much
	simpler and does not suffer the infinite loop.  There still seems
	to be an issue with shrinking smaller than one scrollbar width /
	height in size, but that's not common (nor fatal).  Addresses
	[Patch #671821, #520903] [Bug #472718, #564691]
	This may introduce new incompatabilities, but it does work as
	expected for noted bugs and in the demos.

	* widget.tcl: code cleanup
	* scrollframe.tcl: code cleanup

2003-02-24  Jeff Hobbs  <jeffh@ActiveState.com>

	* panedw.tcl (_realize): only allow _realize to be called once the
	Configure binding has triggered once. [Bug #613134]
	[Patch #63500] (decoster)

2003-02-17  Jeff Hobbs  <jeffh@ActiveState.com>

	* font.tcl: comment out the adding of default style bits for bold
	and italic.  The allows setting the font to something like
	"Courier 8", clicking B on and off and getting "Courier 8" back
	again (otherwise gave "Courier 8 normal roman").

2003-02-08  Damon Courtney <damon@unreality.com>
	* BWman/SelectColor.html
	* color.tcl:   Cleaned up some of the documentation of SelectColor
	  and made it actually work like the documentation says it does.

	* BWman/DynamicHelp.html
	* dynhelp.tcl:  Added -topbackground, -padx and -pady options to
	  allow a little more flexibility in the look-and-feel of balloons.

	  Added the ability to bind dynamic help to individual items or tags
	  on a canvas.

	* BWman/Tree.html
	* tree.tcl:  Added -padx and -deltax options to individual nodes
	  within a tree.  Each option defaults to -1, meaning to take its
	  value from the global option of the same name.

	  Added dynamic help to nodes within a tree.  Adds the following
	  options: -helptext, -helptype and -helpvar to each node.

	* BWman/BWidget.html
	* utils.tcl:  Added BWidget::badOptionString utility to return a
	  standard error string when a given option doesn't match a list.

	* BWman/Widget.html
	* widget.tcl:  Added Widget::getVariable proc to create a reference
	  to a variable relative to the given widget path.

2003-01-26  Damon Courtney <damon@unreality.com>
	* BWman/DynamicHelp.html:
	* dynhelp.tcl:  Added -state option to disable help balloons on a
	  global scale.

	* BWman/Tree.html:
	* tree.tcl: Added -crossfill option to allow the + / - bitmap to
	  be filled with a different color than the connecting node lines.
	  -linesfill is now accurate in its help entry and only adjusts
	  the foreground color of the lines between the nodes.

2003-01-24  Joe English  <jenglish@users.sourceforge.net>
	* tree.tcl (Tree::delete, Tree::_subdelete): remove all deleted
	nodes from the the selection [Bug #621178].

2003-01-17  Pat Thoyts  <patthoyts@users.sourceforge.net>

	* labelentry.tcl: fixed -textvariable option [bug #649383]

2002-10-14  Jeff Hobbs  <jeffh@ActiveState.com>

	* pkgIndex.tcl:
	* configure.in: bump version to 1.5

	* button.tcl: remove -repeatdelay and -repeatinterval for 8.4 to
	allow Button to override them. [Bug #620103]

	* combobox.tcl: make -entrybg also control the listbox background.
	[Bug #519189] (chevreux)

	* tree.tcl (_see): change to always show left edge of requested
	item. [Patch #556077] (english)  [NOTE: also included Patch #621331 
	"Allow delete of selected Tree nodes"]

	* dynhelp.tcl: allow variable and balloon help simultaneously.
	[Patch #567982] (decoster)

	* BWman/LabelFrame.html:
	* labelframe.tcl: allow -bitmap -image and -textvariable options
	of the BWLabel component of a LabelFrame. [Patch #620753] (decoster)

	* widget.tcl (_get_tkwidget_options): withdraw toplevel if it is
	the TkResource base widget. [Patch #620754] (decoster)

	* tree.tcl (delete): correct tree deletion with selected nodes.
	[Patch #621331] (decoster)

	* progressbar.tcl (_modify): use updated idletasks instead of
	update. [Patch #622927] (decoster)

2002-09-25  Jeff Hobbs  <jeffh@ActiveState.com>

	* Makefile.in: better DESTDIR/libdir support (steffen)

2002-09-11  Jeff Hobbs  <jeffh@ActiveState.com>

	* color.tcl (SelectColor::menu): added tkwait and update to make
	sure that the grab doesn't fail on Unix.

	* listbox.tcl: corrected multiple selectmode bindings.
	[Patch #483838, Bug #594853] (decoster)

2002-08-23  Andreas Kupries  <andreas_kupries@users.sourceforge.net>

	* tree.tcl: Modified subcommand 'includes' of the method
	  'selection to properly extract its argument. ... Revamped the
	  whole subcommand to properly extract and check its arguments.

	  (create) Added Control-Button-1 bindings to allow toggling the
	  selection of a node. I will do no bindings for shift-selecting
	  and/or drag-selecting ranges. To complex for me right now.

	  Moved the code executing the -selectcommand callback to an
	  internal procedure, and added calls to that procedure to all
	  subcommands which change the selection. This fixes SF Bwidget
	  Bug #547245.

	* BWman/Tree.html: Documented the 'includes' and 'range'
	  subcommands of the method 'selection' of tree widgets.
	  Documented the node option '-selectable'. Documented that the
	  subcommands extending or setting the selection silently ignore
	  unselectable nodes. Documented new 'toggle' subcommand of method
	  'selection'. Documented option --slectcommand'. Fixed bogus
	  table html in option lists.

2002-06-04  Jeff Hobbs  <jeffh@ActiveState.com>

	**** BWIDGET 1.4.1 TAGGED ****

	* README.txt: 
	* configure.in: 
	* pkgIndex.tcl: up'ed version to 1.4.1

	* listbox.tcl: corrected use of 'end' as move index. [Bug #561391]
	* buttonbox.tcl: 
	* tree.tcl: force frame -padx/-pady to 0 to handle 8.4+ frame
	padding options. [Bug #545119]

	* scrollframe.tcl: corrected scrollregion configuration on
	Configure of frame to use full width/height of canvas when the
	canvas is larger.  This ensures that scrolling "anchors" properly
	to topleft.

	* dialog.tcl: prevent dialog from freezing on Windows with tkwait
	visibility on withdrawn toplevels. [Patch #521386] (chevreux)

	* font.tcl: reworked loadfont to not sort font names unless
	requested.  [Patch #524353] (kienzle, hobbs)

	* panedw.tcl: corrected handling of weighted panes following a
	Configure event. [Patch #513320] (decoster)

	* progressbar.tcl: Fixed display of vertical progressbar.
	[Patch #561403]

2002-05-29  Andreas Kupries  <andreas_kupries@users.sourceforge.net>

	* combobox.tcl: Changed relief of popup list to ridge, for Win*
	  platforms.

2002-05-09  Andreas Kupries  <andreas_kupries@users.sourceforge.net>

	* dynhelp.tcl: Accepted patch for bug 528929. Reported by
	  <bach@users.sourceforge.net>, patch also by him.

2002-04-25  Andreas Kupries  <andreas_kupries@users.sourceforge.net>

	* notebook.tcl: Accepted patch for bug #532246, fixing the
	  appearance of the tabs so that text is always visible
	  completely.

2002-01-26  Pat Thoyts  <patthoyts@users.sourceforge.net>

	* utils.tcl: Modified BWidget::place to support multiple screens
	under Windows. Better support would require Tk modifications.
	* demo/tree.tcl: Fixed for starting on secondary monitor under
	windows.
	* BWMan/BWidget.html: added documentation for BWidget::place.
	
2002-01-22  Jeff Hobbs  <jeffh@ActiveState.com>

	**** BWidget 1.4.0 tagged ****

	* widget.tcl: added Color as an optional type, with _test_color
	test.  [RFE #443124].

2002-01-15  Jeff Hobbs  <jeffh@ActiveState.com>

	* BWman/ComboBox.html: removed reference to label options that
	were removed when the LabelFrame was dropped.  [Bug #477130]

	* listbox.tcl: allowed drop handler to work in empty listbox.
	[Bug #456883]

	* mainframe.tcl: correct unprotected eval calls.  [Patch #501210]
	(chevreux)

2001-12-28  Jeff Hobbs  <jeffh@ActiveState.com>

	* BWman/Dialog.html:
	* dialog.tcl: Added '-transient' and '-place' flags.
	[Patch #483838] (decoster)

	* BWman/Tree.html:
	* tree.tcl: Added a 'recursive' argument to 'Tree::opentree' and
	'Tree::closetree'. [Patch #483838] (decoster)

	* BWman/ProgressBar.html:
	* progressbar.tcl: Added new type 'nonincremental_infinite' and
	modified movement of progressbar when in 'infinite' or
	'nonincremental_infinite' mode. The 'nonincremental_infinite' can
	be used when a certain process monitored by a ProgressBar returns
	a total count and not an increment count. [Patch #483838] (decoster)

	* BWman/PanedWindow.html:
	* panedw.tcl: Added '-weights' flag with possible value 'extra' or
	'available'.  Since BWidget-1.3.1, the meaning of the '-weight'
	flag for the 'PanedWindow::add' command was changed. This made it
	difficult to create a layout where the panes occupy a certain
	amount of the screen. When using the '-weights extra' flag when
	creating a PanedWindow widget, the >=1.3.1 behavior is used: the
	weights for the different panes are only used for extra space.
	When using the '-weights available' flag, the weights for the
	different panes are used to set the size of each panes relative to
	the total available space. [Patch #483838] (decoster)

	* BWman/ListBox.html:
	* listbox.tcl: Added '-selectmode' flag and 2 possible
	select-modes: single and multiple. [Patch #483838] (decoster)

	* widget.tcl: Select element 4 (was 3) from the config-options to
	get value from optiondb. [Patch #483838] (decoster)

	* utils.tcl: added else case to place is called with location
	different from 'at' and 'center' and without a parent.
	[Patch #484123] (decoster)

	* mainframe.tcl: added options -menubarfont, -menuentryfont and
	-statusbarfont at creation time of the widget as well as
	subsequent configures. [Patch #479935] (chevreux)

	* listbox.tcl: added multipleinsert command to allow faster
	inserts of multiple items. [Patch #458446] (chevreux)
	* widget.tcl: added Widget::copyinit. [Patch #458446] (chevreux)

	* BWman/NoteBook.html:
	* notebook.tcl: added options for enhanced tab shape in notebooks.
	[Patch #402466] (haneef)

	* configure.in:
	* pkgIndex.tcl:
	* README.txt: bumped version to 1.4.0 (not released)

	* mainframe.tcl (_create_menubar): start tagstate initially on.
	[Patch #470273] (chevreux)
	(_parse_accelerator): improve F* function key accelerator support.
	[Patch #444172] (venski)

2001-10-14  Jeff Hobbs  <jeffh@ActiveState.com>

	* pagesmgr.tcl: reverted fix of 2001-10-11 - it was bogus.

2001-10-11  Jeff Hobbs  <jeffh@ActiveState.com>

	* pagesmgr.tcl: allowed the ability to specify page by name,
	not just number.

2001-09-11  Andreas Kupries  <andreas_kupries@users.sourceforge.net>

	* notebook.tcl: Removed 'Canvas' from the list of bindtags for the
	  internal canvas to prevent interference from application
	  specific bindings with our special widget. [459033].

2001-09-06  Andreas Kupries  <andreas_kupries@users.sourceforge.net>

	* passwddlg.tcl: Accepted change by Bastien Chevreux
	  <bach@users.sourceforge.net> adding a -logineditable option to
	  the password dialog. [436340].

2001-09-05  Andreas Kupries  <andreas_kupries@users.sourceforge.net>

	* panedw.tcl: Added option -activator to allow user to choose sash
	  activator. Reduced minimum allowed sash width. [442474]. Request
	  made by Bastien Chevreux <bach@users.sourceforge.net>.

	* label.tcl: Corrected typo in BWlabel::configure [454505], report
	  and fix by Bastien Chevreux <bach@users.sourceforge.net>.

	* arrow.tcl: Changed containing frame to be more invisible
	  (borderwidth 0). Fixes [458301], by Georgios Petasis
	  <petasis@users.sourceforge.net>.

2001-08-08  Andreas Kupries <andreas_kupries@users.sourceforge.net>

	* tree.tcl (Tree::_keynav): Added code to call the open and close
	  commands when the open-status of a node is toggled with the
	  space bar. Bug [449284].

	* color.tcl: Added the missing definition of the main
	  'SelectColor' procedure. This prevented users from creating
	  these widgets in the documented way. Bug [449276].

2001-06-21  eric melski  <ericm@ajubasolutions.com>

	* tree.tcl: Corrected keyboard navigation so that open/close
	commands are invoked when right/left arrows are used to open/close
	nodes, patch from [Bug #435097].  Also corrected keyboard
	navigation on right arrow press; previously only opened closed
	nodes that had children, but should always open nodes, regardless
	of whether it has children.

2001-06-11  Jeff Hobbs  <jeffh@ActiveState.com>

	* pkgIndex.tcl: bumped version to 1.3.1 and added Tk 8.1.1 package
	require as Tcl 8.1.1 is needed in certain core areas for the new
	string methods.

	* mainframe.tcl: corrected state interpretation.  It doesn't do
	exact argument matching, but it is consistent with the rest of
	BWidget.  [Bug #224476]

	* demo/demo.tcl: fixed demo script to run when called from
	another directory

	* messagedlg.tcl: corrected winfo exists call

	* listbox.tcl: fixed string compare call

	* combobox.tcl: added package require Tk 8.3.

	* passwddlg.tcl: 
	* xpm2image.tcl: 
	* mainframe.tcl: 
	* panedw.tcl: 
	* utils.tcl: 
	* entry.tcl: 
	* dynhelp.tcl: 
	* dragsite.tcl: 
	* color.tcl: added braces to expr where appropriate

2000-10-31  Dan Kuchler  <kuchler@ajubasolutions.com>

        * combobox.tcl: Added the '-exact' option to the 'lsearch'
        commands in the combobox code so that the correct index
        of items will be returned even when there are glob/regexp
        characters.

2000-10-10  Dan Kuchler  <kuchler@ajubasolutions.com>

        * dynhelp.tcl: Added the '-screen' option to the toplevel that
        is created to display the help text to fix a bug reported by
        Tupone Alfredo.

2000-10-01  Eric Melski  <ericm@ajubasolutions.com>

	* notebook.tcl: Fixed typo in _draw_page that incorrectly placed
	images on tabs.

2000-09-17  Eric Melski  <ericm@ajubasolutions.com>

	* widget.tcl (_test_boolean): Altered to return strictly 0 or 1
	(for false and true, respectively), rather than allowing the
	string booleans (false, true, off, on, etc).

2000-09-07  Sven Delmas  <sven@scriptics.com>

	* mainframe.tcl: Fixed the typo of Alt (Atl) as reported in bug #
	6079.

2000-09-05  Eric Melski  <ericm@ajubasolutions.com>

	* label.tcl: Corrected bindtags for BWidgets Label components:
	primary component widget now includes the megawidget pathname in
	its bindtags list, so that bindings on the megawidget pathname are
	applied properly.

2000-08-10  Eric Melski  <ericm@ajubasolutions.com>

	* widget.tcl: Corrected a problem caused by the destruction of the
	special .#BWidget* widgets, which are used by BWidgets for some
	option value validations; formerly, if these were destroyed, it
	could confuse the BWidgets system's internal state, and creating
	BWidgets after destroying these helper widgets would throw an error.

2000-06-14  Dan Kuchler  <kuchler@scriptics.com>

	* dialog.tcl
	* dropsite.tcl
	* dynhelp.tcl
	* scrollview.tcl: Replaced several catch {unset varname} calls with
	if {[info exists varname]} {unset varname}.  This avoids using the
	catch, and also prevents the ::errorInfo corruption that was happening
	in BWidgets.

2000-05-14  Dan Kuchler  <kuchler@scriptics.com>

	* tree.tcl: Fixed a typing error in the Tree::find procedure.
	The procedure wouldn't work because there was a 'llengh' where there
	should have been a 'llength'.

2000-05-08  Dan Kuchler  <kuchler@scriptics.com>

	* titleframe.tcl: Added a '-state' flag that is associated to the
	state of the label.  Now that labels can be disabled (in 8.3 and
	beyond) this allows for the titleframe to have a disabled appearence.

2000-05-02  Eric Melski  <ericm@scriptics.com>

	* tree.tcl: Did some fancy focus footwork [Bug: 4491].  Now you
	can do this: "Tree .t ; bind .t <Button-1> foo", and it will do
	the right thing.  This will enable the use of proper
	focus-on-mouse-click bindings for trees, which in turn will fix
	the focus problem described in 4491.  In addition, I added a
	binding to the canvas widget in the tree that redirects focus when
	it leaves the canvas and goes to the frame, just in case.
	
	* dialog.tcl: Added a -geometry option, to allow the specification
	of geometry for the dialog.  No particular care is taken to
	validate the geometry string, so if it is bogus, you lose. [RFE:
	5188].

2000-04-27  Eric Melski  <ericm@scriptics.com>

	* entry.tcl: Added smarts to handle Copy for non-editable entries
	(it should be allowed, but was not previously) [Bug: 3755].

	* notebook.tcl: Small tweaks for placement of images on tabs.

	* combobox.tcl: Added code to ensure that non-editable (but
	enabled) comboboxes could still be tabbed in to.

2000-04-26  Dan Kuchler  <kuchler@scriptics.com>

	* button.tcl: Fixed the bindings that get setup on buttons with
	an underline specified to be case insensitive (i.e  if 'A' or 'a'
	was the underline character, Alt-A and Alt-a would both be bound
	to the button.

2000-03-29  Sven Delmas  <sven@scriptics.com>

	* tree.tcl:  Added protection for the left arrow key click in case
	we are already at the root node. This used to throw a Tcl error
	(fixes bug # 4619).

2000-03-20  Eric Melski  <ericm@scriptics.com>

	* progressbar.tcl: (configure) Added test for change to -maximum
	value, so that bar is redrawn if maximum changes. [Bug: 4399].

	* BWman/SpinBox.html: Removed references to -label* options.

	* demo/select.tcl: Removed use of -label* options on ComboBox and
	SpinBox. [Bug: 4394].

2000-03-14  Eric Melski  <ericm@scriptics.com>

	* button.tcl: (configure) replaced several hasChanged calls with
	one hasChangedX call.

	* dynhelp.tcl: (sethelp) replaced several hasChanged calls with
	one hasChangedX call.

	* entry.tcl: Replaced stack of hasChanged calls with one
	hasChangedX (in configure); replaced a couple cget's with
	getMegawidgetOption's.

	* spinbox.tcl: Updated _test_options to use setMegawidgetOption,
	and to only do that if it has to, instead of always doing it.

	* tree.tcl: Worked on itemcget; instead of upvar'ing the
	one-time-use variable, just refer to it directly.

	* widget.tcl: One problem with [set
	${class}::${path}:opt($option)] -- if path contains "foo(foo)",
	the command will choke.  Removed that particular
	micro-optimization.  Added setMegawidgetOption to compliment
	getMegawidgetOption; extended hasChangedX to accept multiple
	options to check.  This allows us to compress stacks of hasChanged
	calls into a single call (so there's a single function call, and a
	single upvar...).

2000-03-13  Eric Melski  <ericm@scriptics.com>

	* combobox.tcl: Tweaked bg/background options so that button
	didn't pick up entry background.

	* widget.tcl: Removed dead code; micro-optimizations to initFromODB.

	* tree.tcl: Added option for default -fill of tree nodes on windows.

	* notebook.tcl: Removed commented code.

	* button.tcl: 
	* tree.tcl: 
	* spinbox.tcl: 
	* entry.tcl: 
	* dropsite.tcl: 
	* dragsite.tcl: 
	* arrow.tcl: Replaced selected cget/getoption calls with
	getMegawidgetOption calls.

	* combobox.tcl: Removed LabelFrame from ComboBox (30% faster).

	* widget.tcl: Added getMegawidgetOption function, which allows
	direct access to megawidget-specific options (those that do not
	map to a component widget option).  This is dangerous, because it
	bypasses some checks, and it will only work with options that are
	specific to the megawidget.  However, it is much faster, and
	enables some functions (like visiblenodes) to be much faster.

	* tree.tcl: Reworked visiblenodes function to do a tree walk to
	find visible nodes.  This is faster and more correct than the
	previous implementation, which queried all the nodes in the tree
	for their open bit.
	

2000-03-10  Eric Melski  <ericm@scriptics.com>

	* widget.tcl: Replaced an upvar with a direct reference to the
	variable in initFromODB.

	* dynhelp.tcl: Changed sethelp function to use new hasChangedX
	function instead of hasChanged, which avoids an unneeded upvar,
	for a little better speed.

	* button.tcl: Changed to parseArgs/initFromODB format for a small
	(25%) speedup in creation time.

2000-03-10  Sven Delmas  <sven@scriptics.com>

	* tree.tcl: Changed the allnodes procedure to visiblenodes, and
	also the mechanism of retrieving those nodes. This took care of
	the previously required update.

2000-03-09  Eric Melski  <ericm@scriptics.com>

	* entry.tcl: Added code to re-sync the -text option with the
	contents of the entry widget before doing configuration; this
	fixes [Bug: 4304].

2000-03-09  Sven Delmas  <sven@scriptics.com>

	* tree.tcl: Disabled the update before the find withtag in the
	allnodes procedure. The nodes are apparently created delayed, so
	before this procedure is called, the program has to do an
	update. I don't do this in the procedure anymore, because it
	caused multiple updates, making the app slower.

2000-03-08  Sven Delmas  <sven@scriptics.com>

	* tree.tcl: The new allnodes procedure was not handling the
	"current" tag correctly. This is now stripped of.

2000-03-07  Eric Melski  <ericm@scriptics.com>

	* button.tcl: Added check for -state flag, to initialize it properly.

	* entry.tcl: Changed to parseArgs/initFromODB format; added check
	for -text flag to initialize it properly.

	* labelentry.tcl: Changed to use parseArgs/initFromODB format.

2000-03-03  Eric Melski  <ericm@scriptics.com>

	* spinbox.tcl: Added a call in setvalue to scan the current value into
	a float to trim out any 0 padding on the number (otherwise the zero's 
	make it look like octal to tcl, which chokes on numbers > 8)

2000-03-07  Sven Delmas  <sven@scriptics.com>

	* passwddlg.tcl: Reenabled the <Return> binding to activate the ok
	button. 

	* dragsite.tcl: I added an extra protection into the _begin_drag
	procedure to guard against a motion event that (sometimes) arrives
	before the press event. This fixes bug # 4324.

2000-03-03  Eric Melski  <ericm@scriptics.com>

	* spinbox.tcl: Removed LabelFrame from SpinBox (BACKWARDS
	INCOMPATIBLE) to speed creation; updated configure proc to use
	hasChangedX instead of hasChanged, as it didn't really need the
	values of the options it was checking.

2000-03-01  Eric Melski  <ericm@scriptics.com>

	* spinbox.tcl: Changed bindings to be on class SpinBox instead of
	BwSpinBox, and added class SpinBoxEntry to the bindtags of the
	SpinBox entry component.

	* configure.in:
	* pkgIndex.tcl: Bumped version to 1.3.0.

	* tree.tcl: Changed focus redirect to use {after idle} to avoid
	focus loops.

	* label.tcl: Added -bd 0 -highlight... etc to wrapper frame; moved
	class bindings to the frame instead of the component label.

	* utils.tcl: Added helper function BWidget::refocus, to handle
	focus redirection calls.

	* spinbox.tcl: Changed focus redirect to use {after idle} to avoid
	focus loops.

	* combobox.tcl: Changed init to parseArgs/initFromODB style;
	changed focus redirect to use {after idle} to avoid focus loops.

2000-02-29  Eric Melski  <ericm@scriptics.com>

	* widget.tcl: Added bits to handle
	$path#subclass_that_inherits_from_other_bw_class megawidget names.

	* passwddlg.tcl:
	* progressdlg.tcl: 
	* progressbar.tcl: Changed init to parseArgs/initFromODB style.

	* pkgIndex.tcl: Changed Label -> BWLabel

	* messagedlg.tcl: Changed initialization to parseArgs/initFromODB
	style.  Changed to use tk_messageBox on UNIX.
	
	* labelframe.tcl: Updated to use BWLabel instead of Label.

	* labelentry.tcl: Added -class LabelEntry to widget.

	* label.tcl: Changed class name to BWLabel (to avoid option db
	clashes with tk labels), changed initialization	to
	parseArgs/initFromODB style.

	* init.tcl: dropped obsolete Tree option from init.

	* dialog.tcl: changed initialization to parseArgs/initFromODB style.

	* notebook.tcl: Added -bd 0 -highlightthickness 0 -relief flat to
	the notebook container frame so geometries are correct.

	* entry.tcl: Fixed a conflict with configuring the Entry -text and
	textvariables.

	* dialog.tcl: added a -class option to the dialog, to allow the
	class of the dialog to be set (this enables proper optiondb use
	for things like the PasswdDlg).

2000-02-28  Eric Melski  <ericm@scriptics.com>

	* widget.tcl: Added Widget::varForOption function, which returns a 
	variable name that can be used to trace changes to an option for a
	particular megawidget (such as the -values option of a combobox).
	
	* entry.tcl: Made cget -text a little more efficient by
	shortcircuiting in that case.

	* combobox.tcl: Fixed bug #4248 by making the listbox use a
	-listvariable instead of trying to micromanage the listbox contents.

	* tests/entry.test: tests for the Entry widget.

	* widget.tcl: minor code cleanup.

	* tree.tcl: Was not getting proper default bg color on Windows,
	and keyboard navigation was goofy because of internal structure
	changes.

	* entry.tcl: Fixed an issue with initial foreground color not
	being picked up correctly.

2000-02-28  Sven Delmas  <sven@scriptics.com>

	* tree.tcl: Added a procedure called "allnodes" to retrieve the
	names of all currently defined treenodes. Apparently the internal
	widget structure of tree was changed recently. I adjusted the
	"allnodes" procedure to that.

2000-02-25  Eric Melski  <ericm@scriptics.com>

	* combobox.tcl: Fixed a problem with non-editable comboboxes and
	selecting values.

	* arrow.tcl: 
	Fixed a problem with the invoke method (doing one too many winfo
	parents in some cases)

	* button.tcl: 
	* buttonbox.tcl: 
	* combobox.tcl: 
	* dialog.tcl: 
	* dynhelp.tcl: 
	* entry.tcl: (also fixed validation)
	* label.tcl: 
	* labelframe.tcl: 
	* listbox.tcl: 
	* mainframe.tcl: 
	* notebook.tcl: 
	* pagesmgr.tcl: 
	* panedw.tcl: 
	* progressbar.tcl: 
	* scrollview.tcl: 
	* scrollw.tcl: 
	* separator.tcl: 
	* spinbox.tcl: 
	* titleframe.tcl: 
	* tree.tcl: Updated to new megawidget architecture.

	* widget.tcl: Changed internal architecture.  When possible,
	megawidget options are stored in component widgets instead of in
	an intermediary array.  Also, made use of option database to make
	megawidget creation more efficient.

2000-02-24  Eric Melski  <ericm@scriptics.com>

	* LICENSE.txt: Removed LGPL license; added Tcl-license terms.

2000-02-23  Eric Melski  <ericm@scriptics.com>

	* widget.tcl: Replaced _test_boolean function with a more efficient
	implementation.

2000-02-18  Eric Melski  <ericm@scriptics.com>

	* images/target.xbm: Placeholder for actual icon.

	* color.tcl: Change env(BWIDGET_LIBRARY) to ::BWIDGET::LIBRARY;
	changed proc "dialogue" to "dialog"

	* pkgIndex.tcl: Updated function spec for color.tcl.

	* widget.tcl: Various minor speed tweaks; added a reverse mapping
	from component widget options -> mega-widget options so that
	subcget can be faster.

	* entry.tcl: 
	* dropsite.tcl: 
	* dragsite.tcl: 
	* arrow.tcl: Tcl list'd the specs for Widget::declare calls.

	* combobox.tcl: Removed extraneous ListBox::use call.
	

2000-02-17  Eric Melski  <ericm@scriptics.com>

	* notebook.tcl: Added an extra check to move the leftmost tab a
	touch to the right when it is not selected (again, to make the
	tabs more Windows-like).  Also replaced redundant [string equal]
	checks with a stored pre-check (ie, set foo [string equal ...]).

2000-02-16  Eric Melski  <ericm@scriptics.com>

	* notebook.tcl: Changed appearance of tabs; leftmost tab is now 
	flush with the left of the notebook, and the tabs look more
	Windows-like.

2000-02-16  Sven Delmas  <sven@scriptics.com>

	* dialog.tcl: Added a new parameter to the draw procedure that
	allows me to pass in the desired geometry for the window. This was
	needed to support tracking of dialog window geometries.

	* tree.tcl: Changed the <KeyPress-space> binding to use "+", so it
	will not overwrite existing bindings (if there are any). Also
	added some extra protection in the keynav procedure against the
	user typing <Left> on a root node (this used to cause a stack
	trace).

2000-02-11  Eric Melski  <ericm@scriptics.com>

	* tree.tcl: Integrated changes from Eric Boudaillier:
	[itemconfigure -open ...]
	    optimized to only call redraw_idle 3 if node has subnodes.
	_cross_event:
	    itemconfigure -open called before -opencmd/closecmd; no more
	    call to _redraw_idle (handled by other procedures)
	_over_cmd:
	    allow position {root 0} when tree is empty
	new [find] command:  
	    [find @x,y ?confine?]
	    	    if confine is "confine" returns the node at window
		    coordinate x,y (x,y must be inside the bbox of the
		    node) else returns the node found on the line (in
		    pixel) pixel y
	    [find line]
	            returns the node on the line $line (in -deltay coords)
	new [line] command:
	    [line node]
	            returns the line where node is drawn
	-selectfill option added:
	    if true, selection is draw on full width of tree (instead of
	    just highlighting the bbox of the selected nodes)
	
	* combobox.tcl: Integrated changes from Eric Boudaillier:
	internal widget restructuring.

	* tree.tcl: Added "range" subcommand to selection.  Given two
	nodes, node1 and node2, it will set the selection to the visible
	nodes between (and including) node1 and node2.  If node1 or node2
	is not visible, it will find the first visible ancestor of the
	node and use that as the start/end point instead.

	* listbox.tcl: Integrated changes from Eric Boudaillier:
	_over_cmd: allow position 0 when listbox is empty
	find command, similar to tree find command.
	
	* spinbox.tcl: Integrated changes from Eric Boudaillier:
	cosmetic changes.
	
	* color.tcl: Integrated changes from Eric Boudaillier:
	split widget into two commands: SelectColor::menu and
	SelectColor::dialog.

	* progressbar.tcl: Integrated changes from Eric Boudaillier:
	added -idle option to prevent call to update in case where task is
	done in idle (ie, fileevents)

	* scrollview.tcl: Integrated changes from Eric Boudaillier:
	bindings changed.

	* scrollw.tcl: Integrated changes from Eric Boudaillier:
	-managed option: if true, scrollbar are managed during creation,
	so their size are included in the requested size of the
	ScrolledWindow.  If false, they are not.
	-sides option: specifies the side of the scrollbar.
	-size option: specifies size of scrollbar.
	-ipad option: specifies pad between scrollbar and scrolled widget.

	* mainframe.tcl: Integrated changes from Eric Boudaillier: support
	for function keys in accelerators, support for no modifier in
	accelerators.

	* notebook.tcl: Integrated changes from Eric Boudaillier:
	-internalborderwidth (-ibd) option specifies pad around pages;
	-foreground, -background, -activeforeground, -activebackground,
	-disabledforeground options for each tab.
	Code cleanup.

1999-12-23  Sven Delmas  <sven@scriptics.com>

	* scrollw.tcl: Added "update idletask" to scrollbar update to
	prevent loss of update events.

1999-12-14  Sven Delmas  <sven@scriptics.com>

	* combobox.tcl: When the selected item is changed, the selection
	is now set to the entire string.

1999-12-13  Eric Melski  <ericm@scriptics.com>

	* buttonbox.tcl: Added a getbuttonstate function, which retrieves 
	the value of a tag used on a button in the buttonbox.

1999-12-08  Eric Melski  <ericm@scriptics.com>

	* combobox.tcl: Removed code that cleared entry selection on focus out 
	events, as this crippled exportselection.

1999-10-29  Eric Melski  <ericm@scriptics.com>

	* buttonbox.tcl: Added a gettags function, which allows the user
	to query the tags that are used on buttons in the buttonbox.

1999-10-29  Eric Melski  <ericm@scriptics.com>

	* font.tcl: Added one new flag: -querysystem.  This lets the user 
	control whether the font selector queries the system 
	(via font families) for the list of fonts, or if it uses a preset 
	list of fonts (which is much faster and less likely to crash some 
	systems).

1999-10-25  Eric Melski  <ericm@scriptics.com>

	* font.tcl: Added support for two new flags: -families and -styles; 
	-families allows you to specify one of all, fixed, or variable, to
	limit the choice of fonts to those fonts; -styles allows you to
	specify a list of styles that can be set with the widget (ie,
	bold, italic, etc).

1999-10-22  Eric Melski  <ericm@scriptics.com>

	* tree.tcl: Fixed some problems with keyboard traversal.  Added
	support for left/right arrows a la MS Explorer.
	Added support for keyboard-based scrolling.
	
1999-10-21  Sven Delmas  <sven@scriptics.com>

	* combobox.tcl: Added support for keyboard traversal.  The widget
	will now tab in even when it is not editable.  Also the entry
	widget content will be selected when the user tabs in. The key
	bindings now allow a traversal of the list (<Down> brings up the
	list). The arrow button no longer switches to an up button, but
	instead changes relief. The button is now more Windows NT like
	(for Windows NT).  Changed keyboard bindings:  down/up now
	display/hide the listbox; control-{up|down|prev|next} move through
	the options without displaying the listbox.
	
1999-10-21  Eric Melski  <ericm@scriptics.com>

	* tree.tcl: Added a -selectable option to tree nodes, which
	controls whether or not a given node is selectable (duh).  This
	works with the new -selectcommand option for the tree, and with
	keyboard traversal (also new).  Now, whenever the tree gets a
	"selection set", it calls the given -selectcommand with the name
	of the tree and the list of selected nodes, which makes it easier
	to just drop in place and use.

1999-10-15  Eric Melski  <ericm@scriptics.com>

	* panedw.tcl: Added a -class PanedWindow option to the main frame 
	(the megawidget) of the paned window.

1999-10-15  Eric Melski  <ericm@scriptics.com>

	* dialog.tcl: Added an overrideredirect option to Dialog::draw, which
	allows the user to control the overrideredirect state of the dialog.

1999-09-19  Eric Melski  <ericm@scriptics.com>

	* mainframe.tcl:  Fixed _destroy to unset ALL state variables, so that
	when a new MainFrame of the same name as an old one is created, it
	doesn't pick up residual state from the old one.

1999-09-17  Eric Melski  <ericm@scriptics.com

	* mainframe.tcl: Modified menu creation/setmenustate functions to
	support a new model of menustate.  Instead of enabling/disabling a
	menu item whenever any one of its tags changes state, now it only
	enables menu items if all of its tags are set.  This makes it
	really easy to, say, only enable the "New Action" entry if both a
	project is open and an element is selected.

	* buttonbox.tcl: Added tagging mechanism to buttonbox.  When using
	$bbox add, the first parameter is a list of tags for the button.  Then
	use $bbox setbuttonstate to change the state of a tag.

1999-09-16  Eric Melski  <ericm@scriptics.com>

	* notebook.tcl: Added some (non-functional) code for doing
	tab-notebooks with the tabs on the bottom.

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/LICENSE.txt.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
BWidget ToolKit
Copyright (c) 1998-1999 UNIFIX. 
Copyright (c) 2001-2002 ActiveState Corp. 

The following terms apply to all files associated with the software
unless explicitly disclaimed in individual files.

The authors hereby grant permission to use, copy, modify, distribute,
and license this software and its documentation for any purpose, provided
that existing copyright notices are retained in all copies and that this
notice is included verbatim in any distributions. No written agreement,
license, or royalty fee is required for any of the authorized uses.
Modifications to this software may be copyrighted by their authors
and need not follow the licensing terms described here, provided that
the new terms are clearly indicated on the first page of each file where
they apply.

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.

GOVERNMENT USE: If you are acquiring this software on behalf of the
U.S. government, the Government shall have only "Restricted Rights"
in the software and related documentation as defined in the Federal 
Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2).  If you
are acquiring the software on behalf of the Department of Defense, the
software shall be classified as "Commercial Computer Software" and the
Government shall have only "Restricted Rights" as defined in Clause
252.227-7013 (c) (1) of DFARs.  Notwithstanding the foregoing, the
authors grant the U.S. Government and others acting in its behalf
permission to use and distribute the software in accordance with the
terms specified in this license. 
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


















































































Deleted scriptlibs/bwidget-1.9.8/README.txt.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
BWidget ToolKit 1.9.0				July 2009
Copyright (c) 1998-1999 UNIFIX.
Copyright (c) 2001-2002 ActiveState Corp. 

See the file LICENSE.txt for license info (uses Tcl's BSD-style license).

--------------------------------------------------------------------------

WHAT IS BWIDGET ?

The BWidget Toolkit is a high-level Widget Set for Tcl/Tk built using
native Tcl/Tk 8.x namespaces.

The BWidgets have a professional look&feel as in other well known
Toolkits (Tix or Incr Widgets), but the concept is radically different
because everything is pure Tcl/Tk.  No platform dependencies, and no
compiling required.  The code is 100% Pure Tcl/Tk.

The BWidget library was originally developed by UNIFIX Online, and
released under both the GNU Public License and the Tcl license.
BWidget is now maintained as a community project, hosted by
Sourceforge.  Scores of fixes and enhancements have been added by
community developers.  See the ChangeLog file for details.

--------------------------------------------------------------------------

WIDGET LIST (1.9)

Simple Widgets 
      Label           Extended Label widget
      Entry           Extended Entry widget
      Button          Extended Button widget
      ArrowButton     Button widget with an arrow shape.
      ProgressBar     Progress indicator widget
      ScrollView      Display the visible area of a scrolled window
      Separator       3D separator widget

Manager Widgets 
      MainFrame       Manage toplevel with menu, toolbar and statusbar 
      LabelFrame      Frame with a Label
      TitleFrame      Frame with a title
      ScrolledWindow  Generic scrolled widget
      ScrollableFrame Scrollable frame containing widget
      PanedWindow     Tiled layout manager widget
      ButtonBox       Set of buttons with horizontal or vertical layout
      PagesManager    Pages manager widget
      NoteBook        Notebook manager widget
      Dialog          Dialog abstraction with custom buttons

Composite Widgets 
      LabelEntry      LabelFrame containing an Entry widget. 
      ComboBox        ComboBox widget
      SpinBox         SpinBox widget
      Tree            Tree widget
      ListBox         ListBox widget
      MessageDlg      Message dialog box
      ProgressDlg     Progress indicator dialog box
      PasswdDlg       Login/Password dialog box (contributed by Stephane Lavirotte)
      SelectFont      Font selection widget
      SelectColor     Color selection widget

Commands Classes 
      Widget          The Widget base class
      DynamicHelp     Provide help to Tk widget or BWidget
      DragSite        Commands set for Drag facilities
      DropSite        Commands set for Drop facilities
      BWidget         Utilities

--------------------------------------------------------------------------
INSTALLATION AND USE

- On Unix Platform:
  Uncompress the file BWidget-<version>.tar.Z|gz

  To use the BWidget:
  - If you have uncompressed the archive file under the Tcl Library Path
    directory, you only need to do:
      % package require BWidget
  - If not, you have to specify the BWidget installation path in auto_path
    global variable:
      % lappend auto_path <install_path>
      % package require BWidget

  To launch the demo, you need to cd into the demo subdirectory:
      $ cd <install_path>/demo
      $ wish demo.tcl

- On Windows and others Platforms:
  Uncompress the file BWidget-<version>.zip

  To use the BWidget:
  - If you uncompressed the archive file under the Tcl Library Path
    directory, you only need to do:
      % package require BWidget
  - If not, you have to specify the BWidget installation path in auto_path
    global variable:
      % lappend auto_path your_path
      % package require BWidget

  To launch the demo :
      Double click on demo.tcl in the demo subdirectory


Distribution contains these directories:

BWidget-<version>   Root directory and BWidget Tcl sources
   BWman        HTML manual pages
   images       images used by BWidget
   lang         Resources for language customization
   demo         Demo sources
   tests        BWidgets test suite         


--------------------------------------------------------------------------

DOCUMENTATION

HTML manual pages are available in the BWman subdirectory.  Point to
index.html for frame version with tree navigation, or to contents.html
for no frame version.

--------------------------------------------------------------------------

CONTACTS

The BWidget toolkit is maintained on Sourceforge, at
http://www.sourceforge.net/projects/tcllib/
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






























































































































































































































































Deleted scriptlibs/bwidget-1.9.8/arrow.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
# ------------------------------------------------------------------------------
#  arrow.tcl
#  This file is part of Unifix BWidget Toolkit
# ------------------------------------------------------------------------------
#  Index of commands:
#   Public commands
#     - ArrowButton::create
#     - ArrowButton::configure
#     - ArrowButton::cget
#     - ArrowButton::invoke
#   Private commands (redraw commands)
#     - ArrowButton::_redraw
#     - ArrowButton::_redraw_state
#     - ArrowButton::_redraw_relief
#     - ArrowButton::_redraw_whole
#   Private commands (event bindings)
#     - ArrowButton::_destroy
#     - ArrowButton::_enter
#     - ArrowButton::_leave
#     - ArrowButton::_press
#     - ArrowButton::_release
#     - ArrowButton::_repeat
# ------------------------------------------------------------------------------

namespace eval ArrowButton {
    Widget::define ArrowButton arrow DynamicHelp

    Widget::tkinclude ArrowButton button .c \
	    include [list \
		-borderwidth -bd \
		-relief -highlightbackground \
		-highlightcolor -highlightthickness -takefocus]

    Widget::declare ArrowButton [list \
	    [list -type		Enum button 0 [list arrow button]] \
	    [list -dir		Enum top    0 [list top bottom left right]] \
	    [list -width	Int	15	0	"%d >= 0"] \
	    [list -height	Int	15	0	"%d >= 0"] \
	    [list -ipadx	Int	0	0	"%d >= 0"] \
	    [list -ipady	Int	0	0	"%d >= 0"] \
	    [list -clean	Int	2	0	"%d >= 0 && %d <= 2"] \
	    [list -activeforeground	TkResource	""	0 button] \
	    [list -activebackground	TkResource	""	0 button] \
	    [list -disabledforeground 	TkResource	""	0 button] \
	    [list -foreground		TkResource	""	0 button] \
	    [list -background		TkResource	""	0 button] \
	    [list -state		TkResource	""	0 button] \
	    [list -troughcolor		TkResource	""	0 scrollbar] \
	    [list -arrowbd	Int	1	0	"%d >= 0 && %d <= 2"] \
	    [list -arrowrelief	Enum	raised	0	[list raised sunken]] \
	    [list -command		String	""	0] \
	    [list -armcommand		String	""	0] \
	    [list -disarmcommand	String	""	0] \
	    [list -repeatdelay		Int	0	0	"%d >= 0"] \
	    [list -repeatinterval	Int	0	0	"%d >= 0"] \
	    [list -fg	Synonym	-foreground] \
	    [list -bg	Synonym	-background] \
	    ]
    DynamicHelp::include ArrowButton balloon

    bind BwArrowButtonC <Enter>           {ArrowButton::_enter %W}
    bind BwArrowButtonC <Leave>           {ArrowButton::_leave %W}
    bind BwArrowButtonC <ButtonPress-1>   {ArrowButton::_press %W}
    bind BwArrowButtonC <ButtonRelease-1> {ArrowButton::_release %W}
    bind BwArrowButtonC <Key-space>       {ArrowButton::invoke %W; break}
    bind BwArrowButtonC <Return>          {ArrowButton::invoke %W; break}
    bind BwArrowButton <Configure>       {ArrowButton::_redraw_whole %W %w %h}
    bind BwArrowButton <Destroy>         {ArrowButton::_destroy %W}

    variable _grab
    variable _moved

    array set _grab {current "" pressed "" oldstate "normal" oldrelief ""}
}


# -----------------------------------------------------------------------------
#  Command ArrowButton::create
# -----------------------------------------------------------------------------
proc ArrowButton::create { path args } {
    # Initialize configuration mappings and parse arguments
    array set submaps [list ArrowButton [list ] .c [list ]]
    array set submaps [Widget::parseArgs ArrowButton $args]

    # Create the class frame (so we can do the option db queries)
    frame $path -class ArrowButton -borderwidth 0 -highlightthickness 0 
    Widget::initFromODB ArrowButton $path $submaps(ArrowButton)

    # Create the canvas with the initial options
    eval [list canvas $path.c] $submaps(.c)

    # Compute the width and height of the canvas from the width/height
    # of the ArrowButton and the borderwidth/hightlightthickness.
    set w   [Widget::getMegawidgetOption $path -width]
    set h   [Widget::getMegawidgetOption $path -height]
    set bd  [Widget::cget $path -borderwidth]
    set ht  [Widget::cget $path -highlightthickness]
    set pad [expr {2*($bd+$ht)}]

    $path.c configure -width [expr {$w-$pad}] -height [expr {$h-$pad}]
    bindtags $path [list $path BwArrowButton [winfo toplevel $path] all]
    bindtags $path.c [list $path.c BwArrowButtonC [winfo toplevel $path.c] all]
    pack $path.c -expand yes -fill both

    DynamicHelp::sethelp $path $path.c 1

    set ::ArrowButton::_moved($path) 0

    return [Widget::create ArrowButton $path]
}


# -----------------------------------------------------------------------------
#  Command ArrowButton::configure
# -----------------------------------------------------------------------------
proc ArrowButton::configure { path args } {
    set res [Widget::configure $path $args]

    set ch1 [expr {[Widget::hasChanged $path -width  w] |
                   [Widget::hasChanged $path -height h] |
                   [Widget::hasChanged $path -borderwidth bd] |
                   [Widget::hasChanged $path -highlightthickness ht]}]
    set ch2 [expr {[Widget::hasChanged $path -type    val] |
                   [Widget::hasChanged $path -ipadx   val] |
                   [Widget::hasChanged $path -ipady   val] |
                   [Widget::hasChanged $path -arrowbd val] |
                   [Widget::hasChanged $path -clean   val] |
                   [Widget::hasChanged $path -dir     val]}]

    if { $ch1 } {
        set pad [expr {2*($bd+$ht)}]
        $path.c configure \
            -width [expr {$w-$pad}] -height [expr {$h-$pad}] \
            -borderwidth $bd -highlightthickness $ht
	set ch2 1
    }
    if { $ch2 } {
        _redraw_whole $path [winfo width $path] [winfo height $path]
    } else {
        _redraw_relief $path
        _redraw_state $path
    }
    DynamicHelp::sethelp $path $path.c

    return $res
}


# -----------------------------------------------------------------------------
#  Command ArrowButton::cget
# -----------------------------------------------------------------------------
proc ArrowButton::cget { path option } {
    return [Widget::cget $path $option]
}


# ------------------------------------------------------------------------------
#  Command ArrowButton::invoke
# ------------------------------------------------------------------------------
proc ArrowButton::invoke { path } {
    if { ![string equal [winfo class $path] "ArrowButton"] } {
	set path [winfo parent $path]
    }
    if { ![string equal [Widget::getoption $path -state] "disabled"] } {
        set oldstate [Widget::getoption $path -state]
        if { [string equal [Widget::getoption $path -type] "button"] } {
            set oldrelief [Widget::getoption $path -relief]
            configure $path -state active -relief sunken
        } else {
            set oldrelief [Widget::getoption $path -arrowrelief]
            configure $path -state active -arrowrelief sunken
        }
	update idletasks
        if {[llength [set cmd [Widget::getoption $path -armcommand]]]} {
            uplevel \#0 $cmd
        }
	after 10
        if { [string equal [Widget::getoption $path -type] "button"] } {
            configure $path -state $oldstate -relief $oldrelief
        } else {
            configure $path -state $oldstate -arrowrelief $oldrelief
        }
        if {[llength [set cmd [Widget::getoption $path -disarmcommand]]]} {
            uplevel \#0 $cmd
        }
        if {[llength [set cmd [Widget::getoption $path -command]]]} {
            uplevel \#0 $cmd
        }
    }
}


# ------------------------------------------------------------------------------
#  Command ArrowButton::_redraw
# ------------------------------------------------------------------------------
proc ArrowButton::_redraw { path width height } {
    variable _moved

    set _moved($path) 0
    set type  [Widget::getoption $path -type]
    set dir   [Widget::getoption $path -dir]
    set bd    [expr {[$path.c cget -borderwidth] + [$path.c cget -highlightthickness] + 1}]
    set clean [Widget::getoption $path -clean]
    if { [string equal $type "arrow"] } {
        if { [set id [$path.c find withtag rect]] == "" } {
            $path.c create rectangle $bd $bd [expr {$width-$bd-1}] [expr {$height-$bd-1}] -tags rect
        } else {
            $path.c coords $id $bd $bd [expr {$width-$bd-1}] [expr {$height-$bd-1}]
        }
        $path.c lower rect
        set arrbd [Widget::getoption $path -arrowbd]
        set bd    [expr {$bd+$arrbd-1}]
    } else {
        $path.c delete rect
    }
    # w and h are max width and max height of arrow
    set w [expr {$width  - 2*([Widget::getoption $path -ipadx]+$bd)}]
    set h [expr {$height - 2*([Widget::getoption $path -ipady]+$bd)}]

    if { $w < 2 } {set w 2}
    if { $h < 2 } {set h 2}

    if { $clean > 0 } {
        # arrange for base to be odd
        if { [string equal $dir "top"] || [string equal $dir "bottom"] } {
            if { !($w % 2) } {
                incr w -1
            }
            if { $clean == 2 } {
                # arrange for h = (w+1)/2
                set h2 [expr {($w+1)/2}]
                if { $h2 > $h } {
                    set w [expr {2*$h-1}]
                } else {
                    set h $h2
                }
            }
        } else {
            if { !($h % 2) } {
                incr h -1
            }
            if { $clean == 2 } {
                # arrange for w = (h+1)/2
                set w2 [expr {($h+1)/2}]
                if { $w2 > $w } {
                    set h [expr {2*$w-1}]
                } else {
                    set w $w2
                }
            }
        }
    }

    set x0 [expr {($width-$w)/2}]
    set y0 [expr {($height-$h)/2}]
    set x1 [expr {$x0+$w-1}]
    set y1 [expr {$y0+$h-1}]

    switch $dir {
        top {
            set xd [expr {($x0+$x1)/2}]
            if { [set id [$path.c find withtag poly]] == "" } {
                $path.c create polygon $x0 $y1 $x1 $y1 $xd $y0 -tags poly
            } else {
                $path.c coords $id $x0 $y1 $x1 $y1 $xd $y0
            }
            if { [string equal $type "arrow"] } {
                if { [set id [$path.c find withtag bot]] == "" } {
                    $path.c create line $x0 $y1 $x1 $y1 $xd $y0 -tags bot
                } else {
                    $path.c coords $id $x0 $y1 $x1 $y1 $xd $y0
                }
                if { [set id [$path.c find withtag top]] == "" } {
                    $path.c create line $x0 $y1 $xd $y0 -tags top
                } else {
                    $path.c coords $id $x0 $y1 $xd $y0
                }
                $path.c itemconfigure top -width $arrbd
                $path.c itemconfigure bot -width $arrbd
            } else {
                $path.c delete top
                $path.c delete bot
            }
        }
        bottom {
            set xd [expr {($x0+$x1)/2}]
            if { [set id [$path.c find withtag poly]] == "" } {
                $path.c create polygon $x1 $y0 $x0 $y0 $xd $y1 -tags poly
            } else {
                $path.c coords $id $x1 $y0 $x0 $y0 $xd $y1
            }
            if { [string equal $type "arrow"] } {
                if { [set id [$path.c find withtag top]] == "" } {
                    $path.c create line $x1 $y0 $x0 $y0 $xd $y1 -tags top
                } else {
                    $path.c coords $id $x1 $y0 $x0 $y0 $xd $y1
                }
                if { [set id [$path.c find withtag bot]] == "" } {
                    $path.c create line $x1 $y0 $xd $y1 -tags bot
                } else {
                    $path.c coords $id $x1 $y0 $xd $y1
                }
                $path.c itemconfigure top -width $arrbd
                $path.c itemconfigure bot -width $arrbd
            } else {
                $path.c delete top
                $path.c delete bot
            }
        }
        left {
            set yd [expr {($y0+$y1)/2}]
            if { [set id [$path.c find withtag poly]] == "" } {
                $path.c create polygon $x1 $y0 $x1 $y1 $x0 $yd -tags poly
            } else {
                $path.c coords $id $x1 $y0 $x1 $y1 $x0 $yd
            }
            if { [string equal $type "arrow"] } {
                if { [set id [$path.c find withtag bot]] == "" } {
                    $path.c create line $x1 $y0 $x1 $y1 $x0 $yd -tags bot
                } else {
                    $path.c coords $id $x1 $y0 $x1 $y1 $x0 $yd
                }
                if { [set id [$path.c find withtag top]] == "" } {
                    $path.c create line $x1 $y0 $x0 $yd -tags top
                } else {
                    $path.c coords $id $x1 $y0 $x0 $yd
                }
                $path.c itemconfigure top -width $arrbd
                $path.c itemconfigure bot -width $arrbd
            } else {
                $path.c delete top
                $path.c delete bot
            }
        }
        right {
            set yd [expr {($y0+$y1)/2}]
            if { [set id [$path.c find withtag poly]] == "" } {
                $path.c create polygon $x0 $y1 $x0 $y0 $x1 $yd -tags poly
            } else {
                $path.c coords $id $x0 $y1 $x0 $y0 $x1 $yd
            }
            if { [string equal $type "arrow"] } {
                if { [set id [$path.c find withtag top]] == "" } {
                    $path.c create line $x0 $y1 $x0 $y0 $x1 $yd -tags top
                } else {
                    $path.c coords $id $x0 $y1 $x0 $y0 $x1 $yd
                }
                if { [set id [$path.c find withtag bot]] == "" } {
                    $path.c create line $x0 $y1 $x1 $yd -tags bot
                } else {
                    $path.c coords $id $x0 $y1 $x1 $yd
                }
                $path.c itemconfigure top -width $arrbd
                $path.c itemconfigure bot -width $arrbd
            } else {
                $path.c delete top
                $path.c delete bot
            }
        }
    }
}


# ------------------------------------------------------------------------------
#  Command ArrowButton::_redraw_state
# ------------------------------------------------------------------------------
proc ArrowButton::_redraw_state { path } {
    set state [Widget::getoption $path -state]
    if { [string equal [Widget::getoption $path -type] "button"] } {
        switch $state {
            normal   {set bg -background;       set fg -foreground}
            active   {set bg -activebackground; set fg -activeforeground}
            disabled {set bg -background;       set fg -disabledforeground}
        }
        set fg [Widget::getoption $path $fg]
        $path.c configure -background [Widget::getoption $path $bg]
        $path.c itemconfigure poly -fill $fg -outline $fg
    } else {
        switch $state {
            normal   {set stipple "";     set bg [Widget::getoption $path -background] }
            active   {set stipple "";     set bg [Widget::getoption $path -activebackground] }
            disabled {set stipple gray50; set bg black }
        }
        set thrc [Widget::getoption $path -troughcolor]
        $path.c configure -background [Widget::getoption $path -background]
        $path.c itemconfigure rect -fill $thrc -outline $thrc
        $path.c itemconfigure poly -fill $bg   -outline $bg -stipple $stipple
    }
}


# ------------------------------------------------------------------------------
#  Command ArrowButton::_redraw_relief
# ------------------------------------------------------------------------------
proc ArrowButton::_redraw_relief { path } {
    variable _moved

    if { [string equal [Widget::getoption $path -type] "button"] } {
        if { [string equal [Widget::getoption $path -relief] "sunken"] } {
            if { !$_moved($path) } {
                $path.c move poly 1 1
                set _moved($path) 1
            }
        } else {
            if { $_moved($path) } {
                $path.c move poly -1 -1
                set _moved($path) 0
            }
        }
    } else {
        set col3d [BWidget::get3dcolor $path [Widget::getoption $path -background]]
        switch [Widget::getoption $path -arrowrelief] {
            raised {set top [lindex $col3d 1]; set bot [lindex $col3d 0]}
            sunken {set top [lindex $col3d 0]; set bot [lindex $col3d 1]}
        }
        $path.c itemconfigure top -fill $top
        $path.c itemconfigure bot -fill $bot
    }
}


# ------------------------------------------------------------------------------
#  Command ArrowButton::_redraw_whole
# ------------------------------------------------------------------------------
proc ArrowButton::_redraw_whole { path width height } {
    _redraw $path $width $height
    _redraw_relief $path
    _redraw_state $path
}


# ------------------------------------------------------------------------------
#  Command ArrowButton::_enter
# ------------------------------------------------------------------------------
proc ArrowButton::_enter { path } {
    variable _grab
    set path [winfo parent $path]
    set _grab(current) $path
    if { ![string equal [Widget::getoption $path -state] "disabled"] } {
        set _grab(oldstate) [Widget::getoption $path -state]
        configure $path -state active
        if { $_grab(pressed) == $path } {
            if { [string equal [Widget::getoption $path -type] "button"] } {
                set _grab(oldrelief) [Widget::getoption $path -relief]
                configure $path -relief sunken
            } else {
                set _grab(oldrelief) [Widget::getoption $path -arrowrelief]
                configure $path -arrowrelief sunken
            }
        }
    }
}


# ------------------------------------------------------------------------------
#  Command ArrowButton::_leave
# ------------------------------------------------------------------------------
proc ArrowButton::_leave { path } {
    variable _grab
    set path [winfo parent $path]
    set _grab(current) ""
    if { ![string equal [Widget::getoption $path -state] "disabled"] } {
        configure $path -state $_grab(oldstate)
        if { $_grab(pressed) == $path } {
            if { [string equal [Widget::getoption $path -type] "button"] } {
                configure $path -relief $_grab(oldrelief)
            } else {
                configure $path -arrowrelief $_grab(oldrelief)
            }
        }
    }
}


# ------------------------------------------------------------------------------
#  Command ArrowButton::_press
# ------------------------------------------------------------------------------
proc ArrowButton::_press { path } {
    variable _grab
    set path [winfo parent $path]
    if { ![string equal [Widget::getoption $path -state] "disabled"] } {
        set _grab(pressed) $path
            if { [string equal [Widget::getoption $path -type] "button"] } {
            set _grab(oldrelief) [Widget::getoption $path -relief]
            configure $path -relief sunken
        } else {
            set _grab(oldrelief) [Widget::getoption $path -arrowrelief]
            configure $path -arrowrelief sunken
        }
        if {[llength [set cmd [Widget::getoption $path -armcommand]]]} {
            uplevel \#0 $cmd
            if { [set delay [Widget::getoption $path -repeatdelay]]    > 0 ||
                 [set delay [Widget::getoption $path -repeatinterval]] > 0 } {
                after $delay [list ArrowButton::_repeat $path]
            }
        }
    }
}


# ------------------------------------------------------------------------------
#  Command ArrowButton::_release
# ------------------------------------------------------------------------------
proc ArrowButton::_release { path } {
    variable _grab
    set path [winfo parent $path]
    if { $_grab(pressed) == $path } {
        set _grab(pressed) ""
            if { [string equal [Widget::getoption $path -type] "button"] } {
            configure $path -relief $_grab(oldrelief)
        } else {
            configure $path -arrowrelief $_grab(oldrelief)
        }
        if {[llength [set cmd [Widget::getoption $path -disarmcommand]]]} {
            uplevel \#0 $cmd
        }
        if { $_grab(current) == $path &&
             ![string equal [Widget::getoption $path -state] "disabled"] &&
             [llength [set cmd [Widget::getoption $path -command]]]} {
            uplevel \#0 $cmd
        }
    }
}


# ------------------------------------------------------------------------------
#  Command ArrowButton::_repeat
# ------------------------------------------------------------------------------
proc ArrowButton::_repeat { path } {
    variable _grab
    if { $_grab(current) == $path && $_grab(pressed) == $path &&
         ![string equal [Widget::getoption $path -state] "disabled"] &&
         [llength [set cmd [Widget::getoption $path -armcommand]]]} {
        uplevel \#0 $cmd
    }
    if { $_grab(pressed) == $path &&
         ([set delay [Widget::getoption $path -repeatinterval]] > 0 ||
          [set delay [Widget::getoption $path -repeatdelay]]    > 0) } {
        after $delay [list ArrowButton::_repeat $path]
    }
}


# ------------------------------------------------------------------------------
#  Command ArrowButton::_destroy
# ------------------------------------------------------------------------------
proc ArrowButton::_destroy { path } {
    variable _moved
    Widget::destroy $path
    unset _moved($path)
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<














































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/bitmap.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# ------------------------------------------------------------------------------
#  bitmap.tcl
#  This file is part of Unifix BWidget Toolkit
#  $Id: bitmap.tcl,v 1.4 2003/10/20 21:23:52 damonc Exp $
# ------------------------------------------------------------------------------
#  Index of commands:
#     - Bitmap::get
#     - Bitmap::_init
# ----------------------------------------------------------------------------
namespace eval Bitmap {
    Widget::define Bitmap bitmap -classonly

    variable path
    variable _bmp
    variable _types {
        photo  .gif
        photo  .ppm
        bitmap .xbm
        photo  .xpm
    }

    proc use {} {}
}


# ----------------------------------------------------------------------------
#  Command Bitmap::get
# ----------------------------------------------------------------------------
proc Bitmap::get { name } {
    variable path
    variable _bmp
    variable _types

    if {[info exists _bmp($name)]} {
        return $_bmp($name)
    }

    # --- Nom de fichier avec extension ---------------------------------
    set ext [file extension $name]
    if { $ext != "" } {
        if { ![info exists _bmp($ext)] } {
            error "$ext not supported"
        }

        if { [file exists $name] } {
            if {[string equal $ext ".xpm"]} {
                set _bmp($name) [xpm-to-image $name]
                return $_bmp($name)
            }
            if {![catch {set _bmp($name) [image create $_bmp($ext) -file $name]}]} {
                return $_bmp($name)
            }
        }
    }

    foreach dir $path {
        foreach {type ext} $_types {
            if { [file exists [file join $dir $name$ext]] } {
                if {[string equal $ext ".xpm"]} {
                    set _bmp($name) [xpm-to-image [file join $dir $name$ext]]
                    return $_bmp($name)
                } else {
                    if {![catch {set _bmp($name) [image create $type -file [file join $dir $name$ext]]}]} {
                        return $_bmp($name)
                    }
                }
            }
        }
    }

    return -code error "$name not found"
}


# ----------------------------------------------------------------------------
#  Command Bitmap::_init
# ----------------------------------------------------------------------------
proc Bitmap::_init { } {
    global   env
    variable path
    variable _bmp
    variable _types

    set path [list "." [file join $::BWIDGET::LIBRARY images]]
    set supp [image types]
    foreach {type ext} $_types {
        if { [lsearch $supp $type] != -1} {
            set _bmp($ext) $type
        }
    }
}


Bitmap::_init
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




























































































































































































Deleted scriptlibs/bwidget-1.9.8/button.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
# ----------------------------------------------------------------------------
#  button.tcl
#  This file is part of Unifix BWidget Toolkit
# ----------------------------------------------------------------------------
#  Index of commands:
#   Public commands
#     - Button::create
#     - Button::configure
#     - Button::cget
#     - Button::invoke
#   Private commands (event bindings)
#     - Button::_destroy
#     - Button::_enter
#     - Button::_leave
#     - Button::_press
#     - Button::_release
#     - Button::_repeat
# ----------------------------------------------------------------------------

namespace eval Button {
    Widget::define Button button DynamicHelp

    set remove [list -command -relief -text -textvariable -underline -state]
    if {[info tclversion] > 8.3} {
	lappend remove -repeatdelay -repeatinterval
    }
    Widget::tkinclude Button button :cmd remove $remove

    Widget::declare Button {
        {-name            String "" 0}
        {-text            String "" 0}
        {-textvariable    String "" 0}
        {-underline       Int    -1 0 "%d >= -1"}
        {-armcommand      String "" 0}
        {-disarmcommand   String "" 0}
        {-command         String "" 0}
        {-state           TkResource "" 0 button}
        {-repeatdelay     Int    0  0 "%d >= 0"}
        {-repeatinterval  Int    0  0 "%d >= 0"}
        {-relief          Enum   raised  0 {raised sunken flat ridge solid groove link}}
    }

    DynamicHelp::include Button balloon

    variable _current ""
    variable _pressed ""

    bind BwButton <Enter>           {Button::_enter %W}
    bind BwButton <Leave>           {Button::_leave %W}
    bind BwButton <ButtonPress-1>   {Button::_press %W}
    bind BwButton <ButtonRelease-1> {Button::_release %W}
    bind BwButton <Key-space>       {Button::invoke %W; break}
    bind BwButton <Return>          {Button::invoke %W; break}
    bind BwButton <<Invoke>> 	    {Button::invoke %W; break}
    bind BwButton <Destroy>         {Widget::destroy %W}
}


# ----------------------------------------------------------------------------
#  Command Button::create
# ----------------------------------------------------------------------------
proc Button::create { path args } {
    array set maps [list Button {} :cmd {}]
    array set maps [Widget::parseArgs Button $args]
    if {$::Widget::_theme} {
        eval [concat [list ttk::button $path] $maps(:cmd)]
    } else {
        eval [concat [list button $path] $maps(:cmd)]
    }
    Widget::initFromODB Button $path $maps(Button)

    # Do some extra configuration on the button
    set var [Widget::getMegawidgetOption $path -textvariable]
    set st [Widget::getMegawidgetOption $path -state]
    if {  ![string length $var] } {
        set desc [BWidget::getname [Widget::getMegawidgetOption $path -name]]
        if { [llength $desc] } {
            set text  [lindex $desc 0]
            set under [lindex $desc 1]
            Widget::configure $path [list -text $text]
            Widget::configure $path [list -underline $under]
        } else {
            set text  [Widget::getMegawidgetOption $path -text]
            set under [Widget::getMegawidgetOption $path -underline]
        }
    } else {
        set under -1
        set text  ""
        Widget::configure $path [list -underline $under]
    }

    $path configure -text $text -underline $under \
        -textvariable $var -state $st
    # Map relief flat on Toolbutton for ttk
    set relief [Widget::getMegawidgetOption $path -relief]
    if {$::Widget::_theme} {
        if { [string equal $relief "link"] } {
            $path configure -style Toolbutton
        }
    } else {
        if { [string equal $relief "link"] } {
            set relief "flat"
        }
        $path configure -relief $relief
    }
    bindtags $path [list $path BwButton [winfo toplevel $path] all]

    set accel1 [string tolower [string index $text $under]]
    set accel2 [string toupper $accel1]
    if { $accel1 != "" } {
        bind [winfo toplevel $path] <Alt-$accel1> [list Button::invoke $path]
        bind [winfo toplevel $path] <Alt-$accel2> [list Button::invoke $path]
    }

    DynamicHelp::sethelp $path $path 1

    return [Widget::create Button $path]
}


# ----------------------------------------------------------------------------
#  Command Button::configure
# ----------------------------------------------------------------------------
proc Button::configure { path args } {
    set oldunder [$path:cmd cget -underline]
    if { $oldunder != -1 } {
        set oldaccel1 [string tolower [string index [$path:cmd cget -text] $oldunder]]
        set oldaccel2 [string toupper $oldaccel1]
    } else {
        set oldaccel1 ""
        set oldaccel2 ""
    }
    set res [Widget::configure $path $args]

    # Extract all the modified bits we're interested in
    foreach {cr cs cv cn ct cu} [Widget::hasChangedX $path \
        -relief -state -textvariable -name -text -underline] break
    if { $cr || $cs } {
        set relief [Widget::cget $path -relief]
        set state  [Widget::cget $path -state]
        if { $::Widget::_theme} {
			if { [string equal $relief "link"] } {
				$path:cmd configure -style Toolbutton
			} else {
				$path:cmd configure -style ""
			}
		} else {
			if { [string equal $relief "link"] } {
				if { [string equal $state "active"] } {
					set relief "raised"
				} else {
					set relief "flat"
				}
			}
			$path:cmd configure -relief $relief
		}
		$path:cmd configure -state $state
    }

    if { $cv || $cn || $ct || $cu } {
        set var		[Widget::cget $path -textvariable]
        set text	[Widget::cget $path -text]
        set under	[Widget::cget $path -underline]
        if {  ![string length $var] } {
            set desc [BWidget::getname [Widget::cget $path -name]]
            if { [llength $desc] } {
                set text  [lindex $desc 0]
                set under [lindex $desc 1]
            }
        } else {
            set under -1
            set text  ""
        }
        set top [winfo toplevel $path]
        if { $oldaccel1 != "" } {
            bind $top <Alt-$oldaccel1> {}
            bind $top <Alt-$oldaccel2> {}
        }
        set accel1 [string tolower [string index $text $under]]
        set accel2 [string toupper $accel1]
        if { $accel1 != "" } {
            bind $top <Alt-$accel1> [list Button::invoke $path]
            bind $top <Alt-$accel2> [list Button::invoke $path]
        }
        $path:cmd configure -text $text -underline $under -textvariable $var
    }
    DynamicHelp::sethelp $path $path

    set res
}


# ----------------------------------------------------------------------------
#  Command Button::cget
# ----------------------------------------------------------------------------
proc Button::cget { path option } {
    Widget::cget $path $option
}


# ----------------------------------------------------------------------------
#  Command Button::identify
# ----------------------------------------------------------------------------
proc Button::identify { path args } {
    eval $path:cmd identify $args
}


# ----------------------------------------------------------------------------
#  Command Button::instate
# ----------------------------------------------------------------------------
proc Button::instate { path args } {
    eval $path:cmd instate $args
}


# ----------------------------------------------------------------------------
#  Command Button::state
# ----------------------------------------------------------------------------
proc Button::state { path args } {
    eval $path:cmd state $args
}


# ----------------------------------------------------------------------------
#  Command Button::invoke
# ----------------------------------------------------------------------------
proc Button::invoke { path } {
    if { ![string equal [$path:cmd cget -state] "disabled"] } {
        if { $::Widget::_theme} {
            $path:cmd configure -state active
			$path:cmd state pressed
        } else {
            $path:cmd configure -state active -relief sunken
        }
        update idletasks
        set cmd [Widget::getMegawidgetOption $path -armcommand]
        if { $cmd != "" } {
            uplevel \#0 $cmd
        }
        after 100
        $path:cmd configure -state [Widget::getMegawidgetOption $path -state]
        if { $::Widget::_theme} {
            $path:cmd state !pressed
        } else {
            set relief [Widget::getMegawidgetOption $path -relief]
            if { [string equal $relief "link"] } {
                set relief flat
            }
            $path:cmd configure -relief $relief
        }
        set cmd [Widget::getMegawidgetOption $path -disarmcommand]
        if { $cmd != "" } {
            uplevel \#0 $cmd
        }
        set cmd [Widget::getMegawidgetOption $path -command]
        if { $cmd != "" } {
            uplevel \#0 $cmd
        }
    }
}

# ----------------------------------------------------------------------------
#  Command Button::_enter
# ----------------------------------------------------------------------------
proc Button::_enter { path } {
    variable _current
    variable _pressed

    set _current $path
    if { ![string equal [$path:cmd cget -state] "disabled"] } {
        $path:cmd configure -state active
        if { $::Widget::_theme } {
            # $path:cmd state active
        } else {
            if { $_pressed == $path } {
                $path:cmd configure -relief sunken
            } elseif { [string equal [Widget::cget $path -relief] "link"] } {
                $path:cmd configure -relief raised
            }
        }
    }
}


# ----------------------------------------------------------------------------
#  Command Button::_leave
# ----------------------------------------------------------------------------
proc Button::_leave { path } {
    variable _current
    variable _pressed

    set _current ""
    if { ![string equal [$path:cmd cget -state] "disabled"] } {
        $path:cmd configure -state [Widget::cget $path -state]
        if { $::Widget::_theme } {
        } else {
            set relief [Widget::cget $path -relief]
            if { $_pressed == $path } {
                if { [string equal $relief "link"] } {
                    set relief raised
                }
                $path:cmd configure -relief $relief
            } elseif { [string equal $relief "link"] } {
                $path:cmd configure -relief flat
            }
        }
    }
}


# ----------------------------------------------------------------------------
#  Command Button::_press
# ----------------------------------------------------------------------------
proc Button::_press { path } {
    variable _pressed

    if { ![string equal [$path:cmd cget -state] "disabled"] } {
        set _pressed $path
        if { $::Widget::_theme} {
            ttk::clickToFocus $path
            $path state pressed
        } else {
            $path:cmd configure -relief sunken
        }
        set cmd [Widget::getMegawidgetOption $path -armcommand]
        if { $cmd != "" } {
            uplevel \#0 $cmd
	    set repeatdelay [Widget::getMegawidgetOption $path -repeatdelay]
	    set repeatint [Widget::getMegawidgetOption $path -repeatinterval]
            if { $repeatdelay > 0 } {
                after $repeatdelay "Button::_repeat $path"
            } elseif { $repeatint > 0 } {
                after $repeatint "Button::_repeat $path"
	    }
        }
    }
}


# ----------------------------------------------------------------------------
#  Command Button::_release
# ----------------------------------------------------------------------------
proc Button::_release { path } {
    variable _current
    variable _pressed

    if { $_pressed == $path } {
        set _pressed ""
	after cancel "Button::_repeat $path"
        if { $::Widget::_theme} {
            $path state !pressed
        } else {
            set relief [Widget::getMegawidgetOption $path -relief]
            if { [string equal $relief "link"] } {
                set relief raised
            }
            $path:cmd configure -relief $relief
        }
	set cmd [Widget::getMegawidgetOption $path -disarmcommand]
        if { $cmd != "" } {
            uplevel \#0 $cmd
        }
        if { $_current == $path &&
             ![string equal [$path:cmd cget -state] "disabled"] && \
	     [set cmd [Widget::getMegawidgetOption $path -command]] != "" } {
            uplevel \#0 $cmd
        }
    }
}


# ----------------------------------------------------------------------------
#  Command Button::_repeat
# ----------------------------------------------------------------------------
proc Button::_repeat { path } {
    variable _current
    variable _pressed

    if { $_current == $path && $_pressed == $path &&
         ![string equal [$path:cmd cget -state] "disabled"] &&
         [set cmd [Widget::getMegawidgetOption $path -armcommand]] != "" } {
        uplevel \#0 $cmd
    }
    if { $_pressed == $path &&
         ([set delay [Widget::getMegawidgetOption $path -repeatinterval]] >0 ||
          [set delay [Widget::getMegawidgetOption $path -repeatdelay]] > 0) } {
        after $delay "Button::_repeat $path"
    }
}

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<














































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/buttonbox.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
# ----------------------------------------------------------------------------
#  buttonbox.tcl
#  This file is part of Unifix BWidget Toolkit
# ----------------------------------------------------------------------------
#  Index of commands:
#     - ButtonBox::create
#     - ButtonBox::configure
#     - ButtonBox::cget
#     - ButtonBox::add
#     - ButtonBox::itemconfigure
#     - ButtonBox::itemcget
#     - ButtonBox::setfocus
#     - ButtonBox::invoke
#     - ButtonBox::index
#     - ButtonBox::_destroy
# ----------------------------------------------------------------------------

namespace eval ButtonBox {
    Widget::define ButtonBox buttonbox Button

    Widget::declare ButtonBox {
	{-background  TkResource ""	    0 frame}
	{-orient      Enum	 horizontal 1 {horizontal vertical}}
	{-state	      Enum	 "normal"   0 {normal disabled}}
	{-homogeneous Boolean	 1	    1}
	{-spacing     Int	 10	    0 "%d >= 0"}
	{-padx	      TkResource ""	    0 button}
	{-pady	      TkResource ""	    0 button}
	{-default     Int	 -1	    0 "%d >= -1"}
	{-bg	      Synonym	 -background}
    }

    Widget::addmap ButtonBox "" :cmd {-background {}}

    bind ButtonBox <Destroy> [list ButtonBox::_destroy %W]
}


# ----------------------------------------------------------------------------
#  Command ButtonBox::create
# ----------------------------------------------------------------------------
proc ButtonBox::create { path args } {
    Widget::init ButtonBox $path $args

    variable $path
    upvar 0  $path data

    eval [list frame $path] [Widget::subcget $path :cmd] \
	[list -class ButtonBox -takefocus 0 -highlightthickness 0]
    # For 8.4+ we don't want to inherit the padding
    catch {$path configure -padx 0 -pady 0}

    set data(max)      0
    set data(nbuttons) 0
    set data(buttons)  [list]
    set data(default)  [Widget::getoption $path -default]

    return [Widget::create ButtonBox $path]
}


# ----------------------------------------------------------------------------
#  Command ButtonBox::configure
# ----------------------------------------------------------------------------
proc ButtonBox::configure { path args } {
    variable $path
    upvar 0  $path data

    set res [Widget::configure $path $args]

    if { [Widget::hasChanged $path -default val] } {
        if { $data(default) != -1 && $val != -1 } {
            set but $path.b$data(default)
            if { [winfo exists $but] } {
                $but configure -default normal
            }
            set but $path.b$val
            if { [winfo exists $but] } {
                $but configure -default active
            }
            set data(default) $val
        } else {
            Widget::setoption $path -default $data(default)
        }
    }

    if {[Widget::hasChanged $path -state val]} {
	foreach i $data(buttons) {
	    $path.b$i configure -state $val
	}
    }

    return $res
}


# ----------------------------------------------------------------------------
#  Command ButtonBox::cget
# ----------------------------------------------------------------------------
proc ButtonBox::cget { path option } {
    return [Widget::cget $path $option]
}


# ----------------------------------------------------------------------------
#  Command ButtonBox::add
# ----------------------------------------------------------------------------
proc ButtonBox::add { path args } {
    return [eval [linsert $args 0 insert $path end]]
}


proc ButtonBox::insert { path idx args } {
    variable $path
    upvar 0  $path data

    set but     $path.b$data(nbuttons)
    set spacing [Widget::getoption $path -spacing]

    ## Save the current spacing setting for this button.  Buttons
    ## appended to the end of the box have their spacing applied
    ## to their left while all other have their spacing applied
    ## to their right.
    if {$idx == "end"} {
	set data(spacing,$data(nbuttons)) [list left $spacing]
	lappend data(buttons) $data(nbuttons)
    } else {
	set data(spacing,$data(nbuttons)) [list right $spacing]
        set data(buttons) [linsert $data(buttons) $idx $data(nbuttons)]
    }

    if { $data(nbuttons) == $data(default) } {
        set style active
    } elseif { $data(default) == -1 } {
        set style disabled
    } else {
        set style normal
    }

    array set flags $args
    set tags ""
    if { [info exists flags(-tags)] } {
	set tags $flags(-tags)
	unset flags(-tags)
	set args [array get flags]
    }

    if { $::Widget::_theme} {
        eval [list Button::create $but] \
            $args [list -default $style]
	} else {
        eval [list Button::create $but \
    	      -background [Widget::getoption $path -background]\
	          -padx       [Widget::getoption $path -padx] \
	          -pady       [Widget::getoption $path -pady]] \
            $args [list -default $style]
	}

    # ericm@scriptics.com:  set up tags, just like the menu items
    foreach tag $tags {
	lappend data(tags,$tag) $but
	if { ![info exists data(tagstate,$tag)] } {
	    set data(tagstate,$tag) 0
	}
    }
    set data(buttontags,$but) $tags
    # ericm@scriptics.com

    _redraw $path

    incr data(nbuttons)

    return $but
}


proc ButtonBox::delete { path idx } {
    variable $path
    upvar 0  $path data

    set i [lindex $data(buttons) $idx]
    set data(buttons) [lreplace $data(buttons) $idx $idx]
    destroy $path.b$i
}


# ButtonBox::setbuttonstate --
#
#	Set the state of a given button tag.  If this makes any buttons
#       enable-able (ie, all of their tags are TRUE), enable them.
#
# Arguments:
#	path        the button box widget name
#	tag         the tag to modify
#	state       the new state of $tag (0 or 1)
#
# Results:
#	None.

proc ButtonBox::setbuttonstate {path tag state} {
    variable $path
    upvar 0  $path data
    # First see if this is a real tag
    if { [info exists data(tagstate,$tag)] } {
	set data(tagstate,$tag) $state
	foreach but $data(tags,$tag) {
	    set expression "1"
	    foreach buttontag $data(buttontags,$but) {
		append expression " && $data(tagstate,$buttontag)"
	    }
	    if { [expr $expression] } {
		set state normal
	    } else {
		set state disabled
	    }
	    $but configure -state $state
	}
    }
    return
}

# ButtonBox::getbuttonstate --
#
#	Retrieve the state of a given button tag.
#
# Arguments:
#	path        the button box widget name
#	tag         the tag to modify
#
# Results:
#	None.

proc ButtonBox::getbuttonstate {path tag} {
    variable $path
    upvar 0  $path data
    # First see if this is a real tag
    if { [info exists data(tagstate,$tag)] } {
	return $data(tagstate,$tag)
    } else {
	error "unknown tag $tag"
    }
}

# ----------------------------------------------------------------------------
#  Command ButtonBox::itemconfigure
# ----------------------------------------------------------------------------
proc ButtonBox::itemconfigure { path index args } {
    if { [set idx [lsearch $args -default]] != -1 } {
        set args [lreplace $args $idx [expr {$idx+1}]]
    }
    return [eval [list Button::configure $path.b[index $path $index]] $args]
}


# ----------------------------------------------------------------------------
#  Command ButtonBox::itemcget
# ----------------------------------------------------------------------------
proc ButtonBox::itemcget { path index option } {
    return [Button::cget $path.b[index $path $index] $option]
}


# ----------------------------------------------------------------------------
#  Command ButtonBox::setfocus
# ----------------------------------------------------------------------------
proc ButtonBox::setfocus { path index } {
    set but $path.b[index $path $index]
    if { [winfo exists $but] } {
        focus $but
    }
}


# ----------------------------------------------------------------------------
#  Command ButtonBox::invoke
# ----------------------------------------------------------------------------
proc ButtonBox::invoke { path index } {
    set but $path.b[index $path $index]
    if { [winfo exists $but] } {
        Button::invoke $but
    }
}


# ----------------------------------------------------------------------------
#  Command ButtonBox::index
# ----------------------------------------------------------------------------
proc ButtonBox::index { path index } {
    variable $path
    upvar 0  $path data

    set n [expr {$data(nbuttons) - 1}]

    if {[string equal $index "default"]} {
        set res [Widget::getoption $path -default]
    } elseif {$index == "end" || $index == "last"} {
	set res $n
    } elseif {![string is integer -strict $index]} {
	## It's not an integer.  Search the text of each button
	## in the box and return the index that matches.
	foreach i $data(buttons) {
	    set w $path.b$i
	    lappend text  [$w cget -text]
	    lappend names [$w cget -name]
	}
	set res [lsearch -exact [concat $names $text] $index]
    } else {
        set res $index
	if {$index > $n} { set res $n }
    }
    return $res
}


# ButtonBox::gettags --
#
#	Return a list of all the tags on all the buttons in a buttonbox.
#
# Arguments:
#	path      the buttonbox to query.
#
# Results:
#	taglist   a list of tags on the buttons in the buttonbox

proc ButtonBox::gettags {path} {
    upvar ::ButtonBox::$path data
    set taglist {}
    foreach tag [array names data "tags,*"] {
	lappend taglist [string range $tag 5 end]
    }
    return $taglist
}


# ----------------------------------------------------------------------------
#  Command ButtonBox::_redraw
# ----------------------------------------------------------------------------
proc ButtonBox::_redraw { path } {
    variable $path
    upvar 0  $path data
    Widget::getVariable $path buttons

    # For tk >= 8.4, -uniform gridding option is used.
    # Otherwise, there is the constraint, that button size may not change after
    # creation.
    set uniformAvailable [expr {0 <= [package vcompare [info patchlevel] 8.4.0]}]

    ## We re-grid the buttons from left-to-right.  As we go through
    ## each button, we check its spacing and which direction the
    ## spacing applies to.  Once spacing has been applied to an index,
    ## it is not changed.  This means spacing takes precedence from
    ## left-to-right.

    set idx  0
    set idxs [list]
    foreach i $data(buttons) {
	set dir     [lindex $data(spacing,$i) 0]
	set spacing [lindex $data(spacing,$i) 1]
        set but $path.b$i
        if {[string equal [Widget::getoption $path -orient] "horizontal"]} {
            grid $but -column $idx -row 0 -sticky nsew
            if { [Widget::getoption $path -homogeneous] } {
                if {$uniformAvailable} {
                    grid columnconfigure $path $idx -uniform koen -weight 1
                } else {
                    set req [winfo reqwidth $but]
                    if { $req > $data(max) } {
                        grid columnconfigure $path [expr {2*$i}] -minsize $req
                        set data(max) $req
                    }
                    grid columnconfigure $path $idx -weight 1
                }
            } else {
                grid columnconfigure $path $idx -weight 0
            }

	    set col [expr {$idx - 1}]
	    if {[string equal $dir "right"]} { set col [expr {$idx + 1}] }
	    if {$col > 0 && [lsearch $idxs $col] < 0} {
		lappend idxs $col
		grid columnconfigure $path $col -minsize $spacing
	    }
        } else {
            grid $but -column 0 -row $idx -sticky nsew
            grid rowconfigure $path $idx -weight 0

	    set row [expr {$idx - 1}]
	    if {[string equal $dir "right"]} { set row [expr {$idx + 1}] }
	    if {$row > 0 && [lsearch $idxs $row] < 0} {
		lappend idxs $row
		grid rowconfigure $path $row -minsize $spacing
	    }
        }
        incr idx 2
    }

    if {!$uniformAvailable} {
        # Now that the maximum size has been calculated, go back through
        # and correctly set the size for homogeneous horizontal buttons.
        if { [string equal [Widget::getoption $path -orient] "horizontal"] && [Widget::getoption $path -homogeneous] } {
            set idx 0
            foreach i $data(buttons) {
                grid columnconfigure $path $idx -minsize $data(max)
                incr idx 2
            }
        }
    }
}


# ----------------------------------------------------------------------------
#  Command ButtonBox::_destroy
# ----------------------------------------------------------------------------
proc ButtonBox::_destroy { path } {
    variable $path
    upvar 0  $path data
    Widget::destroy $path
    unset data
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/color.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
namespace eval SelectColor {
    Widget::define SelectColor color Dialog

    Widget::declare SelectColor {
        {-title     String     "Select a color" 0}
        {-parent    String     ""               0}
        {-color     TkResource ""               0 {label -background}}
	{-type      Enum       "dialog"         1 {dialog popup}}
	{-placement String     "center"         1}
    }

    variable _baseColors {
        \#0000ff \#00ff00 \#00ffff \#ff0000 \#ff00ff \#ffff00
        \#000099 \#009900 \#009999 \#990000 \#990099 \#999900
        \#000000 \#333333 \#666666 \#999999 \#cccccc \#ffffff
    }

    variable _userColors {
        \#ffffff \#ffffff \#ffffff \#ffffff \#ffffff \#ffffff
        \#ffffff \#ffffff \#ffffff \#ffffff \#ffffff
    }

    if {[string equal $::tcl_platform(platform) "unix"]} {
        set useTkDialogue 0
    } else {
        set useTkDialogue 1
    }

    variable _selectype
    variable _selection
    variable _wcolor
    variable _image
    variable _hsv
}

proc SelectColor::create { path args } {
    Widget::init SelectColor $path $args

    set type [Widget::cget $path -type]

    switch -- [Widget::cget $path -type] {
	"dialog" {
	    return [eval [list SelectColor::dialog $path] $args]
	}

	"popup" {
	    set list      [list at center left right above below]
	    set placement [Widget::cget $path -placement]
	    set where     [lindex $placement 0]

	    if {[lsearch $list $where] < 0} {
		return -code error \
		    [BWidget::badOptionString placement $placement $list]
	    }

	    ## If they specified a parent and didn't pass a second argument
	    ## in the placement, set the placement relative to the parent.
	    set parent [Widget::cget $path -parent]
	    if {[string length $parent]} {
		if {[llength $placement] == 1} { lappend placement $parent }
	    }
	    return [eval [list SelectColor::menu $path $placement] $args]
	}
    }
}

proc SelectColor::menu {path placement args} {
    variable _baseColors
    variable _userColors
    variable _wcolor
    variable _selectype
    variable _selection

    Widget::init SelectColor $path $args
    set top [toplevel $path]
    set parent [winfo toplevel [winfo parent $top]]
    wm withdraw  $top
    wm transient $top $parent
    wm overrideredirect $top 1
    catch { wm attributes $top -topmost 1 }

    set frame [frame $top.frame \
                   -highlightthickness 0 \
                   -relief raised -borderwidth 2]
    set col    0
    set row    0
    set count  0
    set colors [concat $_baseColors $_userColors]
    foreach color $colors {
        set f [frame $frame.c$count \
                   -highlightthickness 2 \
                   -highlightcolor white \
                   -relief solid -borderwidth 1 \
                   -width 16 -height 16 -background $color]
        bind $f <1>     "set SelectColor::_selection $count; break"
        bind $f <Enter> {focus %W}
        grid $f -column $col -row $row
        incr count
        if {[incr col] == 6 } {
            set  col 0
            incr row
        }
    }
    set f [label $frame.c$count \
               -highlightthickness 2 \
               -highlightcolor white \
               -relief flat -borderwidth 0 \
               -width 16 -height 16 -image [Bitmap::get palette]]
    grid $f -column $col -row $row
    bind $f <1>     "set SelectColor::_selection $count; break"
    bind $f <Enter> {focus %W}
    pack $frame

    bind $top <1>      {set SelectColor::_selection -1}
    bind $top <Escape> {set SelectColor::_selection -2}
    bind $top <FocusOut> [subst {if {"%W" == "$top"} \
				     {set SelectColor::_selection -2}}]
    eval [list BWidget::place $top 0 0] $placement

    wm deiconify $top
    raise $top
    if {$::tcl_platform(platform) == "unix"} {
	tkwait visibility $top
	update
    }
    BWidget::SetFocusGrab $top $frame.c0

    vwait SelectColor::_selection
    BWidget::RestoreFocusGrab $top $frame.c0 destroy
    Widget::destroy $top
    if {$_selection == $count} {
	array set opts {
	    -parent -parent
	    -title  -title
	    -color  -initialcolor
	}
	if {[Widget::theme]} {
	    set native 1
	    set nativecmd [list tk_chooseColor -parent $parent]
	    foreach {key val} $args {
		if {![info exists opts($key)]} {
		    set native 0
		    break
		}
		lappend nativecmd $opts($key) $val
	    }
	    if {$native} {
		return [eval $nativecmd]
	    }
	}
	return [eval [list dialog $path] $args]
    } else {
        return [lindex $colors $_selection]
    }
}


proc SelectColor::dialog {path args} {
    variable _baseColors
    variable _userColors
    variable _widget
    variable _selection
    variable _image
    variable _hsv

    Widget::init SelectColor $path:SelectColor $args
    set top   [Dialog::create $path \
                   -title  [Widget::cget $path:SelectColor -title]  \
                   -parent [Widget::cget $path:SelectColor -parent] \
                   -separator 1 -default 0 -cancel 1 -anchor e]
    wm resizable $top 0 0
    set dlgf  [$top getframe]
    set fg    [frame $dlgf.fg]
    set desc  [list \
                   base _baseColors "Base colors" \
                   user _userColors "User colors"]
    set count 0
    foreach {type varcol defTitle} $desc {
        set col   0
        set lin   0
        set title [lindex [BWidget::getname "${type}Colors"] 0]
        if {![string length $title]} {
            set title $defTitle
        }
        set titf  [TitleFrame $fg.$type -text $title]
        set subf  [$titf getframe]
        foreach color [set $varcol] {
            set fround [frame $fg.round$count \
                            -highlightthickness 1 \
                            -relief sunken -borderwidth 2]
            set fcolor [frame $fg.color$count -width 16 -height 12 \
                            -highlightthickness 0 \
                            -relief flat -borderwidth 0 \
                            -background $color]
            pack $fcolor -in $fround
            grid $fround -in $subf -row $lin -column $col -padx 1 -pady 1

            bind $fround <ButtonPress-1> [list SelectColor::_select_rgb $count]
            bind $fcolor <ButtonPress-1> [list SelectColor::_select_rgb $count]

	    bind $fround <Double-1> \
	    	"SelectColor::_select_rgb [list $count]; [list $top] invoke 0"
	    bind $fcolor <Double-1> \
	    	"SelectColor::_select_rgb [list $count]; [list $top] invoke 0"

            incr count
            if {[incr col] == 6} {
                incr lin
                set  col 0
            }
        }
        pack $titf -anchor w -pady 2
    }
    set fround [frame $fg.round \
                    -highlightthickness 0 \
                    -relief sunken -borderwidth 2]
    set fcolor [frame $fg.color \
                    -width 50 \
                    -highlightthickness 0 \
                    -relief flat -borderwidth 0]
    pack $fcolor -in $fround -fill y -expand yes
    pack $fround -anchor e -pady 2 -fill y -expand yes

    set fd  [frame $dlgf.fd]
    set f1  [frame $fd.f1 -relief sunken -borderwidth 2]
    set f2  [frame $fd.f2 -relief sunken -borderwidth 2]
    set c1  [canvas $f1.c -width 200 -height 200 -bd 0 -highlightthickness 0]
    set c2  [canvas $f2.c -width 15  -height 200 -bd 0 -highlightthickness 0]

    for {set val 0} {$val < 40} {incr val} {
        $c2 create rectangle 0 [expr {5*$val}] 15 [expr {5*$val+5}] -tags val[expr {39-$val}]
    }
    $c2 create polygon 0 0 10 5 0 10 -fill black -outline white -tags target

    pack $c1 $c2
    pack $f1 $f2 -side left -padx 10 -anchor n

    pack $fg $fd -side left -anchor n -fill y

    bind $c1 <ButtonPress-1> [list SelectColor::_select_hue_sat %x %y]
    bind $c1 <B1-Motion>     [list SelectColor::_select_hue_sat %x %y]

    bind $c2 <ButtonPress-1> [list SelectColor::_select_value %x %y]
    bind $c2 <B1-Motion>     [list SelectColor::_select_value %x %y]

    if {![info exists _image] || [catch {image type $_image}]} {
        set _image [image create photo -width 200 -height 200]
        for {set x 0} {$x < 200} {incr x 4} {
            for {set y 0} {$y < 200} {incr y 4} {
                $_image put \
		    [eval [list format "\#%04x%04x%04x"] \
			[hsvToRgb [expr {$x/196.0}] [expr {(196-$y)/196.0}] 0.85]] \
			-to $x $y [expr {$x+4}] [expr {$y+4}]
            }
        }
    }
    $c1 create image  0 0 -anchor nw -image $_image
    $c1 create bitmap 0 0 \
        -bitmap @[file join $::BWIDGET::LIBRARY "images" "target.xbm"] \
        -anchor nw -tags target

    set _selection -1
    set _widget(fcolor) $fg
    set _widget(chs)    $c1
    set _widget(cv)     $c2
    set rgb             [winfo rgb $path [Widget::cget $path:SelectColor -color]]
    set _hsv            [eval rgbToHsv $rgb]
    _set_rgb     [eval [list format "\#%04x%04x%04x"] $rgb]
    _set_hue_sat [lindex $_hsv 0] [lindex $_hsv 1]
    _set_value   [lindex $_hsv 2]

    $top add -name ok
    $top add -name cancel
    set res [$top draw]
    if {$res == 0} {
        set color [$fg.color cget -background]
    } else {
        set color ""
    }
    destroy $top
    return $color
}

proc SelectColor::setcolor { idx color } {
    variable _userColors
    set _userColors [lreplace $_userColors $idx $idx $color]
}

proc SelectColor::_select_rgb {count} {
    variable _baseColors
    variable _userColors
    variable _selection
    variable _widget
    variable _hsv

    set frame $_widget(fcolor)
    if {$_selection >= 0} {
        $frame.round$_selection configure \
            -relief sunken -highlightthickness 1 -borderwidth 2
    }
    $frame.round$count configure \
        -relief flat -highlightthickness 2 -borderwidth 1
    focus $frame.round$count
    set _selection $count
    set bg   [$frame.color$count cget -background]
    set user [expr {$_selection-[llength $_baseColors]}]
    if {$user >= 0 &&
        [string equal \
              [winfo rgb $frame.color$_selection $bg] \
              [winfo rgb $frame.color$_selection white]]} {
        set bg [$frame.color cget -bg]
        $frame.color$_selection configure -background $bg
        set _userColors [lreplace $_userColors $user $user $bg]
    } else {
        set _hsv [eval rgbToHsv [winfo rgb $frame.color$count $bg]]
        _set_hue_sat [lindex $_hsv 0] [lindex $_hsv 1]
        _set_value   [lindex $_hsv 2]
        $frame.color configure -background $bg
    }
}


proc SelectColor::_set_rgb {rgb} {
    variable _selection
    variable _baseColors
    variable _userColors
    variable _widget

    set frame $_widget(fcolor)
    $frame.color configure -background $rgb
    set user [expr {$_selection-[llength $_baseColors]}]
    if {$user >= 0} {
        $frame.color$_selection configure -background $rgb
        set _userColors [lreplace $_userColors $user $user $rgb]
    }
}


proc SelectColor::_select_hue_sat {x y} {
    variable _widget
    variable _hsv

    if {$x < 0} {
        set x 0
    } elseif {$x > 200} {
        set x 200
    }
    if {$y < 0 } {
        set y 0
    } elseif {$y > 200} {
        set y 200
    }
    set hue  [expr {$x/200.0}]
    set sat  [expr {(200-$y)/200.0}]
    set _hsv [lreplace $_hsv 0 1 $hue $sat]
    $_widget(chs) coords target [expr {$x-9}] [expr {$y-9}]
    _draw_values $hue $sat
    _set_rgb [eval [list format "\#%04x%04x%04x"] [eval [list hsvToRgb] $_hsv]]
}


proc SelectColor::_set_hue_sat {hue sat} {
    variable _widget

    set x [expr {$hue*200-9}]
    set y [expr {(1-$sat)*200-9}]
    $_widget(chs) coords target $x $y
    _draw_values $hue $sat
}



proc SelectColor::_select_value {x y} {
    variable _widget
    variable _hsv

    if {$y < 0} {
        set y 0
    } elseif {$y > 200} {
        set y 200
    }
    $_widget(cv) coords target 0 [expr {$y-5}] 10 $y 0 [expr {$y+5}]
    set _hsv [lreplace $_hsv 2 2 [expr {(200-$y)/200.0}]]
    _set_rgb [eval [list format "\#%04x%04x%04x"] [eval [list hsvToRgb] $_hsv]]
}


proc SelectColor::_draw_values {hue sat} {
    variable _widget

    for {set val 0} {$val < 40} {incr val} {
        set l   [hsvToRgb $hue $sat [expr {$val/39.0}]]
        set col [eval [list format "\#%04x%04x%04x"] $l]
        $_widget(cv) itemconfigure val$val -fill $col -outline $col
    }
}


proc SelectColor::_set_value {value} {
    variable _widget

    set y [expr {int((1-$value)*200)}]
    $_widget(cv) coords target 0 [expr {$y-5}] 10 $y 0 [expr {$y+5}]
}


# --
#  Taken from tk8.0/demos/tcolor.tcl
# --
# The procedure below converts an HSB value to RGB.  It takes hue, saturation,
# and value components (floating-point, 0-1.0) as arguments, and returns a
# list containing RGB components (integers, 0-65535) as result.  The code
# here is a copy of the code on page 616 of "Fundamentals of Interactive
# Computer Graphics" by Foley and Van Dam.

proc SelectColor::hsvToRgb {hue sat val} {
    set v [expr {round(65535.0*$val)}]
    if {$sat == 0} {
	return [list $v $v $v]
    } else {
	set hue [expr {$hue*6.0}]
	if {$hue >= 6.0} {
	    set hue 0.0
	}
	set i [expr {int($hue)}]
	set f [expr {$hue-$i}]
	set p [expr {round(65535.0*$val*(1 - $sat))}]
        set q [expr {round(65535.0*$val*(1 - ($sat*$f)))}]
        set t [expr {round(65535.0*$val*(1 - ($sat*(1 - $f))))}]
        switch $i {
	    0 {return [list $v $t $p]}
	    1 {return [list $q $v $p]}
	    2 {return [list $p $v $t]}
	    3 {return [list $p $q $v]}
	    4 {return [list $t $p $v]}
            5 {return [list $v $p $q]}
        }
    }
}


# --
#  Taken from tk8.0/demos/tcolor.tcl
# --
# The procedure below converts an RGB value to HSB.  It takes red, green,
# and blue components (0-65535) as arguments, and returns a list containing
# HSB components (floating-point, 0-1) as result.  The code here is a copy
# of the code on page 615 of "Fundamentals of Interactive Computer Graphics"
# by Foley and Van Dam.

proc SelectColor::rgbToHsv {red green blue} {
    if {$red > $green} {
	set max $red.0
	set min $green.0
    } else {
	set max $green.0
	set min $red.0
    }
    if {$blue > $max} {
	set max $blue.0
    } else {
	if {$blue < $min} {
	    set min $blue.0
	}
    }
    set range [expr {$max-$min}]
    if {$max == 0} {
	set sat 0
    } else {
	set sat [expr {($max-$min)/$max}]
    }
    if {$sat == 0} {
	set hue 0
    } else {
	set rc [expr {($max - $red)/$range}]
	set gc [expr {($max - $green)/$range}]
	set bc [expr {($max - $blue)/$range}]
	if {$red == $max} {
	    set hue [expr {.166667*($bc - $gc)}]
	} else {
	    if {$green == $max} {
		set hue [expr {.166667*(2 + $rc - $bc)}]
	    } else {
		set hue [expr {.166667*(4 + $gc - $rc)}]
	    }
	}
	if {$hue < 0.0} {
	    set hue [expr {$hue + 1.0}]
	}
    }
    return [list $hue $sat [expr {$max/65535}]]
}

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/combobox.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
# ----------------------------------------------------------------------------
#  combobox.tcl
#  This file is part of Unifix BWidget Toolkit
#  $Id: combobox.tcl,v 1.42.2.3 2012/04/02 09:53:41 oehhar Exp $
# ----------------------------------------------------------------------------
#  Index of commands:
#     - ComboBox::create
#     - ComboBox::configure
#     - ComboBox::cget
#     - ComboBox::setvalue
#     - ComboBox::getvalue
#     - ComboBox::clearvalue
#     - ComboBox::getentry
#     - ComboBox::_create_popup
#     - ComboBox::_mapliste
#     - ComboBox::_unmapliste
#     - ComboBox::_select
#     - ComboBox::_modify_value
# ----------------------------------------------------------------------------

# ComboBox uses the 8.3 -listvariable listbox option
package require Tk 8.3

namespace eval ComboBox {
    Widget::define ComboBox combobox ArrowButton Entry ListBox

    Widget::tkinclude ComboBox frame :cmd \
	include {-relief -borderwidth -bd -background} \
	initialize {-relief sunken -borderwidth 2}

    if {[Widget::theme]} {
	Widget::bwinclude ComboBox Entry .e
    } else {
	Widget::bwinclude ComboBox Entry .e \
	    remove {-relief -bd -borderwidth -bg} \
	    rename {-background -entrybg}
    }

    Widget::declare ComboBox {
	{-height       TkResource 0    0 listbox}
	{-values       String	  ""   0}
	{-images       String	  ""   0}
	{-indents      String	  ""   0}
	{-modifycmd    String	  ""   0}
	{-postcommand  String	  ""   0}
	{-expand       Enum	  none 0 {none tab}}
	{-autocomplete Boolean	  0    0}
        {-autopost     Boolean    0    0}
        {-bwlistbox    Boolean    0    0}
        {-listboxwidth Int        0    0}
        {-hottrack     Boolean    0    0}
    }

    if {[Widget::theme]} {
	Widget::addmap ComboBox ArrowButton .a {
	    -background {} -state {}
	}
    } else {
	Widget::addmap ComboBox ArrowButton .a {
	    -background {} -foreground {} -disabledforeground {} -state {}
	}
    }

    ::bind BwComboBox <FocusIn> [list after idle {BWidget::refocus %W %W.e}]
    ::bind BwComboBox <Destroy> [list ComboBox::_destroy %W]

    ::bind ListBoxHotTrack <Motion> {
        %W selection clear 0 end
        %W activate @%x,%y
        %W selection set @%x,%y
    }

    variable _index
}


# ComboBox::create --
#
#	Create a combobox widget with the given options.
#
# Arguments:
#	path	name of the new widget.
#	args	optional arguments to the widget.
#
# Results:
#	path	name of the new widget.

proc ComboBox::create { path args } {
    array set maps [list ComboBox {} :cmd {} .e {} .a {}]
    array set maps [Widget::parseArgs ComboBox $args]

    eval [list frame $path] $maps(:cmd) \
	[list -highlightthickness 0 -takefocus 0 -class ComboBox]
    Widget::initFromODB ComboBox $path $maps(ComboBox)

    bindtags $path [list $path BwComboBox [winfo toplevel $path] all]

    if {[Widget::theme]} {
        set entry [eval [list Entry::create $path.e] $maps(.e) \
            [list -takefocus 1]]
    } else {
        set entry [eval [list Entry::create $path.e] $maps(.e) \
            [list -relief flat -borderwidth 0 -takefocus 1]]
    }

    ::bind $path.e <FocusOut>      [list $path _focus_out]
    ::bind $path   <<TraverseIn>>  [list $path _traverse_in]

    if {[Widget::cget $path -autocomplete]} {
	::bind $path.e <KeyRelease> [list $path _auto_complete %K]
    }

    if {[Widget::cget $path -autopost]} {
        ::bind $path.e <KeyRelease> +[list $path _auto_post %K]
    } else {
        ::bind $entry <Key-Up>	  [list ComboBox::_unmapliste $path]
        ::bind $entry <Key-Down>  [list ComboBox::_mapliste $path]
    }

    if {[string equal [tk windowingsystem] "x11"]} {
	set ipadx 0
	set width 11
    } else {
	set ipadx 2
	set width 15
    }
    set height [winfo reqheight $entry]
    set arrow [eval [list ArrowButton::create $path.a] $maps(.a) \
		   [list -width $width -height $height \
			-highlightthickness 0 -borderwidth 1 -takefocus 0 \
			-dir bottom -type  button -ipadx $ipadx \
			-command [list ComboBox::_mapliste $path] \
		       ]]

    pack $arrow -side right -fill y
    pack $entry -side left  -fill both -expand yes

    set editable [Widget::cget $path -editable]
    Entry::configure $path.e -editable $editable
    if {$editable} {
	::bind $entry <ButtonPress-1> [list ComboBox::_unmapliste $path]
    } else {
	::bind $entry <ButtonPress-1> [list ArrowButton::invoke $path.a]
	if { ![string equal [Widget::cget $path -state] "disabled"] } {
	    Entry::configure $path.e -takefocus 1
	}
    }

    ::bind $path  <ButtonPress-1> [list ComboBox::_unmapliste $path]
    ::bind $entry <Control-Up>	  [list ComboBox::_modify_value $path previous]
    ::bind $entry <Control-Down>  [list ComboBox::_modify_value $path next]
    ::bind $entry <Control-Prior> [list ComboBox::_modify_value $path first]
    ::bind $entry <Control-Next>  [list ComboBox::_modify_value $path last]

    if {$editable} {
	set expand [Widget::cget $path -expand]
	if {[string equal "tab" $expand]} {
	    # Expand entry value on Tab (from -values)
	    ::bind $entry <Tab> "[list ComboBox::_expand $path]; break"
	} elseif {[string equal "auto" $expand]} {
	    # Expand entry value anytime (from -values)
	    #::bind $entry <Key> "[list ComboBox::_expand $path]; break"
	}
    }

    ## If we have images, we have to use a BWidget ListBox.
    set bw [Widget::cget $path -bwlistbox]
    if {[llength [Widget::cget $path -images]]} {
        Widget::configure $path [list -bwlistbox 1]
    } else {
        Widget::configure $path [list -bwlistbox $bw]
    }

    set ComboBox::_index($path) -1

    return [Widget::create ComboBox $path]
}


# ComboBox::configure --
#
#	Configure subcommand for ComboBox widgets.  Works like regular
#	widget configure command.
#
# Arguments:
#	path	Name of the ComboBox widget.
#	args	Additional optional arguments:
#			?-option?
#			?-option value ...?
#
# Results:
#	Depends on arguments.  If no arguments are given, returns a complete
#	list of configuration information.  If one argument is given, returns
#	the configuration information for that option.  If more than one
#	argument is given, returns nothing.

proc ComboBox::configure { path args } {
    set res [Widget::configure $path $args]
    set entry $path.e


    set list [list -images -values -bwlistbox -hottrack -autocomplete -autopost]
    foreach {ci cv cb ch cac cap} [eval [linsert $list 0 Widget::hasChangedX $path]] { break }

    if { $ci } {
        set images [Widget::cget $path -images]
        if {[llength $images]} {
            Widget::configure $path [list -bwlistbox 1]
        } else {
            Widget::configure $path [list -bwlistbox 0]
        }
    }

    ## If autocomplete toggled, turn bindings on/off
    if { $cac } {
        if {[Widget::cget $path -autocomplete]} {
            ::bind $entry <KeyRelease> +[list $path _auto_complete %K]
        } else {
            set bindings [split [::bind $entry <KeyRelease>] \n]
            if {[set idx [lsearch $bindings [list $path _auto_complete %K]]] != -1} {
                ::bind $entry <KeyRelease> [join [lreplace $bindings $idx $idx] \n]
            }
        }
    }

    ## If autopost toggled, turn bindings on/off
    if { $cap } {
        if {[Widget::cget $path -autopost]} {
            ::bind $entry <KeyRelease> +[list $path _auto_post %K]
            set bindings [split [::bind $entry <Key-Up>] \n]
            if {[set idx [lsearch $bindings [list ComboBox::_unmapliste $path]]] != -1} {
                ::bind $entry <Key-Up> [join [lreplace $bindings $idx $idx] \n]
            }
            set bindings [split [::bind $entry <Key-Down>] \n]
            if {[set idx [lsearch $bindings [list ComboBox::_mapliste $path]]] != -1} {
                ::bind $entry <Key-Down> [join [lreplace $bindings $idx $idx] \n]
            }
        } else {
            set bindings [split [::bind $entry <KeyRelease>] \n]
            if {[set idx [lsearch $bindings [list $path _auto_post %K]]] != -1} {
                ::bind $entry <KeyRelease> [join [lreplace $bindings $idx $idx] \n]
            }
            ::bind $entry <Key-Up> +[list ComboBox::_unmapliste $path]
            ::bind $entry <Key-Down> +[list ComboBox::_mapliste $path]
        }
    }

    set bw [Widget::cget $path -bwlistbox]

    ## If the images, bwlistbox, hottrack or values have changed,
    ## destroy the shell so that it will re-create itself the next
    ## time around.
    if { $ci || $cb || $ch || ($bw && $cv) } {
        destroy $path.shell
    }

    set chgedit [Widget::hasChangedX $path -editable]
    if {$chgedit} {
        if {[Widget::cget $path -editable]} {
            ::bind $entry <ButtonPress-1> [list ComboBox::_unmapliste $path]
	    Entry::configure $entry -editable true
	} else {
	    ::bind $entry <ButtonPress-1> [list ArrowButton::invoke $path.a]
	    Entry::configure $entry -editable false

	    # Make sure that non-editable comboboxes can still be tabbed to.

	    if { ![string equal [Widget::cget $path -state] "disabled"] } {
		Entry::configure $entry -takefocus 1
	    }
        }
    }

    if {$chgedit || [Widget::hasChangedX $path -expand]} {
	# Unset what we may have created.
	::bind $entry <Tab> {}
	if {[Widget::cget $path -editable]} {
	    set expand [Widget::cget $path -expand]
	    if {[string equal "tab" $expand]} {
		# Expand entry value on Tab (from -values)
		::bind $entry <Tab> "[list ComboBox::_expand $path]; break"
	    } elseif {[string equal "auto" $expand]} {
		# Expand entry value anytime (from -values)
		#::bind $entry <Key> "[list ComboBox::_expand $path]; break"
	    }
	}
    }

    # if state changed to normal and -editable false, the edit must take focus
    if {    [Widget::hasChangedX $path -state] \
        && ![string equal [Widget::cget $path -state] "disabled"] \
        && ![Widget::cget $path -editable] } {
        Entry::configure $entry -takefocus 1
    }

    # if the dropdown listbox is shown, simply force the actual entry
    #  colors into it. If it is not shown, the next time the dropdown
    #  is shown it'll get the actual colors anyway
    if {[winfo exists $path.shell.listb]} {
	$path.shell.listb configure \
	    -bg [_getbg $path] \
	    -fg [_getfg $path]
	if {![Widget::theme]} {
	    $path.shell.listb configure \
		-selectbackground [Widget::cget $path -selectbackground] \
		-selectforeground [Widget::cget $path -selectforeground]
	}
    }

    return $res
}


# ----------------------------------------------------------------------------
#  Command ComboBox::cget
# ----------------------------------------------------------------------------
proc ComboBox::cget { path option } {
    return [Widget::cget $path $option]
}


# ----------------------------------------------------------------------------
#  Command ComboBox::setvalue
# ----------------------------------------------------------------------------
proc ComboBox::setvalue { path index } {
    variable _index

    set values [Widget::getMegawidgetOption $path -values]
    set value  [Entry::cget $path.e -text]
    switch -- $index {
        next {
            if { [set idx [lsearch -exact $values $value]] != -1 } {
                incr idx
            } else {
                set idx [lsearch -exact $values "$value*"]
            }
        }
        previous {
            if { [set idx [lsearch -exact $values $value]] != -1 } {
                incr idx -1
            } else {
                set idx [lsearch -exact $values "$value*"]
            }
        }
        first {
            set idx 0
        }
        last {
            set idx [expr {[llength $values]-1}]
        }
        default {
            if { [string index $index 0] == "@" } {
                set idx [string range $index 1 end]
		if { ![string is integer -strict $idx] } {
                    return -code error "bad index \"$index\""
                }
            } else {
                return -code error "bad index \"$index\""
            }
        }
    }
    if { $idx >= 0 && $idx < [llength $values] } {
        set newval [lindex $values $idx]
        set _index($path) $idx
	Entry::configure $path.e -text $newval
        return 1
    }
    return 0
}


proc ComboBox::icursor { path idx } {
    return [$path.e icursor $idx]
}


proc ComboBox::get { path } {
    return [$path.e get]
}


# ----------------------------------------------------------------------------
#  Command ComboBox::getvalue
# ----------------------------------------------------------------------------
proc ComboBox::getvalue { path } {
    variable _index
    set values [Widget::getMegawidgetOption $path -values]
    set value  [Entry::cget $path.e -text]
    # Check if an index was saved by the last setvalue operation
    # If this index still matches it is returned
    # This is necessary for the case when values is not unique
    if { $_index($path) >= 0 \
        && $_index($path) < [llength $values] \
        && $value eq [lindex $values $_index($path)]} {
        return $_index($path)
    }

    return [lsearch -exact $values $value]
}


proc ComboBox::getlistbox { path } {
    _create_popup $path
    return $path.shell.listb
}


# ----------------------------------------------------------------------------
#  Command ComboBox::post
# ----------------------------------------------------------------------------
proc ComboBox::post { path } {
    _mapliste $path
    return
}


proc ComboBox::unpost { path } {
    _unmapliste $path
    return
}


# ----------------------------------------------------------------------------
#  Command ComboBox::bind
# ----------------------------------------------------------------------------
proc ComboBox::bind { path args } {
    return [eval [list ::bind $path.e] $args]
}


proc ComboBox::insert { path idx args } {
    upvar #0 [Widget::varForOption $path -values] values

    if {[Widget::cget $path -bwlistbox]} {
        set l [$path getlistbox]
        set i [eval [linsert $args 0 $l insert $idx #auto]]
        set text [$l itemcget $i -text]
        if {$idx == "end"} {
            lappend values $text
        } else {
            set values [linsert $values $idx $text]
        }
    } else {
        set values [eval [list linsert $values $idx] $args]
    }
}

# ----------------------------------------------------------------------------
#  Command ComboBox::clearvalue
# ----------------------------------------------------------------------------
proc ComboBox::clearvalue { path } {
    Entry::configure $path.e -text ""
}

# ----------------------------------------------------------------------------
#  Command ComboBox::getentry
# ----------------------------------------------------------------------------
proc ComboBox::getentry { path } {
    return $path.e
}

proc ComboBox::_getfg {path} {
    # First try to retrieve option
    set fg [Widget::cget $path -foreground];
    if { 0 == [string length $fg] && [Widget::theme] } {
	# fall back to style settings when not configured for widget
	return [::ttk::style lookup TEntry -foreground];
    }
    return $fg;
}
proc ComboBox::_getbg {path} {
    if {[Widget::theme]} {
	# First try to retrieve option
	set bg [Widget::cget $path -background];
	if {0 == [string length $bg]} {
	    # fall back to style settings when not configured for widget
	    return [::ttk::style lookup TEntry -backround];
	}
    } else {
	# fetch the entrybg resource value
	set bg [Widget::cget $path -entrybg]
    }
    return $bg;
}
# ----------------------------------------------------------------------------
#  Command ComboBox::_create_popup
# ----------------------------------------------------------------------------
proc ComboBox::_create_popup { path } {
    set shell $path.shell

    if {[winfo exists $shell]} { return }

    set lval   [Widget::cget $path -values]
    set h      [Widget::cget $path -height]
    set bw     [Widget::cget $path -bwlistbox]

    if { $h <= 0 } {
	set len [llength $lval]
	if { $len < 3 } {
	    set h 3
	} elseif { $len > 10 } {
	    set h 10
	} else {
	    set h $len
	}
    }

    if {[string equal [tk windowingsystem] "x11"]} {
	set sbwidth 11
    } else {
	set sbwidth 15
    }

    toplevel            $shell -relief solid -bd 1
    wm withdraw         $shell
    wm overrideredirect $shell 1
    # these commands cause the combobox to behave strangely on OS X
    if {! $Widget::_aqua } {
        update idle
        wm transient    $shell [winfo toplevel $path]
        catch { wm attributes $shell -topmost 1 }
    }

    set sw [ScrolledWindow $shell.sw -managed 1 -size $sbwidth -ipad 0]

    if {$bw} {
        if {[Widget::theme]} {
            set listb  [ListBox $shell.listb \
                    -relief flat -borderwidth 0 -highlightthickness 0 \
                    -selectmode single -selectfill 1 -autofocus 0 -height $h \
                    -font [Widget::cget $path -font] \
                    -bg [_getbg $path] \
                    -fg [_getfg $path]]
        } else {
            set listb  [ListBox $shell.listb \
                    -relief flat -borderwidth 0 -highlightthickness 0 \
                    -selectmode single -selectfill 1 -autofocus 0 -height $h \
                    -font [Widget::cget $path -font]  \
                    -bg [_getbg $path] \
                    -fg [_getfg $path] \
                    -selectbackground [Widget::cget $path -selectbackground] \
                    -selectforeground [Widget::cget $path -selectforeground]]
        }

        set values [Widget::cget $path -values]
        set images [Widget::cget $path -images]
        foreach value $values image $images {
            $listb insert end #auto -text $value -image $image
        }
	$listb bindText  <1> [list ComboBox::_select $path]
	$listb bindImage <1> [list ComboBox::_select $path]
        if {[Widget::cget $path -hottrack]} {
            $listb bindText  <Enter> [list $listb selection set]
            $listb bindImage <Enter> [list $listb selection set]
        }
    } else {
        if {[Widget::theme]} {
            set listb  [listbox $shell.listb \
                    -relief flat -borderwidth 0 -highlightthickness 0 \
                    -exportselection false \
                    -font	[Widget::cget $path -font]  \
                    -height $h \
                    -bg [_getbg $path] \
                    -fg [_getfg $path] \
                    -listvariable [Widget::varForOption $path -values]]
        } else {
            set listb  [listbox $shell.listb \
                    -relief flat -borderwidth 0 -highlightthickness 0 \
                    -exportselection false \
                    -font	[Widget::cget $path -font]  \
                    -height $h \
                    -bg [_getbg $path] \
                    -fg [_getfg $path] \
                    -selectbackground [Widget::cget $path -selectbackground] \
                    -selectforeground [Widget::cget $path -selectforeground] \
                    -listvariable [Widget::varForOption $path -values]]
        }
        ::bind $listb <ButtonRelease-1> [list ComboBox::_select $path @%x,%y]

        if {[Widget::cget $path -hottrack]} {
            bindtags $listb [concat [bindtags $listb] ListBoxHotTrack]
        }
    }
    pack $sw -fill both -expand yes
    $sw setwidget $listb

    ::bind $listb <Return> "ComboBox::_select [list $path] \[$listb curselection\]"
    ::bind $listb <Escape>   [list ComboBox::_unmapliste $path]
    ::bind $listb <FocusOut> [list ComboBox::_focus_out $path]
}


proc ComboBox::_recreate_popup { path } {
    variable background
    variable foreground

    set shell $path.shell
    set lval  [Widget::cget $path -values]
    set h     [Widget::cget $path -height]
    set bw    [Widget::cget $path -bwlistbox]

    if { $h <= 0 } {
	set len [llength $lval]
	if { $len < 3 } {
	    set h 3
	} elseif { $len > 10 } {
	    set h 10
	} else {
	    set h $len
	}
    }

    if { [string equal [tk windowingsystem] "x11"] } {
	set sbwidth 11
    } else {
	set sbwidth 15
    }

    _create_popup $path

    if {![Widget::cget $path -editable]} {
        if {[info exists background]} {
            $path.e configure -bg $background
            $path.e configure -fg $foreground
            unset background
            unset foreground
        }
    }

    set listb $shell.listb
    destroy $shell.sw
    set sw [ScrolledWindow $shell.sw -managed 1 -size $sbwidth -ipad 0]
    $listb configure \
            -height $h \
            -font   [Widget::cget $path -font] \
            -bg     [_getbg $path] \
            -fg     [_getfg $path]
    if {![Widget::theme]} {
        $listb configure \
                -selectbackground [Widget::cget $path -selectbackground] \
                -selectforeground [Widget::cget $path -selectforeground]
    }
    pack $sw -fill both -expand yes
    $sw setwidget $listb
    raise $listb
}


# ----------------------------------------------------------------------------
#  Command ComboBox::_mapliste
# ----------------------------------------------------------------------------
proc ComboBox::_mapliste { path } {
    set listb $path.shell.listb
    if {[winfo exists $path.shell] &&
        [string equal [wm state $path.shell] "normal"]} {
	_unmapliste $path
        return
    }

    if { [Widget::cget $path -state] == "disabled" } {
        return
    }
    if {[llength [set cmd [Widget::getMegawidgetOption $path -postcommand]]]} {
        uplevel \#0 $cmd
    }
    if { ![llength [Widget::getMegawidgetOption $path -values]] } {
        return
    }

    _recreate_popup $path

    ArrowButton::configure $path.a -relief sunken
    update

    set bw [Widget::cget $path -bwlistbox]

    $listb selection clear 0 end
    set values [Widget::getMegawidgetOption $path -values]
    set curval [Entry::cget $path.e -text]
    if { [set idx [lsearch -exact $values $curval]] != -1 ||
         [set idx [lsearch -exact $values "$curval*"]] != -1 } {
        if {$bw} {
            set idx [$listb items $idx]
        } else {
            $listb activate $idx
        }
        $listb selection set $idx
        $listb see $idx
    } else {
        set idx 0
        if {$bw} {
            set idx [$listb items 0]
        } else {
            $listb activate $idx
        }
	$listb selection set $idx
        $listb see $idx
    }

    set width [Widget::cget $path -listboxwidth]
    if {!$width} { set width [winfo width $path] }
    BWidget::place $path.shell $width 0 below $path
    wm deiconify $path.shell
    raise $path.shell
    BWidget::focus set $listb
    if {! $Widget::_aqua } {
        BWidget::grab global $path
    }
}


# ----------------------------------------------------------------------------
#  Command ComboBox::_unmapliste
# ----------------------------------------------------------------------------
proc ComboBox::_unmapliste { path {refocus 1} } {
    # On aqua, state is zoomed, otherwise normal
    if {[winfo exists $path.shell] && \
      ( [string equal [wm state $path.shell] "normal"] ||
	[string equal [wm state $path.shell] "zoomed"] ) } {
        if {! $Widget::_aqua } {
            BWidget::grab release $path
            BWidget::focus release $path.shell.listb $refocus
            # Update now because otherwise [focus -force...] makes the app hang!
            if {$refocus} {
                update
                focus -force $path.e
            }
        }
        wm withdraw $path.shell
        ArrowButton::configure $path.a -relief raised
    }
}


# ----------------------------------------------------------------------------
#  Command ComboBox::_select
# ----------------------------------------------------------------------------
proc ComboBox::_select { path index } {
    set index [$path.shell.listb index $index]
    _unmapliste $path
    if { $index != -1 } {
        if { [setvalue $path @$index] } {
	    set cmd [Widget::getMegawidgetOption $path -modifycmd]
            if {[llength $cmd]} {
                uplevel \#0 $cmd
            }
        }
    }
    $path.e selection clear
    if {[$path.e cget -exportselection]} {
        $path.e selection range 0 end
    }
}


# ----------------------------------------------------------------------------
#  Command ComboBox::_modify_value
# ----------------------------------------------------------------------------
proc ComboBox::_modify_value { path direction } {
    if {[setvalue $path $direction]
        && [llength [set cmd [Widget::getMegawidgetOption $path -modifycmd]]]} {
	uplevel \#0 $cmd
    }
}

# ----------------------------------------------------------------------------
#  Command ComboBox::_expand
# ----------------------------------------------------------------------------
proc ComboBox::_expand {path} {
    set values [Widget::getMegawidgetOption $path -values]
    if {![llength $values]} {
	bell
	return 0
    }

    set found  {}
    set curval [Entry::cget $path.e -text]
    set curlen [$path.e index insert]
    if {$curlen < [string length $curval]} {
	# we are somewhere in the middle of a string.
	# if the full value matches some string in the listbox,
	# reorder values to start matching after that string.
	set idx [lsearch -exact $values $curval]
	if {$idx >= 0} {
	    set values [concat [lrange $values [expr {$idx+1}] end] \
			    [lrange $values 0 $idx]]
	}
    }
    if {$curlen == 0} {
	set found $values
    } else {
	foreach val $values {
	    if {[string equal -length $curlen $curval $val]} {
		lappend found $val
	    }
	}
    }
    if {[llength $found]} {
	Entry::configure $path.e -text [lindex $found 0]
	if {[llength $found] > 1} {
	    set best [_best_match $found [string range $curval 0 $curlen]]
	    set blen [string length $best]
	    $path.e icursor $blen
	    $path.e selection range $blen end
	}
    } else {
	bell
    }
    return [llength $found]
}

# best_match --
#   finds the best unique match in a list of names
#   The extra $e in this argument allows us to limit the innermost loop a
#   little further.
# Arguments:
#   l		list to find best unique match in
#   e		currently best known unique match
# Returns:
#   longest unique match in the list
#
proc ComboBox::_best_match {l {e {}}} {
    set ec [lindex $l 0]
    if {[llength $l]>1} {
	set e  [string length $e]; incr e -1
	set ei [string length $ec]; incr ei -1
	foreach l $l {
	    while {$ei>=$e && [string first $ec $l]} {
		set ec [string range $ec 0 [incr ei -1]]
	    }
	}
    }
    return $ec
}
# possibly faster
#proc match {string1 string2} {
#   set i 1
#   while {[string equal -length $i $string1 $string2]} { incr i }
#   return [string range $string1 0 [expr {$i-2}]]
#}
#proc matchlist {list} {
#   set list [lsort $list]
#   return [match [lindex $list 0] [lindex $list end]]
#}


# ----------------------------------------------------------------------------
#  Command ComboBox::_traverse_in
#  Called when widget receives keyboard focus due to keyboard traversal.
# ----------------------------------------------------------------------------
proc ComboBox::_traverse_in { path } {
    if {[$path.e selection present] != 1} {
	# Autohighlight the selection, but not if one existed
	$path.e selection range 0 end
    }
}


# ----------------------------------------------------------------------------
#  Command ComboBox::_focus_out
# ----------------------------------------------------------------------------
proc ComboBox::_focus_out { path } {
    if {[string first $path [focus]] != 0} {
	# we lost focus to some other app or window, so remove the listbox
	return [_unmapliste $path 0]
    }
}

proc ComboBox::_auto_complete { path key } {
    ## Any key string with more than one character and is not entirely
    ## lower-case is considered a function key and is thus ignored.
    if {[string length $key] > 1 && [string tolower $key] != $key} { return }

    set text [string map [list {[} {\[} {]} {\]}] [$path.e get]]
    if {[string equal $text ""]} { return }
    set values [Widget::cget $path -values]
    set x [lsearch $values $text*]
    if {$x < 0} { return }

    set idx [$path.e index insert]
    $path.e configure -text [lindex $values $x]
    $path.e icursor $idx
    $path.e select range insert end
}

proc ComboBox::_auto_post { path key } {
    if {[string equal $key "Escape"] || [string equal $key "Return"]} {
        _unmapliste $path
        return
    }
    if {[catch {$path.shell.listb curselection} x] || $x == ""} {
        if {[string equal $key "Up"]} {
            _unmapliste $path
            return
        }
        set x -1
    }
    if {([string length $key] > 1 && [string tolower $key] != $key) && \
            [string equal $key "BackSpace"] != 0 && \
            [string equal $key "Up"] != 0 && \
            [string equal $key "Down"] != 0} {
        return
    }

    # post the listbox
    _create_popup $path
    set width [Widget::cget $path -listboxwidth]
    if {!$width} { set width [winfo width $path] }
    BWidget::place $path.shell $width 0 below $path
    wm deiconify $path.shell
    BWidget::grab release $path
    BWidget::focus release $path.shell.listb 1
    focus -force $path.e

    set values [Widget::cget $path -values]
    switch -- $key {
        Up {
            if {[incr x -1] < 0} {
                set x 0
            } else {
                Entry::configure $path.e -text [lindex $values $x]
            }
        }
        Down {
            if {[incr x] >= [llength $values]} {
                set x [expr {[llength $values] - 1}]
            } else {
                Entry::configure $path.e -text [lindex $values $x]
            }
        }
        default {
            # auto-select within the listbox the item closest to the entry's value
            set text [string map [list {[} {\[} {]} {\]}] [$path.e get]]
            if {[string equal $text ""]} {
                set x 0
            } else {
                set x [lsearch $values $text*]
            }
        }
    }

    if {$x >= 0} {
        $path.shell.listb selection clear 0 end
        $path.shell.listb selection set $x
        $path.shell.listb see $x
    }
}
# ------------------------------------------------------------------------------
#  Command ComboBox::_destroy
# ------------------------------------------------------------------------------
proc ComboBox::_destroy { path } {
    variable _index
    Widget::destroy $path
    unset _index($path)
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/demo/basic.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199

namespace eval DemoBasic {
    variable var
    variable count 0
    variable id    ""
}


proc DemoBasic::create { nb } {
    set frame [$nb insert end demoBasic -text "Basic"]

    set topf  [frame $frame.topf]
    set titf1 [TitleFrame $topf.titf1 -text "Label"]
    set titf2 [TitleFrame $topf.titf2 -text "Entry"]
    set titf3 [TitleFrame $frame.titf3 -text "Button and ArrowButton"]

    _label  [$titf1 getframe]
    _entry  [$titf2 getframe]
    _button [$titf3 getframe]

    pack $titf1 $titf2 -side left -fill both -padx 4 -expand yes
    pack $topf -pady 2 -fill x
    pack $titf3 -pady 2 -padx 4 -fill x

    return $frame
}


proc DemoBasic::_label { parent } {
    variable var

    set lab [Label $parent.label -text "This is a Label widget" \
                 -helptext "Label widget"]
    set chk [checkbutton $parent.chk -text "Disabled" \
                 -variable DemoBasic::var($lab,-state) \
                 -onvalue  disabled -offvalue normal \
                 -command  "$lab configure -state \$DemoBasic::var($lab,-state)"]
    pack $lab -anchor w -pady 4
    pack $chk -anchor w
}


proc DemoBasic::_entry { parent } {
    set ent  [Entry $parent.entry -text "Press enter" \
                  -command  {set DemoBasic::var(entcmd) "-command called" ; after 500 {set DemoBasic::var(entcmd) ""}} \
                   -helptext "Entry widget"]
    set chk1 [checkbutton $parent.chk1 -text "Disabled" \
                  -variable DemoBasic::var($ent,state) \
                  -onvalue  disabled -offvalue normal \
                  -command  "$ent configure -state \$DemoBasic::var($ent,state)"]
    set chk2 [checkbutton $parent.chk2 -text "Non editable" \
                  -variable DemoBasic::var($ent,editable) \
                  -onvalue  false -offvalue true \
                  -command  "$ent configure -editable \$DemoBasic::var($ent,editable)"]
    set lab  [label $parent.cmd -textvariable DemoBasic::var(entcmd) -foreground red]
    pack $ent -pady 4 -anchor w
    pack $chk1 $chk2 -anchor w
    pack $lab -pady 4
}


proc DemoBasic::_button { parent } {
    variable var

    set frame [frame $parent.butfr]
    set but   [Button $frame.but -text "Press me!" \
                   -repeatdelay 300 \
                   -command  "DemoBasic::_butcmd command" \
                   -helptext "This is a Button widget"]
    set sep1  [Separator $frame.sep1 -orient vertical]
    set arr1  [ArrowButton $frame.arr1 -type button \
                   -width 25 -height 25 \
                   -repeatdelay 300 \
                   -command  "DemoBasic::_butcmd command" \
                   -helptext "This is an ArrowButton widget\nof type button"]
    set sep2  [Separator $frame.sep2 -orient vertical]
    set arr2  [ArrowButton $frame.arr2 -type arrow \
                   -width 25 -height 25 -relief sunken -ipadx 0 -ipady 0 \
                   -repeatdelay 300 \
                   -command  "DemoBasic::_butcmd command" \
                   -helptext "This is an ArrowButton widget\nof type arrow"]

    pack $but  -side left -padx 4
    pack $sep1 -side left -padx 4 -fill y
    pack $arr1 -side left -padx 4
    pack $sep2 -side left -padx 4 -fill y
    pack $arr2 -side left -padx 4
    pack $frame

    set sep3  [Separator $parent.sep3 -orient horizontal]
    pack $sep3 -fill x -pady 10

    set labf1 [LabelFrame $parent.labf1 -text "Command" -side top \
                   -anchor w -relief sunken -borderwidth 1]
    set subf  [$labf1 getframe]
    set chk1  [checkbutton $subf.chk1 -text "Disabled" \
                   -variable DemoBasic::var(bstate) -onvalue disabled -offvalue normal \
                   -command  "DemoBasic::_bstate \$DemoBasic::var(bstate) $but $arr1 $arr2"]
    set chk2  [checkbutton $subf.chk2 -text "Use -armcommand/\n-disarmcommand" \
                   -justify left \
                   -variable DemoBasic::var(barmcmd) \
                   -command  "DemoBasic::_barmcmd \$DemoBasic::var(barmcmd) $but $arr1 $arr2"]
    pack $chk1 $chk2 -anchor w

    set label [label $parent.label -textvariable DemoBasic::var(butcmd) -foreground red]
    pack $label -side bottom -pady 4

    set labf2 [LabelFrame $parent.labf2 -text "Direction" -side top \
                   -anchor w -relief sunken -borderwidth 1]
    set subf  [$labf2 getframe]
    set var(bside) top
    foreach dir {top left bottom right} {
        set rad [radiobutton $subf.$dir -text "$dir arrow" \
                     -variable DemoBasic::var(bside) -value $dir \
                     -command  "DemoBasic::_bside \$DemoBasic::var(bside) $arr1 $arr2"]
        pack $rad -anchor w
    }

    set labf3 [LabelFrame $parent.labf3 -text "Relief" -side top \
                   -anchor w -relief sunken -borderwidth 1]
    set subf  [$labf3 getframe]
    set var(brelief) raised
    foreach {f lrelief} {f1 {raised sunken ridge groove} f2 {flat solid link}} {
        set f [frame $subf.$f]
        foreach relief $lrelief {
            set rad [radiobutton $f.$relief -text $relief \
                         -variable DemoBasic::var(brelief) -value $relief \
                         -command  "DemoBasic::_brelief \$DemoBasic::var(brelief) $but $arr1 $arr2"]
            pack $rad -anchor w
        }
        pack $f -side left -padx 2 -anchor n
    }
    pack $labf1 $labf2 $labf3 -side left -fill y -padx 4
}


proc DemoBasic::_bstate { state but arr1 arr2 } {
    foreach but [list $but $arr1 $arr2] {
        $but configure -state $state
    }
}


proc DemoBasic::_brelief { relief but arr1 arr2 } {
    $but configure -relief $relief
    if { $relief != "link" } {
        foreach arr [list $arr1 $arr2] {
            $arr configure -relief $relief
        }
    }
}


proc DemoBasic::_bside { side args } {
    foreach arr $args {
        $arr configure -dir $side
    }
}


proc DemoBasic::_barmcmd { value but arr1 arr2 } {
    if { $value } {
        $but configure \
            -armcommand    "DemoBasic::_butcmd arm" \
            -disarmcommand "DemoBasic::_butcmd disarm" \
            -command {}
        foreach arr [list $arr1 $arr2] {
            $arr configure \
                -armcommand    "DemoBasic::_butcmd arm" \
                -disarmcommand "DemoBasic::_butcmd disarm" \
                -command {}
        }
    } else {
        $but configure -armcommand {} -disarmcommand {} \
            -command  "DemoBasic::_butcmd command"
        foreach arr [list $arr1 $arr2] {
            $arr configure -armcommand {} -disarmcommand {} \
                -command "DemoBasic::_butcmd command"
        }
    }
}


proc DemoBasic::_butcmd { reason } {
    variable count
    variable id

    catch {after cancel $id}
    if { $reason == "arm" } {
        incr count
        set DemoBasic::var(butcmd) "$reason command called ($count)"
    } else {
        set count 0
        set DemoBasic::var(butcmd) "$reason command called"
    }
    set id [after 500 {set DemoBasic::var(butcmd) ""}]
}


<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<














































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/demo/bwidget.xbm.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#define bwidget_width 76
#define bwidget_height 64
static char bwidget_bits[] = {
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xf0,0x00,0xb6,0x6d,0xdb,0x16,0x00,0x00,0x00,0x00,0xf0,
 0x00,0xdb,0xb6,0x6d,0xab,0x00,0x00,0x00,0x00,0xf0,0x00,0x55,0x55,0x55,0x75,
 0x01,0x00,0x00,0x00,0xf0,0x00,0x6d,0xdb,0xb6,0xad,0x02,0x00,0x00,0x00,0xf0,
 0x00,0xb6,0x6d,0xdb,0xb6,0x05,0x00,0x00,0x00,0xf0,0x00,0x55,0x55,0x55,0x55,
 0x05,0x00,0x00,0x00,0xf0,0x00,0xda,0xb6,0xad,0x6d,0x0b,0x00,0x00,0x00,0xf0,
 0x00,0x6b,0x03,0xc0,0xb6,0x05,0x00,0x00,0x00,0xf0,0x00,0x56,0x05,0x00,0x55,
 0x0d,0x00,0x00,0x00,0xf0,0x00,0xbb,0x05,0x80,0xdb,0x06,0x00,0x00,0x00,0xf0,
 0x00,0xca,0x06,0x00,0x6c,0x0b,0x00,0x00,0x00,0xf0,0x00,0xb6,0x02,0x00,0xaa,
 0x0a,0x00,0x00,0x00,0xf0,0x00,0xab,0x05,0x00,0x6c,0x0b,0x00,0x00,0x00,0xf0,
 0x00,0xdd,0x06,0x00,0xb6,0x05,0x00,0x00,0x00,0xf0,0x00,0xaa,0x02,0x00,0x55,
 0x05,0x00,0x00,0x00,0xf0,0x00,0xb7,0x05,0xc0,0xda,0x02,0x00,0x00,0x00,0xf0,
 0x00,0xd9,0x06,0x50,0x6b,0x01,0x00,0x00,0x00,0xf0,0x00,0x56,0xb5,0xad,0xad,
 0x00,0x00,0x00,0x00,0xf0,0x00,0xdb,0xd6,0x76,0x15,0x00,0x00,0x00,0x00,0xf0,
 0x00,0x6a,0xab,0xaa,0x2d,0x00,0x00,0x00,0x00,0xf0,0x00,0x56,0x75,0xad,0xb6,
 0x02,0x00,0x00,0x00,0xf0,0x00,0xbb,0xad,0xd6,0xaa,0x05,0x00,0x00,0x00,0xf0,
 0x00,0xca,0xb6,0x6b,0xdb,0x2a,0x00,0x00,0x00,0xf0,0x00,0x77,0xd5,0x5c,0x6d,
 0x2d,0x00,0x00,0x00,0xf0,0x00,0x99,0x05,0x00,0xaa,0x56,0x00,0x00,0x00,0xf0,
 0x00,0xee,0x06,0x00,0x6c,0xbb,0x00,0x00,0x00,0xf0,0x00,0xaa,0x02,0x00,0xb0,
 0x55,0x00,0x00,0x00,0xf0,0x00,0x55,0x05,0x00,0xa8,0xd6,0x00,0x00,0x00,0xf0,
 0x00,0xee,0x06,0x00,0xd0,0x6a,0x00,0x00,0x00,0xf0,0x00,0x55,0x03,0x00,0x68,
 0xb7,0xfc,0x00,0x7e,0xf0,0x00,0x6d,0x05,0x00,0xa8,0xaa,0xfc,0x80,0x7e,0xf0,
 0x00,0xb6,0x05,0x00,0x50,0xbb,0xfe,0x01,0x7e,0xf0,0x00,0x55,0x05,0x00,0x78,
 0xad,0xfe,0x81,0x1f,0xf0,0x00,0xb6,0x05,0x00,0xa4,0xb5,0xfe,0x81,0x1f,0xf0,
 0x00,0x5b,0x05,0x80,0xba,0x56,0xfe,0x83,0x1f,0xf0,0x00,0xaa,0x6b,0x5b,0xd5,
 0x5a,0xff,0x85,0x1f,0xf0,0x00,0xdb,0x5a,0xad,0x57,0x2b,0xff,0xc7,0x0f,0xf0,
 0x00,0x6d,0xad,0xd5,0x6a,0x0d,0xff,0xc7,0x0f,0xf0,0x00,0xaa,0xd6,0xb6,0xba,
 0x05,0xdf,0xc7,0x0f,0xf0,0x00,0xb7,0xb5,0x5a,0xab,0x8a,0xdf,0xcf,0x0f,0xf0,
 0x00,0xd9,0x5a,0xab,0x6d,0x8f,0xcf,0xef,0x07,0xf0,0x00,0x56,0xad,0x75,0xb5,
 0xaf,0x8f,0xef,0x07,0xf0,0x00,0xb5,0xeb,0x5a,0x00,0x9f,0xcf,0xef,0x07,0xf0,
 0x00,0x00,0x00,0x00,0x00,0xff,0x8f,0xff,0x07,0xf0,0x00,0x00,0x00,0x00,0x00,
 0xfe,0x87,0xff,0x03,0xf0,0x00,0x00,0x00,0x00,0x00,0xff,0x03,0xff,0x03,0xf0,
 0x00,0x00,0x00,0x00,0x00,0xfe,0x03,0xff,0x03,0xf0,0x00,0x00,0x00,0x00,0x00,
 0xfe,0x03,0xff,0x01,0xf0,0x00,0x00,0x00,0x00,0x00,0xfc,0x01,0xff,0x03,0xf0,
 0x00,0x00,0x00,0x00,0x00,0xfe,0x01,0xfe,0x01,0xf0,0x00,0x00,0x00,0x00,0x00,
 0xfc,0x01,0xfe,0x01,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0};
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




























































































Deleted scriptlibs/bwidget-1.9.8/demo/demo.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
#!/bin/sh
# The next line is executed by /bin/sh, but not tcl \
exec wish "$0" ${1+"$@"}

namespace eval Demo {
    variable _wfont

    variable notebook
    variable mainframe
    variable status
    variable prgtext
    variable prgindic
    variable font
    variable font_name
    variable toolbar1  1
    variable toolbar2  1

    set pwd [pwd]
    cd [file dirname [info script]]
    variable DEMODIR [pwd]
    cd $pwd

    foreach script {
	manager.tcl basic.tcl select.tcl dnd.tcl tree.tcl tmpldlg.tcl
    } {
	namespace inscope :: source $DEMODIR/$script
    }
}


proc Demo::create { } {
    global   tk_patchLevel
    variable _wfont
    variable notebook
    variable mainframe
    variable font
    variable prgtext
    variable prgindic

    set prgtext "Please wait while loading font..."
    set prgindic -1
    _create_intro
    update
    SelectFont::loadfont

    bind all <F12> { catch {console show} }

    # Menu description
    set descmenu {
        "&File" all file 0 {
            {command "E&xit" {} "Exit BWidget demo" {} -command exit}
        }
        "&Options" all options 0 {
            {checkbutton "Toolbar &1" {all option} "Show/hide toolbar 1" {}
                -variable Demo::toolbar1
                -command  {$Demo::mainframe showtoolbar 0 $Demo::toolbar1}
            }
            {checkbutton "Toolbar &2" {all option} "Show/hide toolbar 2" {}
                -variable Demo::toolbar2
                -command  {$Demo::mainframe showtoolbar 1 $Demo::toolbar2}
            }
        }
    }

    set prgtext   "Creating MainFrame..."
    set prgindic  0
    set mainframe [MainFrame .mainframe \
                       -menu         $descmenu \
                       -textvariable Demo::status \
                       -progressvar  Demo::prgindic]

    # toolbar 1 creation
    incr prgindic
    set tb1  [$mainframe addtoolbar]
    set bbox [ButtonBox $tb1.bbox1 -spacing 0 -padx 1 -pady 1]
    $bbox add -image [Bitmap::get new] \
        -highlightthickness 0 -takefocus 0 -relief link -borderwidth 1 -padx 1 -pady 1 \
        -helptext "Create a new file"
    $bbox add -image [Bitmap::get open] \
        -highlightthickness 0 -takefocus 0 -relief link -borderwidth 1 -padx 1 -pady 1 \
        -helptext "Open an existing file"
    $bbox add -image [Bitmap::get save] \
        -highlightthickness 0 -takefocus 0 -relief link -borderwidth 1 -padx 1 -pady 1 \
        -helptext "Save file"
    pack $bbox -side left -anchor w

    set sep [Separator $tb1.sep -orient vertical]
    pack $sep -side left -fill y -padx 4 -anchor w

    incr prgindic
    set bbox [ButtonBox $tb1.bbox2 -spacing 0 -padx 1 -pady 1]
    $bbox add -image [Bitmap::get cut] \
        -highlightthickness 0 -takefocus 0 -relief link -borderwidth 1 -padx 1 -pady 1 \
        -helptext "Cut selection"
    $bbox add -image [Bitmap::get copy] \
        -highlightthickness 0 -takefocus 0 -relief link -borderwidth 1 -padx 1 -pady 1 \
        -helptext "Copy selection"
    $bbox add -image [Bitmap::get paste] \
        -highlightthickness 0 -takefocus 0 -relief link -borderwidth 1 -padx 1 -pady 1 \
        -helptext "Paste selection"
    pack $bbox -side left -anchor w

   # toolbar 2 creation
    incr prgindic
    set tb2    [$mainframe addtoolbar]
    set _wfont [SelectFont $tb2.font -type toolbar \
                    -command "Demo::update_font \[$tb2.font cget -font\]"]
    set font   [$_wfont cget -font]
    pack $_wfont -side left -anchor w

    $mainframe addindicator -text "BWidget [package version BWidget]"
    $mainframe addindicator -textvariable tk_patchLevel

    # NoteBook creation
    set frame    [$mainframe getframe]
    set notebook [NoteBook $frame.nb]

    set prgtext   "Creating Manager..."
    incr prgindic
    set f0  [DemoManager::create $notebook]
    set prgtext   "Creating Basic..."
    incr prgindic
    set f1  [DemoBasic::create $notebook]
    set prgtext   "Creating Select..."
    incr prgindic
    set f2 [DemoSelect::create $notebook]
    set prgtext   "Creating Dialog..."
    incr prgindic
    set f3b [DemoDlg::create $notebook]
    set prgtext   "Creating Drag and Drop..."
    incr prgindic
    set f4 [DemoDnd::create $notebook]
    set prgtext   "Creating Tree..."
    incr prgindic
    set f5 [DemoTree::create $notebook]

    set prgtext   "Done"
    incr prgindic
    $notebook compute_size
    pack $notebook -fill both -expand yes -padx 4 -pady 4
    $notebook raise [$notebook page 0]

    pack $mainframe -fill both -expand yes
    update idletasks
    destroy .intro
}


proc Demo::update_font { newfont } {
    variable _wfont
    variable notebook
    variable font
    variable font_name

    . configure -cursor watch
    if { $font != $newfont } {
        $_wfont configure -font $newfont
        $notebook configure -font $newfont
        set font $newfont
    }
    . configure -cursor ""
}


proc Demo::_create_intro { } {
    variable DEMODIR

    set top [toplevel .intro -relief raised -borderwidth 2]

    wm withdraw $top
    wm overrideredirect $top 1

    set ximg  [label $top.x -bitmap @$DEMODIR/x1.xbm \
	    -foreground grey90 -background white]
    set bwimg [label $ximg.bw -bitmap @$DEMODIR/bwidget.xbm \
	    -foreground grey90 -background white]
    set frame [frame $ximg.f -background white]
    set lab1  [label $frame.lab1 -text "Loading demo" \
	    -background white -font {times 8}]
    set lab2  [label $frame.lab2 -textvariable Demo::prgtext \
	    -background white -font {times 8} -width 35]
    set prg   [ProgressBar $frame.prg -width 50 -height 10 -background white \
	    -variable Demo::prgindic -maximum 10]
    pack $lab1 $lab2 $prg
    place $frame -x 0 -y 0 -anchor nw
    place $bwimg -relx 1 -rely 1 -anchor se
    pack $ximg
    BWidget::place $top 0 0 center
    wm deiconify $top
}


proc Demo::main {} {
    variable DEMODIR

    lappend ::auto_path [file dirname $DEMODIR]
    package require BWidget

    option add *TitleFrame.l.font {helvetica 11 bold italic}

    wm withdraw .
    wm title . "BWidget demo"

    Demo::create
    BWidget::place . 0 0 center
    wm deiconify .
    raise .
    focus -force .
}

Demo::main
wm geom . [wm geom .]
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<








































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/demo/dnd.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

namespace eval DemoDnd {
}


proc DemoDnd::create { nb } {

    set frame [$nb insert end demoDnd -text "Drag and Drop"]

    set titf1 [TitleFrame $frame.titf1 -text "Drag sources"]
    set subf  [$titf1 getframe]

    set ent1  [LabelEntry $subf.e1 -label "Entry" -labelwidth 14 -dragenabled 1 -dragevent 3]
    set labf1 [LabelFrame $subf.f1 -text "Label (text)" -width 14]
    set f     [$labf1 getframe]
    set lab   [Label $f.l -text "Drag this text" -dragenabled 1 -dragevent 3]
    pack $lab

    set labf2 [LabelFrame $subf.f2 -text "Label (bitmap)" -width 14]
    set f     [$labf2 getframe]
    set lab   [Label $f.l -bitmap info -dragenabled 1 -dragevent 3]
    pack $lab

    pack $ent1 $labf1 $labf2 -side top -fill x -pady 4

    set titf2 [TitleFrame $frame.titf2 -text "Drop targets"]
    set subf  [$titf2 getframe]

    set ent1  [LabelEntry $subf.e1 -label "Entry" -labelwidth 14 -dropenabled 1]
    set labf1 [LabelFrame $subf.f1 -text "Label" -width 14]
    set f     [$labf1 getframe]
    set lab   [Label $f.l -dropenabled 1 -highlightthickness 1]
    pack $lab -fill x

    pack $ent1 $labf1 -side top -fill x -pady 4

    pack $titf1 $titf2 -pady 4

    return $frame
}


<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




















































































Deleted scriptlibs/bwidget-1.9.8/demo/manager.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141


namespace eval DemoManager {
    variable _progress 0
    variable _afterid  ""
    variable _status "Compute in progress..."
    variable _homogeneous 0
}


proc DemoManager::create { nb } {
    set frame [$nb insert end demoManager -text "Manager"]

    set topf  [frame $frame.topf]
    set titf1 [TitleFrame $topf.titf1 -text "MainFrame"]
    set titf2 [TitleFrame $topf.titf2 -text "NoteBook"]
    set titf3 [TitleFrame $frame.titf3 -text "Paned & ScrolledWindow"]

    _mainframe [$titf1 getframe]
    _notebook  [$titf2 getframe]
    _paned     [$titf3 getframe]

    pack $titf1 $titf2 -padx 4 -side left -fill both -expand yes
    pack $topf -fill x -pady 2
    pack $titf3 -pady 2 -padx 4 -fill both -expand yes

    return $frame
}


proc DemoManager::_mainframe { parent } {
    set labf1 [LabelFrame $parent.labf1 -text "Toolbar" -side top -anchor w \
                   -relief sunken -borderwidth 2]
    set subf  [$labf1 getframe]
    checkbutton $subf.chk1 -text "View toolbar 1" -variable Demo::toolbar1 \
        -command {$Demo::mainframe showtoolbar 0 $Demo::toolbar1}
    checkbutton $subf.chk2 -text "View toolbar 2" -variable Demo::toolbar2 \
        -command {$Demo::mainframe showtoolbar 1 $Demo::toolbar2}
    pack $subf.chk1 $subf.chk2 -anchor w -fill x
    pack $labf1 -fill both

    set labf2 [LabelFrame $parent.labf2 -text "Status bar" -side top -anchor w \
                   -relief sunken -borderwidth 2]
    set subf  [$labf2 getframe]
    checkbutton $subf.chk1 -text "Show Progress\nindicator" -justify left \
        -variable DemoManager::_progress \
        -command  {DemoManager::_show_progress}
    pack $subf.chk1 -anchor w -fill x

    pack $labf1 $labf2 -side left -padx 4 -fill both
}


proc DemoManager::_notebook { parent } {
    checkbutton $parent.chk1 -text "Homogeneous label" \
        -variable DemoManager::_homogeneous \
        -command  {$Demo::notebook configure -homogeneous $DemoManager::_homogeneous}
    pack $parent.chk1 -side left -anchor n -fill x
}



proc DemoManager::_paned { parent } {
    set pw1   [PanedWindow $parent.pw -side top]
    set pane  [$pw1 add -minsize 100]

    set pw2    [PanedWindow $pane.pw -side left]
    set pane1  [$pw2 add -minsize 100]
    set pane2  [$pw2 add -minsize 100]
    set pane3  [$pw1 add -minsize 100]

    foreach pane [list $pane1 $pane2] {
        set sw    [ScrolledWindow $pane.sw]
        set lb    [listbox $sw.lb -height 8 -width 20 -highlightthickness 0]
        for {set i 1} {$i <= 8} {incr i} {
            $lb insert end "Value $i"
        }
        $sw setwidget $lb
        pack $sw -fill both -expand yes
    }

    set sw [ScrolledWindow $pane3.sw -relief sunken -borderwidth 2]
    set sf [ScrollableFrame $sw.f]
    $sw setwidget $sf
    set subf [$sf getframe]
    set lab [label $subf.lab -text "This is a ScrollableFrame"]
    set chk [checkbutton $subf.chk -text "Constrained width" \
                 -variable DemoManager::_constw \
                 -command  "$sf configure -constrainedwidth \$DemoManager::_constw"]
    pack $lab
    pack $chk -anchor w
    bind $chk <FocusIn> "$sf see $chk"
    for {set i 0} {$i <= 20} {incr i} {
        pack [entry $subf.ent$i -width 50]  -fill x -pady 4
	bind $subf.ent$i <FocusIn> "$sf see $subf.ent$i"
        $subf.ent$i insert end "Text field $i"
    }

    pack $sw $pw2 $pw1 -fill both -expand yes
}


proc DemoManager::_show_progress { } {
    variable _progress
    variable _afterid
    variable _status

    if { $_progress } {
        set Demo::status   "Compute in progress..."
        set Demo::prgindic 0
        $Demo::mainframe showstatusbar progression
        if { $_afterid == "" } {
            set _afterid [after 30 DemoManager::_update_progress]
        }
    } else {
        set Demo::status ""
        $Demo::mainframe showstatusbar status
        set _afterid ""
    }
}


proc DemoManager::_update_progress { } {
    variable _progress
    variable _afterid

    if { $_progress } {
        if { $Demo::prgindic < 100 } {
            incr Demo::prgindic 5
            set _afterid [after 30 DemoManager::_update_progress]
        } else {
            set _progress 0
            $Demo::mainframe showstatusbar status
            set Demo::status "Done"
            set _afterid ""
            after 500 {set Demo::status ""}
        }
    } else {
        set _afterid ""
    }
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


























































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/demo/select.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
namespace eval DemoSelect {
    variable var
}


proc DemoSelect::create { nb } {
    set frame [$nb insert end demoSelect -text "Spin & Combo"]

    set titf1 [TitleFrame $frame.titf1 -text SpinBox]
    set subf  [$titf1 getframe]
    set spin  [SpinBox $subf.spin \
                   -range {1 100 1} -textvariable DemoSelect::var(spin,var) \
                   -helptext "This is the SpinBox"]
    set ent   [LabelEntry $subf.ent -label "Linked var" -labelwidth 10 -labelanchor w \
                   -textvariable DemoSelect::var(spin,var) -editable 0 \
                   -helptext "This is an Entry reflecting\nthe linked var of SpinBox"]
    set labf  [LabelFrame $subf.options -text "Options" -side top -anchor w \
                   -relief sunken -borderwidth 1 \
                   -helptext "Modify some options of SpinBox"]
    set subf  [$labf getframe]
    set chk1  [checkbutton $subf.chk1 -text "Non editable" \
                   -variable DemoSelect::var(spin,editable) -onvalue false -offvalue true \
                   -command "$spin configure -editable \$DemoSelect::var(spin,editable)"]
    set chk2  [checkbutton $subf.chk2 -text "Disabled" \
                   -variable DemoSelect::var(spin,state) -onvalue disabled -offvalue normal \
                   -command "$spin configure -state \$DemoSelect::var(spin,state)"]

    pack $chk1 $chk2 -side left -anchor w
    pack $spin $ent $labf -pady 4 -fill x
    pack $titf1

    set titf2 [TitleFrame $frame.titf2 -text ComboBox]
    set subf  [$titf2 getframe]
    set combo [ComboBox $subf.combo \
                   -textvariable DemoSelect::var(combo,var) \
                   -values {"first value" "second value" "third value" "fourth value" "fifth value"} \
                   -helptext "This is the ComboBox"]
    set ent   [LabelEntry $subf.ent -label "Linked var" -labelwidth 10 -labelanchor w \
                   -textvariable DemoSelect::var(combo,var) -editable 0 \
                   -helptext "This is an Entry reflecting\nthe linked var of ComboBox"]
    set labf  [LabelFrame $subf.options -text "Options" -side top -anchor w \
                   -relief sunken -borderwidth 1 \
                   -helptext "Modify some options of SpinBox"]
    set subf  [$labf getframe]
    set chk1  [checkbutton $subf.chk1 -text "Non editable" \
                   -variable DemoSelect::var(combo,editable) -onvalue false -offvalue true \
                   -command  "$combo configure -editable \$DemoSelect::var(combo,editable)"]
    set chk2  [checkbutton $subf.chk2 -text "Disabled" \
                   -variable DemoSelect::var(combo,state) -onvalue disabled -offvalue normal \
                   -command  "$combo configure -state \$DemoSelect::var(combo,state)"]

    pack $chk1 $chk2 -side left -anchor w
    pack $combo $ent $labf -pady 4 -fill x

    pack $titf1 $titf2 -pady 4

    return $frame
}

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






















































































































Deleted scriptlibs/bwidget-1.9.8/demo/tmpldlg.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214

namespace eval DemoDlg {
    variable tmpl
    variable msg
    variable progmsg
    variable progval
    variable resources "en"
}


proc DemoDlg::create { nb } {
    set frame [$nb insert end demoDlg -text "Dialog"]

    set titf1 [TitleFrame $frame.titf1 -text "Resources"]
    set titf2 [TitleFrame $frame.titf2 -text "Template Dialog"]
    set titf3 [TitleFrame $frame.titf3 -text "Message Dialog"]
    set titf4 [TitleFrame $frame.titf4 -text "Other dialog"]

    set subf [$titf1 getframe]
    set cmd  {option read [file join $::BWIDGET::LIBRARY "lang" $DemoDlg::resources.rc]}
    set rad1 [radiobutton $subf.rad1 -text "English" \
                  -variable DemoDlg::resources -value en \
                  -command  $cmd]
    set rad2 [radiobutton $subf.rad2 -text "French" \
                  -variable DemoDlg::resources -value fr \
                  -command  $cmd]
    set rad3 [radiobutton $subf.rad3 -text "German" \
                  -variable DemoDlg::resources -value de \
                  -command  $cmd]
    pack $rad1 $rad2 $rad3 -side left

    _tmpldlg [$titf2 getframe]
    _msgdlg  [$titf3 getframe]
    _stddlg  [$titf4 getframe]

    pack $titf1 -fill x -pady 2 -padx 2
    pack $titf4 -side bottom -fill x -pady 2 -padx 2
    pack $titf2 $titf3 -side left -padx 2 -fill both -expand yes
}


proc DemoDlg::_tmpldlg { parent } {
    variable tmpl

    set tmpl(side)   bottom
    set tmpl(anchor) c

    set labf1 [LabelFrame $parent.labf1 -text "Button side" -side top \
                   -anchor w -relief sunken -borderwidth 1]
    set subf  [$labf1 getframe]
    radiobutton $subf.rad1 -text "Bottom" \
        -variable DemoDlg::tmpl(side) -value bottom -anchor w
    radiobutton $subf.rad2 -text "Left" \
        -variable DemoDlg::tmpl(side) -value left   -anchor w
    radiobutton $subf.rad3 -text "Right" \
        -variable DemoDlg::tmpl(side) -value right  -anchor w
    radiobutton $subf.rad4 -text "Top" \
        -variable DemoDlg::tmpl(side) -value top    -anchor w

    pack $subf.rad1 $subf.rad2 $subf.rad3 $subf.rad4 -fill x -anchor w

    set labf2 [LabelFrame $parent.labf2 -text "Button anchor" -side top \
                   -anchor w -relief sunken -borderwidth 1]
    set subf  [$labf2 getframe]
    radiobutton $subf.rad1 -text "North" \
        -variable DemoDlg::tmpl(anchor) -value n -anchor w
    radiobutton $subf.rad2 -text "West" \
        -variable DemoDlg::tmpl(anchor) -value w -anchor w
    radiobutton $subf.rad3 -text "East" \
        -variable DemoDlg::tmpl(anchor) -value e -anchor w
    radiobutton $subf.rad4 -text "South" \
        -variable DemoDlg::tmpl(anchor) -value s -anchor w
    radiobutton $subf.rad5 -text "Center" \
        -variable DemoDlg::tmpl(anchor) -value c -anchor w

    pack $subf.rad1 $subf.rad2 $subf.rad3 $subf.rad4 $subf.rad5 -fill x -anchor w

    set sep    [Separator  $parent.sep -orient horizontal]
    set button [button $parent.but -text "Show" -command DemoDlg::_show_tmpldlg]

    pack $button -side bottom
    pack $sep -side bottom -fill x -pady 10
    pack $labf1 $labf2 -side left -padx 4 -anchor n
}


proc DemoDlg::_msgdlg { parent } {
    variable msg

    set msg(type) ok
    set msg(icon) info

    set labf1 [LabelFrame $parent.labf1 -text "Type" -side top \
                   -anchor w -relief sunken -borderwidth 1]
    set subf  [$labf1 getframe]
    radiobutton $subf.rad1 -text "Ok" -variable DemoDlg::msg(type) -value ok -anchor w
    radiobutton $subf.rad2 -text "Ok, Cancel" -variable DemoDlg::msg(type) -value okcancel -anchor w
    radiobutton $subf.rad3 -text "Retry, Cancel" -variable DemoDlg::msg(type) -value retrycancel -anchor w
    radiobutton $subf.rad4 -text "Yes, No" -variable DemoDlg::msg(type) -value yesno -anchor w
    radiobutton $subf.rad5 -text "Yes, No, Cancel" -variable DemoDlg::msg(type) -value yesnocancel -anchor w
    radiobutton $subf.rad6 -text "Abort, Retry, Ignore" -variable DemoDlg::msg(type) -value abortretryignore -anchor w
    radiobutton $subf.rad7 -text "User" -variable DemoDlg::msg(type) -value user -anchor w
    Entry $subf.user -textvariable DemoDlg::msg(buttons)

    pack $subf.rad1 $subf.rad2 $subf.rad3 $subf.rad4 $subf.rad5 $subf.rad6 -fill x -anchor w
    pack $subf.rad7 $subf.user -side left

    set labf2 [LabelFrame $parent.labf2 -text "Icon" -side top -anchor w -relief sunken -borderwidth 1]
    set subf  [$labf2 getframe]
    radiobutton $subf.rad1 -text "Information" -variable DemoDlg::msg(icon) -value info     -anchor w
    radiobutton $subf.rad2 -text "Question"    -variable DemoDlg::msg(icon) -value question -anchor w
    radiobutton $subf.rad3 -text "Warning"     -variable DemoDlg::msg(icon) -value warning  -anchor w
    radiobutton $subf.rad4 -text "Error"       -variable DemoDlg::msg(icon) -value error    -anchor w
    pack $subf.rad1 $subf.rad2 $subf.rad3 $subf.rad4 -fill x -anchor w


    set sep    [Separator  $parent.sep -orient horizontal]
    set button [button $parent.but -text "Show" -command DemoDlg::_show_msgdlg]

    pack $button -side bottom
    pack $sep -side bottom -fill x -pady 10
    pack $labf1 $labf2 -side left -padx 4 -anchor n
}


proc DemoDlg::_stddlg { parent } {
    set but0  [button $parent.but0 \
                   -text "Select a color " \
                   -command "DemoDlg::_show_color $parent.but0"]
    set but1  [button $parent.but1 \
                   -text    "Font selector dialog" \
                   -command DemoDlg::_show_fontdlg]
    set but2  [button $parent.but2 \
                   -text    "Progression dialog" \
                   -command DemoDlg::_show_progdlg]
    set but3  [button $parent.but3 \
                   -text    "Password dialog" \
                   -command DemoDlg::_show_passdlg]

    pack $but0 $but1 $but2 $but3 -side left -padx 5 -anchor w
}

proc DemoDlg::_show_color {w} {
    set color [SelectColor::menu $w.color [list below $w] \
                       -color [$w cget -background]]
    if {[string length $color]} {
        $w configure -background $color
    }
}

proc DemoDlg::_show_tmpldlg { } {
    variable tmpl

    set dlg [Dialog .tmpldlg -parent . -modal local \
                 -separator 1 \
                 -title   "Template dialog" \
                 -side    $tmpl(side)    \
                 -anchor  $tmpl(anchor)  \
                 -default 0 -cancel 1]
    $dlg add -name ok
    $dlg add -name cancel
    set msg [message [$dlg getframe].msg -text "Template\nDialog" -justify center -anchor c]
    pack $msg -fill both -expand yes -padx 100 -pady 100
    $dlg draw
    destroy $dlg
}


proc DemoDlg::_show_msgdlg { } {
    variable msg

    destroy .msgdlg
    MessageDlg .msgdlg -parent . \
        -message "Message for MessageBox" \
        -type    $msg(type) \
        -icon    $msg(icon) \
        -buttons $msg(buttons)
}


proc DemoDlg::_show_fontdlg { } {
    set font [SelectFont .fontdlg -parent . -font $Demo::font]
    if { $font != "" } {
        Demo::update_font $font
    }
}


proc DemoDlg::_show_progdlg { } {
    set DemoDlg::progmsg "Compute in progress..."
    set DemoDlg::progval 0

    ProgressDlg .progress -parent . -title "Wait..." \
        -type         infinite \
        -width        20 \
        -textvariable DemoDlg::progmsg \
        -variable     DemoDlg::progval \
        -stop         "Stop" \
        -command      {destroy .progress}
    _update_progdlg
}


proc DemoDlg::_update_progdlg { } {
    if { [winfo exists .progress] } {
        set DemoDlg::progval 2
        after 20 DemoDlg::_update_progdlg
    }
}

proc DemoDlg::_show_passdlg { } {
    PasswdDlg .passwd -parent .
}

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<












































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/demo/tree.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260

namespace eval DemoTree {
    variable count
    variable dblclick
}


proc DemoTree::create { nb } {
    set frame [$nb insert end demoTree -text "Tree"]
    set pw    [PanedWindow $frame.pw -side top]

    set pane  [$pw add -weight 1]
    set title [TitleFrame $pane.lf -text "Directory tree"]
    set sw    [ScrolledWindow [$title getframe].sw \
                  -relief sunken -borderwidth 2]
    set tree  [Tree $sw.tree \
                   -relief flat -borderwidth 0 -width 15 -highlightthickness 0\
		   -redraw 0 -dropenabled 1 -dragenabled 1 \
                   -dragevent 3 \
                   -droptypes {
                       TREE_NODE    {copy {} move {} link {}}
                       LISTBOX_ITEM {copy {} move {} link {}}
                   } \
                   -opencmd   "DemoTree::moddir 1 $sw.tree" \
                   -closecmd  "DemoTree::moddir 0 $sw.tree"]
    $sw setwidget $tree

    pack $sw    -side top  -expand yes -fill both
    pack $title -fill both -expand yes

    set pane [$pw add -weight 2]
    set lf   [TitleFrame $pane.lf -text "Content"]
    set sw   [ScrolledWindow [$lf getframe].sw \
                  -scrollbar horizontal -auto none -relief sunken -borderwidth 2]
    set list [ListBox::create $sw.lb \
                  -relief flat -borderwidth 0 \
                  -dragevent 3 \
                  -dropenabled 1 -dragenabled 1 \
                  -width 20 -highlightthickness 0 -multicolumn true \
                  -redraw 0 -dragenabled 1 \
                  -droptypes {
                      TREE_NODE    {copy {} move {} link {}}
                      LISTBOX_ITEM {copy {} move {} link {}}}]
    $sw setwidget $list

    pack $sw $lf -fill both -expand yes

    pack $pw -fill both -expand yes

    $tree bindText  <ButtonPress-1>        "DemoTree::select tree 1 $tree $list"
    $tree bindText  <Double-ButtonPress-1> "DemoTree::select tree 2 $tree $list"
    $list bindText  <ButtonPress-1>        "DemoTree::select list 1 $tree $list"
    $list bindText  <Double-ButtonPress-1> "DemoTree::select list 2 $tree $list"
    $list bindImage <Double-ButtonPress-1> "DemoTree::select list 2 $tree $list"

    $nb itemconfigure demoTree \
        -createcmd "DemoTree::init $tree $list" \
        -raisecmd  {
            # on windows you can get 100x100+-200+200 [PT]
            regexp {[0-9]+x[0-9]+([+-]{1,2}[0-9]+)([+-]{1,2}[0-9]+)} \
                [wm geom .] global_foo global_w global_h
            # {}'s left off on purpose. [PT]
            BWidget::place .top 0 0 at [expr $global_w-[winfo screenwidth .]] $global_h
            wm deiconify .top
            bind . <Unmap> {wm withdraw .top}
            bind . <Map>   {wm deiconify .top}
            bind . <Configure> {
                if { ![string compare %W "."] } {
                    # see above re: windows geometry
                    regexp {[0-9]+x[0-9]+([+-]{1,2}[0-9]+)([+-]{1,2}[0-9]+)} \
                        [wm geom .] global_foo global_w global_h
                    BWidget::place .top 0 0 at [expr $global_w-[winfo screenwidth .]] $global_h
                }
            }
        } \
        -leavecmd {
            wm withdraw .top
            bind . <Unmap> {}
            bind . <Map>   {}
            bind . <Configure> {}
            return 1
        }
}


proc DemoTree::init { tree list args } {
    global   tcl_platform
    variable count

    set count 0
    if { $tcl_platform(platform) == "unix" } {
        set rootdir [glob "~"]
    } else {
        set rootdir "c:\\"
    }
    $tree insert end root home -text $rootdir -data $rootdir -open 1 \
        -image [Bitmap::get openfold]
    getdir $tree home $rootdir
    DemoTree::select tree 1 $tree $list home
    $tree configure -redraw 1
    $list configure -redraw 1

    # ScrollView
    set w .top
    toplevel $w
    wm withdraw $w
    wm protocol $w WM_DELETE_WINDOW {
        # don't kill me
    }
    wm resizable $w 0 0 
    wm title $w "Drag rectangle to scroll directory tree"
    wm transient $w .
    ScrollView $w.sv -window $tree -fill white -relief sunken -bd 1 \
	    -width 300 -height 300
    pack $w.sv -fill both -expand yes
}


proc DemoTree::getdir { tree node path } {
    variable count

    set lentries [glob -nocomplain [file join $path "*"]]
    set lfiles   {}
    foreach f $lentries {
        set tail [file tail $f]
        if { [file isdirectory $f] } {
            $tree insert end $node n:$count \
                -text      $tail \
                -image     [Bitmap::get folder] \
                -drawcross allways \
                -data      $f
            incr count
        } else {
            lappend lfiles $tail
        }
    }
    $tree itemconfigure $node -drawcross auto -data $lfiles
}


proc DemoTree::moddir { idx tree node } {
    if { $idx && [$tree itemcget $node -drawcross] == "allways" } {
        getdir $tree $node [$tree itemcget $node -data]
        if { [llength [$tree nodes $node]] } {
            $tree itemconfigure $node -image [Bitmap::get openfold]
        } else {
            $tree itemconfigure $node -image [Bitmap::get folder]
        }
    } else {
        $tree itemconfigure $node -image [Bitmap::get [lindex {folder openfold} $idx]]
    }
}


proc DemoTree::select { where num tree list node } {
    variable dblclick

    set dblclick 1
    if { $num == 1 } {
        if { $where == "tree" && [lsearch [$tree selection get] $node] != -1 } {
            unset dblclick
            after 500 "DemoTree::edit tree $tree $list $node"
            return
        }
        if { $where == "list" && [lsearch [$list selection get] $node] != -1 } {
            unset dblclick
            after 500 "DemoTree::edit list $tree $list $node"
            return
        }
        if { $where == "tree" } {
            select_node $tree $list $node
        } else {
            $list selection set $node
        }
    } elseif { $where == "list" && [$tree exists $node] } {
	set parent [$tree parent $node]
	while { $parent != "root" } {
	    $tree itemconfigure $parent -open 1
	    set parent [$tree parent $parent]
	}
	select_node $tree $list $node
    }
}


proc DemoTree::select_node { tree list node } {
    $tree selection set $node
    update
    eval $list delete [$list item 0 end]

    set dir [$tree itemcget $node -data]
    if { [$tree itemcget $node -drawcross] == "allways" } {
        getdir $tree $node $dir
        set dir [$tree itemcget $node -data]
    }

    foreach subnode [$tree nodes $node] {
        $list insert end $subnode \
            -text  [$tree itemcget $subnode -text] \
            -image [Bitmap::get folder]
    }
    set num 0
    foreach f $dir {
        $list insert end f:$num \
            -text  $f \
            -image [Bitmap::get file]
        incr num
    }
}


proc DemoTree::edit { where tree list node } {
    variable dblclick

    if { [info exists dblclick] } {
        return
    }

    if { $where == "tree" && [lsearch [$tree selection get] $node] != -1 } {
        set res [$tree edit $node [$tree itemcget $node -text]]
        if { $res != "" } {
            $tree itemconfigure $node -text $res
            if { [$list exists $node] } {
                $list itemconfigure $node -text $res
            }
            $tree selection set $node
        }
        return
    }

    if { $where == "list" } {
        set res [$list edit $node [$list itemcget $node -text]]
        if { $res != "" } {
            $list itemconfigure $node -text $res
            if { [$tree exists $node] } {
                $tree itemconfigure $node -text $res
            } else {
                set cursel [$tree selection get]
                set index  [expr {[$list index $node]-[llength [$tree nodes $cursel]]}]
                set data   [$tree itemcget $cursel -data]
                set data   [lreplace $data $index $index $res]
                $tree itemconfigure $cursel -data $data
            }
            $list selection set $node
        }
    }
}


proc DemoTree::expand { tree but } {
    if { [set cur [$tree selection get]] != "" } {
        if { $but == 0 } {
            $tree opentree $cur
        } else {
            $tree closetree $cur
        }
    }
}


<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<








































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/demo/x1.xbm.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
#define x1_width 626
#define x1_height 428
static char x1_bits[] = {
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x03,0x80,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0xe0,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,
 0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,
 0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x80,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,
 0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,
 0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
 0x80,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,
 0xff,0x03,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,
 0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,
 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,
 0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,
 0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,
 0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x03,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,
 0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0xfc,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,
 0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,
 0xff,0x3f,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,
 0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xfc,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,
 0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x03,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,
 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x1f,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0xfc,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xc0,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,
 0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x0f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfe,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0xfc,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x80,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,
 0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0x03,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x07,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0x01,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfc,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0xfc,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfe,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x1f,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0x3f,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0xfc,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xf0,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,
 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfc,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0x0f,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0x07,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0xfc,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xe0,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,
 0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x03,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0x03,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,
 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0xfc,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x80,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x0f,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x0f,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0x7f,0x00,0x00,0x00,
 0x00,0xf8,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0xfc,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,
 0x7f,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0xfc,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfe,0xff,0xff,0x3f,0x00,0x00,0x00,0xc0,0xff,0xff,0x03,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x3f,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0xe0,0xff,0xff,
 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0x1f,0x00,0x00,
 0x00,0xf0,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0xfc,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,
 0xff,0x1f,0x00,0x00,0x00,0xfc,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,
 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xf0,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0xfe,0xff,0xff,0x3f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0xfe,0xff,
 0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0x0f,0x00,
 0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0xfc,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,
 0xff,0xff,0x07,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x01,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xc0,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0x01,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x03,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0xe0,0xff,
 0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,
 0xf8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0xfc,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x03,
 0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,
 0x00,0x00,0x00,0x00,0xfe,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0xfc,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,
 0xff,0xff,0xff,0x01,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x80,0xff,0x07,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x07,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,
 0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xc0,0xff,0x07,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x07,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0xf8,
 0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,
 0xe0,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xfc,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,
 0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,
 0x00,0x00,0x00,0x00,0xf8,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xfc,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,
 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,
 0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0xfc,0xff,0x0f,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x0f,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,
 0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x80,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0xfe,0xff,0x0f,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,
 0xfe,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,
 0x00,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0xfc,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,
 0x7f,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,
 0x07,0x00,0x00,0x00,0x80,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,
 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,
 0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,
 0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0xc0,0xff,0xff,0x1f,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x1f,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0xff,0xff,0xff,
 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xe0,0xff,0xff,
 0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,
 0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,
 0x00,0xf0,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xfc,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,
 0xff,0x3f,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,
 0xff,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x3f,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
 0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,
 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,
 0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0x1f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x7f,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x80,0xff,0xff,
 0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0xfe,0xff,
 0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xfc,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,
 0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,
 0x00,0x00,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xfc,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,
 0xff,0xff,0x1f,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,
 0xff,0x1f,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x7f,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,
 0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,
 0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xf0,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0x1f,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0xe0,0xff,
 0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0xe0,0xff,
 0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
 0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0x07,0x00,
 0x00,0x00,0xe0,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,
 0xff,0xff,0xff,0x0f,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,
 0xff,0xff,0x03,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,
 0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xe0,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0x1f,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0xf0,
 0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xfc,
 0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x07,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0x00,
 0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xfd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x07,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,
 0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xfd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0xf0,0xff,0xff,0xff,
 0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x80,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,
 0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,
 0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x80,
 0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x07,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0x1f,
 0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xfd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,
 0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0xf8,0xff,0xff,
 0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,
 0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,
 0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x07,0x00,0x00,0x00,
 0xf8,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x03,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,
 0x03,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfe,0xff,0xff,0x01,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0xfc,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x01,0x00,0x00,0x00,0xfe,0xff,0xff,
 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,
 0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0x00,0x00,0x00,
 0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x03,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,
 0x7f,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xfc,0xff,0x7f,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,
 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0xfc,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0x3f,0x00,0x00,0x00,0xc0,0xff,0xff,
 0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x03,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0x1f,0x00,0x00,
 0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x03,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
 0xff,0x1f,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,
 0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0xfc,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xf0,0xff,0x0f,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,
 0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,
 0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0x07,0x00,0x00,0x00,0xf8,0xff,
 0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x03,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0x07,0x00,
 0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,
 0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xe0,0xff,0x03,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,
 0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0xfe,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xe0,0xff,0x01,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,
 0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,
 0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0x01,0x00,0x00,0x00,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x07,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0x00,
 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,
 0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x80,0x7f,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x03,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0xfe,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x80,0x7f,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,
 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x3f,0x00,0x00,0x00,0xe0,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x80,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x0f,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,
 0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,
 0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x80,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x07,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x80,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x1f,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,
 0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x3f,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x06,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0xf0,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
 0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0xfc,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,
 0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,
 0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
 0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0x00,0x00,0x00,0x00,
 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,
 0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xfd,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0x00,0x00,0x00,
 0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xfd,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0xf8,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,
 0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xfc,0x00,0x00,0x00,0x00,0x00,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xfc,0x00,
 0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x7f,0xfc,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x7f,0xfc,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xfc,0x00,0x00,0x00,0x00,
 0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xfc,
 0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x3f,0xfc,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xfc,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xfc,0x00,0x00,0x00,
 0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,
 0xfc,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x1f,0xfc,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0xfc,0x00,0x00,0x00,0x00,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xfc,0x00,0x00,
 0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x0f,0xfc,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x0f,0xfc,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0xfc,0x00,0x00,0x00,0xe0,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0xfc,0x00,
 0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x07,0xfc,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x07,0xfc,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0xfc,0x00,0x00,0x00,0xf8,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0xfc,
 0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x03,0xfc,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x01,0xfc,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0xfc,0x00,0x00,0x00,
 0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
 0xfc,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x00,0xfc,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xfc,0x00,0x00,0x80,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0xfc,0x00,0x00,
 0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
 0x00,0xfc,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x3f,0x00,0xfc,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0xfc,0x00,0x00,0xe0,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0xfc,0x00,
 0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x1f,0x00,0xfc,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x1f,0x00,0xfc,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0xfc,0x00,0x00,0xf8,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0xfc,
 0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x0f,0x00,0xfc,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x07,0x00,0xfc,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0xfc,0x00,0x00,0xfe,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,
 0xfc,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x03,0x00,0xfc,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0xfc,0x00,0x80,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0xfc,0x00,0x80,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
 0x00,0xfc,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x00,0x00,0xfc,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0xfc,0x00,0xe0,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0xfc,0x00,
 0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,
 0x00,0x00,0xfc,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x3f,0x00,0x00,0xfc,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0xfc,0x00,0xf0,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0xfc,
 0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x0f,0x00,0x00,0xfc,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x07,0x00,0x00,0xfc,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0xfc,0x00,0xfc,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,
 0xfc,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x03,0x00,0x00,0xfc,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0xfc,0x00,0xfe,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0xfc,0x00,0xfe,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,
 0x00,0xfc,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x7f,0x00,0x00,0x00,0xfc,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0xfc,0x00,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0xfc,0x80,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,
 0x00,0x00,0xfc,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x1f,0x00,0x00,0x00,0xfc,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0xfc,0xc0,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0xfc,
 0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,
 0x00,0x00,0x00,0xfc,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x03,0x00,0x00,0x00,0xfc,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0xfc,0xe0,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,
 0xfc,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x01,0x00,0x00,0x00,0xfc,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xfc,0xf0,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0xfc,0xf0,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,
 0x00,0xfc,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x3f,0x00,0x00,0x00,0x00,0xfc,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0xfc,0xf8,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0xfc,0xf8,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,
 0x00,0x00,0xfc,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x07,0x00,0x00,0x00,0x00,0xfc,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0xfc,0xf8,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0xfc,
 0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,
 0x00,0x00,0x00,0xfc,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0xfc,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0xfc,0xfc,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,
 0xfc,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,
 0x00,0x00,0x00,0x00,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0xfc,0xfe,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,
 0x00,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,
 0x00,0x00,0x00,0x00,0x00,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0xfc,0xfe,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0xfc,0xfe,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
 0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x7f,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0xfc,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x7f,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0xf8,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x03,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x0f,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,
 0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0xe0,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x01,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,
 0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x03,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x07,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,
 0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
 0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0xc0,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x7f,0x00,0x00,0x00,0xc0,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,
 0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0xc0,0x0f,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x01,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0xe0,
 0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x80,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,
 0x00,0x00,0x00,0xf0,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x80,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0xf8,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0xfc,0x3f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,
 0xfc,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x80,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x01,0x00,0x00,0x00,0xfe,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x80,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,
 0x7f,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x80,0xff,0x7f,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,
 0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,
 0x80,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x80,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x3f,0x00,0x00,0x00,0xc0,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,
 0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0xe0,0xff,0xff,0x01,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,
 0xff,0x7f,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0xf0,0xff,0xff,
 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
 0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,
 0x00,0xf8,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0xc0,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x07,0x00,0x00,0x00,0xf8,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,
 0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0xfc,0xff,0xff,0x03,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,
 0xff,0xff,0x3f,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xfe,0xff,
 0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xf0,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,
 0x00,0x00,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0xc0,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,
 0xff,0x7f,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0x1f,
 0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,
 0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0x0f,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,
 0xff,0xff,0xff,0x1f,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0xc0,0xff,
 0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,
 0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,
 0x00,0x00,0xe0,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0xe0,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,
 0xff,0xff,0x0f,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,
 0x0f,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
 0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0x1f,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,
 0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xfe,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0xf8,
 0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0xe0,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x01,
 0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0x07,0x00,0x00,
 0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,
 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,
 0xff,0x07,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xf0,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,
 0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfc,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xfc,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,
 0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0xf0,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfc,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0x1f,
 0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0x03,0x00,
 0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xfc,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,
 0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,
 0xff,0xff,0x03,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xfc,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,
 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xe0,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,
 0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xfc,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,
 0xe0,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0xf8,0xff,
 0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xfc,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,
 0x03,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0x00,
 0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,
 0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0x01,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,
 0xff,0xff,0xff,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xf8,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,
 0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,
 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,
 0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,
 0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x3f,0x00,0x00,0x00,0xfc,
 0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfc,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,
 0x3f,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0x3f,
 0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,
 0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,
 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xf8,0xff,0xff,0x1f,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xf0,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x80,0xff,0xff,
 0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0x0f,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,
 0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfc,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0x07,0x00,0x00,
 0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x07,0x00,0x00,0x00,
 0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfc,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,
 0xff,0x01,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,
 0x01,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xe0,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,
 0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xfe,0x7f,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xc0,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0xf8,0xff,
 0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x1f,0x00,0x00,0x00,0x80,0xff,0xff,0xff,
 0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfc,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,
 0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x80,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xfc,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,
 0xff,0x1f,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x80,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x80,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,
 0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0x03,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x80,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,
 0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xfc,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0x03,0x00,
 0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,
 0xff,0xff,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xc0,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0x1f,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,
 0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0xf0,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,
 0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfc,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x1f,0x00,
 0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,
 0xff,0xff,0x07,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0xfc,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xe0,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0x7f,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfc,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,
 0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,
 0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfc,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0x7f,0x00,
 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0xf8,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,
 0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0x07,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0xf0,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xc0,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,
 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfc,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0x01,0x00,0x00,0x00,0x00,
 0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x7f,0x00,
 0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x80,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0xe0,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfe,0x1f,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,
 0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,
 0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xfc,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xc0,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x80,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0x7f,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,
 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,
 0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfc,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xf8,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,
 0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0xfc,
 0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0x01,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfc,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,
 0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xfe,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0xf0,0xff,0xff,0xff,
 0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,
 0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0x07,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfc,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,
 0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,
 0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xc0,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0xc0,0xff,0xff,
 0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,
 0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0x0f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xfc,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
 0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,
 0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xf8,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0xfe,
 0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,
 0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x1f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,
 0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x80,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,
 0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfc,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x3f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,
 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xf0,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x80,0xff,0xff,
 0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xf8,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,
 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfc,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,
 0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0xf8,
 0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,
 0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,
 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,
 0x80,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,
 0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,
 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,
 0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,
 0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfc,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,
 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x80,
 0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0x1f,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,
 0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,
 0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,
 0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,
 0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,
 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,
 0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,
 0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x80,0x0f,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0xc0,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x80,
 0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0xfc};
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/dialog.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
# ----------------------------------------------------------------------------
#  dialog.tcl
#  This file is part of Unifix BWidget Toolkit
#  $Id: dialog.tcl,v 1.15.2.1 2010/08/04 13:07:59 oehhar Exp $
# ----------------------------------------------------------------------------
#  Index of commands:
#     - Dialog::create
#     - Dialog::configure
#     - Dialog::cget
#     - Dialog::getframe
#     - Dialog::add
#     - Dialog::itemconfigure
#     - Dialog::itemcget
#     - Dialog::invoke
#     - Dialog::setfocus
#     - Dialog::enddialog
#     - Dialog::draw
#     - Dialog::withdraw
#     - Dialog::_destroy
# ----------------------------------------------------------------------------

# JDC: added -transient and -place flag

namespace eval Dialog {
    Widget::define Dialog dialog ButtonBox

    Widget::bwinclude Dialog ButtonBox .bbox \
	remove	   {-orient} \
	initialize {-spacing 10 -padx 10}

    Widget::declare Dialog {
	{-title	      String	 ""	  0}
	{-geometry    String	 ""	  0}
	{-modal	      Enum	 local	  0 {none local global}}
	{-bitmap      TkResource ""	  1 label}
	{-image	      TkResource ""	  1 label}
	{-separator   Boolean	 0	  1}
	{-cancel      Int	 -1	  0 "%d >= -1"}
	{-parent      String	 ""	  0}
	{-side	      Enum	 bottom	  1 {bottom left top right}}
	{-anchor      Enum	 c	  1 {n e w s c}}
	{-class	      String	 Dialog	  1}
	{-transient   Boolean	 1	  1}
	{-place	      Enum	 center	  0 {none center left right above below}}
    }

    Widget::addmap Dialog "" :cmd   {-background {}}
    Widget::addmap Dialog "" .frame {-background {}}

    bind BwDialog <Destroy> [list Dialog::_destroy %W]

    variable _widget
}


# ----------------------------------------------------------------------------
#  Command Dialog::create
# ----------------------------------------------------------------------------
proc Dialog::create { path args } {
    global   tcl_platform
    variable _widget

    array set maps [list Dialog {} .bbox {}]
    array set maps [Widget::parseArgs Dialog $args]

    # Check to see if the -class flag was specified
    set dialogClass "Dialog"
    array set dialogArgs $maps(Dialog)
    if { [info exists dialogArgs(-class)] } {
	set dialogClass $dialogArgs(-class)
    }

    if { [string equal $tcl_platform(platform) "unix"] } {
	set re raised
	set bd 1
    } else {
	set re flat
	set bd 0
    }
    toplevel $path -relief $re -borderwidth $bd -class $dialogClass
    wm withdraw $path

    Widget::initFromODB Dialog $path $maps(Dialog)

    bindtags $path [list $path BwDialog all]
    wm overrideredirect $path 1
    wm title $path [Widget::cget $path -title]
    set parent [Widget::cget $path -parent]
    if { ![winfo exists $parent] } {
        set parent [winfo parent $path]
    }
    # JDC: made transient optional
    if { [Widget::getoption $path -transient] } {
	wm transient $path [winfo toplevel $parent]
    }

    set side [Widget::cget $path -side]
    if { [string equal $side "left"] || [string equal $side "right"] } {
        set orient vertical
    } else {
        set orient horizontal
    }

    set bbox  [eval [list ButtonBox::create $path.bbox] $maps(.bbox) \
		   -orient $orient]
    set frame [frame $path.frame -relief flat -borderwidth 0]
    set bg [Widget::cget $path -background]
    $path configure -background $bg
    $frame configure -background $bg
    if { [set bitmap [Widget::getoption $path -image]] != "" } {
        set label [label $path.label -image $bitmap -background $bg]
    } elseif { [set bitmap [Widget::getoption $path -bitmap]] != "" } {
        set label [label $path.label -bitmap $bitmap -background $bg]
    }
    if { [Widget::getoption $path -separator] } {
	Separator::create $path.sep -orient $orient -background $bg
    }
    set _widget($path,realized) 0
    set _widget($path,nbut)     0

    set cancel [Widget::getoption $path -cancel]
    bind $path <Escape>  [list ButtonBox::invoke $path.bbox $cancel]
    if {$cancel != -1} {
        wm protocol $path WM_DELETE_WINDOW [list ButtonBox::invoke $path.bbox $cancel]
    }
    bind $path <Return>  [list ButtonBox::invoke $path.bbox default]

    return [Widget::create Dialog $path]
}


# ----------------------------------------------------------------------------
#  Command Dialog::configure
# ----------------------------------------------------------------------------
proc Dialog::configure { path args } {
    set res [Widget::configure $path $args]

    if { [Widget::hasChanged $path -title title] } {
        wm title $path $title
    }
    if { [Widget::hasChanged $path -background bg] } {
        if { [winfo exists $path.label] } {
            $path.label configure -background $bg
        }
        if { [winfo exists $path.sep] } {
            Separator::configure $path.sep -background $bg
        }
    }
    if { [Widget::hasChanged $path -cancel cancel] } {
        bind $path <Escape>  [list ButtonBox::invoke $path.bbox $cancel]
        if {$cancel == -1} {
            wm protocol $path WM_DELETE_WINDOW ""
        } else {
            wm protocol $path WM_DELETE_WINDOW [list ButtonBox::invoke $path.bbox $cancel]
        }
    }
    return $res
}


# ----------------------------------------------------------------------------
#  Command Dialog::cget
# ----------------------------------------------------------------------------
proc Dialog::cget { path option } {
    return [Widget::cget $path $option]
}


# ----------------------------------------------------------------------------
#  Command Dialog::getframe
# ----------------------------------------------------------------------------
proc Dialog::getframe { path } {
    return $path.frame
}


# ----------------------------------------------------------------------------
#  Command Dialog::add
# ----------------------------------------------------------------------------
proc Dialog::add { path args } {
    variable _widget

    if {[string equal $::tcl_platform(platform) "windows"]
	&& $::tk_version >= 8.4} {
	set width -11
    } else {
	set width 8
    }
    set cmd [list ButtonBox::add $path.bbox -width $width \
		 -command [list Dialog::enddialog $path $_widget($path,nbut)]]
    set res [eval $cmd $args]
    incr _widget($path,nbut)
    return $res
}


# ----------------------------------------------------------------------------
#  Command Dialog::itemconfigure
# ----------------------------------------------------------------------------
proc Dialog::itemconfigure { path index args } {
    return [eval [list ButtonBox::itemconfigure $path.bbox $index] $args]
}


# ----------------------------------------------------------------------------
#  Command Dialog::itemcget
# ----------------------------------------------------------------------------
proc Dialog::itemcget { path index option } {
    return [ButtonBox::itemcget $path.bbox $index $option]
}


# ----------------------------------------------------------------------------
#  Command Dialog::invoke
# ----------------------------------------------------------------------------
proc Dialog::invoke { path index } {
    ButtonBox::invoke $path.bbox $index
}


# ----------------------------------------------------------------------------
#  Command Dialog::setfocus
# ----------------------------------------------------------------------------
proc Dialog::setfocus { path index } {
    ButtonBox::setfocus $path.bbox $index
}


# ----------------------------------------------------------------------------
#  Command Dialog::enddialog
# ----------------------------------------------------------------------------
proc Dialog::enddialog { path result } {
    variable _widget

    set _widget($path,result) $result
}


# ----------------------------------------------------------------------------
#  Command Dialog::draw
# ----------------------------------------------------------------------------
proc Dialog::draw { path {focus ""} {overrideredirect 0} {geometry ""}} {
    variable _widget

    set parent [Widget::getoption $path -parent]
    if { !$_widget($path,realized) } {
        set _widget($path,realized) 1
        if { [llength [winfo children $path.bbox]] } {
            set side [Widget::getoption $path -side]
            if {[string equal $side "left"] || [string equal $side "right"]} {
                set pad  -padx
                set fill y
            } else {
                set pad  -pady
                set fill x
            }
            pack $path.bbox -side $side -padx 1m -pady 1m \
		-anchor [Widget::getoption $path -anchor]
            if { [winfo exists $path.sep] } {
                pack $path.sep -side $side -fill $fill $pad 2m
            }
        }
        if { [winfo exists $path.label] } {
            pack $path.label -side left -anchor n -padx 3m -pady 3m
        }
        pack $path.frame -padx 1m -pady 1m -fill both -expand yes
    }

    set geom [Widget::getMegawidgetOption $path -geometry]
    if { $geom != "" } {
	wm geometry $path $geom
    }

    if { [string equal $geometry ""] && ($geom == "") } {
	set place [Widget::getoption $path -place]
	if { ![string equal $place none] } {
	    if { [winfo exists $parent] } {
		BWidget::place $path 0 0 $place $parent
	    } else {
		BWidget::place $path 0 0 $place
	    }
	}
    } else {
	if { $geom != "" } {
	    wm geometry $path $geom
	} else {
	    wm geometry $path $geometry
	}
    }
    update idletasks
    wm overrideredirect $path $overrideredirect
    wm deiconify $path

    # patch by Bastien Chevreux (bach@mwgdna.com)
    # As seen on Windows systems *sigh*
    # When the toplevel is withdrawn, the tkwait command will wait forever.
    #  So, check that we are not withdrawn
    if {![winfo exists $parent] || \
	    ([wm state [winfo toplevel $parent]] != "withdrawn")} {
	tkwait visibility $path
    }
    BWidget::focus set $path
    if { [winfo exists $focus] } {
        focus -force $focus
    } else {
        ButtonBox::setfocus $path.bbox default
    }

    if { [set grab [Widget::cget $path -modal]] != "none" } {
        BWidget::grab $grab $path
        if {[info exists _widget($path,result)]} { 
            unset _widget($path,result)
        }
        tkwait variable Dialog::_widget($path,result)
        if { [info exists _widget($path,result)] } {
            set res $_widget($path,result)
            unset _widget($path,result)
        } else {
            set res -1
        }
        withdraw $path
        return $res
    }
    return ""
}


# ----------------------------------------------------------------------------
#  Command Dialog::withdraw
# ----------------------------------------------------------------------------
proc Dialog::withdraw { path } {
    BWidget::grab release $path
    BWidget::focus release $path
    if { [winfo exists $path] } {
        wm withdraw $path
    }
}


# ----------------------------------------------------------------------------
#  Command Dialog::_destroy
# ----------------------------------------------------------------------------
proc Dialog::_destroy { path } {
    variable _widget

    Dialog::enddialog $path -1

    BWidget::grab  release $path
    BWidget::focus release $path
    if {[info exists _widget($path,result)]} {
        unset _widget($path,result)
    }
    unset _widget($path,realized)
    unset _widget($path,nbut)

    Widget::destroy $path
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<










































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/dragsite.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
# ------------------------------------------------------------------------------
#  dragsite.tcl
#  This file is part of Unifix BWidget Toolkit
#  $Id: dragsite.tcl,v 1.8 2003/10/20 21:23:52 damonc Exp $
# ------------------------------------------------------------------------------
#  Index of commands:
#     - DragSite::include
#     - DragSite::setdrag
#     - DragSite::register
#     - DragSite::_begin_drag
#     - DragSite::_init_drag
#     - DragSite::_end_drag
#     - DragSite::_update_operation
# ----------------------------------------------------------------------------

namespace eval DragSite {
    Widget::define DragSite dragsite -classonly

    Widget::declare DragSite [list \
	    [list	-dragevent	Enum	1	0	[list 1 2 3]] \
	    [list	-draginitcmd	String	""	0] \
	    [list	-dragendcmd	String	""	0] \
	    ]

    variable _topw ".drag"
    variable _tabops
    variable _state
    variable _x0
    variable _y0

    bind BwDrag1 <ButtonPress-1> {DragSite::_begin_drag press  %W %s %X %Y}
    bind BwDrag1 <B1-Motion>     {DragSite::_begin_drag motion %W %s %X %Y}
    bind BwDrag2 <ButtonPress-2> {DragSite::_begin_drag press  %W %s %X %Y}
    bind BwDrag2 <B2-Motion>     {DragSite::_begin_drag motion %W %s %X %Y}
    bind BwDrag3 <ButtonPress-3> {DragSite::_begin_drag press  %W %s %X %Y}
    bind BwDrag3 <B3-Motion>     {DragSite::_begin_drag motion %W %s %X %Y}

    proc use {} {}
}


# ----------------------------------------------------------------------------
#  Command DragSite::include
# ----------------------------------------------------------------------------
proc DragSite::include { class type event } {
    set dragoptions [list \
	    [list	-dragenabled	Boolean	0	0] \
	    [list	-draginitcmd	String	""	0] \
	    [list	-dragendcmd	String	""	0] \
	    [list	-dragtype	String	$type	0] \
	    [list	-dragevent	Enum	$event	0	[list 1 2 3]] \
	    ]
    Widget::declare $class $dragoptions
}


# ----------------------------------------------------------------------------
#  Command DragSite::setdrag
#  Widget interface to register
# ----------------------------------------------------------------------------
proc DragSite::setdrag { path subpath initcmd endcmd {force 0}} {
    set cen       [Widget::hasChanged $path -dragenabled en]
    set cdragevt  [Widget::hasChanged $path -dragevent   dragevt]
    if { $en } {
        if { $force || $cen || $cdragevt } {
            register $subpath \
                -draginitcmd $initcmd \
                -dragendcmd  $endcmd  \
                -dragevent   $dragevt
        }
    } else {
        register $subpath
    }
}


# ----------------------------------------------------------------------------
#  Command DragSite::register
# ----------------------------------------------------------------------------
proc DragSite::register { path args } {
    upvar \#0 DragSite::$path drag

    if { [info exists drag] } {
        bind $path $drag(evt) {}
        unset drag
    }
    Widget::init DragSite .drag$path $args
    set event   [Widget::getMegawidgetOption .drag$path -dragevent]
    set initcmd [Widget::getMegawidgetOption .drag$path -draginitcmd]
    set endcmd  [Widget::getMegawidgetOption .drag$path -dragendcmd]
    set tags    [bindtags $path]
    set idx     [lsearch $tags "BwDrag*"]
    Widget::destroy .drag$path
    if { $initcmd != "" } {
        if { $idx != -1 } {
            bindtags $path [lreplace $tags $idx $idx BwDrag$event]
        } else {
            bindtags $path [concat $tags BwDrag$event]
        }
        set drag(initcmd) $initcmd
        set drag(endcmd)  $endcmd
        set drag(evt)     $event
    } elseif { $idx != -1 } {
        bindtags $path [lreplace $tags $idx $idx]
    }
}


# ----------------------------------------------------------------------------
#  Command DragSite::_begin_drag
# ----------------------------------------------------------------------------
proc DragSite::_begin_drag { event source state X Y } {
    variable _x0
    variable _y0
    variable _state

    switch -- $event {
        press {
            set _x0    $X
            set _y0    $Y
            set _state "press"
        }
        motion {
            if { ![info exists _state] } {
                # This is just extra protection. There seem to be
                # rare cases where the motion comes before the press.
                return
            }
            if { [string equal $_state "press"] } {
                if { abs($_x0-$X) > 3 || abs($_y0-$Y) > 3 } {
                    set _state "done"
                    _init_drag $source $state $X $Y
                }
            }
        }
    }
}


# ----------------------------------------------------------------------------
#  Command DragSite::_init_drag
# ----------------------------------------------------------------------------
proc DragSite::_init_drag { source state X Y } {
    variable _topw
    upvar \#0 DragSite::$source drag

    destroy  $_topw
    toplevel $_topw
    wm withdraw $_topw
    wm overrideredirect $_topw 1

    set info [uplevel \#0 $drag(initcmd) [list $source $X $Y .drag]]
    if { $info != "" } {
        set type [lindex $info 0]
        set ops  [lindex $info 1]
        set data [lindex $info 2]

        if { [winfo children $_topw] == "" } {
            if { [string equal $type "BITMAP"] || [string equal $type "IMAGE"] } {
                label $_topw.l -image [Bitmap::get dragicon] -relief flat -bd 0
            } else {
                label $_topw.l -image [Bitmap::get dragfile] -relief flat -bd 0
            }
            pack  $_topw.l
        }
        wm geometry $_topw +[expr {$X+1}]+[expr {$Y+1}]
        wm deiconify $_topw
        if {[catch {tkwait visibility $_topw}]} {
            return
        }
        BWidget::grab  set $_topw
        BWidget::focus set $_topw

        bindtags $_topw [list $_topw DragTop]
        DropSite::_init_drag $_topw $drag(evt) $source $state $X $Y $type $ops $data
    } else {
        destroy $_topw
    }
}


# ----------------------------------------------------------------------------
#  Command DragSite::_end_drag
# ----------------------------------------------------------------------------
proc DragSite::_end_drag { source target op type data result } {
    variable _topw
    upvar \#0 DragSite::$source drag

    BWidget::grab  release $_topw
    BWidget::focus release $_topw
    destroy $_topw
    if { $drag(endcmd) != "" } {
        uplevel \#0 $drag(endcmd) [list $source $target $op $type $data $result]
    }
}


<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<










































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/dropsite.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
# ------------------------------------------------------------------------------
#  dropsite.tcl
#  This file is part of Unifix BWidget Toolkit
#  $Id: dropsite.tcl,v 1.8 2009/06/30 16:17:37 oehhar Exp $
# ------------------------------------------------------------------------------
#  Index of commands:
#     - DropSite::include
#     - DropSite::setdrop
#     - DropSite::register
#     - DropSite::setcursor
#     - DropSite::setoperation
#     - DropSite::_update_operation
#     - DropSite::_compute_operation
#     - DropSite::_draw_operation
#     - DropSite::_init_drag
#     - DropSite::_motion
#     - DropSite::_release
# ----------------------------------------------------------------------------


namespace eval DropSite {
    Widget::define DropSite dropsite -classonly

    Widget::declare DropSite [list \
	    [list -dropovercmd String "" 0] \
	    [list -dropcmd     String "" 0] \
	    [list -droptypes   String "" 0] \
	    ]

    proc use {} {}

    variable _top  ".drag"
    variable _opw  ".drag.\#op"
    variable _target  ""
    variable _status  0
    variable _tabops
    variable _defops
    variable _source
    variable _type
    variable _data
    variable _evt
    # key       win    unix
    # shift       1   |   1    ->  1
    # control     4   |   4    ->  4
    # alt         8   |  16    -> 24
    # meta            |  64    -> 88

    array set _tabops {
        mod,none    0
        mod,shift   1
        mod,control 4
        mod,alt     24
        ops,copy    1
        ops,move    1
        ops,link    1
    }

    if { $tcl_platform(platform) == "unix" } {
        set _tabops(mod,alt) 8
    } else {
        set _tabops(mod,alt) 16
    }
    array set _defops \
        [list \
             copy,mod  shift   \
             move,mod  control \
             link,mod  alt     \
             copy,img  @[file join $::BWIDGET::LIBRARY "images" "opcopy.xbm"] \
             move,img  @[file join $::BWIDGET::LIBRARY "images" "opmove.xbm"] \
             link,img  @[file join $::BWIDGET::LIBRARY "images" "oplink.xbm"]]

    bind DragTop <KeyPress-Shift_L>     {DropSite::_update_operation [expr %s | 1]}
    bind DragTop <KeyPress-Shift_R>     {DropSite::_update_operation [expr %s | 1]}
    bind DragTop <KeyPress-Control_L>   {DropSite::_update_operation [expr %s | 4]}
    bind DragTop <KeyPress-Control_R>   {DropSite::_update_operation [expr %s | 4]}
    if { $tcl_platform(platform) == "unix" } {
        bind DragTop <KeyPress-Alt_L>       {DropSite::_update_operation [expr %s | 8]}
        bind DragTop <KeyPress-Alt_R>       {DropSite::_update_operation [expr %s | 8]}
    } else {
        bind DragTop <KeyPress-Alt_L>       {DropSite::_update_operation [expr %s | 16]}
        bind DragTop <KeyPress-Alt_R>       {DropSite::_update_operation [expr %s | 16]}
    }

    bind DragTop <KeyRelease-Shift_L>   {DropSite::_update_operation [expr %s & ~1]}
    bind DragTop <KeyRelease-Shift_R>   {DropSite::_update_operation [expr %s & ~1]}
    bind DragTop <KeyRelease-Control_L> {DropSite::_update_operation [expr %s & ~4]}
    bind DragTop <KeyRelease-Control_R> {DropSite::_update_operation [expr %s & ~4]}
    if { $tcl_platform(platform) == "unix" } {
        bind DragTop <KeyRelease-Alt_L>     {DropSite::_update_operation [expr %s & ~8]}
        bind DragTop <KeyRelease-Alt_R>     {DropSite::_update_operation [expr %s & ~8]}
    } else {
        bind DragTop <KeyRelease-Alt_L>     {DropSite::_update_operation [expr %s & ~16]}
        bind DragTop <KeyRelease-Alt_R>     {DropSite::_update_operation [expr %s & ~16]}
    }
}


# ----------------------------------------------------------------------------
#  Command DropSite::include
# ----------------------------------------------------------------------------
proc DropSite::include { class types } {
    set dropoptions [list \
	    [list	-dropenabled	Boolean	0	0] \
	    [list	-dropovercmd	String	""	0] \
	    [list	-dropcmd	String	""	0] \
	    [list	-droptypes	String	$types	0] \
	    ]
    Widget::declare $class $dropoptions
}


# ----------------------------------------------------------------------------
#  Command DropSite::setdrop
#  Widget interface to register
# ----------------------------------------------------------------------------
proc DropSite::setdrop { path subpath dropover drop {force 0}} {
    set cen    [Widget::hasChanged $path -dropenabled en]
    set ctypes [Widget::hasChanged $path -droptypes   types]
    if { $en } {
        if { $force || $cen || $ctypes } {
            register $subpath \
                -droptypes   $types \
                -dropcmd     $drop  \
                -dropovercmd $dropover
        }
    } else {
        register $subpath
    }
}


# ----------------------------------------------------------------------------
#  Command DropSite::register
# ----------------------------------------------------------------------------
proc DropSite::register { path args } {
    variable _tabops
    variable _defops
    upvar \#0 DropSite::$path drop

    Widget::init DropSite .drop$path $args
    if { [info exists drop] } {
        unset drop
    }
    set dropcmd [Widget::getMegawidgetOption .drop$path -dropcmd]
    set types   [Widget::getMegawidgetOption .drop$path -droptypes]
    set overcmd [Widget::getMegawidgetOption .drop$path -dropovercmd]
    Widget::destroy .drop$path
    if { $dropcmd != "" && $types != "" } {
        set drop(dropcmd) $dropcmd
        set drop(overcmd) $overcmd
        foreach {type ops} $types {
            set drop($type,ops) {}
            set masklist {}
            foreach {descop lmod} $ops {
                if { ![llength $descop] || [llength $descop] > 3 } {
                    return -code error "invalid operation description \"$descop\""
                }
                foreach {subop baseop imgop} $descop {
                    set subop [string trim $subop]
                    if { ![string length $subop] } {
                        return -code error "sub operation is empty"
                    }
                    if { ![string length $baseop] } {
                        set baseop $subop
                    }
                    if { [info exists drop($type,ops,$subop)] } {
                        return -code error "operation \"$subop\" already defined"
                    }
                    if { ![info exists _tabops(ops,$baseop)] } {
                        return -code error "invalid base operation \"$baseop\""
                    }
                    if { ![string equal $subop $baseop] &&
                         [info exists _tabops(ops,$subop)] } {
                        return -code error "sub operation \"$subop\" is a base operation"
                    }
                    if { ![string length $imgop] } {
                        set imgop $_defops($baseop,img)
                    }
                }
                if { [string equal $lmod "program"] } {
                    set drop($type,ops,$subop) $baseop
                    set drop($type,img,$subop) $imgop
                } else {
                    if { ![string length $lmod] } {
                        set lmod $_defops($baseop,mod)
                    }
                    set mask 0
                    foreach mod $lmod {
                        if { ![info exists _tabops(mod,$mod)] } {
                            return -code error "invalid modifier \"$mod\""
                        }
                        set mask [expr {$mask | $_tabops(mod,$mod)}]
                    }
                    if { ($mask == 0) != ([string equal $subop "default"]) } {
                        return -code error "sub operation default can only be used with modifier \"none\""
                    }
                    set drop($type,mod,$mask)  $subop
                    set drop($type,ops,$subop) $baseop
                    set drop($type,img,$subop) $imgop
                    lappend masklist $mask
                }
            }
            if { ![info exists drop($type,mod,0)] } {
                set drop($type,mod,0)       default
                set drop($type,ops,default) copy
                set drop($type,img,default) $_defops(copy,img)
                lappend masklist 0
            }
            set drop($type,ops,force) copy
            set drop($type,img,force) $_defops(copy,img)
            foreach mask [lsort -integer -decreasing $masklist] {
                lappend drop($type,ops) $mask $drop($type,mod,$mask)
            }
        }
    }
}


# ----------------------------------------------------------------------------
#  Command DropSite::setcursor
# ----------------------------------------------------------------------------
proc DropSite::setcursor { cursor } {
    catch {.drag configure -cursor $cursor}
}


# ----------------------------------------------------------------------------
#  Command DropSite::setoperation
# ----------------------------------------------------------------------------
proc DropSite::setoperation { op } {
    variable _curop
    variable _dragops
    variable _target
    variable _type
    upvar \#0 DropSite::$_target drop

    if { [info exist drop($_type,ops,$op)] &&
         $_dragops($drop($_type,ops,$op)) } {
        set _curop $op
    } else {
        # force to a copy operation
        set _curop force
    }
}


# ----------------------------------------------------------------------------
#  Command DropSite::_init_drag
# ----------------------------------------------------------------------------
proc DropSite::_init_drag { top evt source state X Y type ops data } {
    variable _top
    variable _source
    variable _type
    variable _data
    variable _target
    variable _status
    variable _state
    variable _dragops
    variable _opw
    variable _evt

    if {[info exists _dragops]} {
        unset _dragops
    }
    array set _dragops {copy 1 move 0 link 0}
    foreach op $ops {
        set _dragops($op) 1
    }
    set _target ""
    set _status  0
    set _top     $top
    set _source  $source
    set _type    $type
    set _data    $data

    label $_opw -relief flat -bd 0 -highlightthickness 0 \
        -foreground black -background white

    bind $top <ButtonRelease-$evt> {DropSite::_release %X %Y}
    bind $top <B$evt-Motion>       {DropSite::_motion  %X %Y}
    bind $top <Motion>             {DropSite::_release %X %Y}
    set _state $state
    set _evt   $evt
    _motion $X $Y
}


# ----------------------------------------------------------------------------
#  Command DropSite::_update_operation
# ----------------------------------------------------------------------------
proc DropSite::_update_operation { state } {
    variable _top
    variable _status
    variable _state

    if { $_status & 3 } {
        set _state $state
        _motion [winfo pointerx $_top] [winfo pointery $_top]
    }
}


# ----------------------------------------------------------------------------
#  Command DropSite::_compute_operation
# ----------------------------------------------------------------------------
proc DropSite::_compute_operation { target state type } {
    variable  _curop
    variable  _dragops
    upvar \#0 DropSite::$target drop

    foreach {mask op} $drop($type,ops) {
        if { ($state & $mask) == $mask } {
            if { $_dragops($drop($type,ops,$op)) } {
                set _curop $op
                return
            }
        }
    }
    set _curop force
}


# ----------------------------------------------------------------------------
#  Command DropSite::_draw_operation
# ----------------------------------------------------------------------------
proc DropSite::_draw_operation { target type } {
    variable _opw
    variable _curop
    variable _dragops
    variable _tabops
    variable _status

    upvar \#0 DropSite::$target drop

    if { !($_status & 1) } {
        catch {place forget $_opw}
        return
    }

    if { 0 } {
    if { ![info exist drop($type,ops,$_curop)] ||
         !$_dragops($drop($type,ops,$_curop)) } {
        # force to a copy operation
        set _curop copy
        catch {
            $_opw configure -bitmap $_tabops(img,copy)
            place $_opw -relx 1 -rely 1 -anchor se
        }
    }
    } elseif { [string equal $_curop "default"] } {
        catch {place forget $_opw}
    } else {
        catch {
            $_opw configure -bitmap $drop($type,img,$_curop)
            place $_opw -relx 1 -rely 1 -anchor se
        }
    }
}


# ----------------------------------------------------------------------------
#  Command DropSite::_motion
# ----------------------------------------------------------------------------
proc DropSite::_motion { X Y } {
    variable _top
    variable _target
    variable _status
    variable _state
    variable _curop
    variable _type
    variable _data
    variable _source
    variable _evt

    set script [bind $_top <B$_evt-Motion>]
    bind $_top <B$_evt-Motion> {}
    bind $_top <Motion>        {}
    wm geometry $_top "+[expr {$X+1}]+[expr {$Y+1}]"
    update
    if { ![winfo exists $_top] } {
        return
    }
    set path [winfo containing $X $Y]
    if { ![string equal $path $_target] } {
        # path != current target
        if { $_status & 2 } {
            # current target is valid and has recall status
            # generate leave event
            upvar   \#0 DropSite::$_target drop
            uplevel \#0 $drop(overcmd) [list $_target $_source leave $X $Y $_curop $_type $_data]
        }
        set _target $path
        upvar \#0 DropSite::$_target drop
        if { [info exists drop($_type,ops)] } {
            # path is a valid target
            _compute_operation $_target $_state $_type
            if { $drop(overcmd) != "" } {
                set arg     [list $_target $_source enter $X $Y $_curop $_type $_data]
                set _status [uplevel \#0 $drop(overcmd) $arg]
            } else {
                set _status 1
                catch {$_top configure -cursor based_arrow_down}
            }
            _draw_operation $_target $_type
            update
            catch {
                bind $_top <B$_evt-Motion> {DropSite::_motion  %X %Y}
                bind $_top <Motion>        {DropSite::_release %X %Y}
            }
            return
        } else {
            set _status 0
            catch {$_top configure -cursor dot}
            _draw_operation "" ""
        }
    } elseif { $_status & 2 } {
        upvar \#0 DropSite::$_target drop
        _compute_operation $_target $_state $_type
        set arg     [list $_target $_source motion $X $Y $_curop $_type $_data]
        set _status [uplevel \#0 $drop(overcmd) $arg]
        _draw_operation $_target $_type
    }
    update
    catch {
        bind $_top <B$_evt-Motion> {DropSite::_motion  %X %Y}
        bind $_top <Motion>        {DropSite::_release %X %Y}
    }
}



# ----------------------------------------------------------------------------
#  Command DropSite::_release
# ----------------------------------------------------------------------------
proc DropSite::_release { X Y } {
    variable _target
    variable _status
    variable _curop
    variable _source
    variable _type
    variable _data

    if { $_status & 1 } {
        upvar \#0 DropSite::$_target drop

        set res [uplevel \#0 $drop(dropcmd) [list $_target $_source $X $Y $_curop $_type $_data]]
        DragSite::_end_drag $_source $_target $drop($_type,ops,$_curop) $_type $_data $res
    } else {
        if { $_status & 2 } {
            # notify leave event
            upvar \#0 DropSite::$_target drop
            uplevel \#0 $drop(overcmd) [list $_target $_source leave $X $Y $_curop $_type $_data]
        }
        DragSite::_end_drag $_source "" "" $_type $_data 0
    }
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
















































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/dynhelp.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
# ----------------------------------------------------------------------------
#  dynhelp.tcl
#  This file is part of Unifix BWidget Toolkit
#  $Id: dynhelp.tcl,v 1.20.2.1 2009/08/12 07:20:21 oehhar Exp $
# ----------------------------------------------------------------------------
#  Index of commands:
#     - DynamicHelp::configure
#     - DynamicHelp::include
#     - DynamicHelp::sethelp
#     - DynamicHelp::register
#     - DynamicHelp::_motion_balloon
#     - DynamicHelp::_motion_info
#     - DynamicHelp::_leave_info
#     - DynamicHelp::_menu_info
#     - DynamicHelp::_show_help
#     - DynamicHelp::_init
# ----------------------------------------------------------------------------

namespace eval DynamicHelp {
    Widget::define DynamicHelp dynhelp -classonly

    if {$::tcl_version >= 8.5} {
        set fontdefault TkTooltipFont
    } elseif {$Widget::_aqua} {
        set fontdefault {helvetica 11}
    } else {
        set fontdefault {helvetica 8}
    }

    Widget::declare DynamicHelp [list\
        {-foreground     TkResource black         0 label}\
        {-topbackground  TkResource black         0 {label -foreground}}\
        {-background     TkResource "#FFFFC0"     0 label}\
        {-borderwidth    TkResource 1             0 label}\
        {-justify        TkResource left          0 label}\
        [list -font      TkResource $fontdefault  0 label]\
        {-delay          Int        600           0 "%d >= 100 & %d <= 2000"}\
	{-state          Enum       "normal"      0 {normal disabled}}\
        {-padx           TkResource 1             0 label}\
        {-pady           TkResource 1             0 label}\
        {-bd             Synonym    -borderwidth}\
        {-bg             Synonym    -background}\
        {-fg             Synonym    -foreground}\
        {-topbg          Synonym    -topbackground}\
    ]

    proc use {} {}

    variable _registered
    variable _canvases
    variable _texts

    variable _top     ".help_shell"
    variable _id      ""
    variable _delay   600
    variable _current_balloon ""
    variable _current_variable ""
    variable _saved

    Widget::init DynamicHelp $_top {}

    bind BwHelpBalloon <Enter>   {DynamicHelp::_motion_balloon enter  %W %X %Y}
    bind BwHelpBalloon <Motion>  {DynamicHelp::_motion_balloon motion %W %X %Y}
    bind BwHelpBalloon <Leave>   {DynamicHelp::_motion_balloon leave  %W %X %Y}
    bind BwHelpBalloon <Button>  {DynamicHelp::_motion_balloon button %W %X %Y}
    bind BwHelpBalloon <Destroy> {DynamicHelp::_unset_help %W}

    bind BwHelpVariable <Enter>   {DynamicHelp::_motion_info %W}
    bind BwHelpVariable <Leave>   {DynamicHelp::_leave_info  %W}
    bind BwHelpVariable <Destroy> {DynamicHelp::_unset_help  %W}

    bind BwHelpMenu <<MenuSelect>> {DynamicHelp::_menu_info select %W}
    bind BwHelpMenu <Unmap>        {DynamicHelp::_menu_info unmap  %W}
    bind BwHelpMenu <Destroy>      {DynamicHelp::_unset_help %W}
}


# ----------------------------------------------------------------------------
#  Command DynamicHelp::configure
# ----------------------------------------------------------------------------
proc DynamicHelp::configure { args } {
    variable _top
    variable _delay

    set res [Widget::configure $_top $args]
    if { [Widget::hasChanged $_top -delay val] } {
        set _delay $val
    }

    return $res
}


# ----------------------------------------------------------------------------
#  Command DynamicHelp::include
# ----------------------------------------------------------------------------
proc DynamicHelp::include { class type } {
    set helpoptions [list \
	    [list -helptext String "" 0] \
	    [list -helpvar  String "" 0] \
	    [list -helpcmd  String "" 0] \
	    [list -helptype Enum $type 0 [list balloon variable]] \
	    ]
    Widget::declare $class $helpoptions
}


# ----------------------------------------------------------------------------
#  Command DynamicHelp::sethelp
# ----------------------------------------------------------------------------
proc DynamicHelp::sethelp { path subpath {force 0}} {
    foreach {ctype ctext cvar} [Widget::hasChangedX $path \
	    -helptype -helptext -helpvar] break
    if { $force || $ctype || $ctext || $cvar } {
	set htype [Widget::cget $path -helptype]
        switch $htype {
            balloon {
                return [register $subpath balloon \
			[Widget::cget $path -helptext]]
            }
            variable {
                return [register $subpath variable \
			[Widget::cget $path -helpvar] \
			[Widget::cget $path -helptext]]
            }
        }
        return [register $subpath $htype]
    }
}

# ----------------------------------------------------------------------------
#  Command DynamicHelp::register
#
#  DynamicHelp::register path balloon  ?itemOrTag? text
#  DynamicHelp::register path variable ?itemOrTag? text varName
#  DynamicHelp::register path menu varName
#  DynamicHelp::register path menuentry index text
# ----------------------------------------------------------------------------
proc DynamicHelp::register { path type args } {
    variable _registered

    set len [llength $args]
    if {$type == "balloon"  && $len > 1} { 
	switch -exact -- [winfo class $path] {
	    "Canvas" { set type canvasBalloon  }
	    "Text" -
	    "Ctext" { set type textBalloon }
	}
    }
    if {$type == "variable" && $len > 2} { 
	switch -exact -- [winfo class $path] {
	    "Canvas" { set type canvasVariable }
	    "Text" -
	    "Ctext" { set type textVariable }
	}
    }

    if { ![winfo exists $path] } {
        _unset_help $path
        return 0
    }

    switch $type {
        balloon {
            set text [lindex $args 0]
	    if {$text == ""} {
		if {[info exists _registered($path,balloon)]} {
		    unset _registered($path,balloon)
		}
		return 0
	    }

	    _add_balloon $path $text
        }

        canvasBalloon {
            set tagOrItem  [lindex $args 0]
            set text       [lindex $args 1]
	    if {$text == ""} {
		if {[info exists _registered($path,$tagOrItem,balloon)]} {
		    unset _registered($path,$tagOrItem,balloon)
		}
		return 0
	    }

	    _add_canvas_balloon $path $text $tagOrItem
        }

        textBalloon {
            set tagOrItem  [lindex $args 0]
            set text       [lindex $args 1]
	    if {$text == ""} {
		if {[info exists _registered($path,$tagOrItem,balloon)]} {
		    unset _registered($path,$tagOrItem,balloon)
		}
		return 0
	    }

	    _add_text_balloon $path $text $tagOrItem
        }

        variable {
            set var  [lindex $args 0]
            set text [lindex $args 1]
	    if {$text == "" || $var == ""} {
		if {[info exists _registered($path,variable)]} {
		    unset _registered($path,variable)
		}
		return 0
	    }

	    _add_variable $path $text $var
        }

        canvasVariable {
            set tagOrItem  [lindex $args 0]
            set var        [lindex $args 1]
            set text       [lindex $args 2]
	    if {$text == "" || $var == ""} {
		if {[info exists _registered($path,$tagOrItem,variable)]} {
		    unset _registered($path,$tagOrItem,variable)
		}
		return 0
	    }

	    _add_canvas_variable $path $text $var $tagOrItem
        }

        textVariable {
            set tagOrItem  [lindex $args 0]
            set var        [lindex $args 1]
            set text       [lindex $args 2]
	    if {$text == "" || $var == ""} {
		if {[info exists _registered($path,$tagOrItem,variable)]} {
		    unset _registered($path,$tagOrItem,variable)
		}
		return 0
	    }

	    _add_text_variable $path $text $var $tagOrItem
        }

        menu {
            set var [lindex $args 0]
	    if {$var == ""} {
		set cpath [BWidget::clonename $path]
		if {[winfo exists $cpath]} { set path $cpath }
		if {[info exists _registered($path)]} {
		    unset _registered($path)
		}
		return 0
	    }

	    _add_menu $path $var
        }

        menuentry {
            set cpath [BWidget::clonename $path]
            if { [winfo exists $cpath] } { set path $cpath }
            if {![info exists _registered($path)]} { return 0 }

            set text  [lindex $args 1]
            set index [lindex $args 0]
	    if {$text == "" || $index == ""} {
		set idx [lsearch $_registered($path) [list $index *]]
		set _registered($path) [lreplace $_registered($path) $idx $idx]
		return 0
	    }

	    _add_menuentry $path $text $index
        }

        default {
            _unset_help $path
	    return 0
        }
    }

    return 1
}


proc DynamicHelp::add { path args } {
    variable _registered

    array set data {
        -type     balloon
        -text     ""
        -item     ""
        -index    -1
        -command  ""
        -variable ""
    }
    if {[winfo exists $path] && [winfo class $path] == "Menu"} {
	set data(-type) menu
    }
    array set data $args

    set item $path

    switch -- $data(-type) {
        "balloon" {
            if {$data(-item) != ""} {
		switch -exact -- [winfo class $path] {
		    "Canvas" {
			_add_canvas_balloon $path $data(-text) $data(-item)
			set item $path,$data(-item)
		    }
		    "Text" -
		    "Ctext" {
			_add_text_balloon $path $data(-text) $data(-item)
			set item $path,$data(-item)
		    }
		    default {
			_add_balloon $path $data(-text)
		    }
		}
            } else {
                _add_balloon $path $data(-text)
            }

	    if {$data(-variable) != ""} {
		set _registered($item,balloonVar) $data(-variable)
	    }
        }

        "variable" {
            set var $data(-variable)
            if {$data(-item) != ""} {
		switch -exact -- [winfo class $path] {
		    "Canvas" {
			_add_canvas_variable $path $data(-text) $var $data(-item)
			set item $path,$data(-item)
		    } 
		    "Text" -
		    "Ctext" {
			_add_text_variable $path $data(-text) $var $data(-item)
			set item $path,$data(-item)
		    }
		    default {
			_add_variable $path $data(-text) $var
		    }
		}
            } else {
                _add_variable $path $data(-text) $var
            }
        }

        "menu" {
            if {$data(-index) != -1} {
                set cpath [BWidget::clonename $path]
                if { [winfo exists $cpath] } { set path $cpath }
                if {![info exists _registered($path)]} { return 0 }
                _add_menuentry $path $data(-text) $data(-index)
                set item $path,$data(-index)
            } else {
                _add_menu $path $data(-variable)
            }
        }

        default {
            return 0
        }
    }

    if {$data(-command) != ""} {set _registered($item,command) $data(-command)}

    return 1
}


proc DynamicHelp::delete { path } {
    _unset_help $path
}


proc DynamicHelp::_add_bind_tag { path tag } {
    set evt [bindtags $path]
    set idx [lsearch $evt $tag]
    set evt [lreplace $evt $idx $idx]
    lappend evt $tag
    bindtags $path $evt
}


proc DynamicHelp::_add_balloon { path text } {
    variable _registered
    set _registered($path,balloon) $text
    _add_bind_tag $path BwHelpBalloon
}


proc DynamicHelp::_add_canvas_balloon { path text tagOrItem } {
    variable _canvases
    variable _registered

    set _registered($path,$tagOrItem,balloon) $text

    if {![info exists _canvases($path,balloon)]} {
        ## This canvas doesn't have the bindings yet.

        _add_bind_tag $path BwHelpBalloon

        $path bind BwHelpBalloon <Enter> \
            {DynamicHelp::_motion_balloon enter  %W %X %Y 1}
        $path bind BwHelpBalloon <Motion> \
            {DynamicHelp::_motion_balloon motion %W %X %Y 1}
        $path bind BwHelpBalloon <Leave> \
            {DynamicHelp::_motion_balloon leave  %W %X %Y 1}
        $path bind BwHelpBalloon <Button> \
            {DynamicHelp::_motion_balloon button %W %X %Y 1}

        set _canvases($path,balloon) 1
    }

    $path addtag BwHelpBalloon withtag $tagOrItem
}


proc DynamicHelp::_add_text_balloon { path text tagOrItem } {
    variable _texts
    variable _registered

    set _registered($path,$tagOrItem,balloon) $text

    if { ![info exists _texts($path,$tagOrItem,balloon)] } {
        $path tag bind $tagOrItem <Enter> \
            [list DynamicHelp::_motion_balloon enter  $path %X %Y 0 1]
        $path tag bind $tagOrItem <Motion> \
            [list DynamicHelp::_motion_balloon motion $path %X %Y 0 1]
        $path tag bind $tagOrItem <Leave> \
            [list DynamicHelp::_motion_balloon leave  $path %X %Y 0 1]
        $path tag bind $tagOrItem <Button> \
            [list DynamicHelp::_motion_balloon button $path %X %Y 0 1]

        set _texts($path,$tagOrItem,balloon) 1
    }
}


proc DynamicHelp::_add_variable { path text varName } {
    variable _registered
    set _registered($path,variable) [list $varName $text]
    _add_bind_tag $path BwHelpVariable
}


proc DynamicHelp::_add_canvas_variable { path text varName tagOrItem } {
    variable _canvases
    variable _registered

    set _registered($path,$tagOrItem,variable) [list $varName $text]

    if {![info exists _canvases($path,variable)]} {
        ## This canvas doesn't have the bindings yet.

        _add_bind_tag $path BwHelpVariable

        $path bind BwHelpVariable <Enter> \
            {DynamicHelp::_motion_info %W 1}
        $path bind BwHelpVariable <Motion> \
            {DynamicHelp::_motion_info %W 1}
        $path bind BwHelpVariable <Leave> \
            {DynamicHelp::_leave_info  %W 1}

        set _canvases($path,variable) 1
    }

    $path addtag BwHelpVariable withtag $tagOrItem
}


proc DynamicHelp::_add_text_variable { path text varName tagOrItem } {
    variable _texts
    variable _registered

    set _registered($path,$tagOrItem,variable) [list $varName $text]

    if {![info exists _texts($path,$tagOrItem,variable)]} {

        $path tag bind $tagOrItem <Enter> \
            [list DynamicHelp::_motion_info $path 0 1]
        $path tag bind $tagOrItem <Motion> \
            [list DynamicHelp::_motion_info $path 0 1]
        $path tag bind $tagOrItem <Leave> \
            [list DynamicHelp::_leave_info  $path 0 1]

        set _texts($path,$tagOrItem,variable) 1
    }
}


proc DynamicHelp::_add_menu { path varName } {
    variable _registered

    set cpath [BWidget::clonename $path]
    if { [winfo exists $cpath] } { set path $cpath }

    set _registered($path) [list $varName]
    _add_bind_tag $path BwHelpMenu
}


proc DynamicHelp::_add_menuentry { path text index } {
    variable _registered

    set idx  [lsearch $_registered($path) [list $index *]]
    set list [list $index $text]
    if { $idx == -1 } {
	lappend _registered($path) $list
    } else {
	set _registered($path) \
	    [lreplace $_registered($path) $idx $idx $list]
    }
}


# ----------------------------------------------------------------------------
#  Command DynamicHelp::_motion_balloon
# ----------------------------------------------------------------------------
proc DynamicHelp::_motion_balloon { type path x y {isCanvasItem 0} {isTextItem 0} } {
    variable _top
    variable _id
    variable _delay
    variable _current_balloon

    set w $path
    if {$isCanvasItem} { 
	set path [_get_canvas_path $path balloon] 
    } elseif {$isTextItem} {
	set path [_get_text_path $path balloon] 
    }

    if { $_current_balloon != $path && $type == "enter" } {
        set _current_balloon $path
        set type "motion"
        destroy $_top
    }
    if { $_current_balloon == $path } {
        if { $_id != "" } {
            after cancel $_id
            set _id ""
        }
        if { $type == "motion" } {
            if { ![winfo exists $_top] } {
                set cmd [list DynamicHelp::_show_help $path $w $x $y]
                set _id [after $_delay $cmd]
            }
            # Bug 923942 proposes to destroy on motion to remove dynhelp on motion.
            # this might be an optional behaviour in future versions
        } else {
            destroy $_top
            set _current_balloon ""
        }
    }
}


# ----------------------------------------------------------------------------
#  Command DynamicHelp::_motion_info
# ----------------------------------------------------------------------------
proc DynamicHelp::_motion_info { path {isCanvasItem 0} {isTextItem 0} } {
    variable _saved
    variable _registered
    variable _current_variable

    if {$isCanvasItem} { 
	set path [_get_canvas_path $path variable] 
    } elseif {$isTextItem} {
	set path [_get_text_path $path variable] 
    }

    if { $_current_variable != $path
        && [info exists _registered($path,variable)] } {

        set varName [lindex $_registered($path,variable) 0]
        if {![info exists _saved]} { set _saved [GlobalVar::getvar $varName] }
        set string [lindex $_registered($path,variable) 1]
        if {[info exists _registered($path,command)]} {
            set string [uplevel #0 $_registered($path,command)]
        }
        GlobalVar::setvar $varName $string
        set _current_variable $path
    }
}


# ----------------------------------------------------------------------------
#  Command DynamicHelp::_leave_info
#    Leave event may be called twice (in case of pointer grab)
# ----------------------------------------------------------------------------
proc DynamicHelp::_leave_info { path {isCanvasItem 0} {isTextItem 0} } {
    variable _saved
    variable _registered
    variable _current_variable

    if {$isCanvasItem} { 
	set path [_get_canvas_path $path variable] 
    } elseif {$isTextItem} { 
	set path [_get_text_path $path variable] 
    }

    if { [string equal $_current_variable $path] \
         && [info exists _registered($path,variable)] } {
        set varName [lindex $_registered($path,variable) 0]
        GlobalVar::setvar $varName $_saved
        unset _saved
        set _current_variable ""
    }
}


# ----------------------------------------------------------------------------
#  Command DynamicHelp::_menu_info
# ----------------------------------------------------------------------------
# We have to check for unmap event on Unix. On Windows, unmap
# is not delivered, but <<MenuSelect>> is triggered appropriately when menu
# is unmapped.
proc DynamicHelp::_menu_info { event path } {
    variable _registered

    if { [info exists _registered($path)] } {
        set index   [$path index active]
        set varName [lindex $_registered($path) 0]
        if { ![string equal $event "unmap"] &&
             ![string equal $index "none"] &&
             [set idx [lsearch $_registered($path) [list $index *]]] != -1 } {
	    set string [lindex [lindex $_registered($path) $idx] 1]
	    if {[info exists _registered($path,$index,command)]} {
		set string [uplevel #0 $_registered($path,$index,command)]
	    }
            GlobalVar::setvar $varName $string
        } else {
            GlobalVar::setvar $varName ""
        }
    }
}


# ----------------------------------------------------------------------------
#  Command DynamicHelp::_show_help
# ----------------------------------------------------------------------------
proc DynamicHelp::_show_help { path w x y } {
    variable _top
    variable _registered
    variable _id
    variable _delay

    if { [Widget::getoption $_top -state] == "disabled" } { return }

    if { [info exists _registered($path,balloon)] } {
        destroy  $_top

        set string $_registered($path,balloon)

	if {[info exists _registered($path,balloonVar)]} {
	    upvar #0 $_registered($path,balloonVar) var
	    if {[info exists var]} { set string $var }
	}

        if {[info exists _registered($path,command)]} {
            set string [uplevel #0 $_registered($path,command)]
        }

	if {$string == ""} { return }

        toplevel $_top -relief flat \
            -bg [Widget::getoption $_top -topbackground] \
            -bd [Widget::getoption $_top -borderwidth] \
            -screen [winfo screen $w]

        wm withdraw $_top
	if { $Widget::_aqua } {
	    ::tk::unsupported::MacWindowStyle style $_top help none
	} else {
	    wm overrideredirect $_top 1
	}

	catch { wm attributes $_top -topmost 1 }

        label $_top.label -text $string \
            -relief flat -bd 0 -highlightthickness 0 \
	    -padx       [Widget::getoption $_top -padx] \
	    -pady       [Widget::getoption $_top -pady] \
            -foreground [Widget::getoption $_top -foreground] \
            -background [Widget::getoption $_top -background] \
            -font       [Widget::getoption $_top -font] \
            -justify    [Widget::getoption $_top -justify]


        pack $_top.label -side left
        update idletasks

	if {![winfo exists $_top]} {return}

        set  scrwidth  [winfo vrootwidth  .]
        set  scrheight [winfo vrootheight .]
        set  width     [winfo reqwidth  $_top]
        set  height    [winfo reqheight $_top]

        # On windows multi screen configurations, coordinates may get outside
        # the main screen. We suppose that all screens have the same size
        # because it is not possible to query the size of the other screens.
        
        set screenx [expr {$x % $scrwidth} ]
        set screeny [expr {$y % $scrheight} ]
        
        # Increment the required size by the deplacement from the passed point
        incr width 8
        incr height 12
        
        if { $screenx+$width > $scrwidth } {
            set x [expr {$x + ($scrwidth - $screenx) - ($width - 8)}]
        } else {
            incr x 8
        }
        if { $screeny+$height > $scrheight } {
            set y [expr {$y - $height}]
        } else {
            incr y 12
        }

        wm geometry  $_top "+$x+$y"
        update idletasks

	if {![winfo exists $_top]} { return }
        wm deiconify $_top
        raise $_top
        # Sometimes the tooltip does not occur under
        # gnome/metacity on ubuntu.
        after 5;
    }
}

# ----------------------------------------------------------------------------
#  Command DynamicHelp::_unset_help
# ----------------------------------------------------------------------------
proc DynamicHelp::_unset_help { path } {
    variable _canvases
    variable _texts
    variable _registered
    variable _top
    variable _current_balloon

    if {[info exists _registered($path)]} { unset _registered($path) }
    if {[winfo exists $path]} {
	set cpath [BWidget::clonename $path]
	if {[info exists _registered($cpath)]} { unset _registered($cpath) }
    }
    array unset _canvases   $path,*
    array unset _texts      $path,*
    array unset _registered $path,*
    if {[string equal $path $_current_balloon]} {destroy $_top}
}

# ----------------------------------------------------------------------------
#  Command DynamicHelp::_get_canvas_path
# ----------------------------------------------------------------------------
proc DynamicHelp::_get_canvas_path { path type {item ""} } {
    variable _registered

    if {$item == ""} { set item [$path find withtag current] }

    ## Check the tags related to this item for the one that
    ## represents our text.  If we have text specific to this
    ## item or for 'all' items, they override any other tags.
    eval [list lappend tags $item all] [$path itemcget $item -tags]
    foreach tag $tags {
	set check $path,$tag
	if {![info exists _registered($check,$type)]} { continue }
	return $check
    }

    return $path
}

# ----------------------------------------------------------------------------
#  Command DynamicHelp::_get_text_path
# ----------------------------------------------------------------------------
proc DynamicHelp::_get_text_path { path type {item ""} } {
    variable _registered

    if {$item == ""} { set item [$path tag names current] }

    ## Check the tags related to this item for the one that
    ## represents our text.  If we have text specific to this
    ## item or for 'all' items, they override any other tags.
    eval [list lappend tags $item all] $item
    foreach tag $tags {
	set check $path,$tag
	if {![info exists _registered($check,$type)]} { continue }
	return $check
    }

    return $path
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/entry.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
# ------------------------------------------------------------------------------
#  entry.tcl
#  This file is part of Unifix BWidget Toolkit
#  $Id: entry.tcl,v 1.22.2.2 2012/04/02 09:53:41 oehhar Exp $
# ------------------------------------------------------------------------------
#  Index of commands:
#     - Entry::create
#     - Entry::configure
#     - Entry::cget
#     - Entry::_destroy
#     - Entry::_init_drag_cmd
#     - Entry::_end_drag_cmd
#     - Entry::_drop_cmd
#     - Entry::_over_cmd
#     - Entry::_auto_scroll
#     - Entry::_scroll
# ------------------------------------------------------------------------------

namespace eval Entry {
    Widget::define Entry entry DragSite DropSite DynamicHelp

    # Note:  -textvariable is pulled off of the tk entry and put onto the
    # BW Entry so that we avoid the TkResource test for it, which screws up
    # the existance/non-existance bits of the -textvariable.
    if {[Widget::theme]} {
	Widget::tkinclude Entry ttk::entry :cmd \
	    remove { -state -textvariable }
    } else {
	Widget::tkinclude Entry entry :cmd \
	    remove { -state -background -foreground -textvariable
		     -disabledforeground -disabledbackground }
    }

    set declare [list \
	    [list -state        Enum        normal 0  [list normal disabled]] \
	    [list -text         String      ""	   0] \
	    [list -textvariable String      ""     0] \
	    [list -editable     Boolean     1      0] \
	    [list -command      String      ""     0] \
	]
    if {![Widget::theme]} {
	lappend declare \
		[list -background   TkResource  ""	   0  entry] \
		[list -foreground   TkResource  ""	   0  entry] \
		[list -relief       TkResource  ""     0  entry] \
		[list -borderwidth  TkResource  ""     0  entry] \
		[list -fg           Synonym     -foreground] \
		[list -bg           Synonym     -background] \
		[list -bd           Synonym     -borderwidth]

	if {![package vsatisfies [package provide Tk] 8.4]} {
	    ## If we're not running version 8.4 or higher, get our
	    ## disabled resources from the button widget.
	    lappend declare [list -disabledforeground TkResource "" 0 button]
	    lappend declare [list -disabledbackground TkResource "" 0 \
							    {button -background}]
	} else {
	    lappend declare [list -disabledforeground TkResource "" 0 entry]
	    lappend declare [list -disabledbackground TkResource "" 0 entry]
	}
    }

    Widget::declare Entry $declare
    Widget::addmap Entry "" :cmd { -textvariable {} }

    DynamicHelp::include Entry balloon
    DragSite::include    Entry "" 3
    DropSite::include    Entry {
        TEXT    {move {}}
        FGCOLOR {move {}}
        BGCOLOR {move {}}
        COLOR   {move {}}
    }

    if {[Widget::theme]} {
        foreach event [bind TEntry] {
            bind BwEntry $event [bind TEntry $event]
        }
    }  else  {
        foreach event [bind Entry] {
            bind BwEntry $event [bind Entry $event]
        }
     }

    # Copy is kind of a special event.  It should be enabled when the
    # widget is editable but not disabled, and not when the widget is disabled.
    # To make this a bit easier to manage, we will handle it separately.

    bind BwEntry <<Copy>> {}
    bind BwEditableEntry <<Copy>> [bind Entry <<Copy>>]

    bind BwEntry <Return>          [list Entry::invoke %W]
    bind BwEntry <Destroy>         [list Entry::_destroy %W]
    bind BwDisabledEntry <Destroy> [list Entry::_destroy %W]
}


# ------------------------------------------------------------------------------
#  Command Entry::create
# ------------------------------------------------------------------------------
proc Entry::create { path args } {
    variable $path
    upvar 0 $path data

    array set maps [list Entry {} :cmd {}]
    array set maps [Widget::parseArgs Entry $args]

    set data(afterid) ""
    if {[Widget::theme]} {
        eval [list ttk::entry $path] $maps(:cmd)
    }  else  {
        eval [list entry $path] $maps(:cmd)
    }
    Widget::initFromODB Entry $path $maps(Entry)
    set state    [Widget::getMegawidgetOption $path -state]
    set editable [Widget::getMegawidgetOption $path -editable]
    set text     [Widget::getMegawidgetOption $path -text]
    if { $editable && [string equal $state "normal"] } {
        bindtags $path [list $path BwEntry [winfo toplevel $path] all]
        if {[Widget::theme]} {
            $path configure -takefocus 1
        } else {
            $path configure -takefocus 1 -insertontime 600
        }
    } else {
        bindtags $path [list $path BwDisabledEntry [winfo toplevel $path] all]
        if {[Widget::theme]} {
            $path configure -takefocus 0
        } else {
            $path configure -takefocus 0 -insertontime 0
        }
    }
    if { $editable == 0 } {
        $path configure -cursor left_ptr
    }
    if { [string equal $state "disabled"] } {
        if {[Widget::theme]} {
	    $path state disabled
	} else {
	    $path configure \
		-foreground [Widget::getMegawidgetOption $path -disabledforeground] \
		-background [Widget::getMegawidgetOption $path -disabledbackground]
	}
    } else {
	if {![Widget::theme]} {
	    $path configure \
		    -foreground [Widget::getMegawidgetOption $path -foreground] \
		    -background [Widget::getMegawidgetOption $path -background]
	}
	bindtags $path [linsert [bindtags $path] 2 BwEditableEntry]
    }
    if { [string length $text] } {
	set varName [$path cget -textvariable]
	if { ![string equal $varName ""] } {
	    uplevel \#0 [list set $varName [Widget::cget $path -text]]
	} else {
	    set validateState [$path cget -validate]
	    $path configure -validate none
	    $path delete 0 end
	    $path configure -validate $validateState
	    $path insert 0 [Widget::getMegawidgetOption $path -text]
	}
    }

    DragSite::setdrag $path $path Entry::_init_drag_cmd Entry::_end_drag_cmd 1
    DropSite::setdrop $path $path Entry::_over_cmd Entry::_drop_cmd 1
    DynamicHelp::sethelp $path $path 1

    Widget::create Entry $path
    proc ::$path { cmd args } \
    	"return \[Entry::_path_command [list $path] \$cmd \$args\]"
    return $path
}


# ------------------------------------------------------------------------------
#  Command Entry::configure
# ------------------------------------------------------------------------------
proc Entry::configure { path args } {
    # Cheat by setting the -text value to the current contents of the entry
    # This might be better hidden behind a function in ::Widget.
    set Widget::Entry::${path}:opt(-text) [$path:cmd get]

    set res [Widget::configure $path $args]

    # Extract the modified bits that we are interested in.
    if {[Widget::theme]} {
	set vars [list chstate cheditable chtext]
	set opts [list -state -editable -text]
    } else {
	set vars [list chstate cheditable chfg chdfg chbg chdbg chtext]
	set opts [list -state -editable -foreground -disabledforeground \
		    -background -disabledbackground -text]
    }
    foreach $vars [eval [linsert $opts 0 Widget::hasChangedX $path]] { break }

    if { $chstate || $cheditable } {
	set state [Widget::getMegawidgetOption $path -state]
	set editable [Widget::getMegawidgetOption $path -editable]
        set btags [bindtags $path]
        if { $editable && [string equal $state "normal"] } {
            set idx [lsearch $btags BwDisabledEntry]
            if { $idx != -1 } {
                bindtags $path [lreplace $btags $idx $idx BwEntry]
            }
            if {[Widget::theme]} {
                $path:cmd configure -takefocus 1
            } else {
                $path:cmd configure -takefocus 1 -insertontime 600
            }
        } else {
            set idx [lsearch $btags BwEntry]
            if { $idx != -1 } {
                bindtags $path [lreplace $btags $idx $idx BwDisabledEntry]
            }
            if {[Widget::theme]} {
                $path:cmd configure -takefocus 0
            } else {
                 $path:cmd configure -takefocus 0 -insertontime 0
            }
            if { [string equal [focus] $path] } {
                focus .
            }
        }
    }

    if { [Widget::theme] && $chstate } {
	set state [Widget::getMegawidgetOption $path -state]
        if { [string equal $state "disabled"] } {
            $path:cmd state disabled
        } else {
            $path:cmd state !disabled
        }
    }
    if { ![Widget::theme] && ($chstate || $chfg || $chdfg || $chbg || $chdbg) } {
	set state [Widget::getMegawidgetOption $path -state]
        if { [string equal $state "disabled"] } {
            $path:cmd configure \
                -fg [Widget::cget $path -disabledforeground] \
                -bg [Widget::cget $path -disabledbackground]
        } else {
            $path:cmd configure \
                -fg [Widget::cget $path -foreground] \
                -bg [Widget::cget $path -background]
        }
    }
    if { $chstate } {
	if { [string equal $state "disabled"] } {
	    set idx [lsearch -exact [bindtags $path] BwEditableEntry]
	    if { $idx != -1 } {
		bindtags $path [lreplace [bindtags $path] $idx $idx]
	    }
	} else {
	    set idx [expr {[lsearch [bindtags $path] Bw*Entry] + 1}]
	    bindtags $path [linsert [bindtags $path] $idx BwEditableEntry]
	}
    }

    if { $cheditable } {
        if { $editable } {
            $path:cmd configure -cursor xterm
        } else {
            $path:cmd configure -cursor left_ptr
        }
    }

    if { $chtext } {
	# Oh my lordee-ba-goordee
	# Do some magic to prevent multiple validation command firings.
	# If there is a textvariable, set that to the right value; if not,
	# disable validation, delete the old text, enable, then set the text.
	set varName [$path:cmd cget -textvariable]
	if { ![string equal $varName ""] } {
	    uplevel \#0 [list set $varName \
		    [Widget::getMegawidgetOption $path -text]]
	} else {
	    set validateState [$path:cmd cget -validate]
	    $path:cmd configure -validate none
	    $path:cmd delete 0 end
	    $path:cmd configure -validate $validateState
	    $path:cmd insert 0 [Widget::getMegawidgetOption $path -text]
	}
    }

    DragSite::setdrag $path $path Entry::_init_drag_cmd Entry::_end_drag_cmd
    DropSite::setdrop $path $path Entry::_over_cmd Entry::_drop_cmd
    DynamicHelp::sethelp $path $path

    return $res
}


# ------------------------------------------------------------------------------
#  Command Entry::cget
# ------------------------------------------------------------------------------
proc Entry::cget { path option } {
    if { [string equal "-text" $option] } {
	return [$path:cmd get]
    }
    Widget::cget $path $option
}


# ------------------------------------------------------------------------------
#  Command Entry::invoke
# ------------------------------------------------------------------------------
proc Entry::invoke { path } {
    if {[llength [set cmd [Widget::getMegawidgetOption $path -command]]]} {
        uplevel \#0 $cmd
    }
}


# ------------------------------------------------------------------------------
#  Command Entry::_path_command
# ------------------------------------------------------------------------------
proc Entry::_path_command { path cmd larg } {
    switch -exact -- $cmd {
        configure - cget - invoke {
            return [eval [linsert $larg 0 Entry::$cmd $path]]
        }
        default {
            return [uplevel 2 [linsert $larg 0 $path:cmd $cmd]]
        }
    }
}


# ------------------------------------------------------------------------------
#  Command Entry::_init_drag_cmd
# ------------------------------------------------------------------------------
proc Entry::_init_drag_cmd { path X Y top } {
    variable $path
    upvar 0  $path data

    if {[llength [set cmd [Widget::getoption $path -draginitcmd]]]} {
        return [uplevel \#0 $cmd [list $path $X $Y $top]]
    }
    set type [Widget::getoption $path -dragtype]
    if { $type == "" } {
        set type "TEXT"
    }
    if { [set drag [$path get]] != "" } {
        if { [$path:cmd selection present] } {
            set idx  [$path:cmd index @[expr {$X-[winfo rootx $path]}]]
            set sel0 [$path:cmd index sel.first]
            set sel1 [expr {[$path:cmd index sel.last]-1}]
            if { $idx >=  $sel0 && $idx <= $sel1 } {
                set drag [string range $drag $sel0 $sel1]
                set data(dragstart) $sel0
                set data(dragend)   [expr {$sel1+1}]
                if { ![Widget::getoption $path -editable] ||
                     [Widget::getoption $path -state] == "disabled" } {
                    return [list $type {copy} $drag]
                } else {
                    return [list $type {copy move} $drag]
                }
            }
        } else {
            set data(dragstart) 0
            set data(dragend)   end
            if { ![Widget::getoption $path -editable] ||
                 [Widget::getoption $path -state] == "disabled" } {
                return [list $type {copy} $drag]
            } else {
                return [list $type {copy move} $drag]
            }
        }
    }
}


# ------------------------------------------------------------------------------
#  Command Entry::_end_drag_cmd
# ------------------------------------------------------------------------------
proc Entry::_end_drag_cmd { path target op type dnddata result } {
    variable $path
    upvar 0  $path data

    if {[llength [set cmd [Widget::getoption $path -dragendcmd]]]} {
        return [uplevel \#0 $cmd [list $path $target $op $type $dnddata $result]]
    }
    if { $result && $op == "move" && $path != $target } {
        $path:cmd delete $data(dragstart) $data(dragend)
    }
}


# ------------------------------------------------------------------------------
#  Command Entry::_drop_cmd
# ------------------------------------------------------------------------------
proc Entry::_drop_cmd { path source X Y op type dnddata } {
    variable $path
    upvar 0  $path data

    if { $data(afterid) != "" } {
        after cancel $data(afterid)
        set data(afterid) ""
    }
    if {[llength [set cmd [Widget::getoption $path -dropcmd]]]} {
        set idx [$path:cmd index @[expr {$X-[winfo rootx $path]}]]
        return [uplevel \#0 $cmd [list $path $source $idx $op $type $dnddata]]
    }
    if { $type == "COLOR" || $type == "FGCOLOR" } {
        configure $path -foreground $dnddata
    } elseif { $type == "BGCOLOR" } {
        configure $path -background $dnddata
    } else {
        $path:cmd icursor @[expr {$X-[winfo rootx $path]}]
        if { $op == "move" && $path == $source } {
            $path:cmd delete $data(dragstart) $data(dragend)
        }
        set sel0 [$path index insert]
        $path:cmd insert insert $dnddata
        set sel1 [$path index insert]
        $path:cmd selection range $sel0 $sel1
    }
    return 1
}


# ------------------------------------------------------------------------------
#  Command Entry::_over_cmd
# ------------------------------------------------------------------------------
proc Entry::_over_cmd { path source event X Y op type dnddata } {
    variable $path
    upvar 0  $path data

    set x [expr {$X-[winfo rootx $path]}]
    if { [string equal $event "leave"] } {
        if { [string length $data(afterid)] } {
            after cancel $data(afterid)
            set data(afterid) ""
        }
    } elseif { [_auto_scroll $path $x] } {
        return 2
    }

    if {[llength [set cmd [Widget::getoption $path -dropovercmd]]]} {
        set x   [expr {$X-[winfo rootx $path]}]
        set idx [$path:cmd index @$x]
        set res [uplevel \#0 $cmd [list $path $source $event $idx $op $type $dnddata]]
        return $res
    }

    if { [string equal $type "COLOR"]   ||
         [string equal $type "FGCOLOR"] ||
         [string equal $type "BGCOLOR"] } {
        DropSite::setcursor based_arrow_down
        return 1
    }
    if { [Widget::getoption $path -editable]
	&& [string equal [Widget::getoption $path -state] "normal"] } {
        if { ![string equal $event "leave"] } {
            $path:cmd selection clear
            $path:cmd icursor @$x
            DropSite::setcursor based_arrow_down
            return 3
        }
    }
    DropSite::setcursor dot
    return 0
}


# ------------------------------------------------------------------------------
#  Command Entry::_auto_scroll
# ------------------------------------------------------------------------------
proc Entry::_auto_scroll { path x } {
    variable $path
    upvar 0  $path data

    set xmax [winfo width $path]
    if { $x <= 10 && [$path:cmd index @0] > 0 } {
        if { $data(afterid) == "" } {
            set data(afterid) [after 100 [list Entry::_scroll $path -1 $x $xmax]]
            DropSite::setcursor sb_left_arrow
        }
        return 1
    } else {
        if { $x >= $xmax-10 && [$path:cmd index @$xmax] < [$path:cmd index end] } {
            if { $data(afterid) == "" } {
                set data(afterid) [after 100 [list Entry::_scroll $path 1 $x $xmax]]
                DropSite::setcursor sb_right_arrow
            }
            return 1
        } else {
            if { $data(afterid) != "" } {
                after cancel $data(afterid)
                set data(afterid) ""
            }
        }
    }
    return 0
}


# ------------------------------------------------------------------------------
#  Command Entry::_scroll
# ------------------------------------------------------------------------------
proc Entry::_scroll { path dir x xmax } {
    variable $path
    upvar 0  $path data

    $path:cmd xview scroll $dir units
    $path:cmd icursor @$x
    if { ($dir == -1 && [$path:cmd index @0] > 0) ||
         ($dir == 1  && [$path:cmd index @$xmax] < [$path:cmd index end]) } {
        set data(afterid) [after 100 [list Entry::_scroll $path $dir $x $xmax]]
    } else {
        set data(afterid) ""
        DropSite::setcursor dot
    }
}


# ------------------------------------------------------------------------------
#  Command Entry::_destroy
# ------------------------------------------------------------------------------
proc Entry::_destroy { path } {
    variable $path
    upvar 0 $path data
    Widget::destroy $path
    unset data
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/font.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
# ----------------------------------------------------------------------------
#  font.tcl
#  This file is part of Unifix BWidget Toolkit
# ----------------------------------------------------------------------------
#  Index of commands:
#     - SelectFont::create
#     - SelectFont::configure
#     - SelectFont::cget
#     - SelectFont::_draw
#     - SelectFont::_destroy
#     - SelectFont::_modstyle
#     - SelectFont::_update
#     - SelectFont::_getfont
#     - SelectFont::_init
# ----------------------------------------------------------------------------

namespace eval SelectFont {
    Widget::define SelectFont font Dialog LabelFrame ScrolledWindow

    Widget::declare SelectFont {
        {-title		String		"Font selection" 0}
        {-parent	String		"" 0}
        {-background	TkResource	"" 0 frame}

        {-type		Enum		dialog        0 {dialog toolbar}}
        {-font		TkResource	""            0 label}
	{-initialcolor	String		""            0}
	{-families	String		"all"         1}
	{-querysystem	Boolean		1             0}
	{-nosizes	Boolean		0             1}
	{-styles	String		"bold italic underline overstrike" 1}
        {-command	String		""            0}
        {-sampletext	String		"Sample Text" 0}
        {-bg		Synonym		-background}
    }

    variable _families
    variable _styleOff
    array set _styleOff [list bold normal italic roman]
    variable _sizes     {4 5 6 7 8 9 10 11 12 13 14 15 16 \
	    17 18 19 20 21 22 23 24}
    
    # Set up preset lists of fonts, so the user can avoid the painfully slow
    # loadfont process if desired.
    if { [string equal $::tcl_platform(platform) "windows"] } {
	set presetVariable [list	\
		7x14			\
		Arial			\
		{Arial Narrow}		\
		{Lucida Sans}		\
		{MS Sans Serif}		\
		{MS Serif}		\
		{Times New Roman}	\
		]
	set presetFixed    [list	\
		6x13			\
		{Courier New}		\
		FixedSys		\
		Terminal		\
		]
	set presetAll      [list	\
		6x13			\
		7x14			\
		Arial			\
		{Arial Narrow}		\
		{Courier New}		\
		FixedSys		\
		{Lucida Sans}		\
		{MS Sans Serif}		\
		{MS Serif}		\
		Terminal		\
		{Times New Roman}	\
		]
    } else {
	set presetVariable [list	\
		helvetica		\
		lucida			\
		lucidabright		\
		{times new roman}	\
		]
	set presetFixed    [list	\
		courier			\
		fixed			\
		{lucida typewriter}	\
		screen			\
		serif			\
		terminal		\
		]
	set presetAll      [list	\
		courier			\
		fixed			\
		helvetica		\
		lucida			\
		lucidabright		\
		{lucida typewriter}	\
		screen			\
		serif			\
		terminal		\
		{times new roman}	\
		]
    }
    array set _families [list \
	    presetvariable	$presetVariable	\
	    presetfixed		$presetFixed	\
	    presetall		$presetAll	\
	    ]

    variable _widget
}


# ----------------------------------------------------------------------------
#  Command SelectFont::create
# ----------------------------------------------------------------------------
proc SelectFont::create { path args } {
    variable _families
    variable _sizes
    variable $path
    upvar 0  $path data

    # Initialize the internal rep of the widget options
    Widget::init SelectFont "$path#SelectFont" $args

    if { [Widget::getoption "$path#SelectFont" -querysystem] } {
        loadfont [Widget::getoption "$path#SelectFont" -families]
    }

    set bg [Widget::getoption "$path#SelectFont" -background]
    set _styles [Widget::getoption "$path#SelectFont" -styles]
    if { [Widget::getoption "$path#SelectFont" -type] == "dialog" } {
        Dialog::create $path -modal local -anchor e -default 0 -cancel 1 \
	    -background $bg \
            -title  [Widget::getoption "$path#SelectFont" -title] \
            -parent [Widget::getoption "$path#SelectFont" -parent]

        set frame [Dialog::getframe $path]
        set topf  [frame $frame.topf -relief flat -borderwidth 0 -background $bg]

        set labf1 [LabelFrame::create $topf.labf1 -text "Font" -name font \
                       -side top -anchor w -relief flat -background $bg]
        set sw    [ScrolledWindow::create [LabelFrame::getframe $labf1].sw \
                       -background $bg]
        set lbf   [listbox $sw.lb \
                       -height 5 -width 25 -exportselection false -selectmode browse]
        ScrolledWindow::setwidget $sw $lbf
        LabelFrame::configure $labf1 -focus $lbf
	if { [Widget::getoption "$path#SelectFont" -querysystem] } {
	    set fam [Widget::getoption "$path#SelectFont" -families]
	} else {
	    set fam "preset"
	    append fam [Widget::getoption "$path#SelectFont" -families]
	}
        eval [list $lbf insert end] $_families($fam)
        set script "set [list SelectFont::${path}(family)] \[%W curselection\];\
		        SelectFont::_update [list $path]"
        bind $lbf <ButtonRelease-1> $script
        bind $lbf <space>           $script
	bind $lbf <1>               [list focus %W]
	bind $lbf <Up> $script
	bind $lbf <Down> $script
        pack $sw -fill both -expand yes

        set labf2 [LabelFrame::create $topf.labf2 -text "Size" -name size \
                       -side top -anchor w -relief flat -background $bg]
        set sw    [ScrolledWindow::create [LabelFrame::getframe $labf2].sw \
                       -scrollbar vertical -background $bg]
        set lbs   [listbox $sw.lb \
                       -height 5 -width 6 -exportselection false -selectmode browse]
        ScrolledWindow::setwidget $sw $lbs
        LabelFrame::configure $labf2 -focus $lbs
        eval [list $lbs insert end] $_sizes
        set script "set [list SelectFont::${path}(size)] \[%W curselection\];\
			SelectFont::_update [list $path]"
        bind $lbs <ButtonRelease-1> $script
        bind $lbs <space>           $script
	bind $lbs <1>               [list focus %W]
	bind $lbs <Up> $script
	bind $lbs <Down> $script
        pack $sw -fill both -expand yes

        set labf3 [LabelFrame::create $topf.labf3 -text "Style" -name style \
                       -side top -anchor w -relief sunken -bd 1 -background $bg]
        set subf  [LabelFrame::getframe $labf3]
        foreach st $_styles {
            set name [lindex [BWidget::getname $st] 0]
            if { $name == "" } {
                set name [string toupper $name 0]
            }
            checkbutton $subf.$st -text $name \
                -variable   SelectFont::$path\($st\) \
                -background $bg \
                -command    [list SelectFont::_update $path]
            bind $subf.$st <Return> break
            pack $subf.$st -anchor w
        }
        LabelFrame::configure $labf3 -focus $subf.[lindex $_styles 0]

        pack $labf1 -side left -anchor n -fill both -expand yes
	if { ![Widget::getoption "$path#SelectFont" -nosizes] } {
	        pack $labf2 -side left -anchor n -fill both -expand yes -padx 8
	}
        pack $labf3 -side left -anchor n -fill both -expand yes

        set botf [frame $frame.botf -width 100 -height 50 \
                      -bg white -bd 0 -relief flat \
                      -highlightthickness 1 -takefocus 0 \
                      -highlightbackground black \
                      -highlightcolor black]

        set lab  [label $botf.label \
                      -background white -foreground black \
                      -borderwidth 0 -takefocus 0 -highlightthickness 0 \
                      -text [Widget::getoption "$path#SelectFont" -sampletext]]
        place $lab -relx 0.5 -rely 0.5 -anchor c

	pack $topf -pady 4 -fill both -expand yes

	if { [Widget::getoption "$path#SelectFont" -initialcolor] != ""} {
		set thecolor [Widget::getoption "$path#SelectFont" -initialcolor]
		set colf [frame $frame.colf]
			
		set frc [frame $colf.frame -width 50 -height 20 -bg $thecolor -bd 0 -relief flat\
			-highlightthickness 1 -takefocus 0 \
			-highlightbackground black \
			-highlightcolor black]
			
		set script "set [list SelectFont::${path}(fontcolor)] \[tk_chooseColor -parent $colf.button -initialcolor \[set [list SelectFont::${path}(fontcolor)]\]\];\
			SelectFont::_update [list $path]"
		
		set name [lindex [BWidget::getname colorPicker] 0]
		if { $name == "" } {
			set name "Color..."
		}
		set but  [button $colf.button -command $script \
			-text $name]
		
		$lab configure -foreground $thecolor
		$frc configure -bg $thecolor
		
		pack $but -side left
		pack $frc -side left -padx 5
		
		set data(frc) $frc
		set data(fontcolor) $thecolor

		pack $colf -pady 4 -fill x -expand true        
	
	} else {
		set data(fontcolor) -1
	}
	pack $botf -pady 4 -fill x

        Dialog::add $path -name ok
        Dialog::add $path -name cancel

        set data(label) $lab
        set data(lbf)   $lbf
        set data(lbs)   $lbs

        _getfont $path

	Widget::create SelectFont $path 0

        return [_draw $path]
    } else {
	if { [Widget::getoption "$path#SelectFont" -querysystem] } {
	    set fams [Widget::getoption "$path#SelectFont" -families]
	} else {
	    set fams "preset"
	    append fams [Widget::getoption "$path#SelectFont" -families]
	}
	if {[Widget::theme]} {
	    ttk::frame $path
	    set lbf [ttk::combobox $path.font \
			 -takefocus 0 -exportselection 0 \
			 -values   $_families($fams) \
			 -textvariable SelectFont::${path}(family) \
			 -state readonly]
	    set lbs [ttk::combobox $path.size \
			 -takefocus 0 -exportselection 0 \
			 -width    4 \
			 -values   $_sizes \
			 -textvariable SelectFont::${path}(size) \
			 -state readonly]
	    bind $lbf <<ComboboxSelected>> [list SelectFont::_update $path]
	    bind $lbs <<ComboboxSelected>> [list SelectFont::_update $path]
	} else {
	    frame $path -background $bg
	    set lbf [ComboBox::create $path.font \
			 -highlightthickness 0 -takefocus 0 -background $bg \
			 -values   $_families($fams) \
			 -textvariable SelectFont::$path\(family\) \
			 -editable 0 \
			 -modifycmd [list SelectFont::_update $path]]
	    set lbs [ComboBox::create $path.size \
			 -highlightthickness 0 -takefocus 0 -background $bg \
			 -width    4 \
			 -values   $_sizes \
			 -textvariable SelectFont::$path\(size\) \
			 -editable 0 \
			 -modifycmd [list SelectFont::_update $path]]
	}
	bind $path <Destroy> [list SelectFont::_destroy $path]
        pack $lbf -side left -anchor w
        pack $lbs -side left -anchor w -padx 4
        foreach st $_styles {
	    if {$::Widget::_theme} {
		ttk::checkbutton $path.$st -takefocus 0 \
		    -style BWSlim.Toolbutton \
		    -image [Bitmap::get $st] \
		    -variable SelectFont::${path}($st) \
		    -command [list SelectFont::_update $path]
	    } else {
		button $path.$st \
		    -highlightthickness 0 -takefocus 0 -padx 0 -pady 0 \
		    -background $bg \
		    -image [Bitmap::get $st] \
		    -command [list SelectFont::_modstyle $path $st]
	    }
            pack $path.$st -side left -anchor w
        }
        set data(label) ""
        set data(lbf)   $lbf
        set data(lbs)   $lbs
        _getfont $path

	return [Widget::create SelectFont $path]
    }

    return $path
}


# ----------------------------------------------------------------------------
#  Command SelectFont::configure
# ----------------------------------------------------------------------------
proc SelectFont::configure { path args } {
    set _styles [Widget::getoption "$path#SelectFont" -styles]

    set res [Widget::configure "$path#SelectFont" $args]

    if { [Widget::hasChanged "$path#SelectFont" -font font] } {
        _getfont $path
    }
    if { [Widget::hasChanged "$path#SelectFont" -background bg] } {
        switch -- [Widget::getoption "$path#SelectFont" -type] {
            dialog {
                Dialog::configure $path -background $bg
                set topf [Dialog::getframe $path].topf
                $topf configure -background $bg
                foreach labf {labf1 labf2} {
                    LabelFrame::configure $topf.$labf -background $bg
                    set subf [LabelFrame::getframe $topf.$labf]
                    ScrolledWindow::configure $subf.sw -background $bg
                    $subf.sw.lb configure -background $bg
                }
                LabelFrame::configure $topf.labf3 -background $bg
                set subf [LabelFrame::getframe $topf.labf3]
                foreach w [winfo children $subf] {
                    $w configure -background $bg
                }
            }
            toolbar {
                $path configure -background $bg
                ComboBox::configure $path.font -background $bg
                ComboBox::configure $path.size -background $bg
                foreach st $_styles {
                    $path.$st configure -background $bg
                }
            }
        }
    }
    return $res
}


# ----------------------------------------------------------------------------
#  Command SelectFont::cget
# ----------------------------------------------------------------------------
proc SelectFont::cget { path option } {
    return [Widget::cget "$path#SelectFont" $option]
}


# ----------------------------------------------------------------------------
#  Command SelectFont::loadfont
# ----------------------------------------------------------------------------
proc SelectFont::loadfont {{which all}} {
    variable _families

    # initialize families
    if {![info exists _families(all)]} {
	set _families(all) [lsort -dictionary [font families]]
    }
    if {[regexp {fixed|variable} $which] \
	    && ![info exists _families($which)]} {
	# initialize families
	set _families(fixed) {}
	set _families(variable) {}
	foreach family $_families(all) {
	    if { [font metrics [list $family] -fixed] } {
		lappend _families(fixed) $family
	    } else {
		lappend _families(variable) $family
	    }
	}
    }
    return
}


# ----------------------------------------------------------------------------
#  Command SelectFont::_draw
# ----------------------------------------------------------------------------
proc SelectFont::_draw { path } {
    variable $path
    upvar 0  $path data

    $data(lbf) selection clear 0 end
    $data(lbf) selection set $data(family)
    $data(lbf) activate $data(family)
    $data(lbf) see $data(family)
    $data(lbs) selection clear 0 end
    $data(lbs) selection set $data(size)
    $data(lbs) activate $data(size)
    $data(lbs) see $data(size)
    _update $path

    if { [Dialog::draw $path] == 0 } {
        set result [Widget::getoption "$path#SelectFont" -font]
    	set color $data(fontcolor)
	
	if { $color == "" } {
		set color #000000
	}

    } else {
        set result ""
        if {$data(fontcolor) == -1} {
            set color -1
        } else {
            set color ""
        }
    }
    unset data
    Widget::destroy "$path#SelectFont"
    destroy $path
    if { $color != -1 } {
    	return [list $result $color]
    } else {
    	return $result
    }
}


# ----------------------------------------------------------------------------
#  Command SelectFont::_modstyle
# ----------------------------------------------------------------------------
proc SelectFont::_modstyle { path style } {
    variable $path
    upvar 0  $path data

    $path.$style configure -relief [expr {$data($style) ? "raised" : "sunken"}]
    set data($style) [expr {!$data($style)}]
    _update $path
}


# ----------------------------------------------------------------------------
#  Command SelectFont::_update
# ----------------------------------------------------------------------------
proc SelectFont::_update { path } {
    variable _families
    variable _sizes
    variable _styleOff
    variable $path
    upvar 0  $path data

    set type [Widget::getoption "$path#SelectFont" -type]
    set _styles [Widget::getoption "$path#SelectFont" -styles]
    if { [Widget::getoption "$path#SelectFont" -querysystem] } {
	set fams [Widget::getoption "$path#SelectFont" -families]
    } else {
	set fams "preset"
	append fams [Widget::getoption "$path#SelectFont" -families]
    }
    if { $type == "dialog" } {
        set curs [$path:cmd cget -cursor]
        $path:cmd configure -cursor watch
    }
    if { [Widget::getoption "$path#SelectFont" -type] == "dialog" } {
        set font [list [lindex $_families($fams) $data(family)] \
		[lindex $_sizes $data(size)]]
    } else {
        set font [list $data(family) $data(size)]
    }
    foreach st $_styles {
        if { $data($st) } {
            lappend font $st
        } elseif {[info exists _styleOff($st)]} {
	    # This adds the default bold/italic value to a font
	    #lappend font $_styleOff($st)
	}
    }
    Widget::setoption "$path#SelectFont" -font $font
    if { $type == "dialog" } {
        $data(label) configure -font $font
        $path:cmd configure -cursor $curs
	if { ($data(fontcolor) != "") && ($data(fontcolor) != -1) } {
		$data(label) configure -foreground $data(fontcolor)
		$data(frc) configure -bg $data(fontcolor)
	} elseif { $data(fontcolor) == "" }  {
		#If no color is selected, restore previous one
		set data(fontcolor) [$data(label) cget -foreground]

	}
    } elseif { [set cmd [Widget::getoption "$path#SelectFont" -command]] != "" } {
        uplevel \#0 $cmd
    }
}


# ----------------------------------------------------------------------------
#  Command SelectFont::_getfont
# ----------------------------------------------------------------------------
proc SelectFont::_getfont { path } {
    variable _families
    variable _sizes
    variable $path
    upvar 0  $path data

    array set font [font actual [Widget::getoption "$path#SelectFont" -font]]
    set data(bold)       [expr {![string equal $font(-weight) "normal"]}]
    set data(italic)     [expr {![string equal $font(-slant)  "roman"]}]
    set data(underline)  $font(-underline)
    set data(overstrike) $font(-overstrike)
    set _styles [Widget::getoption "$path#SelectFont" -styles]
    if { [Widget::getoption "$path#SelectFont" -querysystem] } {
	set fams [Widget::getoption "$path#SelectFont" -families]
    } else {
	set fams "preset"
	append fams [Widget::getoption "$path#SelectFont" -families]
    }
    if { [Widget::getoption "$path#SelectFont" -type] == "dialog" } {
        set idxf [lsearch $_families($fams) $font(-family)]
        set idxs [lsearch $_sizes    $font(-size)]
        set data(family) [expr {$idxf >= 0 ? $idxf : 0}]
        set data(size)   [expr {$idxs >= 0 ? $idxs : 0}]
    } else {
	set data(family) $font(-family)
	set data(size)   $font(-size)
	if {![Widget::theme]} {
	    foreach st $_styles {
		$path.$st configure \
		    -relief [expr {$data($st) ? "sunken":"raised"}]
	    }
	}
    }
}


# ----------------------------------------------------------------------------
#  Command SelectFont::_destroy
# ----------------------------------------------------------------------------
proc SelectFont::_destroy { path } {
    variable $path
    upvar 0  $path data
    unset data
    Widget::destroy "$path#SelectFont"
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/images/bold.gif.

cannot compute difference between binary files

Deleted scriptlibs/bwidget-1.9.8/images/copy.gif.

cannot compute difference between binary files

Deleted scriptlibs/bwidget-1.9.8/images/cut.gif.

cannot compute difference between binary files

Deleted scriptlibs/bwidget-1.9.8/images/dragfile.gif.

cannot compute difference between binary files

Deleted scriptlibs/bwidget-1.9.8/images/dragicon.gif.

cannot compute difference between binary files

Deleted scriptlibs/bwidget-1.9.8/images/error.gif.

cannot compute difference between binary files

Deleted scriptlibs/bwidget-1.9.8/images/file.gif.

cannot compute difference between binary files

Deleted scriptlibs/bwidget-1.9.8/images/folder.gif.

cannot compute difference between binary files

Deleted scriptlibs/bwidget-1.9.8/images/hourglass.gif.

cannot compute difference between binary files

Deleted scriptlibs/bwidget-1.9.8/images/info.gif.

cannot compute difference between binary files

Deleted scriptlibs/bwidget-1.9.8/images/italic.gif.

cannot compute difference between binary files

Deleted scriptlibs/bwidget-1.9.8/images/minus.xbm.

1
2
3
4
5
#define minus_width 9
#define minus_height 9
static char minus_bits[] = {
 0xff,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x7d,0x01,0x01,0x01,0x01,0x01,0x01,
 0x01,0xff,0x01};
<
<
<
<
<










Deleted scriptlibs/bwidget-1.9.8/images/new.gif.

cannot compute difference between binary files

Deleted scriptlibs/bwidget-1.9.8/images/opcopy.xbm.

1
2
3
4
5
#define opcopy_width 11
#define opcopy_height 11
static char opcopy_bits[] = {
 0xff,0xff,0x01,0xfc,0x21,0xfc,0x21,0xfc,0x21,0xfc,0xfd,0xfd,0x21,0xfc,0x21,
 0xfc,0x21,0xfc,0x01,0xfc,0xff,0xff};
<
<
<
<
<










Deleted scriptlibs/bwidget-1.9.8/images/open.gif.

cannot compute difference between binary files

Deleted scriptlibs/bwidget-1.9.8/images/openfold.gif.

cannot compute difference between binary files

Deleted scriptlibs/bwidget-1.9.8/images/oplink.xbm.

1
2
3
4
5
#define oplink_width 11
#define oplink_height 11
static char oplink_bits[] = {
 0xff,0xff,0x01,0xfc,0xf1,0xfc,0xe1,0xfc,0xf1,0xfc,0xb9,0xfc,0x19,0xfc,0x09,
 0xfc,0x11,0xfc,0x01,0xfc,0xff,0xff};
<
<
<
<
<










Deleted scriptlibs/bwidget-1.9.8/images/opmove.xbm.

1
2
3
4
5
#define opmove_width 11
#define opmove_height 11
static char opmove_bits[] = {
 0xff,0xff,0x01,0xfc,0x01,0xfc,0x51,0xfc,0x89,0xfc,0xfd,0xfd,0x89,0xfc,0x51,
 0xfc,0x01,0xfc,0x01,0xfc,0xff,0xff};
<
<
<
<
<










Deleted scriptlibs/bwidget-1.9.8/images/overstrike.gif.

cannot compute difference between binary files

Deleted scriptlibs/bwidget-1.9.8/images/palette.gif.

cannot compute difference between binary files

Deleted scriptlibs/bwidget-1.9.8/images/passwd.gif.

cannot compute difference between binary files

Deleted scriptlibs/bwidget-1.9.8/images/paste.gif.

cannot compute difference between binary files

Deleted scriptlibs/bwidget-1.9.8/images/plus.xbm.

1
2
3
4
5
#define plus_width 9
#define plus_height 9
static char plus_bits[] = {
 0xff,0x01,0x01,0x01,0x11,0x01,0x11,0x01,0x7d,0x01,0x11,0x01,0x11,0x01,0x01,
 0x01,0xff,0x01};
<
<
<
<
<










Deleted scriptlibs/bwidget-1.9.8/images/print.gif.

cannot compute difference between binary files

Deleted scriptlibs/bwidget-1.9.8/images/question.gif.

cannot compute difference between binary files

Deleted scriptlibs/bwidget-1.9.8/images/redo.gif.

cannot compute difference between binary files

Deleted scriptlibs/bwidget-1.9.8/images/save.gif.

cannot compute difference between binary files

Deleted scriptlibs/bwidget-1.9.8/images/target.xbm.

1
2
3
4
5
6
7
8
9
#define target_width 24
#define target_height 24
static unsigned char target_bits[] = {
   0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00,
   0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x3e, 0xe0, 0x03, 0x3e, 0xe0, 0x03, 0x3e, 0xe0, 0x03, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00,
   0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
<
<
<
<
<
<
<
<
<


















Deleted scriptlibs/bwidget-1.9.8/images/underline.gif.

cannot compute difference between binary files

Deleted scriptlibs/bwidget-1.9.8/images/undo.gif.

cannot compute difference between binary files

Deleted scriptlibs/bwidget-1.9.8/images/warning.gif.

cannot compute difference between binary files

Deleted scriptlibs/bwidget-1.9.8/init.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
namespace eval Widget {}
proc Widget::_opt_defaults {{prio widgetDefault}} {
    if {$::tcl_version >= 8.4} {
	set plat [tk windowingsystem]
    } else {
	set plat $::tcl_platform(platform)
    }
    switch -exact $plat {
	"aqua" {
	}
	"win32" -
	"windows" {
	    #option add *Listbox.background	SystemWindow $prio
	    option add *ListBox.background	SystemWindow $prio
	    #option add *Button.padY		0 $prio
	    option add *ButtonBox.padY		0 $prio
	    option add *Dialog.padY		0 $prio
	    option add *Dialog.anchor		e $prio
	}
	"x11" -
	default {
	    option add *Scrollbar.width		12 $prio
	    option add *Scrollbar.borderWidth	1  $prio
	    option add *Dialog.separator	1  $prio
	    option add *MainFrame.relief	raised $prio
	    option add *MainFrame.separator	none   $prio
	}
    }
}
Widget::_opt_defaults

# Try to load lang file corresponding to current msgcat locale
proc Widget::_opt_lang {} {
    if {0 != [llength [info commands ::msgcat::mcpreferences]]} {
        set langs [::msgcat::mcpreferences]
    }
    lappend langs en

    foreach lang $langs {
        set l [file join $::BWIDGET::LIBRARY "lang" "$lang.rc"]
        if {(![catch {file readable $l} result]) && ($result)} {
            option read $l
            break
        }
    }
}
Widget::_opt_lang

## Add a TraverseIn binding to standard Tk widgets to handle some of
## the BWidget-specific things we do.
bind Entry   <<TraverseIn>> { %W selection range 0 end; %W icursor end }
bind Spinbox <<TraverseIn>> { %W selection range 0 end; %W icursor end }

bind all <Key-Tab>       { Widget::traverseTo [Widget::focusNext %W] }
bind all <<PrevWindow>>  { Widget::traverseTo [Widget::focusPrev %W] }
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<














































































































Deleted scriptlibs/bwidget-1.9.8/label.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
# ------------------------------------------------------------------------------
#  label.tcl
#  This file is part of Unifix BWidget Toolkit
#  $Id: label.tcl,v 1.10.2.3 2011/04/26 08:24:28 oehhar Exp $
# ------------------------------------------------------------------------------
#  Index of commands:
#     - Label::create
#     - Label::configure
#     - Label::cget
#     - Label::setfocus
#     - Label::_drag_cmd
#     - Label::_drop_cmd
#     - Label::_over_cmd
# ------------------------------------------------------------------------------

namespace eval Label {
    Widget::define Label label DragSite DropSite DynamicHelp

    if {$::Widget::_theme} {
        Widget::tkinclude Label label .l \
            remove { -foreground -text -textvariable -underline -state}
	} else {
        Widget::tkinclude Label label .l \
            remove { -foreground -text -textvariable -underline }
	}

    Widget::declare Label {
        {-name               String     ""     0}
        {-text               String     ""     0}
        {-textvariable       String     ""     0}
        {-underline          Int        -1     0 "%d >= -1"}
        {-focus              String     ""     0}
        {-foreground         TkResource ""     0 label}
        {-disabledforeground TkResource ""     0 button}
        {-state              Enum       normal 0  {normal disabled}}

        {-fg                 Synonym    -foreground}
    }

    DynamicHelp::include Label balloon
    DragSite::include    Label "" 1
    DropSite::include    Label {
        TEXT    {move {}}
        IMAGE   {move {}}
        BITMAP  {move {}}
        FGCOLOR {move {}}
        BGCOLOR {move {}}
        COLOR   {move {}}
    }

    bind BwLabel <FocusIn> [list Label::setfocus %W]
    bind BwLabel <Destroy> [list Label::_destroy %W]
}


# ------------------------------------------------------------------------------
#  Command Label::create
# ------------------------------------------------------------------------------
proc Label::create { path args } {
    array set maps [list Label {} .l {}]
    array set maps [Widget::parseArgs Label $args]
    frame $path -class Label -borderwidth 0 -highlightthickness 0 -relief flat -padx 0 -pady 0
    Widget::initFromODB Label $path $maps(Label)

    if {$::Widget::_theme} {
        eval [list ttk::label $path.l] $maps(.l)
    } else {
        eval [list label $path.l] $maps(.l)
	}

    if {$::Widget::_theme} {
        if { [Widget::cget $path -state] != "normal" } {
            $path.l state disabled
		}
    } else {
        if { [Widget::cget $path -state] == "normal" } {
            set fg [Widget::cget $path -foreground]
        } else {
            set fg [Widget::cget $path -disabledforeground]
        }
        $path.l configure -foreground $fg
	}

    set var [Widget::cget $path -textvariable]
    if {  $var == "" &&
          [Widget::cget $path -image] == "" &&
          ($::Widget::_theme || [Widget::cget $path -bitmap] == "")} {
        set desc [BWidget::getname [Widget::cget $path -name]]
        if { $desc != "" } {
            set text  [lindex $desc 0]
            set under [lindex $desc 1]
        } else {
            set text  [Widget::cget $path -text]
            set under [Widget::cget $path -underline]
        }
    } else {
        set under -1
        set text  ""
    }

    $path.l configure -text $text -textvariable $var \
	    -underline $under

    set accel [string tolower [string index $text $under]]
    if { $accel != "" } {
        bind [winfo toplevel $path] <Alt-$accel> "Label::setfocus $path"
    }

    bindtags $path   [list BwLabel [winfo toplevel $path] all]
    bindtags $path.l [list $path.l $path Label [winfo toplevel $path] all]
    pack $path.l -expand yes -fill both

    set dragendcmd [Widget::cget $path -dragendcmd]
    DragSite::setdrag $path $path.l Label::_init_drag_cmd $dragendcmd 1
    DropSite::setdrop $path $path.l Label::_over_cmd Label::_drop_cmd 1
    DynamicHelp::sethelp $path $path.l 1

    return [Widget::create Label $path]
}


# ------------------------------------------------------------------------------
#  Command Label::configure
# ------------------------------------------------------------------------------
proc Label::configure { path args } {
    set oldunder [$path.l cget -underline]
    if { $oldunder != -1 } {
        set oldaccel [string tolower [string index [$path.l cget -text] $oldunder]]
    } else {
        set oldaccel ""
    }
    set res [Widget::configure $path $args]

    set cfg  [Widget::hasChanged $path -foreground fg]
    set cst  [Widget::hasChanged $path -state state]

    if {$::Widget::_theme} {
        if { $cfg } {
            $path.l configure -foreground $fg
        }
        if { $cst } {
            if { $state == "normal" } {
                $path.l state !disabled
            } else {
                $path.l state disabled
            }
        }
    } else {
        set cdfg [Widget::hasChanged $path -disabledforeground dfg]
        if { $cst || $cfg || $cdfg } {
            if { $state == "normal" } {
                $path.l configure -fg $fg
            } else {
                $path.l configure -fg $dfg
            }
        }
	}

    set cv [Widget::hasChanged $path -textvariable var]
    set cb [Widget::hasChanged $path -image img]
    if {$::Widget::_theme} {
        set ci 0
        set bmp ""
	} else {
        set ci [Widget::hasChanged $path -bitmap bmp]
	}
    set cn [Widget::hasChanged $path -name name]
    set ct [Widget::hasChanged $path -text text]
    set cu [Widget::hasChanged $path -underline under]

    if { $cv || $cb || $ci || $cn || $ct || $cu } {
        if {  $var == "" && $img == "" && $bmp == "" } {
            set desc [BWidget::getname $name]
            if { $desc != "" } {
                set text  [lindex $desc 0]
                set under [lindex $desc 1]
            }
        } else {
            set under -1
            set text  ""
        }
        set top [winfo toplevel $path]
        if { $oldaccel != "" } {
            bind $top <Alt-$oldaccel> {}
        }
        set accel [string tolower [string index $text $under]]
        if { $accel != "" } {
            bind $top <Alt-$accel> [list Label::setfocus $path]
        }
        $path.l configure -text $text -underline $under -textvariable $var
    }

    set force [Widget::hasChanged $path -dragendcmd dragend]
    DragSite::setdrag $path $path.l Label::_init_drag_cmd $dragend $force
    DropSite::setdrop $path $path.l Label::_over_cmd Label::_drop_cmd
    DynamicHelp::sethelp $path $path.l

    return $res
}


# ------------------------------------------------------------------------------
#  Command Label::cget
# ------------------------------------------------------------------------------
proc Label::cget { path option } {
    return [Widget::cget $path $option]
}


# ----------------------------------------------------------------------------
#  Command Label::identify
# ----------------------------------------------------------------------------
proc Label::identify { path args } {
    eval $path.l identify $args
}


# ----------------------------------------------------------------------------
#  Command Label::instate
# ----------------------------------------------------------------------------
proc Label::instate { path args } {
    eval $path.l instate $args
}


# ----------------------------------------------------------------------------
#  Command Label::state
# ----------------------------------------------------------------------------
proc Label::state { path args } {
    eval $path.l state $args
}


# ------------------------------------------------------------------------------
#  Command Label::setfocus
# ------------------------------------------------------------------------------
proc Label::setfocus { path } {
    if { [string equal [Widget::cget $path -state] "normal"] } {
        set w [Widget::cget $path -focus]
        if { [winfo exists $w] && [Widget::focusOK $w] } {
            focus $w
        }
    }
}


# ------------------------------------------------------------------------------
#  Command Label::_init_drag_cmd
# ------------------------------------------------------------------------------
proc Label::_init_drag_cmd { path X Y top } {
    set path [winfo parent $path]
    if { [set cmd [Widget::cget $path -draginitcmd]] != "" } {
        return [uplevel \#0 $cmd [list $path $X $Y $top]]
    }
    if { [set data [$path.l cget -image]] != "" } {
        set type "IMAGE"
        pack [label $top.l -image $data]
    } elseif { [set data [$path.l cget -bitmap]] != "" } {
        set type "BITMAP"
        pack [label $top.l -bitmap $data]
    } else {
        set data [$path.l cget -text]
        set type "TEXT"
    }
    set usertype [Widget::getoption $path -dragtype]
    if { $usertype != "" } {
        set type $usertype
    }
    return [list $type {copy} $data]
}


# ------------------------------------------------------------------------------
#  Command Label::_drop_cmd
# ------------------------------------------------------------------------------
proc Label::_drop_cmd { path source X Y op type data } {
    set path [winfo parent $path]
    if { [set cmd [Widget::cget $path -dropcmd]] != "" } {
        return [uplevel \#0 $cmd [list $path $source $X $Y $op $type $data]]
    }
    if { $type == "COLOR" || $type == "FGCOLOR" } {
        configure $path -foreground $data
    } elseif { $type == "BGCOLOR" } {
        configure $path -background $data
    } else {
        set text   ""
        set image  ""
        set bitmap ""
        switch -- $type {
            IMAGE   {set image $data}
            BITMAP  {set bitmap $data}
            default {
                set text $data
                if { [set var [$path.l cget -textvariable]] != "" } {
                    configure $path -image "" -bitmap ""
                    GlobalVar::setvar $var $data
                    return
                }
            }
        }
        configure $path -text $text -image $image -bitmap $bitmap
    }
    return 1
}


# ------------------------------------------------------------------------------
#  Command Label::_over_cmd
# ------------------------------------------------------------------------------
proc Label::_over_cmd { path source event X Y op type data } {
    set path [winfo parent $path]
    if { [set cmd [Widget::cget $path -dropovercmd]] != "" } {
        return [uplevel \#0 $cmd [list $path $source $event $X $Y $op $type $data]]
    }
    if { [Widget::getoption $path -state] == "normal" ||
         $type == "COLOR" || $type == "FGCOLOR" || $type == "BGCOLOR" } {
        DropSite::setcursor based_arrow_down
        return 1
    }
    DropSite::setcursor dot
    return 0
}


proc Label::_destroy { path } {
    Widget::destroy $path
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<














































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/labelentry.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# ------------------------------------------------------------------------------
#  labelentry.tcl
#  This file is part of Unifix BWidget Toolkit
#  $Id: labelentry.tcl,v 1.6.2.1 2011/02/14 16:56:09 oehhar Exp $
# ------------------------------------------------------------------------------
#  Index of commands:
#     - LabelEntry::create
#     - LabelEntry::configure
#     - LabelEntry::cget
#     - LabelEntry::bind
# ------------------------------------------------------------------------------

namespace eval LabelEntry {
    Widget::define LabelEntry labelentry Entry LabelFrame

    Widget::bwinclude LabelEntry LabelFrame .labf \
        remove {-relief -borderwidth -focus} \
        rename {-text -label} \
        prefix {label -justify -width -anchor -height -font -textvariable}

    Widget::bwinclude LabelEntry Entry .e \
        remove {-fg -bg} \
        rename {-foreground -entryfg -background -entrybg}

    Widget::addmap LabelEntry "" :cmd {-background {}}

    ::bind BwLabelEntry <FocusIn> [list focus %W.labf]
    ::bind BwLabelEntry <Destroy> [list LabelEntry::_destroy %W]
}


# ------------------------------------------------------------------------------
#  Command LabelEntry::create
# ------------------------------------------------------------------------------
proc LabelEntry::create { path args } {
    array set maps [list LabelEntry {} :cmd {} .labf {} .e {}]
    array set maps [Widget::parseArgs LabelEntry $args]

    if {[Widget::theme]} {
        eval [list ttk::frame $path] $maps(:cmd) -class LabelEntry \
            -takefocus 0
    }  else  {
        eval [list frame $path] $maps(:cmd) -class LabelEntry \
            -relief flat -bd 0 -highlightthickness 0 -takefocus 0
    }
    Widget::initFromODB LabelEntry $path $maps(LabelEntry)
	
    set labf  [eval [list LabelFrame::create $path.labf] $maps(.labf) \
                   [list -relief flat -borderwidth 0 -focus $path.e]]
    set subf  [LabelFrame::getframe $labf]
    set entry [eval [list Entry::create $path.e] $maps(.e)]

    pack $entry -in $subf -fill both -expand yes
    pack $labf  -fill both -expand yes

    bindtags $path [list $path BwLabelEntry [winfo toplevel $path] all]

    Widget::create LabelEntry $path
    proc ::$path { cmd args } \
    	"return \[LabelEntry::_path_command [list $path] \$cmd \$args\]"
    return $path
}


# ------------------------------------------------------------------------------
#  Command LabelEntry::configure
# ------------------------------------------------------------------------------
proc LabelEntry::configure { path args } {
    return [Widget::configure $path $args]
}


# ------------------------------------------------------------------------------
#  Command LabelEntry::cget
# ------------------------------------------------------------------------------
proc LabelEntry::cget { path option } {
    return [Widget::cget $path $option]
}


# ------------------------------------------------------------------------------
#  Command LabelEntry::bind
# ------------------------------------------------------------------------------
proc LabelEntry::bind { path args } {
    return [eval [list ::bind $path.e] $args]
}


#------------------------------------------------------------------------------
#  Command LabelEntry::_path_command
#------------------------------------------------------------------------------
proc LabelEntry::_path_command { path cmd larg } {
    if { [string equal $cmd "configure"] ||
         [string equal $cmd "cget"] ||
         [string equal $cmd "bind"] } {
        return [eval [list LabelEntry::$cmd $path] $larg]
    } else {
        return [eval [list $path.e:cmd $cmd] $larg]
    }
}


proc LabelEntry::_destroy { path } {
    Widget::destroy $path
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


















































































































































































































Deleted scriptlibs/bwidget-1.9.8/labelframe.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# ------------------------------------------------------------------------------
#  labelframe.tcl
#  This file is part of Unifix BWidget Toolkit
#  $Id: labelframe.tcl,v 1.6.2.1 2011/02/14 16:56:09 oehhar Exp $
# ------------------------------------------------------------------------------
#  Index of commands:
#     - LabelFrame::create
#     - LabelFrame::getframe
#     - LabelFrame::configure
#     - LabelFrame::cget
#     - LabelFrame::align
# ------------------------------------------------------------------------------

namespace eval LabelFrame {
    Widget::define LabelFrame labelframe Label

    Widget::bwinclude LabelFrame Label .l \
        remove     {
            -highlightthickness -highlightcolor -highlightbackground
            -takefocus -relief -borderwidth
            -cursor
            -dragenabled -draginitcmd -dragendcmd -dragevent -dragtype
            -dropenabled -droptypes -dropovercmd  -dropcmd} \
        initialize {-anchor w}

    Widget::declare LabelFrame {
        {-relief      TkResource flat 0 frame}
        {-borderwidth TkResource 0    0 frame}
        {-side        Enum       left 1 {left right top bottom}}
        {-bd          Synonym    -borderwidth}
    }

    Widget::addmap LabelFrame "" :cmd {-background {}}
    Widget::addmap LabelFrame "" .f   {-background {} -relief {} -borderwidth {}}

    bind BwLabelFrame <FocusIn> [list Label::setfocus %W.l]
    bind BwLabelFrame <Destroy> [list LabelFrame::_destroy %W]
}


# ----------------------------------------------------------------------------
#  Command LabelFrame::create
# ----------------------------------------------------------------------------
proc LabelFrame::create { path args } {
    Widget::init LabelFrame $path $args

    if {[Widget::theme]} {
        set path  [eval [list ttk::frame $path] [Widget::subcget $path :cmd] \
            -takefocus 0 \
            -class LabelFrame]
    }  else  {
        set path  [eval [list frame $path] [Widget::subcget $path :cmd] \
            -relief flat -bd 0 -takefocus 0 -highlightthickness 0 \
            -class LabelFrame]
    }

    set label [eval [list Label::create $path.l] [Widget::subcget $path .l] \
        -takefocus 0 -dropenabled 0 -dragenabled 0]
    if {[Widget::theme]} {
        set frame [eval [list ttk::frame $path.f] [Widget::subcget $path .f] \
            -takefocus 0]
    }  else  {
        set frame [eval [list frame $path.f] [Widget::subcget $path .f] \
            -highlightthickness 0 -takefocus 0]
    }

    switch  [Widget::getoption $path -side] {
        left   {set packopt "-side left"}
        right  {set packopt "-side right"}
        top    {set packopt "-side top -fill x"}
        bottom {set packopt "-side bottom -fill x"}
    }

    eval [list pack $label] $packopt
    pack $frame -fill both -expand yes

    bindtags $path [list $path BwLabelFrame [winfo toplevel $path] all]

    return [Widget::create LabelFrame $path]
}


# ----------------------------------------------------------------------------
#  Command LabelFrame::getframe
# ----------------------------------------------------------------------------
proc LabelFrame::getframe { path } {
    return $path.f
}


# ----------------------------------------------------------------------------
#  Command LabelFrame::configure
# ----------------------------------------------------------------------------
proc LabelFrame::configure { path args } {
    return [Widget::configure $path $args]
}


# ----------------------------------------------------------------------------
#  Command LabelFrame::cget
# ----------------------------------------------------------------------------
proc LabelFrame::cget { path option } {
    return [Widget::cget $path $option]
}


# ----------------------------------------------------------------------------
#  Command LabelFrame::align
#  This command align label of all widget given by args of class LabelFrame
#  (or "derived") by setting their width to the max one +1
# ----------------------------------------------------------------------------
proc LabelFrame::align { args } {
    set maxlen 0
    set wlist  {}
    foreach wl $args {
        foreach w $wl {
            if { ![info exists Widget::_class($w)] } {
                continue
            }
            set class $Widget::_class($w)
            if { [string equal $class "LabelFrame"] } {
                set textopt  -text
                set widthopt -width
            } else {
                upvar 0 Widget::${class}::map classmap
                set textopt  ""
                set widthopt ""
                set notdone  2
                foreach {option lmap} [array get classmap] {
                    foreach {subpath subclass realopt} $lmap {
                        if { [string equal $subclass "LabelFrame"] } {
                            if { [string equal $realopt "-text"] } {
                                set textopt $option
                                incr notdone -1
                                break
                            }
                            if { [string equal $realopt "-width"] } {
                                set widthopt $option
                                incr notdone -1
                                break
                            }
                        }
                    }
                    if { !$notdone } {
                        break
                    }
                }
                if { $notdone } {
                    continue
                }
            }
            set len [string length [$w cget $textopt]]
            if { $len > $maxlen } {
                set maxlen $len
            }
            lappend wlist $w $widthopt
        }
    }
    incr maxlen
    foreach {w widthopt} $wlist {
        $w configure $widthopt $maxlen
    }
}


proc LabelFrame::_destroy { path } {
    Widget::destroy $path
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
















































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/lang/da.rc.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
! -----------------------------------------------------------------------------
!  da.rc
!  This file is part of Unifix BWidget Toolkit
!  Definition of Danish resources
! -----------------------------------------------------------------------------


! --- symbolic names of buttons -----------------------------------------------

*abortName:   &Annullér
*retryName:   P&røv igen
*ignoreName:  &Ignorer
*okName:      &OK
*cancelName:  &Cancel
*yesName:     &Ja
*noName:      &Nej


! --- symbolic names of label of SelectFont dialog ----------------------------

*boldName:          Fed
*italicName:        Kursiv
*underlineName:     Understreg
*overstrikeName:    Overstreg
*fontName:          &Font
*sizeName:          &Størrelse
*styleName:         St&il
*colorPickerName:   F&arve...

! --- symbolic names of label of PasswdDlg dialog -----------------------------

*loginName:    &Brugernavn
*passwordName: &Password


! --- resource for SelectFont dialog ------------------------------------------

*SelectFont.title:	    Font-valg
*SelectFont.sampletext:	    Eksempeltekst æøå


! --- resource for MessageDlg dialog ------------------------------------------

*MessageDlg.noneTitle:      Besked
*MessageDlg.infoTitle:      Information
*MessageDlg.questionTitle:  Spørgsmål
*MessageDlg.warningTitle:   Advarsel
*MessageDlg.errorTitle:     Fejl


! --- resource for PasswdDlg dialog -------------------------------------------

*PasswdDlg.title:  Indtast brugernavn og password

! --- symbolic names of label of SelectColor dialog ----------------------------

*baseColorsName: Base colors
*userColorsName: User colors

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






















































































































Deleted scriptlibs/bwidget-1.9.8/lang/de.rc.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
! ------------------------------------------------------------------------------
!  de.rc
!  This file is part of Unifix BWidget Toolkit
!  Definition of german resources
! ------------------------------------------------------------------------------


! --- symbolic names of buttons ------------------------------------------------

*abortName:   &Abbrechen
*retryName:   &Wiederholen
*ignoreName:  &Ignorieren
*okName:      &OK
*cancelName:  &Abbrechen
*yesName:     &Ja
*noName:      &Nein


! --- symbolic names of label of SelectFont dialog ----------------------------

*boldName:          Fett
*italicName:        Kursiv
*underlineName:     Unterstrichen
*overstrikeName:    Durchgestrichen
*fontName:          &Schriftart
*sizeName:          S&chriftgrad
*styleName:         Sc&hriftschnitt
*colorPickerName:   &Farbe...

! --- symbolic names of label of PasswdDlg dialog -----------------------------

*loginName:    &Login
*passwordName: &Password


! --- resource for SelectFont dialog ------------------------------------------

*SelectFont.title:	    Schrift Auswahl
*SelectFont.sampletext:	    Beispieltext


! --- resource for MessageDlg dialog ------------------------------------------

*MessageDlg.noneTitle:      Meldung
*MessageDlg.infoTitle:      Hinweis
*MessageDlg.questionTitle:  Frage
*MessageDlg.warningTitle:   Warnung
*MessageDlg.errorTitle:     Fehler


! --- resource for PasswdDlg dialog -------------------------------------------

*PasswdDlg.title:  Enter login and password

! --- symbolic names of label of SelectColor dialog ----------------------------

*baseColorsName: Grundfarben
*userColorsName: Benutzerdefinierte Farben

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






















































































































Deleted scriptlibs/bwidget-1.9.8/lang/en.rc.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
! ------------------------------------------------------------------------------
!  en.rc
!  This file is part of Unifix BWidget Toolkit
!  Definition of english resources
! ------------------------------------------------------------------------------


! --- symbolic names of buttons ------------------------------------------------

*abortName:   &Abort
*retryName:   &Retry
*ignoreName:  &Ignore
*okName:      &OK
*cancelName:  &Cancel
*yesName:     &Yes
*noName:      &No


! --- symbolic names of label of SelectFont dialog ----------------------------

*boldName:          Bold
*italicName:        Italic
*underlineName:     Underline
*overstrikeName:    Overstrike
*fontName:          &Font
*sizeName:          &Size
*styleName:         St&yle
*colorPickerName:   &Color...


! --- symbolic names of label of PasswdDlg dialog -----------------------------

*loginName:    &Login
*passwordName: &Password


! --- resource for SelectFont dialog ------------------------------------------

*SelectFont.title:	    Font selection
*SelectFont.sampletext:	    Sample text


! --- resource for MessageDlg dialog ------------------------------------------

*MessageDlg.noneTitle:      Message
*MessageDlg.infoTitle:      Information
*MessageDlg.questionTitle:  Question
*MessageDlg.warningTitle:   Warning
*MessageDlg.errorTitle:     Error

! --- resource for PasswdDlg dialog -------------------------------------------

*PasswdDlg.title:  Enter login and password

! --- symbolic names of label of SelectColor dialog ----------------------------

*baseColorsName: Base colors
*userColorsName: User colors

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






















































































































Deleted scriptlibs/bwidget-1.9.8/lang/es.rc.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
! ------------------------------------------------------------------------------
!  es.rc
!  This file is part of Unifix BWidget Toolkit
!  Definition of spanish resources
!  daniel@rawbyte.com
! ------------------------------------------------------------------------------


! --- symbolic names of buttons ------------------------------------------------

*abortName:    A&bortar
*retryName:    &Reintentar
*ignoreName:   &Ignorar
*okName:       &OK
*cancelName:   &Anular
*yesName:      &Sí 
*noName:       &No

! --- symbolic names of label of SelectFont dialog ----------------------------

*boldName:          &Negrita
*italicName:        &Cursiva
*underlineName:     &Subrayado
*overstrikeName:    &Tachado
*fontName:          &Fuente
*sizeName:          &Tamaño
*styleName:         &Estilo
*colorPickerName:   &Color...


! --- symbolic names of label of PasswdDlg dialog -----------------------------

*loginName:    Nombre de &usuario
*passwordName: &Contraseña 

! --- resource for SelectFont dialog ------------------------------------------

*SelectFont.title:        Selección de fuente
*SelectFont.sampletext:   Texto de Ejemplo


! --- resource for MessageDlg dialog ------------------------------------------

*MessageDlg.noneTitle:      Indicación
*MessageDlg.infoTitle:      Información
*MessageDlg.questionTitle:  Pregunta
*MessageDlg.warningTitle:   Atención
*MessageDlg.errorTitle:     Error


! --- resource for PasswdDlg dialog -------------------------------------------

*PasswdDlg.title:  Introduzca su nombre de usuario y contraseña

! --- symbolic names of label of SelectColor dialog ----------------------------

*baseColorsName: Base colors
*userColorsName: User colors

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






















































































































Deleted scriptlibs/bwidget-1.9.8/lang/fr.rc.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
! ------------------------------------------------------------------------------
!  fr.rc
!  This file is part of Unifix BWidget Toolkit
!  Definition of french resources
! ------------------------------------------------------------------------------


! --- symbolic names of buttons ------------------------------------------------

*abortName:    A&bandonner
*retryName:    &Réessayer
*ignoreName:   &Ignorer
*okName:       &OK
*cancelName:   &Annuler
*yesName:      &Oui
*noName:       &Non

! --- symbolic names of label of SelectFont dialog ----------------------------

*boldName:          &Gras
*italicName:        &Italique
*underlineName:     &Souligné
*overstrikeName:    &Barré
*fontName:          &Police
*sizeName:          &Taille
*styleName:         St&yle
*colorPickerName:   &Couleur...


! --- symbolic names of label of PasswdDlg dialog -----------------------------

*loginName:    Nom de l'&utilisateur
*passwordName: Mot de &passe


! --- resource for SelectFont dialog ------------------------------------------

*SelectFont.title:        Sélection d'une police
*SelectFont.sampletext:	  Texte d'exemple


! --- resource for MessageDlg dialog ------------------------------------------

*MessageDlg.noneTitle:      Message
*MessageDlg.infoTitle:      Information
*MessageDlg.questionTitle:  Question
*MessageDlg.warningTitle:   Attention
*MessageDlg.errorTitle:     Erreur


! --- resource for PasswdDlg dialog -------------------------------------------

*PasswdDlg.title:  Entrez le login et le mot de passe

! --- symbolic names of label of SelectColor dialog ----------------------------

*baseColorsName: Base colors
*userColorsName: User colors

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






















































































































Deleted scriptlibs/bwidget-1.9.8/lang/hu.rc.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
! ------------------------------------------------------------------------------
!  hu.rc
!  This file is part of Unifix BWidget Toolkit
!  Definition of english resources
! ------------------------------------------------------------------------------


! --- symbolic names of buttons ------------------------------------------------

*abortName:   &Megszakítás
*retryName:   Új&ra
*ignoreName:  &Kihagyás
*okName:      &OK
*cancelName:  Még&sem
*yesName:     &Igen
*noName:      &Nem


! --- symbolic names of label of SelectFont dialog ----------------------------

*boldName:       Félkövér
*italicName:     Dőlt
*underlineName:  Aláhúzott
*overstrikeName: Felülírás
*fontName:       &Betűtípus
*sizeName:       &Méret
*styleName:      S&tílus
*colorPickerName:   &Szín...


! --- symbolic names of label of PasswdDlg dialog -----------------------------

*loginName:    &Felhasználónév
*passwordName: &Jelszó


! --- resource for SelectFont dialog ------------------------------------------

*SelectFont.title:	    Betűtípus kiválasztása
*SelectFont.sampletext:	    Példaszöveg


! --- resource for MessageDlg dialog ------------------------------------------

*MessageDlg.noneTitle:      Üzenet
*MessageDlg.infoTitle:      Információ
*MessageDlg.questionTitle:  Kérdés
*MessageDlg.warningTitle:   Figyelmeztetés
*MessageDlg.errorTitle:     Hiba

! --- resource for PasswdDlg dialog -------------------------------------------

*PasswdDlg.title:  Add meg a felhasználónevet és a jelszót


! --- symbolic names of label of SelectColor dialog ----------------------------

*baseColorsName: Alapszínek
*userColorsName: Felhasználói színek

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
























































































































Deleted scriptlibs/bwidget-1.9.8/lang/nl.rc.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
! ------------------------------------------------------------------------------
!  nl.rc
!  This file is part of Unifix BWidget Toolkit
!  Definition of Dutch resources
! ------------------------------------------------------------------------------


! --- symbolic names of buttons ------------------------------------------------

*abortName:   Af&breken
*retryName:   Opnie&uw proberen
*ignoreName:  N&egeren
*okName:      &OK
*cancelName:  &Annuleren
*yesName:     &Ja
*noName:      &Nee


! --- symbolic names of label of SelectFont dialog ----------------------------

*boldName:          Vet
*italicName:        Cursief
*underlineName:     Onderstrepen
*overstrikeName:    Doorhalen
*fontName:          &Lettertype
*sizeName:          &Grootte
*styleName:         &Stijl
*colorPickerName:   &Kleur...


! --- symbolic names of label of PasswdDlg dialog -----------------------------

*loginName:    &Inlognaam
*passwordName: &Wachtwoord


! --- resource for SelectFont dialog ------------------------------------------

*SelectFont.title:	    Lettertypeselectie
*SelectFont.sampletext:	    Voorbeeldtekst


! --- resource for MessageDlg dialog ------------------------------------------

*MessageDlg.noneTitle:      Bericht
*MessageDlg.infoTitle:      Informatie
*MessageDlg.questionTitle:  Vraag
*MessageDlg.warningTitle:   Waarschuwing
*MessageDlg.errorTitle:     Fout

! --- resource for PasswdDlg dialog -------------------------------------------

*PasswdDlg.title:  Voer inlognaam en wachtwoord in

! --- symbolic names of label of SelectColor dialog ----------------------------

*baseColorsName: Base colors
*userColorsName: User colors

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






















































































































Deleted scriptlibs/bwidget-1.9.8/lang/no.rc.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
! ------------------------------------------------------------------------------
!  no.rc
!  This file is part of Unifix BWidget Toolkit
!  Definition of norwegian resources
! ------------------------------------------------------------------------------


! --- symbolic names of buttons ------------------------------------------------

*abortName:   &Om
*retryName:   &Prøv igjen
*ignoreName:  &Ignore
*okName:      &OK
*cancelName:  &Avbryt
*yesName:     &Ja
*noName:      &Nei


! --- symbolic names of label of SelectFont dialog ----------------------------

*boldName:          Halvfet
*italicName:        Kursiv
*underlineName:     Understreking
*overstrikeName:    Overstryke
*fontName:          &Skrift
*sizeName:          &Størrelse
*styleName:         St&il
*colorPickerName:   &Color...


! --- symbolic names of label of PasswdDlg dialog -----------------------------

*loginName:    &Logg inn
*passwordName: &Passord


! --- resource for SelectFont dialog ------------------------------------------

*SelectFont.title:	    Skriftvalg
*SelectFont.sampletext:	    Prøve tekst


! --- resource for MessageDlg dialog ------------------------------------------

*MessageDlg.noneTitle:      Melding
*MessageDlg.infoTitle:      Informasjon
*MessageDlg.questionTitle:  Spørsmål
*MessageDlg.warningTitle:   Advarsel
*MessageDlg.errorTitle:     Feil

! --- resource for PasswdDlg dialog -------------------------------------------

*PasswdDlg.title:  Skriv inn logginn og passord

! --- symbolic names of label of SelectColor dialog ----------------------------

*baseColorsName: Base colors
*userColorsName: User colors

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






















































































































Deleted scriptlibs/bwidget-1.9.8/lang/pl.rc.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
! ------------------------------------------------------------------------------
!  pl.rc
!  This file is part of Unifix BWidget Toolkit
!  Definition of english resources
! ------------------------------------------------------------------------------


! --- symbolic names of buttons ------------------------------------------------

*abortName:   &Porzuć
*retryName:   P&onów
*ignoreName:  &Ignoruj
*okName:      &OK
*cancelName:  &Anyluj
*yesName:     &Tak
*noName:      &Nie


! --- symbolic names of label of SelectFont dialog ----------------------------

*boldName:          Pogrubiona
*italicName:        Kursywa
*underlineName:     Podkreślenie
*overstrikeName:    Przekreślenie
*fontName:          &Czcionka:
*sizeName:          &Rozmiar:
*styleName:         St&yl czcionki:
*colorPickerName:   &Kolor...


! --- symbolic names of label of PasswdDlg dialog -----------------------------

*loginName:    &Login
*passwordName: &Hasło


! --- resource for SelectFont dialog ------------------------------------------

*SelectFont.title:	    Wybór czcionki
*SelectFont.sampletext:	    Przykładowy tekst


! --- resource for MessageDlg dialog ------------------------------------------

*MessageDlg.noneTitle:      Wiadomość
*MessageDlg.infoTitle:      Informacja
*MessageDlg.questionTitle:  Pytanie
*MessageDlg.warningTitle:   Ostrzeżenie
*MessageDlg.errorTitle:     Błąd

! --- resource for PasswdDlg dialog -------------------------------------------

*PasswdDlg.title:  Wpisz login i hasło


! --- symbolic names of label of SelectColor dialog ----------------------------

*baseColorsName: Kolory podstawowe
*userColorsName: Kolory niestandardowe

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
























































































































Deleted scriptlibs/bwidget-1.9.8/listbox.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
# ----------------------------------------------------------------------------
#  listbox.tcl
#  This file is part of Unifix BWidget Toolkit
#  $Id: listbox.tcl,v 1.29.2.7 2012/04/12 12:46:47 oehhar Exp $
# ----------------------------------------------------------------------------
#  Index of commands:
#     - ListBox::create
#     - ListBox::configure
#     - ListBox::cget
#     - ListBox::insert
#     - ListBox::itemconfigure
#     - ListBox::itemcget
#     - ListBox::bindText
#     - ListBox::bindImage
#     - ListBox::delete
#     - ListBox::move
#     - ListBox::reorder
#     - ListBox::selection
#     - ListBox::exists
#     - ListBox::index
#     - ListBox::item - deprecated
#     - ListBox::items
#     - ListBox::see
#     - ListBox::edit
#     - ListBox::xview
#     - ListBox::yview
#     - ListBox::_update_edit_size
#     - ListBox::_destroy
#     - ListBox::_see
#     - ListBox::_update_scrollregion
#     - ListBox::_draw_item
#     - ListBox::_redraw_items
#     - ListBox::_redraw_selection
#     - ListBox::_redraw_listbox
#     - ListBox::_redraw_idle
#     - ListBox::_resize
#     - ListBox::_init_drag_cmd
#     - ListBox::_drop_cmd
#     - ListBox::_over_cmd
#     - ListBox::_auto_scroll
#     - ListBox::_scroll
# ----------------------------------------------------------------------------

namespace eval ListBox {
    Widget::define ListBox listbox DragSite DropSite DynamicHelp

    namespace eval Item {
        Widget::declare ListBox::Item {
            {-indent     Int        0   0 "%d >= 0"}
            {-text       String     ""  0}
            {-font       String     ""  0}
            {-foreground String     ""  0}
            {-image      TkResource ""  0 label}
            {-window     String     ""  0}
            {-data       String     ""  0}

            {-fill       Synonym    -foreground}
            {-fg         Synonym    -foreground}
        }
    }

    DynamicHelp::include ListBox::Item balloon

    Widget::tkinclude ListBox canvas .c \
        remove {
            -insertwidth -insertbackground -insertborderwidth -insertofftime
            -insertontime -selectborderwidth -closeenough -confine -scrollregion
            -xscrollincrement -yscrollincrement -width -height
        } \
        initialize {
            -relief sunken -borderwidth 2 -takefocus 1
            -highlightthickness 1 -width 200
        }

    DragSite::include ListBox "LISTBOX_ITEM" 1
    DropSite::include ListBox {
        LISTBOX_ITEM {copy {} move {}}
    }

    Widget::declare ListBox {
        {-deltax           Int 10 0 "%d >= 0"}
        {-deltay           Int 15 0 "%d >= 0"}
        {-padx             Int 20 0 "%d >= 0"}
        {-foreground       TkResource "" 0 listbox}
        {-background       TkResource "" 0 listbox}
        {-selectbackground TkResource "" 0 listbox}
        {-selectforeground TkResource "" 0 listbox}
        {-font             TkResource "" 0 listbox}
        {-width            TkResource "" 0 listbox}
        {-height           TkResource "" 0 listbox}
        {-redraw           Boolean 1  0}
        {-multicolumn      Boolean 0  0}
        {-dropovermode     Flag    "wpi" 0 "wpi"}
        {-selectmode       Enum none 0 {none single multiple}}
        {-fg               Synonym -foreground}
        {-bg               Synonym -background}
        {-dropcmd          String  "ListBox::_drag_and_drop" 0}
        {-autofocus        Boolean  1  1}
        {-selectfill       Boolean  0  1}
    }

    Widget::addmap ListBox "" .c {-deltay -yscrollincrement}

    bind ListBox <FocusIn>   [list after idle {BWidget::refocus %W %W.c}]
    bind ListBox <Destroy>   [list ListBox::_destroy %W]
    bind ListBox <Configure> [list ListBox::_resize  %W]
    bind ListBoxFocus <1>    [list focus %W]
    bind ListBox <Key-Up>    [list ListBox::_keyboard_navigation %W -1]
    bind ListBox <Key-Down>  [list ListBox::_keyboard_navigation %W  1]

    variable _edit
}


# ----------------------------------------------------------------------------
#  Command ListBox::create
# ----------------------------------------------------------------------------
proc ListBox::create { path args } {
    Widget::init ListBox $path $args

    variable $path
    upvar 0  $path data

    frame $path -class ListBox -bd 0 -highlightthickness 0 -relief flat \
	-takefocus 0
    # For 8.4+ we don't want to inherit the padding
    catch {$path configure -padx 0 -pady 0}
    # widget informations
    set data(nrows) -1

    # items informations
    set data(items)    {}
    set data(selitems) {}

    # update informations
    set data(upd,level)   0
    set data(upd,afterid) ""
    set data(upd,level)   0
    set data(upd,delete)  {}

    # drag and drop informations
    set data(dnd,scroll)   ""
    set data(dnd,afterid)  ""
    set data(dnd,item)     ""

    eval [list canvas $path.c] [Widget::subcget $path .c] \
	[list -xscrollincrement 8]
    pack $path.c -expand yes -fill both

    DragSite::setdrag $path $path.c ListBox::_init_drag_cmd \
	    [Widget::cget $path -dragendcmd] 1
    DropSite::setdrop $path $path.c ListBox::_over_cmd ListBox::_drop_cmd 1

    Widget::create ListBox $path

    set w [Widget::cget $path -width]
    set h [Widget::cget $path -height]
    set dy [Widget::cget $path -deltay]
    $path.c configure -width [expr {$w*8}] -height [expr {$h*$dy}]

    # Insert $path into the canvas bindings, so that anyone binding
    # directly onto the widget will see their bindings activated when
    # the canvas has focus.
    set bindtags [bindtags $path.c]
    set bindtags [linsert $bindtags 1 $path]
    # Let any click within the canvas focus on the canvas so that
    # MouseWheel scroll events will be properly handled by the canvas.
    if {[Widget::cget $path -autofocus]} {
	lappend bindtags ListBoxFocus
	BWidget::bindMouseWheel $path.c
    }
    bindtags $path.c $bindtags

    # Add slightly modified up/down bindings to the canvas, in case
    # it gets the focus (like with -autofocus).
    bind $path.c <Key-Up> {ListBox::_keyboard_navigation [winfo parent %W] -1}
    bind $path.c <Key-Down> {ListBox::_keyboard_navigation [winfo parent %W] 1}

    _configureSelectmode $path [Widget::getoption $path -selectmode]

    return $path
}


# ----------------------------------------------------------------------------
#  Command ListBox::_configureSelectmode
# ----------------------------------------------------------------------------
# Configure the selectmode
proc ListBox::_configureSelectmode { path selectmode {previous none} } {
    # clear current binding
    switch -exact -- $previous {
        single {
            $path _bindText  <Button-1> ""
            $path _bindImage <Button-1> ""
        }
        multiple {
            $path _bindText <ButtonRelease-1>          ""
            $path _bindText <Shift-ButtonRelease-1>    ""
            $path _bindText <Control-ButtonRelease-1>  ""

            $path _bindImage <ButtonRelease-1>         ""
            $path _bindImage <Shift-ButtonRelease-1>   ""
            $path _bindImage <Control-ButtonRelease-1> ""
        }
    }
    # set new bindings
    switch -exact -- $selectmode {
        single {
            $path _bindText  <Button-1> [list ListBox::_mouse_select $path set]
            $path _bindImage <Button-1> [list ListBox::_mouse_select $path set]
            if {1 < [llength [ListBox::selection $path get]]} {
                ListBox::selection $path clear
            }
        }
        multiple {
            set cmd ListBox::_multiple_select
            $path _bindText <ButtonRelease-1>          [list $cmd $path n %x %y]
            $path _bindText <Shift-ButtonRelease-1>    [list $cmd $path s %x %y]
            $path _bindText <Control-ButtonRelease-1>  [list $cmd $path c %x %y]

            $path _bindImage <ButtonRelease-1>         [list $cmd $path n %x %y]
            $path _bindImage <Shift-ButtonRelease-1>   [list $cmd $path s %x %y]
            $path _bindImage <Control-ButtonRelease-1> [list $cmd $path c %x %y]
        }
        default {
            if {0 < [llength [ListBox::selection $path get]]} {
                ListBox::selection $path clear
            }
        }
    }
}
# ----------------------------------------------------------------------------
#  Command ListBox::configure
# ----------------------------------------------------------------------------
proc ListBox::configure { path args } {
    set selectmodePrevious [Widget::getoption $path -selectmode]
    set res [Widget::configure $path $args]

    if { [Widget::hasChanged $path -selectmode selectmode] } {
        _configureSelectmode $path $selectmode $selectmodePrevious
    }

    set ch0 [expr {[Widget::hasChanged $path -deltay dy]}]
    set ch1 [expr {$ch0  |
                   [Widget::hasChanged $path -padx val]   |
                   [Widget::hasChanged $path -multicolumn val]}]

    set ch2 [expr {[Widget::hasChanged $path -selectbackground val] |
                   [Widget::hasChanged $path -selectforeground val]}]

    set redraw 0
    if { [Widget::hasChanged $path -height h] || $ch0 } {
        $path.c configure -height [expr {$h*$dy}]
        if {!$ch0} {
            set redraw 1
        }
    }
    if { [Widget::hasChanged $path -width w] } {
        $path.c configure -width [expr {$w*8}]
        set redraw 1
    }

    if { [Widget::hasChanged $path -background bg] } {
        $path.c itemconfigure box -fill $bg
    }

    if { !$redraw } {
        if { $ch1 } {
            _redraw_idle $path 2
        } elseif { $ch2 } {
            _redraw_idle $path 1
        }
    }

    if { [Widget::hasChanged $path -redraw bool] && $bool } {
        variable $path
        upvar 0  $path data
        set lvl $data(upd,level)
        set data(upd,level) 0
        _redraw_idle $path $lvl
    }
    set force [Widget::hasChanged $path -dragendcmd dragend]
    DragSite::setdrag $path $path.c ListBox::_init_drag_cmd $dragend $force
    DropSite::setdrop $path $path.c ListBox::_over_cmd ListBox::_drop_cmd

    return $res
}


# ----------------------------------------------------------------------------
#  Command ListBox::cget
# ----------------------------------------------------------------------------
proc ListBox::cget { path option } {
    return [Widget::cget $path $option]
}


# ----------------------------------------------------------------------------
#  Command ListBox::insert
# ----------------------------------------------------------------------------
proc ListBox::insert { path index item args } {
    variable $path
    upvar 0  $path data

    set item [Widget::nextIndex $path $item]

    if {[info exists data(exists,$item)]} {
        return -code error "item \"$item\" already exists"
    }

    Widget::init ListBox::Item $path.$item $args

    set data(items) [linsert $data(items) $index $item]
    set data(exists,$item) 1
    set data(upd,create,$item) $item

    _redraw_idle $path 2
    return $item
}

# Bastien Chevreux (bach@mwgdna.com)
# The multipleinsert command performs inserts several items at once into
#  the list. It is faster than calling insert multiple times as it uses the
#  Widget::copyinit command for initializing all items after the 1st. The 
#  speedup factor is between 2 and 3 for typical usage, but could be higher
#  for inserts with many options.
#
# Syntax: path and index are as in the insert command
#	args is a list of even numbered elements where the 1st of each pair
#	corresponds to the item of 'insert' and the second to args of 'insert'.
# ----------------------------------------------------------------------------
#  Command ListBox::multipleinsert
# ----------------------------------------------------------------------------
proc ListBox::multipleinsert { path index args } {
    variable $path
    upvar 0  $path data

    # If we got only one list as arg, take the first element as args
    # This enables callers to use 
    #	$list multipleinsert index $thelist
    # instead of
    #	eval $list multipleinsert index $thelist

    if {[llength $args] == 1} {
	set args [lindex $args 0]
    }

    set count 0
    foreach {item iargs} $args {
	if {[info exists data(exists,$item)]} {
	    return -code error "item \"$item\" already exists"
	}

	if {$count==0} {
	    Widget::init ListBox::Item $path.$item $iargs
	    set firstpath $path.$item
	} else {
	    Widget::copyinit ListBox::Item $firstpath $path.$item $iargs
	}

	set data(items) [linsert $data(items) $index $item]
	set data(exists,$item) 1
	set data(upd,create,$item) $item

	incr count
    }

    _redraw_idle $path 2
    return $item
}

# ----------------------------------------------------------------------------
#  Command ListBox::itemconfigure
# ----------------------------------------------------------------------------
proc ListBox::itemconfigure { path item args } {
    variable $path
    upvar 0  $path data

    if { [lsearch -exact $data(items) $item] == -1 } {
        return -code error "item \"$item\" does not exist"
    }

    set oldind [Widget::getoption $path.$item -indent]

    set res   [Widget::configure $path.$item $args]
    set chind [Widget::hasChanged $path.$item -indent indent]
    set chw   [Widget::hasChanged $path.$item -window win]
    set chi   [Widget::hasChanged $path.$item -image  img]
    set cht   [Widget::hasChanged $path.$item -text txt]
    set chf   [Widget::hasChanged $path.$item -font fnt]
    set chfg  [Widget::hasChanged $path.$item -foreground fg]
    set idn   [$path.c find withtag n:$item]

    _set_help $path $item

    if { $idn == "" } {
        # item is not drawn yet
        _redraw_idle $path 2
        return $res
    }

    set oldb   [$path.c bbox $idn]
    set coords [$path.c coords $idn]
    set padx   [Widget::getoption $path -padx]
    set x0     [expr {[lindex $coords 0]-$padx-$oldind+$indent}]
    set y0     [lindex $coords 1]
    if { $chw || $chi } {
        # -window or -image modified
        set idi  [$path.c find withtag i:$item]
        set type [lindex [$path.c gettags $idi] 0]
        if { [string length $win] } {
            if { [string equal $type "win"] } {
                $path.c itemconfigure $idi -window $win
            } else {
                $path.c delete $idi
                $path.c create window $x0 $y0 -window $win -anchor w \
		    -tags [list win i:$item]
            }
        } elseif { [string length $img] } {
            if { [string equal $type "img"] } {
                $path.c itemconfigure $idi -image $img
            } else {
                $path.c delete $idi
                $path.c create image $x0 $y0 -image $img -anchor w \
		    -tags [list img imgbind i:$item]
            }
        } else {
            $path.c delete $idi
        }
    }

    if { $cht || $chf || $chfg } {
        # -text or -font modified, or -foreground modified
        set fnt [_getoption $path $item -font]
        set fg  [_getoption $path $item -foreground]
        $path.c itemconfigure $idn -text $txt -font $fnt -fill $fg
        _redraw_idle $path 1
    }

    if { $chind } {
        # -indent modified
        $path.c coords $idn [expr {$x0+$padx}] $y0
        $path.c coords i:$item $x0 $y0
        _redraw_idle $path 1
    }

    if { [Widget::getoption $path -multicolumn] && ($cht || $chf || $chind) } {
        set bbox [$path.c bbox $idn]
        if { [lindex $bbox 2] > [lindex $oldb 2] } {
            _redraw_idle $path 2
        }
    }

    return $res
}


# ----------------------------------------------------------------------------
#  Command ListBox::itemcget
# ----------------------------------------------------------------------------
proc ListBox::itemcget { path item option } {
    return [Widget::cget $path.$item $option]
}


# ----------------------------------------------------------------------------
#  Command ListBox::_bindText
# ----------------------------------------------------------------------------
proc ListBox::_bindText { path event script {tag click} } {
    if { $script != "" } {
        set map [list %W $path]
        set script [string map $map $script]
	append script " \[ListBox::_get_current [list $path]\]"
    }
    $path.c bind $tag $event $script
}

# ----------------------------------------------------------------------------
#  Command ListBox::bindText
# ----------------------------------------------------------------------------
proc ListBox::bindText { path event script } {
    _bindText $path $event $script clickbind
}

# ----------------------------------------------------------------------------
#  Command ListBox::_bindImage
# ----------------------------------------------------------------------------
proc ListBox::_bindImage { path event script {tag img} } {
    if { $script != "" } {
        set map [list %W $path]
        set script [string map $map $script]
	append script " \[ListBox::_get_current [list $path]\]"
    }
    $path.c bind $tag $event $script
}

# ----------------------------------------------------------------------------
#  Command ListBox::bindImage
# ----------------------------------------------------------------------------
proc ListBox::bindImage { path event script } {
    _bindImage $path $event $script imgbind
}

# ----------------------------------------------------------------------------
#  Command ListBox::delete
# ----------------------------------------------------------------------------
proc ListBox::delete { path args } {
    variable $path
    upvar 0  $path data
    Widget::getVariable $path help

    foreach litems $args {
        foreach item $litems {
            set idx [lsearch -exact $data(items) $item]
            if { $idx != -1 } {
                set data(items) [lreplace $data(items) $idx $idx]
                array unset help $item
                Widget::destroy $path.$item
		if { [info exists data(exists,$item)] } {
		    unset data(exists,$item)
		}
                if { [info exists data(upd,create,$item)] } {
                    unset data(upd,create,$item)
                } else {
                    lappend data(upd,delete) $item
                }
            }
        }
    }

    set sel $data(selitems)
    set data(selitems) {}
    eval [list selection $path set] $sel
    _redraw_idle $path 2
}


# ----------------------------------------------------------------------------
#  Command ListBox::move
# ----------------------------------------------------------------------------
proc ListBox::move { path item index } {
    variable $path
    upvar 0  $path data

    if { [set idx [lsearch -exact $data(items) $item]] == -1 } {
        return -code error "item \"$item\" does not exist"
    }

    set data(items) [linsert [lreplace $data(items) $idx $idx] $index $item]

    _redraw_idle $path 2
}


# ----------------------------------------------------------------------------
#  Command ListBox::reorder
# ----------------------------------------------------------------------------
proc ListBox::reorder { path neworder } {
    variable $path
    upvar 0  $path data

    set data(items) [BWidget::lreorder $data(items) $neworder]
    _redraw_idle $path 2
}


# ----------------------------------------------------------------------------
#  Command ListBox::selection
# ----------------------------------------------------------------------------
proc ListBox::selection { path cmd args } {
    variable $path
    upvar 0  $path data

    set oldsel $data(selitems);
    switch -- $cmd {
        set {
            set data(selitems) {}
            foreach item $args {
                if { [lsearch -exact $data(selitems) $item] == -1 } {
                    if { [lsearch -exact $data(items) $item] != -1 } {
                        lappend data(selitems) $item
                    }
                }
            }
        }
        add {
            foreach item $args {
                if { [lsearch -exact $data(selitems) $item] == -1 } {
                    if { [lsearch -exact $data(items) $item] != -1 } {
                        lappend data(selitems) $item
                    }
                }
            }
        }
        remove {
            foreach item $args {
                if { [set idx [lsearch -exact $data(selitems) $item]] != -1 } {
                    set data(selitems) [lreplace $data(selitems) $idx $idx]
                }
            }
        }
        clear {
            set data(selitems) {}
        }
        get {
            return $data(selitems)
        }
        includes {
            return [expr {[lsearch -exact $data(selitems) $args] != -1}]
        }
        default {
            return
        }
    }
    if {[string compare $oldsel $data(selitems)]} {
        _redraw_idle $path 1
    }
    return;
}


# ----------------------------------------------------------------------------
#  Command ListBox::exists
# ----------------------------------------------------------------------------
proc ListBox::exists { path item } {
    variable $path
    upvar 0  $path data

    return [expr {[lsearch -exact $data(items) $item] != -1}]
}


# ----------------------------------------------------------------------------
#  Command ListBox::index
# ----------------------------------------------------------------------------
proc ListBox::index { path item } {
    variable $path
    upvar 0  $path data
    if {[string equal $item "active"]} { return [$path selection get] }
    return [lsearch -exact $data(items) $item]
}


# ----------------------------------------------------------------------------
#  ListBox::find
#     Returns the item given a position.
#  findInfo     @x,y ?confine?
#               lineNumber
# ----------------------------------------------------------------------------
proc ListBox::find {path findInfo {confine ""}} {
    variable $path
    upvar 0  $path widgetData

    if {[regexp -- {^@([0-9]+),([0-9]+)$} $findInfo match x y]} {
        set x [$path.c canvasx $x]
        set y [$path.c canvasy $y]
    } elseif {[regexp -- {^[0-9]+$} $findInfo lineNumber]} {
        set dy [Widget::getoption $path -deltay]
        set y  [expr {$dy*($lineNumber+0.5)}]
        set confine ""
    } else {
        return -code error "invalid find spec \"$findInfo\""
    }

    set found 0
    set xi    0
    foreach xs $widgetData(xlist) {
        if {$x <= $xs} {
            foreach id [$path.c find overlapping $xi $y $xs $y] {
                set ltags [$path.c gettags $id]
                set item  [lindex $ltags 0]
                if { [string equal $item "item"] ||
                     [string equal $item "img"]  ||
                     [string equal $item "win"] } {
                    # item is the label or image/window of the node
                    set item [ListBox::_get_node_name $path $id]
                    set found 1
                    break
                }
            }
            break
        }
        set  xi  $xs
    }

    if {$found} {
        if {[string equal $confine "confine"]} {
            # test if x stand inside node bbox
            set xi [expr {[lindex [$path.c coords n:$item] 0]-[Widget::getoption $path -padx]}]
            set xs [lindex [$path.c bbox n:$item] 2]
            if {$x >= $xi && $x <= $xs} {
                return $item
            }
        } else {
            return $item
        }
    }
    return ""
}


# ----------------------------------------------------------------------------
#  Command ListBox::item - deprecated
# ----------------------------------------------------------------------------
proc ListBox::item { path first {last ""} } {
    variable $path
    upvar 0  $path data

    if { ![string length $last] } {
        return [lindex $data(items) $first]
    } else {
        return [lrange $data(items) $first $last]
    }
}


# ----------------------------------------------------------------------------
#  Command ListBox::items
# ----------------------------------------------------------------------------
proc ListBox::items { path {first ""} {last ""}} {
    variable $path
    upvar 0  $path data

    if { ![string length $first] } {
	return $data(items)
    }

    if { ![string length $last] } {
        return [lindex $data(items) $first]
    } else {
        return [lrange $data(items) $first $last]
    }
}


# ----------------------------------------------------------------------------
#  Command ListBox::see
# ----------------------------------------------------------------------------
proc ListBox::see { path item } {
    variable $path
    upvar 0  $path data

    if { [Widget::getoption $path -redraw] && $data(upd,afterid) != "" } {
        after cancel $data(upd,afterid)
        _redraw_listbox $path
    }
    set idn [$path.c find withtag n:$item]
    if { $idn != "" } {
        set idi [$path.c find withtag i:$item]
        if { $idi == "" } { set idi $idn }
        ListBox::_see $path $idn right
        ListBox::_see $path $idi left
    }
}


# ----------------------------------------------------------------------------
#  Command ListBox::edit
# ----------------------------------------------------------------------------
proc ListBox::edit { path item text {verifycmd ""} {clickres 0} {select 1}} {
    variable _edit
    variable $path
    upvar 0  $path data

    if { [Widget::getoption $path -redraw] && $data(upd,afterid) != "" } {
        after cancel $data(upd,afterid)
        _redraw_listbox $path
    }
    set idn [$path.c find withtag n:$item]
    if { $idn != "" } {
        ListBox::_see $path $idn right
        ListBox::_see $path $idn left

        set oldfg  [$path.c itemcget $idn -fill]
        set sbg    [Widget::getoption $path -selectbackground]
        set coords [$path.c coords $idn]
        set x      [lindex $coords 0]
        set y      [lindex $coords 1]
        set bd     [expr {[$path.c cget -borderwidth]+[$path.c cget -highlightthickness]}]
        set w      [expr {[winfo width $path] - 2*$bd}]
        set wmax   [expr {[$path.c canvasx $w]-$x}]

	$path.c itemconfigure $idn    -fill [Widget::getoption $path -background]
        $path.c itemconfigure s:$item -fill {} -outline {}

        set _edit(text) $text
        set _edit(wait) 0

        set frame  [frame $path.edit \
                        -relief flat -borderwidth 0 -highlightthickness 0 \
                        -background [Widget::getoption $path -background]]
        set ent    [entry $frame.edit \
                        -width              0     \
                        -relief             solid \
                        -borderwidth        1     \
                        -highlightthickness 0     \
                        -foreground         [_getoption $path $item -foreground] \
                        -background         [Widget::getoption $path -background] \
                        -selectforeground   [Widget::getoption $path -selectforeground] \
                        -selectbackground   $sbg  \
                        -font               [_getoption $path $item -font] \
                        -textvariable       ListBox::_edit(text)]
        pack $ent -ipadx 8 -anchor w

        set idw [$path.c create window $x $y -window $frame -anchor w]
        trace variable ListBox::_edit(text) w [list ListBox::_update_edit_size $path $ent $idw $wmax]
        tkwait visibility $ent
        grab  $frame
        BWidget::focus set $ent
        _update_edit_size $path $ent $idw $wmax
        update
        if { $select } {
            $ent selection range 0 end
            $ent icursor end
            $ent xview end
        }

        bindtags $ent [list $ent Entry]
        bind $ent <Escape> {set ListBox::_edit(wait) 0}
        bind $ent <Return> {set ListBox::_edit(wait) 1}
	if { $clickres == 0 || $clickres == 1 } {
	    bind $frame <Button>  [list set ListBox::_edit(wait) $clickres]
	}

        set ok 0
        while { !$ok } {
            tkwait variable ListBox::_edit(wait)
            if { !$_edit(wait) || [llength $verifycmd]==0 ||
                 [uplevel \#0 $verifycmd [list $_edit(text)]] } {
                set ok 1
            }
        }
        trace vdelete ListBox::_edit(text) w [list ListBox::_update_edit_size $path $ent $idw $wmax]
        grab release $frame
        BWidget::focus release $ent
        destroy $frame
        $path.c delete $idw
        $path.c itemconfigure $idn    -fill $oldfg
        $path.c itemconfigure s:$item -fill $sbg -outline $sbg

        if { $_edit(wait) } {
            return $_edit(text)
        }
    }
    return ""
}


# ----------------------------------------------------------------------------
#  Command ListBox::xview
# ----------------------------------------------------------------------------
proc ListBox::xview { path args } {
    return [eval [linsert $args 0 $path.c xview]]
}


# ----------------------------------------------------------------------------
#  Command ListBox::yview
# ----------------------------------------------------------------------------
proc ListBox::yview { path args } {
    return [eval [linsert $args 0 $path.c yview]]
}


proc ListBox::getcanvas { path } {
    return $path.c
}


proc ListBox::curselection { path } {
    return [$path selection get]
}


# ----------------------------------------------------------------------------
#  Command ListBox::_update_edit_size
# ----------------------------------------------------------------------------
proc ListBox::_update_edit_size { path entry idw wmax args } {
    set entw [winfo reqwidth $entry]
    if { $entw >= $wmax } {
        $path.c itemconfigure $idw -width $wmax
    } else {
        $path.c itemconfigure $idw -width 0
    }
}


# ----------------------------------------------------------------------------
#  Command ListBox::_getoption
#     Returns the value of option for node. If empty, returned value is those
#  of the ListBox.
# ----------------------------------------------------------------------------
proc ListBox::_getoption { path item option } {
    set value [Widget::getoption $path.$item $option]
    if {![string length $value]} {
        set value [Widget::getoption $path $option]
    }
    return $value
}


# ----------------------------------------------------------------------------
#  Command ListBox::_destroy
# ----------------------------------------------------------------------------
proc ListBox::_destroy { path } {
    variable $path
    upvar 0  $path data

    if { $data(upd,afterid) != "" } {
        after cancel $data(upd,afterid)
    }
    if { $data(dnd,afterid) != "" } {
        after cancel $data(dnd,afterid)
    }
    foreach item $data(items) {
        Widget::destroy $path.$item
    }

    Widget::destroy $path
    unset data
}


# ----------------------------------------------------------------------------
#  Command ListBox::_see
# ----------------------------------------------------------------------------
proc ListBox::_see { path idn side } {
    set bbox [$path.c bbox $idn]
    set scrl [$path.c cget -scrollregion]

    set ymax [lindex $scrl 3]
    set dy   [$path.c cget -yscrollincrement]
    set yv   [$path.c yview]
    set yv0  [expr {round([lindex $yv 0]*$ymax/$dy)}]
    set yv1  [expr {round([lindex $yv 1]*$ymax/$dy)}]
    set y    [expr {int([lindex [$path.c coords $idn] 1]/$dy)}]
    if { $y < $yv0 } {
        $path.c yview scroll [expr {$y-$yv0}] units
    } elseif { $y >= $yv1 } {
        $path.c yview scroll [expr {$y-$yv1+1}] units
    }

    set xmax [lindex $scrl 2]
    set dx   [$path.c cget -xscrollincrement]
    set xv   [$path.c xview]
    if { [string equal $side "right"] } {
        set xv1 [expr {round([lindex $xv 1]*$xmax/$dx)}]
        set x1  [expr {int([lindex $bbox 2]/$dx)}]
        if { $x1 >= $xv1 } {
            $path.c xview scroll [expr {$x1-$xv1+1}] units
        }
    } else {
        set xv0 [expr {round([lindex $xv 0]*$xmax/$dx)}]
        set x0  [expr {int([lindex $bbox 0]/$dx)}]
        if { $x0 < $xv0 } {
            $path.c xview scroll [expr {$x0-$xv0}] units
        }
    }
}


# ----------------------------------------------------------------------------
#  Command ListBox::_update_scrollregion
# ----------------------------------------------------------------------------
proc ListBox::_update_scrollregion { path } {
    set bd   [$path.c cget -borderwidth]
    set ht   [$path.c cget -highlightthickness]
    set bd   [expr {2*($bd + $ht)}]
    set w    [expr {[winfo width  $path] - $bd}]
    set h    [expr {[winfo height $path] - $bd}]
    set xinc [$path.c cget -xscrollincrement]
    set yinc [$path.c cget -yscrollincrement]
    set bbox [$path.c bbox item win img]
    if { [llength $bbox] } {
        set xs [lindex $bbox 2]
        set ys [lindex $bbox 3]

        if { $w < $xs } {
            set w [expr {$xs + $w % $xinc}]
        }
        if { $h < $ys } {
            set h [expr {$ys + $h % $yinc}]
        }
    }

    $path.c configure -scrollregion [list 0 0 $w $h]
}


proc ListBox::_update_select_fill { path } {
    variable $path
    upvar 0  $path data

    set width [winfo width $path]

    foreach item $data(items) {
        set bbox [$path.c bbox n:$item]
        set bbox [list 0 [lindex $bbox 1] $width [lindex $bbox 3]]
        $path.c coords b:$item $bbox
    }

    _redraw_selection $path
}


# ----------------------------------------------------------------------------
#  Command ListBox::_draw_item
# ----------------------------------------------------------------------------
proc ListBox::_draw_item {path item x0 x1 y bg selfill multi ww} {
    set indent  [Widget::getoption $path.$item -indent]
    set i [$path.c create text [expr {$x1+$indent}] $y \
        -text   [Widget::getoption $path.$item -text] \
        -fill   [_getoption        $path $item -foreground] \
        -font   [_getoption        $path $item -font] \
        -anchor w \
        -tags   [list item n:$item click clickbind]]

    if { $selfill && !$multi } {
        set bbox  [$path.c bbox n:$item]
        set bbox  [list 0 [lindex $bbox 1] $ww [lindex $bbox 3]]
        set tags  [list box b:$item click clickbind]
        $path.c create rect $bbox -fill $bg -width 0 -tags $tags
        $path.c raise $i
    }

    if { [set win [Widget::getoption $path.$item -window]] != "" } {
        $path.c create window [expr {$x0+$indent}] $y \
            -window $win -anchor w -tags [list win i:$item]
    } elseif { [set img [Widget::getoption $path.$item -image]] != "" } {
        $path.c create image [expr {$x0+$indent}] $y \
            -image $img -anchor w -tags [list img imgbind i:$item]
    }

    _set_help $path $item
}


# ----------------------------------------------------------------------------
#  Command ListBox::_redraw_items
# ----------------------------------------------------------------------------
proc ListBox::_redraw_items { path } {
    variable $path
    upvar 0  $path data

    set cursor [$path.c cget -cursor]
    $path.c configure -cursor watch
    update idletasks ; # make sure watch cursor is reflected
    set dx   [Widget::getoption $path -deltax]
    set dy   [Widget::getoption $path -deltay]
    set padx [Widget::getoption $path -padx]
    set y0   [expr {$dy/2}]
    # Changed from 4 to 2 to make highlight work and look nice for listbox with image as well
    set x0   2
    set x1   [expr {$x0+$padx}]
    set nitem 0
    set width 0
    set drawn {}
    set data(xlist) {}
    if { [Widget::cget $path -multicolumn] } {
        set nrows $data(nrows)
    } else {
        set nrows [llength $data(items)]
    }
    foreach item $data(upd,delete) {
        $path.c delete i:$item n:$item s:$item b:$item
    }
    # Pass these to _draw_item so it doesn't have to request them
    # for each item.
    set bg      [Widget::cget $path -background]
    set selfill [Widget::cget $path -selectfill]
    set multi   [Widget::cget $path -multicolumn]
    set ww      [winfo width $path]
    foreach item $data(items) {
        if { [info exists data(upd,create,$item)] } {
            _draw_item $path $item $x0 $x1 $y0 $bg $selfill $multi $ww
            unset data(upd,create,$item)
        } else {
            set indent [Widget::getoption $path.$item -indent]
            $path.c coords n:$item [expr {$x1+$indent}] $y0
            $path.c coords i:$item [expr {$x0+$indent}] $y0
        }
	set font [_getoption $path $item -font]
	set text [Widget::getoption $path.$item -text]
	set tw [font measure $font $text]
	if {$tw > $width} { set width $tw }
        incr y0 $dy
        incr nitem
        lappend drawn n:$item
        if { $nitem == $nrows } {
	    set x2    [expr {$x1 + $width}]
            set y0    [expr {$dy/2}]
            set drawn {}
            set x0    [expr {$x2+$dx}]
            set x1    [expr {$x0+$padx}]
            set nitem 0
            lappend data(xlist) $x2
	    set width 0
        }
    }
    if { $nitem && $nitem < $nrows } {
        lappend data(xlist) [expr {$x1 + $width}]
    }
    set data(upd,delete) {}
    $path.c configure -cursor $cursor
}


# ----------------------------------------------------------------------------
#  Command ListBox::_redraw_selection
# ----------------------------------------------------------------------------
proc ListBox::_redraw_selection { path } {
    variable $path
    upvar 0  $path data

    set selbg   [Widget::getoption $path -selectbackground]
    set selfg   [Widget::getoption $path -selectforeground]
    set selfill [Widget::getoption $path -selectfill]
    set multi   [Widget::getoption $path -multicolumn]
    foreach id [$path.c find withtag sel] {
        set item [ListBox::_get_node_name $path $id]
        if {-1 == [lsearch -exact $data(upd,delete) $item]} {
            $path.c itemconfigure "n:$item" \
                -fill [_getoption $path $item -foreground]
        }
    }
    $path.c delete sel
    if {$selfill && !$multi} {
	# cache window width for use below
	set width [winfo width $path]
    }
    foreach item $data(selitems) {
        set bbox [$path.c bbox "n:$item"]
        if { [llength $bbox] } {
            set imgbox [$path.c bbox i:$item]
            lassign $bbox x0 y0 x1 y1;
            if {[string compare "" $imgbox]} {
                # image may exist and may be heigher than text!
                lassign $imgbox ix0 iy0 ix1 iy1;
                set bbox [list $x0 [expr {min($iy0,$y0)}] $x1 [expr {max($iy1,$y1)}]];
            } else {
                set bbox [list $x0 [lindex $bbox 1] $x1 [lindex $bbox 3]]
            }
	    if { $selfill && !$multi } {
		# With -selectfill, make box occupy full width of widget
		set bbox [list 0 [lindex $bbox 1] $width [lindex $bbox 3]]
	    }
            set tags [list sel s:$item click clickbind]
            set id [$path.c create rectangle $bbox \
                -fill $selbg -outline $selbg -tags $tags]
	    if {$selfg != ""} {
		# Don't allow an empty fill - that would be transparent
		$path.c itemconfigure "n:$item" -fill $selfg
	    }
            $path.c lower $id
            $path.c lower b:$item
        }
    }
}


# ----------------------------------------------------------------------------
#  Command ListBox::_redraw_listbox
# ----------------------------------------------------------------------------
proc ListBox::_redraw_listbox { path } {
    variable $path
    upvar 0  $path data

    if { [Widget::getoption $path -redraw] } {
        if { $data(upd,level) == 2 } {
            _redraw_items $path
        }
        _redraw_selection $path
        _update_scrollregion $path
        if {[Widget::cget $path -selectfill]} {
            _update_select_fill $path
        }
        set data(upd,level)   0
        set data(upd,afterid) ""
    }
}


# ----------------------------------------------------------------------------
#  Command ListBox::_redraw_idle
# ----------------------------------------------------------------------------
proc ListBox::_redraw_idle { path level } {
    variable $path
    upvar 0  $path data

    if { $data(nrows) != -1 } {
        # widget is realized
        if { [Widget::getoption $path -redraw] && $data(upd,afterid) == "" } {
            set data(upd,afterid) \
		[after idle [list ListBox::_redraw_listbox $path]]
        }
    }
    if { $level > $data(upd,level) } {
        set data(upd,level) $level
    }
    return ""
}


# ----------------------------------------------------------------------------
#  Command ListBox::_resize
# ----------------------------------------------------------------------------
proc ListBox::_resize { path } {
    variable $path
    upvar 0  $path data

    if { [Widget::getoption $path -multicolumn] } {
        set bd    [expr {[$path.c cget -borderwidth]+[$path.c cget -highlightthickness]}]
        set h     [expr {[winfo height $path] - 2*$bd}]
        set nrows [expr {$h/[$path.c cget -yscrollincrement]}]
        if { $nrows == 0 } {
            set nrows 1
        }
        if { $nrows != $data(nrows) } {
            set data(nrows) $nrows
            _redraw_idle $path 2
        } else {
            _update_scrollregion $path
        }
    } elseif { $data(nrows) == -1 } {
        # first Configure event
        set data(nrows) 0
        ListBox::_redraw_listbox $path
        if {[Widget::cget $path -selectfill]} {
            _update_select_fill $path
        }
    } else {
        if {[Widget::cget $path -selectfill]} {
            _update_select_fill $path
        }

        _update_scrollregion $path
    }
}


# ----------------------------------------------------------------------------
#  Command ListBox::_init_drag_cmd
# ----------------------------------------------------------------------------
proc ListBox::_init_drag_cmd { path X Y top } {
    set path [winfo parent $path]
    set ltags [$path.c gettags current]
    set item  [lindex $ltags 0]
    if { [string equal $item "item"] ||
         [string equal $item "img"]  ||
         [string equal $item "win"] } {
        set item [ListBox::_get_node_name $path]
        if {[llength [set cmd [Widget::getoption $path -draginitcmd]]]} {
            return [uplevel \#0 $cmd [list $path $item $top]]
        }
        if { [set type [Widget::getoption $path -dragtype]] == "" } {
            set type "LISTBOX_ITEM"
        }
        if { [set img [Widget::getoption $path.$item -image]] != "" } {
            pack [label $top.l -image $img -padx 0 -pady 0]
        }
        return [list $type {copy move link} $item]
    }
    return {}
}


# ----------------------------------------------------------------------------
#  Command ListBox::_drop_cmd
# ----------------------------------------------------------------------------
proc ListBox::_drop_cmd { path source X Y op type dnddata } {
    set path [winfo parent $path]
    variable $path
    upvar 0  $path data

    if { [string length $data(dnd,afterid)] } {
        after cancel $data(dnd,afterid)
        set data(dnd,afterid) ""
    }
    $path.c delete drop
    set data(dnd,scroll) ""
    if { [llength $data(dnd,item)] || ![llength $data(items)] } {
        if {[llength [set cmd [Widget::getoption $path -dropcmd]]]} {
            return [uplevel \#0 $cmd [list $path $source $data(dnd,item) $op $type $dnddata]]
        }
    }
    return 0
}


# ----------------------------------------------------------------------------
#  Command ListBox::_over_cmd
# ----------------------------------------------------------------------------
proc ListBox::_over_cmd { path source event X Y op type dnddata } {
    set path [winfo parent $path]
    variable $path
    upvar 0  $path data

    if { [string equal $event "leave"] } {
        # we leave the window listbox
        $path.c delete drop
        if { [string length $data(dnd,afterid)] } {
            after cancel $data(dnd,afterid)
            set data(dnd,afterid) ""
        }
        set data(dnd,scroll) ""
        return 0
    }

    if { [string equal $event "enter"] } {
        # we enter the window listbox - dnd data initialization
        set mode [Widget::getoption $path -dropovermode]
        set data(dnd,mode) 0
        foreach c {w p i} {
            set data(dnd,mode) [expr {($data(dnd,mode) << 1) | ([string first $c $mode] != -1)}]
        }
    }

    set x [expr {$X-[winfo rootx $path]}]
    set y [expr {$Y-[winfo rooty $path]}]
    $path.c delete drop
    set data(dnd,item) ""

    # test for auto-scroll unless mode is widget only
    if { $data(dnd,mode) != 4 && [_auto_scroll $path $x $y] != "" } {
        return 2
    }

    if { $data(dnd,mode) & 4 } {
        # dropovermode includes widget
        set target [list widget]
        set vmode  4
    } else {
        set target [list ""]
        set vmode  0
    }
    if { ($data(dnd,mode) & 2) && ![llength $data(items)] } {
        # dropovermode includes position and listbox is empty
        lappend target "" 0
        set vmode [expr {$vmode | 2}]
    }

    if { ($data(dnd,mode) & 3) && [llength $data(items)]} {
        # dropovermode includes item or position
        # we extract the box (xi,yi,xs,ys) where we can find item around x,y
        set len  [llength $data(items)]
        set xc   [$path.c canvasx $x]
        set yc   [$path.c canvasy $y]
        set dy   [$path.c cget -yscrollincrement]
        set line [expr {int($yc/$dy)}]
        set yi   [expr {$line*$dy}]
        set ys   [expr {$yi+$dy}]
        set xi   0
        set pos  $line
        if { [Widget::getoption $path -multicolumn] } {
            set nrows $data(nrows)
        } else {
            set nrows $len
        }
        if { $line < $nrows } {
            foreach xs $data(xlist) {
                if { $xc <= $xs } {
                    break
                }
                set  xi  $xs
                incr pos $nrows
            }
            if { $pos < $len } {
                set item [lindex $data(items) $pos]
                set xi   [expr {[lindex [$path.c coords n:$item] 0]-[Widget::getoption $path -padx]-1}]
                if { $data(dnd,mode) & 1 } {
                    # dropovermode includes item
                    lappend target $item
                    set vmode [expr {$vmode | 1}]
                } else {
                    lappend target ""
                }

                if { $data(dnd,mode) & 2 } {
                    # dropovermode includes position
                    if { $yc >= $yi+$dy/2 } {
                        # position is after $item
                        incr pos
                        set yl $ys
                    } else {
                        # position is before $item
                        set yl $yi
                    }
                    lappend target $pos
                    set vmode [expr {$vmode | 2}]
                } else {
                    lappend target ""
                }
            } else {
                lappend target "" ""
            }
        } else {
            lappend target "" ""
        }

        if { ($vmode & 3) == 3 } {
            # result have both item and position
            # we compute what is the preferred method
            if { $yc-$yi <= 3 || $ys-$yc <= 3 } {
                lappend target "position"
            } else {
                lappend target "item"
            }
        }
    }

    if {$vmode && [llength [set cmd [Widget::getoption $path -dropovercmd]]]} {
        # user-defined dropover command
        set res   [uplevel \#0 $cmd [list $source $target $op $type $dnddata]]
        set code  [lindex $res 0]
        set vmode 0
        if {$code & 1} {
            # update vmode
            switch -exact -- [lindex $res 1] {
                item     {set vmode 1}
                position {set vmode 2}
                widget   {set vmode 4}
            }
        }
    } else {
        if { ($vmode & 3) == 3 } {
            # result have both item and position
            # we choose the preferred method
            if { [string equal [lindex $target 3] "position"] } {
                set vmode [expr {$vmode & ~1}]
            } else {
                set vmode [expr {$vmode & ~2}]
            }
        }

        if { $data(dnd,mode) == 4 || $data(dnd,mode) == 0 } {
            # dropovermode is widget or empty - recall is not necessary
            set code 1
        } else {
            set code 3
        }
    }

    # draw dnd visual following vmode
    if {[llength $data(items)]} {
        if { $vmode & 1 } {
            set data(dnd,item) [list "item" [lindex $target 1]]
            $path.c create rectangle $xi $yi $xs $ys -tags drop
        } elseif { $vmode & 2 } {
            set data(dnd,item) [concat "position" [lindex $target 2]]
            $path.c create line $xi $yl $xs $yl -tags drop
        } elseif { $vmode & 4 } {
            set data(dnd,item) [list "widget"]
        } else {
            set code [expr {$code & 2}]
        }
    }

    if { $code & 1 } {
        DropSite::setcursor based_arrow_down
    } else {
        DropSite::setcursor dot
    }
    return $code
}


# ----------------------------------------------------------------------------
#  Command ListBox::_auto_scroll
# ----------------------------------------------------------------------------
proc ListBox::_auto_scroll { path x y } {
    variable $path
    upvar 0  $path data

    set xmax   [winfo width  $path]
    set ymax   [winfo height $path]
    set scroll {}
    if { $y <= 6 } {
        if { [lindex [$path.c yview] 0] > 0 } {
            set scroll [list yview -1]
            DropSite::setcursor sb_up_arrow
        }
    } elseif { $y >= $ymax-6 } {
        if { [lindex [$path.c yview] 1] < 1 } {
            set scroll [list yview 1]
            DropSite::setcursor sb_down_arrow
        }
    } elseif { $x <= 6 } {
        if { [lindex [$path.c xview] 0] > 0 } {
            set scroll [list xview -1]
            DropSite::setcursor sb_left_arrow
        }
    } elseif { $x >= $xmax-6 } {
        if { [lindex [$path.c xview] 1] < 1 } {
            set scroll [list xview 1]
            DropSite::setcursor sb_right_arrow
        }
    }

    if { [string length $data(dnd,afterid)] && ![string equal $data(dnd,scroll) $scroll] } {
        after cancel $data(dnd,afterid)
        set data(dnd,afterid) ""
    }

    set data(dnd,scroll) $scroll
    if { [llength $scroll] && ![string length $data(dnd,afterid)] } {
        set data(dnd,afterid) [after 200 [list ListBox::_scroll $path $scroll]]
    }
    return $data(dnd,afterid)

}

# -----------------------------------------------------------------------------
#  Command ListBox::_multiple_select
# -----------------------------------------------------------------------------
proc ListBox::_multiple_select { path mode x y idx } {

    variable $path
    upvar 0  $path data


    if { ![info exists data(anchor)] || ![info exists data(sel_anchor)] } {
	set data(anchor) $idx
	set data(sel_anchor) {}
    }

    switch -exact -- $mode {
	n {
	    _mouse_select $path set $idx
	    set data(anchor) $idx
	    set data(sel_anchor) {}
	}
	c {
	    set l [$path selection get]
	    if { [lsearch -exact $l $idx] >= 0 } {
		_mouse_select $path remove $idx
	    } else {
		_mouse_select $path add $idx
	    }
	    set data(anchor) $idx
	    set data(sel_anchor) {}
	}
	s {
	    eval [list $path _mouse_select remove] $data(sel_anchor)

	    set ix [$path index $idx]
	    set ia [$path index $data(anchor)]
	    if { $ix > $ia } {
		set istart $ia
		set iend $ix
  	    } else {
		set istart $ix
		set iend $ia
  	    }

  	    for { set i $istart } { $i <= $iend } { incr i } {
		set l [$path selection get]
		set t [$path items $i]
		set li [lsearch -exact $l $t]
		if { $li < 0 } {
		    _mouse_select $path add $t
		    lappend data(sel_anchor) $t
 		}
  	    }
        }
    }
}


# ----------------------------------------------------------------------------
#  Command ListBox::_scroll
# ----------------------------------------------------------------------------
proc ListBox::_scroll { path scroll} {
    variable $path
    upvar 0  $path data
    set cmd [lindex $scroll 0]
    set dir [lindex $scroll 1]
    if { ($dir == -1 && [lindex [$path.c $cmd] 0] > 0) ||
         ($dir == 1  && [lindex [$path.c $cmd] 1] < 1) } {
        $path $cmd scroll $dir units
        set data(dnd,afterid) \
	    [after 50 [list ListBox::_scroll $path $scroll]]
    } else {
        set data(dnd,afterid) ""
        DropSite::setcursor dot
    }
}

# ListBox::_set_help --
#
#	Register dynamic help for an item in the listbox.
#
# Arguments:
#	path		ListBox to query
#	item		Item in the listbox
#       force		Optional argument to force a reset of the help
#
# Results:
#	none
proc ListBox::_set_help { path node } {
    Widget::getVariable $path help

    set item $path.$node
    set opts [list -helptype -helptext -helpvar]
    foreach {cty ctx cv} [eval [linsert $opts 0 Widget::hasChangedX $item]] break
    set text [Widget::getoption $item -helptext]

    ## If we've never set help for this item before, and text is not blank,
    ## we need to setup help.  We also need to reset help if any of the
    ## options have changed.
    if { (![info exists help($node)] && $text != "") || $cty || $ctx || $cv } {
	set help($node) 1
	set type [Widget::getoption $item -helptype]
        switch $type {
            balloon {
		DynamicHelp::register $path.c balloon n:$node $text
		DynamicHelp::register $path.c balloon i:$node $text
		DynamicHelp::register $path.c balloon b:$node $text
            }
            variable {
		set var [Widget::getoption $item -helpvar]
		DynamicHelp::register $path.c variable n:$node $var $text
		DynamicHelp::register $path.c variable i:$node $var $text
		DynamicHelp::register $path.c variable b:$node $var $text
            }
        }
    }
}

# ListBox::_mouse_select --
#
#       Handle selection commands that are done by the mouse.  If the
#       selection command returns true, we generate a <<ListboxSelect>>
#       event for the listbox.
#
# Arguments:
#       Standard arguments passed to a selection command.
#
# Results:
#	none
proc ListBox::_mouse_select { path cmd args } {
    eval [linsert $args 0 selection $path $cmd]
    switch -- $cmd {
        "add" - "clear" - "remove" - "set" {
            event generate $path <<ListboxSelect>>
        }
    }
}


# ListBox::_get_node_name --
#
#	Given a listbox item, get the name of the node represented by that
#	item.
#
# Arguments:
#	path		listbox to query
#	item		Optional item to examine; if omitted, 
#			defaults to "current"
#
# Results:
#	node	name of the listbox node.
proc ListBox::_get_node_name {path {item current}} {
    set tags [$path.c gettags $item]
    if {[lindex $tags 0] == "img"} {
        set node [string range [lindex $tags 2] 2 end]
    } else {
        set node [string range [lindex $tags 1] 2 end]
    }
    return $node
}


proc ListBox::_get_current { path } {
    return [ListBox::_get_node_name $path]
}


# ListBox::_drag_and_drop --
#
#	A default command to handle drag-and-drop functions local to this
#       listbox.  With this as the default -dropcmd, the user can simply
#       enable drag-and-drop and be able to move items within this list
#       with no further code.
#
# Arguments:
#       Standard arguments passed to a dropcmd.
#
# Results:
#	none
proc ListBox::_drag_and_drop { path from endItem operation type startItem } {
    set items [$path items]

    ## This proc only handles drag-and-drop commands within itself.
    ## If the widget this came from is not our widget (minus the canvas),
    ## we don't want to do anything.  They need to handle this themselves.
    if {[winfo parent $from] != $path} { return }

    set place [lindex $endItem 0]
    set i     [lindex $endItem 1]

    switch -- $place {
        "position" {
            set idx $i
        } 
        "item" {
            set idx [$path index $i]
        }
        "widget" {
            set idx [llength $items]
        }
    }

    # Check if startItem is part of the current selection and process the
    # whole selection if so
    set selItems [selection $path get]
    if {-1 != [lsearch -exact $selItems $startItem]} {
        set dragItems $selItems
    } else {
        set dragItems [list $startItem]
    }

    # get drag indexes (to sort them)
	foreach dragItem $dragItems {
        lappend dragIdx [$path index $dragItem]
    }
    foreach pos [lsort -integer -indices $dragIdx] {
        set dragItem [lindex $dragItems $pos]
        set dragIdx [$path index $dragItem]
        if {$idx > $dragIdx} { incr idx -1 }
        if {[string equal $operation "copy"]} {
            set options [Widget::options $path.$dragItem]
            eval [linsert $options 0 $path insert $idx $dragItem\#auto]
            incr idx
        } else {
            $path move $dragItem $idx
            set idx [$path index $dragItem]
            incr idx
        }
    }
}


proc ListBox::_keyboard_navigation { path dir } {
    variable $path
    upvar 0  $path data

    set sel [$path index [lindex [$path selection get] end]]
    if {$dir > 0} {
	incr sel
	if {$sel >= [llength $data(items)]} { return }
    } else {
	incr sel -1
	if {$sel < 0} { return }
    }
    set item [lindex $data(items) $sel]
    $path see $item
    _mouse_select $path set $item
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/mainframe.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
# ----------------------------------------------------------------------------
#  mainframe.tcl
#  This file is part of Unifix BWidget Toolkit
#  $Id: mainframe.tcl,v 1.24.2.3 2011/05/25 15:10:07 oehhar Exp $
# ------------------------------------------------------------------------------
#  Index of commands:
#     - MainFrame::create
#     - MainFrame::configure
#     - MainFrame::cget
#     - MainFrame::getframe
#     - MainFrame::addtoolbar
#     - MainFrame::gettoolbar
#     - MainFrame::addindicator
#     - MainFrame::getindicator
#     - MainFrame::getmenu
#     - MainFrame::menuonly
#     - MainFrame::showtoolbar
#     - MainFrame::showstatusbar
#     - MainFrame::_create_menubar
#     - MainFrame::_create_entries
#     - MainFrame::_parse_name
#     - MainFrame::_parse_accelerator
# ----------------------------------------------------------------------------

namespace eval MainFrame {
    Widget::define MainFrame mainframe ProgressBar

    Widget::bwinclude MainFrame ProgressBar .status.prg \
	    remove {
	-fg -bg -bd -troughcolor -background -borderwidth
	-relief -orient -width -height
    } \
	    rename {
	-maximum    -progressmax
	-variable   -progressvar
	-type       -progresstype
	-foreground -progressfg
    }

    Widget::declare MainFrame {
	{-width         TkResource 0      0 frame}
	{-height        TkResource 0      0 frame}
	{-background    TkResource ""     0 frame}
	{-textvariable  String     ""     0}
	{-menu          String     {}     1}
	{-separator     Enum       both   1 {none top bottom both}}
	{-bg            Synonym    -background}

	{-menubarfont   String     ""  0}
	{-menuentryfont String     ""  0}
	{-statusbarfont String     ""  0}
	{-sizegrip      Boolean    0   1}
    }

    Widget::addmap MainFrame "" .frame  {-width {} -height {} -background {}}
    Widget::addmap MainFrame "" .topf   {-background {}}
    Widget::addmap MainFrame "" .botf   {-background {}}
    Widget::addmap MainFrame "" .status {-background {}}
    Widget::addmap MainFrame "" .status.label {-background {}}
    Widget::addmap MainFrame "" .status.indf  {-background {}}
    Widget::addmap MainFrame "" .status.prgf  {-background {}}
    Widget::addmap MainFrame ProgressBar .status.prg {-background {} -background -troughcolor}

    variable _widget
}


# ----------------------------------------------------------------------------
#  Command MainFrame::create
# ----------------------------------------------------------------------------
proc MainFrame::create { path args } {
    global   tcl_platform
    variable _widget

    if {[Widget::theme]} {
	set path [ttk::frame $path]
    } else {
	set path [frame $path -takefocus 0 -highlightthickness 0]
    }
    set top  [winfo parent $path]
    if { ![string equal [winfo toplevel $path] $top] } {
        destroy $path
        return -code error "parent must be a toplevel"
    }
    Widget::init MainFrame $path $args

    if { $tcl_platform(platform) == "unix" } {
        set relief raised
        set bd     1
    } else {
        set relief flat
        set bd     0
    }
    if {[Widget::theme]} {
	set userframe [eval [list ttk::frame $path.frame] \
			   [Widget::subcget $path .frame]]
	set topframe  [ttk::frame $path.topf]
	set botframe  [ttk::frame $path.botf]
    } else {
	set userframe [eval [list frame $path.frame] \
			   [Widget::subcget $path .frame] \
			   -relief $relief -borderwidth $bd]
	set topframe  [eval [list frame $path.topf] \
			   [Widget::subcget $path .topf]]
	set botframe  [eval [list frame $path.botf] \
			   -relief $relief -borderwidth $bd \
			   [Widget::subcget $path .botf]]
    }

    pack $topframe -fill x
    grid columnconfigure $topframe 0 -weight 1

    if {![Widget::theme]} {
	set bg [Widget::cget $path -background]
	$path configure -background $bg
    }
    if { $tcl_platform(platform) != "unix" } {
        set sepopt [Widget::getoption $path -separator]
        if { $sepopt == "both" || $sepopt == "top" } {
	    if {[Widget::theme]} {
		set sep [ttk::separator $path.sep -orient horizontal]
	    } else {
		set sep [Separator::create $path.sep -orient horizontal -background $bg]
	    }
            pack $sep -fill x
        }
        if { $sepopt == "both" || $sepopt == "bottom" } {
	    if {[Widget::theme]} {
		set sep [ttk::separator $botframe.sep -orient horizontal]
	    } else {
		set sep [Separator::create $botframe.sep -orient horizontal -background $bg]
	    }
            pack $sep -fill x
        }
    }

    # --- status bar ---------------------------------------------------------
    if {[string length [Widget::getoption $path -statusbarfont]]} {
	set sbfnt [list -font [Widget::getoption $path -statusbarfont]]
    } else {
	set sbfnt ""
    }

    if {[Widget::theme]} {
	set status   [ttk::frame $path.status]
	set label    [eval [list ttk::label $status.label \
				-textvariable [Widget::getoption $path -textvariable]] $sbfnt]
	set indframe [ttk::frame $status.indf]
	set prgframe [ttk::frame $status.prgf]
    } else {
	set status   [frame $path.status -background $bg]
	set label    [eval [list label $status.label \
				-textvariable [Widget::getoption $path -textvariable] \
				-background $bg] $sbfnt]
	set indframe [frame $status.indf -background $bg]
	set prgframe [frame $status.prgf -background $bg]
    }

    place $label    -anchor w -x 0 -rely 0.5
    place $indframe -anchor ne -relx 1 -y 0 -relheight 1
    pack  $prgframe -in $indframe -side left -padx 2
    $status configure -height [winfo reqheight $label]

    set progress [eval [list ProgressBar::create $status.prg] \
		      [Widget::subcget $path .status.prg] \
                      -width       50 \
                      -height      [expr {[winfo reqheight $label]-2}] \
                      -borderwidth 1 \
                      -relief      sunken]
    if {[Widget::theme] && [Widget::getoption $path -sizegrip]} {
	pack [ttk::sizegrip $botframe.sg] -side right -anchor se
    }
    pack $status    -in $botframe -fill x -pady 2
    pack $botframe  -side bottom -fill x
    pack $userframe -fill both -expand yes

    set _widget($path,top)      $top
    set _widget($path,ntoolbar) 0
    set _widget($path,nindic)   0

    set menu [Widget::getoption $path -menu]
    if { [llength $menu] } {
        _create_menubar $path $menu
    }

    bind $path <Destroy> [list MainFrame::_destroy %W]

    return [Widget::create MainFrame $path]
}


# ----------------------------------------------------------------------------
#  Command MainFrame::configure
# ----------------------------------------------------------------------------
proc MainFrame::configure { path args } {
    variable _widget

    set res [Widget::configure $path $args]

    if { [Widget::hasChanged $path -textvariable newv] } {
        uplevel \#0 $path.status.label configure -textvariable [list $newv]
    }

    # The ttk frame has no -background
    if {![Widget::theme] && [Widget::hasChanged $path -background bg] } {
	if {($::tcl_platform(platform) == "unix")
	        && (0 != [string compare [tk windowingsystem] "aqua"])} {
	    set listmenu [$_widget($path,top) cget -menu]
	    while { [llength $listmenu] } {
		set newlist {}
		foreach menu $listmenu {
		    $menu configure -background $bg
		    set newlist [concat $newlist [winfo children $menu]]
		}
		set listmenu $newlist
	    }
	}
	foreach sep {.sep .botf.sep} {
	    if {[winfo exists $path.$sep]} {
		Separator::configure $path.$sep -background $bg
	    }
	}
	foreach w [winfo children $path.topf] {
	    $w configure -background $bg
	}
    }

    if { [Widget::hasChanged $path -menubarfont newmbfnt] } {
	if {[string length $newmbfnt]} {
	    set mbfnt [list -font $newmbfnt]
	} else {
	    set mbfnt ""
	}
	set top     $_widget($path,top)
	if {[string equal $top .]} {
	    eval [list .menubar configure] $mbfnt
	} else {
	    eval [list $top.menubar configure] $mbfnt
	}
    }
    if { [Widget::hasChanged $path -menuentryfont newmefnt] } {
	if {[string length $newmefnt]} {
	    set mefnt [list -font $newmefnt]
	} else {
	    set mefnt ""
	}
	set top     $_widget($path,top)
	if {[string equal $top .]} {
	    set mb .menubar
	} else {
	    set mb $top.menubar
	}
	set l [winfo children $mb]
	while {[llength $l]} {
	    set e [lindex $l 0]
	    set l [lrange $l 1 end]
	    if {[string length $e] == 0} {continue}
	    lappend l [winfo children $e]
	    eval [list $e configure] $mefnt
	}
    }


    if { [Widget::hasChanged $path -statusbarfont newsbfnt] } {
	if {[string length $newsbfnt]} {
	    set sbfnt [list -font $newsbfnt]
	} else {
	    set sbfnt ""
	}
	for {set index 0} {$index<$_widget($path,nindic)} {incr index} {
	    set indic $path.status.indf.f$index
	    eval [list $indic configure] $sbfnt
	}
	eval [list $path.status.label configure] $sbfnt
	$path.status configure -height [winfo reqheight $path.status.label]

	$path.status.prg configure \
		-height [expr {[winfo reqheight $path.status.label]-2}]
    }

    return $res
}


# ----------------------------------------------------------------------------
#  Command MainFrame::cget
# ----------------------------------------------------------------------------
proc MainFrame::cget { path option } {
    return [Widget::cget $path $option]
}


# ----------------------------------------------------------------------------
#  Command MainFrame::getframe
# ----------------------------------------------------------------------------
proc MainFrame::getframe { path } {
    return $path.frame
}


# ----------------------------------------------------------------------------
#  Command MainFrame::addtoolbar
# ----------------------------------------------------------------------------
proc MainFrame::addtoolbar { path } {
    global   tcl_platform
    variable _widget

    set index     $_widget($path,ntoolbar)
    set toolframe $path.topf.f$index
    set toolbar   $path.topf.tb$index
    if { $tcl_platform(platform) == "unix" } {
	if {[Widget::theme]} {
	    ttk::frame $toolframe -padding 1
	} else {
	    set bg [Widget::getoption $path -background]
	    frame $toolframe -relief raised -borderwidth 1 \
		-takefocus 0 -highlightthickness 0 -background $bg
	}
    } else {
	if {[Widget::theme]} {
	    ttk::frame $toolframe
	    set sep [ttk::separator $toolframe.sep -orient horizontal]
	} else {
	    set bg [Widget::getoption $path -background]
	    frame $toolframe -relief flat -borderwidth 0 -takefocus 0 \
		-highlightthickness 0 -background $bg
	    set sep [Separator::create $toolframe.sep -orient horizontal -background $bg]
	}
        pack $sep -fill x
    }
    if {[Widget::theme]} {
	set toolbar [ttk::frame $toolbar -padding 2]
    } else {
	set toolbar [frame $toolbar -relief flat -borderwidth 2 \
			 -takefocus 0 -highlightthickness 0 -background $bg]
    }
    pack $toolbar -in $toolframe -anchor w -expand yes -fill x
    incr _widget($path,ntoolbar)
    grid $toolframe -column 0 -row $index -sticky ew
    return $toolbar
}


# ----------------------------------------------------------------------------
#  Command MainFrame::gettoolbar
# ----------------------------------------------------------------------------
proc MainFrame::gettoolbar { path index } {
    return $path.topf.tb$index
}


# ----------------------------------------------------------------------------
#  Command MainFrame::addindicator
# ----------------------------------------------------------------------------
proc MainFrame::addindicator { path args } {
    variable _widget

    if {[string length [Widget::getoption $path -statusbarfont]]} {
	set sbfnt [list -font [Widget::getoption $path -statusbarfont]]
    } else {
	set sbfnt ""
    }

    set index $_widget($path,nindic)
    set indic $path.status.indf.f$index
    eval [list label $indic] $args -relief sunken -borderwidth 1 \
        -takefocus 0 -highlightthickness 0 $sbfnt

    pack $indic -side left -anchor w -padx 2 -fill y -expand 1

    incr _widget($path,nindic)

    return $indic
}


# ----------------------------------------------------------------------------
#  Command MainFrame::getindicator
# ----------------------------------------------------------------------------
proc MainFrame::getindicator { path index } {
    return $path.status.indf.f$index
}


# ----------------------------------------------------------------------------
#  Command MainFrame::getmenu
# ----------------------------------------------------------------------------
proc MainFrame::getmenu { path menuid } {
    variable _widget

    if { [info exists _widget($path,menuid,$menuid)] } {
        return $_widget($path,menuid,$menuid)
    }
    return ""
}


# -----------------------------------------------------------------------------
#  Command MainFrame::setmenustate
# -----------------------------------------------------------------------------
proc MainFrame::setmenustate { path tag state } {
    variable _widget

    # Set menustate to enabled when ALL of its tags are enabled.

    # First see if this is a real tag
    if { [info exists _widget($path,tagstate,$tag)] } {
	if { ![string equal $state "disabled"] } {
	    set _widget($path,tagstate,$tag) 1
	} else {
	    set _widget($path,tagstate,$tag) 0
	}
	foreach {menu entry} $_widget($path,tags,$tag) {
	    set expression "1"
	    foreach menutag $_widget($path,menutags,[list $menu $entry]) {
		append expression " && $_widget($path,tagstate,$menutag)"
	    }
	    if { [expr $expression] } {
		set state normal
	    } else {
		set state disabled
	    }
	    $menu entryconfigure $entry -state $state
	}
    }
    return
}

# -----------------------------------------------------------------------------
#  Command MainFrame::getmenustate
# -----------------------------------------------------------------------------
proc MainFrame::getmenustate { path tag } {
    variable _widget

    if {$_widget($path,tagstate,$tag)} {
        return normal
    } else {
        return disabled
    }
}

# -----------------------------------------------------------------------------
#  Command MainFrame::menuonly
# ----------------------d------------------------------------------------------
proc MainFrame::menuonly { path } {
    variable _widget

    catch {pack forget $path.sep}
    catch {pack forget $path.botf.sep}
    catch {pack forget $path.frame}
}

# ----------------------------------------------------------------------------
#  Command MainFrame::showtoolbar
# ----------------------------------------------------------------------------
proc MainFrame::showtoolbar { path index bool } {
    variable _widget

    set toolframe $path.topf.f$index
    if { [winfo exists $toolframe] } {
        if { !$bool && [llength [grid info $toolframe]] } {
            grid forget $toolframe
            $path.topf configure -height 1
        } elseif { $bool && ![llength [grid info $toolframe]] } {
            grid $toolframe -column 0 -row $index -sticky ew
        }
    }
}


# ----------------------------------------------------------------------------
#  Command MainFrame::showstatusbar
# ----------------------------------------------------------------------------
proc MainFrame::showstatusbar { path name } {
    set status $path.status
    set botframe $path.botf
    if { [string equal $name "none"] } {
        pack forget $status
    } else {
        pack $status -fill x -in $botframe -fill x -pady 2
        switch -- $name {
            status {
                catch {pack forget $status.prg}
            }
            progression {
                pack $status.prg -in $status.prgf
            }
        }
    }
}


# ----------------------------------------------------------------------------
#  Command MainFrame::_destroy
# ----------------------------------------------------------------------------
proc MainFrame::_destroy { path } {
    variable _widget

    Widget::destroy $path
    catch {destroy [$_widget($path,top) cget -menu]}
    $_widget($path,top) configure -menu {}

    # Unset all of the state vars associated with this main frame.
    foreach index [array names _widget $path,*] {
	unset _widget($index)
    }
}


# ----------------------------------------------------------------------------
#  Command MainFrame::_create_menubar
# ----------------------------------------------------------------------------
proc MainFrame::_create_menubar { path descmenu } {
    variable _widget
    global    tcl_platform

    set top $_widget($path,top)

    foreach {v x} {mbfnt -menubarfont mefnt -menuentryfont} {
	if {[string length [Widget::getoption $path $x]]} {
	    set $v [list -font [Widget::getoption $path $x]]
	} else {
	    set $v ""
	}
    }

    if { ![Widget::theme] && $tcl_platform(platform) == "unix"
        && [tk windowingsystem] !="aqua" } {
	set menuopts [list -background [Widget::getoption $path -background] \
			  -borderwidth 1]
    } else {
	set menuopts [list]
    }
    set menubar [eval [list menu $top.menubar -tearoff 0] $menuopts $mbfnt]
    $top configure -menu $menubar

    set count 0
    foreach {name tags menuid tearoff entries} $descmenu {
        set opt  [_parse_name $name]
        if {[string length $menuid]
	    && ![info exists _widget($path,menuid,$menuid)] } {
            # menu has identifier
	    # we use it for its pathname, to enable special menu entries
	    # (help, system, ...)
	    set menu $menubar.$menuid
        } else {
	    set menu $menubar.menu$count
	}
        eval [list $menubar add cascade] $opt [list -menu $menu]
        eval [list menu $menu -tearoff $tearoff] $menuopts $mefnt
        foreach tag $tags {
            lappend _widget($path,tags,$tag) $menubar $count
	    # ericm@scriptics:  Add a tagstate tracker
	    if { ![info exists _widget($path,tagstate,$tag)] } {
		set _widget($path,tagstate,$tag) 1
	    }
        }
	# ericm@scriptics:  Add mapping from menu items to tags
	set _widget($path,menutags,[list $menubar $count]) $tags

        if { [string length $menuid] } {
            # menu has identifier
            set _widget($path,menuid,$menuid) $menu
        }
        _create_entries $path $menu $menuopts $entries
        incr count
    }
}


# ----------------------------------------------------------------------------
#  Command MainFrame::_create_entries
# ----------------------------------------------------------------------------
proc MainFrame::_create_entries { path menu menuopts entries } {
    variable _widget

    set count      [$menu cget -tearoff]
    set registered 0
    foreach entry $entries {
        set len  [llength $entry]
        set type [lindex $entry 0]

        if { [string equal $type "separator"] } {
            $menu add separator
            incr count
            continue
        }

        # entry name and tags
        set opt  [_parse_name [lindex $entry 1]]
        set tags [lindex $entry 2]
        foreach tag $tags {
            lappend _widget($path,tags,$tag) $menu $count
	    # ericm@scriptics:  Add a tagstate tracker
	    if { ![info exists _widget($path,tagstate,$tag)] } {
		set _widget($path,tagstate,$tag) 1
	    }
        }
	# ericm@scriptics:  Add mapping from menu items to tags
	set _widget($path,menutags,[list $menu $count]) $tags

        if {[string equal $type "cascade"] || [string equal $type "cascad"]} {
            set menuid  [lindex $entry 3]
            set tearoff [lindex $entry 4]
            set submenu $menu.menu$count
            eval [list $menu add cascade] $opt [list -menu $submenu]
            eval [list menu $submenu -tearoff $tearoff] $menuopts
            if { [string length $menuid] } {
                # menu has identifier
                set _widget($path,menuid,$menuid) $submenu
            }
            _create_entries $path $submenu $menuopts [lindex $entry 5]
            incr count
            continue
        }

        # entry help description
        set desc [lindex $entry 3]
        if { [string length $desc] } {
            if { !$registered } {
                DynamicHelp::register $menu menu [Widget::getoption $path -textvariable]
                set registered 1
            }
            DynamicHelp::register $menu menuentry $count $desc
        }

        # entry accelerator
        set accel [_parse_accelerator [lindex $entry 4]]
        if { [llength $accel] } {
            lappend opt -accelerator [lindex $accel 0]
            foreach event [lindex $accel 1] {
                bind $_widget($path,top) $event [list $menu invoke $count]
            }
            foreach event [lindex $accel 2] {
                if {[bind $_widget($path,top) $event] == {}} {
                    bind $_widget($path,top) $event { # do nothing }
                } else {
                    # The existing binding will intercept these events.
                }
            }
        }

        # user options
        set useropt [lrange $entry 5 end]
        if { [string equal $type "command"] ||
             [string equal $type "radiobutton"] ||
             [string equal $type "checkbutton"] } {
            eval [list $menu add $type] $opt $useropt
        } else {
            return -code error "invalid menu type \"$type\""
        }
        incr count
    }
}


# ----------------------------------------------------------------------------
#  Command MainFrame::_parse_name
# ----------------------------------------------------------------------------
proc MainFrame::_parse_name { menuname } {
    set idx [string first "&" $menuname]
    if { $idx == -1 } {
        return [list -label $menuname]
    } else {
        set beg [string range $menuname 0 [expr {$idx-1}]]
        set end [string range $menuname [expr {$idx+1}] end]
        append beg $end
        return [list -label $beg -underline $idx]
    }
}


# MainFrame::_parse_accelerator --
#
#	Given a key combo description, construct an appropriate human readable
#	string (for display on as a menu accelerator), a list of the
#	corresponding bind events, and a separate list of bind events that need
#	to be blocked.
#
# 	When argument $desc does not include "Shift", the bindings to $events
# 	will in some cases also intercept events that have the modifier "Shift",
# 	unless more specific bindings $blockEvents exist to the latter.  This
# 	situation occurs, for example, when a Cmd binding exists without a
# 	corresponding ShiftCmd binding.  The list of events that need to be
#       blocked is returned as the third element of the result.
#
# Arguments:
#	desc	a list with the following format:
#			?sequence? key
#		sequence may be None, Ctrl, Alt, CtrlAlt, Shift, Cmd or
#			ShiftCmd
#		key may be any key
#
# Results:
#	{accel events blockEvents}  a list containing the accelerator string and
#	                            two lists of events

proc MainFrame::_parse_accelerator { desc } {
    variable _widget

    set fKey 0
    if { [llength $desc] == 1 } {
	set seq None
	set key [string tolower [lindex $desc 0]]
	# If the key is an F key (ie, F1, F2, etc), it has to be capitalized
	if {[regexp {^f([1-9]|([12][0-9]|3[0-5]))$} $key]} {
	    set key [string toupper $key]
	    set fKey 1
	}
    } elseif { [llength $desc] == 2 } {
        set seq [lindex $desc 0]
        set key [string tolower [lindex $desc 1]]
	# If the key is an F key (ie, F1, F2, etc), it has to be capitalized
	if {[regexp {^f([1-9]|([12][0-9]|3[0-5]))$} $key]} {
	    set key [string toupper $key]
	    set fKey 1
	}
    } else {
	return {}
    }

    # Plain "Shift" can be used only with F keys, but "ShiftCmd" is allowed.
    if {[string equal $seq "Shift"] && (!$fKey)} {
        return -code error {Shift accelerator can be used only with F keys}
    }

    set blockEvents {}
    set upc [string toupper $key]

    switch -- $seq {
	None {
	    set accel "$upc"
	    set events [list "<Key-$key>"]
	    if {$fKey} {
		set blockEvents [list "<Shift-Key-$key>"]
	    }
	}
	Shift {
	    # Used only with Function keys.
	    set accel "Shift+$upc"
	    set events [list "<Shift-Key-$key>"]
	}
	Cmd {
	    set accel "Cmd+$upc"

	    if {    [string equal [tk windowingsystem] "aqua"] &&
		   ([string first AppKit [winfo server .]] == -1)
	    } {
		# Carbon
	        set events [list "<Command-Key-$key>" \
	                    "<Lock-Command-Key-$upc>" ]
		set blockEvents [list "<Lock-Shift-Command-Key-$upc>"]
		# Both bindings must be included in $events -  the first binding
		# does not fire if "Lock" is set, and this is as bind(n) states
		# because the second binding is NOT a more specialized form of
		# the first.
	    } else {
		# Cocoa and anything else that uses Cmd
	        set events [list "<Command-Key-$key>"]
	        # A binding to "<Lock-Command-Key-$upc>" must not be included
	        # here - both events fire if "Lock" is set.
		set blockEvents [list "<Shift-Command-Key-$key>"]
	    }
	}
	ShiftCmd {
	    if {    [string equal [tk windowingsystem] "aqua"] &&
		    ([string first AppKit [winfo server .]] == -1)
	    } {
		# Carbon
		set accel "Shift+Cmd+$upc"
		set events [list "<Shift-Command-Key-$upc>" \
			    "<Lock-Shift-Command-Key-$upc>"]
		# Both bindings must be included here -  the first binding does
		# not fire if "Lock" is set, even though the second binding
		# should be recognized as a more specialized form of the first.
	    } else {
		# Cocoa and anything else that uses Cmd
		set accel "Shift+Cmd+$upc"
		set events [list "<Shift-Command-Key-$key>"]
		# A binding to "<Lock-Shift-Command-Key-$key>" must not be
		# included here - both events fire if "Lock" is set.
		# Tk/Cocoa fails to recognize
		# <Lock-Shift-Command-Key-$key> as a "more specialized" binding
		# than <Shift-Command-Key-$key>.
		# Perversely, Tk/Carbon (above) makes the opposite error.
	    }
	}
	Ctrl {
	    set accel "Ctrl+$upc"
	    set events [list "<Control-Key-$key>"]
	}
	Alt {
	    set accel "Alt+$upc"
	    set events [list "<Alt-Key-$key>"]
	}
	CtrlAlt {
	    set accel "Ctrl+Alt+$upc"
	    set events [list "<Control-Alt-Key-$key>"]
	}
	default {
	    return -code error "invalid accelerator code $seq"
	}
    }

    return [list $accel $events $blockEvents]
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<












































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/messagedlg.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# ------------------------------------------------------------------------------
#  messagedlg.tcl
#  This file is part of Unifix BWidget Toolkit
# ------------------------------------------------------------------------------
#  Index of commands:
#     - MessageDlg::create
# ------------------------------------------------------------------------------

namespace eval MessageDlg {
    Widget::define MessageDlg messagedlg Dialog

    Widget::tkinclude MessageDlg message .frame.msg \
	    remove [list -cursor -highlightthickness		\
		-highlightbackground -highlightcolor		\
		-relief -borderwidth -takefocus -textvariable	\
		] \
	    rename [list -text -message]			\
	    initialize [list -aspect 800 -anchor c -justify center]

    Widget::bwinclude MessageDlg Dialog :cmd \
	    remove [list -modal -image -bitmap -side -anchor -separator \
		-homogeneous -padx -pady -spacing]

    Widget::declare MessageDlg {
        {-icon       Enum   info 0 {none error info question warning}}
        {-type       Enum   user 0 {abortretryignore ok okcancel \
		retrycancel yesno yesnocancel user}}
        {-buttons     String "" 0}
        {-buttonwidth String 0  0}
    }

    Widget::addmap MessageDlg "" tkMBox {
	-parent {} -message {} -default {} -title {}
    }
}


# ------------------------------------------------------------------------------
#  Command MessageDlg::create
# ------------------------------------------------------------------------------
proc MessageDlg::create { path args } {
    global tcl_platform

    array set maps [list MessageDlg {} :cmd {} .frame.msg {} tkMBox {}]
    array set maps [Widget::parseArgs MessageDlg $args]
    Widget::initFromODB MessageDlg "$path#Message" $maps(MessageDlg)

    array set dialogArgs $maps(:cmd)

    set type  [Widget::cget "$path#Message" -type]
    set icon  [Widget::cget "$path#Message" -icon]
    set width [Widget::cget "$path#Message" -buttonwidth]

    set defb  -1
    set canb  -1
    switch -- $type {
        abortretryignore {set lbut {abort retry ignore}; set defb 0}
        ok               {set lbut {ok}; set defb 0 }
        okcancel         {set lbut {ok cancel}; set defb 0; set canb 1}
        retrycancel      {set lbut {retry cancel}; set defb 0; set canb 1}
        yesno            {set lbut {yes no}; set defb 0; set canb 1}
        yesnocancel      {set lbut {yes no cancel}; set defb 0; set canb 2}
        user             {set lbut [Widget::cget "$path#Message" -buttons]}
    }

    # If the user didn't specify a default button, use our type-specific
    # default, adding its flag/value to the "user" settings and to the tkMBox
    # settings
    if { ![info exists dialogArgs(-default)] } {
	lappend maps(:cmd) -default $defb
	lappend maps(tkMBox) -default $defb
    }
    if { ![info exists dialogArgs(-cancel)] } {
        lappend maps(:cmd) -cancel $canb
    }

    # Same with title as with default
    if { ![info exists dialogArgs(-title)] } {
        set frame [frame $path -class MessageDlg]
        set title [option get $frame "${icon}Title" MessageDlg]
        destroy $frame
        if { $title == "" } {
            set title "Message"
        }
	lappend maps(:cmd) -title $title
	lappend maps(tkMBox) -title $title
    }

    # Create the "user" type dialog
    if { $type == "user" } {
        if { $icon != "none" } {
            set image [Bitmap::get $icon]
        } else {
            set image ""
        }
        eval [list Dialog::create $path] $maps(:cmd) \
	    [list -image $image -modal local -side bottom -anchor e]
        foreach but $lbut {
            Dialog::add $path -text $but -name $but -width $width
        }
        set frame [Dialog::getframe $path]

        eval [list message $frame.msg] $maps(.frame.msg) \
	    [list -relief flat -borderwidth 0 -highlightthickness 0 \
		 -textvariable ""]
        pack  $frame.msg -side left -padx 3m -pady 1m -fill x -expand yes

        set res [Dialog::draw $path]
	destroy $path
    } else {
	# Do some translation of args into tk_messageBox syntax, then create
	# the tk_messageBox
	array set tkMBoxArgs $maps(tkMBox)
	set tkMBoxArgs(-default) [lindex $lbut $tkMBoxArgs(-default)]
	if { ![string equal $icon "none"] } {
	    set tkMBoxArgs(-icon) $icon
	}
	if {[info exists tkMBoxArgs(-parent)]
	    && ![winfo exists $tkMBoxArgs(-parent)]} {
	    unset tkMBoxArgs(-parent)
	}
	set tkMBoxArgs(-type) $type
	set res [eval [list tk_messageBox] [array get tkMBoxArgs]]
	set res [lsearch $lbut $res]
    }
    Widget::destroy "$path#Message"
    return $res
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/notebook.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
# ---------------------------------------------------------------------------
#  notebook.tcl
#  This file is part of Unifix BWidget Toolkit
#  $Id: notebook.tcl,v 1.25.2.2 2011/04/26 14:13:24 oehhar Exp $
# ---------------------------------------------------------------------------
#  Index of commands:
#     - NoteBook::create
#     - NoteBook::configure
#     - NoteBook::cget
#     - NoteBook::compute_size
#     - NoteBook::insert
#     - NoteBook::delete
#     - NoteBook::itemconfigure
#     - NoteBook::itemcget
#     - NoteBook::bindtabs
#     - NoteBook::raise
#     - NoteBook::see
#     - NoteBook::page
#     - NoteBook::pages
#     - NoteBook::index
#     - NoteBook::getframe
#     - NoteBook::_test_page
#     - NoteBook::_itemconfigure
#     - NoteBook::_compute_width
#     - NoteBook::_get_x_page
#     - NoteBook::_xview
#     - NoteBook::_highlight
#     - NoteBook::_select
#     - NoteBook::_redraw
#     - NoteBook::_draw_page
#     - NoteBook::_draw_arrows
#     - NoteBook::_draw_area
#     - NoteBook::_resize
# ---------------------------------------------------------------------------

namespace eval NoteBook {
    Widget::define NoteBook notebook ArrowButton DynamicHelp

    namespace eval Page {
        Widget::declare NoteBook::Page {
            {-state      Enum       normal 0 {normal disabled}}
            {-createcmd  String     ""     0}
            {-raisecmd   String     ""     0}
            {-leavecmd   String     ""     0}
            {-image      TkResource ""     0 label}
            {-text       String     ""     0}
            {-foreground         String     ""     0}
            {-background         String     ""     0}
            {-activeforeground   String     ""     0}
            {-activebackground   String     ""     0}
            {-disabledforeground String     ""     0}
        }
    }

    DynamicHelp::include NoteBook::Page balloon

    Widget::bwinclude NoteBook ArrowButton .c.fg \
	    include {-foreground -background -activeforeground \
		-activebackground -disabledforeground -repeatinterval \
		-repeatdelay -borderwidth} \
	    initialize {-borderwidth 1}
    Widget::bwinclude NoteBook ArrowButton .c.fd \
	    include {-foreground -background -activeforeground \
		-activebackground -disabledforeground -repeatinterval \
		-repeatdelay -borderwidth} \
	    initialize {-borderwidth 1}

    Widget::declare NoteBook {
	{-foreground		TkResource "" 0 button}
        {-background		TkResource "" 0 button}
        {-activebackground	TkResource "" 0 button}
        {-activeforeground	TkResource "" 0 button}
        {-disabledforeground	TkResource "" 0 button}
        {-font			TkResource "" 0 button}
        {-side			Enum       top 0 {top bottom}}
        {-homogeneous		Boolean 0   0}
        {-borderwidth		Int 1   0 "%d >= 1 && %d <= 2"}
 	{-internalborderwidth	Int 10  0 "%d >= 0"}
        {-width			Int 0   0 "%d >= 0"}
        {-height		Int 0   0 "%d >= 0"}

        {-repeatdelay        BwResource ""  0 ArrowButton}
        {-repeatinterval     BwResource ""  0 ArrowButton}

        {-fg                 Synonym -foreground}
        {-bg                 Synonym -background}
        {-bd                 Synonym -borderwidth}
        {-ibd                Synonym -internalborderwidth}

	{-arcradius          Int     2     0 "%d >= 0 && %d <= 8"}
	{-tabbevelsize       Int     0     0 "%d >= 0 && %d <= 8"}
        {-tabpady            Padding {0 6} 0 "%d >= 0"}
    }

    Widget::addmap NoteBook "" .c {-background {}}

    variable _warrow 12

    bind NoteBook <Configure> [list NoteBook::_resize  %W]
    bind NoteBook <Destroy>   [list NoteBook::_destroy %W]
}


# ---------------------------------------------------------------------------
#  Command NoteBook::create
# ---------------------------------------------------------------------------
proc NoteBook::create { path args } {
    variable $path
    upvar 0  $path data

    Widget::init NoteBook $path $args

    set data(base)     0
    set data(select)   ""
    set data(pages)    {}
    set data(pages)    {}
    set data(cpt)      0
    set data(realized) 0
    set data(wpage)    0

    _compute_height $path

    # Create the canvas
    set w [expr {[Widget::cget $path -width]+4}]
    set h [expr {[Widget::cget $path -height]+$data(hpage)+4}]

    frame $path -class NoteBook -borderwidth 0 -highlightthickness 0 \
	    -relief flat
    eval [list canvas $path.c] [Widget::subcget $path .c] \
	    [list -relief flat -borderwidth 0 -highlightthickness 0 \
	    -width $w -height $h]
    pack $path.c -expand yes -fill both

    # Removing the Canvas global bindings from our canvas as
    # application specific bindings on that tag may interfere with its
    # operation here. [SF item #459033]

    set bindings [bindtags $path.c]
    set pos [lsearch -exact $bindings Canvas]
    if {$pos >= 0} {
	set bindings [lreplace $bindings $pos $pos]
    }
    bindtags $path.c $bindings

    # Create the arrow button
    eval [list ArrowButton::create $path.c.fg] [Widget::subcget $path .c.fg] \
	    [list -highlightthickness 0 -type button -dir left \
	    -armcommand [list NoteBook::_xview $path -1]]

    eval [list ArrowButton::create $path.c.fd] [Widget::subcget $path .c.fd] \
	    [list -highlightthickness 0 -type button -dir right \
	    -armcommand [list NoteBook::_xview $path 1]]

    Widget::create NoteBook $path

    set bg [Widget::cget $path -background]
    foreach {data(dbg) data(lbg)} [BWidget::get3dcolor $path $bg] {break}

    return $path
}


# ---------------------------------------------------------------------------
#  Command NoteBook::configure
# ---------------------------------------------------------------------------
proc NoteBook::configure { path args } {
    variable $path
    upvar 0  $path data

    set res [Widget::configure $path $args]
    set redraw 0
    set opts [list -font -homogeneous -tabpady]
    foreach {cf ch cp} [eval Widget::hasChangedX $path $opts] {break}
    if {$cf || $ch || $cp} {
        if { $cf || $cp } {
            _compute_height $path
        }
        _compute_width $path
        set redraw 1
    }
    set chibd [Widget::hasChanged $path -internalborderwidth ibd]
    set chbg  [Widget::hasChanged $path -background bg]
    if {$chibd || $chbg} {
        foreach page $data(pages) {
            if { ! $::Widget::_theme } {
                $path.f$page configure -background $bg
            }
            $path.f$page configure -borderwidth $ibd
        }
    }

    if {$chbg} {
        set col [BWidget::get3dcolor $path $bg]
        set data(dbg)  [lindex $col 0]
        set data(lbg)  [lindex $col 1]
        set redraw 1
    }
    if { [Widget::hasChanged $path -foreground  fg] ||
         [Widget::hasChanged $path -borderwidth bd] ||
	 [Widget::hasChanged $path -arcradius radius] ||
         [Widget::hasChanged $path -tabbevelsize bevel] ||
         [Widget::hasChanged $path -side side] } {
        set redraw 1
    }
    set wc [Widget::hasChanged $path -width  w]
    set hc [Widget::hasChanged $path -height h]
    if { $wc || $hc } {
        $path.c configure \
		-width  [expr {$w + 4}] \
		-height [expr {$h + $data(hpage) + 4}]
    }
    if { $redraw } {
        _redraw $path
    }

    return $res
}


# ---------------------------------------------------------------------------
#  Command NoteBook::cget
# ---------------------------------------------------------------------------
proc NoteBook::cget { path option } {
    return [Widget::cget $path $option]
}


# ---------------------------------------------------------------------------
#  Command NoteBook::compute_size
# ---------------------------------------------------------------------------
proc NoteBook::compute_size { path } {
    variable $path
    upvar 0  $path data

    set wmax 0
    set hmax 0
    update idletasks
    foreach page $data(pages) {
        set w    [winfo reqwidth  $path.f$page]
        set h    [winfo reqheight $path.f$page]
        set wmax [expr {$w>$wmax ? $w : $wmax}]
        set hmax [expr {$h>$hmax ? $h : $hmax}]
    }
    configure $path -width $wmax -height $hmax
    # Sven... well ok so this is called twice in some cases...
    NoteBook::_redraw $path
    # Sven end
}


# ---------------------------------------------------------------------------
#  Command NoteBook::insert
# ---------------------------------------------------------------------------
proc NoteBook::insert { path index page args } {
    variable $path
    upvar 0  $path data

    if { [lsearch -exact $data(pages) $page] != -1 } {
        return -code error "page \"$page\" already exists"
    }

    set f $path.f$page
    Widget::init NoteBook::Page $f $args

    set data(pages) [linsert $data(pages) $index $page]
    # If the page doesn't exist, create it; if it does reset its bg and ibd
    if { ![winfo exists $f] } {
        if {$::Widget::_theme} {
            ttk::frame $f
        } else {
            frame $f \
                -relief      flat \
                -background  [Widget::cget $path -background] \
                -borderwidth [Widget::cget $path -internalborderwidth]
        }
        set data($page,realized) 0
    } else {
        if { ! $::Widget::_theme} {
            $f configure -background  [Widget::cget $path -background]
        }
        $f configure -borderwidth [Widget::cget $path -internalborderwidth]
    }
    _compute_height $path
    _compute_width  $path
    _draw_page $path $page 1
    _set_help  $path $page
    _redraw $path

    return $f
}


# ---------------------------------------------------------------------------
#  Command NoteBook::delete
# ---------------------------------------------------------------------------
proc NoteBook::delete { path page {destroyframe 1} } {
    variable $path
    upvar 0  $path data

    set pos [_test_page $path $page]
    set data(pages) [lreplace $data(pages) $pos $pos]
    _compute_width $path
    $path.c delete p:$page
    if { $data(select) == $page } {
        set data(select) ""
    }
    if { $pos < $data(base) } {
        incr data(base) -1
    }
    if { $destroyframe } {
        destroy $path.f$page
        unset data($page,width) data($page,realized)
    }
    _redraw $path
}


# ---------------------------------------------------------------------------
#  Command NoteBook::itemconfigure
# ---------------------------------------------------------------------------
proc NoteBook::itemconfigure { path page args } {
    _test_page $path $page
    set res [_itemconfigure $path $page $args]
    _redraw $path

    return $res
}


# ---------------------------------------------------------------------------
#  Command NoteBook::itemcget
# ---------------------------------------------------------------------------
proc NoteBook::itemcget { path page option } {
    _test_page $path $page
    return [Widget::cget $path.f$page $option]
}


# ---------------------------------------------------------------------------
#  Command NoteBook::bindtabs
# ---------------------------------------------------------------------------
proc NoteBook::bindtabs { path event script } {
    if { $script != "" } {
	append script " \[NoteBook::_get_page_name [list $path] current 1\]"
        $path.c bind "page" $event $script
    } else {
        $path.c bind "page" $event {}
    }
}


# ---------------------------------------------------------------------------
#  Command NoteBook::move
# ---------------------------------------------------------------------------
proc NoteBook::move { path page index } {
    variable $path
    upvar 0  $path data

    set pos [_test_page $path $page]
    set data(pages) [linsert [lreplace $data(pages) $pos $pos] $index $page]
    _redraw $path
}


# ---------------------------------------------------------------------------
#  Command NoteBook::raise
# ---------------------------------------------------------------------------
proc NoteBook::raise { path {page ""} } {
    variable $path
    upvar 0  $path data

    if { $page != "" } {
        _test_page $path $page
        _select $path $page
    }
    return $data(select)
}


# ---------------------------------------------------------------------------
#  Command NoteBook::see
# ---------------------------------------------------------------------------
proc NoteBook::see { path page } {
    variable $path
    upvar 0  $path data

    set pos [_test_page $path $page]
    if { $pos < $data(base) } {
        set data(base) $pos
        _redraw $path
    } else {
        set w     [expr {[winfo width $path]-1}]
        set fpage [expr {[_get_x_page $path $pos] + $data($page,width) + 6}]
        set idx   $data(base)
        while { $idx < $pos && $fpage > $w } {
            set fpage [expr {$fpage - $data([lindex $data(pages) $idx],width)}]
            incr idx
        }
        if { $idx != $data(base) } {
            set data(base) $idx
            _redraw $path
        }
    }
}


# ---------------------------------------------------------------------------
#  Command NoteBook::page
# ---------------------------------------------------------------------------
proc NoteBook::page { path first {last ""} } {
    variable $path
    upvar 0  $path data

    if { $last == "" } {
        return [lindex $data(pages) $first]
    } else {
        return [lrange $data(pages) $first $last]
    }
}


# ---------------------------------------------------------------------------
#  Command NoteBook::pages
# ---------------------------------------------------------------------------
proc NoteBook::pages { path {first ""} {last ""}} {
    variable $path
    upvar 0  $path data

    if { ![string length $first] } {
	return $data(pages)
    }

    if { ![string length $last] } {
        return [lindex $data(pages) $first]
    } else {
        return [lrange $data(pages) $first $last]
    }
}


# ---------------------------------------------------------------------------
#  Command NoteBook::index
# ---------------------------------------------------------------------------
proc NoteBook::index { path page } {
    variable $path
    upvar 0  $path data

    return [lsearch -exact $data(pages) $page]
}


# ---------------------------------------------------------------------------
#  Command NoteBook::_destroy
# ---------------------------------------------------------------------------
proc NoteBook::_destroy { path } {
    variable $path
    upvar 0  $path data

    foreach page $data(pages) {
        Widget::destroy $path.f$page
    }
    Widget::destroy $path
    unset data
}


# ---------------------------------------------------------------------------
#  Command NoteBook::getframe
# ---------------------------------------------------------------------------
proc NoteBook::getframe { path page } {
    return $path.f$page
}


# ---------------------------------------------------------------------------
#  Command NoteBook::_test_page
# ---------------------------------------------------------------------------
proc NoteBook::_test_page { path page } {
    variable $path
    upvar 0  $path data

    if { [set pos [lsearch -exact $data(pages) $page]] == -1 } {
        return -code error "page \"$page\" does not exists"
    }
    return $pos
}

proc NoteBook::_getoption { path page option } {
    set value [Widget::cget $path.f$page $option]
    if {![string length $value]} {
        set value [Widget::cget $path $option]
    }
    return $value
}

# ---------------------------------------------------------------------------
#  Command NoteBook::_itemconfigure
# ---------------------------------------------------------------------------
proc NoteBook::_itemconfigure { path page lres } {
    variable $path
    upvar 0  $path data

    set res [Widget::configure $path.f$page $lres]
    if { [Widget::hasChanged $path.f$page -text foo] } {
        _compute_width $path
    } elseif  { [Widget::hasChanged $path.f$page -image foo] } {
        _compute_height $path
        _compute_width  $path
    }
    if { [Widget::hasChanged $path.f$page -state state] &&
         $state == "disabled" && $data(select) == $page } {
        set data(select) ""
    }
    _set_help $path $page
    return $res
}


# ---------------------------------------------------------------------------
#  Command NoteBook::_compute_width
# ---------------------------------------------------------------------------
proc NoteBook::_compute_width { path } {
    variable $path
    upvar 0  $path data

    set wmax 0
    set wtot 0
    set hmax $data(hpage)
    set font [Widget::cget $path -font]
    if { ![info exists data(textid)] } {
        set data(textid) [$path.c create text 0 -100 -font $font -anchor nw]
    }
    set id $data(textid)
    $path.c itemconfigure $id -font $font
    foreach page $data(pages) {
        $path.c itemconfigure $id -text [Widget::cget $path.f$page -text]
	# Get the bbox for this text to determine its width, then substract
	# 6 from the width to account for canvas bbox oddness w.r.t. widths of
	# simple text.
	foreach {x1 y1 x2 y2} [$path.c bbox $id] break
	set x2 [expr {$x2 - 6}]
        set wtext [expr {$x2 - $x1 + 20}]
        if { [set img [Widget::cget $path.f$page -image]] != "" } {
            set wtext [expr {$wtext + [image width $img] + 4}]
            set himg  [expr {[image height $img] + 6}]
            if { $himg > $hmax } {
                set hmax $himg
            }
        }
        set  wmax  [expr {$wtext > $wmax ? $wtext : $wmax}]
        incr wtot  $wtext
        set  data($page,width) $wtext
    }
    if { [Widget::cget $path -homogeneous] } {
        foreach page $data(pages) {
            set data($page,width) $wmax
        }
        set wtot [expr {$wmax * [llength $data(pages)]}]
    }
    set data(hpage) $hmax
    set data(wpage) $wtot
}


# ---------------------------------------------------------------------------
#  Command NoteBook::_compute_height
# ---------------------------------------------------------------------------
proc NoteBook::_compute_height { path } {
    variable $path
    upvar 0  $path data

    set font    [Widget::cget $path -font]
    set pady0   [Widget::_get_padding $path -tabpady 0]
    set pady1   [Widget::_get_padding $path -tabpady 1]
    set metrics [font metrics $font -linespace]
    set imgh    0
    set lines   1
    foreach page $data(pages) {
        set img  [Widget::cget $path.f$page -image]
        set text [Widget::cget $path.f$page -text]
        set len [llength [split $text \n]]
        if {$len > $lines} { set lines $len}
        if {$img != ""} {
            set h [image height $img]
            if {$h > $imgh} { set imgh $h }
        }
    }
    set height [expr {$metrics * $lines}]
    if {$imgh > $height} { set height $imgh }
    set data(hpage) [expr {$height + $pady0 + $pady1}]
}


# ---------------------------------------------------------------------------
#  Command NoteBook::_get_x_page
# ---------------------------------------------------------------------------
proc NoteBook::_get_x_page { path pos } {
    variable _warrow
    variable $path
    upvar 0  $path data

    set base $data(base)
    # notebook tabs start flush with the left side of the notebook
    set x 0
    if { $pos < $base } {
        foreach page [lrange $data(pages) $pos [expr {$base-1}]] {
            incr x [expr {-$data($page,width)}]
        }
    } elseif { $pos > $base } {
        foreach page [lrange $data(pages) $base [expr {$pos-1}]] {
            incr x $data($page,width)
        }
    }
    return $x
}


# ---------------------------------------------------------------------------
#  Command NoteBook::_xview
# ---------------------------------------------------------------------------
proc NoteBook::_xview { path inc } {
    variable $path
    upvar 0  $path data

    if { $inc == -1 } {
        set base [expr {$data(base)-1}]
        set dx $data([lindex $data(pages) $base],width)
    } else {
        set dx [expr {-$data([lindex $data(pages) $data(base)],width)}]
        set base [expr {$data(base)+1}]
    }

    if { $base >= 0 && $base < [llength $data(pages)] } {
        set data(base) $base
        $path.c move page $dx 0
        _draw_area   $path
        _draw_arrows $path
    }
}


# ---------------------------------------------------------------------------
#  Command NoteBook::_highlight
# ---------------------------------------------------------------------------
proc NoteBook::_highlight { type path page } {
    variable $path
    upvar 0  $path data

    if { [string equal [Widget::cget $path.f$page -state] "disabled"] } {
        return
    }

    switch -- $type {
        on {
            $path.c itemconfigure "$page:poly" \
		    -fill [_getoption $path $page -activebackground]
            $path.c itemconfigure "$page:text" \
		    -fill [_getoption $path $page -activeforeground]
        }
        off {
            $path.c itemconfigure "$page:poly" \
		    -fill [_getoption $path $page -background]
            $path.c itemconfigure "$page:text" \
		    -fill [_getoption $path $page -foreground]
        }
    }
}


# ---------------------------------------------------------------------------
#  Command NoteBook::_select
# ---------------------------------------------------------------------------
proc NoteBook::_select { path page } {
    variable $path
    upvar 0  $path data

    if {![string equal [Widget::cget $path.f$page -state] "normal"]} { return }

    set oldsel $data(select)

    if {[string equal $page $oldsel]} { return }

    if { ![string equal $oldsel ""] } {
	set cmd [Widget::cget $path.f$oldsel -leavecmd]
	if { ![string equal $cmd ""] } {
	    set code [catch {uplevel \#0 $cmd} res]
	    if { $code == 1 || $res == 0 } {
		return -code $code $res
	    }
	}
	set data(select) ""
	_draw_page $path $oldsel 0
    }

    set data(select) $page
    if { ![string equal $page ""] } {
	if { !$data($page,realized) } {
	    set data($page,realized) 1
	    set cmd [Widget::cget $path.f$page -createcmd]
	    if { ![string equal $cmd ""] } {
		uplevel \#0 $cmd
	    }
	}
	set cmd [Widget::cget $path.f$page -raisecmd]
	if { ![string equal $cmd ""] } {
	    uplevel \#0 $cmd
	}
	_draw_page $path $page 0
    }

    _draw_area $path
}


# -----------------------------------------------------------------------------
#  Command NoteBook::_redraw
# -----------------------------------------------------------------------------
proc NoteBook::_redraw { path } {
    variable $path
    upvar 0  $path data

    if { !$data(realized) } { return }

    _compute_height $path

    foreach page $data(pages) {
        _draw_page $path $page 0
    }
    _draw_area   $path
    _draw_arrows $path
}


# ----------------------------------------------------------------------------
#  Command NoteBook::_draw_page
# ----------------------------------------------------------------------------
proc NoteBook::_draw_page { path page create } {
    variable $path
    upvar 0  $path data

    # --- calcul des coordonnees et des couleurs de l'onglet ------------------
    set pos [lsearch -exact $data(pages) $page]
    set bg  [_getoption $path $page -background]

    # lookup the tab colors
    set fgt   $data(lbg)
    set fgb   $data(dbg)

    set h   $data(hpage)
    set xd  [_get_x_page $path $pos]
    set xf  [expr {$xd + $data($page,width)}]

    # Set the initial text offsets -- a few pixels down, centered left-to-right
    set textOffsetY [expr [Widget::_get_padding $path -tabpady 0] + 3]
    set textOffsetX 9

    # Coordinates of the tab corners are:
    #     c3        c4
    #
    # c2                c5
    #
    # c1                c6
    #
    # where
    # c1 = $xd,	  $h
    # c2 = $xd+$xBevel,	           $arcRadius+2
    # c3 = $xd+$xBevel+$arcRadius, $arcRadius
    # c4 = $xf+1-$xBevel,          $arcRadius
    # c5 = $xf+$arcRadius-$xBevel, $arcRadius+2
    # c6 = $xf+$arcRadius,         $h

    set top		2
    set arcRadius	[Widget::cget $path -arcradius]
    set xBevel		[Widget::cget $path -tabbevelsize]

    if { $data(select) != $page } {
	if { $pos == 0 } {
	    # The leftmost page is a special case -- it is drawn with its
	    # tab a little indented.  To achieve this, we incr xd.  We also
	    # decr textOffsetX, so that the text doesn't move left/right.
	    incr xd 2
	    incr textOffsetX -2
	}
    } else {
	# The selected page's text is raised higher than the others
	incr top -2
    }

    # Precompute some coord values that we use a lot
    set topPlusRadius	[expr {$top + $arcRadius}]
    set rightPlusRadius	[expr {$xf + $arcRadius}]
    set leftPlusRadius	[expr {$xd + $arcRadius}]

    # Sven
    set side [Widget::cget $path -side]
    set tabsOnBottom [string equal $side "bottom"]

    set h1 [expr {[winfo height $path]}]
    set bd [Widget::cget $path -borderwidth]
    if {$bd < 1} { set bd 1 }

    if { $tabsOnBottom } {
	# adjust to keep bottom edge in view
	incr h1 -1
	set top [expr {$top * -1}]
	set topPlusRadius [expr {$topPlusRadius * -1}]
	# Hrm... the canvas has an issue with drawing diagonal segments
	# of lines from the bottom to the top, so we have to draw this line
	# backwards (ie, lt is actually the bottom, drawn from right to left)
        set lt  [list \
		$rightPlusRadius			[expr {$h1-$h-1}] \
		[expr {$rightPlusRadius - $xBevel}]	[expr {$h1 + $topPlusRadius}] \
		[expr {$xf - $xBevel}]			[expr {$h1 + $top}] \
		[expr {$leftPlusRadius + $xBevel}]	[expr {$h1 + $top}] \
		]
        set lb  [list \
		[expr {$leftPlusRadius + $xBevel}]	[expr {$h1 + $top}] \
		[expr {$xd + $xBevel}]			[expr {$h1 + $topPlusRadius}] \
		$xd					[expr {$h1-$h-1}] \
		]
	# Because we have to do this funky reverse order thing, we have to
	# swap the top/bottom colors too.
	set tmp $fgt
	set fgt $fgb
	set fgb $tmp
    } else {
	set lt [list \
		$xd					$h \
		[expr {$xd + $xBevel}]			$topPlusRadius \
		[expr {$leftPlusRadius + $xBevel}]	$top \
		[expr {$xf + 1 - $xBevel}]		$top \
		]
	set lb [list \
		[expr {$xf + 1 - $xBevel}] 		[expr {$top + 1}] \
		[expr {$rightPlusRadius - $xBevel}]	$topPlusRadius \
		$rightPlusRadius			$h \
		]
    }

    set img [Widget::cget $path.f$page -image]

    set ytext $top
    if { $tabsOnBottom } {
	# The "+ 2" below moves the text closer to the bottom of the tab,
	# so it doesn't look so cramped.  I should be able to achieve the
	# same goal by changing the anchor of the text and using this formula:
	# ytext = $top + $h1 - $textOffsetY
	# but that doesn't quite work (I think the linespace from the text
	# gets in the way)
	incr ytext [expr {$h1 - $h + 2}]
    }
    incr ytext $textOffsetY

    set xtext [expr {$xd + $textOffsetX}]
    if { $img != "" } {
	# if there's an image, put it on the left and move the text right
	set ximg $xtext
	incr xtext [expr {[image width $img] + 2}]
    }
	
    if { $data(select) == $page } {
        set bd    [Widget::cget $path -borderwidth]
	if {$bd < 1} { set bd 1 }
        set fg    [_getoption $path $page -foreground]
    } else {
        set bd    1
        if { [Widget::cget $path.f$page -state] == "normal" } {
            set fg [_getoption $path $page -foreground]
        } else {
            set fg [_getoption $path $page -disabledforeground]
        }
    }

    # --- creation ou modification de l'onglet --------------------------------
    # Sven
    if { $create } {
	# Create the tab region
        eval [list $path.c create polygon] [concat $lt $lb] [list \
		-tags		[list page p:$page $page:poly] \
		-outline	$bg \
		-fill		$bg \
		]
        eval [list $path.c create line] $lt [list \
            -tags [list page p:$page $page:top top] -fill $fgt -width $bd]
        eval [list $path.c create line] $lb [list \
            -tags [list page p:$page $page:bot bot] -fill $fgb -width $bd]
        $path.c create text $xtext $ytext 			\
		-text	[Widget::cget $path.f$page -text]	\
		-font	[Widget::cget $path -font]		\
		-fill	$fg					\
		-anchor	nw					\
		-tags	[list page p:$page $page:text]

        $path.c bind p:$page <ButtonPress-1> \
		[list NoteBook::_select $path $page]
        $path.c bind p:$page <Enter> \
		[list NoteBook::_highlight on  $path $page]
        $path.c bind p:$page <Leave> \
		[list NoteBook::_highlight off $path $page]
    } else {
        $path.c coords "$page:text" $xtext $ytext

        $path.c itemconfigure "$page:text" \
            -text [Widget::cget $path.f$page -text] \
            -font [Widget::cget $path -font] \
            -fill $fg
    }
    eval [list $path.c coords "$page:poly"] [concat $lt $lb]
    eval [list $path.c coords "$page:top"]  $lt
    eval [list $path.c coords "$page:bot"]  $lb
    $path.c itemconfigure "$page:poly" -fill $bg  -outline $bg
    $path.c itemconfigure "$page:top"  -fill $fgt -width $bd
    $path.c itemconfigure "$page:bot"  -fill $fgb -width $bd
    
    # Sven end

    if { $img != "" } {
        # Sven
	set id [$path.c find withtag $page:img]
	if { [string equal $id ""] } {
	    set id [$path.c create image $ximg $ytext \
		    -anchor nw    \
		    -tags   [list page p:$page $page:img]]
        }
        $path.c coords $id $ximg $ytext
        $path.c itemconfigure $id -image $img
        # Sven end
    } else {
        $path.c delete $page:img
    }

    if { $data(select) == $page } {
        $path.c raise p:$page
    } elseif { $pos == 0 } {
        if { $data(select) == "" } {
            $path.c raise p:$page
        } else {
            $path.c lower p:$page p:$data(select)
        }
    } else {
        set pred [lindex $data(pages) [expr {$pos-1}]]
        if { $data(select) != $pred || $pos == 1 } {
            $path.c lower p:$page p:$pred
        } else {
            $path.c lower p:$page p:[lindex $data(pages) [expr {$pos-2}]]
        }
    }
}


# -----------------------------------------------------------------------------
#  Command NoteBook::_draw_arrows
# -----------------------------------------------------------------------------
proc NoteBook::_draw_arrows { path } {
    variable _warrow
    variable $path
    upvar 0  $path data

    set w       [expr {[winfo width $path]-1}]
    set h       [expr {$data(hpage)-1}]
    set nbpages [llength $data(pages)]
    set xl      0
    set xr      [expr {$w-$_warrow+1}]
    # Sven
    set side [Widget::cget $path -side]
    if { [string equal $side "bottom"] } {
        set h1 [expr {[winfo height $path]-1}]
        set bd [Widget::cget $path -borderwidth]
	if {$bd < 1} { set bd 1 }
        set y0 [expr {$h1 - $data(hpage) + $bd}]
    } else {
        set y0 1
    }
    # Sven end (all y positions where replaced with $y0 later)

    if { $data(base) > 0 } {
        # Sven 
        if { ![llength [$path.c find withtag "leftarrow"]] } {
            $path.c create window $xl $y0 \
                -width  $_warrow            \
                -height $h                  \
                -anchor nw                  \
                -window $path.c.fg            \
                -tags   "leftarrow"
        } else {
            $path.c coords "leftarrow" $xl $y0
            $path.c itemconfigure "leftarrow" -width $_warrow -height $h
        }
        # Sven end
    } else {
        $path.c delete "leftarrow"
    }

    if { $data(base) < $nbpages-1 &&
         $data(wpage) + [_get_x_page $path 0] + 6 > $w } {
        # Sven
        if { ![llength [$path.c find withtag "rightarrow"]] } {
            $path.c create window $xr $y0 \
                -width  $_warrow            \
                -height $h                  \
                -window $path.c.fd            \
                -anchor nw                  \
                -tags   "rightarrow"
        } else {
            $path.c coords "rightarrow" $xr $y0
            $path.c itemconfigure "rightarrow" -width $_warrow -height $h
        }
        # Sven end
    } else {
        $path.c delete "rightarrow"
    }
}


# -----------------------------------------------------------------------------
#  Command NoteBook::_draw_area
# -----------------------------------------------------------------------------
proc NoteBook::_draw_area { path } {
    variable $path
    upvar 0  $path data

    set w   [expr {[winfo width  $path] - 1}]
    set h   [expr {[winfo height $path] - 1}]
    set bd  [Widget::cget $path -borderwidth]
    if {$bd < 1} { set bd 1 }
    set x0  [expr {$bd - 1}]

    set arcRadius [Widget::cget $path -arcradius]

    # Sven
    set side [Widget::cget $path -side]
    if {"$side" == "bottom"} {
        set y0 0
        set y1 [expr {$h - $data(hpage)}]
        set yo $y1
    } else {
        set y0 $data(hpage)
        set y1 $h
        set yo [expr {$h-$y0}]
    }
    # Sven end
    set dbg $data(dbg)
    set sel $data(select)
    if {  $sel == "" } {
        set xd  [expr {$w/2}]
        set xf  $xd
        set lbg $data(dbg)
    } else {
        set xd [_get_x_page $path [lsearch -exact $data(pages) $data(select)]]
        set xf [expr {$xd + $data($sel,width) + $arcRadius + 1}]
        set lbg $data(lbg)
    }

    # Sven
    if { [llength [$path.c find withtag rect]] == 0} {
        $path.c create line $xd $y0 $x0 $y0 $x0 $y1 \
            -tags "rect toprect1" 
        $path.c create line $w $y0 $xf $y0 \
            -tags "rect toprect2"
        $path.c create line 1 $h $w $h $w $y0 \
            -tags "rect botrect"
    }
    if {"$side" == "bottom"} {
        $path.c coords "toprect1" $w $y0 $x0 $y0 $x0 $y1
        $path.c coords "toprect2" $x0 $y1 $xd $y1
        $path.c coords "botrect"  $xf $y1 $w $y1 $w $y0
        $path.c itemconfigure "toprect1" -fill $lbg -width $bd
        $path.c itemconfigure "toprect2" -fill $dbg -width $bd
        $path.c itemconfigure "botrect" -fill $dbg -width $bd
    } else {
        $path.c coords "toprect1" $xd $y0 $x0 $y0 $x0 $y1
        $path.c coords "toprect2" $w $y0 $xf $y0
        $path.c coords "botrect"  $x0 $h $w $h $w $y0
        $path.c itemconfigure "toprect1" -fill $lbg -width $bd
        $path.c itemconfigure "toprect2" -fill $lbg -width $bd
        $path.c itemconfigure "botrect" -fill $dbg -width $bd
    }
    $path.c raise "rect"
    # Sven end

    if { $sel != "" } {
        # Sven
        if { [llength [$path.c find withtag "window"]] == 0 } {
            $path.c create window 2 [expr {$y0+1}] \
                -width  [expr {$w-3}]           \
                -height [expr {$yo-3}]          \
                -anchor nw                      \
                -tags   "window"                \
                -window $path.f$sel
        }
        $path.c coords "window" 2 [expr {$y0+1}]
        $path.c itemconfigure "window"    \
            -width  [expr {$w-3}]           \
            -height [expr {$yo-3}]          \
            -window $path.f$sel
        # Sven end
    } else {
        $path.c delete "window"
    }
}


# -----------------------------------------------------------------------------
#  Command NoteBook::_resize
# -----------------------------------------------------------------------------
proc NoteBook::_resize { path } {
    variable $path
    upvar 0  $path data

    # Check if pages are fully initialized or if we are still initializing
    if { 0 < [llength $data(pages)] &&
	 ![info exists data([lindex $data(pages) end],width)] } {
	return
    }
    
    if {!$data(realized)} {
	set data(realized) 1
	if { [Widget::cget $path -width]  == 0 ||
	     [Widget::cget $path -height] == 0 } {
	    # This does an update allowing other events (resize) to enter
	    # In addition, it does a redraw, so first set the realized and
	    # then exit
	    compute_size $path
	    return
	}
    }

    NoteBook::_redraw $path
}


# Tree::_set_help --
#
#	Register dynamic help for a node in the tree.
#
# Arguments:
#	path		Tree to query
#	node		Node in the tree
#       force		Optional argument to force a reset of the help
#
# Results:
#	none
# Tree::_set_help --
#
#	Register dynamic help for a node in the tree.
#
# Arguments:
#	path		Tree to query
#	node		Node in the tree
#       force		Optional argument to force a reset of the help
#
# Results:
#	none
proc NoteBook::_set_help { path page } {
    Widget::getVariable $path help

    set item $path.f$page
    set opts [list -helptype -helptext -helpvar]
    foreach {cty ctx cv} [eval [list Widget::hasChangedX $item] $opts] break
    set text [Widget::getoption $item -helptext]

    ## If we've never set help for this item before, and text is not blank,
    ## we need to setup help.  We also need to reset help if any of the
    ## options have changed.
    if { (![info exists help($page)] && $text != "") || $cty || $ctx || $cv } {
	set help($page) 1
	set type [Widget::getoption $item -helptype]
        switch $type {
            balloon {
		DynamicHelp::register $path.c balloon p:$page $text
            }
            variable {
		set var [Widget::getoption $item -helpvar]
		DynamicHelp::register $path.c variable p:$page $var $text
            }
        }
    }
}


proc NoteBook::_get_page_name { path {item current} {tagindex end-1} } {
    return [string range [lindex [$path.c gettags $item] $tagindex] 2 end]
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/pagesmgr.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
# ------------------------------------------------------------------------------
#  pagesmgr.tcl
#  This file is part of Unifix BWidget Toolkit
#  $Id: pagesmgr.tcl,v 1.6.2.1 2011/02/14 16:56:09 oehhar Exp $
# ------------------------------------------------------------------------------
#  Index of commands:
#     - PagesManager::create
#     - PagesManager::configure
#     - PagesManager::cget
#     - PagesManager::compute_size
#     - PagesManager::add
#     - PagesManager::delete
#     - PagesManager::raise
#     - PagesManager::page
#     - PagesManager::pages
#     - PagesManager::getframe
#     - PagesManager::_test_page
#     - PagesManager::_select
#     - PagesManager::_redraw
#     - PagesManager::_draw_area
#     - PagesManager::_realize
# ------------------------------------------------------------------------------
package require Tcl 8.1.1

namespace eval PagesManager {
    Widget::define PagesManager pagesmgr

    Widget::declare PagesManager {
        {-background TkResource "" 0 frame}
        {-cursor     TkResource "" 0 frame}
        {-width      Int        0  0 "%d >= 0"}
        {-height     Int        0  0 "%d >= 0"}
    }

    Widget::addmap PagesManager "" :cmd { -width {} -height {} -cursor {} }
}


# ------------------------------------------------------------------------------
#  Command PagesManager::create
# ------------------------------------------------------------------------------
proc PagesManager::create { path args } {
    variable $path
    upvar 0  $path data

    Widget::init PagesManager $path $args

    set data(select)   ""
    set data(pages)    {}
    set data(cpt)      0
    set data(realized) 0

    # --- creation du canvas -----------------------------------------------------------------
    eval canvas $path -relief flat -bd 0 -highlightthickness 0 \
	    [Widget::subcget $path :cmd]

    bind $path <Configure> [list PagesManager::_realize $path]
    bind $path <Destroy>   [list PagesManager::_destroy $path]

    return [Widget::create PagesManager $path]
}


# ------------------------------------------------------------------------------
#  Command PagesManager::configure
# ------------------------------------------------------------------------------
proc PagesManager::configure { path args } {
    return [Widget::configure $path $args]
}


# ------------------------------------------------------------------------------
#  Command PagesManager::cget
# ------------------------------------------------------------------------------
proc PagesManager::cget { path option } {
    return [Widget::cget $path $option]
}


# ------------------------------------------------------------------------------
#  Command PagesManager::compute_size
# ------------------------------------------------------------------------------
proc PagesManager::compute_size { path } {
    variable $path
    upvar 0  $path data

    set wmax 0
    set hmax 0
    update idletasks
    foreach page $data(pages) {
        set w    [winfo reqwidth  $path.f$page]
        set h    [winfo reqheight $path.f$page]
        set wmax [expr {$w>$wmax ? $w : $wmax}]
        set hmax [expr {$h>$hmax ? $h : $hmax}]
    }
    configure $path -width $wmax -height $hmax
}


# ------------------------------------------------------------------------------
#  Command PagesManager::add
# ------------------------------------------------------------------------------
proc PagesManager::add { path page } {
    variable $path
    upvar 0  $path data

    if { [lsearch -exact $data(pages) $page] != -1 } {
        return -code error "page \"$page\" already exists"
    }

    lappend data(pages) $page

    if {[Widget::theme]} {
        ttk::frame $path.f$page
    }  else  {
        frame $path.f$page -relief flat \
            -background [Widget::cget $path -background] -borderwidth 0
    }

    return $path.f$page
}


# ------------------------------------------------------------------------------
#  Command PagesManager::delete
# ------------------------------------------------------------------------------
proc PagesManager::delete { path page } {
    variable $path
    upvar 0  $path data

    set pos [_test_page $path $page]
    set data(pages) [lreplace $data(pages) $pos $pos]
    if { $data(select) == $page } {
        set data(select) ""
    }
    destroy $path.f$page
    _redraw $path
}


# ------------------------------------------------------------------------------
#  Command PagesManager::raise
# ------------------------------------------------------------------------------
proc PagesManager::raise { path {page ""} } {
    variable $path
    upvar 0  $path data

    if { $page != "" } {
        _test_page $path $page
        _select $path $page
    }
    return $data(select)
}


# ------------------------------------------------------------------------------
#  Command PagesManager::page - deprecated, use pages
# ------------------------------------------------------------------------------
proc PagesManager::page { path first {last ""} } {
    variable $path
    upvar 0  $path data

    if { $last == "" } {
        return [lindex $data(pages) $first]
    } else {
        return [lrange $data(pages) $first $last]
    }
}


# ------------------------------------------------------------------------------
#  Command PagesManager::pages
# ------------------------------------------------------------------------------
proc PagesManager::pages { path {first ""} {last ""} } {
    variable $path
    upvar 0  $path data

    if { ![string length $first] } {
	return $data(pages)
    }

    if { ![string length $last] } {
        return [lindex $data(pages) $first]
    } else {
        return [lrange $data(pages) $first $last]
    }
}


# ------------------------------------------------------------------------------
#  Command PagesManager::getframe
# ------------------------------------------------------------------------------
proc PagesManager::getframe { path page } {
    return $path.f$page
}


# ------------------------------------------------------------------------------
#  Command PagesManager::_test_page
# ------------------------------------------------------------------------------
proc PagesManager::_test_page { path page } {
    variable $path
    upvar 0  $path data

    if { [set pos [lsearch $data(pages) $page]] == -1 } {
        return -code error "page \"$page\" does not exists"
    }
    return $pos
}


# ------------------------------------------------------------------------------
#  Command PagesManager::_select
# ------------------------------------------------------------------------------
proc PagesManager::_select { path page } {
    variable $path
    upvar 0  $path data

    set oldsel $data(select)
    if { $page != $oldsel } {
        set data(select) $page
        _draw_area $path
    }
}


# ------------------------------------------------------------------------------
#  Command PagesManager::_redraw
# ------------------------------------------------------------------------------
proc PagesManager::_redraw { path } {
    variable $path
    upvar 0  $path data

    if { !$data(realized) } {
        return
    }
    _draw_area $path
}


# ------------------------------------------------------------------------------
#  Command PagesManager::_draw_area
# ------------------------------------------------------------------------------
proc PagesManager::_draw_area { path } {
    variable $path
    upvar 0  $path data

    set w   [winfo width  $path]
    set h   [winfo height $path]
    set sel $data(select)
    if { $sel != "" } {
        if { [llength [$path:cmd find withtag "window"]] } {
            $path:cmd coords "window" 0 0
            $path:cmd itemconfigure "window"    \
                -width  $w        \
                -height $h    \
                -window $path.f$sel
        } else {
            $path:cmd create window 0 0 \
                -width  $w          \
                -height $h       \
                -anchor nw                      \
                -tags   "window"                \
                -window $path.f$sel
        }
    } else {
        $path:cmd delete "window"
    }
}


# ------------------------------------------------------------------------------
#  Command PagesManager::_realize
# ------------------------------------------------------------------------------
proc PagesManager::_realize { path } {
    variable $path
    upvar 0  $path data

    if { [set width  [Widget::cget $path -width]]  == 0 ||
         [set height [Widget::cget $path -height]] == 0 } {
        compute_size $path
    }

    set data(realized) 1
    _draw_area $path
    bind $path <Configure> [list PagesManager::_draw_area $path]
}


# ------------------------------------------------------------------------------
#  Command PagesManager::_destroy
# ------------------------------------------------------------------------------
proc PagesManager::_destroy { path } {
    variable $path
    upvar 0  $path data
    Widget::destroy $path
    unset data
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




















































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/panedw.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
# ----------------------------------------------------------------------------
#  panedw.tcl
#  This file is part of Unifix BWidget Toolkit
# ----------------------------------------------------------------------------
#  Index of commands:
#     - PanedWindow::create
#     - PanedWindow::configure
#     - PanedWindow::cget
#     - PanedWindow::add
#     - PanedWindow::getframe
#     - PanedWindow::_apply_weights
#     - PanedWindow::_destroy
#     - PanedWindow::_beg_move_sash
#     - PanedWindow::_move_sash
#     - PanedWindow::_end_move_sash
#     - PanedWindow::_realize
# ----------------------------------------------------------------------------

# JDC: added option to choose behavior of weights
#    -weights extra : only apply weights to extra space (as current (>= 1.3.1) with grid command)
#    -weights available : apply weights to total available space (as before (<1.3.1) with place command)

namespace eval PanedWindow {
    Widget::define PanedWindow panedw

    namespace eval Pane {
        Widget::declare PanedWindow::Pane {
            {-minsize Int 0 0 "%d >= 0"}
            {-weight  Int 1 0 "%d >= 0"}
        }
    }

    Widget::declare PanedWindow {
        {-side       Enum       top   1 {top left bottom right}}
        {-width      Int        10    1 "%d >=3"}
        {-pad        Int        4     1 "%d >= 0"}
        {-background TkResource ""    0 frame}
        {-bg         Synonym    -background}
        {-activator  Enum       ""    1 {line button}}
	{-weights    Enum       extra 1 {extra available}}
    }

    variable _panedw
}



# ----------------------------------------------------------------------------
#  Command PanedWindow::create
# ----------------------------------------------------------------------------
proc PanedWindow::create { path args } {
    variable _panedw

    Widget::init PanedWindow $path $args

    frame $path -background [Widget::cget $path -background] -class PanedWindow
    set _panedw($path,nbpanes) 0
    set _panedw($path,weights) ""
    set _panedw($path,configuredone) 0

    set activator [Widget::getoption $path -activator]
    if {[string equal $activator ""]} {
        if { $::tcl_platform(platform) != "windows" } {
            Widget::setMegawidgetOption $path -activator button
        } else {
            Widget::setMegawidgetOption $path -activator line
        }
    }
    if {[string equal [Widget::getoption $path -activator] "line"]} {
        Widget::setMegawidgetOption $path -width 3
    }
    
    bind $path <Configure> [list PanedWindow::_realize $path %w %h]
    bind $path <Destroy>   [list PanedWindow::_destroy $path]

    return [Widget::create PanedWindow $path]
}


# ----------------------------------------------------------------------------
#  Command PanedWindow::configure
# ----------------------------------------------------------------------------
proc PanedWindow::configure { path args } {
    variable _panedw

    set res [Widget::configure $path $args]

    if { [Widget::hasChanged $path -background bg] && $_panedw($path,nbpanes) > 0 } {
        $path:cmd configure -background $bg
        $path.f0 configure -background $bg
        for {set i 1} {$i < $_panedw($path,nbpanes)} {incr i} {
            set frame $path.sash$i
            $frame configure -background $bg
            $frame.sep configure -background $bg
            $frame.but configure -background $bg
            $path.f$i configure -background $bg
            $path.f$i.frame configure -background $bg
        }
    }
    return $res
}


# ----------------------------------------------------------------------------
#  Command PanedWindow::cget
# ----------------------------------------------------------------------------
proc PanedWindow::cget { path option } {
    return [Widget::cget $path $option]
}


# ----------------------------------------------------------------------------
#  Command PanedWindow::add
# ----------------------------------------------------------------------------
proc PanedWindow::add { path args } {
    variable _panedw

    set num $_panedw($path,nbpanes)
    Widget::init PanedWindow::Pane $path.f$num $args
    set bg [Widget::getoption $path -background]

    set wbut   [Widget::getoption $path -width]
    set pad    [Widget::getoption $path -pad]
    set width  [expr {$wbut+2*$pad}]
    set side   [Widget::getoption $path -side]
    set weight [Widget::getoption $path.f$num -weight]
    lappend _panedw($path,weights) $weight

    if { $num > 0 } {
        set frame [frame $path.sash$num -relief flat -bd 0 \
                       -highlightthickness 0 -width $width -height $width -bg $bg]
        set sep [frame $frame.sep -bd 5 -relief raised \
                     -highlightthickness 0 -bg $bg]
        set but [frame $frame.but -bd 1 -relief raised \
                     -highlightthickness 0 -bg $bg -width $wbut -height $wbut]
	set sepsize 2

        set activator [Widget::getoption $path -activator]
	if {$activator == "button"} {
	    set activator $but
	    set placeButton 1
	} else {
	    set activator $sep
	    $sep configure -bd 1
	    set placeButton 0
	}
        if {[string equal $side "top"] || [string equal $side "bottom"]} {
            place $sep -relx 0.5 -y 0 -width $sepsize -relheight 1.0 -anchor n
	    if { $placeButton } {
		if {[string equal $side "top"]} {
		    place $but -relx 0.5 -y [expr {6+$wbut/2}] -anchor c
		} else {
		    place $but -relx 0.5 -rely 1.0 -y [expr {-6-$wbut/2}] \
			    -anchor c
		}
	    }
            $activator configure -cursor sb_h_double_arrow 
            grid $frame -column [expr {2*$num-1}] -row 0 -sticky ns
            grid columnconfigure $path [expr {2*$num-1}] -weight 0
        } else {
            place $sep -x 0 -rely 0.5 -height $sepsize -relwidth 1.0 -anchor w
	    if { $placeButton } {
		if {[string equal $side "left"]} {
		    place $but -rely 0.5 -x [expr {6+$wbut/2}] -anchor c
		} else {
		    place $but -rely 0.5 -relx 1.0 -x [expr {-6-$wbut/2}] \
			    -anchor c
		}
	    }
            $activator configure -cursor sb_v_double_arrow 
            grid $frame -row [expr {2*$num-1}] -column 0 -sticky ew
            grid rowconfigure $path [expr {2*$num-1}] -weight 0
        }
        bind $activator <ButtonPress-1> \
	    [list PanedWindow::_beg_move_sash $path $num %X %Y]
    } else {
        if { [string equal $side "top"] || \
		[string equal $side "bottom"] } {
            grid rowconfigure $path 0 -weight 1
        } else {
            grid columnconfigure $path 0 -weight 1
        }
    }

    set pane [frame $path.f$num -bd 0 -relief flat \
	    -highlightthickness 0 -bg $bg]
    set user [frame $path.f$num.frame  -bd 0 -relief flat \
	    -highlightthickness 0 -bg $bg]
    if { [string equal $side "top"] || [string equal $side "bottom"] } {
        grid $pane -column [expr {2*$num}] -row 0 -sticky nsew
        grid columnconfigure $path [expr {2*$num}] -weight $weight
    } else {
        grid $pane -row [expr {2*$num}] -column 0 -sticky nsew
        grid rowconfigure $path [expr {2*$num}] -weight $weight
    }
    pack $user -fill both -expand yes
    incr _panedw($path,nbpanes)
    if {$_panedw($path,configuredone)} {
	_realize $path [winfo width $path] [winfo height $path]
    }

    return $user
}


# ----------------------------------------------------------------------------
#  Command PanedWindow::getframe
# ----------------------------------------------------------------------------
proc PanedWindow::getframe { path index } {
    if { [winfo exists $path.f$index.frame] } {
        return $path.f$index.frame
    }
}
    

# ----------------------------------------------------------------------------
#  Command PanedWindow::_beg_move_sash
# ----------------------------------------------------------------------------
proc PanedWindow::_beg_move_sash { path num x y } {
    variable _panedw

    set fprev $path.f[expr {$num-1}]
    set fnext $path.f$num
    set wsash [expr {[Widget::getoption $path -width] + 2*[Widget::getoption $path -pad]}]

    $path.sash$num.but configure -relief sunken
    set top  [toplevel $path.sash -borderwidth 1 -relief raised]

    set minszg [Widget::getoption $fprev -minsize]
    set minszd [Widget::getoption $fnext -minsize]
    set side   [Widget::getoption $path -side]

    if { [string equal $side "top"] || [string equal $side "bottom"] } {
        $top configure -cursor sb_h_double_arrow
        set h    [winfo height $path]
        set yr   [winfo rooty $path.sash$num]
        set xmin [expr {$wsash/2+[winfo rootx $fprev]+$minszg}]
        set xmax [expr {-$wsash/2-1+[winfo rootx $fnext]+[winfo width $fnext]-$minszd}]
        wm overrideredirect $top 1
        wm geom $top "2x${h}+$x+$yr"

        update idletasks
        grab set $top
        bind $top <ButtonRelease-1> [list PanedWindow::_end_move_sash $path $top $num $xmin $xmax %X rootx width]
        bind $top <Motion>          [list PanedWindow::_move_sash $top $xmin $xmax %X +%%d+$yr]
        _move_sash $top $xmin $xmax $x "+%d+$yr"
    } else {
        $top configure -cursor sb_v_double_arrow
        set w    [winfo width $path]
        set xr   [winfo rootx $path.sash$num]
        set ymin [expr {$wsash/2+[winfo rooty $fprev]+$minszg}]
        set ymax [expr {-$wsash/2-1+[winfo rooty $fnext]+[winfo height $fnext]-$minszd}]
        wm overrideredirect $top 1
        wm geom $top "${w}x2+$xr+$y"

        update idletasks
        grab set $top
        bind $top <ButtonRelease-1> [list PanedWindow::_end_move_sash \
		$path $top $num $ymin $ymax %Y rooty height]
        bind $top <Motion>          [list PanedWindow::_move_sash \
		$top $ymin $ymax %Y +$xr+%%d]
        _move_sash $top $ymin $ymax $y "+$xr+%d"
    }
}


# ----------------------------------------------------------------------------
#  Command PanedWindow::_move_sash
# ----------------------------------------------------------------------------
proc PanedWindow::_move_sash { top min max v form } {

    if { $v < $min } {
	set v $min
    } elseif { $v > $max } {
	set v $max
    }
    wm geom $top [format $form $v]
}


# ----------------------------------------------------------------------------
#  Command PanedWindow::_end_move_sash
# ----------------------------------------------------------------------------
proc PanedWindow::_end_move_sash { path top num min max v rootv size } {
    variable _panedw

    destroy $top
    if { $v < $min } {
	set v $min
    } elseif { $v > $max } {
	set v $max
    }
    set fprev $path.f[expr {$num-1}]
    set fnext $path.f$num

    $path.sash$num.but configure -relief raised

    set wsash [expr {[Widget::getoption $path -width] + 2*[Widget::getoption $path -pad]}]
    set dv    [expr {$v-[winfo $rootv $path.sash$num]-$wsash/2}]
    set w1    [winfo $size $fprev]
    set w2    [winfo $size $fnext]

    for {set i 0} {$i < $_panedw($path,nbpanes)} {incr i} {
        if { $i == $num-1} {
            $fprev configure -$size [expr {[winfo $size $fprev]+$dv}]
        } elseif { $i == $num } {
            $fnext configure -$size [expr {[winfo $size $fnext]-$dv}]
        } else {
            $path.f$i configure -$size [winfo $size $path.f$i]
        }
    }
}


# ----------------------------------------------------------------------------
#  Command PanedWindow::_realize
# ----------------------------------------------------------------------------
proc PanedWindow::_realize { path width height } {
    variable _panedw

    set x    0
    set y    0
    set hc   [winfo reqheight $path]
    set hmax 0
    for {set i 0} {$i < $_panedw($path,nbpanes)} {incr i} {
        $path.f$i configure \
            -width  [winfo reqwidth  $path.f$i.frame] \
            -height [winfo reqheight $path.f$i.frame]
        place $path.f$i.frame -x 0 -y 0 -relwidth 1 -relheight 1
    }

    bind $path <Configure> {}

    _apply_weights $path
    set _panedw($path,configuredone) 1
    return
}

# ----------------------------------------------------------------------------
#  Command PanedWindow::_apply_weights
# ----------------------------------------------------------------------------
proc PanedWindow::_apply_weights { path } {
    variable _panedw

    set weights [Widget::getoption $path -weights]
    if {[string equal $weights "extra"]} {
	return
    }

    set side   [Widget::getoption $path -side]
    if {[string equal $side "top"] || [string equal $side "bottom"] } {
	set size width
    } else {
	set size height
    }
    set wsash [expr {[Widget::getoption $path -width] + 2*[Widget::getoption $path -pad]}]
    set rs [winfo $size $path]
    set s [expr {$rs - ($_panedw($path,nbpanes) - 1) * $wsash}]
    
    set tw 0.0
    foreach w $_panedw($path,weights) { 
	set tw [expr {$tw + $w}]
    }

    for {set i 0} {$i < $_panedw($path,nbpanes)} {incr i} {
	set rw [lindex $_panedw($path,weights) $i]
	set ps [expr {int($rw / $tw * $s)}]
	$path.f$i configure -$size $ps
    }    
    return
}


# ----------------------------------------------------------------------------
#  Command PanedWindow::_destroy
# ----------------------------------------------------------------------------
proc PanedWindow::_destroy { path } {
    variable _panedw

    for {set i 0} {$i < $_panedw($path,nbpanes)} {incr i} {
        Widget::destroy $path.f$i
    }
    unset _panedw($path,nbpanes)
    Widget::destroy $path
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/panelframe.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
# ----------------------------------------------------------------------------
#  panelframe.tcl
#	Create PanelFrame widgets.
#	A PanelFrame is a boxed frame that allows you to place items
#	in the label area (liked combined frame+toolbar).  It uses the
#	highlight colors the default frame color.
#  $Id: panelframe.tcl,v 1.1 2004/09/09 22:17:51 hobbs Exp $
# ----------------------------------------------------------------------------
#  Index of commands:
#     - PanelFrame::create
#     - PanelFrame::configure
#     - PanelFrame::cget
#     - PanelFrame::getframe
#     - PanelFrame::add
#     - PanelFrame::remove
#     - PanelFrame::items
# ----------------------------------------------------------------------------

namespace eval PanelFrame {
    Widget::define PanelFrame panelframe

    Widget::declare PanelFrame {
	{-background	   TkResource "" 0 frame}
	{-borderwidth	   TkResource 1	 0 frame}
	{-relief	   TkResource flat 0 frame}
	{-panelbackground  TkResource "" 0 {entry -selectbackground}}
	{-panelforeground  TkResource "" 0 {entry -selectforeground}}
	{-width		   Int	      0	 0}
	{-height	   Int	      0	 0}
	{-font		   TkResource "" 0 label}
	{-text		   String     "" 0}
	{-textvariable	   String     "" 0}
	{-ipad		   String      1 0}
	{-bg		   Synonym    -background}
	{-bd		   Synonym    -borderwidth}
    }
    # Should we have automatic state handling?
    #{-state            TkResource "" 0 label}

    Widget::addmap PanelFrame "" :cmd {
	-panelbackground -background
	-width {} -height {} -borderwidth {} -relief {}
    }
    Widget::addmap PanelFrame "" .title	  {
	-panelbackground -background
    }
    Widget::addmap PanelFrame "" .title.text   {
	-panelbackground -background
	-panelforeground -foreground
	-text {} -textvariable {} -font {}
    }
    Widget::addmap PanelFrame "" .frame {
	-background {}
    }

    if {0} {
	# This would be code to have an automated close button
	#{-closebutton	   Boolean    0	 0}
	Widget::addmap PanelFrame "" .title.close   {
	    -panelbackground -background
	    -panelforeground -foreground
	}
	variable HaveMarlett \
	    [expr {[lsearch -exact [font families] "Marlett"] != -1}]

	variable imgdata {
	    #define close_width 16
	    #define close_height 16
	    static char close_bits[] = {
		0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x10, 0x08,
		0x38, 0x1c, 0x70, 0x0e,
		0xe0, 0x07, 0xc0, 0x03,
		0xc0, 0x03, 0xe0, 0x07,
		0x70, 0x0e, 0x38, 0x1c,
		0x10, 0x08, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00};
	}
	# We use the same -foreground as the default -panelbackground
	image create bitmap ::PanelFrame::X -data $imgdata \
	    -foreground [lindex $Widget::PanelFrame::opt(-panelbackground) 1]
    }

    bind PanelFrame <Destroy> [list Widget::destroy %W]
}


# ----------------------------------------------------------------------------
#  Command PanelFrame::create
# ----------------------------------------------------------------------------
proc PanelFrame::create { path args } {
    variable HaveMarlett

    Widget::init PanelFrame $path $args

    set lblopts [list -bd 0 -highlightthickness 0]
    set outer [eval [list frame $path -class PanelFrame] \
		   [Widget::subcget $path :cmd]]
    set title [eval [list frame $path.title] \
		   [Widget::subcget $path .title]]
    set tlbl  [eval [list label $path.title.text] $lblopts -anchor w \
		   [Widget::subcget $path .title.text]]
    set inner [eval [list frame $path.frame] \
		   [Widget::subcget $path .frame]]

    foreach {ipadx ipady} [_padval [Widget::cget $path -ipad]] { break }

    if {0} {
	set btnopts [list -padx 0 -pady 0 -relief flat -overrelief raised \
			 -bd 1 -highlightthickness 0]
	set clbl  [eval [list button $path.title.close] $btnopts \
		       [Widget::subcget $path .title.close]]
	set close [Widget::cget $path -closebutton]
	if {$HaveMarlett} {
	    $clbl configure -font "Marlett -14" -text \u0072
	} else {
	    $clbl configure -image ::PanelFrame::X
	}
	if {$close} {
	    pack $path.title.close -side right -padx $ipadx -pady $ipady
	}
    }

    grid $path.title -row 0 -column 0 -sticky ew
    grid $path.frame -row 1 -column 0 -sticky news
    grid columnconfigure $path 0 -weight 1
    grid rowconfigure $path 1 -weight 1

    pack $path.title.text -side left -fill x -anchor w \
	-padx $ipadx -pady $ipady

    return [Widget::create PanelFrame $path]
}


# ----------------------------------------------------------------------------
#  Command PanelFrame::configure
# ----------------------------------------------------------------------------
proc PanelFrame::configure { path args } {
    set res [Widget::configure $path $args]

    if {[Widget::hasChanged $path -ipad ipad]} {
    }

    return $res
}


# ----------------------------------------------------------------------------
#  Command PanelFrame::cget
# ----------------------------------------------------------------------------
proc PanelFrame::cget { path option } {
    return [Widget::cget $path $option]
}

# ----------------------------------------------------------------------------
#  Command PanelFrame::getframe
# ----------------------------------------------------------------------------
proc PanelFrame::getframe { path } {
    return $path.frame
}

# ------------------------------------------------------------------------
#  Command PanelFrame::add
# ------------------------------------------------------------------------
proc PanelFrame::add {path w args} {
    variable _widget

    array set opts [list \
			-side   right \
			-fill   none \
			-expand 0 \
			-pad    [Widget::cget $path -ipad] \
		       ]
    foreach {key val} $args {
	if {[info exists opts($key)]} {
	    set opts($key) $val
	} else {
	    set msg "unknown option \"$key\", must be one of: "
	    append msg [join [lsort [array names opts]] {, }]
	    return -code error $msg
	}
    }
    foreach {ipadx ipady} [_padval $opts(-pad)] { break }

    set f $path.title

    lappend _widget($path,items) $w
    pack $w -in $f -padx $ipadx -pady $ipady -side $opts(-side) \
	-fill $opts(-fill) -expand $opts(-expand)

    return $w
}

# ------------------------------------------------------------------------
#  Command PanelFrame::remove
# ------------------------------------------------------------------------
proc PanelFrame::remove {path args} {
    variable _widget

    set destroy [string equal [lindex $args 0] "-destroy"]
    if {$destroy} {
	set args [lrange $args 1 end]
    }
    foreach w $args {
	set idx [lsearch -exact $_widget($path,items) $w]
	if {$idx == -1} {
	    # ignore unknown
	    continue
	}
	if {$destroy} {
	    destroy $w
	} elseif {[winfo exists $w]} {
	    pack forget $w
	}
	set _widget($path,items) [lreplace $_widget($path,items) $idx $idx]
    }
}

# ------------------------------------------------------------------------
#  Command PanelFrame::delete
# ------------------------------------------------------------------------
proc PanelFrame::delete {path args} {
    return [PanelFrame::remove $path -destroy $args]
}

# ------------------------------------------------------------------------
#  Command PanelFrame::items
# ------------------------------------------------------------------------
proc PanelFrame::items {path} {
    variable _widget
    return $_widget($path,items)
}

proc PanelFrame::_padval {padval} {
    set len [llength $padval]
    foreach {a b} $padval { break }
    if {$len == 0 || $len > 2} {
	return -code error \
	    "invalid pad value \"$padval\", must be 1 or 2 pixel values"
    } elseif {$len == 1} {
	return [list $a $a]
    } elseif {$len == 2} {
	return $padval
    }
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<












































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/passwddlg.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
# -----------------------------------------------------------------------------
#  passwddlg.tcl
#  This file is part of Unifix BWidget Toolkit
#   by Stephane Lavirotte (Stephane.Lavirotte@sophia.inria.fr)
#  $Id: passwddlg.tcl,v 1.12 2009/06/11 15:42:51 oehhar Exp $
# -----------------------------------------------------------------------------
#  Index of commands:
#     - PasswdDlg::create
#     - PasswdDlg::configure
#     - PasswdDlg::cget
#     - PasswdDlg::_verifonlogin
#     - PasswdDlg::_verifonpasswd
#     - PasswdDlg::_max
#------------------------------------------------------------------------------

namespace eval PasswdDlg {
    Widget::define PasswdDlg passwddlg Dialog LabelEntry

    Widget::bwinclude PasswdDlg Dialog :cmd \
	    remove     {-image -bitmap -side -default -cancel -separator} \
	    initialize {-modal local -anchor e}
    
    Widget::bwinclude PasswdDlg LabelEntry .frame.lablog \
	    remove [list -command -justify -name -show -side	        \
		-state -takefocus -width -xscrollcommand -padx -pady	\
		-dragenabled -dragendcmd -dragevent -draginitcmd	\
		-dragtype -dropenabled -dropcmd -dropovercmd -droptypes	\
		] \
	    prefix [list login -editable -helptext -helpvar -label      \
		-text -textvariable -underline				\
		] \
	    initialize [list -relief sunken -borderwidth 2		\
		-labelanchor w -width 15 -loginlabel "Login"		\
		]
    
    Widget::bwinclude PasswdDlg LabelEntry .frame.labpass		\
	    remove [list -command -width -show -side -takefocus		\
		-xscrollcommand -dragenabled -dragendcmd -dragevent	\
		-draginitcmd -dragtype -dropenabled -dropcmd		\
		-dropovercmd -droptypes -justify -padx -pady -name	\
		] \
	    prefix [list passwd -editable -helptext -helpvar -label	\
		-state -text -textvariable -underline			\
		] \
	    initialize [list -relief sunken -borderwidth 2		\
		-labelanchor w -width 15 -passwdlabel "Password"	\
		]
    
    Widget::declare PasswdDlg {
        {-type        Enum       ok           0 {ok okcancel}}
        {-labelwidth  TkResource -1           0 {label -width}}
        {-command     String     ""           0}
    }
}


# -----------------------------------------------------------------------------
#  Command PasswdDlg::create
# -----------------------------------------------------------------------------
proc PasswdDlg::create { path args } {

    array set maps [list PasswdDlg {} :cmd {} .frame.lablog {} \
	    .frame.labpass {}]
    array set maps [Widget::parseArgs PasswdDlg $args]

    Widget::initFromODB PasswdDlg "$path#PasswdDlg" $maps(PasswdDlg)

    # Extract the PasswdDlg megawidget options (those that don't map to a
    # subwidget)
    set type      [Widget::cget "$path#PasswdDlg" -type]
    set cmd       [Widget::cget "$path#PasswdDlg" -command]

    set defb -1
    set canb -1
    switch -- $type {
        ok        { set lbut {ok}; set defb 0 }
        okcancel  { set lbut {ok cancel} ; set defb 0; set canb 1 }
    }

    eval [list Dialog::create $path] $maps(:cmd) \
        [list -class PasswdDlg -image [Bitmap::get passwd] \
	     -side bottom -default $defb -cancel $canb]
    foreach but $lbut {
        if { $but == "ok" && $cmd != "" } {
            Dialog::add $path -text $but -name $but -command $cmd
        } else {
            Dialog::add $path -text $but -name $but
        }
    }

    set frame [Dialog::getframe $path]
    bind $path  <Return>  ""
    bind $frame <Destroy> [list Widget::destroy $path\#PasswdDlg]

    set lablog [eval [list LabelEntry::create $frame.lablog] \
		    $maps(.frame.lablog) \
		    [list -name login -dragenabled 0 -dropenabled 0 \
			 -command [list PasswdDlg::_verifonpasswd \
				       $path $frame.labpass]]]

    set labpass [eval [list LabelEntry::create $frame.labpass] \
		     $maps(.frame.labpass) \
		     [list -name password -show "*" \
			  -dragenabled 0 -dropenabled 0 \
			  -command [list PasswdDlg::_verifonlogin \
					$path $frame.lablog]]]

    # compute label width
    if {[$lablog cget -labelwidth] == 0} {
        set loglabel  [$lablog cget -label]
        set passlabel [$labpass cget -label]
        set labwidth  [_max [string length $loglabel] [string length $passlabel]]
        incr labwidth 1
        $lablog  configure -labelwidth $labwidth
        $labpass configure -labelwidth $labwidth
    }

    Widget::create PasswdDlg $path 0

    pack  $frame.lablog $frame.labpass -fill x -expand 1

    # added by bach@mwgdna.com
    #  give focus to loginlabel unless the state is disabled
    if {[$lablog cget -editable]} {
	focus $frame.lablog.e
    } else {
	focus $frame.labpass.e
    }
    set res [Dialog::draw $path]

    if { $res == 0 } {
        set res [list [$lablog.e cget -text] [$labpass.e cget -text]]
    } else {
        set res [list]
    }
    Widget::destroy "$path#PasswdDlg"
    destroy $path

    return $res
}

# -----------------------------------------------------------------------------
#  Command PasswdDlg::configure
# -----------------------------------------------------------------------------

proc PasswdDlg::configure { path args } {
    set res [Widget::configure "$path#PasswdDlg" $args]
}

# -----------------------------------------------------------------------------
#  Command PasswdDlg::cget
# -----------------------------------------------------------------------------

proc PasswdDlg::cget { path option } {
    return [Widget::cget "$path#PasswdDlg" $option]
}


# -----------------------------------------------------------------------------
#  Command PasswdDlg::_verifonlogin
# -----------------------------------------------------------------------------
proc PasswdDlg::_verifonlogin { path labpass } {
    Dialog::enddialog $path 0
}

# -----------------------------------------------------------------------------
#  Command PasswdDlg::_verifonpasswd
# -----------------------------------------------------------------------------
proc PasswdDlg::_verifonpasswd { path labpass } {
    if {[string equal [$labpass cget -state] "disabled"]} {
        Dialog::enddialog $path 0
    } else {
        focus $labpass
    }
}

# -----------------------------------------------------------------------------
#  Command PasswdDlg::_max
# -----------------------------------------------------------------------------
proc PasswdDlg::_max { val1 val2 } { 
    return [expr {($val1 > $val2) ? ($val1) : ($val2)}] 
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<












































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/pkgIndex.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
if {[catch {package require Tcl}]} return
package ifneeded BWidget 1.9.8 "\
    package require Tk 8.1.1;\
    [list tclPkgSetup $dir BWidget 1.9.8 {
{arrow.tcl source {ArrowButton ArrowButton::create ArrowButton::use}}
{labelframe.tcl source {LabelFrame LabelFrame::create LabelFrame::use}}
{labelentry.tcl source {LabelEntry LabelEntry::create LabelEntry::use}}
{bitmap.tcl source {Bitmap::get Bitmap::use}}
{button.tcl source {Button Button::create Button::use}}
{buttonbox.tcl source {ButtonBox ButtonBox::create ButtonBox::use}}
{combobox.tcl source {ComboBox ComboBox::create ComboBox::use}}
{label.tcl source {Label Label::create Label::use}}
{entry.tcl source {Entry Entry::create Entry::use}}
{pagesmgr.tcl source {PagesManager PagesManager::create PagesManager::use}}
{notebook.tcl source {NoteBook NoteBook::create NoteBook::use}}
{panedw.tcl source {PanedWindow PanedWindow::create PanedWindow::use}}
{scrollw.tcl source {ScrolledWindow ScrolledWindow::create ScrolledWindow::use}}
{scrollview.tcl source {ScrollView ScrollView::create ScrollView::use}}
{scrollframe.tcl source {ScrollableFrame ScrollableFrame::create ScrollableFrame::use}}
{panelframe.tcl source {PanelFrame PanelFrame::create PanelFrame::use}}
{progressbar.tcl source {ProgressBar ProgressBar::create ProgressBar::use}}
{progressdlg.tcl source {ProgressDlg ProgressDlg::create ProgressDlg::use}}
{passwddlg.tcl source {PasswdDlg PasswdDlg::create PasswdDlg::use}}
{dragsite.tcl source {DragSite::register DragSite::include DragSite::use}}
{dropsite.tcl source {DropSite::register DropSite::include DropSite::use}}
{separator.tcl source {Separator Separator::create Separator::use}}
{spinbox.tcl source {SpinBox SpinBox::create SpinBox::use}}
{statusbar.tcl source {StatusBar StatusBar::create StatusBar::use}}
{titleframe.tcl source {TitleFrame TitleFrame::create TitleFrame::use}}
{mainframe.tcl source {MainFrame MainFrame::create MainFrame::use}}
{listbox.tcl source {ListBox ListBox::create ListBox::use}}
{tree.tcl source {Tree Tree::create Tree::use}}
{color.tcl source {SelectColor SelectColor::menu SelectColor::dialog SelectColor::setcolor}}
{dynhelp.tcl source {DynamicHelp::configure DynamicHelp::use DynamicHelp::register DynamicHelp::include DynamicHelp::add DynamicHelp::delete}}
{dialog.tcl source {Dialog Dialog::create Dialog::use}}
{messagedlg.tcl source {MessageDlg MessageDlg::create MessageDlg::use}}
{font.tcl source {SelectFont SelectFont::create SelectFont::use SelectFont::loadfont}}
{wizard.tcl source {Wizard Wizard::create Wizard::use SimpleWizard ClassicWizard}}
{xpm2image.tcl source {xpm-to-image}}
}]; \
	[list namespace eval ::BWIDGET {}]; \
	[list set ::BWIDGET::LIBRARY $dir]; \
    [list source [file join $dir widget.tcl]]; \
    [list source [file join $dir init.tcl]]; \
    [list source [file join $dir utils.tcl]]; \
"
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




























































































Deleted scriptlibs/bwidget-1.9.8/progressbar.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
# ----------------------------------------------------------------------------
#  progressbar.tcl
#  This file is part of Unifix BWidget Toolkit
# ----------------------------------------------------------------------------
#  Index of commands:
#     - ProgressBar::create
#     - ProgressBar::configure
#     - ProgressBar::cget
#     - ProgressBar::_destroy
#     - ProgressBar::_modify
# ----------------------------------------------------------------------------

namespace eval ProgressBar {
    Widget::define ProgressBar progressbar

    Widget::declare ProgressBar {
        {-type        Enum       normal     0
                      {normal incremental infinite nonincremental_infinite}}
        {-maximum     Int        100        0 "%d > 0"}
        {-background  TkResource ""         0 frame}
        {-foreground  TkResource "blue"     0 label}
        {-borderwidth TkResource 2          0 frame}
        {-troughcolor TkResource ""         0 scrollbar}
        {-relief      TkResource sunken     0 label}
        {-orient      Enum       horizontal 1 {horizontal vertical}}
        {-variable    String     ""         0}
        {-idle        Boolean    0          0}
        {-width       TkResource 100        0 frame}
        {-height      TkResource 4m         0 frame}
        {-bg          Synonym    -background}
        {-fg          Synonym    -foreground}
        {-bd          Synonym    -borderwidth}
    }

    Widget::addmap ProgressBar "" :cmd {-background {} -width {} -height {}}
    Widget::addmap ProgressBar "" .bar {
	-troughcolor -background -borderwidth {} -relief {}
    }

    variable _widget
}


# ----------------------------------------------------------------------------
#  Command ProgressBar::create
# ----------------------------------------------------------------------------
proc ProgressBar::create { path args } {
    variable _widget

    array set maps [list ProgressBar {} :cmd {} .bar {}]
    array set maps [Widget::parseArgs ProgressBar $args]
    eval frame $path $maps(:cmd) -class ProgressBar -bd 0 \
	    -highlightthickness 0 -relief flat
    Widget::initFromODB ProgressBar $path $maps(ProgressBar)

    set c  [eval [list canvas $path.bar] $maps(.bar) -highlightthickness 0]
    set fg [Widget::cget $path -foreground]
    if { [string equal [Widget::cget $path -orient] "horizontal"] } {
        $path.bar create rectangle -1 0 0 0 -fill $fg -outline $fg -tags rect
    } else {
        $path.bar create rectangle 0 1 0 0 -fill $fg -outline $fg -tags rect
    }

    set _widget($path,val) 0
    set _widget($path,dir) 1
    set _widget($path,var) [Widget::cget $path -variable]
    if {$_widget($path,var) != ""} {
        GlobalVar::tracevar variable $_widget($path,var) w \
		[list ProgressBar::_modify $path]
        set _widget($path,afterid) \
	    [after idle [list ProgressBar::_modify $path]]
    }

    bind $path.bar <Destroy>   [list ProgressBar::_destroy $path]
    bind $path.bar <Configure> [list ProgressBar::_modify $path]

    return [Widget::create ProgressBar $path]
}


# ----------------------------------------------------------------------------
#  Command ProgressBar::configure
# ----------------------------------------------------------------------------
proc ProgressBar::configure { path args } {
    variable _widget

    set res [Widget::configure $path $args]

    if { [Widget::hasChangedX $path -variable] } {
	set newv [Widget::cget $path -variable]
        if { $_widget($path,var) != "" } {
            GlobalVar::tracevar vdelete $_widget($path,var) w \
		    [list ProgressBar::_modify $path]
        }
        if { $newv != "" } {
            set _widget($path,var) $newv
            GlobalVar::tracevar variable $newv w \
		    [list ProgressBar::_modify $path]
	    if {![info exists _widget($path,afterid)]} {
		set _widget($path,afterid) \
		    [after idle [list ProgressBar::_modify $path]]
	    }
        } else {
            set _widget($path,var) ""
        }
    }

    foreach {cbd cor cma} [Widget::hasChangedX $path -borderwidth \
	    -orient -maximum] break

    if { $cbd || $cor || $cma } {
	if {![info exists _widget($path,afterid)]} {
	    set _widget($path,afterid) \
		[after idle [list ProgressBar::_modify $path]]
	}
    }
    if { [Widget::hasChangedX $path -foreground] } {
	set fg [Widget::cget $path -foreground]
        $path.bar itemconfigure rect -fill $fg -outline $fg
    }
    return $res
}


# ----------------------------------------------------------------------------
#  Command ProgressBar::cget
# ----------------------------------------------------------------------------
proc ProgressBar::cget { path option } {
    return [Widget::cget $path $option]
}


# ----------------------------------------------------------------------------
#  Command ProgressBar::_modify
# ----------------------------------------------------------------------------
proc ProgressBar::_modify { path args } {
    variable _widget

    catch {unset _widget($path,afterid)}
    if { ![GlobalVar::exists $_widget($path,var)] ||
	 [set val [GlobalVar::getvar $_widget($path,var)]] < 0 } {
        catch {place forget $path.bar}
    } else {
	place $path.bar -relx 0 -rely 0 -relwidth 1 -relheight 1
	set type [Widget::getoption $path -type]
	if { $val != 0 && $type != "normal" && \
		$type != "nonincremental_infinite"} {
	    set val [expr {$val+$_widget($path,val)}]
	}
	set _widget($path,val) $val
	set max [Widget::getoption $path -maximum]
	set bd  [expr {2*[$path.bar cget -bd]}]
	set w   [winfo width  $path.bar]
	set h   [winfo height $path.bar]
	if {$type == "infinite" || $type == "nonincremental_infinite"} {
	    # JDC: New infinite behaviour
	    set tval [expr {$val % $max}]
	    if { $tval < ($max / 2.0) } {
		set x0 [expr {double($tval) / double($max) * 1.5}]
	    } else {
		set x0 [expr {(1.0-(double($tval) / double($max))) * 1.5}]
	    }
	    set x1 [expr {$x0 + 0.25}]
	    # convert coords to ints to prevent triggering canvas refresh
	    # bug related to fractional coords
	    if {[Widget::getoption $path -orient] == "horizontal"} {
		$path.bar coords rect [expr {int($x0*$w)}] 0 \
		    [expr {int($x1*$w)}] $h
	    } else {
		$path.bar coords rect 0 [expr {int($h-$x0*$h)}] $w \
		    [expr {int($x1*$h)}]
	    }
	} else {
	    if { $val > $max } {set val $max}
	    if {[Widget::getoption $path -orient] == "horizontal"} {
		$path.bar coords rect -1 0 [expr {int(double($val)*$w/$max)}] $h
	    } else {
		$path.bar coords rect 0 [expr {$h+1}] $w \
		    [expr {int($h*(1.0 - double($val)/$max))}]
	    }
	}
    }
    if {![Widget::cget $path -idle]} {
	update idletasks
    }
}


# ----------------------------------------------------------------------------
#  Command ProgressBar::_destroy
# ----------------------------------------------------------------------------
proc ProgressBar::_destroy { path } {
    variable _widget

    if {[info exists _widget($path,afterid)]} {
	after cancel $_widget($path,afterid)
	unset _widget($path,afterid)
    }
    if {[info exists _widget($path,var)]} {
	if {$_widget($path,var) != ""} {
	    GlobalVar::tracevar vdelete $_widget($path,var) w \
		[list ProgressBar::_modify $path]
	}
	unset _widget($path,var)
    }
    unset _widget($path,dir)
    Widget::destroy $path
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/progressdlg.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# ----------------------------------------------------------------------------
#  progressdlg.tcl
#  This file is part of Unifix BWidget Toolkit
# ----------------------------------------------------------------------------
#  Index of commands:
#     - ProgressDlg::create
# ----------------------------------------------------------------------------

namespace eval ProgressDlg {
    Widget::define ProgressDlg progressdlg Dialog ProgressBar

    Widget::bwinclude ProgressDlg Dialog :cmd \
        remove {
            -modal -image -bitmap -side -anchor -cancel -default
            -homogeneous -padx -pady -spacing
        }

    Widget::bwinclude ProgressDlg ProgressBar .frame.pb \
        remove {-orient -width -height}

    Widget::declare ProgressDlg {
        {-width        TkResource 25 0 label}
        {-height       TkResource 2  0 label}
        {-textvariable TkResource "" 0 label}
        {-font         TkResource "" 0 label}
        {-stop         String "" 0}
        {-command      String "" 0}
    }

    Widget::addmap ProgressDlg :cmd .frame.msg \
        {-width {} -height {} -textvariable {} -font {} -background {}}
}


# ----------------------------------------------------------------------------
#  Command ProgressDlg::create
# ----------------------------------------------------------------------------
proc ProgressDlg::create { path args } {
    array set maps [list ProgressDlg {} :cmd {} .frame.msg {} .frame.pb {}]
    array set maps [Widget::parseArgs ProgressDlg $args]

    eval [list Dialog::create] $path $maps(:cmd) \
	[list -image [Bitmap::get hourglass] \
	     -modal none -side bottom -anchor e -class ProgressDlg]

    Widget::initFromODB ProgressDlg "$path#ProgressDlg" $maps(ProgressDlg)

    wm protocol $path WM_DELETE_WINDOW {;}

    set frame [Dialog::getframe $path]
    bind $frame <Destroy> [list Widget::destroy $path\#ProgressDlg]
    $frame configure -cursor watch

    eval [list label $frame.msg] $maps(.frame.msg) \
	-relief flat -borderwidth 0 \
	    -highlightthickness 0 -anchor w -justify left
    pack $frame.msg -side top -pady 3m -anchor nw -fill x -expand yes

    eval [list ProgressBar::create] $frame.pb $maps(.frame.pb) -width 100
    pack $frame.pb -side bottom -anchor w -fill x -expand yes

    set stop [Widget::cget "$path#ProgressDlg" -stop]
    set cmd  [Widget::cget "$path#ProgressDlg" -command]
    if { $stop != "" && $cmd != "" } {
        Dialog::add $path -text $stop -name $stop -command $cmd
    }
    Dialog::draw $path
    BWidget::grab local $path

    return [Widget::create ProgressDlg $path 0]
}


# ----------------------------------------------------------------------------
#  Command ProgressDlg::configure
# ----------------------------------------------------------------------------
proc ProgressDlg::configure { path args } {
    return [Widget::configure "$path#ProgressDlg" $args]
}


# ----------------------------------------------------------------------------
#  Command ProgressDlg::cget
# ----------------------------------------------------------------------------
proc ProgressDlg::cget { path option } {
    return [Widget::cget "$path#ProgressDlg" $option]
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<














































































































































































Deleted scriptlibs/bwidget-1.9.8/scrollframe.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
# ----------------------------------------------------------------------------
#  scrollframe.tcl
#  This file is part of Unifix BWidget Toolkit
#  $Id: scrollframe.tcl,v 1.11 2009/07/17 15:29:51 oehhar Exp $
# ----------------------------------------------------------------------------
#  Index of commands:
#     - ScrollableFrame::create
#     - ScrollableFrame::configure
#     - ScrollableFrame::cget
#     - ScrollableFrame::getframe
#     - ScrollableFrame::see
#     - ScrollableFrame::xview
#     - ScrollableFrame::yview
#     - ScrollableFrame::_resize
# ----------------------------------------------------------------------------

namespace eval ScrollableFrame {
    Widget::define ScrollableFrame scrollframe

    # If themed, there is no background and -bg option
    if {[Widget::theme]} {
        Widget::declare ScrollableFrame {
            {-width             Int        0  0 {}}
            {-height            Int        0  0 {}}
            {-areawidth         Int        0  0 {}}
            {-areaheight        Int        0  0 {}}
            {-constrainedwidth  Boolean    0 0}
            {-constrainedheight Boolean    0 0}
            {-xscrollcommand    TkResource "" 0 canvas}
            {-yscrollcommand    TkResource "" 0 canvas}
            {-xscrollincrement  TkResource "" 0 canvas}
            {-yscrollincrement  TkResource "" 0 canvas}
        }
    } else {
        Widget::declare ScrollableFrame {
            {-background        TkResource "" 0 frame}
            {-width             Int        0  0 {}}
            {-height            Int        0  0 {}}
            {-areawidth         Int        0  0 {}}
            {-areaheight        Int        0  0 {}}
            {-constrainedwidth  Boolean    0 0}
            {-constrainedheight Boolean    0 0}
            {-xscrollcommand    TkResource "" 0 canvas}
            {-yscrollcommand    TkResource "" 0 canvas}
            {-xscrollincrement  TkResource "" 0 canvas}
            {-yscrollincrement  TkResource "" 0 canvas}
            {-bg                Synonym    -background}
        }
    }

    Widget::addmap ScrollableFrame "" :cmd {
        -width {} -height {} 
        -xscrollcommand {} -yscrollcommand {}
        -xscrollincrement {} -yscrollincrement {}
    }
    if { ! [Widget::theme]} {
        Widget::addmap ScrollableFrame "" .frame {-background {}}
    }

    variable _widget

    bind BwScrollableFrame <Configure> [list ScrollableFrame::_resize %W]
    bind BwScrollableFrame <Destroy>   [list Widget::destroy %W]
}


# ----------------------------------------------------------------------------
#  Command ScrollableFrame::create
# ----------------------------------------------------------------------------
proc ScrollableFrame::create { path args } {
    Widget::init ScrollableFrame $path $args

    set canvas [eval [list canvas $path] [Widget::subcget $path :cmd] \
                    -highlightthickness 0 -borderwidth 0 -relief flat]

    if {[Widget::theme]} {
	set frame [eval [list ttk::frame $path.frame] \
		       [Widget::subcget $path .frame]]
	set bg [ttk::style lookup TFrame -background]
    } else {
	set frame [eval [list frame $path.frame] \
		       [Widget::subcget $path .frame] \
		       -highlightthickness 0 -borderwidth 0 -relief flat]
	set bg [$frame cget -background]
    }
    # Give canvas frame (or theme) background
    $canvas configure -background $bg

    $canvas create window 0 0 -anchor nw -window $frame -tags win \
        -width  [Widget::cget $path -areawidth] \
        -height [Widget::cget $path -areaheight]

    bind $frame <Configure> \
        [list ScrollableFrame::_frameConfigure $canvas]
    # add <unmap> binding: <configure> is not called when frame
    # becomes so small that it suddenly falls outside of currently visible area.
    # but now we need to add a <map> binding too
    bind $frame <Map> \
        [list ScrollableFrame::_frameConfigure $canvas]
    bind $frame <Unmap> \
        [list ScrollableFrame::_frameConfigure $canvas 1]

    bindtags $path [list $path BwScrollableFrame [winfo toplevel $path] all]

    return [Widget::create ScrollableFrame $path]
}


# ----------------------------------------------------------------------------
#  Command ScrollableFrame::configure
# ----------------------------------------------------------------------------
proc ScrollableFrame::configure { path args } {
    set res [Widget::configure $path $args]
    set upd 0

    set modcw [Widget::hasChanged $path -constrainedwidth cw]
    set modw  [Widget::hasChanged $path -areawidth w]
    if { $modcw || (!$cw && $modw) } {
        set upd 1
    }
    if { $cw } {
        set w [winfo width $path]
    }

    set modch [Widget::hasChanged $path -constrainedheight ch]
    set modh  [Widget::hasChanged $path -areaheight h]
    if { $modch || (!$ch && $modh) } {
        set upd 1
    }
    if { $ch } {
        set h [winfo height $path]
    }

    if { $upd } {
        $path:cmd itemconfigure win -width $w -height $h
    }
    return $res
}


# ----------------------------------------------------------------------------
#  Command ScrollableFrame::cget
# ----------------------------------------------------------------------------
proc ScrollableFrame::cget { path option } {
    return [Widget::cget $path $option]
}


# ----------------------------------------------------------------------------
#  Command ScrollableFrame::getframe
# ----------------------------------------------------------------------------
proc ScrollableFrame::getframe { path } {
    return $path.frame
}

# ----------------------------------------------------------------------------
#  Command ScrollableFrame::see
# ----------------------------------------------------------------------------
proc ScrollableFrame::see { path widget {vert top} {horz left} {xOffset 0} {yOffset 0}} {
    set x0  [winfo x $widget]
    set y0  [winfo y $widget]
    set x1  [expr {$x0+[winfo width  $widget]}]
    set y1  [expr {$y0+[winfo height $widget]}]
    set xb0 [$path:cmd canvasx 0]
    set yb0 [$path:cmd canvasy 0]
    set xb1 [$path:cmd canvasx [winfo width  $path]]
    set yb1 [$path:cmd canvasy [winfo height $path]]
    set dx  0
    set dy  0
    
    if { [string equal $horz "left"] } {
	if { $x1 > $xb1 } {
	    set dx [expr {$x1-$xb1}]
	}
	if { $x0 < $xb0+$dx } {
	    set dx [expr {$x0-$xb0}]
	}
    } elseif { [string equal $horz "right"] } {
	if { $x0 < $xb0 } {
	    set dx [expr {$x0-$xb0}]
	}
	if { $x1 > $xb1+$dx } {
	    set dx [expr {$x1-$xb1}]
	}
    }

    if { [string equal $vert "top"] } {
	if { $y1 > $yb1 } {
	    set dy [expr {$y1-$yb1}]
	}
	if { $y0 < $yb0+$dy } {
	    set dy [expr {$y0-$yb0}]
	}
    } elseif { [string equal $vert "bottom"] } {
	if { $y0 < $yb0 } {
	    set dy [expr {$y0-$yb0}]
	}
	if { $y1 > $yb1+$dy } {
	    set dy [expr {$y1-$yb1}]
	}
    }

    if {($dx + $xOffset) != 0} {
	set x [expr {($xb0+$dx+$xOffset)/[winfo width $path.frame]}]
	$path:cmd xview moveto $x
    }
    if {($dy + $yOffset) != 0} {
	set y [expr {($yb0+$dy+$yOffset)/[winfo height $path.frame]}]
	$path:cmd yview moveto $y
    }
}


# ----------------------------------------------------------------------------
#  Command ScrollableFrame::xview
# ----------------------------------------------------------------------------
proc ScrollableFrame::xview { path args } {
    return [eval [list $path:cmd xview] $args]
}


# ----------------------------------------------------------------------------
#  Command ScrollableFrame::yview
# ----------------------------------------------------------------------------
proc ScrollableFrame::yview { path args } {
    return [eval [list $path:cmd yview] $args]
}


# ----------------------------------------------------------------------------
#  Command ScrollableFrame::_resize
# ----------------------------------------------------------------------------
proc ScrollableFrame::_resize { path } {
    if { [Widget::getoption $path -constrainedwidth] } {
        $path:cmd itemconfigure win -width [winfo width $path]
    }
    if { [Widget::getoption $path -constrainedheight] } {
        $path:cmd itemconfigure win -height [winfo height $path]
    }
    # scollregion must also be reset when canvas size changes
    _frameConfigure $path
}


# ----------------------------------------------------------------------------
#  Command ScrollableFrame::_frameConfigure
# ----------------------------------------------------------------------------
proc ScrollableFrame::_max {a b} {return [expr {$a <= $b ? $b : $a}]}
proc ScrollableFrame::_frameConfigure {canvas {unmap 0}} {
    # This ensures that we don't get funny scrollability in the frame
    # when it is smaller than the canvas space
    # use [winfo] to get height & width of frame

    # [winfo] doesn't work for unmapped frame
    set frameh [expr {$unmap ? 0 : [winfo height $canvas.frame]}]
    set framew [expr {$unmap ? 0 : [winfo width  $canvas.frame]}]

    set height [_max $frameh [winfo height $canvas]]
    set width  [_max $framew [winfo width  $canvas]]

    $canvas:cmd configure -scrollregion [list 0 0 $width $height]
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<












































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/scrollview.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
# ------------------------------------------------------------------------------
#  scrollview.tcl
#  This file is part of Unifix BWidget Toolkit
#  $Id: scrollview.tcl,v 1.7 2003/11/05 18:04:29 hobbs Exp $
# ------------------------------------------------------------------------------
#  Index of commands:
#     - ScrolledWindow::create
#     - ScrolledWindow::configure
#     - ScrolledWindow::cget
#     - ScrolledWindow::_set_hscroll
#     - ScrolledWindow::_set_vscroll
#     - ScrolledWindow::_update_scroll
#     - ScrolledWindow::_set_view
#     - ScrolledWindow::_resize
# ------------------------------------------------------------------------------

namespace eval ScrollView {
    Widget::define ScrollView scrollview

    Widget::tkinclude ScrollView canvas :cmd \
	    include {-relief -borderwidth -background -width -height -cursor} \
	    initialize {-relief flat -borderwidth 0 -width 30 -height 30 \
		-cursor crosshair}

    Widget::declare ScrollView {
        {-width       TkResource 30        0 canvas}
        {-height      TkResource 30        0 canvas}
        {-background  TkResource ""        0 canvas}
        {-foreground  String     black     0}
        {-fill        String     ""        0}
        {-relief      TkResource flat      0 canvas}
        {-borderwidth TkResource 0         0 canvas}
        {-cursor      TkResource crosshair 0 canvas}
        {-window      String     ""        0}
        {-fg          Synonym    -foreground}
        {-bg          Synonym    -background}
        {-bd          Synonym    -borderwidth}
    }

    bind BwScrollView <B1-Motion>   [list ScrollView::_set_view %W motion %x %y]
    bind BwScrollView <ButtonPress-1> [list ScrollView::_set_view %W set %x %y]
    bind BwScrollView <Configure>     [list ScrollView::_resize %W]
    bind BwScrollView <Destroy>       [list ScrollView::_destroy %W]
}


# ------------------------------------------------------------------------------
#  Command ScrollView::create
# ------------------------------------------------------------------------------
proc ScrollView::create { path args } {
    Widget::init ScrollView $path $args
    eval [list canvas $path] [Widget::subcget $path :cmd] -highlightthickness 0

    Widget::create ScrollView $path

    Widget::getVariable $path _widget

    set w               [Widget::cget $path -window]
    set _widget(bd)     [Widget::cget $path -borderwidth]
    set _widget(width)  [Widget::cget $path -width]
    set _widget(height) [Widget::cget $path -height]

    if {[winfo exists $w]} {
        set _widget(oldxscroll) [$w cget -xscrollcommand]
        set _widget(oldyscroll) [$w cget -yscrollcommand]
        $w configure \
            -xscrollcommand [list ScrollView::_set_hscroll $path] \
            -yscrollcommand [list ScrollView::_set_vscroll $path]
    }
    $path:cmd create rectangle -2 -2 -2 -2 \
        -fill    [Widget::cget $path -fill]       \
        -outline [Widget::cget $path -foreground] \
        -tags    view

    bindtags $path [list $path BwScrollView [winfo toplevel $path] all]

    return $path
}


# ------------------------------------------------------------------------------
#  Command ScrollView::configure
# ------------------------------------------------------------------------------
proc ScrollView::configure { path args } {
    Widget::getVariable $path _widget

    set oldw [Widget::getoption $path -window] 
    set res  [Widget::configure $path $args]

    if { [Widget::hasChanged $path -window w] } {
        if { [winfo exists $oldw] } {
            $oldw configure \
                -xscrollcommand $_widget(oldxscroll) \
                -yscrollcommand $_widget(oldyscroll)
        }
        if { [winfo exists $w] } {
            set _widget(oldxscroll) [$w cget -xscrollcommand]
            set _widget(oldyscroll) [$w cget -yscrollcommand]
            $w configure \
                -xscrollcommand [list ScrollView::_set_hscroll $path] \
                -yscrollcommand [list ScrollView::_set_vscroll $path]
        } else {
            $path:cmd coords view -2 -2 -2 -2
            set _widget(oldxscroll) {}
            set _widget(oldyscroll) {}
        }
    }

    if { [Widget::hasChanged $path -fill fill] |
         [Widget::hasChanged $path -foreground fg] } {
        $path:cmd itemconfigure view \
            -fill    $fill \
            -outline $fg
    }

    return $res
}


# ------------------------------------------------------------------------------
#  Command ScrollView::cget
# ------------------------------------------------------------------------------
proc ScrollView::cget { path option } {
    return [Widget::cget $path $option]
}


# ------------------------------------------------------------------------------
#  Command ScrollView::_set_hscroll
# ------------------------------------------------------------------------------
proc ScrollView::_set_hscroll { path vmin vmax } {
    Widget::getVariable $path _widget

    set c  [$path:cmd coords view]
    set x0 [expr {$vmin*$_widget(width)+$_widget(bd)}]
    set x1 [expr {$vmax*$_widget(width)+$_widget(bd)-1}]
    $path:cmd coords view $x0 [lindex $c 1] $x1 [lindex $c 3]
    if { $_widget(oldxscroll) != "" } {
        uplevel \#0 $_widget(oldxscroll) $vmin $vmax
    }
}


# ------------------------------------------------------------------------------
#  Command ScrollView::_set_vscroll
# ------------------------------------------------------------------------------
proc ScrollView::_set_vscroll { path vmin vmax } {
    Widget::getVariable $path _widget

    set c  [$path:cmd coords view]
    set y0 [expr {$vmin*$_widget(height)+$_widget(bd)}]
    set y1 [expr {$vmax*$_widget(height)+$_widget(bd)-1}]
    $path:cmd coords view [lindex $c 0] $y0 [lindex $c 2] $y1
    if { $_widget(oldyscroll) != "" } {
        uplevel \#0 $_widget(oldyscroll) $vmin $vmax
    }
}


# ------------------------------------------------------------------------------
#  Command ScrollView::_update_scroll
# ------------------------------------------------------------------------------
proc ScrollView::_update_scroll { path callscroll hminmax vminmax } {
    Widget::getVariable $path _widget

    set c    [$path:cmd coords view]
    set hmin [lindex $hminmax 0]
    set hmax [lindex $hminmax 1]
    set vmin [lindex $vminmax 0]
    set vmax [lindex $vminmax 1]
    set x0   [expr {$hmin*$_widget(width)+$_widget(bd)}]
    set x1   [expr {$hmax*$_widget(width)+$_widget(bd)-1}]
    set y0   [expr {$vmin*$_widget(height)+$_widget(bd)}]
    set y1   [expr {$vmax*$_widget(height)+$_widget(bd)-1}]
    $path:cmd coords view $x0 $y0 $x1 $y1
    if { $callscroll } {
        if { $_widget(oldxscroll) != "" } {
            uplevel \#0 $_widget(oldxscroll) $hmin $hmax
        }
        if { $_widget(oldyscroll) != "" } {
            uplevel \#0 $_widget(oldyscroll) $vmin $vmax
        }
    }
}


# ------------------------------------------------------------------------------
#  Command ScrollView::_set_view
# ------------------------------------------------------------------------------
proc ScrollView::_set_view { path cmd x y } {
    Widget::getVariable $path _widget

    set w [Widget::getoption $path -window]
    if {[winfo exists $w]} {
        if {[string equal $cmd "set"]} {
            set c  [$path:cmd coords view]
            set x0 [lindex $c 0]
            set y0 [lindex $c 1]
            set x1 [lindex $c 2]
            set y1 [lindex $c 3]
            if {$x >= $x0 && $x <= $x1 &&
                $y >= $y0 && $y <= $y1} {
                set _widget(dx) [expr {$x-$x0}]
                set _widget(dy) [expr {$y-$y0}]
                return
            } else {
                set x0 [expr {$x-($x1-$x0)/2}]
                set y0 [expr {$y-($y1-$y0)/2}]
                set _widget(dx) [expr {$x-$x0}]
                set _widget(dy) [expr {$y-$y0}]
                set vh [expr {double($x0-$_widget(bd))/$_widget(width)}]
                set vv [expr {double($y0-$_widget(bd))/$_widget(height)}]
            }
        } elseif {[string equal $cmd "motion"]} {
            set vh [expr {double($x-$_widget(dx)-$_widget(bd))/$_widget(width)}]
            set vv [expr {double($y-$_widget(dy)-$_widget(bd))/$_widget(height)}]
        }
        $w xview moveto $vh
        $w yview moveto $vv
        _update_scroll $path 1 [$w xview] [$w yview]
    }
}


# ------------------------------------------------------------------------------
#  Command ScrollView::_resize
# ------------------------------------------------------------------------------
proc ScrollView::_resize { path } {
    Widget::getVariable $path _widget

    set _widget(bd)     [Widget::getoption $path -borderwidth]
    set _widget(width)  [expr {[winfo width  $path]-2*$_widget(bd)}]
    set _widget(height) [expr {[winfo height $path]-2*$_widget(bd)}]
    set w [Widget::getoption $path -window]
    if { [winfo exists $w] } {
        _update_scroll $path 0 [$w xview] [$w yview]
    }
}


# ------------------------------------------------------------------------------
#  Command ScrollView::_destroy
# ------------------------------------------------------------------------------
proc ScrollView::_destroy { path } {
    Widget::getVariable $path _widget

    set w [Widget::getoption $path -window] 
    if { [winfo exists $w] } {
        $w configure \
            -xscrollcommand $_widget(oldxscroll) \
            -yscrollcommand $_widget(oldyscroll)
    }
    Widget::destroy $path
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




























































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/scrollw.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
# -----------------------------------------------------------------------------
#  scrollw.tcl
#  This file is part of Unifix BWidget Toolkit
#  $Id: scrollw.tcl,v 1.13.2.2 2011/02/14 16:56:09 oehhar Exp $
# -----------------------------------------------------------------------------
#  Index of commands:
#     - ScrolledWindow::create
#     - ScrolledWindow::getframe
#     - ScrolledWindow::setwidget
#     - ScrolledWindow::configure
#     - ScrolledWindow::cget
#     - ScrolledWindow::_set_hframe
#     - ScrolledWindow::_set_vscroll
#     - ScrolledWindow::_setData
#     - ScrolledWindow::_setSBSize
#     - ScrolledWindow::_realize
# -----------------------------------------------------------------------------

namespace eval ScrolledWindow {
    Widget::define ScrolledWindow scrollw

    Widget::declare ScrolledWindow {
	{-background  TkResource ""   0 button}
	{-scrollbar   Enum	 both 0 {none both vertical horizontal}}
	{-auto	      Enum	 both 0 {none both vertical horizontal}}
	{-sides	      Enum	 se   0 {ne en nw wn se es sw ws}}
	{-size	      Int	 0    1 "%d >= 0"}
	{-ipad	      Int	 1    1 "%d >= 0"}
	{-managed     Boolean	 1    1}
	{-relief      TkResource flat 0 frame}
	{-borderwidth TkResource 0    0 frame}
	{-bg	      Synonym	 -background}
	{-bd	      Synonym	 -borderwidth}
    }

    Widget::addmap ScrolledWindow "" :cmd {-relief {} -borderwidth {}}
}


# -----------------------------------------------------------------------------
#  Command ScrolledWindow::create
# -----------------------------------------------------------------------------
proc ScrolledWindow::create { path args } {
    Widget::init ScrolledWindow $path $args

    Widget::getVariable $path data

    set bg     [Widget::cget $path -background]
    set sbsize [Widget::cget $path -size]

    if { $::Widget::_theme } {
        set sw     [eval [list ttk::frame $path \
                      -relief flat -borderwidth 0 -takefocus 0] \
                        [Widget::subcget $path :cmd]]
        ttk::scrollbar $path.hscroll \
            -takefocus 0 -orient horiz
        ttk::scrollbar $path.vscroll \
            -takefocus 0 -orient vert
    } else {
        if {$bg != ""} {
            set bg [list -background $bg]
        }
        set sw     [eval [list frame $path \
                      -relief flat -borderwidth 0] $bg [list \
                      -highlightthickness 0 -takefocus 0] \
                        [Widget::subcget $path :cmd]]
        scrollbar $path.hscroll \
            -highlightthickness 0 -takefocus 0 \
            -orient	 horiz	\
            -relief	 sunken
        scrollbar $path.vscroll \
            -highlightthickness 0 -takefocus 0 \
            -orient	 vert	\
            -relief	 sunken
    }

    set data(realized) 0

    _setData $path \
	    [Widget::cget $path -scrollbar] \
	    [Widget::cget $path -auto] \
	    [Widget::cget $path -sides]

    if {[Widget::cget $path -managed]} {
	set data(hsb,packed) $data(hsb,present)
	set data(vsb,packed) $data(vsb,present)
    } else {
	set data(hsb,packed) 0
	set data(vsb,packed) 0
    }
    if { ! $::Widget::_theme } {
        if {$sbsize} {
            $path.vscroll configure -width $sbsize
            $path.hscroll configure -width $sbsize
        } else {
            set sbsize [$path.vscroll cget -width]
        }
    }
    set data(ipad) [Widget::cget $path -ipad]

    if {$data(hsb,packed)} {
	grid $path.hscroll -column 1 -row $data(hsb,row) \
		-sticky ew -ipady $data(ipad)
    }
    if {$data(vsb,packed)} {
	grid $path.vscroll -column $data(vsb,column) -row 1 \
		-sticky ns -ipadx $data(ipad)
    }

    grid columnconfigure $path 1 -weight 1
    grid rowconfigure	 $path 1 -weight 1

    bind $path <Configure> [list ScrolledWindow::_realize $path]
    bind $path <Destroy>   [list ScrolledWindow::_destroy $path]

    return [Widget::create ScrolledWindow $path]
}


# -----------------------------------------------------------------------------
#  Command ScrolledWindow::getframe
# -----------------------------------------------------------------------------
proc ScrolledWindow::getframe { path } {
    return $path
}


# -----------------------------------------------------------------------------
#  Command ScrolledWindow::setwidget
# -----------------------------------------------------------------------------
proc ScrolledWindow::setwidget { path widget } {
    Widget::getVariable $path data

    if {[info exists data(widget)] && [winfo exists $data(widget)]
	&& ![string equal $data(widget) $widget]} {
	grid remove $data(widget)
	$data(widget) configure -xscrollcommand "" -yscrollcommand ""
    }
    set data(widget) $widget
    grid $widget -in $path -row 1 -column 1 -sticky news
    raise $widget;

    $path.hscroll configure -command [list $widget xview]
    $path.vscroll configure -command [list $widget yview]
    $widget configure \
	    -xscrollcommand [list ScrolledWindow::_set_hscroll $path] \
	    -yscrollcommand [list ScrolledWindow::_set_vscroll $path]
}


# -----------------------------------------------------------------------------
#  Command ScrolledWindow::configure
# -----------------------------------------------------------------------------
proc ScrolledWindow::configure { path args } {
    Widget::getVariable $path data

    set res [Widget::configure $path $args]
    if { ! $::Widget::_theme && [Widget::hasChanged $path -background bg] } {
        $path configure -background $bg
        catch {$path.hscroll configure -background $bg}
        catch {$path.vscroll configure -background $bg}
    }

    if {[Widget::hasChanged $path -scrollbar scrollbar] | \
	    [Widget::hasChanged $path -auto	 auto]	| \
	    [Widget::hasChanged $path -sides	 sides]} {
	_setData $path $scrollbar $auto $sides
	foreach {vmin vmax} [$path.hscroll get] { break }
	set data(hsb,packed) [expr {$data(hsb,present) && \
		(!$data(hsb,auto) || ($vmin != 0 || $vmax != 1))}]
	foreach {vmin vmax} [$path.vscroll get] { break }
	set data(vsb,packed) [expr {$data(vsb,present) && \
		(!$data(vsb,auto) || ($vmin != 0 || $vmax != 1))}]

	set data(ipad) [Widget::cget $path -ipad]

	if {$data(hsb,packed)} {
	    grid $path.hscroll -column 1 -row $data(hsb,row) \
		-sticky ew -ipady $data(ipad)
	} else {
	    if {![info exists data(hlock)]} {
		set data(hsb,packed) 0
		grid remove $path.hscroll
	    }
	}
	if {$data(vsb,packed)} {
	    grid $path.vscroll -column $data(vsb,column) -row 1 \
		-sticky ns -ipadx $data(ipad)
	} else {
	    if {![info exists data(hlock)]} {
		set data(vsb,packed) 0
		grid remove $path.vscroll
	    }
	}
    }
    return $res
}


# -----------------------------------------------------------------------------
#  Command ScrolledWindow::cget
# -----------------------------------------------------------------------------
proc ScrolledWindow::cget { path option } {
    return [Widget::cget $path $option]
}


# -----------------------------------------------------------------------------
#  Command ScrolledWindow::_set_hscroll
# -----------------------------------------------------------------------------
proc ScrolledWindow::_set_hscroll { path vmin vmax } {
    Widget::getVariable $path data

    if {$data(realized) && $data(hsb,present)} {
	if {$data(hsb,auto) && ![info exists data(hlock)]} {
	    if {$data(hsb,packed) && $vmin == 0 && $vmax == 1} {
		set data(hsb,packed) 0
		grid remove $path.hscroll
		set data(hlock) 1
		update idletasks
		unset data(hlock)
	    } elseif {!$data(hsb,packed) && ($vmin != 0 || $vmax != 1)} {
		set data(hsb,packed) 1
		grid $path.hscroll -column 1 -row $data(hsb,row) \
			-sticky ew -ipady $data(ipad)
		set data(hlock) 1
		update idletasks
		unset data(hlock)
	    }
	}
	$path.hscroll set $vmin $vmax
    }
}


# -----------------------------------------------------------------------------
#  Command ScrolledWindow::_set_vscroll
# -----------------------------------------------------------------------------
proc ScrolledWindow::_set_vscroll { path vmin vmax } {
    Widget::getVariable $path data

    if {$data(realized) && $data(vsb,present)} {
	if {$data(vsb,auto) && ![info exists data(vlock)]} {
	    if {$data(vsb,packed) && $vmin == 0 && $vmax == 1} {
		set data(vsb,packed) 0
		grid remove $path.vscroll
		set data(vlock) 1
		update idletasks
		unset data(vlock)
	    } elseif {!$data(vsb,packed) && ($vmin != 0 || $vmax != 1) } {
		set data(vsb,packed) 1
		grid $path.vscroll -column $data(vsb,column) -row 1 \
			-sticky ns -ipadx $data(ipad)
		set data(vlock) 1
		update idletasks
		unset data(vlock)
	    }
	}
	$path.vscroll set $vmin $vmax
    }
}


proc ScrolledWindow::_setData {path scrollbar auto sides} {
    Widget::getVariable $path data

    set sb    [lsearch {none horizontal vertical both} $scrollbar]
    set auto  [lsearch {none horizontal vertical both} $auto]

    set data(hsb,present)  [expr {($sb & 1) != 0}]
    set data(hsb,auto)	   [expr {($auto & 1) != 0}]
    set data(hsb,row)	   [expr {[string match *n* $sides] ? 0 : 2}]

    set data(vsb,present)  [expr {($sb & 2) != 0}]
    set data(vsb,auto)	   [expr {($auto & 2) != 0}]
    set data(vsb,column)   [expr {[string match *w* $sides] ? 0 : 2}]
}


# -----------------------------------------------------------------------------
#  Command ScrolledWindow::_realize
# -----------------------------------------------------------------------------
proc ScrolledWindow::_realize { path } {
    Widget::getVariable $path data

    bind $path <Configure> {}
    set data(realized) 1
}


# -----------------------------------------------------------------------------
#  Command ScrolledWindow::_destroy
# -----------------------------------------------------------------------------
proc ScrolledWindow::_destroy { path } {
    Widget::destroy $path
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
















































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/separator.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# ------------------------------------------------------------------------------
#  separator.tcl
#  This file is part of Unifix BWidget Toolkit
# ------------------------------------------------------------------------------
#  Index of commands:
#     - Separator::create
#     - Separator::configure
#     - Separator::cget
# ------------------------------------------------------------------------------

namespace eval Separator {
    Widget::define Separator separator

    Widget::declare Separator {
        {-background TkResource ""         0 frame}
        {-cursor     TkResource ""         0 frame}
        {-relief     Enum       groove     0 {ridge groove}}
        {-orient     Enum       horizontal 1 {horizontal vertical}}
        {-bg         Synonym    -background}
    }
    Widget::addmap Separator "" :cmd { -background {} -cursor {} }

    bind Separator <Destroy> [list Widget::destroy %W]
}


# ------------------------------------------------------------------------------
#  Command Separator::create
# ------------------------------------------------------------------------------
proc Separator::create { path args } {
    array set maps [list Separator {} :cmd {}]
    array set maps [Widget::parseArgs Separator $args]
    eval [list frame $path] $maps(:cmd) -class Separator
    Widget::initFromODB Separator $path $maps(Separator)

    if { [Widget::cget $path -orient] == "horizontal" } {
	$path configure -borderwidth 1 -height 2
    } else {
	$path configure -borderwidth 1 -width 2
    }

    if { [string equal [Widget::cget $path -relief] "groove"] } {
	$path configure -relief sunken
    } else {
	$path configure -relief raised
    }

    return [Widget::create Separator $path]
}


# ------------------------------------------------------------------------------
#  Command Separator::configure
# ------------------------------------------------------------------------------
proc Separator::configure { path args } {
    set res [Widget::configure $path $args]

    if { [Widget::hasChanged $path -relief relief] } {
        if { $relief == "groove" } {
            $path:cmd configure -relief sunken
        } else {
            $path:cmd configure -relief raised
        }
    }

    return $res
}


# ------------------------------------------------------------------------------
#  Command Separator::cget
# ------------------------------------------------------------------------------
proc Separator::cget { path option } {
    return [Widget::cget $path $option]
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






















































































































































Deleted scriptlibs/bwidget-1.9.8/spinbox.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
# spinbox.tcl --
#
#	BWidget SpinBox implementation.
#
# Copyright (c) 1999 by Unifix
# Copyright (c) 2000 by Ajuba Solutions
# All rights reserved.
# 
# RCS: @(#) $Id: spinbox.tcl,v 1.12 2003/10/20 21:23:52 damonc Exp $
# -----------------------------------------------------------------------------
#  Index of commands:
#     - SpinBox::create
#     - SpinBox::configure
#     - SpinBox::cget
#     - SpinBox::setvalue
#     - SpinBox::_destroy
#     - SpinBox::_modify_value
#     - SpinBox::_test_options
# -----------------------------------------------------------------------------

namespace eval SpinBox {
    Widget::define SpinBox spinbox Entry ArrowButton

    Widget::tkinclude SpinBox frame :cmd \
	    include {-background -borderwidth -bg -bd -relief} \
	    initialize {-relief sunken -borderwidth 2}

    Widget::bwinclude SpinBox Entry .e \
        remove {-relief -bd -borderwidth -fg -bg} \
        rename {-foreground -entryfg -background -entrybg}

    Widget::declare SpinBox {
        {-range          String ""  0}
        {-values         String ""  0}
        {-modifycmd      String ""  0}
        {-repeatdelay    Int    400 0 {%d >= 0}}
        {-repeatinterval Int    100 0 {%d >= 0}}
	{-foreground     TkResource black 0 {button}}
    }

    Widget::addmap SpinBox "" :cmd {-background {}}
    Widget::addmap SpinBox ArrowButton .arrup {
        -foreground {} -background {} -disabledforeground {} -state {} \
		-repeatinterval {} -repeatdelay {}
    }
    Widget::addmap SpinBox ArrowButton .arrdn {
        -foreground {} -background {} -disabledforeground {} -state {} \
		-repeatinterval {} -repeatdelay {}
    }

    ::bind SpinBox <FocusIn> [list after idle {BWidget::refocus %W %W.e}]
    ::bind SpinBox <Destroy> [list SpinBox::_destroy %W]

    variable _widget
}


# -----------------------------------------------------------------------------
#  Command SpinBox::create
# -----------------------------------------------------------------------------
proc SpinBox::create { path args } {
    array set maps [list SpinBox {} :cmd {} .e {} .arrup {} .arrdn {}]
    array set maps [Widget::parseArgs SpinBox $args]
    eval [list frame $path] $maps(:cmd) \
	[list -highlightthickness 0 -takefocus 0 -class SpinBox]
    Widget::initFromODB SpinBox $path $maps(SpinBox)

    set entry [eval [list Entry::create $path.e] $maps(.e) -relief flat -bd 0]
    bindtags $path.e [linsert [bindtags $path.e] 1 SpinBoxEntry]

    set farr   [frame $path.farr -relief flat -bd 0 -highlightthickness 0]
    set height [expr {[winfo reqheight $path.e]/2-2}]
    set width  11
    set arrup  [eval [list ArrowButton::create $path.arrup -dir top] \
	    $maps(.arrup) \
		    [list -highlightthickness 0 -borderwidth 1 -takefocus 0 \
			 -type button -width $width -height $height \
			 -armcommand    [list SpinBox::_modify_value $path next arm] \
			 -disarmcommand [list SpinBox::_modify_value $path next disarm]]]
    set arrdn  [eval [list ArrowButton::create $path.arrdn -dir bottom] \
	    $maps(.arrdn) \
		    [list -highlightthickness 0 -borderwidth 1 -takefocus 0 \
			 -type button -width $width -height $height \
			 -armcommand    [list SpinBox::_modify_value $path previous arm] \
			 -disarmcommand [list SpinBox::_modify_value $path previous disarm]]]

    # --- update SpinBox value ---
    _test_options $path
    set val [Entry::cget $path.e -text]
    if { [string equal $val ""] } {
	Entry::configure $path.e -text $::SpinBox::_widget($path,curval)
    } else {
	set ::SpinBox::_widget($path,curval) $val
    }

    grid $arrup -in $farr -column 0 -row 0 -sticky nsew
    grid $arrdn -in $farr -column 0 -row 2 -sticky nsew
    grid rowconfigure $farr 0 -weight 1
    grid rowconfigure $farr 2 -weight 1

    pack $farr  -side right -fill y
    pack $entry -side left  -fill both -expand yes

    ::bind $entry <Key-Up>    [list SpinBox::_modify_value $path next activate]
    ::bind $entry <Key-Down>  [list SpinBox::_modify_value $path previous activate]
    ::bind $entry <Key-Prior> [list SpinBox::_modify_value $path last activate]
    ::bind $entry <Key-Next>  [list SpinBox::_modify_value $path first activate]

    ::bind $farr <Configure> {grid rowconfigure %W 1 -minsize [expr {%h%%2}]}

    return [Widget::create SpinBox $path]
}

# -----------------------------------------------------------------------------
#  Command SpinBox::configure
# -----------------------------------------------------------------------------
proc SpinBox::configure { path args } {
    set res [Widget::configure $path $args]
    if { [Widget::hasChangedX $path -values] ||
         [Widget::hasChangedX $path -range] } {
        _test_options $path
    }
    return $res
}


# -----------------------------------------------------------------------------
#  Command SpinBox::cget
# -----------------------------------------------------------------------------
proc SpinBox::cget { path option } {
    return [Widget::cget $path $option]
}


# -----------------------------------------------------------------------------
#  Command SpinBox::setvalue
# -----------------------------------------------------------------------------
proc SpinBox::setvalue { path index } {
    variable _widget

    set values [Widget::getMegawidgetOption $path -values]
    set value  [Entry::cget $path.e -text]
    
    if { [llength $values] } {
        # --- -values SpinBox ---
        switch -- $index {
            next {
                if { [set idx [lsearch $values $value]] != -1 } {
                    incr idx
                } elseif { [set idx [lsearch $values "$value*"]] == -1 } {
                    set idx [lsearch $values $_widget($path,curval)]
                }
            }
            previous {
                if { [set idx [lsearch $values $value]] != -1 } {
                    incr idx -1
                } elseif { [set idx [lsearch $values "$value*"]] == -1 } {
                    set idx [lsearch $values $_widget($path,curval)]
                }
            }
            first {
                set idx 0
            }
            last {
                set idx [expr {[llength $values]-1}]
            }
            default {
                if { [string index $index 0] == "@" } {
                    set idx [string range $index 1 end]
                    if { [catch {string compare [expr {int($idx)}] $idx} res] || $res != 0 } {
                        return -code error "bad index \"$index\""
                    }
                } else {
                    return -code error "bad index \"$index\""
                }
            }
        }
        if { $idx >= 0 && $idx < [llength $values] } {
            set newval [lindex $values $idx]
        } else {
            return 0
        }
    } else {
        # --- -range SpinBox ---
	foreach {vmin vmax incr} [Widget::getMegawidgetOption $path -range] {
	    break
	}
	# Allow zero padding on the value; strip it out for calculation by
	# scanning the value into a floating point number.
	scan $value %f value
        switch -- $index {
            next {
                if { [catch {expr {double($value-$vmin)/$incr}} idx] } {
                    set newval $_widget($path,curval)
                } else {
                    set newval [expr {$vmin+(round($idx)+1)*$incr}]
                    if { $newval < $vmin } {
                        set newval $vmin
                    } elseif { $newval > $vmax } {
                        set newval $vmax
                    }
                }
            }
            previous {
                if { [catch {expr {double($value-$vmin)/$incr}} idx] } {
                    set newval $_widget($path,curval)
                } else {
                    set newval [expr {$vmin+(round($idx)-1)*$incr}]
                    if { $newval < $vmin } {
                        set newval $vmin
                    } elseif { $newval > $vmax } {
                        set newval $vmax
                    }
                }
            }
            first {
                set newval $vmin
            }
            last {
                set newval $vmax
            }
            default {
                if { [string index $index 0] == "@" } {
                    set idx [string range $index 1 end]
                    if { [catch {string compare [expr {int($idx)}] $idx} res] || $res != 0 } {
                        return -code error "bad index \"$index\""
                    }
                    set newval [expr {$vmin+int($idx)*$incr}]
                    if { $newval < $vmin || $newval > $vmax } {
                        return 0
                    }
                } else {
                    return -code error "bad index \"$index\""
                }
            }
        }
    }
    set _widget($path,curval) $newval
    Entry::configure $path.e -text $newval
    return 1
}


# -----------------------------------------------------------------------------
#  Command SpinBox::getvalue
# -----------------------------------------------------------------------------
proc SpinBox::getvalue { path } {
    variable _widget

    set values [Widget::getMegawidgetOption $path -values]
    set value  [Entry::cget $path.e -text]

    if { [llength $values] } {
        # --- -values SpinBox ---
        return  [lsearch $values $value]
    } else {
	foreach {vmin vmax incr} [Widget::getMegawidgetOption $path -range] {
	    break
	}
        if { ![catch {expr {double($value-$vmin)/$incr}} idx] &&
             $idx == int($idx) } {
            return [expr {int($idx)}]
        }
        return -1
    }
}


# -----------------------------------------------------------------------------
#  Command SpinBox::bind
# -----------------------------------------------------------------------------
proc SpinBox::bind { path args } {
    return [eval [list ::bind $path.e] $args]
}


# -----------------------------------------------------------------------------
#  Command SpinBox::_modify_value
# -----------------------------------------------------------------------------
proc SpinBox::_modify_value { path direction reason } {
    if { $reason == "arm" || $reason == "activate" } {
        SpinBox::setvalue $path $direction
    }
    if { ($reason == "disarm" || $reason == "activate") &&
         [set cmd [Widget::getMegawidgetOption $path -modifycmd]] != "" } {
        uplevel \#0 $cmd
    }
}

# -----------------------------------------------------------------------------
#  Command SpinBox::_test_options
# -----------------------------------------------------------------------------
proc SpinBox::_test_options { path } {
    set values [Widget::getMegawidgetOption $path -values]
    if { [llength $values] } {
        set ::SpinBox::_widget($path,curval) [lindex $values 0]
    } else {
	foreach {vmin vmax incr} [Widget::getMegawidgetOption $path -range] {
	    break
	}
	set update 0
        if { [catch {expr {int($vmin)}}] } {
            set vmin 0
	    set update 1
        }
        if { [catch {expr {$vmax<$vmin}} res] || $res } {
            set vmax $vmin
	    set update 1
        }
        if { [catch {expr {$incr<0}} res] || $res } {
            set incr 1
	    set update 1
        }
	# Only do the set back (which is expensive) if we changed a value
	if { $update } {
	    Widget::setMegawidgetOption $path -range [list $vmin $vmax $incr]
	}
        set ::SpinBox::_widget($path,curval) $vmin
    }
}


# -----------------------------------------------------------------------------
#  Command SpinBox::_destroy
# -----------------------------------------------------------------------------
proc SpinBox::_destroy { path } {
    variable _widget

    unset _widget($path,curval)
    Widget::destroy $path
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






















































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/statusbar.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
# ------------------------------------------------------------------------
#  statusbar.tcl
#	Create a status bar Tk widget
#
#  Provides a status bar to be placed at the bottom of a toplevel.
#  Currently does not support being placed in a toplevel that has
#  gridding applied (via widget -setgrid or wm grid).
#
#  Ensure that the widget is placed at the very bottom of the toplevel,
#  otherwise the resize behavior may behave oddly.
# ------------------------------------------------------------------------

package require Tk 8.3

if {0} {
    proc sample {} {
    # sample usage
    eval destroy [winfo children .]
    pack [text .t -width 0 -height 0] -fill both -expand 1

    set sbar .s
    StatusBar $sbar
    pack $sbar -side bottom -fill x
    set f [$sbar getframe]

    # Specify -width 1 for the label widget so it truncates nicely
    # instead of requesting large sizes for long messages
    set w [label $f.status -width 1 -anchor w -textvariable ::STATUS]
    set ::STATUS "This is a status message"
    # give the entry weight, as we want it to be the one that expands
    $sbar add $w -weight 1

    # BWidget's progressbar
    set w [ProgressBar $f.bpbar -orient horizontal \
	       -variable ::PROGRESS -bd 1 -relief sunken]
    set ::PROGRESS 50
    $sbar add $w
    }
}

namespace eval StatusBar {
    Widget::define StatusBar statusbar

    Widget::declare StatusBar {
	{-background  TkResource ""	0 frame}
	{-borderwidth TkResource 0	0 frame}
	{-relief      TkResource flat	0 frame}
	{-showseparator Boolean	 1	0}
	{-showresizesep Boolean	 0	0}
	{-showresize  Boolean	 1	0}
	{-width	      TkResource 100	0 frame}
	{-height      TkResource 18	0 frame}
	{-ipad	      String	 1	0}
	{-pad	      String	 0	0}
	{-bg	      Synonym	 -background}
	{-bd	      Synonym	 -borderwidth}
    }

    # -background, -borderwidth and -relief apply to outer frame, but relief
    # should be left flat for proper look
    Widget::addmap StatusBar "" :cmd {
	-background {} -width {} -height {} -borderwidth {} -relief {}
    }
    Widget::addmap StatusBar "" .sbar {
	-background {}
    }
    Widget::addmap StatusBar "" .resize {
	-background {}
    }
    Widget::addmap StatusBar "" .hsep {
	-background {}
    }

    # -pad provides general padding around the status bar
    # -ipad provides padding around each status bar item
    # Padding can be a list of {padx pady}

    variable HaveMarlett \
	[expr {[lsearch -exact [font families] "Marlett"] != -1}]

    bind StatusResize <1> \
	[namespace code [list begin_resize %W %X %Y]]
    bind StatusResize <B1-Motion> \
	[namespace code [list continue_resize %W %X %Y]]
    bind StatusResize <ButtonRelease-1> \
	[namespace code [list end_resize %W %X %Y]]

    bind StatusBar <Destroy> [list StatusBar::_destroy %W]

    # PNG version has partial alpha transparency for better look
    variable pngdata {
	iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAFM0aXcAAAABGdBTUEAAYagM
	eiWXwAAAGJJREFUGJW9kVEOgCAMQzs8GEezN69fkKlbUAz2r3l5NGTA+pCU+Q
	IA5sv39wGgZKClZGBhJMVTklRr3VNwMz04mVfQzQiEm79EkrYZycxIkq8kkv2
	v6RFGku9TUrj8RGr9AGy6mhv2ymLwAAAAAElFTkSuQmCC
    }
    variable gifdata {
	R0lGODlhDwAPAJEAANnZ2f///4CAgD8/PyH5BAEAAAAALAAAAAAPAA8AAAJEh
	I+py+1IQvh4IZlG0Qg+QshkAokGQfAvZCBIhG8hA0Ea4UPIQJBG+BAyEKQhCH
	bIQAgNEQCAIA0hAyE0AEIGgjSEDBQAOw==
    }
    if {[package provide img::png] != ""} {
	image create photo ::StatusBar::resizer -format PNG -data $pngdata
    } else {
	image create photo ::StatusBar::resizer -format GIF -data $gifdata
    }
}


# ------------------------------------------------------------------------
#  Command StatusBar::create
# ------------------------------------------------------------------------
proc StatusBar::create { path args } {
    variable _widget
    variable HaveMarlett

    # Allow for img::png loaded after initial source
    if {[package provide img::png] != ""} {
	variable pngdata
	::StatusBar::resizer configure -format PNG -data $pngdata
    }

    Widget::init StatusBar $path $args

    eval [list frame $path -class StatusBar] [Widget::subcget $path :cmd]

    foreach {padx pady} [_padval [Widget::cget $path -pad]] \
	{ipadx ipady} [_padval [Widget::cget $path -ipad]] { break }

    if {[Widget::theme]} {
	set sbar   [ttk::frame $path.sbar -padding [list $padx $pady]]
    } else {
	set sbar   [eval [list frame $path.sbar -padx $padx -pady $pady] \
			[Widget::subcget $path .sbar]]
    }
    if {[string equal $::tcl_platform(platform) "windows"]} {
	set cursor size_nw_se
    } else {
	set cursor sizing; # bottom_right_corner ??
    }
    set resize [eval [list label $path.resize] \
		    [Widget::subcget $path .resize] \
		    [list -borderwidth 0 -relief flat -anchor se \
			 -cursor $cursor -anchor se -padx 0 -pady 0]]
    if {$HaveMarlett} {
	$resize configure -font "Marlett -16" -text \u006f
    } else {
	$resize configure -image ::StatusBar::resizer
    }
    bindtags $resize [list all [winfo toplevel $path] StatusResize $resize]

    if {[Widget::theme]} {
	set fsep [ttk::separator $path.hsep -orient horizontal]
    } else {
	set fsep [eval [list frame $path.hsep -bd 1 -height 2 -relief sunken] \
		      [Widget::subcget $path .hsep]]
    }
    set sep  [_sep $path sepresize {}]

    grid $fsep   -row 0 -column 0 -columnspan 3 -sticky ew
    grid $sbar   -row 1 -column 0 -sticky news
    grid $sep    -row 1 -column 1 -sticky ns -padx $ipadx -pady $ipady
    grid $resize -row 1 -column 2 -sticky news
    grid columnconfigure $path 0 -weight 1
    if {![Widget::cget $path -showseparator]} {
	grid remove $fsep
    }
    if {![Widget::cget $path -showresize]} {
	grid remove $sep $resize
    } elseif {![Widget::cget $path -showresizesep]} {
	grid remove $sep
    }
    set _widget($path,items) {}

    return [Widget::create StatusBar $path]
}


# ------------------------------------------------------------------------
#  Command StatusBar::configure
# ------------------------------------------------------------------------
proc StatusBar::configure { path args } {
    variable _widget

    set res [Widget::configure $path $args]

    foreach {chshow chshowrsep chshowsep chipad chpad} \
	[Widget::hasChangedX $path -showresize -showresizesep -showseparator \
	     -ipad -pad] { break }

    if {$chshow} {
	set show [Widget::cget $path -showresize]
	set showrsep [Widget::cget $path -showresizesep]
        if {$show} {
	    if {$showrsep} {
		grid $path.sepresize
	    }
	    grid $path.resize
        } else {
	    grid remove $path.sepresize $path.resize
	}
    }
    if {$chshowsep} {
        if {$show} {
	    grid $path.hsep
        } else {
	    grid remove $path.hsep
	}
    }
    if {$chipad} {
	foreach {ipadx ipady} [_padval [Widget::cget $path -ipad]] { break }
	foreach w [grid slaves $path.sbar] {
	    grid configure $w -padx $ipadx -pady $ipady
	}
    }
    if {$chpad} {
	foreach {padx pady} [_padval [Widget::cget $path -pad]] { break }
	if {[string equal [winfo class $path.sbar] "TFrame"]} {
	    $path.sbar configure -padding [list $padx $pady]
	} else {
	    $path.sbar configure -padx $padx -pady $pady
	}
    }
    return $res
}


# ------------------------------------------------------------------------
#  Command StatusBar::cget
# ------------------------------------------------------------------------
proc StatusBar::cget { path option } {
    return [Widget::cget $path $option]
}

# ------------------------------------------------------------------------
#  Command StatusBar::getframe
# ------------------------------------------------------------------------
proc StatusBar::getframe {path} {
    # This is the frame that users should place their statusbar widgets in
    return $path.sbar
}

# ------------------------------------------------------------------------
#  Command StatusBar::add
# ------------------------------------------------------------------------
proc StatusBar::add {path w args} {
    variable _widget

    array set opts [list \
			-weight    0 \
			-separator 1 \
			-sticky    news \
			-pad       [Widget::cget $path -ipad] \
			]
    foreach {key val} $args {
	if {[info exists opts($key)]} {
	    set opts($key) $val
	} else {
	    set msg "unknown option \"$key\", must be one of: "
	    append msg [join [lsort [array names opts]] {, }]
	    return -code error $msg
	}
    }
    foreach {ipadx ipady} [_padval $opts(-pad)] { break }

    set sbar $path.sbar
    foreach {cols rows} [grid size $sbar] break
    # Add separator if requested, and we aren't the first element
    if {$opts(-separator) && $cols != 0} {
	set sep [_sep $path sep[winfo name $w]]
	# only append name, to distinguish us from them
	lappend _widget($path,items) [winfo name $sep]
	grid $sep -in $sbar -row 0 -column $cols \
	    -sticky ns -padx $ipadx -pady $ipady
	incr cols
    }

    lappend _widget($path,items) $w
    grid $w -in $sbar -row 0 -column $cols -sticky $opts(-sticky) \
	-padx $ipadx -pady $ipady
    grid columnconfigure $sbar $cols -weight $opts(-weight)

    return $w
}

# ------------------------------------------------------------------------
#  Command StatusBar::delete
# ------------------------------------------------------------------------
proc StatusBar::remove {path args} {
    variable _widget

    set destroy [string equal [lindex $args 0] "-destroy"]
    if {$destroy} {
	set args [lrange $args 1 end]
    }
    foreach w $args {
	set idx [lsearch -exact $_widget($path,items) $w]
	if {$idx == -1 || ![winfo exists $w]} {
	    # ignore unknown or non-widget items (like our separators)
	    continue
	}
	# separator is always previous item
	set sidx [expr {$idx - 1}]
	set sep  [lindex $_widget($path,items) $sidx]
	if {[string match .* $sep]} {
	    # not one of our separators
	    incr sidx
	} elseif {$sep != ""} {
	    # destroy separator too
	    set sep $path.sbar.$sep
	    destroy $sep
	}
	if {$destroy} {
	    destroy $w
	} else {
	    grid forget $w
	}
	if {$idx == 0} {
	    # separator of next item is no longer necessary
	    set sep [lindex $_widget($path,items) [expr {$idx + 1}]]
	    if {$sep != "" && ![string match .* $sep]} {
		incr idx
		set sep $path.sbar.$sep
		destroy $sep
	    }
	}
	set _widget($path,items) [lreplace $_widget($path,items) $sidx $idx]
    }
}

# ------------------------------------------------------------------------
#  Command StatusBar::delete
# ------------------------------------------------------------------------
proc StatusBar::delete {path args} {
    return [StatusBar::remove $path -destroy $args]
}

# ------------------------------------------------------------------------
#  Command StatusBar::items
# ------------------------------------------------------------------------
proc StatusBar::items {path} {
    variable _widget
    return $_widget($path,items)
}

proc StatusBar::_sep {path name {sub .sbar}} {
    if {[Widget::theme]} {
	return [ttk::separator $path$sub.$name -orient vertical]
    } else {
	return [frame $path$sub.$name -bd 1 -width 2 -relief sunken]
    }
}

proc StatusBar::_padval {padval} {
    set len [llength $padval]
    foreach {a b} $padval { break }
    if {$len == 0 || $len > 2} {
	return -code error \
	    "invalid pad value \"$padval\", must be 1 or 2 pixel values"
    } elseif {$len == 1} {
	return [list $a $a]
    } elseif {$len == 2} {
	return $padval
    }
}

# ------------------------------------------------------------------------
#  Command StatusBar::_destroy
# ------------------------------------------------------------------------
proc StatusBar::_destroy { path } {
    variable _widget
    variable resize
    array unset widget $path,*
    array unset resize $path.resize,*
    Widget::destroy $path
}

# The following proc handles the mouse click on the resize control. It stores
# the original size of the window and the initial coords of the mouse relative
# to the root.

proc StatusBar::begin_resize {w rootx rooty} {
    variable resize
    set t    [winfo toplevel $w]
    set relx [expr {$rootx - [winfo rootx $t]}]
    set rely [expr {$rooty - [winfo rooty $t]}]
    set resize($w,x) $relx
    set resize($w,y) $rely
    set resize($w,w) [winfo width $t]
    set resize($w,h) [winfo height $t]
    set resize($w,winc) 1
    set resize($w,hinc) 1
    set resize($w,grid) [wm grid $t]
}

# The following proc handles mouse motion on the resize control by asking the
# wm to adjust the size of the window.

proc StatusBar::continue_resize {w rootx rooty} {
    variable resize
    if {[llength $resize($w,grid)]} {
	# at this time, we don't know how to handle gridded resizing
	return
    }
    set t      [winfo toplevel $w]
    set relx   [expr {$rootx - [winfo rootx $t]}]
    set rely   [expr {$rooty - [winfo rooty $t]}]
    set width  [expr {$relx - $resize($w,x) + $resize($w,w)}]
    set height [expr {$rely - $resize($w,y) + $resize($w,h)}]
    if {$width  < 0} { set width 0 }
    if {$height < 0} { set height 0 }
    wm geometry $t ${width}x${height}
}

# The following proc cleans up when the user releases the mouse button.

proc StatusBar::end_resize {w rootx rooty} {
    variable resize
    #continue_resize $w $rootx $rooty
    #wm grid $t $resize($w,grid)
    array unset resize $w,*
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<












































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/tests/entry.test.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
if { [lsearch [package names] tcltest] == -1 } {
	package require tcltest
	namespace import tcltest::*
}
lappend auto_path /home/ericm/bwidget
package require BWidget

option add *Entry.borderWidth 2
option add *Entry.highlightThickness 2
option add *Entry.font {Helvetica -12}
option add *Entry.relief sunken

Entry .e
pack .e
update
set i 0
foreach test {
    {-background #ff0000 #ff0000 non-existent \
	    {unknown color name "non-existent"}}
    {-bd 4 4 bad Value {bad screen distance "badValue"}}
    {-bg #ff0000 #ff0000 non-existent {unknown color name "non-existent"}}
    {-borderwidth 1.3 1 badValue {bad screen distance "badValue"}}
    {-command foo foo {} {}}
    {-disabledforeground blue blue non-existent \
	    {unknown color name "non-existent"}}
    {-editable false 0 shazbot {expected boolean value but got "shazbot"}}
    {-exportselection yes 1 xyzzy {expected boolean value but got "xyzzy"}}
    {-fg #110022 #110022 bogus {unknown color name "bogus"}}
    {-font {Helvetica 12 italic} {Helvetica 12 italic} {} \
	    {font "" doesn't exist}}
    {-foreground #110022 #110022 bogus {unknown color name "bogus"}}
    {-highlightbackground #123456 #123456 ugly {unknown color name "ugly"}}
    {-highlightcolor #123456 #123456 bogus {unknown color name "bogus"}}
    {-highlightthickness 6 6 bogus {bad screen distance "bogus"}}
    {-highlightthickness -2 0 {} {}}
    {-insertbackground #110022 #110022 bogus {unknown color name "bogus"}}
    {-insertborderwidth 1.3 1 2.6x {bad screen distance "2.6x"}}
    {-insertofftime 100 100 3.2 {expected integer but got "3.2"}}
    {-insertontime 100 100 3.2 {expected integer but got "3.2"}}
    {-justify right right bogus \
	    {bad justification "bogus": must be left, right, or center}}
    {-relief groove groove 1.5 \
	    {bad relief "1.5": must be flat, groove, raised, ridge,\
	    solid, or sunken}}
    {-selectbackground #110022 #110022 bogus {unknown color name "bogus"}}
    {-selectborderwidth 1.3 1 badValue {bad screen distance "badValue"}}
    {-selectforeground #654321 #654321 bogus {unknown color name "bogus"}}
    {-show * * {} {}}
    {-state normal normal bogus \
	    {bad state "bogus": must be disabled or normal}}
    {-takefocus "any string" "any string" {} {}}
    {-text foobar foobar {} {}}
    {-textvariable i i {} {}}
    {-width 402 402 3p {expected integer but got "3p"}}
    {-xscrollcommand {Some command} {Some command} {} {}}
} {
    set name [lindex $test 0]
    test entry-1.$i {configuration options} {
        .e configure $name [lindex $test 1]
        list [lindex [.e configure $name] 4] [.e cget $name]
    } [list [lindex $test 2] [lindex $test 2]]
    incr i
}
destroy .e

test Entry-2.1 {Entry} {
    list [catch {Entry} msg] $msg
} {1 {wrong # args: should be "Entry path ..."}}
test Entry-2.2 {Entry} {
    list [catch {Entry gorp} msg] $msg
} {1 {bad window path name "gorp"}}
test Entry-2.3 {Entry procedure} {
    Entry .e
    set res [list [winfo exists .e] [winfo class .e] [info commands .e]]
    destroy .e
    set res
} {1 Entry .e}
test Entry-2.4 {Entr procedure} {
    list [catch {Entry .e -gorp foo} msg] $msg [winfo exists .e] \
            [info commands .e]
} {1 {unknown option "-gorp"} 0 {}}
    
test Entry-3.1 {disabled state grays widget} {
    Entry .e -disabledforeground blue -foreground red -state normal
    set res [list [.e cget -foreground] [.e cget -disabledforeground] \
	    [.e:cmd cget -foreground]]
    .e configure -state disabled
    lappend res [.e:cmd cget -foreground]
    .e configure -state normal
    lappend res [.e:cmd cget -foreground]
    destroy .e
    set res
} {red blue red blue red}
test Entry-3.2 {changing disabledforeground of an enabled entry} {
    Entry .e -disabledforeground blue -foreground red -state normal
    set res [list [.e cget -foreground] [.e cget -disabledforeground] \
	    [.e:cmd cget -foreground]]
    .e configure -disabledforeground green
    lappend res [.e:cmd cget -foreground]
    destroy .e
    set res
} {red blue red red}
test Entry-3.3 {changing normal foreground of a disabled entry} {
    Entry .e -disabledforeground blue -foreground red -state disabled
    set res [list [.e cget -foreground] [.e cget -disabledforeground] \
	    [.e:cmd cget -foreground]]
    .e configure -foreground green
    lappend res [.e:cmd cget -foreground]
    destroy .e
    set res
} {red blue blue blue}
test Entry-3.4 {changing disabled foreground of a disabled entry} {
    Entry .e -disabledforeground blue -foreground red -state disabled
    set res [list [.e cget -foreground] [.e cget -disabledforeground] \
	    [.e:cmd cget -foreground]]
    .e configure -disabledforeground green
    lappend res [.e:cmd cget -foreground]
    destroy .e
    set res
} {red blue blue green}

test Entry-4.1 {editable flag enables/disables editing} {
    Entry .e -editable true
    set res [expr {[lsearch [bindtags .e] BwDisabledEntry] == -1}]
    .e configure -editable false
    lappend res [expr {[lsearch [bindtags .e] BwDisabledEntry] != -1}]
    destroy .e
    set res
} {1 1}
test Entry-4.2 {editable flag does not impact foreground color} {
    Entry .e -editable 1 -foreground red -disabledforeground blue -state normal
    set res [list [.e:cmd cget -foreground]]
    .e configure -editable false
    lappend res [.e:cmd cget -foreground]
    destroy .e
    set res
} {red red}
test Entry-4.3 {editable flag changes cursor} {
    Entry .e -editable 1
    set res [list [.e:cmd cget -cursor]]
    .e configure -editable 0
    lappend res [.e:cmd cget -cursor]
    destroy .e
    set res
} [list xterm left_ptr]

test Entry-5.1 {-text flag gets entry text} {
    Entry .e
    .e delete 0 end
    .e insert end foobar
    set res [.e cget -text]
    destroy .e
    set res
} foobar
test Entry-5.2 {-text flag sets entry text} {
    Entry .e
    .e delete 0 end
    .e configure -text barbaz
    set res [.e get]
    destroy .e
    set res
} barbaz

test Entry-6.1 {-command works} {
    set ::foo 0
    Entry .e -command {incr ::foo}
    Entry::invoke .e
    destroy .e
    set ::foo
} 1

tcltest::cleanupTests
exit
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


























































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/titleframe.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# ------------------------------------------------------------------------------
#  titleframe.tcl
#  This file is part of Unifix BWidget Toolkit
# ------------------------------------------------------------------------------
#  Index of commands:
#     - TitleFrame::create
#     - TitleFrame::configure
#     - TitleFrame::cget
#     - TitleFrame::getframe
#     - TitleFrame::_place
# ------------------------------------------------------------------------------

namespace eval TitleFrame {
    Widget::define TitleFrame titleframe

    Widget::declare TitleFrame {
        {-relief      TkResource groove 0 frame}
        {-borderwidth TkResource 2      0 frame}
        {-font        TkResource ""     0 label}
        {-foreground  TkResource ""     0 label}
        {-state       TkResource ""     0 label}
        {-background  TkResource ""     0 frame}
        {-text        String     ""     0}
        {-ipad        Int        4      0 "%d >=0"}
        {-side        Enum       left   0 {left center right}}
        {-baseline    Enum       center 0 {top center bottom}}
        {-fg          Synonym    -foreground}
        {-bg          Synonym    -background}
        {-bd          Synonym    -borderwidth}
    }

    Widget::addmap TitleFrame "" :cmd {-background {}}
    Widget::addmap TitleFrame "" .l   {
    	-background {} -foreground {} -text {} -font {}
    }
    Widget::addmap TitleFrame "" .l   {-state {}}
    Widget::addmap TitleFrame "" .p   {-background {}}
    Widget::addmap TitleFrame "" .b   {
    	-background {} -relief {} -borderwidth {}
    }
    Widget::addmap TitleFrame "" .b.p {-background {}}
    Widget::addmap TitleFrame "" .f   {-background {}}
}


# ------------------------------------------------------------------------------
#  Command TitleFrame::create
# ------------------------------------------------------------------------------
proc TitleFrame::create { path args } {
    Widget::init TitleFrame $path $args

    set frame  [eval [list frame $path] [Widget::subcget $path :cmd] \
	    -class TitleFrame -relief flat -bd 0 -highlightthickness 0]

    set padtop [eval [list frame $path.p] [Widget::subcget $path :cmd] \
	    -relief flat -borderwidth 0]
    set border [eval [list frame $path.b] [Widget::subcget $path .b] -highlightthickness 0]
    set label  [eval [list label $path.l] [Widget::subcget $path .l] \
                    -highlightthickness 0 \
                    -relief flat \
                    -bd     0 -padx 2 -pady 0]
    set padbot [eval [list frame $border.p] [Widget::subcget $path .p] \
	    -relief flat -bd 0 -highlightthickness 0]
    set frame  [eval [list frame $path.f] [Widget::subcget $path .f] \
	    -relief flat -bd 0 -highlightthickness 0]
    set height [winfo reqheight $label]

    switch [Widget::getoption $path -side] {
        left   { set relx 0.0; set x 5;  set anchor nw }
        center { set relx 0.5; set x 0;  set anchor n  }
        right  { set relx 1.0; set x -5; set anchor ne }
    }
    set bd [Widget::getoption $path -borderwidth]
    switch [Widget::getoption $path -baseline] {
        top    {
	    set y    0
	    set htop $height
	    set hbot 1
	}
        center {
	    set y    0
	    set htop [expr {$height/2}]
	    set hbot [expr {$height/2+$height%2+1}]
	}
        bottom {
	    set y    [expr {$bd+1}]
	    set htop 1
	    set hbot $height
	}
    }
    $padtop configure -height $htop
    $padbot configure -height $hbot

    set pad [Widget::getoption $path -ipad]
    pack $padbot -side top -fill x
    pack $frame  -in $border -fill both -expand yes -padx $pad -pady $pad

    pack $padtop -side top -fill x
    pack $border -fill both -expand yes

    place $label -relx $relx -x $x -anchor $anchor -y $y

    bind $label <Configure> [list TitleFrame::_place $path]
    bind $path  <Destroy>   [list Widget::destroy %W]

    return [Widget::create TitleFrame $path]
}


# ------------------------------------------------------------------------------
#  Command TitleFrame::configure
# ------------------------------------------------------------------------------
proc TitleFrame::configure { path args } {
    set res [Widget::configure $path $args]

    if { [Widget::hasChanged $path -ipad pad] } {
        pack configure $path.f -padx $pad -pady $pad
    }
    if { [Widget::hasChanged $path -borderwidth val] |
         [Widget::hasChanged $path -font        val] |
         [Widget::hasChanged $path -side        val] |
         [Widget::hasChanged $path -baseline    val] } {
        _place $path
    }

    return $res
}


# ------------------------------------------------------------------------------
#  Command TitleFrame::cget
# ------------------------------------------------------------------------------
proc TitleFrame::cget { path option } {
    return [Widget::cget $path $option]
}


# ------------------------------------------------------------------------------
#  Command TitleFrame::getframe
# ------------------------------------------------------------------------------
proc TitleFrame::getframe { path } {
    return $path.f
}


# ------------------------------------------------------------------------------
#  Command TitleFrame::_place
# ------------------------------------------------------------------------------
proc TitleFrame::_place { path } {
    set height [winfo height $path.l]
    switch [Widget::getoption $path -side] {
        left    { set relx 0.0; set x 10;  set anchor nw }
        center  { set relx 0.5; set x 0;   set anchor n  }
        right   { set relx 1.0; set x -10; set anchor ne }
    }
    set bd [Widget::getoption $path -borderwidth]
    switch [Widget::getoption $path -baseline] {
        top    { set htop $height; set hbot 1; set y 0 }
        center { set htop [expr {$height/2}]; set hbot [expr {$height/2+$height%2+1}]; set y 0 }
        bottom { set htop 1; set hbot $height; set y [expr {$bd+1}] }
    }
    $path.p   configure -height $htop
    $path.b.p configure -height $hbot

    place $path.l -relx $relx -x $x -anchor $anchor -y $y
}




<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




















































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/tree.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
# ----------------------------------------------------------------------------
#  tree.tcl
#  This file is part of Unifix BWidget Toolkit
#  $Id: tree.tcl,v 1.60.2.4 2011/06/23 08:28:04 oehhar Exp $
# ----------------------------------------------------------------------------
#  Index of commands:
#     - Tree::create
#     - Tree::configure
#     - Tree::cget
#     - Tree::insert
#     - Tree::itemconfigure
#     - Tree::itemcget
#     - Tree::bindArea
#     - Tree::bindText
#     - Tree::bindImage
#     - Tree::delete
#     - Tree::move
#     - Tree::reorder
#     - Tree::selection
#     - Tree::exists
#     - Tree::parent
#     - Tree::index
#     - Tree::nodes
#     - Tree::see
#     - Tree::opentree
#     - Tree::closetree
#     - Tree::edit
#     - Tree::xview
#     - Tree::yview
#     - Tree::_update_edit_size
#     - Tree::_destroy
#     - Tree::_see
#     - Tree::_recexpand
#     - Tree::_subdelete
#     - Tree::_update_scrollregion
#     - Tree::_cross_event
#     - Tree::_draw_node
#     - Tree::_draw_subnodes
#     - Tree::_update_nodes
#     - Tree::_draw_tree
#     - Tree::_redraw_tree
#     - Tree::_redraw_selection
#     - Tree::_redraw_idle
#     - Tree::_drag_cmd
#     - Tree::_drop_cmd
#     - Tree::_over_cmd
#     - Tree::_auto_scroll
#     - Tree::_scroll
# ----------------------------------------------------------------------------

namespace eval Tree {
    Widget::define Tree tree DragSite DropSite DynamicHelp

    namespace eval Node {
        Widget::declare Tree::Node {
            {-text       String     ""      0}
            {-font       TkResource ""      0 listbox}
            {-image      TkResource ""      0 label}
            {-window     String     ""      0}
            {-fill       TkResource black   0 {listbox -foreground}}
            {-data       String     ""      0}
            {-open       Boolean    0       0}
	    {-selectable Boolean    1       0}
            {-drawcross  Enum       auto    0 {auto always never allways}}
	    {-padx       Int        -1      0 "%d >= -1"}
	    {-deltax     Int        -1      0 "%d >= -1"}
	    {-anchor     String     "w"     0 ""}
        }
    }

    DynamicHelp::include Tree::Node balloon

    Widget::tkinclude Tree canvas .c \
	    remove     {
	-insertwidth -insertbackground -insertborderwidth -insertofftime
	-insertontime -selectborderwidth -closeenough -confine -scrollregion
	-xscrollincrement -yscrollincrement -width -height
    } \
	    initialize {
	-relief sunken -borderwidth 2 -takefocus 1
	-highlightthickness 1 -width 200
    }

    Widget::declare Tree {
        {-deltax           Int 10 0 "%d >= 0"}
        {-deltay           Int 15 0 "%d >= 0"}
        {-padx             Int 20 0 "%d >= 0"}
        {-background       TkResource "" 0 listbox}
        {-selectbackground TkResource "" 0 listbox}
        {-selectforeground TkResource "" 0 listbox}
	{-selectcommand    String     "" 0}
        {-width            TkResource "" 0 listbox}
        {-height           TkResource "" 0 listbox}
        {-selectfill       Boolean 0  0}
        {-showlines        Boolean 1  0}
        {-linesfill        TkResource black  0 {listbox -foreground}}
        {-linestipple      TkResource ""     0 {label -bitmap}}
	{-crossfill        TkResource black  0 {listbox -foreground}}
        {-redraw           Boolean 1  0}
        {-opencmd          String  "" 0}
        {-closecmd         String  "" 0}
        {-dropovermode     Flag    "wpn" 0 "wpn"}
        {-bg               Synonym -background}

        {-crossopenimage    String  ""  0}
        {-crosscloseimage   String  ""  0}
        {-crossopenbitmap   String  ""  0}
        {-crossclosebitmap  String  ""  0}
    }

    DragSite::include Tree "TREE_NODE" 1
    DropSite::include Tree {
        TREE_NODE {copy {} move {}}
    }

    Widget::addmap Tree "" .c {-deltay -yscrollincrement}

    # Trees on windows have a white (system window) background
    if { $::tcl_platform(platform) == "windows" } {
	option add *Tree.c.background SystemWindow widgetDefault
	option add *TreeNode.fill SystemWindowText widgetDefault
    }

    bind Tree <FocusIn>   [list after idle {BWidget::refocus %W %W.c}]
    bind Tree <Destroy>   [list Tree::_destroy %W]
    bind Tree <Configure> [list Tree::_update_scrollregion %W]


    bind TreeSentinalStart <Button-1> {
	if { $::Tree::sentinal(%W) } {
	    set ::Tree::sentinal(%W) 0
	    break
	}
    }

    bind TreeSentinalEnd <Button-1> {
	set ::Tree::sentinal(%W) 0
    }

    bind TreeFocus <Button-1> [list focus %W]

    variable _edit
}


# ----------------------------------------------------------------------------
#  Command Tree::create
# ----------------------------------------------------------------------------
proc Tree::create { path args } {
    variable $path
    upvar 0  $path data

    Widget::init Tree $path $args
    set ::Tree::sentinal($path.c) 0

    if {[Widget::cget $path -crossopenbitmap] == ""} {
        set file [file join $::BWIDGET::LIBRARY images "minus.xbm"]
        Widget::configure $path [list -crossopenbitmap @$file]
    }
    if {[Widget::cget $path -crossclosebitmap] == ""} {
        set file [file join $::BWIDGET::LIBRARY images "plus.xbm"]
        Widget::configure $path [list -crossclosebitmap @$file]
    }

    set data(root)         {{}}
    set data(selnodes)     {}
    set data(upd,level)    0
    set data(upd,nodes)    {}
    set data(upd,afterid)  ""
    set data(dnd,scroll)   ""
    set data(dnd,afterid)  ""
    set data(dnd,selnodes) {}
    set data(dnd,node)     ""

    frame $path -class Tree -bd 0 -highlightthickness 0 -relief flat \
	    -takefocus 0
    # For 8.4+ we don't want to inherit the padding
    catch {$path configure -padx 0 -pady 0}
    eval [list canvas $path.c] [Widget::subcget $path .c] -xscrollincrement 8
    bindtags $path.c [list TreeSentinalStart TreeFocus $path.c Canvas \
	    [winfo toplevel $path] all TreeSentinalEnd]
    pack $path.c -expand yes -fill both
    $path.c bind cross <ButtonPress-1> [list Tree::_cross_event $path]

    # Added by ericm@scriptics.com
    # These allow keyboard traversal of the tree
    bind $path.c <KeyPress-Up>    [list Tree::_keynav up $path]
    bind $path.c <KeyPress-Down>  [list Tree::_keynav down $path]
    bind $path.c <KeyPress-Right> [list Tree::_keynav right $path]
    bind $path.c <KeyPress-Left>  [list Tree::_keynav left $path]
    bind $path.c <KeyPress-space> [list +Tree::_keynav space $path]

    # These allow keyboard control of the scrolling
    bind $path.c <Control-KeyPress-Up>    [list $path.c yview scroll -1 units]
    bind $path.c <Control-KeyPress-Down>  [list $path.c yview scroll  1 units]
    bind $path.c <Control-KeyPress-Left>  [list $path.c xview scroll -1 units]
    bind $path.c <Control-KeyPress-Right> [list $path.c xview scroll  1 units]
    # ericm@scriptics.com

    BWidget::bindMouseWheel $path.c

    DragSite::setdrag $path $path.c Tree::_init_drag_cmd \
	    [Widget::cget $path -dragendcmd] 1
    DropSite::setdrop $path $path.c Tree::_over_cmd Tree::_drop_cmd 1

    Widget::create Tree $path

    set w [Widget::cget $path -width]
    set h [Widget::cget $path -height]
    set dy [Widget::cget $path -deltay]
    $path.c configure -width [expr {$w*8}] -height [expr {$h*$dy}]

    # ericm
    # Bind <Button-1> to select the clicked node -- no reason not to, right?

    ## Bind button 1 to select the node via the _mouse_select command.
    ## This command will generate the proper <<TreeSelect>> virtual event
    ## when necessary.
    set selectcmd Tree::_mouse_select
    Tree::bindText  $path <Button-1>         [list $selectcmd $path set]
    Tree::bindImage $path <Button-1>         [list $selectcmd $path set]
    Tree::bindText  $path <Control-Button-1> [list $selectcmd $path toggle]
    Tree::bindImage $path <Control-Button-1> [list $selectcmd $path toggle]

    # Add sentinal bindings for double-clicking on items, to handle the 
    # gnarly Tk bug wherein:
    # ButtonClick
    # ButtonClick
    # On a canvas item translates into button click on the item, button click
    # on the canvas, double-button on the item, single button click on the
    # canvas (which can happen if the double-button on the item causes some
    # other event to be handled in between when the button clicks are examined
    # for the canvas)
    $path.c bind TreeItemSentinal <Double-Button-1> \
	[list set ::Tree::sentinal($path.c) 1]
    # ericm

    return $path
}


# ----------------------------------------------------------------------------
#  Command Tree::configure
# ----------------------------------------------------------------------------
proc Tree::configure { path args } {
    variable $path
    upvar 0  $path data

    set res [Widget::configure $path $args]

    set ch1 [expr {[Widget::hasChanged $path -deltax val] |
                   [Widget::hasChanged $path -deltay dy]  |
                   [Widget::hasChanged $path -padx val]   |
                   [Widget::hasChanged $path -showlines val]}]

    set ch2 [expr {[Widget::hasChanged $path -selectbackground val] |
                   [Widget::hasChanged $path -selectforeground val]}]

    if { [Widget::hasChanged $path -linesfill   fill] |
         [Widget::hasChanged $path -linestipple stipple] } {
        $path.c itemconfigure line  -fill $fill -stipple $stipple
    }

    if { [Widget::hasChanged $path -crossfill fill] } {
        $path.c itemconfigure cross -foreground $fill
    }

    if {[Widget::hasChanged $path -selectfill fill]} {
	# Make sure that the full-width boxes have either all or none
	# of the standard node bindings
	if {$fill} {
	    foreach event [$path.c bind "node"] {
		$path.c bind "box" $event [$path.c bind "node" $event]
	    }
	} else {
	    foreach event [$path.c bind "node"] {
		$path.c bind "box" $event {}
	    }
	}
    }

    if { $ch1 } {
        _redraw_idle $path 3
    } elseif { $ch2 } {
        _redraw_idle $path 1
    }

    if { [Widget::hasChanged $path -height h] } {
        $path.c configure -height [expr {$h*$dy}]
    }
    if { [Widget::hasChanged $path -width w] } {
        $path.c configure -width [expr {$w*8}]
    }

    if { [Widget::hasChanged $path -redraw bool] && $bool } {
        set upd $data(upd,level)
        set data(upd,level) 0
        _redraw_idle $path $upd
    }

    set force [Widget::hasChanged $path -dragendcmd dragend]
    DragSite::setdrag $path $path.c Tree::_init_drag_cmd $dragend $force
    DropSite::setdrop $path $path.c Tree::_over_cmd Tree::_drop_cmd

    return $res
}


# ----------------------------------------------------------------------------
#  Command Tree::cget
# ----------------------------------------------------------------------------
proc Tree::cget { path option } {
    return [Widget::cget $path $option]
}


# ----------------------------------------------------------------------------
#  Command Tree::insert
# ----------------------------------------------------------------------------
proc Tree::insert { path index parent node args } {
    variable $path
    upvar 0  $path data

    set node [_node_name $path $node]
    set node [Widget::nextIndex $path $node]

    if { [info exists data($node)] } {
        return -code error "node \"$node\" already exists"
    }
    set parent [_node_name $path $parent]
    if { ![info exists data($parent)] } {
        return -code error "node \"$parent\" does not exist"
    }

    Widget::init Tree::Node $path.$node $args
    if {[string equal $index "end"]} {
        lappend data($parent) $node
    } else {
        incr index
        set data($parent) [linsert $data($parent) $index $node]
    }
    set data($node) [list $parent]

    if { [string equal $parent "root"] } {
        _redraw_idle $path 3
    } elseif { [visible $path $parent] } {
        # parent is visible...
        if { [Widget::getMegawidgetOption $path.$parent -open] } {
            # ...and opened -> redraw whole
            _redraw_idle $path 3
        } else {
            # ...and closed -> redraw cross
            MergeFlag $path $parent 8
            _redraw_idle $path 2
        }
    }

    return $node
}


# ----------------------------------------------------------------------------
#  Command Tree::itemconfigure
# ----------------------------------------------------------------------------
proc Tree::itemconfigure { path node args } {
    variable $path
    upvar 0  $path data

    set node [_node_name $path $node]
    if { [string equal $node "root"] || ![info exists data($node)] } {
        return -code error "node \"$node\" does not exist"
    }

    set result [Widget::configure $path.$node $args]

    _set_help $path $node

    if { [visible $path $node] } {
        set lopt   {}
        set flag   0
        foreach opt {-window -image -drawcross -font -text -fill} {
            set flag [expr {$flag << 1}]
            if { [Widget::hasChanged $path.$node $opt val] } {
                set flag [expr {$flag | 1}]
            }
        }

        if { [Widget::hasChanged $path.$node -open val] } {
            if {[llength $data($node)] > 1} {
                # node have subnodes - full redraw
                _redraw_idle $path 3
            } else {
                # force a redraw of the plus/minus sign
                set flag [expr {$flag | 8}]
            }
        }

	if {$data(upd,level) < 3 && [Widget::hasChanged $path.$node -padx x]} {
	    _redraw_idle $path 3
	}

	if { $data(upd,level) < 3 && $flag } {
	    MergeFlag $path $node $flag
            _redraw_idle $path 2
        }
    }
    return $result
}

proc Tree::MergeFlag { path node flag } {
    variable $path
    upvar 0  $path data

    # data(upd,nodes) is a key-val list: emulate a dict by an array
    array set n $data(upd,nodes)
    if {![info exists n($node)]} {
	lappend data(upd,nodes) $node $flag
    } else {
	set n($node) [expr {$n($node) | $flag}]
	set data(upd,nodes) [array get n]
    }
    return
}

# ----------------------------------------------------------------------------
#  Command Tree::itemcget
# ----------------------------------------------------------------------------
proc Tree::itemcget { path node option } {
    # Instead of upvar'ing $path as data for this test, just directly refer to
    # it, as that is faster.
    set node [_node_name $path $node]
    if { [string equal $node "root"] || \
	    ![info exists ::Tree::${path}($node)] } {
        return -code error "node \"$node\" does not exist"
    }

    return [Widget::cget $path.$node $option]
}

# ----------------------------------------------------------------------------
# Command Tree::bindArea
# ----------------------------------------------------------------------------
proc Tree::bindArea { path event script } {
    bind $path.c $event $script
}

# ----------------------------------------------------------------------------
#  Command Tree::bindText
# ----------------------------------------------------------------------------
proc Tree::bindText { path event script } {
    if {[string length $script]} {
	append script " \[Tree::_get_node_name [list $path] current 2 1\]"
    }
    $path.c bind "node" $event $script
    if {[Widget::getoption $path -selectfill]} {
	$path.c bind "box" $event $script
    } else {
	$path.c bind "box" $event {}
    }
}


# ----------------------------------------------------------------------------
#  Command Tree::bindImage
# ----------------------------------------------------------------------------
proc Tree::bindImage { path event script } {
    if {[string length $script]} {
	append script " \[Tree::_get_node_name [list $path] current 2 1\]"
    }
    $path.c bind "img" $event $script
    if {[Widget::getoption $path -selectfill]} {
	$path.c bind "box" $event $script
    } else {
	$path.c bind "box" $event {}
    }
}


# ----------------------------------------------------------------------------
#  Command Tree::delete
# ----------------------------------------------------------------------------
proc Tree::delete { path args } {
    variable $path
    upvar 0  $path data

    set sel 0
    foreach lnodes $args {
	foreach node $lnodes {
            set node [_node_name $path $node]
	    if { ![string equal $node "root"] && [info exists data($node)] } {
		set parent [lindex $data($node) 0]
		set idx	   [lsearch -exact $data($parent) $node]
		set data($parent) [lreplace $data($parent) $idx $idx]
		incr sel [_subdelete $path [list $node]]
	    }
	}
    }
    if {$sel} {
	# if selection changed, call the selectcommand
	__call_selectcmd $path
    }

    _redraw_idle $path 3
}


# ----------------------------------------------------------------------------
#  Command Tree::move
# ----------------------------------------------------------------------------
proc Tree::move { path parent node index } {
    variable $path
    upvar 0  $path data

    set node [_node_name $path $node]
    if { [string equal $node "root"] || ![info exists data($node)] } {
        return -code error "node \"$node\" does not exist"
    }
    if { ![info exists data($parent)] } {
        return -code error "node \"$parent\" does not exist"
    }
    set p $parent
    while { ![string equal $p "root"] } {
        if { [string equal $p $node] } {
            return -code error "node \"$parent\" is a descendant of \"$node\""
        }
        set p [parent $path $p]
    }

    set oldp        [lindex $data($node) 0]
    set idx         [lsearch -exact $data($oldp) $node]
    set data($oldp) [lreplace $data($oldp) $idx $idx]
    set data($node) [concat [list $parent] [lrange $data($node) 1 end]]
    if { [string equal $index "end"] } {
        lappend data($parent) $node
    } else {
        incr index
        set data($parent) [linsert $data($parent) $index $node]
    }
    if { ([string equal $oldp "root"] ||
          ([visible $path $oldp] && [Widget::getoption $path.$oldp   -open])) ||
         ([string equal $parent "root"] ||
          ([visible $path $parent] && [Widget::getoption $path.$parent -open])) } {
        _redraw_idle $path 3
    }
}


# ----------------------------------------------------------------------------
#  Command Tree::reorder
# ----------------------------------------------------------------------------
proc Tree::reorder { path node neworder } {
    variable $path
    upvar 0  $path data

    set node [_node_name $path $node]
    if { ![info exists data($node)] } {
        return -code error "node \"$node\" does not exist"
    }
    set children [lrange $data($node) 1 end]
    if { [llength $children] } {
        set children [BWidget::lreorder $children $neworder]
        set data($node) [linsert $children 0 [lindex $data($node) 0]]
        if { [visible $path $node] && [Widget::getoption $path.$node -open] } {
            _redraw_idle $path 3
        }
    }
}


# ----------------------------------------------------------------------------
#  Command Tree::selection
# ----------------------------------------------------------------------------
proc Tree::selection { path cmd args } {
    variable $path
    upvar 0  $path data

    switch -- $cmd {
	toggle {
            foreach node $args {
                set node [_node_name $path $node]
                if {![info exists data($node)]} {
		    return -code error \
			    "$path selection toggle: Cannot toggle unknown node \"$node\"."
		}
	    }
            foreach node $args {
                set node [_node_name $path $node]
		if {[$path selection includes $node]} {
		    $path selection remove $node
		} else {
		    $path selection add $node
		}
            }
	}
        set {
            foreach node $args {
                set node [_node_name $path $node]
                if {![info exists data($node)]} {
		    return -code error \
			    "$path selection set: Cannot select unknown node \"$node\"."
		}
	    }
            set data(selnodes) {}
            foreach node $args {
                set node [_node_name $path $node]
		if { [Widget::getoption $path.$node -selectable] } {
		    if { [lsearch -exact $data(selnodes) $node] == -1 } {
			lappend data(selnodes) $node
		    }
		}
            }
	    __call_selectcmd $path
        }
        add {
            foreach node $args {
                set node [_node_name $path $node]
                if {![info exists data($node)]} {
		    return -code error \
			    "$path selection add: Cannot select unknown node \"$node\"."
		}
	    }
            foreach node $args {
                set node [_node_name $path $node]
		if { [Widget::getoption $path.$node -selectable] } {
		    if { [lsearch -exact $data(selnodes) $node] == -1 } {
			lappend data(selnodes) $node
		    }
		}
            }
	    __call_selectcmd $path
        }
	range {
	    # Here's our algorithm:
	    #    make a list of all nodes, then take the range from node1
	    #    to node2 and select those nodes
	    #
	    # This works because of how this widget handles redraws:
	    #    The tree is always completely redrawn, and always from
	    #    top to bottom. So the list of visible nodes *is* the
	    #    list of nodes, and we can use that to decide which nodes
	    #    to select.

	    if {[llength $args] != 2} {
		return -code error \
			"wrong#args: Expected $path selection range node1 node2"
	    }

	    foreach {node1 node2} $args break

            set node1 [_node_name $path $node1]
            set node2 [_node_name $path $node2]
	    if {![info exists data($node1)]} {
		return -code error \
			"$path selection range: Cannot start range at unknown node \"$node1\"."
	    }
	    if {![info exists data($node2)]} {
		return -code error \
			"$path selection range: Cannot end range at unknown node \"$node2\"."
	    }

	    set nodes {}
	    foreach nodeItem [$path.c find withtag node] {
		set node [Tree::_get_node_name $path $nodeItem 2]
		if { [Widget::getoption $path.$node -selectable] } {
		    lappend nodes $node
		}
	    }
	    # surles: Set the root string to the first element on the list.
	    if {$node1 == "root"} {
		set node1 [lindex $nodes 0]
	    }
	    if {$node2 == "root"} {
		set node2 [lindex $nodes 0]
	    }

	    # Find the first visible ancestor of node1, starting with node1
	    while {[set index1 [lsearch -exact $nodes $node1]] == -1} {
		set node1 [lindex $data($node1) 0]
	    }
	    # Find the first visible ancestor of node2, starting with node2
	    while {[set index2 [lsearch -exact $nodes $node2]] == -1} {
		set node2 [lindex $data($node2) 0]
	    }
	    # If the nodes were given in backwards order, flip the
	    # indices now
	    if { $index2 < $index1 } {
		incr index1 $index2
		set index2 [expr {$index1 - $index2}]
		set index1 [expr {$index1 - $index2}]
	    }
	    set data(selnodes) [lrange $nodes $index1 $index2]
	    __call_selectcmd $path
	}
        remove {
            foreach node $args {
                set node [_node_name $path $node]
                if { [set idx [lsearch -exact $data(selnodes) $node]] != -1 } {
                    set data(selnodes) [lreplace $data(selnodes) $idx $idx]
                }
            }
	    __call_selectcmd $path
        }
        clear {
	    if {[llength $args] != 0} {
		return -code error \
			"wrong#args: Expected $path selection clear"
	    }
            set data(selnodes) {}
	    __call_selectcmd $path
        }
        get {
	    if {[llength $args] != 0} {
		return -code error \
			"wrong#args: Expected $path selection get"
	    }
            set nodes [list]
	    foreach node $data(selnodes) {
		lappend nodes [_node_name_rev $path $node]
	    }
	    return $nodes
        }
        includes {
	    if {[llength $args] != 1} {
		return -code error \
			"wrong#args: Expected $path selection includes node"
	    }
	    set node [lindex $args 0]
            set node [_node_name $path $node]
            return [expr {[lsearch -exact $data(selnodes) $node] != -1}]
        }
        default {
            return
        }
    }
    _redraw_idle $path 1
}


proc Tree::getcanvas { path } {
    return $path.c
}


proc Tree::__call_selectcmd { path } {
    variable $path
    upvar 0  $path data

    set selectcmd [Widget::getoption $path -selectcommand]
    if {[llength $selectcmd]} {
	lappend selectcmd $path
	lappend selectcmd $data(selnodes)
	uplevel \#0 $selectcmd
    }
    return
}

# ----------------------------------------------------------------------------
#  Command Tree::exists
# ----------------------------------------------------------------------------
proc Tree::exists { path node } {
    variable $path
    upvar 0  $path data

    set node [_node_name $path $node]
    return [info exists data($node)]
}


# ----------------------------------------------------------------------------
#  Command Tree::visible
# ----------------------------------------------------------------------------
proc Tree::visible { path node } {
    set node [_node_name $path $node]
    set idn [$path.c find withtag n:$node]
    return [llength $idn]
}


# ----------------------------------------------------------------------------
#  Command Tree::parent
# ----------------------------------------------------------------------------
proc Tree::parent { path node } {
    variable $path
    upvar 0  $path data

    set node [_node_name $path $node]
    if { ![info exists data($node)] } {
        return -code error "node \"$node\" does not exist"
    }
    return [lindex $data($node) 0]
}


# ----------------------------------------------------------------------------
#  Command Tree::index
# ----------------------------------------------------------------------------
proc Tree::index { path node } {
    variable $path
    upvar 0  $path data

    set node [_node_name $path $node]
    if { [string equal $node "root"] || ![info exists data($node)] } {
        return -code error "node \"$node\" does not exist"
    }
    set parent [lindex $data($node) 0]
    return [expr {[lsearch -exact $data($parent) $node] - 1}]
}


# ----------------------------------------------------------------------------
#  Tree::find
#     Returns the node given a position.
#  findInfo     @x,y ?confine?
#               lineNumber
# ----------------------------------------------------------------------------
proc Tree::find {path findInfo {confine ""}} {
    if {[regexp -- {^@([0-9]+),([0-9]+)$} $findInfo match x y]} {
        set x [$path.c canvasx $x]
        set y [$path.c canvasy $y]
    } elseif {[regexp -- {^[0-9]+$} $findInfo lineNumber]} {
        set dy [Widget::getoption $path -deltay]
        set y  [expr {$dy*($lineNumber+0.5)}]
        set confine ""
    } else {
        return -code error "invalid find spec \"$findInfo\""
    }

    set found  0
    set region [$path.c bbox all]
    if {[llength $region]} {
        set xi [lindex $region 0]
        set xs [lindex $region 2]
        foreach id [$path.c find overlapping $xi $y $xs $y] {
            set ltags [$path.c gettags $id]
            set item  [lindex $ltags 1]
            if { [string equal $item "node"] ||
                 [string equal $item "img"]  ||
                 [string equal $item "win"] } {
                # item is the label or image/window of the node
                set node  [Tree::_get_node_name $path $id 2]
                set found 1
                break
            }
        }
    }

    if {$found} {
        if {![string equal $confine ""]} {
            # test if x stand inside node bbox
	    set padx [_get_node_padx $path $node]
            set xi [expr {[lindex [$path.c coords n:$node] 0] - $padx}]
            set xs [lindex [$path.c bbox n:$node] 2]
            if {$x >= $xi && $x <= $xs} {
                return [_node_name_rev $path $node]
            }
        } else {
            return [_node_name_rev $path $node]
        }
    }
    return ""
}


# ----------------------------------------------------------------------------
#  Command Tree::line
#     Returns the line where a node was drawn.
# ----------------------------------------------------------------------------
proc Tree::line {path node} {
    set node [_node_name $path $node]
    set item [$path.c find withtag n:$node]
    if {[string length $item]} {
        set dy   [Widget::getoption $path -deltay]
        set y    [lindex [$path.c coords $item] 1]
        set line [expr {int($y/$dy)}]
    } else {
        set line -1
    }
    return $line
}


# ----------------------------------------------------------------------------
#  Command Tree::nodes
# ----------------------------------------------------------------------------
proc Tree::nodes { path node {first ""} {last ""} } {
    variable $path
    upvar 0  $path data

    set node [_node_name $path $node]
    if { ![info exists data($node)] } {
        return -code error "node \"$node\" does not exist"
    }

    if { ![string length $first] } {
        return [lrange $data($node) 1 end]
    }

    if { ![string length $last] } {
        return [lindex [lrange $data($node) 1 end] $first]
    } else {
        return [lrange [lrange $data($node) 1 end] $first $last]
    }
}


# Tree::visiblenodes --
#
#	Retrieve a list of all the nodes in a tree.
#
# Arguments:
#	path	tree to retrieve nodes for.
#
# Results:
#	nodes	list of nodes in the tree.

proc Tree::visiblenodes { path } {
    variable $path
    upvar 0  $path data

    # Root is always open (?), so all of its children automatically get added
    # to the result, and to the stack.
    set st [lrange $data(root) 1 end]
    set result $st

    while {[llength $st]} {
	set node [lindex $st end]
	set st [lreplace $st end end]
	# Danger, danger!  Using getMegawidgetOption is fragile, but much
	# much faster than going through cget.
	if { [Widget::getMegawidgetOption $path.$node -open] } {
	    set nodes [lrange $data($node) 1 end]
	    set result [concat $result $nodes]
	    set st [concat $st $nodes]
	}
    }
    return $result
}

# ----------------------------------------------------------------------------
#  Command Tree::see
# ----------------------------------------------------------------------------
proc Tree::see { path node } {
    variable $path
    upvar 0  $path data

    set node [_node_name $path $node]
    if { [Widget::getoption $path -redraw] && $data(upd,afterid) != "" } {
        after cancel $data(upd,afterid)
        _redraw_tree $path
    }
    set idn [$path.c find withtag n:$node]
    if { $idn != "" } {
        Tree::_see $path $idn
    }
}


# ----------------------------------------------------------------------------
#  Command Tree::opentree
# ----------------------------------------------------------------------------
# JDC: added option recursive
proc Tree::opentree { path node {recursive 1} } {
    variable $path
    upvar 0  $path data

    set node [_node_name $path $node]
    if { [string equal $node "root"] || ![info exists data($node)] } {
        return -code error "node \"$node\" does not exist"
    }

    _recexpand $path $node 1 $recursive [Widget::getoption $path -opencmd]
    _redraw_idle $path 3
}


# ----------------------------------------------------------------------------
#  Command Tree::closetree
# ----------------------------------------------------------------------------
proc Tree::closetree { path node {recursive 1} } {
    variable $path
    upvar 0  $path data

    set node [_node_name $path $node]
    if { [string equal $node "root"] || ![info exists data($node)] } {
        return -code error "node \"$node\" does not exist"
    }

    _recexpand $path $node 0 $recursive [Widget::getoption $path -closecmd]
    _redraw_idle $path 3
}


proc Tree::toggle { path node } {
    if {[$path itemcget $node -open]} {
        $path closetree $node 0
    } else {
        $path opentree $node 0
    }
}


# ----------------------------------------------------------------------------
#  Command Tree::edit
# ----------------------------------------------------------------------------
proc Tree::edit { path node text {verifycmd ""} {clickres 0} {select 1}} {
    variable _edit
    variable $path
    upvar 0  $path data

    set node [_node_name $path $node]
    if { [Widget::getoption $path -redraw] && $data(upd,afterid) != "" } {
        after cancel $data(upd,afterid)
        _redraw_tree $path
    }
    set idn [$path.c find withtag n:$node]
    if { $idn != "" } {
        Tree::_see $path $idn

        set oldfg  [$path.c itemcget $idn -fill]
        set sbg    [Widget::getoption $path -selectbackground]
        set coords [$path.c coords $idn]
        set x      [lindex $coords 0]
        set y      [lindex $coords 1]
        set bd     [expr {[$path.c cget -borderwidth]+[$path.c cget -highlightthickness]}]
        set w      [expr {[winfo width $path] - 2*$bd}]
        set wmax   [expr {[$path.c canvasx $w]-$x}]

        set _edit(text) $text
        set _edit(wait) 0

        $path.c itemconfigure $idn    -fill [Widget::getoption $path -background]
        $path.c itemconfigure s:$node -fill {} -outline {}

        set frame  [frame $path.edit \
                        -relief flat -borderwidth 0 -highlightthickness 0 \
                        -background [Widget::getoption $path -background]]
        set ent    [entry $frame.edit \
                        -width              0     \
                        -relief             solid \
                        -borderwidth        1     \
                        -highlightthickness 0     \
                        -foreground         [Widget::getoption $path.$node -fill] \
                        -background         [Widget::getoption $path -background] \
                        -selectforeground   [Widget::getoption $path -selectforeground] \
                        -selectbackground   $sbg  \
                        -font               [Widget::getoption $path.$node -font] \
                        -textvariable       Tree::_edit(text)]
        pack $ent -ipadx 8 -anchor w

        set idw [$path.c create window $x $y -window $frame -anchor w]
        trace variable Tree::_edit(text) w \
	    [list Tree::_update_edit_size $path $ent $idw $wmax]
        tkwait visibility $ent
        grab  $frame
        BWidget::focus set $ent

        _update_edit_size $path $ent $idw $wmax
        update
        if { $select } {
            $ent selection range 0 end
            $ent icursor end
            $ent xview end
        }

        bindtags $ent [list $ent Entry]
        bind $ent <Escape> {set Tree::_edit(wait) 0}
        bind $ent <Return> {set Tree::_edit(wait) 1}
        if { $clickres == 0 || $clickres == 1 } {
            bind $frame <Button>  [list set Tree::_edit(wait) $clickres]
        }

        set ok 0
        while { !$ok } {
            tkwait variable Tree::_edit(wait)
            if { !$_edit(wait) || [llength $verifycmd]==0 ||
                 [uplevel \#0 $verifycmd [list $_edit(text)]] } {
                set ok 1
            }
        }

        trace vdelete Tree::_edit(text) w \
	    [list Tree::_update_edit_size $path $ent $idw $wmax]
        grab release $frame
        BWidget::focus release $ent
        destroy $frame
        $path.c delete $idw
        $path.c itemconfigure $idn    -fill $oldfg
        $path.c itemconfigure s:$node -fill $sbg -outline $sbg

        if { $_edit(wait) } {
            return $_edit(text)
        }
    }
    return ""
}


# ----------------------------------------------------------------------------
#  Command Tree::xview
# ----------------------------------------------------------------------------
proc Tree::xview { path args } {
    return [eval [linsert $args 0 $path.c xview]]
}


# ----------------------------------------------------------------------------
#  Command Tree::yview
# ----------------------------------------------------------------------------
proc Tree::yview { path args } {
    return [eval [linsert $args 0 $path.c yview]]
}


# ----------------------------------------------------------------------------
#  Command Tree::_update_edit_size
# ----------------------------------------------------------------------------
proc Tree::_update_edit_size { path entry idw wmax args } {
    set entw [winfo reqwidth $entry]
    if { $entw+8 >= $wmax } {
        $path.c itemconfigure $idw -width $wmax
    } else {
        $path.c itemconfigure $idw -width 0
    }
}


# ----------------------------------------------------------------------------
#  Command Tree::_see
# ----------------------------------------------------------------------------
proc Tree::_see { path idn } {
    set bbox [$path.c bbox $idn]
    set scrl [$path.c cget -scrollregion]

    set ymax [lindex $scrl 3]
    set dy   [$path.c cget -yscrollincrement]
    set yv   [$path yview]
    set yv0  [expr {round([lindex $yv 0]*$ymax/$dy)}]
    set yv1  [expr {round([lindex $yv 1]*$ymax/$dy)}]
    set y    [expr {int([lindex [$path.c coords $idn] 1]/$dy)}]
    if { $y < $yv0 } {
        $path.c yview scroll [expr {$y-$yv0}] units
    } elseif { $y >= $yv1 } {
        $path.c yview scroll [expr {$y-$yv1+1}] units
    }

    set xmax [lindex $scrl 2]
    set dx   [$path.c cget -xscrollincrement]
    set xv   [$path xview]
    set x0   [expr {int([lindex $bbox 0]/$dx)}]
    set xv0  [expr {round([lindex $xv 0]*$xmax/$dx)}]
    set xv1  [expr {round([lindex $xv 1]*$xmax/$dx)}]
    if { $x0 >= $xv1 || $x0 < $xv0 } {
	$path.c xview scroll [expr {$x0-$xv0}] units
    }
}


# ----------------------------------------------------------------------------
#  Command Tree::_recexpand
# ----------------------------------------------------------------------------
# JDC : added option recursive
proc Tree::_recexpand { path node expand recursive cmd } {
    variable $path
    upvar 0  $path data

    if { [Widget::getoption $path.$node -open] != $expand } {
        Widget::setoption $path.$node -open $expand
        if {[llength $cmd]} {
            uplevel \#0 $cmd [list $node]
        }
    }

    if { $recursive } {
	foreach subnode [lrange $data($node) 1 end] {
	    _recexpand $path $subnode $expand $recursive $cmd
	}
    }
}


# ----------------------------------------------------------------------------
#  Command Tree::_subdelete
# ----------------------------------------------------------------------------
proc Tree::_subdelete { path lnodes } {
    variable $path
    upvar 0  $path data

    set sel $data(selnodes)
    set selchanged 0

    while { [llength $lnodes] } {
        set lsubnodes [list]
        foreach node $lnodes {
            foreach subnode [lrange $data($node) 1 end] {
                lappend lsubnodes $subnode
            }
            unset data($node)
	    set idx [lsearch -exact $sel $node]
	    if { $idx >= 0 } {
		set sel [lreplace $sel $idx $idx]
		incr selchanged
	    }
            if { [set win [Widget::getoption $path.$node -window]] != "" } {
                destroy $win
            }
            Widget::destroy $path.$node
        }
        set lnodes $lsubnodes
    }

    set data(selnodes) $sel
    # return number of sel items changes
    return $selchanged
}


# ----------------------------------------------------------------------------
#  Command Tree::_update_scrollregion
# ----------------------------------------------------------------------------
proc Tree::_update_scrollregion { path } {
    set bd   [expr {2*([$path.c cget -borderwidth]+[$path.c cget -highlightthickness])}]
    set w    [expr {[winfo width  $path] - $bd}]
    set h    [expr {[winfo height $path] - $bd}]
    set xinc [$path.c cget -xscrollincrement]
    set yinc [$path.c cget -yscrollincrement]
    set bbox [$path.c bbox node]
    if { [llength $bbox] } {
        set xs [lindex $bbox 2]
        set ys [lindex $bbox 3]

        if { $w < $xs } {
            set w [expr {$xs + $w % $xinc}]
        }
        if { $h < $ys } {
            set h [expr {$ys + $h % $yinc}]
        }
    }

    $path.c configure -scrollregion [list 0 0 $w $h]

    if {[Widget::getoption $path -selectfill]} {
        _redraw_selection $path
    }
}


# ----------------------------------------------------------------------------
#  Command Tree::_cross_event
# ----------------------------------------------------------------------------
proc Tree::_cross_event { path } {
    variable $path
    upvar 0  $path data

    set node [Tree::_get_node_name $path current 1]
    if { [Widget::getoption $path.$node -open] } {
        Tree::itemconfigure $path $node -open 0
        if {[llength [set cmd [Widget::getoption $path -closecmd]]]} {
            uplevel \#0 $cmd [list $node]
        }
    } else {
        Tree::itemconfigure $path $node -open 1
        if {[llength [set cmd [Widget::getoption $path -opencmd]]]} {
            uplevel \#0 $cmd [list $node]
        }
    }
}


proc Tree::_draw_cross { path node open x y } {
    set idc [$path.c find withtag c:$node]

    if { $open } {
        set img [Widget::cget $path -crossopenimage]
        set bmp [Widget::cget $path -crossopenbitmap]
    } else {
        set img [Widget::cget $path -crosscloseimage]
        set bmp [Widget::cget $path -crossclosebitmap]
    }

    ## If we already have a cross for this node, we just adjust the image.
    if {$idc != ""} {
        if {$img == ""} {
            $path.c itemconfigure $idc -bitmap $bmp
        } else {
            $path.c itemconfigure $idc -image $img
        }
        return
    }

    ## Create a new image for the cross.  If the user has specified an
    ## image, it overrides a bitmap.
    if {$img == ""} {
        $path.c create bitmap $x $y \
            -bitmap     $bmp \
            -background [$path.c cget -background] \
            -foreground [Widget::getoption $path -crossfill] \
            -tags       [list cross c:$node] -anchor c
    } else {
        $path.c create image $x $y \
            -image      $img \
            -tags       [list cross c:$node] -anchor c
    }
}


# ----------------------------------------------------------------------------
#  Command Tree::_draw_node
# ----------------------------------------------------------------------------
proc Tree::_draw_node { path node x0 y0 deltax deltay padx showlines } {
    variable $path
    upvar 0  $path data

    set x1 [expr {$x0+$deltax+5}]
    set y1 $y0
    if { $showlines } {
        $path.c create line $x0 $y0 $x1 $y0 \
            -fill    [Widget::getoption $path -linesfill]   \
            -stipple [Widget::getoption $path -linestipple] \
            -tags    line
    }
    $path.c create text [expr {$x1+$padx}] $y0 \
        -text   [Widget::getoption $path.$node -text] \
        -fill   [Widget::getoption $path.$node -fill] \
        -font   [Widget::getoption $path.$node -font] \
        -anchor w \
    	-tags   [Tree::_get_node_tags $path $node [list node n:$node]]
    set len [expr {[llength $data($node)] > 1}]
    set dc  [Widget::getoption $path.$node -drawcross]
    set exp [Widget::getoption $path.$node -open]

    if { $len && $exp } {
        set y1 [_draw_subnodes $path [lrange $data($node) 1 end] \
                    [expr {$x0+$deltax}] $y0 $deltax $deltay $padx $showlines]
    }

    if {![string equal $dc "never"]
	&& ($len || [string equal $dc "always"] || [string equal $dc "allways"])} {
        _draw_cross $path $node $exp $x0 $y0
    }

    if { [set win [Widget::getoption $path.$node -window]] != "" } {
	set a [Widget::cget $path.$node -anchor]
        $path.c create window $x1 $y0 -window $win -anchor $a \
		-tags [Tree::_get_node_tags $path $node [list win i:$node]]
    } elseif { [set img [Widget::getoption $path.$node -image]] != "" } {
	set a [Widget::cget $path.$node -anchor]
        $path.c create image $x1 $y0 -image $img -anchor $a \
		-tags   [Tree::_get_node_tags $path $node [list img i:$node]]
    }
    set box [$path.c bbox n:$node i:$node]
    set id [$path.c create rect 0 [lindex $box 1] \
		[winfo screenwidth $path] [lindex $box 3] \
		-tags [Tree::_get_node_tags $path $node [list box b:$node]] \
		-fill {} -outline {}]
    $path.c lower $id

    _set_help $path $node

    return $y1
}


# ----------------------------------------------------------------------------
#  Command Tree::_draw_subnodes
# ----------------------------------------------------------------------------
proc Tree::_draw_subnodes { path nodes x0 y0 deltax deltay padx showlines } {
    set y1 $y0
    foreach node $nodes {
	set padx   [_get_node_padx $path $node]
	set deltax [_get_node_deltax $path $node]
        set yp $y1
        set y1 [_draw_node $path $node $x0 [expr {$y1+$deltay}] $deltax $deltay $padx $showlines]
    }
    # Only draw a line to the invisible root node above the tree widget when
    # there are multiple top nodes.
    set len [llength $nodes]
    if { $showlines && $len && !($y0 < 0 && $len < 2) } {
        set id [$path.c create line $x0 $y0 $x0 [expr {$yp+$deltay}] \
                    -fill    [Widget::getoption $path -linesfill]   \
                    -stipple [Widget::getoption $path -linestipple] \
                    -tags    line]

        $path.c lower $id
    }
    return $y1
}


# ----------------------------------------------------------------------------
#  Command Tree::_update_nodes
# ----------------------------------------------------------------------------
proc Tree::_update_nodes { path } {
    variable $path
    upvar 0  $path data

    foreach {node flag} $data(upd,nodes) {
	set idn [$path.c find withtag "n:$node"]
	if { $idn == "" } {
	    continue
	}
	set padx   [_get_node_padx $path $node]
	set deltax [_get_node_deltax $path $node]
	set c  [$path.c coords $idn]
	set x1 [expr {[lindex $c 0]-$padx}]
	set x0 [expr {$x1-$deltax-5}]
	set y0 [lindex $c 1]
	if { $flag & 48 } {
	    # -window or -image modified
	    set win  [Widget::getoption $path.$node -window]
	    set img  [Widget::getoption $path.$node -image]
	    set anc  [Widget::cget $path.$node -anchor]
	    set idi  [$path.c find withtag i:$node]
	    set type [lindex [$path.c gettags $idi] 1]
	    if { [string length $win] } {
		if { [string equal $type "win"] } {
		    $path.c itemconfigure $idi -window $win
		} else {
		    $path.c delete $idi
		    $path.c create window $x1 $y0 -window $win -anchor $anc \
			-tags [_get_node_tags $path $node [list win i:$node]]
		}
	    } elseif { [string length $img] } {
		if { [string equal $type "img"] } {
		    $path.c itemconfigure $idi -image $img
		} else {
		    $path.c delete $idi
		    $path.c create image $x1 $y0 -image $img -anchor $anc \
			-tags [_get_node_tags $path $node [list img i:$node]]
		}
	    } else {
		$path.c delete $idi
	    }
	}

	if { $flag & 8 } {
	    # -drawcross modified
	    set len [expr {[llength $data($node)] > 1}]
	    set dc  [Widget::getoption $path.$node -drawcross]
	    set exp [Widget::getoption $path.$node -open]

	    if {![string equal $dc "never"]
		&& ($len || [string equal $dc "always"] || [string equal $dc "allways"])} {
		_draw_cross $path $node $exp $x0 $y0
	    } else {
		set idc [$path.c find withtag c:$node]
		$path.c delete $idc
	    }
	}

	if { $flag & 7 } {
	    # -font, -text or -fill modified
	    $path.c itemconfigure $idn \
		-text [Widget::getoption $path.$node -text] \
		-fill [Widget::getoption $path.$node -fill] \
		-font [Widget::getoption $path.$node -font]
	}
    }
}


# ----------------------------------------------------------------------------
#  Command Tree::_draw_tree
# ----------------------------------------------------------------------------
proc Tree::_draw_tree { path } {
    variable $path
    upvar 0  $path data

    $path.c delete all
    set cursor [$path.c cget -cursor]
    $path.c configure -cursor watch
    _draw_subnodes $path [lrange $data(root) 1 end] 8 \
        [expr {-[Widget::getoption $path -deltay]/2}] \
        [Widget::getoption $path -deltax] \
        [Widget::getoption $path -deltay] \
        [Widget::getoption $path -padx]   \
        [Widget::getoption $path -showlines]
    $path.c configure -cursor $cursor
}


# ----------------------------------------------------------------------------
#  Command Tree::_redraw_tree
# ----------------------------------------------------------------------------
proc Tree::_redraw_tree { path } {
    variable $path
    upvar 0  $path data

    if { [Widget::getoption $path -redraw] } {
        if { $data(upd,level) == 2 } {
            _update_nodes $path
        } elseif { $data(upd,level) == 3 } {
            _draw_tree $path
        }
        _redraw_selection $path
        _update_scrollregion $path
        set data(upd,nodes)   {}
        set data(upd,level)   0
        set data(upd,afterid) ""
    }
}


# ----------------------------------------------------------------------------
#  Command Tree::_redraw_selection
# ----------------------------------------------------------------------------
proc Tree::_redraw_selection { path } {
    variable $path
    upvar 0  $path data

    set selbg [Widget::getoption $path -selectbackground]
    set selfg [Widget::getoption $path -selectforeground]
    set fill  [Widget::getoption $path -selectfill]
    if {$fill} {
        set scroll [$path.c cget -scrollregion]
        if {[llength $scroll]} {
            set xmax [expr {[lindex $scroll 2]-1}]
        } else {
            set xmax [winfo width $path]
        }
    }
    foreach id [$path.c find withtag sel] {
        set node [Tree::_get_node_name $path $id 1]
        $path.c itemconfigure "n:$node" -fill [Widget::getoption $path.$node -fill]
    }
    $path.c delete sel
    foreach node $data(selnodes) {
        set bbox [$path.c bbox "n:$node"]
        if { [llength $bbox] } {
            if {$fill} {
		# get the image to (if any), as it may have different height
		set bbox [$path.c bbox "n:$node" "i:$node"]
                set bbox [list 0 [lindex $bbox 1] $xmax [lindex $bbox 3]]
            }
            set id [$path.c create rectangle $bbox -tags [list sel s:$node] \
			-fill $selbg -outline $selbg]
	    if {$selfg != ""} {
		# Don't allow an empty fill - that would be transparent
		$path.c itemconfigure "n:$node" -fill $selfg
	    }
            $path.c lower $id
        }
    }
}


# ----------------------------------------------------------------------------
#  Command Tree::_redraw_idle
# ----------------------------------------------------------------------------
proc Tree::_redraw_idle { path level } {
    variable $path
    upvar 0  $path data

    if { [Widget::getoption $path -redraw] && $data(upd,afterid) == "" } {
        set data(upd,afterid) [after idle [list Tree::_redraw_tree $path]]
    }
    if { $level > $data(upd,level) } {
        set data(upd,level) $level
    }
    return ""
}


# ----------------------------------------------------------------------------
#  Command Tree::_init_drag_cmd
# ----------------------------------------------------------------------------
proc Tree::_init_drag_cmd { path X Y top } {
    set path [winfo parent $path]
    set ltags [$path.c gettags current]
    set item  [lindex $ltags 1]
    if { [string equal $item "node"] ||
         [string equal $item "img"]  ||
         [string equal $item "win"] } {
        set node [Tree::_get_node_name $path current 2]
        if {[llength [set cmd [Widget::getoption $path -draginitcmd]]]} {
            return [uplevel \#0 $cmd [list $path $node $top]]
        }
        if { [set type [Widget::getoption $path -dragtype]] == "" } {
            set type "TREE_NODE"
        }
        if { [set img [Widget::getoption $path.$node -image]] != "" } {
            pack [label $top.l -image $img -padx 0 -pady 0]
        }
        return [list $type {copy move link} $node]
    }
    return {}
}


# ----------------------------------------------------------------------------
#  Command Tree::_drop_cmd
# ----------------------------------------------------------------------------
proc Tree::_drop_cmd { path source X Y op type dnddata } {
    set path [winfo parent $path]
    variable $path
    upvar 0  $path data

    $path.c delete drop
    if { [string length $data(dnd,afterid)] } {
        after cancel $data(dnd,afterid)
        set data(dnd,afterid) ""
    }
    set data(dnd,scroll) ""
    if {[llength [set cmd [Widget::getoption $path -dropcmd]]]} {
	return [uplevel \#0 $cmd \
		    [list $path $source $data(dnd,node) $op $type $dnddata]]
    }
    return 0
}


# ----------------------------------------------------------------------------
#  Command Tree::_over_cmd
# ----------------------------------------------------------------------------
proc Tree::_over_cmd { path source event X Y op type dnddata } {
    set path [winfo parent $path]
    variable $path
    upvar 0  $path data

    if { [string equal $event "leave"] } {
        # we leave the window tree
        $path.c delete drop
        if { [string length $data(dnd,afterid)] } {
            after cancel $data(dnd,afterid)
            set data(dnd,afterid) ""
        }
        set data(dnd,scroll) ""
        return 0
    }

    if { [string equal $event "enter"] } {
        # we enter the window tree - dnd data initialization
        set mode [Widget::getoption $path -dropovermode]
        set data(dnd,mode) 0
        foreach c {w p n} {
            set data(dnd,mode) [expr {($data(dnd,mode) << 1) | ([string first $c $mode] != -1)}]
        }
        set bbox [$path.c bbox all]
        if { [llength $bbox] } {
            set data(dnd,xs) [lindex $bbox 2]
            set data(dnd,empty) 0
        } else {
            set data(dnd,xs) 0
            set data(dnd,empty) 1
        }
        set data(dnd,node) {}
    }

    set x [expr {$X-[winfo rootx $path]}]
    set y [expr {$Y-[winfo rooty $path]}]
    $path.c delete drop
    set data(dnd,node) {}

    # test for auto-scroll unless mode is widget only
    if { $data(dnd,mode) != 4 && [_auto_scroll $path $x $y] != "" } {
        return 2
    }

    if { $data(dnd,mode) & 4 } {
        # dropovermode includes widget
        set target [list widget]
        set vmode  4
    } else {
        set target [list ""]
        set vmode  0
    }
    if { ($data(dnd,mode) & 2) && $data(dnd,empty) } {
        # dropovermode includes position and tree is empty
        lappend target [list root 0]
        set vmode  [expr {$vmode | 2}]
    }

    set xc [$path.c canvasx $x]
    set xs $data(dnd,xs)
    if { $xc <= $xs } {
        set yc   [$path.c canvasy $y]
        set dy   [$path.c cget -yscrollincrement]
        set line [expr {int($yc/$dy)}]
        set xi   0
        set yi   [expr {$line*$dy}]
        set ys   [expr {$yi+$dy}]
        set found 0
        foreach id [$path.c find overlapping $xi $yi $xs $ys] {
            set ltags [$path.c gettags $id]
            set item  [lindex $ltags 1]
            if { [string equal $item "node"] ||
                 [string equal $item "img"]  ||
                 [string equal $item "win"] } {
                # item is the label or image/window of the node
                set node [Tree::_get_node_name $path $id 2]
		set found 1
		break
	    }
	}
	if {$found} {
	    set padx   [_get_node_padx $path $node]
	    set deltax [_get_node_deltax $path $node]
            set xi [expr {[lindex [$path.c coords n:$node] 0] - $padx - 1}]
                if { $data(dnd,mode) & 1 } {
                    # dropovermode includes node
                    lappend target $node
                    set vmode [expr {$vmode | 1}]
                } else {
                    lappend target ""
                }

                if { $data(dnd,mode) & 2 } {
                    # dropovermode includes position
                    if { $yc >= $yi+$dy/2 } {
                        # position is after $node
                        if { [Widget::getoption $path.$node -open] &&
                             [llength $data($node)] > 1 } {
                            # $node is open and have subnodes
                            # drop position is 0 in children of $node
                            set parent $node
                            set index  0
                            set xli    [expr {$xi-5}]
                        } else {
                            # $node is not open and doesn't have subnodes
                            # drop position is after $node in children of parent of $node
                            set parent [lindex $data($node) 0]
                            set index  [lsearch -exact $data($parent) $node]
                            set xli    [expr {$xi - $deltax - 5}]
                        }
                        set yl $ys
                    } else {
                        # position is before $node
                        # drop position is before $node in children of parent of $node
                        set parent [lindex $data($node) 0]
                        set index  [expr {[lsearch -exact $data($parent) $node] - 1}]
                        set xli    [expr {$xi - $deltax - 5}]
                        set yl     $yi
                    }
                    lappend target [list $parent $index]
                    set vmode  [expr {$vmode | 2}]
                } else {
                    lappend target {}
                }

                if { ($vmode & 3) == 3 } {
                    # result have both node and position
                    # we compute what is the preferred method
                    if { $yc-$yi <= 3 || $ys-$yc <= 3 } {
                        lappend target "position"
                    } else {
                        lappend target "node"
                    }
                }
            }
        }

    if {$vmode && [llength [set cmd [Widget::getoption $path -dropovercmd]]]} {
        # user-defined dropover command
        set res     [uplevel \#0 $cmd [list $path $source $target $op $type $dnddata]]
        set code    [lindex $res 0]
        set newmode 0
        if { $code & 1 } {
            # update vmode
            set mode [lindex $res 1]
            if { ($vmode & 1) && [string equal $mode "node"] } {
                set newmode 1
            } elseif { ($vmode & 2) && [string equal $mode "position"] } {
                set newmode 2
            } elseif { ($vmode & 4) && [string equal $mode "widget"] } {
                set newmode 4
            }
        }
        set vmode $newmode
    } else {
        if { ($vmode & 3) == 3 } {
            # result have both item and position
            # we choose the preferred method
            if { [string equal [lindex $target 3] "position"] } {
                set vmode [expr {$vmode & ~1}]
            } else {
                set vmode [expr {$vmode & ~2}]
            }
        }

        if { $data(dnd,mode) == 4 || $data(dnd,mode) == 0 } {
            # dropovermode is widget or empty - recall is not necessary
            set code 1
        } else {
            set code 3
        }
    }

    if {!$data(dnd,empty)} {
	# draw dnd visual following vmode
	if { $vmode & 1 } {
	    set data(dnd,node) [list "node" [lindex $target 1]]
	    $path.c create rectangle $xi $yi $xs $ys -tags drop
	} elseif { $vmode & 2 } {
	    set data(dnd,node) [concat "position" [lindex $target 2]]
	    $path.c create line $xli [expr {$yl-$dy/2}] $xli $yl $xs $yl -tags drop
	} elseif { $vmode & 4 } {
	    set data(dnd,node) [list "widget"]
	} else {
	    set code [expr {$code & 2}]
	}
    }

    if { $code & 1 } {
        DropSite::setcursor based_arrow_down
    } else {
        DropSite::setcursor dot
    }
    return $code
}


# ----------------------------------------------------------------------------
#  Command Tree::_auto_scroll
# ----------------------------------------------------------------------------
proc Tree::_auto_scroll { path x y } {
    variable $path
    upvar 0  $path data

    set xmax   [winfo width  $path]
    set ymax   [winfo height $path]
    set scroll {}
    if { $y <= 6 } {
        if { [lindex [$path.c yview] 0] > 0 } {
            set scroll [list yview -1]
            DropSite::setcursor sb_up_arrow
        }
    } elseif { $y >= $ymax-6 } {
        if { [lindex [$path.c yview] 1] < 1 } {
            set scroll [list yview 1]
            DropSite::setcursor sb_down_arrow
        }
    } elseif { $x <= 6 } {
        if { [lindex [$path.c xview] 0] > 0 } {
            set scroll [list xview -1]
            DropSite::setcursor sb_left_arrow
        }
    } elseif { $x >= $xmax-6 } {
        if { [lindex [$path.c xview] 1] < 1 } {
            set scroll [list xview 1]
            DropSite::setcursor sb_right_arrow
        }
    }

    if { [string length $data(dnd,afterid)] && ![string equal $data(dnd,scroll) $scroll] } {
        after cancel $data(dnd,afterid)
        set data(dnd,afterid) ""
    }

    set data(dnd,scroll) $scroll
    if { [string length $scroll] && ![string length $data(dnd,afterid)] } {
        set data(dnd,afterid) [after 200 [list Tree::_scroll $path $scroll]]
    }
    return $data(dnd,afterid)
}


# ----------------------------------------------------------------------------
#  Command Tree::_scroll
# ----------------------------------------------------------------------------
proc Tree::_scroll { path scroll } {
    variable $path
    upvar 0  $path data
    set cmd [lindex $scroll 0]
    set dir [lindex $scroll 1]
    if { ($dir == -1 && [lindex [$path.c $cmd] 0] > 0) ||
         ($dir == 1  && [lindex [$path.c $cmd] 1] < 1) } {
        $path.c $cmd scroll $dir units
        set data(dnd,afterid) [after 50 [list Tree::_scroll $path $scroll]]
    } else {
        set data(dnd,afterid) ""
        DropSite::setcursor dot
    }
}

# Tree::_keynav --
#
#	Handle navigational keypresses on the tree.
#
# Arguments:
#	which      tag indicating the direction of motion:
#                  up         move to the node graphically above current
#                  down       move to the node graphically below current
#                  left       close current if open, else move to parent
#                  right      open current if closed, else move to child
#                  open       open current if closed, close current if open
#       win        name of the tree widget
#
# Results:
#	None.

proc Tree::_keynav {which win} {
    # check for an empty tree
    if {[$win nodes root] eq ""} {
        return
    }

    # Keyboard navigation is riddled with special cases.  In order to avoid
    # the complex logic, we will instead make a list of all the visible,
    # selectable nodes, then do a simple next or previous operation.

    # One easy way to get all of the visible nodes is to query the canvas
    # object for all the items with the "node" tag; since the tree is always
    # completely redrawn, this list will be in vertical order.
    set nodes {}
    foreach nodeItem [$win.c find withtag node] {
	set node [Tree::_get_node_name $win $nodeItem 2]
	if { [Widget::cget $win.$node -selectable] } {
	    lappend nodes $node
	}
    }

    # Keyboard navigation is all relative to the current node
    # surles: Get the current node for single or multiple selection schemas.
    set node [_get_current_node $win]

    switch -exact -- $which {
	"up" {
	    # Up goes to the node that is vertically above the current node
	    # (NOT necessarily the current node's parent)
	    if { [string equal $node ""] } {
		return
	    }
	    set index [lsearch -exact $nodes $node]
	    incr index -1
	    if { $index >= 0 } {
		$win selection set [lindex $nodes $index]
		_set_current_node $win [lindex $nodes $index]
		$win see [lindex $nodes $index]
		event generate $win <<TreeSelect>>
		return
	    }
	}
	"down" {
	    # Down goes to the node that is vertically below the current node
	    if { [string equal $node ""] } {
		$win selection set [lindex $nodes 0]
		_set_current_node $win [lindex $nodes 0]
		$win see [lindex $nodes 0]
		event generate $win <<TreeSelect>>
		return
	    }

	    set index [lsearch -exact $nodes $node]
	    incr index
	    if { $index < [llength $nodes] } {
		$win selection set [lindex $nodes $index]
		_set_current_node $win [lindex $nodes $index]
		$win see [lindex $nodes $index]
		event generate $win <<TreeSelect>>
		return
	    }
	}
	"right" {
	    # On a right arrow, if the current node is closed, open it.
	    # If the current node is open, go to its first child
	    if { [string equal $node ""] } {
		return
	    }
	    set open [$win itemcget $node -open]
            if { $open } {
                if { [llength [$win nodes $node]] } {
		    set index [lsearch -exact $nodes $node]
		    incr index
		    if { $index < [llength $nodes] } {
			$win selection set [lindex $nodes $index]
			_set_current_node $win [lindex $nodes $index]
			$win see [lindex $nodes $index]
			event generate $win <<TreeSelect>>
			return
		    }
                }
            } else {
                $win itemconfigure $node -open 1
                if {[llength [set cmd [Widget::getoption $win -opencmd]]]} {
                    uplevel \#0 $cmd [list $node]
                }
                return
            }
	}
	"left" {
	    # On a left arrow, if the current node is open, close it.
	    # If the current node is closed, go to its parent.
	    if { [string equal $node ""] } {
		return
	    }
	    set open [$win itemcget $node -open]
	    if { $open } {
		$win itemconfigure $node -open 0
                if {[llength [set cmd [Widget::getoption $win -closecmd]]]} {
                    uplevel \#0 $cmd [list $node]
                }
		return
	    } else {
		set parent [$win parent $node]
	        if { [string equal $parent "root"] } {
		    set parent $node
                } else {
                    while { ![$win itemcget $parent -selectable] } {
		        set parent [$win parent $parent]
		        if { [string equal $parent "root"] } {
			    set parent $node
			    break
		        }
                    }
		}
		$win selection set $parent
		_set_current_node $win $parent
		$win see $parent
		event generate $win <<TreeSelect>>
		return
	    }
	}
	"space" {
	    if { [string equal $node ""] } {
		return
	    }
	    set open [$win itemcget $node -open]
	    if { [llength [$win nodes $node]] } {

		# Toggle the open status of the chosen node.

		$win itemconfigure $node -open [expr {$open?0:1}]

		if {$open} {
		    # Node was open, is now closed. Call the close-cmd

		    if {[llength [set cmd [Widget::getoption $win -closecmd]]]} {
			uplevel \#0 $cmd [list $node]
		    }
		} else {
		    # Node was closed, is now open. Call the open-cmd

		    if {[llength [set cmd [Widget::getoption $win -opencmd]]]} {
			uplevel \#0 $cmd [list $node]
		    }
                }
	    }
	}
    }
    return
}

# Tree::_get_current_node --
#
#	Get the current node for either single or multiple
#	node selection trees.  If the tree allows for 
#	multiple selection, return the cursor node.  Otherwise,
#	if there is a selection, return the first node in the
#	list.  If there is no selection, return the root node.
#
# arguments:
#       win        name of the tree widget
#
# Results:
#	The current node.

proc Tree::_get_current_node {win} {
    if {[info exists selectTree::selectCursor($win)]} {
	set result $selectTree::selectCursor($win)
    } elseif {[llength [set selList [$win selection get]]]} {
	set result [lindex $selList 0]
    } else {
	set result ""
    }
    return $result
}

# Tree::_set_current_node --
#
#	Set the current node for either single or multiple
#	node selection trees.
#
# arguments:
#       win        Name of the tree widget
#	node	   The current node.
#
# Results:
#	None.

proc Tree::_set_current_node {win node} {
    if {[info exists selectTree::selectCursor($win)]} {
	set selectTree::selectCursor($win) $node
    }
    return
}

# Tree::_get_node_name --
#
#	Given a canvas item, get the name of the tree node represented by that
#	item.
#
# Arguments:
#	path		tree to query
#	item		Optional canvas item to examine; if omitted, 
#			defaults to "current"
#	tagindex	Optional tag index, since the n:nodename tag is not
#			in the same spot for all canvas items.  If omitted,
#			defaults to "end-1", so it works with "current" item.
#
# Results:
#	node	name of the tree node.

proc Tree::_get_node_name {path {item current} {tagindex end-1} {truename 0}} {
    set node [string range [lindex [$path.c gettags $item] $tagindex] 2 end]
    if {$truename} {
	return [_node_name_rev $path $node]
    }
    return $node
}

# Tree::_get_node_padx --
#
#	Given a node in the tree, return it's padx value.  If the value is
#	less than 0, default to the padx of the entire tree.
#
# Arguments:
#	path		Tree to query
#	node		Node in the tree
#
# Results:
#	padx		The numeric padx value
proc Tree::_get_node_padx {path node} {
    set padx [Widget::getoption $path.$node -padx]
    if {$padx < 0} { set padx [Widget::getoption $path -padx] }
    return $padx
}

# Tree::_get_node_deltax --
#
#	Given a node in the tree, return it's deltax value.  If the value is
#	less than 0, default to the deltax of the entire tree.
#
# Arguments:
#	path		Tree to query
#	node		Node in the tree
#
# Results:
#	deltax		The numeric deltax value
proc Tree::_get_node_deltax {path node} {
    set deltax [Widget::getoption $path.$node -deltax]
    if {$deltax < 0} { set deltax [Widget::getoption $path -deltax] }
    return $deltax
}


# Tree::_get_node_tags --
#
#	Given a node in the tree, return a list of tags to apply to its
#       canvas item.
#
# Arguments:
#	path		Tree to query
#	node		Node in the tree
#	tags		A list of tags to add to the final list
#
# Results:
#	list		The list of tags to apply to the canvas item
proc Tree::_get_node_tags {path node {tags ""}} {
    eval [linsert $tags 0 lappend list TreeItemSentinal]
    if {[Widget::getoption $path.$node -helptext] == "" &&
        [Widget::getoption $path.$node -helpcmd]  == ""} { return $list }

    switch -- [Widget::getoption $path.$node -helptype] {
	balloon {
	    lappend list BwHelpBalloon
	}
	variable {
	    lappend list BwHelpVariable
	}
    }
    return $list
}

# Tree::_set_help --
#
#	Register dynamic help for a node in the tree.
#
# Arguments:
#	path		Tree to query
#	node		Node in the tree
#       force		Optional argument to force a reset of the help
#
# Results:
#	none
proc Tree::_set_help { path node } {
    Widget::getVariable $path help

    set item $path.$node
    set opts [list -helptype -helptext -helpvar -helpcmd]
    foreach {cty ctx cv cc} [eval [linsert $opts 0 Widget::hasChangedX $item]] break
    set text [Widget::getoption $item -helptext]
    set cmd  [Widget::getoption $item -helpcmd]

    ## If we've never set help for this item before, and text or cmd is not
    ## blank, we need to setup help. We also need to reset help if any of the
    ## options have changed.
    if { (![info exists help($node)] && ($text != "" || $cmd != ""))
         || $cty || $ctx || $cv } {
	set help($node) 1
	set type [Widget::getoption $item -helptype]
        set var [Widget::getoption $item -helpvar]
        DynamicHelp::add $path.c -item n:$node -type $type -text $text -variable $var -command $cmd
        DynamicHelp::add $path.c -item i:$node -type $type -text $text -variable $var -command $cmd
        DynamicHelp::add $path.c -item b:$node -type $type -text $text -variable $var -command $cmd
    }
}

proc Tree::_mouse_select { path cmd args } {
    eval [linsert $args 0 selection $path $cmd]
    switch -- $cmd {
        "add" - "clear" - "remove" - "set" - "toggle" {
            event generate $path <<TreeSelect>>
        }
    }
}

proc Tree::_node_name { path node } {
    # Make sure node names are safe as tags and variable names
    set map [list & \1 | \2 ^ \3 ! \4 :: \5]
    return  [string map $map $node]
}

proc Tree::_node_name_rev { path node } {
    # Allow reverse interpretation of node names
    set map [list \1 & \2 | \3 ^ \4 ! \5 ::]
    return  [string map $map $node]
}


# ----------------------------------------------------------------------------
#  Command Tree::_destroy
# ----------------------------------------------------------------------------
proc Tree::_destroy { path } {
    variable $path
    upvar 0  $path data

    if { $data(upd,afterid) != "" } {
        after cancel $data(upd,afterid)
    }
    if { $data(dnd,afterid) != "" } {
        after cancel $data(dnd,afterid)
    }
    _subdelete $path [lrange $data(root) 1 end]
    Widget::destroy $path
    unset data
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<










































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/utils.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
# ----------------------------------------------------------------------------
#  utils.tcl
#  This file is part of Unifix BWidget Toolkit
#  $Id: utils.tcl,v 1.15.2.1 2009/09/03 17:29:03 oehhar Exp $
# ----------------------------------------------------------------------------
#  Index of commands:
#     - GlobalVar::exists
#     - GlobalVar::setvarvar
#     - GlobalVar::getvarvar
#     - BWidget::assert
#     - BWidget::clonename
#     - BWidget::get3dcolor
#     - BWidget::XLFDfont
#     - BWidget::place
#     - BWidget::grab
#     - BWidget::focus
# ----------------------------------------------------------------------------

namespace eval GlobalVar {
    proc use {} {}
}


namespace eval BWidget {
    variable _top
    variable _gstack {}
    variable _fstack {}
    proc use {} {}
}


# ----------------------------------------------------------------------------
#  Command GlobalVar::exists
# ----------------------------------------------------------------------------
proc GlobalVar::exists { varName } {
    return [uplevel \#0 [list info exists $varName]]
}


# ----------------------------------------------------------------------------
#  Command GlobalVar::setvar
# ----------------------------------------------------------------------------
proc GlobalVar::setvar { varName value } {
    return [uplevel \#0 [list set $varName $value]]
}


# ----------------------------------------------------------------------------
#  Command GlobalVar::getvar
# ----------------------------------------------------------------------------
proc GlobalVar::getvar { varName } {
    return [uplevel \#0 [list set $varName]]
}


# ----------------------------------------------------------------------------
#  Command GlobalVar::tracevar
# ----------------------------------------------------------------------------
proc GlobalVar::tracevar { cmd varName args } {
    return [uplevel \#0 [list trace $cmd $varName] $args]
}



# ----------------------------------------------------------------------------
#  Command BWidget::lreorder
# ----------------------------------------------------------------------------
proc BWidget::lreorder { list neworder } {
    set pos     0
    set newlist {}
    foreach e $neworder {
        if { [lsearch -exact $list $e] != -1 } {
            lappend newlist $e
            set tabelt($e)  1
        }
    }
    set len [llength $newlist]
    if { !$len } {
        return $list
    }
    if { $len == [llength $list] } {
        return $newlist
    }
    set pos 0
    foreach e $list {
        if { ![info exists tabelt($e)] } {
            set newlist [linsert $newlist $pos $e]
        }
        incr pos
    }
    return $newlist
}


# ----------------------------------------------------------------------------
#  Command BWidget::assert
# ----------------------------------------------------------------------------
proc BWidget::assert { exp {msg ""}} {
    set res [uplevel 1 expr $exp]
    if { !$res} {
        if { $msg == "" } {
            return -code error "Assertion failed: {$exp}"
        } else {
            return -code error $msg
        }
    }
}


# ----------------------------------------------------------------------------
#  Command BWidget::clonename
# ----------------------------------------------------------------------------
proc BWidget::clonename { menu } {
    set path     ""
    set menupath ""
    set found    0
    foreach widget [lrange [split $menu "."] 1 end] {
        if { $found || [winfo class "$path.$widget"] == "Menu" } {
            set found 1
            append menupath "#" $widget
            append path "." $menupath
        } else {
            append menupath "#" $widget
            append path "." $widget
        }
    }
    return $path
}


# ----------------------------------------------------------------------------
#  Command BWidget::getname
# ----------------------------------------------------------------------------
proc BWidget::getname { name } {
    if { [string length $name] } {
        set text [option get . "${name}Name" ""]
        if { [string length $text] } {
            return [parsetext $text]
        }
    }
    return {}
 }


# ----------------------------------------------------------------------------
#  Command BWidget::parsetext
# ----------------------------------------------------------------------------
proc BWidget::parsetext { text } {
    set result ""
    set index  -1
    set start  0
    while { [string length $text] } {
        set idx [string first "&" $text]
        if { $idx == -1 } {
            append result $text
            set text ""
        } else {
            set char [string index $text [expr {$idx+1}]]
            if { $char == "&" } {
                append result [string range $text 0 $idx]
                set    text   [string range $text [expr {$idx+2}] end]
                set    start  [expr {$start+$idx+1}]
            } else {
                append result [string range $text 0 [expr {$idx-1}]]
                set    text   [string range $text [expr {$idx+1}] end]
                incr   start  $idx
                set    index  $start
            }
        }
    }
    return [list $result $index]
}


# ----------------------------------------------------------------------------
#  Command BWidget::get3dcolor
# ----------------------------------------------------------------------------
proc BWidget::get3dcolor { path bgcolor } {
    foreach val [winfo rgb $path $bgcolor] {
        lappend dark [expr {60*$val/100}]
        set tmp1 [expr {14*$val/10}]
        if { $tmp1 > 65535 } {
            set tmp1 65535
        }
        set tmp2 [expr {(65535+$val)/2}]
        lappend light [expr {($tmp1 > $tmp2) ? $tmp1:$tmp2}]
    }
    return [list [eval format "#%04x%04x%04x" $dark] [eval format "#%04x%04x%04x" $light]]
}


# ----------------------------------------------------------------------------
#  Command BWidget::XLFDfont
# ----------------------------------------------------------------------------
proc BWidget::XLFDfont { cmd args } {
    switch -- $cmd {
        create {
            set font "-*-*-*-*-*-*-*-*-*-*-*-*-*-*"
        }
        configure {
            set font [lindex $args 0]
            set args [lrange $args 1 end]
        }
        default {
            return -code error "XLFDfont: commande incorrect: $cmd"
        }
    }
    set lfont [split $font "-"]
    if { [llength $lfont] != 15 } {
        return -code error "XLFDfont: description XLFD incorrect: $font"
    }

    foreach {option value} $args {
        switch -- $option {
            -foundry { set index 1 }
            -family  { set index 2 }
            -weight  { set index 3 }
            -slant   { set index 4 }
            -size    { set index 7 }
            default  { return -code error "XLFDfont: option incorrecte: $option" }
        }
        set lfont [lreplace $lfont $index $index $value]
    }
    return [join $lfont "-"]
}



# ----------------------------------------------------------------------------
#  Command BWidget::place
# ----------------------------------------------------------------------------
#
# Notes:
#  For Windows systems with more than one monitor the available screen area may
#  have negative positions. Geometry settings with negative numbers are used
#  under X to place wrt the right or bottom of the screen. On windows, Tk
#  continues to do this. However, a geometry such as 100x100+-200-100 can be
#  used to place a window onto a secondary monitor. Passing the + gets Tk
#  to pass the remainder unchanged so the Windows manager then handles -200
#  which is a position on the left hand monitor.
#  I've tested this for left, right, above and below the primary monitor.
#  Currently there is no way to ask Tk the extent of the Windows desktop in 
#  a multi monitor system. Nor what the legal co-ordinate range might be.
#
proc BWidget::place { path w h args } {
    variable _top

    update idletasks

    # If the window is not mapped, it may have any current size.
    # Then use required size, but bound it to the screen width.
    # This is mostly inexact, because any toolbars will still be removed
    # which may reduce size.
    if { $w == 0 && [winfo ismapped $path] } {
        set w [winfo width $path]
    } else {
        if { $w == 0 } {
            set w [winfo reqwidth $path]
        }
        set vsw [winfo vrootwidth  $path]
        if { $w > $vsw } { set w $vsw }
    }

    if { $h == 0 && [winfo ismapped $path] } {
        set h [winfo height $path]
    } else {
        if { $h == 0 } {
            set h [winfo reqheight $path]
        }
        set vsh [winfo vrootheight $path]
        if { $h > $vsh } { set h $vsh }
    }

    set arglen [llength $args]
    if { $arglen > 3 } {
        return -code error "BWidget::place: bad number of argument"
    }

    if { $arglen > 0 } {
        set where [lindex $args 0]
	set list  [list "at" "center" "left" "right" "above" "below"]
        set idx   [lsearch $list $where]
        if { $idx == -1 } {
	    return -code error [BWidget::badOptionString position $where $list]
        }
        if { $idx == 0 } {
            set err [catch {
                # purposely removed the {} around these expressions - [PT]
                set x [expr int([lindex $args 1])]
                set y [expr int([lindex $args 2])]
            }]
            if { $err } {
                return -code error "BWidget::place: incorrect position"
            }
            if {$::tcl_platform(platform) == "windows"} {
                # handle windows multi-screen. -100 != +-100
                if {[string index [lindex $args 1] 0] != "-"} {
                    set x "+$x"
                }
                if {[string index [lindex $args 2] 0] != "-"} {
                    set y "+$y"
                }
            } else {
                if { $x >= 0 } {
                    set x "+$x"
                }
                if { $y >= 0 } {
                    set y "+$y"
                }
            }
        } else {
            if { $arglen == 2 } {
                set widget [lindex $args 1]
                if { ![winfo exists $widget] } {
                    return -code error "BWidget::place: \"$widget\" does not exist"
                }
	    } else {
		set widget .
	    }
            set sw [winfo screenwidth  $path]
            set sh [winfo screenheight $path]
            if { $idx == 1 } {
                if { $arglen == 2 } {
                    # center to widget
                    set x0 [expr {[winfo rootx $widget] + ([winfo width  $widget] - $w)/2}]
                    set y0 [expr {[winfo rooty $widget] + ([winfo height $widget] - $h)/2}]
                } else {
                    # center to screen
                    set x0 [expr {($sw - $w)/2 - [winfo vrootx $path]}]
                    set y0 [expr {($sh - $h)/2 - [winfo vrooty $path]}]
                }
                set x "+$x0"
                set y "+$y0"
                if {$::tcl_platform(platform) != "windows"} {
                    if { $x0+$w > $sw } {set x "-0"; set x0 [expr {$sw-$w}]}
                    if { $x0 < 0 }      {set x "+0"}
                    if { $y0+$h > $sh } {set y "-0"; set y0 [expr {$sh-$h}]}
                    if { $y0 < 0 }      {set y "+0"}
                }
            } else {
                set x0 [winfo rootx $widget]
                set y0 [winfo rooty $widget]
                set x1 [expr {$x0 + [winfo width  $widget]}]
                set y1 [expr {$y0 + [winfo height $widget]}]
                if { $idx == 2 || $idx == 3 } {
                    set y "+$y0"
                    if {$::tcl_platform(platform) != "windows"} {
                        if { $y0+$h > $sh } {set y "-0"; set y0 [expr {$sh-$h}]}
                        if { $y0 < 0 }      {set y "+0"}
                    }
                    if { $idx == 2 } {
                        # try left, then right if out, then 0 if out
                        if { $x0 >= $w } {
                            set x [expr {$x0-$w}]
                        } elseif { $x1+$w <= $sw } {
                            set x "+$x1"
                        } else {
                            set x "+0"
                        }
                    } else {
                        # try right, then left if out, then 0 if out
                        if { $x1+$w <= $sw } {
                            set x "+$x1"
                        } elseif { $x0 >= $w } {
                            set x [expr {$x0-$w}]
                        } else {
                            set x "-0"
                        }
                    }
                } else {
                    set x "+$x0"
                    if {$::tcl_platform(platform) != "windows"} {
                        if { $x0+$w > $sw } {set x "-0"; set x0 [expr {$sw-$w}]}
                        if { $x0 < 0 }      {set x "+0"}
                    }
                    if { $idx == 4 } {
                        # try top, then bottom, then 0
                        if { $h <= $y0 } {
                            set y [expr {$y0-$h}]
                        } elseif { $y1+$h <= $sh } {
                            set y "+$y1"
                        } else {
                            set y "+0"
                        }
                    } else {
                        # try bottom, then top, then 0
                        if { $y1+$h <= $sh } {
                            set y "+$y1"
                        } elseif { $h <= $y0 } {
                            set y [expr {$y0-$h}]
                        } else {
                            set y "-0"
                        }
                    }
                }
            }
        }

        ## If there's not a + or - in front of the number, we need to add one.
        if {[string is integer [string index $x 0]]} { set x +$x }
        if {[string is integer [string index $y 0]]} { set y +$y }

        wm geometry $path "${w}x${h}${x}${y}"
    } else {
        wm geometry $path "${w}x${h}"
    }
    update idletasks
}


# ----------------------------------------------------------------------------
#  Command BWidget::grab
# ----------------------------------------------------------------------------
proc BWidget::grab { option path } {
    variable _gstack

    if { $option == "release" } {
        catch {::grab release $path}
        while { [llength $_gstack] } {
            set grinfo  [lindex $_gstack end]
            set _gstack [lreplace $_gstack end end]
            foreach {oldg mode} $grinfo {
                if { ![string equal $oldg $path] && [winfo exists $oldg] } {
                    if { $mode == "global" } {
                        catch {::grab -global $oldg}
                    } else {
                        catch {::grab $oldg}
                    }
                    return
                }
            }
        }
    } else {
        set oldg [::grab current]
        if { $oldg != "" } {
            lappend _gstack [list $oldg [::grab status $oldg]]
        }
        if { $option == "global" } {
            ::grab -global $path
        } else {
            ::grab $path
        }
    }
}


# ----------------------------------------------------------------------------
#  Command BWidget::focus
# ----------------------------------------------------------------------------
proc BWidget::focus { option path {refocus 1} } {
    variable _fstack

    if { $option == "release" } {
        while { [llength $_fstack] } {
            set oldf [lindex $_fstack end]
            set _fstack [lreplace $_fstack end end]
            if { ![string equal $oldf $path] && [winfo exists $oldf] } {
                if {$refocus} {catch {::focus -force $oldf}}
                return
            }
        }
    } elseif { $option == "set" } {
        lappend _fstack [::focus]
        ::focus -force $path
    }
}

# BWidget::refocus --
#
#	Helper function used to redirect focus from a container frame in 
#	a megawidget to a component widget.  Only redirects focus if
#	focus is already on the container.
#
# Arguments:
#	container	container widget to redirect from.
#	component	component widget to redirect to.
#
# Results:
#	None.

proc BWidget::refocus {container component} {
    if { [string equal $container [::focus]] } {
	::focus $component
    }
    return
}

## These mirror tk::(Set|Restore)FocusGrab

# BWidget::SetFocusGrab --
#   swap out current focus and grab temporarily (for dialogs)
# Arguments:
#   grab	new window to grab
#   focus	window to give focus to
# Results:
#   Returns nothing
#
proc BWidget::SetFocusGrab {grab {focus {}}} {
    variable _focusGrab
    set index "$grab,$focus"

    lappend _focusGrab($index) [::focus]
    set oldGrab [::grab current $grab]
    lappend _focusGrab($index) $oldGrab
    if {[winfo exists $oldGrab]} {
	lappend _focusGrab($index) [::grab status $oldGrab]
    }
    # The "grab" command will fail if another application
    # already holds the grab.  So catch it.
    catch {::grab $grab}
    if {[winfo exists $focus]} {
	::focus $focus
    }
}

# BWidget::RestoreFocusGrab --
#   restore old focus and grab (for dialogs)
# Arguments:
#   grab	window that had taken grab
#   focus	window that had taken focus
#   destroy	destroy|withdraw - how to handle the old grabbed window
# Results:
#   Returns nothing
#
proc BWidget::RestoreFocusGrab {grab focus {destroy destroy}} {
    variable _focusGrab
    set index "$grab,$focus"
    if {[info exists _focusGrab($index)]} {
	foreach {oldFocus oldGrab oldStatus} $_focusGrab($index) break
	unset _focusGrab($index)
    } else {
	set oldGrab ""
    }

    catch {::focus $oldFocus}
    ::grab release $grab
    if {[string equal $destroy "withdraw"]} {
	wm withdraw $grab
    } else {
	::destroy $grab
    }
    if {[winfo exists $oldGrab] && [winfo ismapped $oldGrab]} {
	if {[string equal $oldStatus "global"]} {
	    ::grab -global $oldGrab
	} else {
	    ::grab $oldGrab
	}
    }
}

# BWidget::badOptionString --
#
#	Helper function to return a proper error string when an option
#       doesn't match a list of given options.
#
# Arguments:
#	type	A string that represents the type of option.
#	value	The value that is in-valid.
#       list	A list of valid options.
#
# Results:
#	None.
proc BWidget::badOptionString {type value list} {
    set last [lindex $list end]
    set list [lreplace $list end end]
    return "bad $type \"$value\": must be [join $list ", "], or $last"
}


proc BWidget::wrongNumArgsString { string } {
    return "wrong # args: should be \"$string\""
}


proc BWidget::read_file { file } {
    set fp [open $file]
    set x  [read $fp [file size $file]]
    close $fp
    return $x
}


proc BWidget::classes { class } {
    variable use

    ${class}::use
    set classes [list $class]
    if {![info exists use($class)]} { return }
    foreach class $use($class) {
        if {![string equal $class "-classonly"]} {
            eval lappend classes [classes $class]
        }
    }
    return [lsort -unique $classes]
}


proc BWidget::library { args } {
    variable use

    set libs    [list widget init utils]
    set classes [list]
    foreach class $args {
	${class}::use
        eval lappend classes [classes $class]
    }

    eval lappend libs [lsort -unique $classes]

    set library ""
    foreach lib $libs {
	if {![info exists use($lib,file)]} {
	    set file [file join $::BWIDGET::LIBRARY $lib.tcl]
	} else {
	    set file [file join $::BWIDGET::LIBRARY $use($lib,file).tcl]
	}
        append library [read_file $file]
    }

    return $library
}


proc BWidget::inuse { class } {
    variable ::Widget::_inuse

    if {![info exists _inuse($class)]} { return 0 }
    return [expr $_inuse($class) > 0]
}


proc BWidget::write { filename {mode w} } {
    variable use

    if {![info exists use(classes)]} { return }

    set classes [list]
    foreach class $use(classes) {
	if {![inuse $class]} { continue }
	lappend classes $class
    }

    set fp [open $filename $mode]
    puts $fp [eval library $classes]
    close $fp

    return
}


# BWidget::bindMouseWheel --
#
#	Bind mouse wheel actions to a given widget.
#
# Arguments:
#	widget - The widget to bind.
#
# Results:
#	None.
proc BWidget::bindMouseWheel { widget } {
    if {[bind all <MouseWheel>] eq ""} {
	# style::as and Tk 8.5 have global bindings
	# Only enable these if no global binding for MouseWheel exists
	bind $widget <MouseWheel> \
	    {%W yview scroll [expr {-%D/24}]  units}
	bind $widget <Shift-MouseWheel> \
	    {%W yview scroll [expr {-%D/120}] pages}
	bind $widget <Control-MouseWheel> \
	    {%W yview scroll [expr {-%D/120}] units}
    }

    if {[bind all <Button-4>] eq ""} {
	# style::as and Tk 8.5 have global bindings
	# Only enable these if no global binding for them exists
	bind $widget <Button-4> {event generate %W <MouseWheel> -delta  120}
	bind $widget <Button-5> {event generate %W <MouseWheel> -delta -120}
    }
}

 	  	 
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/widget-old.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
# ----------------------------------------------------------------------------
#  widget.tcl
#  This file is part of Unifix BWidget Toolkit
#  $Id: widget.tcl,v 1.35.2.1 2011/11/14 14:33:29 oehhar Exp $
# ----------------------------------------------------------------------------
#  Index of commands:
#     - Widget::tkinclude
#     - Widget::bwinclude
#     - Widget::declare
#     - Widget::addmap
#     - Widget::init
#     - Widget::destroy
#     - Widget::setoption
#     - Widget::configure
#     - Widget::cget
#     - Widget::subcget
#     - Widget::hasChanged
#     - Widget::options
#     - Widget::_get_tkwidget_options
#     - Widget::_test_tkresource
#     - Widget::_test_bwresource
#     - Widget::_test_synonym
#     - Widget::_test_string
#     - Widget::_test_flag
#     - Widget::_test_enum
#     - Widget::_test_int
#     - Widget::_test_boolean
# ----------------------------------------------------------------------------
# Each megawidget gets a namespace of the same name inside the Widget namespace
# Each of these has an array opt, which contains information about the 
# megawidget options.  It maps megawidget options to a list with this format:
#     {optionType defaultValue isReadonly {additionalOptionalInfo}}
# Option types and their additional optional info are:
#	TkResource	{genericTkWidget genericTkWidgetOptionName}
#	BwResource	{nothing}
#	Enum		{list of enumeration values}
#	Int		{Boundary information}
#	Boolean		{nothing}
#	String		{nothing}
#	Flag		{string of valid flag characters}
#	Synonym		{nothing}
#	Color		{nothing}
#
# Next, each namespace has an array map, which maps class options to their
# component widget options:
#	map(-foreground) => {.e -foreground .f -foreground}
#
# Each has an array ${path}:opt, which contains the value of each megawidget
# option for a particular instance $path of the megawidget, and an array
# ${path}:mod, which stores the "changed" status of configuration options.

# Steps for creating a bwidget megawidget:
# 1. parse args to extract subwidget spec
# 2. Create frame with appropriate class and command line options
# 3. Get initialization options from optionDB, using frame
# 4. create subwidgets

# Uses newer string operations
package require Tcl 8.1.1

namespace eval Widget {
    variable _optiontype
    variable _class
    variable _tk_widget

    # This controls whether we try to use themed widgets from Tile
    variable _theme 0

    variable _aqua [expr {($::tcl_version >= 8.4) &&
			  [string equal [tk windowingsystem] "aqua"]}]

    array set _optiontype {
        TkResource Widget::_test_tkresource
        BwResource Widget::_test_bwresource
        Enum       Widget::_test_enum
        Int        Widget::_test_int
        Boolean    Widget::_test_boolean
        String     Widget::_test_string
        Flag       Widget::_test_flag
        Synonym    Widget::_test_synonym
        Color      Widget::_test_color
        Padding    Widget::_test_padding
    }

    proc use {} {}
}


# ----------------------------------------------------------------------------
#  Command Widget::tkinclude
#     Includes tk widget resources to BWidget widget.
#  class      class name of the BWidget
#  tkwidget   tk widget to include
#  subpath    subpath to configure
#  args       additionnal args for included options
# ----------------------------------------------------------------------------
proc Widget::tkinclude { class tkwidget subpath args } {
    foreach {cmd lopt} $args {
        # cmd can be
        #   include      options to include            lopt = {opt ...}
        #   remove       options to remove             lopt = {opt ...}
        #   rename       options to rename             lopt = {opt newopt ...}
        #   prefix       options to prefix             lopt = {pref opt opt ..}
        #   initialize   set default value for options lopt = {opt value ...}
        #   readonly     set readonly flag for options lopt = {opt flag ...}
        switch -- $cmd {
            remove {
                foreach option $lopt {
                    set remove($option) 1
                }
            }
            include {
                foreach option $lopt {
                    set include($option) 1
                }
            }
            prefix {
                set prefix [lindex $lopt 0]
                foreach option [lrange $lopt 1 end] {
                    set rename($option) "-$prefix[string range $option 1 end]"
                }
            }
            rename     -
            readonly   -
            initialize {
                array set $cmd $lopt
            }
            default {
                return -code error "invalid argument \"$cmd\""
            }
        }
    }

    namespace eval $class {}
    upvar 0 ${class}::opt classopt
    upvar 0 ${class}::map classmap
    upvar 0 ${class}::map$subpath submap
    upvar 0 ${class}::optionExports exports

    # create resources informations from tk widget resources
    foreach optdesc [_get_tkwidget_options $tkwidget] {
        set option [lindex $optdesc 0]
        if { (![info exists include] || [info exists include($option)]) &&
             ![info exists remove($option)] } {
            if { [llength $optdesc] == 3 } {
                # option is a synonym
                set syn [lindex $optdesc 1]
                if { ![info exists remove($syn)] } {
                    # original option is not removed
                    if { [info exists rename($syn)] } {
                        set classopt($option) [list Synonym $rename($syn)]
                    } else {
                        set classopt($option) [list Synonym $syn]
                    }
                }
            } else {
                if { [info exists rename($option)] } {
                    set realopt $option
                    set option  $rename($option)
                } else {
                    set realopt $option
                }
                if { [info exists initialize($option)] } {
                    set value $initialize($option)
                } else {
                    set value [lindex $optdesc 1]
                }
                if { [info exists readonly($option)] } {
                    set ro $readonly($option)
                } else {
                    set ro 0
                }
                set classopt($option) \
			[list TkResource $value $ro [list $tkwidget $realopt]]

		# Add an option database entry for this option
		set optionDbName ".[lindex [_configure_option $realopt ""] 0]"
		if { ![string equal $subpath ":cmd"] } {
		    set optionDbName "$subpath$optionDbName"
		}
		option add *${class}$optionDbName $value widgetDefault
		lappend exports($option) "$optionDbName"

		# Store the forward and backward mappings for this
		# option <-> realoption pair
                lappend classmap($option) $subpath "" $realopt
		set submap($realopt) $option
            }
        }
    }
}


# ----------------------------------------------------------------------------
#  Command Widget::bwinclude
#     Includes BWidget resources to BWidget widget.
#  class    class name of the BWidget
#  subclass BWidget class to include
#  subpath  subpath to configure
#  args     additionnal args for included options
# ----------------------------------------------------------------------------
proc Widget::bwinclude { class subclass subpath args } {
    foreach {cmd lopt} $args {
        # cmd can be
        #   include      options to include            lopt = {opt ...}
        #   remove       options to remove             lopt = {opt ...}
        #   rename       options to rename             lopt = {opt newopt ...}
        #   prefix       options to prefix             lopt = {prefix opt opt ...}
        #   initialize   set default value for options lopt = {opt value ...}
        #   readonly     set readonly flag for options lopt = {opt flag ...}
        switch -- $cmd {
            remove {
                foreach option $lopt {
                    set remove($option) 1
                }
            }
            include {
                foreach option $lopt {
                    set include($option) 1
                }
            }
            prefix {
                set prefix [lindex $lopt 0]
                foreach option [lrange $lopt 1 end] {
                    set rename($option) "-$prefix[string range $option 1 end]"
                }
            }
            rename     -
            readonly   -
            initialize {
                array set $cmd $lopt
            }
            default {
                return -code error "invalid argument \"$cmd\""
            }
        }
    }

    namespace eval $class {}
    upvar 0 ${class}::opt classopt
    upvar 0 ${class}::map classmap
    upvar 0 ${class}::map$subpath submap
    upvar 0 ${class}::optionExports exports
    upvar 0 ${subclass}::opt subclassopt
    upvar 0 ${subclass}::optionExports subexports

    # create resources informations from BWidget resources
    foreach {option optdesc} [array get subclassopt] {
	set subOption $option
        if { (![info exists include] || [info exists include($option)]) &&
             ![info exists remove($option)] } {
            set type [lindex $optdesc 0]
            if { [string equal $type "Synonym"] } {
                # option is a synonym
                set syn [lindex $optdesc 1]
                if { ![info exists remove($syn)] } {
                    if { [info exists rename($syn)] } {
                        set classopt($option) [list Synonym $rename($syn)]
                    } else {
                        set classopt($option) [list Synonym $syn]
                    }
                }
            } else {
                if { [info exists rename($option)] } {
                    set realopt $option
                    set option  $rename($option)
                } else {
                    set realopt $option
                }
                if { [info exists initialize($option)] } {
                    set value $initialize($option)
                } else {
                    set value [lindex $optdesc 1]
                }
                if { [info exists readonly($option)] } {
                    set ro $readonly($option)
                } else {
                    set ro [lindex $optdesc 2]
                }
                set classopt($option) \
			[list $type $value $ro [lindex $optdesc 3]]

		# Add an option database entry for this option
		foreach optionDbName $subexports($subOption) {
		    if { ![string equal $subpath ":cmd"] } {
			set optionDbName "$subpath$optionDbName"
		    }
		    # Only add the option db entry if we are overriding the
		    # normal widget default
		    if { [info exists initialize($option)] } {
			option add *${class}$optionDbName $value \
				widgetDefault
		    }
		    lappend exports($option) "$optionDbName"
		}

		# Store the forward and backward mappings for this
		# option <-> realoption pair
                lappend classmap($option) $subpath $subclass $realopt
		set submap($realopt) $option
            }
        }
    }
}


# ----------------------------------------------------------------------------
#  Command Widget::declare
#    Declares new options to BWidget class.
# ----------------------------------------------------------------------------
proc Widget::declare { class optlist } {
    variable _optiontype

    namespace eval $class {}
    upvar 0 ${class}::opt classopt
    upvar 0 ${class}::optionExports exports
    upvar 0 ${class}::optionClass optionClass

    foreach optdesc $optlist {
        set option  [lindex $optdesc 0]
        set optdesc [lrange $optdesc 1 end]
        set type    [lindex $optdesc 0]

        if { ![info exists _optiontype($type)] } {
            # invalid resource type
            return -code error "invalid option type \"$type\""
        }

        if { [string equal $type "Synonym"] } {
            # test existence of synonym option
            set syn [lindex $optdesc 1]
            if { ![info exists classopt($syn)] } {
                return -code error "unknow option \"$syn\" for Synonym \"$option\""
            }
            set classopt($option) [list Synonym $syn]
            continue
        }

        # all other resource may have default value, readonly flag and
        # optional arg depending on type
        set value [lindex $optdesc 1]
        set ro    [lindex $optdesc 2]
        set arg   [lindex $optdesc 3]

        if { [string equal $type "BwResource"] } {
            # We don't keep BwResource. We simplify to type of sub BWidget
            set subclass    [lindex $arg 0]
            set realopt     [lindex $arg 1]
            if { ![string length $realopt] } {
                set realopt $option
            }

            upvar 0 ${subclass}::opt subclassopt
            if { ![info exists subclassopt($realopt)] } {
                return -code error "unknow option \"$realopt\""
            }
            set suboptdesc $subclassopt($realopt)
            if { $value == "" } {
                # We initialize default value
                set value [lindex $suboptdesc 1]
            }
            set type [lindex $suboptdesc 0]
            set ro   [lindex $suboptdesc 2]
            set arg  [lindex $suboptdesc 3]
	    set optionDbName ".[lindex [_configure_option $option ""] 0]"
	    option add *${class}${optionDbName} $value widgetDefault
	    set exports($option) $optionDbName
            set classopt($option) [list $type $value $ro $arg]
            continue
        }

        # retreive default value for TkResource
        if { [string equal $type "TkResource"] } {
            set tkwidget [lindex $arg 0]
            set realopt  [lindex $arg 1]
            if { ![string length $realopt] } {
                set realopt $option
            }
            set tkoptions [_get_tkwidget_options $tkwidget]
            set ind [lsearch $tkoptions [list $realopt *]]
            set optdesc [lindex $tkoptions $ind];
            set tkoptions [_get_tkwidget_options $tkwidget]
            if { ![string length $value] } {
                # We initialize default value
                set value [lindex $optdesc end]
            }
	    set optionDbName ".[lindex [_configure_option $option ""] 0]"
	    option add *${class}${optionDbName} $value widgetDefault
	    set exports($option) $optionDbName
            set classopt($option) [list TkResource $value $ro \
		    [list $tkwidget $realopt]]
	    set optionClass($option) [lindex $optdesc 1]
            continue
        }

	set optionDbName ".[lindex [_configure_option $option ""] 0]"
	option add *${class}${optionDbName} $value widgetDefault
	set exports($option) $optionDbName
        # for any other resource type, we keep original optdesc
        set classopt($option) [list $type $value $ro $arg]
    }
}


proc Widget::define { class filename args } {
    variable ::BWidget::use
    set use($class)      $args
    set use($class,file) $filename
    lappend use(classes) $class

    if {[set x [lsearch -exact $args "-classonly"]] > -1} {
	set args [lreplace $args $x $x]
    } else {
	interp alias {} ::${class} {} ${class}::create
	proc ::${class}::use {} {}

	bind $class <Destroy> [list Widget::destroy %W]
    }

    foreach class $args { ${class}::use }
}


proc Widget::create { class path {rename 1} } {
    if {$rename} { rename $path ::$path:cmd }
    proc ::$path { cmd args } \
    	[subst {return \[eval \[linsert \$args 0 ${class}::\$cmd [list $path]\]\]}]
    return $path
}


# ----------------------------------------------------------------------------
#  Command Widget::addmap
# ----------------------------------------------------------------------------
proc Widget::addmap { class subclass subpath options } {
    upvar 0 ${class}::opt classopt
    upvar 0 ${class}::optionExports exports
    upvar 0 ${class}::map classmap
    upvar 0 ${class}::map$subpath submap

    foreach {option realopt} $options {
        if { ![string length $realopt] } {
            set realopt $option
        }
	set val [lindex $classopt($option) 1]
	set optDb ".[lindex [_configure_option $realopt ""] 0]"
	if { ![string equal $subpath ":cmd"] } {
	    set optDb "$subpath$optDb"
	}
	option add *${class}${optDb} $val widgetDefault
	lappend exports($option) $optDb
	# Store the forward and backward mappings for this
	# option <-> realoption pair
        lappend classmap($option) $subpath $subclass $realopt
	set submap($realopt) $option
    }
}


# ----------------------------------------------------------------------------
#  Command Widget::init
# ----------------------------------------------------------------------------
proc Widget::init { class path options } {
    variable _inuse
    variable _class
    variable _optiontype

    upvar 0 ${class}::opt classopt
    upvar 0 ${class}::$path:opt  pathopt
    upvar 0 ${class}::$path:mod  pathmod
    upvar 0 ${class}::map classmap
    upvar 0 ${class}::$path:init pathinit

    if { [info exists pathopt] } {
	unset pathopt
    }
    if { [info exists pathmod] } {
	unset pathmod
    }
    # We prefer to use the actual widget for option db queries, but if it
    # doesn't exist yet, do the next best thing:  create a widget of the
    # same class and use that.
    set fpath $path
    set rdbclass [string map [list :: ""] $class]
    if { ![winfo exists $path] } {
	set fpath ".#BWidget.#Class#$class"
	# encapsulation frame to not pollute '.' childspace
	if {![winfo exists ".#BWidget"]} { frame ".#BWidget" }
	if { ![winfo exists $fpath] } {
	    frame $fpath -class $rdbclass
	}
    }
    foreach {option optdesc} [array get classopt] {
        set pathmod($option) 0
	if { [info exists classmap($option)] } {
	    continue
	}
        set type [lindex $optdesc 0]
        if { [string equal $type "Synonym"] } {
	    continue
        }
        if { [string equal $type "TkResource"] } {
            set alt [lindex [lindex $optdesc 3] 1]
        } else {
            set alt ""
        }
        set optdb [lindex [_configure_option $option $alt] 0]
        set def   [option get $fpath $optdb $rdbclass]
        if { [string length $def] } {
            set pathopt($option) $def
        } else {
            set pathopt($option) [lindex $optdesc 1]
        }
    }

    if {![info exists _inuse($class)]} { set _inuse($class) 0 }
    incr _inuse($class)

    set _class($path) $class
    foreach {option value} $options {
        if { ![info exists classopt($option)] } {
            unset pathopt
            unset pathmod
            return -code error "unknown option \"$option\""
        }
        set optdesc $classopt($option)
        set type    [lindex $optdesc 0]
        if { [string equal $type "Synonym"] } {
            set option  [lindex $optdesc 1]
            set optdesc $classopt($option)
            set type    [lindex $optdesc 0]
        }
        # this may fail if a wrong enum element was used
        if {[catch {
             $_optiontype($type) $option $value [lindex $optdesc 3]
        } msg]} {
            if {[info exists pathopt]} {
                unset pathopt
            }
            unset pathmod
            return -code error $msg
        }
        set pathopt($option) $msg
	set pathinit($option) $pathopt($option)
    }
}

# Bastien Chevreux (bach@mwgdna.com)
#
# copyinit performs basically the same job as init, but it uses a
#  existing template to initialize its values. So, first a perferct copy
#  from the template is made just to be altered by any existing options
#  afterwards.
# But this still saves time as the first initialization parsing block is
#  skipped.
# As additional bonus, items that differ in just a few options can be
#  initialized faster by leaving out the options that are equal.

# This function is currently used only by ListBox::multipleinsert, but other
#  calls should follow :)

# ----------------------------------------------------------------------------
#  Command Widget::copyinit
# ----------------------------------------------------------------------------
proc Widget::copyinit { class templatepath path options } {
    variable _class
    variable _optiontype
    upvar 0 ${class}::opt classopt \
	    ${class}::$path:opt	 pathopt \
	    ${class}::$path:mod	 pathmod \
	    ${class}::$path:init pathinit \
	    ${class}::$templatepath:opt	  templatepathopt \
	    ${class}::$templatepath:mod	  templatepathmod \
	    ${class}::$templatepath:init  templatepathinit

    if { [info exists pathopt] } {
	unset pathopt
    }
    if { [info exists pathmod] } {
	unset pathmod
    }

    # We use the template widget for option db copying, but it has to exist!
    array set pathmod  [array get templatepathmod]
    array set pathopt  [array get templatepathopt]
    array set pathinit [array get templatepathinit]

    set _class($path) $class
    foreach {option value} $options {
	if { ![info exists classopt($option)] } {
	    unset pathopt
	    unset pathmod
	    return -code error "unknown option \"$option\""
	}
	set optdesc $classopt($option)
	set type    [lindex $optdesc 0]
	if { [string equal $type "Synonym"] } {
	    set option	[lindex $optdesc 1]
	    set optdesc $classopt($option)
	    set type	[lindex $optdesc 0]
	}
	set pathopt($option) [$_optiontype($type) $option $value [lindex $optdesc 3]]
	set pathinit($option) $pathopt($option)
    }
}

# Widget::parseArgs --
#
#	Given a widget class and a command-line spec, cannonize and validate
#	the given options, and return a keyed list consisting of the 
#	component widget and its masked portion of the command-line spec, and
#	one extra entry consisting of the portion corresponding to the 
#	megawidget itself.
#
# Arguments:
#	class	widget class to parse for.
#	options	command-line spec
#
# Results:
#	result	keyed list of portions of the megawidget and that segment of
#		the command line in which that portion is interested.

proc Widget::parseArgs {class options} {
    variable _optiontype
    upvar 0 ${class}::opt classopt
    upvar 0 ${class}::map classmap
    
    foreach {option val} $options {
	if { ![info exists classopt($option)] } {
	    error "unknown option \"$option\""
	}
        set optdesc $classopt($option)
        set type    [lindex $optdesc 0]
        if { [string equal $type "Synonym"] } {
            set option  [lindex $optdesc 1]
            set optdesc $classopt($option)
            set type    [lindex $optdesc 0]
        }
	if { [string equal $type "TkResource"] } {
	    # Make sure that the widget used for this TkResource exists
	    Widget::_get_tkwidget_options [lindex [lindex $optdesc 3] 0]
	}
	set val [$_optiontype($type) $option $val [lindex $optdesc 3]]
		
	if { [info exists classmap($option)] } {
	    foreach {subpath subclass realopt} $classmap($option) {
		lappend maps($subpath) $realopt $val
	    }
	} else {
	    lappend maps($class) $option $val
	}
    }
    return [array get maps]
}

# Widget::initFromODB --
#
#	Initialize a megawidgets options with information from the option
#	database and from the command-line arguments given.
#
# Arguments:
#	class	class of the widget.
#	path	path of the widget -- should already exist.
#	options	command-line arguments.
#
# Results:
#	None.

proc Widget::initFromODB {class path options} {
    variable _inuse
    variable _class

    upvar 0 ${class}::$path:opt  pathopt
    upvar 0 ${class}::$path:mod  pathmod
    upvar 0 ${class}::map classmap

    if { [info exists pathopt] } {
	unset pathopt
    }
    if { [info exists pathmod] } {
	unset pathmod
    }
    # We prefer to use the actual widget for option db queries, but if it
    # doesn't exist yet, do the next best thing:  create a widget of the
    # same class and use that.
    set fpath [_get_window $class $path]
    set rdbclass [string map [list :: ""] $class]
    if { ![winfo exists $path] } {
	set fpath ".#BWidget.#Class#$class"
	# encapsulation frame to not pollute '.' childspace
	if {![winfo exists ".#BWidget"]} { frame ".#BWidget" }
	if { ![winfo exists $fpath] } {
	    frame $fpath -class $rdbclass
	}
    }

    foreach {option optdesc} [array get ${class}::opt] {
        set pathmod($option) 0
	if { [info exists classmap($option)] } {
	    continue
	}
        set type [lindex $optdesc 0]
        if { [string equal $type "Synonym"] } {
	    continue
        }
	if { [string equal $type "TkResource"] } {
            set alt [lindex [lindex $optdesc 3] 1]
        } else {
            set alt ""
        }
        set optdb [lindex [_configure_option $option $alt] 0]
        set def   [option get $fpath $optdb $rdbclass]
        if { [string length $def] } {
            set pathopt($option) $def
        } else {
            set pathopt($option) [lindex $optdesc 1]
        }
    }

    if {![info exists _inuse($class)]} { set _inuse($class) 0 }
    incr _inuse($class)

    set _class($path) $class
    array set pathopt $options
}



# ----------------------------------------------------------------------------
#  Command Widget::destroy
# ----------------------------------------------------------------------------
proc Widget::destroy { path } {
    variable _class
    variable _inuse

    if {![info exists _class($path)]} { return }

    set class $_class($path)
    upvar 0 ${class}::$path:opt pathopt
    upvar 0 ${class}::$path:mod pathmod
    upvar 0 ${class}::$path:init pathinit

    if {[info exists _inuse($class)]} { incr _inuse($class) -1 }

    if {[info exists pathopt]} {
        unset pathopt
    }
    if {[info exists pathmod]} {
        unset pathmod
    }
    if {[info exists pathinit]} {
        unset pathinit
    }

    if {![string equal [info commands $path] ""]} { rename $path "" }

    ## Unset any variables used in this widget.
    foreach var [info vars ::${class}::$path:*] { unset $var }

    unset _class($path)
}


# ----------------------------------------------------------------------------
#  Command Widget::configure
# ----------------------------------------------------------------------------
proc Widget::configure { path options } {
    set len [llength $options]
    if { $len <= 1 } {
        return [_get_configure $path $options]
    } elseif { $len % 2 == 1 } {
        return -code error "incorrect number of arguments"
    }

    variable _class
    variable _optiontype

    set class $_class($path)
    upvar 0 ${class}::opt  classopt
    upvar 0 ${class}::map  classmap
    upvar 0 ${class}::$path:opt pathopt
    upvar 0 ${class}::$path:mod pathmod

    set window [_get_window $class $path]
    foreach {option value} $options {
        if { ![info exists classopt($option)] } {
            return -code error "unknown option \"$option\""
        }
        set optdesc $classopt($option)
        set type    [lindex $optdesc 0]
        if { [string equal $type "Synonym"] } {
            set option  [lindex $optdesc 1]
            set optdesc $classopt($option)
            set type    [lindex $optdesc 0]
        }
        if { ![lindex $optdesc 2] } {
            set newval [$_optiontype($type) $option $value [lindex $optdesc 3]]
            if { [info exists classmap($option)] } {
		set window [_get_window $class $window]
                foreach {subpath subclass realopt} $classmap($option) {
                    # Interpretation of special pointers:
                    # | subclass | subpath | widget           | path           | class   |
                    # +----------+---------+------------------+----------------+-context-+
                    # | :cmd     | :cmd    | herited widget   | window:cmd     |window   |
                    # | :cmd     | *       | subwidget        | window.subpath | window  |
                    # | ""       | :cmd    | herited widget   | window:cmd     | window  |
                    # | ""       | *       | own              | window         | window  |
                    # | *        | :cmd    | own              | window         | current |
                    # | *        | *       | subwidget        | window.subpath | current |
                    if { [string length $subclass] && ! [string equal $subclass ":cmd"] } {
                        if { [string equal $subpath ":cmd"] } {
                            set subpath ""
                        }
                        set curval [${subclass}::cget $window$subpath $realopt]
                        ${subclass}::configure $window$subpath $realopt $newval
                    } else {
                        set curval [$window$subpath cget $realopt]
                        $window$subpath configure $realopt $newval
                    }
                }
            } else {
		set curval $pathopt($option)
		set pathopt($option) $newval
	    }
	    set pathmod($option) [expr {![string equal $newval $curval]}]
        }
    }

    return {}
}


# ----------------------------------------------------------------------------
#  Command Widget::cget
# ----------------------------------------------------------------------------
proc Widget::cget { path option } {
    variable _class
    if { ![info exists _class($path)] } {
        return -code error "unknown widget $path"
    }

    set class $_class($path)
    if { ![info exists ${class}::opt($option)] } {
        return -code error "unknown option \"$option\""
    }

    set optdesc [set ${class}::opt($option)]
    set type    [lindex $optdesc 0]
    if {[string equal $type "Synonym"]} {
        set option [lindex $optdesc 1]
    }

    if { [info exists ${class}::map($option)] } {
	foreach {subpath subclass realopt} [set ${class}::map($option)] {break}
	set path "[_get_window $class $path]$subpath"
	return [$path cget $realopt]
    }
    upvar 0 ${class}::$path:opt pathopt
    set pathopt($option)
}


# ----------------------------------------------------------------------------
#  Command Widget::subcget
# ----------------------------------------------------------------------------
proc Widget::subcget { path subwidget } {
    variable _class
    set class $_class($path)
    upvar 0 ${class}::$path:opt pathopt
    upvar 0 ${class}::map$subwidget submap
    upvar 0 ${class}::$path:init pathinit

    set result {}
    foreach realopt [array names submap] {
	if { [info exists pathinit($submap($realopt))] } {
	    lappend result $realopt $pathopt($submap($realopt))
	}
    }
    return $result
}


# ----------------------------------------------------------------------------
#  Command Widget::hasChanged
# ----------------------------------------------------------------------------
proc Widget::hasChanged { path option pvalue } {
    variable _class
    upvar $pvalue value
    set class $_class($path)
    upvar 0 ${class}::$path:mod pathmod

    set value   [Widget::cget $path $option]
    set result  $pathmod($option)
    set pathmod($option) 0

    return $result
}

proc Widget::hasChangedX { path option args } {
    variable _class
    set class $_class($path)
    upvar 0 ${class}::$path:mod pathmod

    set result  $pathmod($option)
    set pathmod($option) 0
    foreach option $args {
	lappend result $pathmod($option)
	set pathmod($option) 0
    }

    set result
}


# ----------------------------------------------------------------------------
#  Command Widget::setoption
# ----------------------------------------------------------------------------
proc Widget::setoption { path option value } {
#    variable _class

#    set class $_class($path)
#    upvar 0 ${class}::$path:opt pathopt

#    set pathopt($option) $value
    Widget::configure $path [list $option $value]
}


# ----------------------------------------------------------------------------
#  Command Widget::getoption
# ----------------------------------------------------------------------------
proc Widget::getoption { path option } {
#    set class $::Widget::_class($path)
#    upvar 0 ${class}::$path:opt pathopt

#    return $pathopt($option)
    return [Widget::cget $path $option]
}

# Widget::getMegawidgetOption --
#
#	Bypass the superfluous checks in cget and just directly peer at the
#	widget's data space.  This is much more fragile than cget, so it 
#	should only be used with great care, in places where speed is critical.
#
# Arguments:
#	path	widget to lookup options for.
#	option	option to retrieve.
#
# Results:
#	value	option value.

proc Widget::getMegawidgetOption {path option} {
    variable _class
    set class $_class($path)
    upvar 0 ${class}::${path}:opt pathopt
    set pathopt($option)
}

# Widget::setMegawidgetOption --
#
#	Bypass the superfluous checks in cget and just directly poke at the
#	widget's data space.  This is much more fragile than configure, so it 
#	should only be used with great care, in places where speed is critical.
#
# Arguments:
#	path	widget to lookup options for.
#	option	option to retrieve.
#	value	option value.
#
# Results:
#	value	option value.

proc Widget::setMegawidgetOption {path option value} {
    variable _class
    set class $_class($path)
    upvar 0 ${class}::${path}:opt pathopt
    set pathopt($option) $value
}

# ----------------------------------------------------------------------------
#  Command Widget::_get_window
#  returns the window corresponding to widget path
# ----------------------------------------------------------------------------
proc Widget::_get_window { class path } {
    set idx [string last "#" $path]
    if { $idx != -1 && [string equal [string range $path [expr {$idx+1}] end] $class] } {
        return [string range $path 0 [expr {$idx-1}]]
    } else {
        return $path
    }
}


# ----------------------------------------------------------------------------
#  Command Widget::_get_configure
#  returns the configuration list of options
#  (as tk widget do - [$w configure ?option?])
# ----------------------------------------------------------------------------
proc Widget::_get_configure { path options } {
    variable _class

    set class $_class($path)
    upvar 0 ${class}::opt classopt
    upvar 0 ${class}::map classmap
    upvar 0 ${class}::$path:opt pathopt
    upvar 0 ${class}::$path:mod pathmod

    set len [llength $options]
    if { !$len } {
        set result {}
        foreach option [lsort [array names classopt]] {
            set optdesc $classopt($option)
            set type    [lindex $optdesc 0]
            if { [string equal $type "Synonym"] } {
                set syn     $option
                set option  [lindex $optdesc 1]
                set optdesc $classopt($option)
                set type    [lindex $optdesc 0]
            } else {
                set syn ""
            }
            if { [string equal $type "TkResource"] } {
                set alt [lindex [lindex $optdesc 3] 1]
            } else {
                set alt ""
            }
            set res [_configure_option $option $alt]
            if { $syn == "" } {
                lappend result [concat $option $res [list [lindex $optdesc 1]] [list [cget $path $option]]]
            } else {
                lappend result [list $syn [lindex $res 0]]
            }
        }
        return $result
    } elseif { $len == 1 } {
        set option  [lindex $options 0]
        if { ![info exists classopt($option)] } {
            return -code error "unknown option \"$option\""
        }
        set optdesc $classopt($option)
        set type    [lindex $optdesc 0]
        if { [string equal $type "Synonym"] } {
            set option  [lindex $optdesc 1]
            set optdesc $classopt($option)
            set type    [lindex $optdesc 0]
        }
        if { [string equal $type "TkResource"] } {
            set alt [lindex [lindex $optdesc 3] 1]
        } else {
            set alt ""
        }
        set res [_configure_option $option $alt]
        return [concat $option $res [list [lindex $optdesc 1]] [list [cget $path $option]]]
    }
}


# ----------------------------------------------------------------------------
#  Command Widget::_configure_option
# ----------------------------------------------------------------------------
proc Widget::_configure_option { option altopt } {
    variable _optiondb
    variable _optionclass

    if { [info exists _optiondb($option)] } {
        set optdb $_optiondb($option)
    } else {
        set optdb [string range $option 1 end]
    }
    if { [info exists _optionclass($option)] } {
        set optclass $_optionclass($option)
    } elseif { [string length $altopt] } {
        if { [info exists _optionclass($altopt)] } {
            set optclass $_optionclass($altopt)
        } else {
            set optclass [string range $altopt 1 end]
        }
    } else {
        set optclass [string range $option 1 end]
    }
    return [list $optdb $optclass]
}

# ----------------------------------------------------------------------------
#  Command Widget::_make_tk_widget_name
# ----------------------------------------------------------------------------
# Before, the widget meta name was build as: ".#BWidget.#$tkwidget"
# This does not work for ttk widgets, as they have an "::" in their name.
# Thus replace any "::" by "__" will do the job.
proc Widget::_make_tk_widget_name { tkwidget } {
    set pos 0
    for {set pos 0} {0 <= [set pos [string first "::" $tkwidget $pos]]} {incr pos} {
	set tkwidget [string range $tkwidget 0 [expr {$pos-1}]]__[string range $tkwidget [expr {$pos+2}] end]
    }
    return ".#BWidget.#$tkwidget"
}

# ----------------------------------------------------------------------------
#  Command Widget::_get_tkwidget_options
# ----------------------------------------------------------------------------
proc Widget::_get_tkwidget_options { tkwidget } {
    variable _tk_widget
    variable _optiondb
    variable _optionclass

    set widget [_make_tk_widget_name $tkwidget]
    # encapsulation frame to not pollute '.' childspace
    if {![winfo exists ".#BWidget"]} { frame ".#BWidget" }
    if { ![winfo exists $widget] || ![info exists _tk_widget($tkwidget)] } {
	set widget [$tkwidget $widget]
	# JDC: Withdraw toplevels, otherwise visible
	if {[string equal $tkwidget "toplevel"]} {
	    wm withdraw $widget
	}
	set config [$widget configure]
	foreach optlist $config {
	    set opt [lindex $optlist 0]
	    if { [llength $optlist] == 2 } {
		set refsyn [lindex $optlist 1]
		# search for class
		set idx [lsearch $config [list * $refsyn *]]
		if { $idx == -1 } {
		    if { [string index $refsyn 0] == "-" } {
			# search for option (tk8.1b1 bug)
			set idx [lsearch $config [list $refsyn * *]]
		    } else {
			# last resort
			set idx [lsearch $config [list -[string tolower $refsyn] * *]]
		    }
		    if { $idx == -1 } {
			# fed up with "can't read classopt()"
			return -code error "can't find option of synonym $opt"
		    }
		}
		set syn [lindex [lindex $config $idx] 0]
		# JDC: used 4 (was 3) to get def from optiondb
		set def [lindex [lindex $config $idx] 4]
		lappend _tk_widget($tkwidget) [list $opt $syn $def]
	    } else {
		# JDC: used 4 (was 3) to get def from optiondb
		set def [lindex $optlist 4]
		lappend _tk_widget($tkwidget) [list $opt $def]
		set _optiondb($opt)    [lindex $optlist 1]
		set _optionclass($opt) [lindex $optlist 2]
	    }
	}
    }
    return $_tk_widget($tkwidget)
}


# ----------------------------------------------------------------------------
#  Command Widget::_test_tkresource
# ----------------------------------------------------------------------------
proc Widget::_test_tkresource { option value arg } {
#    set tkwidget [lindex $arg 0]
#    set realopt  [lindex $arg 1]
    foreach {tkwidget realopt} $arg break
    set path     [_make_tk_widget_name $tkwidget]
    set old      [$path cget $realopt]
    $path configure $realopt $value
    set res      [$path cget $realopt]
    $path configure $realopt $old

    return $res
}


# ----------------------------------------------------------------------------
#  Command Widget::_test_bwresource
# ----------------------------------------------------------------------------
proc Widget::_test_bwresource { option value arg } {
    return -code error "bad option type BwResource in widget"
}


# ----------------------------------------------------------------------------
#  Command Widget::_test_synonym
# ----------------------------------------------------------------------------
proc Widget::_test_synonym { option value arg } {
    return -code error "bad option type Synonym in widget"
}

# ----------------------------------------------------------------------------
#  Command Widget::_test_color
# ----------------------------------------------------------------------------
proc Widget::_test_color { option value arg } {
    if {[catch {winfo rgb . $value} color]} {
        return -code error "bad $option value \"$value\": must be a colorname \
		or #RRGGBB triplet"
    }

    return $value
}


# ----------------------------------------------------------------------------
#  Command Widget::_test_string
# ----------------------------------------------------------------------------
proc Widget::_test_string { option value arg } {
    set value
}


# ----------------------------------------------------------------------------
#  Command Widget::_test_flag
# ----------------------------------------------------------------------------
proc Widget::_test_flag { option value arg } {
    set len [string length $value]
    set res ""
    for {set i 0} {$i < $len} {incr i} {
        set c [string index $value $i]
        if { [string first $c $arg] == -1 } {
            return -code error "bad [string range $option 1 end] value \"$value\": characters must be in \"$arg\""
        }
        if { [string first $c $res] == -1 } {
            append res $c
        }
    }
    return $res
}


# -----------------------------------------------------------------------------
#  Command Widget::_test_enum
# -----------------------------------------------------------------------------
proc Widget::_test_enum { option value arg } {
    if { [lsearch $arg $value] == -1 } {
        set last [lindex   $arg end]
        set sub  [lreplace $arg end end]
        if { [llength $sub] } {
            set str "[join $sub ", "] or $last"
        } else {
            set str $last
        }
        return -code error "bad [string range $option 1 end] value \"$value\": must be $str"
    }
    return $value
}


# -----------------------------------------------------------------------------
#  Command Widget::_test_int
# -----------------------------------------------------------------------------
proc Widget::_test_int { option value arg } {
    if { ![string is int -strict $value] || \
	    ([string length $arg] && \
	    ![expr [string map [list %d $value] $arg]]) } {
		    return -code error "bad $option value\
			    \"$value\": must be integer ($arg)"
    }
    return $value
}


# -----------------------------------------------------------------------------
#  Command Widget::_test_boolean
# -----------------------------------------------------------------------------
proc Widget::_test_boolean { option value arg } {
    if { ![string is boolean -strict $value] } {
        return -code error "bad $option value \"$value\": must be boolean"
    }

    # Get the canonical form of the boolean value (1 for true, 0 for false)
    return [string is true $value]
}


# -----------------------------------------------------------------------------
#  Command Widget::_test_padding
# -----------------------------------------------------------------------------
proc Widget::_test_padding { option values arg } {
    set len [llength $values]
    if {$len < 1 || $len > 2} {
        return -code error "bad pad value \"$values\":\
                        must be positive screen distance"
    }

    foreach value $values {
        if { ![string is int -strict $value] || \
            ([string length $arg] && \
            ![expr [string map [list %d $value] $arg]]) } {
                return -code error "bad pad value \"$value\":\
                                must be positive screen distance ($arg)"
        }
    }
    return $values
}


# Widget::_get_padding --
#
#       Return the requesting padding value for a padding option.
#
# Arguments:
#	path		Widget to get the options for.
#       option          The name of the padding option.
#	index		The index of the padding.  If the index is empty,
#                       the first padding value is returned.
#
# Results:
#	Return a numeric value that can be used for padding.
proc Widget::_get_padding { path option {index 0} } {
    set pad [Widget::cget $path $option]
    set val [lindex $pad $index]
    if {$val == ""} { set val [lindex $pad 0] }
    return $val
}


# -----------------------------------------------------------------------------
#  Command Widget::focusNext
#  Same as tk_focusNext, but call Widget::focusOK
# -----------------------------------------------------------------------------
proc Widget::focusNext { w } {
    set cur $w
    while 1 {

	# Descend to just before the first child of the current widget.

	set parent $cur
	set children [winfo children $cur]
	set i -1

	# Look for the next sibling that isn't a top-level.

	while 1 {
	    incr i
	    if {$i < [llength $children]} {
		set cur [lindex $children $i]
		if {[string equal [winfo toplevel $cur] $cur]} {
		    continue
		} else {
		    break
		}
	    }

	    # No more siblings, so go to the current widget's parent.
	    # If it's a top-level, break out of the loop, otherwise
	    # look for its next sibling.

	    set cur $parent
	    if {[string equal [winfo toplevel $cur] $cur]} {
		break
	    }
	    set parent [winfo parent $parent]
	    set children [winfo children $parent]
	    set i [lsearch -exact $children $cur]
	}
	if {[string equal $cur $w] || [focusOK $cur]} {
	    return $cur
	}
    }
}


# -----------------------------------------------------------------------------
#  Command Widget::focusPrev
#  Same as tk_focusPrev, except:
#	+ Don't traverse from a child to a direct ancestor
#	+ Call Widget::focusOK instead of tk::focusOK
# -----------------------------------------------------------------------------
proc Widget::focusPrev { w } {
    set cur $w
    set origParent [winfo parent $w]
    while 1 {

	# Collect information about the current window's position
	# among its siblings.  Also, if the window is a top-level,
	# then reposition to just after the last child of the window.

	if {[string equal [winfo toplevel $cur] $cur]}  {
	    set parent $cur
	    set children [winfo children $cur]
	    set i [llength $children]
	} else {
	    set parent [winfo parent $cur]
	    set children [winfo children $parent]
	    set i [lsearch -exact $children $cur]
	}

	# Go to the previous sibling, then descend to its last descendant
	# (highest in stacking order.  While doing this, ignore top-levels
	# and their descendants.  When we run out of descendants, go up
	# one level to the parent.

	while {$i > 0} {
	    incr i -1
	    set cur [lindex $children $i]
	    if {[string equal [winfo toplevel $cur] $cur]} {
		continue
	    }
	    set parent $cur
	    set children [winfo children $parent]
	    set i [llength $children]
	}
	set cur $parent
	if {[string equal $cur $w]} {
	    return $cur
	}
	# If we are just at the original parent of $w, skip it as a
	# potential focus accepter.  Extra safety in this is to see if
	# that parent is also a proc (not a C command), which is what
	# BWidgets makes for any megawidget.  Could possibly also check
	# for '[info commands ::${origParent}:cmd] != ""'.  [Bug 765667]
	if {[string equal $cur $origParent]
	    && [info procs ::$origParent] != ""} {
	    continue
	}
	if {[focusOK $cur]} {
	    return $cur
	}
    }
}


# ----------------------------------------------------------------------------
#  Command Widget::focusOK
#  Same as tk_focusOK, but handles -editable option and whole tags list.
# ----------------------------------------------------------------------------
proc Widget::focusOK { w } {
    set code [catch {$w cget -takefocus} value]
    if { $code == 1 } {
        return 0
    }
    if {($code == 0) && ($value != "")} {
	if {$value == 0} {
	    return 0
	} elseif {$value == 1} {
	    return [winfo viewable $w]
	} else {
	    set value [uplevel \#0 [list $value $w]]
            if {$value != ""} {
		return $value
	    }
        }
    }
    if {![winfo viewable $w]} {
	return 0
    }
    set code [catch {$w cget -state} value]
    if {($code == 0) && ($value == "disabled")} {
	return 0
    }
    set code [catch {$w cget -editable} value]
    if {($code == 0) && ($value == 0)} {
        return 0
    }

    set top [winfo toplevel $w]
    foreach tags [bindtags $w] {
        if { ![string equal $tags $top]  &&
             ![string equal $tags "all"] &&
             [regexp Key [bind $tags]] } {
            return 1
        }
    }
    return 0
}


proc Widget::traverseTo { w } {
    set focus [focus]
    if {![string equal $focus ""]} {
	event generate $focus <<TraverseOut>>
    }
    focus $w

    event generate $w <<TraverseIn>>
}

# Widget::which --
#
#	Retrieve a fully qualified variable name for the specified option or
#	widget variable.
#
#	If the option is not one for which a variable exists, throw an error
#	(ie, those options that map directly to widget options).
#
#	For widget variables, return the fully qualified name even if the
#	variable had not been previously set, in order to allow adding variable
#	traces prior to their creation.
#
# Arguments:
#	path	megawidget to get an option var for.
#	type	either -option or -variable.
#	name    name of the option or widget variable.
#
# Results:
#	Fully qualified name of the variable for the option or the widget
#	variable.
#
proc Widget::which {path args} {
    switch -- [llength $args] {
	1 {
	    set type -option;
	    set name [lindex $args 0];
	}
	2 {
	    set type [lindex $args 0];
	    set name [lindex $args 1];
	}
	default {
	    return -code error "incorrect number of arguments";
	}
    }

    variable _class;
    set class $_class($path);

    switch -- $type {
	-option {
	    upvar 0 ${class}::$path:opt pathopt;

	    if { ![info exists pathopt($option)] } {
		error "unable to find variable for option \"$option\"";
	    }

	    return ::Widget::${class}::${path}:opt(${name});
	}
	-variable {
	    return ${class}::${path}:${name};
	}
    }
}


# Widget::varForOption --
#
#	Retrieve a fully qualified variable name for the option specified.
#	If the option is not one for which a variable exists, throw an error 
#	(ie, those options that map directly to widget options) Superseded by
#       widget::which.
#
# Arguments:
#	path	megawidget to get an option var for.
#	option	option to get a var for.
#
# Results:
#	varname	name of the variable, fully qualified, suitable for tracing.

proc Widget::varForOption {path option} {
    return [::Widget::which $path -option $option];
}

# Widget::getVariable --
#
#       Get a variable from within the namespace of the widget.
#
# Arguments:
#	path		Megawidget to get the variable for.
#	varName		The variable name to retrieve.
#       newVarName	The variable name to refer to in the calling proc.
#
# Results:
#	Creates a reference to newVarName in the calling proc.
proc Widget::getVariable { path varName {newVarName ""} } {
    variable _class
    set class $_class($path)
    if {![string length $newVarName]} { set newVarName $varName }
    uplevel 1 [list ::upvar \#0 ${class}::$path:$varName $newVarName]
}

# Widget::options --
#
#       Return a key-value list of options for a widget.  This can
#       be used to serialize the options of a widget and pass them
#       on to a new widget with the same options.
#
# Arguments:
#	path		Widget to get the options for.
#	args		A list of options.  If empty, all options are returned.
#
# Results:
#	Returns list of options as: -option value -option value ...
proc Widget::options { path args } {
    if {[llength $args]} {
        foreach option $args {
            lappend options [_get_configure $path $option]
        }
    } else {
        set options [_get_configure $path {}]
    }

    set result [list]
    foreach list $options {
        if {[llength $list] < 5} { continue }
        lappend result [lindex $list 0] [lindex $list end]
    }
    return $result
}


# Widget::getOption --
#
#	Given a list of widgets, determine which option value to use.
#	The widgets are given to the command in order of highest to
#	lowest.  Starting with the lowest widget, whichever one does
#	not match the default option value is returned as the value.
#	If all the widgets are default, we return the highest widget's
#	value.
#
# Arguments:
#	option		The option to check.
#	default		The default value.  If any widget in the list
#			does not match this default, its value is used.
#	args		A list of widgets.
#
# Results:
#	Returns the value of the given option to use.
#
proc Widget::getOption { option default args } {
    for {set i [expr [llength $args] -1]} {$i >= 0} {incr i -1} {
	set widget [lindex $args $i]
	set value  [Widget::cget $widget $option]
	if {[string equal $value $default]} { continue }
	return $value
    }
    return $value
}


proc Widget::nextIndex { path node } {
    Widget::getVariable $path autoIndex
    if {![info exists autoIndex]} { set autoIndex -1 }
    return [string map [list #auto [incr autoIndex]] $node]
}


proc Widget::exists { path } {
    variable _class
    return [info exists _class($path)]
}

proc Widget::theme {{bool {}}} {
    # Private, *experimental* API that may change at any time - JH
    variable _theme
    if {[llength [info level 0]] == 2} {
	# set theme-ability
	if {[catch {package require Tk 8.5a6}]
	    && [catch {package require tile 0.6}]
	    && [catch {package require tile 1}]} {
	    return -code error "BWidget's theming requires tile 0.6+"
	} else {
	    catch {style default BWSlim.Toolbutton -padding 0}
	}
	set _theme [string is true -strict $bool]
    }
    return $_theme
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/widget.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
# ----------------------------------------------------------------------------
#  widget.tcl
#  This file is part of Unifix BWidget Toolkit
#  $Id: widget.tcl,v 1.35.2.1 2011/11/14 14:33:29 oehhar Exp $
# ----------------------------------------------------------------------------
#  Index of commands:
#     - Widget::tkinclude
#     - Widget::bwinclude
#     - Widget::declare
#     - Widget::addmap
#     - Widget::init
#     - Widget::destroy
#     - Widget::setoption
#     - Widget::configure
#     - Widget::cget
#     - Widget::subcget
#     - Widget::hasChanged
#     - Widget::options
#     - Widget::_get_tkwidget_options
#     - Widget::_test_tkresource
#     - Widget::_test_bwresource
#     - Widget::_test_synonym
#     - Widget::_test_string
#     - Widget::_test_flag
#     - Widget::_test_enum
#     - Widget::_test_int
#     - Widget::_test_boolean
# ----------------------------------------------------------------------------
# Each megawidget gets a namespace of the same name inside the Widget namespace
# Each of these has an array opt, which contains information about the 
# megawidget options.  It maps megawidget options to a list with this format:
#     {optionType defaultValue isReadonly {additionalOptionalInfo}}
# Option types and their additional optional info are:
#	TkResource	{genericTkWidget genericTkWidgetOptionName}
#	BwResource	{nothing}
#	Enum		{list of enumeration values}
#	Int		{Boundary information}
#	Boolean		{nothing}
#	String		{nothing}
#	Flag		{string of valid flag characters}
#	Synonym		{nothing}
#	Color		{nothing}
#
# Next, each namespace has an array map, which maps class options to their
# component widget options:
#	map(-foreground) => {.e -foreground .f -foreground}
#
# Each has an array ${path}:opt, which contains the value of each megawidget
# option for a particular instance $path of the megawidget, and an array
# ${path}:mod, which stores the "changed" status of configuration options.

# Steps for creating a bwidget megawidget:
# 1. parse args to extract subwidget spec
# 2. Create frame with appropriate class and command line options
# 3. Get initialization options from optionDB, using frame
# 4. create subwidgets

# Uses newer string operations
package require Tcl 8.1.1

namespace eval Widget {
    variable _optiontype
    variable _class
    variable _tk_widget

    # This controls whether we try to use themed widgets from Tile
    variable _theme 0

    variable _aqua [expr {($::tcl_version >= 8.4) &&
			  [string equal [tk windowingsystem] "aqua"]}]

    array set _optiontype {
        TkResource Widget::_test_tkresource
        BwResource Widget::_test_bwresource
        Enum       Widget::_test_enum
        Int        Widget::_test_int
        Boolean    Widget::_test_boolean
        String     Widget::_test_string
        Flag       Widget::_test_flag
        Synonym    Widget::_test_synonym
        Color      Widget::_test_color
        Padding    Widget::_test_padding
    }

    proc use {} {}
}


# ----------------------------------------------------------------------------
#  Command Widget::tkinclude
#     Includes tk widget resources to BWidget widget.
#  class      class name of the BWidget
#  tkwidget   tk widget to include
#  subpath    subpath to configure
#  args       additionnal args for included options
# ----------------------------------------------------------------------------
proc Widget::tkinclude { class tkwidget subpath args } {
    foreach {cmd lopt} $args {
        # cmd can be
        #   include      options to include            lopt = {opt ...}
        #   remove       options to remove             lopt = {opt ...}
        #   rename       options to rename             lopt = {opt newopt ...}
        #   prefix       options to prefix             lopt = {pref opt opt ..}
        #   initialize   set default value for options lopt = {opt value ...}
        #   readonly     set readonly flag for options lopt = {opt flag ...}
        switch -- $cmd {
            remove {
                foreach option $lopt {
                    set remove($option) 1
                }
            }
            include {
                foreach option $lopt {
                    set include($option) 1
                }
            }
            prefix {
                set prefix [lindex $lopt 0]
                foreach option [lrange $lopt 1 end] {
                    set rename($option) "-$prefix[string range $option 1 end]"
                }
            }
            rename     -
            readonly   -
            initialize {
                array set $cmd $lopt
            }
            default {
                return -code error "invalid argument \"$cmd\""
            }
        }
    }

    namespace eval $class {}
    upvar 0 ${class}::opt classopt
    upvar 0 ${class}::map classmap
    upvar 0 ${class}::map$subpath submap
    upvar 0 ${class}::optionExports exports

    # create resources informations from tk widget resources
    foreach optdesc [_get_tkwidget_options $tkwidget] {
        set option [lindex $optdesc 0]
        if { (![info exists include] || [info exists include($option)]) &&
             ![info exists remove($option)] } {
            if { [llength $optdesc] == 3 } {
                # option is a synonym
                set syn [lindex $optdesc 1]
                if { ![info exists remove($syn)] } {
                    # original option is not removed
                    if { [info exists rename($syn)] } {
                        set classopt($option) [list Synonym $rename($syn)]
                    } else {
                        set classopt($option) [list Synonym $syn]
                    }
                }
            } else {
                if { [info exists rename($option)] } {
                    set realopt $option
                    set option  $rename($option)
                } else {
                    set realopt $option
                }
                if { [info exists initialize($option)] } {
                    set value $initialize($option)
                } else {
                    set value [lindex $optdesc 1]
                }
                if { [info exists readonly($option)] } {
                    set ro $readonly($option)
                } else {
                    set ro 0
                }
                set classopt($option) \
			[list TkResource $value $ro [list $tkwidget $realopt]]

		# Add an option database entry for this option
		set optionDbName ".[lindex [_configure_option $realopt ""] 0]"
		if { ![string equal $subpath ":cmd"] } {
		    set optionDbName "$subpath$optionDbName"
		}
		option add *${class}$optionDbName $value widgetDefault
		lappend exports($option) "$optionDbName"

		# Store the forward and backward mappings for this
		# option <-> realoption pair
                lappend classmap($option) $subpath "" $realopt
		set submap($realopt) $option
            }
        }
    }
}


# ----------------------------------------------------------------------------
#  Command Widget::bwinclude
#     Includes BWidget resources to BWidget widget.
#  class    class name of the BWidget
#  subclass BWidget class to include
#  subpath  subpath to configure
#  args     additionnal args for included options
# ----------------------------------------------------------------------------
proc Widget::bwinclude { class subclass subpath args } {
    foreach {cmd lopt} $args {
        # cmd can be
        #   include      options to include            lopt = {opt ...}
        #   remove       options to remove             lopt = {opt ...}
        #   rename       options to rename             lopt = {opt newopt ...}
        #   prefix       options to prefix             lopt = {prefix opt opt ...}
        #   initialize   set default value for options lopt = {opt value ...}
        #   readonly     set readonly flag for options lopt = {opt flag ...}
        switch -- $cmd {
            remove {
                foreach option $lopt {
                    set remove($option) 1
                }
            }
            include {
                foreach option $lopt {
                    set include($option) 1
                }
            }
            prefix {
                set prefix [lindex $lopt 0]
                foreach option [lrange $lopt 1 end] {
                    set rename($option) "-$prefix[string range $option 1 end]"
                }
            }
            rename     -
            readonly   -
            initialize {
                array set $cmd $lopt
            }
            default {
                return -code error "invalid argument \"$cmd\""
            }
        }
    }

    namespace eval $class {}
    upvar 0 ${class}::opt classopt
    upvar 0 ${class}::map classmap
    upvar 0 ${class}::map$subpath submap
    upvar 0 ${class}::optionExports exports
    upvar 0 ${subclass}::opt subclassopt
    upvar 0 ${subclass}::optionExports subexports

    # create resources informations from BWidget resources
    foreach {option optdesc} [array get subclassopt] {
	set subOption $option
        if { (![info exists include] || [info exists include($option)]) &&
             ![info exists remove($option)] } {
            set type [lindex $optdesc 0]
            if { [string equal $type "Synonym"] } {
                # option is a synonym
                set syn [lindex $optdesc 1]
                if { ![info exists remove($syn)] } {
                    if { [info exists rename($syn)] } {
                        set classopt($option) [list Synonym $rename($syn)]
                    } else {
                        set classopt($option) [list Synonym $syn]
                    }
                }
            } else {
                if { [info exists rename($option)] } {
                    set realopt $option
                    set option  $rename($option)
                } else {
                    set realopt $option
                }
                if { [info exists initialize($option)] } {
                    set value $initialize($option)
                } else {
                    set value [lindex $optdesc 1]
                }
                if { [info exists readonly($option)] } {
                    set ro $readonly($option)
                } else {
                    set ro [lindex $optdesc 2]
                }
                set classopt($option) \
			[list $type $value $ro [lindex $optdesc 3]]

		# Add an option database entry for this option
		foreach optionDbName $subexports($subOption) {
		    if { ![string equal $subpath ":cmd"] } {
			set optionDbName "$subpath$optionDbName"
		    }
		    # Only add the option db entry if we are overriding the
		    # normal widget default
		    if { [info exists initialize($option)] } {
			option add *${class}$optionDbName $value \
				widgetDefault
		    }
		    lappend exports($option) "$optionDbName"
		}

		# Store the forward and backward mappings for this
		# option <-> realoption pair
                lappend classmap($option) $subpath $subclass $realopt
		set submap($realopt) $option
            }
        }
    }
}


# ----------------------------------------------------------------------------
#  Command Widget::declare
#    Declares new options to BWidget class.
# ----------------------------------------------------------------------------
proc Widget::declare { class optlist } {
    variable _optiontype

    namespace eval $class {}
    upvar 0 ${class}::opt classopt
    upvar 0 ${class}::optionExports exports
    upvar 0 ${class}::optionClass optionClass

    foreach optdesc $optlist {
        set option  [lindex $optdesc 0]
        set optdesc [lrange $optdesc 1 end]
        set type    [lindex $optdesc 0]

        if { ![info exists _optiontype($type)] } {
            # invalid resource type
            return -code error "invalid option type \"$type\""
        }

        if { [string equal $type "Synonym"] } {
            # test existence of synonym option
            set syn [lindex $optdesc 1]
            if { ![info exists classopt($syn)] } {
                return -code error "unknow option \"$syn\" for Synonym \"$option\""
            }
            set classopt($option) [list Synonym $syn]
            continue
        }

        # all other resource may have default value, readonly flag and
        # optional arg depending on type
        set value [lindex $optdesc 1]
        set ro    [lindex $optdesc 2]
        set arg   [lindex $optdesc 3]

        if { [string equal $type "BwResource"] } {
            # We don't keep BwResource. We simplify to type of sub BWidget
            set subclass    [lindex $arg 0]
            set realopt     [lindex $arg 1]
            if { ![string length $realopt] } {
                set realopt $option
            }

            upvar 0 ${subclass}::opt subclassopt
            if { ![info exists subclassopt($realopt)] } {
                return -code error "unknow option \"$realopt\""
            }
            set suboptdesc $subclassopt($realopt)
            if { $value == "" } {
                # We initialize default value
                set value [lindex $suboptdesc 1]
            }
            set type [lindex $suboptdesc 0]
            set ro   [lindex $suboptdesc 2]
            set arg  [lindex $suboptdesc 3]
	    set optionDbName ".[lindex [_configure_option $option ""] 0]"
	    option add *${class}${optionDbName} $value widgetDefault
	    set exports($option) $optionDbName
            set classopt($option) [list $type $value $ro $arg]
            continue
        }

        # retreive default value for TkResource
        if { [string equal $type "TkResource"] } {
            set tkwidget [lindex $arg 0]
            set realopt  [lindex $arg 1]
            if { ![string length $realopt] } {
                set realopt $option
            }
            set tkoptions [_get_tkwidget_options $tkwidget]
            set ind [lsearch $tkoptions [list $realopt *]]
            set optdesc [lindex $tkoptions $ind];
            set tkoptions [_get_tkwidget_options $tkwidget]
            if { ![string length $value] } {
                # We initialize default value
                set value [lindex $optdesc end]
            }
	    set optionDbName ".[lindex [_configure_option $option ""] 0]"
	    option add *${class}${optionDbName} $value widgetDefault
	    set exports($option) $optionDbName
            set classopt($option) [list TkResource $value $ro \
		    [list $tkwidget $realopt]]
	    set optionClass($option) [lindex $optdesc 1]
            continue
        }

	set optionDbName ".[lindex [_configure_option $option ""] 0]"
	option add *${class}${optionDbName} $value widgetDefault
	set exports($option) $optionDbName
        # for any other resource type, we keep original optdesc
        set classopt($option) [list $type $value $ro $arg]
    }
}


proc Widget::define { class filename args } {
    variable ::BWidget::use
    set use($class)      $args
    set use($class,file) $filename
    lappend use(classes) $class

    if {[set x [lsearch -exact $args "-classonly"]] > -1} {
	set args [lreplace $args $x $x]
    } else {
	interp alias {} ::${class} {} ${class}::create
	proc ::${class}::use {} {}

	bind $class <Destroy> [list Widget::destroy %W]
    }

    foreach class $args { ${class}::use }
}


proc Widget::create { class path {rename 1} } {
    if {$rename} { rename $path ::$path:cmd }
    proc ::$path { cmd args } \
    	[subst {return \[eval \[linsert \$args 0 ${class}::\$cmd [list $path]\]\]}]
    return $path
}


# ----------------------------------------------------------------------------
#  Command Widget::addmap
# ----------------------------------------------------------------------------
proc Widget::addmap { class subclass subpath options } {
    upvar 0 ${class}::opt classopt
    upvar 0 ${class}::optionExports exports
    upvar 0 ${class}::map classmap
    upvar 0 ${class}::map$subpath submap

    foreach {option realopt} $options {
        if { ![string length $realopt] } {
            set realopt $option
        }
	set val [lindex $classopt($option) 1]
	set optDb ".[lindex [_configure_option $realopt ""] 0]"
	if { ![string equal $subpath ":cmd"] } {
	    set optDb "$subpath$optDb"
	}
	option add *${class}${optDb} $val widgetDefault
	lappend exports($option) $optDb
	# Store the forward and backward mappings for this
	# option <-> realoption pair
        lappend classmap($option) $subpath $subclass $realopt
	set submap($realopt) $option
    }
}


# ----------------------------------------------------------------------------
#  Command Widget::init
# ----------------------------------------------------------------------------
proc Widget::init { class path options } {
    variable _inuse
    variable _class
    variable _optiontype

    upvar 0 ${class}::opt classopt
    upvar 0 ${class}::$path:opt  pathopt
    upvar 0 ${class}::$path:mod  pathmod
    upvar 0 ${class}::map classmap
    upvar 0 ${class}::$path:init pathinit

    if { [info exists pathopt] } {
	unset pathopt
    }
    if { [info exists pathmod] } {
	unset pathmod
    }
    # We prefer to use the actual widget for option db queries, but if it
    # doesn't exist yet, do the next best thing:  create a widget of the
    # same class and use that.
    set fpath $path
    set rdbclass [string map [list :: ""] $class]
    if { ![winfo exists $path] } {
	set fpath ".#BWidget.#Class#$class"
	# encapsulation frame to not pollute '.' childspace
	if {![winfo exists ".#BWidget"]} { frame ".#BWidget" }
	if { ![winfo exists $fpath] } {
	    frame $fpath -class $rdbclass
	}
    }
    foreach {option optdesc} [array get classopt] {
        set pathmod($option) 0
	if { [info exists classmap($option)] } {
	    continue
	}
        set type [lindex $optdesc 0]
        if { [string equal $type "Synonym"] } {
	    continue
        }
        if { [string equal $type "TkResource"] } {
            set alt [lindex [lindex $optdesc 3] 1]
        } else {
            set alt ""
        }
        set optdb [lindex [_configure_option $option $alt] 0]
        set def   [option get $fpath $optdb $rdbclass]
        if { [string length $def] } {
            set pathopt($option) $def
        } else {
            set pathopt($option) [lindex $optdesc 1]
        }
    }

    if {![info exists _inuse($class)]} { set _inuse($class) 0 }
    incr _inuse($class)

    set _class($path) $class
    foreach {option value} $options {
        if { ![info exists classopt($option)] } {
            unset pathopt
            unset pathmod
            return -code error "unknown option \"$option\""
        }
        set optdesc $classopt($option)
        set type    [lindex $optdesc 0]
        if { [string equal $type "Synonym"] } {
            set option  [lindex $optdesc 1]
            set optdesc $classopt($option)
            set type    [lindex $optdesc 0]
        }
        # this may fail if a wrong enum element was used
        if {[catch {
             $_optiontype($type) $option $value [lindex $optdesc 3]
        } msg]} {
            if {[info exists pathopt]} {
                unset pathopt
            }
            unset pathmod
            return -code error $msg
        }
        set pathopt($option) $msg
	set pathinit($option) $pathopt($option)
    }
}

# Bastien Chevreux (bach@mwgdna.com)
#
# copyinit performs basically the same job as init, but it uses a
#  existing template to initialize its values. So, first a perferct copy
#  from the template is made just to be altered by any existing options
#  afterwards.
# But this still saves time as the first initialization parsing block is
#  skipped.
# As additional bonus, items that differ in just a few options can be
#  initialized faster by leaving out the options that are equal.

# This function is currently used only by ListBox::multipleinsert, but other
#  calls should follow :)

# ----------------------------------------------------------------------------
#  Command Widget::copyinit
# ----------------------------------------------------------------------------
proc Widget::copyinit { class templatepath path options } {
    variable _class
    variable _optiontype
    upvar 0 ${class}::opt classopt \
	    ${class}::$path:opt	 pathopt \
	    ${class}::$path:mod	 pathmod \
	    ${class}::$path:init pathinit \
	    ${class}::$templatepath:opt	  templatepathopt \
	    ${class}::$templatepath:mod	  templatepathmod \
	    ${class}::$templatepath:init  templatepathinit

    if { [info exists pathopt] } {
	unset pathopt
    }
    if { [info exists pathmod] } {
	unset pathmod
    }

    # We use the template widget for option db copying, but it has to exist!
    array set pathmod  [array get templatepathmod]
    array set pathopt  [array get templatepathopt]
    array set pathinit [array get templatepathinit]

    set _class($path) $class
    foreach {option value} $options {
	if { ![info exists classopt($option)] } {
	    unset pathopt
	    unset pathmod
	    return -code error "unknown option \"$option\""
	}
	set optdesc $classopt($option)
	set type    [lindex $optdesc 0]
	if { [string equal $type "Synonym"] } {
	    set option	[lindex $optdesc 1]
	    set optdesc $classopt($option)
	    set type	[lindex $optdesc 0]
	}
	set pathopt($option) [$_optiontype($type) $option $value [lindex $optdesc 3]]
	set pathinit($option) $pathopt($option)
    }
}

# Widget::parseArgs --
#
#	Given a widget class and a command-line spec, cannonize and validate
#	the given options, and return a keyed list consisting of the 
#	component widget and its masked portion of the command-line spec, and
#	one extra entry consisting of the portion corresponding to the 
#	megawidget itself.
#
# Arguments:
#	class	widget class to parse for.
#	options	command-line spec
#
# Results:
#	result	keyed list of portions of the megawidget and that segment of
#		the command line in which that portion is interested.

proc Widget::parseArgs {class options} {
    variable _optiontype
    upvar 0 ${class}::opt classopt
    upvar 0 ${class}::map classmap
    
    foreach {option val} $options {
	if { ![info exists classopt($option)] } {
	    error "unknown option \"$option\""
	}
        set optdesc $classopt($option)
        set type    [lindex $optdesc 0]
        if { [string equal $type "Synonym"] } {
            set option  [lindex $optdesc 1]
            set optdesc $classopt($option)
            set type    [lindex $optdesc 0]
        }
	if { [string equal $type "TkResource"] } {
	    # Make sure that the widget used for this TkResource exists
	    Widget::_get_tkwidget_options [lindex [lindex $optdesc 3] 0]
	}
	set val [$_optiontype($type) $option $val [lindex $optdesc 3]]
		
	if { [info exists classmap($option)] } {
	    foreach {subpath subclass realopt} $classmap($option) {
		lappend maps($subpath) $realopt $val
	    }
	} else {
	    lappend maps($class) $option $val
	}
    }
    return [array get maps]
}

# Widget::initFromODB --
#
#	Initialize a megawidgets options with information from the option
#	database and from the command-line arguments given.
#
# Arguments:
#	class	class of the widget.
#	path	path of the widget -- should already exist.
#	options	command-line arguments.
#
# Results:
#	None.

proc Widget::initFromODB {class path options} {
    variable _inuse
    variable _class

    upvar 0 ${class}::$path:opt  pathopt
    upvar 0 ${class}::$path:mod  pathmod
    upvar 0 ${class}::map classmap

    if { [info exists pathopt] } {
	unset pathopt
    }
    if { [info exists pathmod] } {
	unset pathmod
    }
    # We prefer to use the actual widget for option db queries, but if it
    # doesn't exist yet, do the next best thing:  create a widget of the
    # same class and use that.
    set fpath [_get_window $class $path]
    set rdbclass [string map [list :: ""] $class]
    if { ![winfo exists $path] } {
	set fpath ".#BWidget.#Class#$class"
	# encapsulation frame to not pollute '.' childspace
	if {![winfo exists ".#BWidget"]} { frame ".#BWidget" }
	if { ![winfo exists $fpath] } {
	    frame $fpath -class $rdbclass
	}
    }

    foreach {option optdesc} [array get ${class}::opt] {
        set pathmod($option) 0
	if { [info exists classmap($option)] } {
	    continue
	}
        set type [lindex $optdesc 0]
        if { [string equal $type "Synonym"] } {
	    continue
        }
	if { [string equal $type "TkResource"] } {
            set alt [lindex [lindex $optdesc 3] 1]
        } else {
            set alt ""
        }
        set optdb [lindex [_configure_option $option $alt] 0]
        set def   [option get $fpath $optdb $rdbclass]
        if { [string length $def] } {
            set pathopt($option) $def
        } else {
            set pathopt($option) [lindex $optdesc 1]
        }
    }

    if {![info exists _inuse($class)]} { set _inuse($class) 0 }
    incr _inuse($class)

    set _class($path) $class
    array set pathopt $options
}



# ----------------------------------------------------------------------------
#  Command Widget::destroy
# ----------------------------------------------------------------------------
proc Widget::destroy { path } {
    variable _class
    variable _inuse

    if {![info exists _class($path)]} { return }

    set class $_class($path)
    upvar 0 ${class}::$path:opt pathopt
    upvar 0 ${class}::$path:mod pathmod
    upvar 0 ${class}::$path:init pathinit

    if {[info exists _inuse($class)]} { incr _inuse($class) -1 }

    if {[info exists pathopt]} {
        unset pathopt
    }
    if {[info exists pathmod]} {
        unset pathmod
    }
    if {[info exists pathinit]} {
        unset pathinit
    }

    if {![string equal [info commands $path] ""]} { rename $path "" }

    ## Unset any variables used in this widget.
    foreach var [info vars ::${class}::$path:*] { unset $var }

    unset _class($path)
}


# ----------------------------------------------------------------------------
#  Command Widget::configure
# ----------------------------------------------------------------------------
proc Widget::configure { path options } {
    set len [llength $options]
    if { $len <= 1 } {
        return [_get_configure $path $options]
    } elseif { $len % 2 == 1 } {
        return -code error "incorrect number of arguments"
    }

    variable _class
    variable _optiontype

    set class $_class($path)
    upvar 0 ${class}::opt  classopt
    upvar 0 ${class}::map  classmap
    upvar 0 ${class}::$path:opt pathopt
    upvar 0 ${class}::$path:mod pathmod

    set window [_get_window $class $path]
    foreach {option value} $options {
        if { ![info exists classopt($option)] } {
            return -code error "unknown option \"$option\""
        }
        set optdesc $classopt($option)
        set type    [lindex $optdesc 0]
        if { [string equal $type "Synonym"] } {
            set option  [lindex $optdesc 1]
            set optdesc $classopt($option)
            set type    [lindex $optdesc 0]
        }
        if { ![lindex $optdesc 2] } {
            set newval [$_optiontype($type) $option $value [lindex $optdesc 3]]
            if { [info exists classmap($option)] } {
		set window [_get_window $class $window]
                foreach {subpath subclass realopt} $classmap($option) {
                    # Interpretation of special pointers:
                    # | subclass | subpath | widget           | path           | class   |
                    # +----------+---------+------------------+----------------+-context-+
                    # | :cmd     | :cmd    | herited widget   | window:cmd     |window   |
                    # | :cmd     | *       | subwidget        | window.subpath | window  |
                    # | ""       | :cmd    | herited widget   | window:cmd     | window  |
                    # | ""       | *       | own              | window         | window  |
                    # | *        | :cmd    | own              | window         | current |
                    # | *        | *       | subwidget        | window.subpath | current |
                    if { [string length $subclass] && ! [string equal $subclass ":cmd"] } {
                        if { [string equal $subpath ":cmd"] } {
                            set subpath ""
                        }
                        set curval [${subclass}::cget $window$subpath $realopt]
                        ${subclass}::configure $window$subpath $realopt $newval
                    } else {
                        set curval [$window$subpath cget $realopt]
                        $window$subpath configure $realopt $newval
                    }
                }
            } else {
		set curval $pathopt($option)
		set pathopt($option) $newval
	    }
	    set pathmod($option) [expr {![string equal $newval $curval]}]
        }
    }

    return {}
}


# ----------------------------------------------------------------------------
#  Command Widget::cget
# ----------------------------------------------------------------------------
proc Widget::cget { path option } {
    variable _class
    if { ![info exists _class($path)] } {
        return -code error "unknown widget $path"
    }

    set class $_class($path)
    if { ![info exists ${class}::opt($option)] } {
        return -code error "unknown option \"$option\""
    }

    set optdesc [set ${class}::opt($option)]
    set type    [lindex $optdesc 0]
    if {[string equal $type "Synonym"]} {
        set option [lindex $optdesc 1]
    }

    if { [info exists ${class}::map($option)] } {
	foreach {subpath subclass realopt} [set ${class}::map($option)] {break}
	set path "[_get_window $class $path]$subpath"
	return [$path cget $realopt]
    }
    upvar 0 ${class}::$path:opt pathopt
    set pathopt($option)
}


# ----------------------------------------------------------------------------
#  Command Widget::subcget
# ----------------------------------------------------------------------------
proc Widget::subcget { path subwidget } {
    variable _class
    set class $_class($path)
    upvar 0 ${class}::$path:opt pathopt
    upvar 0 ${class}::map$subwidget submap
    upvar 0 ${class}::$path:init pathinit

    set result {}
    foreach realopt [array names submap] {
	if { [info exists pathinit($submap($realopt))] } {
	    lappend result $realopt $pathopt($submap($realopt))
	}
    }
    return $result
}


# ----------------------------------------------------------------------------
#  Command Widget::hasChanged
# ----------------------------------------------------------------------------
proc Widget::hasChanged { path option pvalue } {
    variable _class
    upvar $pvalue value
    set class $_class($path)
    upvar 0 ${class}::$path:mod pathmod

    set value   [Widget::cget $path $option]
    set result  $pathmod($option)
    set pathmod($option) 0

    return $result
}

proc Widget::hasChangedX { path option args } {
    variable _class
    set class $_class($path)
    upvar 0 ${class}::$path:mod pathmod

    set result  $pathmod($option)
    set pathmod($option) 0
    foreach option $args {
	lappend result $pathmod($option)
	set pathmod($option) 0
    }

    set result
}


# ----------------------------------------------------------------------------
#  Command Widget::setoption
# ----------------------------------------------------------------------------
proc Widget::setoption { path option value } {
#    variable _class

#    set class $_class($path)
#    upvar 0 ${class}::$path:opt pathopt

#    set pathopt($option) $value
    Widget::configure $path [list $option $value]
}


# ----------------------------------------------------------------------------
#  Command Widget::getoption
# ----------------------------------------------------------------------------
proc Widget::getoption { path option } {
#    set class $::Widget::_class($path)
#    upvar 0 ${class}::$path:opt pathopt

#    return $pathopt($option)
    return [Widget::cget $path $option]
}

# Widget::getMegawidgetOption --
#
#	Bypass the superfluous checks in cget and just directly peer at the
#	widget's data space.  This is much more fragile than cget, so it 
#	should only be used with great care, in places where speed is critical.
#
# Arguments:
#	path	widget to lookup options for.
#	option	option to retrieve.
#
# Results:
#	value	option value.

proc Widget::getMegawidgetOption {path option} {
    variable _class
    set class $_class($path)
    upvar 0 ${class}::${path}:opt pathopt
    set pathopt($option)
}

# Widget::setMegawidgetOption --
#
#	Bypass the superfluous checks in cget and just directly poke at the
#	widget's data space.  This is much more fragile than configure, so it 
#	should only be used with great care, in places where speed is critical.
#
# Arguments:
#	path	widget to lookup options for.
#	option	option to retrieve.
#	value	option value.
#
# Results:
#	value	option value.

proc Widget::setMegawidgetOption {path option value} {
    variable _class
    set class $_class($path)
    upvar 0 ${class}::${path}:opt pathopt
    set pathopt($option) $value
}

# ----------------------------------------------------------------------------
#  Command Widget::_get_window
#  returns the window corresponding to widget path
# ----------------------------------------------------------------------------
proc Widget::_get_window { class path } {
    set idx [string last "#" $path]
    if { $idx != -1 && [string equal [string range $path [expr {$idx+1}] end] $class] } {
        return [string range $path 0 [expr {$idx-1}]]
    } else {
        return $path
    }
}


# ----------------------------------------------------------------------------
#  Command Widget::_get_configure
#  returns the configuration list of options
#  (as tk widget do - [$w configure ?option?])
# ----------------------------------------------------------------------------
proc Widget::_get_configure { path options } {
    variable _class

    set class $_class($path)
    upvar 0 ${class}::opt classopt
    upvar 0 ${class}::map classmap
    upvar 0 ${class}::$path:opt pathopt
    upvar 0 ${class}::$path:mod pathmod

    set len [llength $options]
    if { !$len } {
        set result {}
        foreach option [lsort [array names classopt]] {
            set optdesc $classopt($option)
            set type    [lindex $optdesc 0]
            if { [string equal $type "Synonym"] } {
                set syn     $option
                set option  [lindex $optdesc 1]
                set optdesc $classopt($option)
                set type    [lindex $optdesc 0]
            } else {
                set syn ""
            }
            if { [string equal $type "TkResource"] } {
                set alt [lindex [lindex $optdesc 3] 1]
            } else {
                set alt ""
            }
            set res [_configure_option $option $alt]
            if { $syn == "" } {
                lappend result [concat $option $res [list [lindex $optdesc 1]] [list [cget $path $option]]]
            } else {
                lappend result [list $syn [lindex $res 0]]
            }
        }
        return $result
    } elseif { $len == 1 } {
        set option  [lindex $options 0]
        if { ![info exists classopt($option)] } {
            return -code error "unknown option \"$option\""
        }
        set optdesc $classopt($option)
        set type    [lindex $optdesc 0]
        if { [string equal $type "Synonym"] } {
            set option  [lindex $optdesc 1]
            set optdesc $classopt($option)
            set type    [lindex $optdesc 0]
        }
        if { [string equal $type "TkResource"] } {
            set alt [lindex [lindex $optdesc 3] 1]
        } else {
            set alt ""
        }
        set res [_configure_option $option $alt]
        return [concat $option $res [list [lindex $optdesc 1]] [list [cget $path $option]]]
    }
}


# ----------------------------------------------------------------------------
#  Command Widget::_configure_option
# ----------------------------------------------------------------------------
proc Widget::_configure_option { option altopt } {
    variable _optiondb
    variable _optionclass

    if { [info exists _optiondb($option)] } {
        set optdb $_optiondb($option)
    } else {
        set optdb [string range $option 1 end]
    }
    if { [info exists _optionclass($option)] } {
        set optclass $_optionclass($option)
    } elseif { [string length $altopt] } {
        if { [info exists _optionclass($altopt)] } {
            set optclass $_optionclass($altopt)
        } else {
            set optclass [string range $altopt 1 end]
        }
    } else {
        set optclass [string range $option 1 end]
    }
    return [list $optdb $optclass]
}

# ----------------------------------------------------------------------------
#  Command Widget::_make_tk_widget_name
# ----------------------------------------------------------------------------
# Before, the widget meta name was build as: ".#BWidget.#$tkwidget"
# This does not work for ttk widgets, as they have an "::" in their name.
# Thus replace any "::" by "__" will do the job.
proc Widget::_make_tk_widget_name { tkwidget } {
    set pos 0
    for {set pos 0} {0 <= [set pos [string first "::" $tkwidget $pos]]} {incr pos} {
	set tkwidget [string range $tkwidget 0 [expr {$pos-1}]]__[string range $tkwidget [expr {$pos+2}] end]
    }
    return ".#BWidget.#$tkwidget"
}

# ----------------------------------------------------------------------------
#  Command Widget::_get_tkwidget_options
# ----------------------------------------------------------------------------
proc Widget::_get_tkwidget_options { tkwidget } {
    variable _tk_widget
    variable _optiondb
    variable _optionclass

    set widget [_make_tk_widget_name $tkwidget]
    # encapsulation frame to not pollute '.' childspace
    if {![winfo exists ".#BWidget"]} { frame ".#BWidget" }
    if { ![winfo exists $widget] || ![info exists _tk_widget($tkwidget)] } {
	set widget [$tkwidget $widget]
	# JDC: Withdraw toplevels, otherwise visible
	if {[string equal $tkwidget "toplevel"]} {
	    wm withdraw $widget
	}
	set config [$widget configure]
	foreach optlist $config {
	    set opt [lindex $optlist 0]
	    if { [llength $optlist] == 2 } {
		set refsyn [lindex $optlist 1]
		# search for class
		set idx [lsearch $config [list * $refsyn *]]
		if { $idx == -1 } {
		    if { [string index $refsyn 0] == "-" } {
			# search for option (tk8.1b1 bug)
			set idx [lsearch $config [list $refsyn * *]]
		    } else {
			# last resort
			set idx [lsearch $config [list -[string tolower $refsyn] * *]]
		    }
		    if { $idx == -1 } {
			# fed up with "can't read classopt()"
			return -code error "can't find option of synonym $opt"
		    }
		}
		set syn [lindex [lindex $config $idx] 0]
		# JDC: used 4 (was 3) to get def from optiondb
		set def [lindex [lindex $config $idx] 4]
		lappend _tk_widget($tkwidget) [list $opt $syn $def]
	    } else {
		# JDC: used 4 (was 3) to get def from optiondb
		set def [lindex $optlist 4]
		lappend _tk_widget($tkwidget) [list $opt $def]
		set _optiondb($opt)    [lindex $optlist 1]
		set _optionclass($opt) [lindex $optlist 2]
	    }
	}
    }
    return $_tk_widget($tkwidget)
}


# ----------------------------------------------------------------------------
#  Command Widget::_test_tkresource
# ----------------------------------------------------------------------------
proc Widget::_test_tkresource { option value arg } {
#    set tkwidget [lindex $arg 0]
#    set realopt  [lindex $arg 1]
    foreach {tkwidget realopt} $arg break
    set path     [_make_tk_widget_name $tkwidget]
    set old      [$path cget $realopt]
    $path configure $realopt $value
    set res      [$path cget $realopt]
    $path configure $realopt $old

    return $res
}


# ----------------------------------------------------------------------------
#  Command Widget::_test_bwresource
# ----------------------------------------------------------------------------
proc Widget::_test_bwresource { option value arg } {
    return -code error "bad option type BwResource in widget"
}


# ----------------------------------------------------------------------------
#  Command Widget::_test_synonym
# ----------------------------------------------------------------------------
proc Widget::_test_synonym { option value arg } {
    return -code error "bad option type Synonym in widget"
}

# ----------------------------------------------------------------------------
#  Command Widget::_test_color
# ----------------------------------------------------------------------------
proc Widget::_test_color { option value arg } {
    if {[catch {winfo rgb . $value} color]} {
        return -code error "bad $option value \"$value\": must be a colorname \
		or #RRGGBB triplet"
    }

    return $value
}


# ----------------------------------------------------------------------------
#  Command Widget::_test_string
# ----------------------------------------------------------------------------
proc Widget::_test_string { option value arg } {
    set value
}


# ----------------------------------------------------------------------------
#  Command Widget::_test_flag
# ----------------------------------------------------------------------------
proc Widget::_test_flag { option value arg } {
    set len [string length $value]
    set res ""
    for {set i 0} {$i < $len} {incr i} {
        set c [string index $value $i]
        if { [string first $c $arg] == -1 } {
            return -code error "bad [string range $option 1 end] value \"$value\": characters must be in \"$arg\""
        }
        if { [string first $c $res] == -1 } {
            append res $c
        }
    }
    return $res
}


# -----------------------------------------------------------------------------
#  Command Widget::_test_enum
# -----------------------------------------------------------------------------
proc Widget::_test_enum { option value arg } {
    if { [lsearch $arg $value] == -1 } {
        set last [lindex   $arg end]
        set sub  [lreplace $arg end end]
        if { [llength $sub] } {
            set str "[join $sub ", "] or $last"
        } else {
            set str $last
        }
        return -code error "bad [string range $option 1 end] value \"$value\": must be $str"
    }
    return $value
}


# -----------------------------------------------------------------------------
#  Command Widget::_test_int
# -----------------------------------------------------------------------------
proc Widget::_test_int { option value arg } {
    if { ![string is int -strict $value] || \
	    ([string length $arg] && \
	    ![expr [string map [list %d $value] $arg]]) } {
		    return -code error "bad $option value\
			    \"$value\": must be integer ($arg)"
    }
    return $value
}


# -----------------------------------------------------------------------------
#  Command Widget::_test_boolean
# -----------------------------------------------------------------------------
proc Widget::_test_boolean { option value arg } {
    if { ![string is boolean -strict $value] } {
        return -code error "bad $option value \"$value\": must be boolean"
    }

    # Get the canonical form of the boolean value (1 for true, 0 for false)
    return [string is true $value]
}


# -----------------------------------------------------------------------------
#  Command Widget::_test_padding
# -----------------------------------------------------------------------------
proc Widget::_test_padding { option values arg } {
    set len [llength $values]
    if {$len < 1 || $len > 2} {
        return -code error "bad pad value \"$values\":\
                        must be positive screen distance"
    }

    foreach value $values {
        if { ![string is int -strict $value] || \
            ([string length $arg] && \
            ![expr [string map [list %d $value] $arg]]) } {
                return -code error "bad pad value \"$value\":\
                                must be positive screen distance ($arg)"
        }
    }
    return $values
}


# Widget::_get_padding --
#
#       Return the requesting padding value for a padding option.
#
# Arguments:
#	path		Widget to get the options for.
#       option          The name of the padding option.
#	index		The index of the padding.  If the index is empty,
#                       the first padding value is returned.
#
# Results:
#	Return a numeric value that can be used for padding.
proc Widget::_get_padding { path option {index 0} } {
    set pad [Widget::cget $path $option]
    set val [lindex $pad $index]
    if {$val == ""} { set val [lindex $pad 0] }
    return $val
}


# -----------------------------------------------------------------------------
#  Command Widget::focusNext
#  Same as tk_focusNext, but call Widget::focusOK
# -----------------------------------------------------------------------------
proc Widget::focusNext { w } {
    set cur $w
    while 1 {

	# Descend to just before the first child of the current widget.

	set parent $cur
	set children [winfo children $cur]
	set i -1

	# Look for the next sibling that isn't a top-level.

	while 1 {
	    incr i
	    if {$i < [llength $children]} {
		set cur [lindex $children $i]
		if {[string equal [winfo toplevel $cur] $cur]} {
		    continue
		} else {
		    break
		}
	    }

	    # No more siblings, so go to the current widget's parent.
	    # If it's a top-level, break out of the loop, otherwise
	    # look for its next sibling.

	    set cur $parent
	    if {[string equal [winfo toplevel $cur] $cur]} {
		break
	    }
	    set parent [winfo parent $parent]
	    set children [winfo children $parent]
	    set i [lsearch -exact $children $cur]
	}
	if {[string equal $cur $w] || [focusOK $cur]} {
	    return $cur
	}
    }
}


# -----------------------------------------------------------------------------
#  Command Widget::focusPrev
#  Same as tk_focusPrev, except:
#	+ Don't traverse from a child to a direct ancestor
#	+ Call Widget::focusOK instead of tk::focusOK
# -----------------------------------------------------------------------------
proc Widget::focusPrev { w } {
    set cur $w
    set origParent [winfo parent $w]
    while 1 {

	# Collect information about the current window's position
	# among its siblings.  Also, if the window is a top-level,
	# then reposition to just after the last child of the window.

	if {[string equal [winfo toplevel $cur] $cur]}  {
	    set parent $cur
	    set children [winfo children $cur]
	    set i [llength $children]
	} else {
	    set parent [winfo parent $cur]
	    set children [winfo children $parent]
	    set i [lsearch -exact $children $cur]
	}

	# Go to the previous sibling, then descend to its last descendant
	# (highest in stacking order.  While doing this, ignore top-levels
	# and their descendants.  When we run out of descendants, go up
	# one level to the parent.

	while {$i > 0} {
	    incr i -1
	    set cur [lindex $children $i]
	    if {[string equal [winfo toplevel $cur] $cur]} {
		continue
	    }
	    set parent $cur
	    set children [winfo children $parent]
	    set i [llength $children]
	}
	set cur $parent
	if {[string equal $cur $w]} {
	    return $cur
	}
	# If we are just at the original parent of $w, skip it as a
	# potential focus accepter.  Extra safety in this is to see if
	# that parent is also a proc (not a C command), which is what
	# BWidgets makes for any megawidget.  Could possibly also check
	# for '[info commands ::${origParent}:cmd] != ""'.  [Bug 765667]
	if {[string equal $cur $origParent]
	    && [info procs ::$origParent] != ""} {
	    continue
	}
	if {[focusOK $cur]} {
	    return $cur
	}
    }
}


# ----------------------------------------------------------------------------
#  Command Widget::focusOK
#  Same as tk_focusOK, but handles -editable option and whole tags list.
# ----------------------------------------------------------------------------
proc Widget::focusOK { w } {
    set code [catch {$w cget -takefocus} value]
    if { $code == 1 } {
        return 0
    }
    if {($code == 0) && ($value != "")} {
	if {$value == 0} {
	    return 0
	} elseif {$value == 1} {
	    return [winfo viewable $w]
	} else {
	    set value [uplevel \#0 [list $value $w]]
            if {$value != ""} {
		return $value
	    }
        }
    }
    if {![winfo viewable $w]} {
	return 0
    }
    set code [catch {$w cget -state} value]
    if {($code == 0) && ($value == "disabled")} {
	return 0
    }
    set code [catch {$w cget -editable} value]
    if {($code == 0) && ($value == 0)} {
        return 0
    }

    set top [winfo toplevel $w]
    foreach tags [bindtags $w] {
        if { ![string equal $tags $top]  &&
             ![string equal $tags "all"] &&
             [regexp Key [bind $tags]] } {
            return 1
        }
    }
    return 0
}


proc Widget::traverseTo { w } {
    set focus [focus]
    if {![string equal $focus ""]} {
	event generate $focus <<TraverseOut>>
    }
    focus $w

    event generate $w <<TraverseIn>>
}

# Widget::which --
#
#	Retrieve a fully qualified variable name for the specified option or
#	widget variable.
#
#	If the option is not one for which a variable exists, throw an error
#	(ie, those options that map directly to widget options).
#
#	For widget variables, return the fully qualified name even if the
#	variable had not been previously set, in order to allow adding variable
#	traces prior to their creation.
#
# Arguments:
#	path	megawidget to get an option var for.
#	type	either -option or -variable.
#	name    name of the option or widget variable.
#
# Results:
#	Fully qualified name of the variable for the option or the widget
#	variable.
#
proc Widget::which {path args} {
    switch -- [llength $args] {
	1 {
	    set type -option;
	    set name [lindex $args 0];
	}
	2 {
	    set type [lindex $args 0];
	    set name [lindex $args 1];
	}
	default {
	    return -code error "incorrect number of arguments";
	}
    }

    variable _class;
    set class $_class($path);

    switch -- $type {
	-option {
	    upvar 0 ${class}::$path:opt pathopt;

	    if { ![info exists pathopt($name)] } {
		error "unable to find variable for option \"$name\"";
	    }

	    return ::Widget::${class}::${path}:opt(${name});
	}
	-variable {
	    return ${class}::${path}:${name};
	}
    }
}


# Widget::varForOption --
#
#	Retrieve a fully qualified variable name for the option specified.
#	If the option is not one for which a variable exists, throw an error 
#	(ie, those options that map directly to widget options) Superseded by
#       widget::which.
#
# Arguments:
#	path	megawidget to get an option var for.
#	option	option to get a var for.
#
# Results:
#	varname	name of the variable, fully qualified, suitable for tracing.

proc Widget::varForOption {path option} {
    return [::Widget::which $path -option $option];
}

# Widget::getVariable --
#
#       Get a variable from within the namespace of the widget.
#
# Arguments:
#	path		Megawidget to get the variable for.
#	varName		The variable name to retrieve.
#       newVarName	The variable name to refer to in the calling proc.
#
# Results:
#	Creates a reference to newVarName in the calling proc.
proc Widget::getVariable { path varName {newVarName ""} } {
    variable _class
    set class $_class($path)
    if {![string length $newVarName]} { set newVarName $varName }
    uplevel 1 [list ::upvar \#0 ${class}::$path:$varName $newVarName]
}

# Widget::options --
#
#       Return a key-value list of options for a widget.  This can
#       be used to serialize the options of a widget and pass them
#       on to a new widget with the same options.
#
# Arguments:
#	path		Widget to get the options for.
#	args		A list of options.  If empty, all options are returned.
#
# Results:
#	Returns list of options as: -option value -option value ...
proc Widget::options { path args } {
    if {[llength $args]} {
        foreach option $args {
            lappend options [_get_configure $path $option]
        }
    } else {
        set options [_get_configure $path {}]
    }

    set result [list]
    foreach list $options {
        if {[llength $list] < 5} { continue }
        lappend result [lindex $list 0] [lindex $list end]
    }
    return $result
}


# Widget::getOption --
#
#	Given a list of widgets, determine which option value to use.
#	The widgets are given to the command in order of highest to
#	lowest.  Starting with the lowest widget, whichever one does
#	not match the default option value is returned as the value.
#	If all the widgets are default, we return the highest widget's
#	value.
#
# Arguments:
#	option		The option to check.
#	default		The default value.  If any widget in the list
#			does not match this default, its value is used.
#	args		A list of widgets.
#
# Results:
#	Returns the value of the given option to use.
#
proc Widget::getOption { option default args } {
    for {set i [expr [llength $args] -1]} {$i >= 0} {incr i -1} {
	set widget [lindex $args $i]
	set value  [Widget::cget $widget $option]
	if {[string equal $value $default]} { continue }
	return $value
    }
    return $value
}


proc Widget::nextIndex { path node } {
    Widget::getVariable $path autoIndex
    if {![info exists autoIndex]} { set autoIndex -1 }
    return [string map [list #auto [incr autoIndex]] $node]
}


proc Widget::exists { path } {
    variable _class
    return [info exists _class($path)]
}

proc Widget::theme {{bool {}}} {
    # Private, *experimental* API that may change at any time - JH
    variable _theme
    if {[llength [info level 0]] == 2} {
	# set theme-ability
	if {[catch {package require Tk 8.5a6}]
	    && [catch {package require tile 0.6}]
	    && [catch {package require tile 1}]} {
	    return -code error "BWidget's theming requires tile 0.6+"
	} else {
	    catch {style default BWSlim.Toolbutton -padding 0}
	}
	set _theme [string is true -strict $bool]
    }
    return $_theme
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/wizard.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
# ------------------------------------------------------------------------------
#  wizard.tcl
#
# ------------------------------------------------------------------------------
#  Index of commands:
#
#   Public commands
#     - Wizard::create
#     - Wizard::configure
#     - Wizard::cget
#
#   Private commands (event bindings)
#     - Wizard::_destroy
# ------------------------------------------------------------------------------

namespace eval Wizard {
    Widget::define Wizard wizard ButtonBox Separator PagesManager

    namespace eval Step {
	Widget::declare Wizard::Step {
            {-type            String     "step"   1  }
	    {-data            String     ""       0  }
	    {-title           String     ""       0  }
	    {-default         String     "next"   0  }
	    {-text1           String     ""       0  }
	    {-text2           String     ""       0  }
	    {-text3           String     ""       0  }
	    {-text4           String     ""       0  }
	    {-text5           String     ""       0  }
	    {-icon            String     ""       0  }
	    {-image           String     ""       0  }
	    {-bitmap          String     ""       0  }
	    {-iconbitmap      String     ""       0  }

            {-create          Boolean    "0"      1  }
            {-appendorder     Boolean    "1"      0  }

            {-nexttext        String     "Next >" 0  }
            {-backtext        String     "< Back" 0  }
            {-helptext        String     "Help"   0  }
            {-canceltext      String     "Cancel" 0  }
            {-finishtext      String     "Finish" 0  }
            {-separatortext   String     ""       0  }

            {-createcommand   String     ""       0  }
            {-raisecommand    String     ""       0  }
	    {-nextcommand     String     ""       0  }
	    {-backcommand     String     ""       0  }
	    {-helpcommand     String     ""       0  }
	    {-cancelcommand   String     ""       0  }
	    {-finishcommand   String     ""       0  }

	}
    }

    namespace eval Branch {
	Widget::declare Wizard::Branch {
            {-type            String     "branch" 1  }
            {-command         String     ""       0  }
            {-action          Enum       "merge"  0  {merge terminate} }
        }
    }

    namespace eval Widget {
	Widget::declare Wizard::Widget {
            {-type            String     "widget" 1  }
            {-step            String     ""       1  }
            {-widget          String     ""       1  }
	}
    }

    namespace eval layout {}

    Widget::tkinclude Wizard frame :cmd \
    	include    { -width -height -background -foreground -cursor }

    Widget::declare Wizard {
   	{-type            Enum       "dialog" 1 {dialog frame} }
   	{-width           TkResource "450"    0 frame}
	{-height          TkResource "300"    0 frame}
	{-relief          TkResource "flat"   0 frame}
	{-borderwidth     TkResource "0"      0 frame}
	{-background      TkResource ""       0 frame}
	{-foreground      String     "black"  0      }
	{-title           String     "Wizard" 0      }

	{-autobuttons     Boolean    "1"      0      }
	{-helpbutton      Boolean    "0"      1      }
	{-finishbutton    Boolean    "0"      1      }
        {-resizable       String     "0 0"    0      }
	{-separator       Boolean    "1"      1      }
        {-parent          String     "."      1      }
        {-transient       Boolean    "1"      1      }
        {-place           Enum       "center" 1
                                     {none center left right above below}}

        {-icon            String     ""       0      }
        {-image           String     ""       0      }
	{-bitmap          String     ""       0      }
	{-iconbitmap      String     ""       0      }
        {-raisecommand    String     ""       0      }
        {-createcommand   String     ""       0      }
        {-separatortext   String     ""       0      }

        {-fg              Synonym    -foreground     }
        {-bg              Synonym    -background     }
        {-bd              Synonym    -borderwidth    }
    }

    image create photo Wizard::none

    Widget::addmap Wizard "" :cmd { -background {} -relief {} -borderwidth {} }

    Widget::addmap Wizard "" .steps { -width {} -height {} }

    bind Wizard <Destroy> [list Wizard::_destroy %W]
}


# ------------------------------------------------------------------------------
#  Command Wizard::create
# ------------------------------------------------------------------------------
proc Wizard::create { path args } {
    array set maps [list Wizard {} :cmd {}]
    array set maps [Widget::parseArgs Wizard $args]

    Widget::initFromODB Wizard $path $maps(Wizard)

    Widget::getVariable $path data
    Widget::getVariable $path branches

    array set data {
        steps   ""
        buttons ""
        order   ""
	current ""
    }

    array set branches {
        root    ""
    }

    set frame $path

    set type [Widget::cget $path -type]

    if {[string equal $type "dialog"]} {
        set top $path
        eval [list toplevel $path] $maps(:cmd) -class Wizard
        wm withdraw   $path
        wm protocol   $path WM_DELETE_WINDOW [list $path cancel]
        if {[Widget::cget $path -transient]} {
	    wm transient  $path [Widget::cget $path -parent]
        }
        eval wm resizable $path [Widget::cget $path -resizable]

        bind $path <Escape>         [list $path cancel]
        bind $path <<WizardFinish>> [list destroy $path]
        bind $path <<WizardCancel>> [list destroy $path]
    } else {
        set top [winfo toplevel $path]
        eval [list frame $path] $maps(:cmd) -class Wizard
    }

    wm title $top [Widget::cget $path -title]

    PagesManager $path.steps
    pack $path.steps -expand 1 -fill both

    widgets $path set steps -widget $path.steps

    if {[Widget::cget $path -separator]} {
        frame $path.separator
        pack $path.separator -fill x

        label $path.separator.l -text [Widget::cget $path -separatortext]
        pack  $path.separator.l -side left

        Separator $path.separator.s -orient horizontal
        pack $path.separator.s -side left -expand 1 -fill x -pady 2

	widgets $path set separator      -widget $path.separator.s
	widgets $path set separatortext  -widget $path.separator.l
	widgets $path set separatorframe -widget $path.separator
    }

    ButtonBox $path.buttons -spacing 2 -homogeneous 1
    pack $path.buttons -anchor se -padx 10 -pady 5

    widgets $path set buttons -widget $path.buttons

    insert $path button end back  -text "< Back" -command "$path back" -width 12
    insert $path button end next  -text "Next >" -command "$path next"
    if {[Widget::cget $path -finishbutton]} {
	insert $path button end finish -text "Finish" -command "$path finish"
    }
    insert $path button end cancel -text "Cancel" -command "$path cancel"

    if {[Widget::cget $path -helpbutton]} {
	$path.buttons configure -spacing 10
	insert $path button 0 help -text "Help" -command "$path help"
	$path.buttons configure -spacing 2
    }

    return [Widget::create Wizard $path]
}


# ------------------------------------------------------------------------------
#  Command Wizard::configure
# ------------------------------------------------------------------------------
proc Wizard::configure { path args } {
    set res [Widget::configure $path $args]

    if {[Widget::hasChanged $path -title title]} {
	wm title [winfo toplevel $path] $title
    }

    if {[Widget::hasChanged $path -resizable resize]} {
	eval wm resizable [winfo toplevel $path] $resize
    }

    return $res
}


# ------------------------------------------------------------------------------
#  Command Wizard::cget
# ------------------------------------------------------------------------------
proc Wizard::cget { path option } {
    return [Widget::cget $path $option]
}


proc Wizard::itemcget { path item option } {
    Widget::getVariable $path items
    Widget::getVariable $path steps
    Widget::getVariable $path buttons
    Widget::getVariable $path widgets

    if {![exists $path $item]} {
	## It's not an item.  Just pass the configure to the widget.
	set item [$path widgets get $item]
	return [eval $item configure $args] 
    }

    if {[_is_step $path $item]} {
        ## It's a step
        return [Widget::cget $items($item) $option]
    }

    if {[_is_branch $path $item]} {
        ## It's a branch
        return [Widget::cget $items($item) $option]
    }

    if {[info exists buttons($item)]} {
        ## It's a button
        return [$path.buttons itemcget $items($item) $option]
    }

    return -code error "item \"$item\" does not exist"
}


proc Wizard::itemconfigure { path item args } {
    Widget::getVariable $path items
    Widget::getVariable $path steps
    Widget::getVariable $path buttons
    Widget::getVariable $path widgets

    if {![exists $path $item]} {
	## It's not an item.  Just pass the configure to the widget.
	set item [$path widgets get $item]
	return [eval $item configure $args] 
    }

    if {[info exists steps($item)]} {
        ## It's a step.
        set res [Widget::configure $items($item) $args]

	if {$item == [$path step current]} {
	    if {[Widget::hasChanged $items($item) -title title]} {
		wm title [winfo toplevel $path] $title
	    }
	}

	return $res
    }

    if {[_is_branch $path $item]} {
        ## It's a branch
        return [Widget::configure $items($item) $args]
    }

    if {[info exists buttons($item)]} {
        ## It's a button.
        return [eval $path.buttons itemconfigure [list $items($item)] $args]
    }

    return -code error "item \"$item\" does not exist"
}


proc Wizard::show { path } {
    wm deiconify [winfo toplevel $path]
}


proc Wizard::invoke { path button } {
    Widget::getVariable $path buttons
    if {![info exists buttons($button)]} {
        return -code error "button \"$button\" does not exist"
    }
    [$path widgets get $button] invoke
}


proc Wizard::insert { path type idx args } {
    Widget::getVariable $path items
    Widget::getVariable $path widgets
    Widget::getVariable $path branches

    switch -- $type {
        "button" {
            set node [lindex $args 0]
        }

        "step" - "branch" {
            set node   [lindex $args 1]
            set branch [lindex $args 0]

            if {![info exists branches($branch)]} {
                return -code error "branch \"$branch\" does not exist"
            }
	}

	default {
	    set types [list button branch step]
	    set err [BWidget::badOptionString option $type $types]
	    return -code error $err
	}
    }

    if {[exists $path $node]} {
        return -code error "item \"$node\" already exists"
    }

    eval _insert_$type $path $idx $args
}


proc Wizard::back { path } {
    Widget::getVariable $path data
    Widget::getVariable $path items
    set step [$path raise]
    if {![string equal $step ""]} {
        set cmd [Widget::cget $items($step) -backcommand]
        if {![string equal $cmd ""]} {
            set res [uplevel #0 $cmd]
            if {!$res} { return }
        }
    }

    set data(order) [lreplace $data(order) end end]
    set item [lindex $data(order) end]

    $path raise $item

    event generate $path <<WizardStep>>
    event generate $path <<WizardBack>>

    return $item
}


proc Wizard::next { path } {
    Widget::getVariable $path data
    Widget::getVariable $path items

    set step [$path raise]
    if {![string equal $step ""]} {
        set cmd [Widget::cget $items($step) -nextcommand]
        if {![string equal $cmd ""]} {
            set res [uplevel #0 $cmd]
            if {!$res} { return }
        }
    }

    set item [step $path next]

    if {[Widget::cget $items($item) -appendorder]} {
	lappend data(order) $item
    }

    $path raise $item

    event generate $path <<WizardStep>>
    event generate $path <<WizardNext>>

    return $item
}


proc Wizard::cancel { path } {
    Widget::getVariable $path items
    set step [$path raise]
    if {![string equal $step ""]} {
        set cmd [Widget::cget $items($step) -cancelcommand]
        if {![string equal $cmd ""]} {
            set res [uplevel #0 $cmd]
            if {!$res} { return }
        }
    }

    event generate $path <<WizardCancel>>
}


proc Wizard::finish { path } {
    Widget::getVariable $path items
    set step [$path raise]
    if {![string equal $step ""]} {
        set cmd [Widget::cget $items($step) -finishcommand]
        if {![string equal $cmd ""]} {
            set res [uplevel #0 $cmd]
            if {!$res} { return }
        }
    }
        
    event generate $path <<WizardFinish>>
}


proc Wizard::help { path } {
    Widget::getVariable $path items
    set step [$path raise]
    if {![string equal $step ""]} {
        set cmd [Widget::cget $items($step) -helpcommand]
        if {![string equal $cmd ""]} {
            uplevel #0 $cmd
        }
    }
        
    event generate $path <<WizardHelp>>
}


proc Wizard::step { path node {start ""} {traverse 1} } {
    Widget::getVariable $path data
    Widget::getVariable $path items
    Widget::getVariable $path branches

    if {![string equal $start ""]} {
        if {![exists $path $start]} {
            return -code error "item \"$start\" does not exist"
        }
    }

    switch -- $node {
        "current" {
            set item [$path raise]
        }

        "end" - "last" {
            ## Keep looping through 'next' until we hit the end.
            set item [$path step next]
            while {![string equal $item ""]} {
                set last $item
                set item [$path step next $item] 
            }
            set item $last
        }

        "back" - "previous" {
            if {[string equal $start ""]} {
                set item [lindex $data(order) end-1]
            } else {
                set idx [lsearch $data(order) $start]
                incr idx -1
                if {$idx < 0} { return }
                set item [lindex $data(order) $idx]
            }
        }

        "next" {
            set step [$path raise]
            if {![string equal $start ""]} { set step $start }

            set branch [$path branch $step]
            if {$traverse && [_is_branch $path $step]} {
                ## This step is a branch.  Let's figure out where to go next.
                if {[traverse $path $step]} {
                    ## It's ok to traverse into this branch.
                    ## Set step to null so that we'll end up finding the
                    ## first step in the branch.
                    set branch $step
                    set step   ""
                }
            }

            set  idx [lsearch $branches($branch) $step]
            incr idx

            set item [lindex $branches($branch) $idx]

            if {$idx >= [llength $branches($branch)]} {
                ## We've reached the end of this branch.
                ## If it's the root branch, or this branch terminates we return.
                if {[string equal $branch "root"]
                    || [Widget::cget $items($branch) -action] == "terminate"} {
                    return
                }

                ## We want to merge back with our parent branch.
                set item [step $path next $branch 0]
            }

            ## If this step is a branch, find the next step after it.
            if {$traverse && [_is_branch $path $item]} {
                set item [$path step next $item]
            }
        }

        default {
            if {![exists $path $node]} {
                return -code error "item \"$node\" does not exist"
            }
            set item $node
        }
    }

    return $item
}


proc Wizard::nodes { path branch {first ""} {last ""} } {
    Widget::getVariable $path data
    Widget::getVariable $path branches
    if {$first == ""} { return $branches($branch) }
    if {$last == ""}  { return [lindex $branches($branch) $first] }
    return [lrange $data(steps) $first $last]
}


proc Wizard::index { path item } {
    Widget::getVariable $path branches
    set branch [$path branch $item]
    return [lsearch $branches($branch) $item]
}


proc Wizard::raise { path {item ""} } {
    Widget::getVariable $path data
    Widget::getVariable $path items

    set steps   $path.steps
    set buttons $path.buttons

    if {[string equal $item ""]} { return $data(current) }

    $path createStep $item

    ## Eval the global raisecommand if we have one, appending the item.
    set cmd [Widget::cget $path -raisecommand]
    if {![string equal $cmd ""]} {
        uplevel #0 $cmd [list $item]
    }

    ## Eval this item's raisecommand if we have one.
    set cmd [Widget::cget $items($item) -raisecommand]
    if {![string equal $cmd ""]} {
        uplevel #0 $cmd
    }

    set title [getoption $path $item -title]
    wm title [winfo toplevel $path] $title

    if {[Widget::cget $path -separator]} {
	set txt [getoption $path $item -separatortext]
	$path itemconfigure separatortext -text $txt
    }

    set default [Widget::cget $items($item) -default]
    set button  [lsearch $data(buttons) $default]
    $buttons setfocus $button

    $steps raise $item

    set data(current) $item

    set back [$path step back]
    set next [$path step next]

    if {[Widget::cget $path -autobuttons]} {
        set txt [Widget::cget $items($item) -backtext]
        $path itemconfigure back   -text $txt -state normal
        set txt [Widget::cget $items($item) -nexttext]
        $path itemconfigure next   -text $txt -state normal
        set txt [Widget::cget $items($item) -canceltext]
        $path itemconfigure cancel -text $txt -state normal
	if {[Widget::cget $path -helpbutton]} {
	    set txt [Widget::cget $items($item) -helptext]
	    $path itemconfigure help -text $txt
	}

	if {[Widget::cget $path -finishbutton]} {
	    set txt [Widget::cget $items($item) -finishtext]
	    $path itemconfigure finish -text $txt -state disabled
	}

	if {[string equal $back ""]} {
            $path itemconfigure back -state disabled
        }

	if {[string equal $next ""]} {
	    if {[Widget::cget $path -finishbutton]} {
		$path itemconfigure next   -state disabled
		$path itemconfigure finish -state normal
	    } else {
		set txt [Widget::cget $items($item) -finishtext]
		$path itemconfigure next -text $txt -command [list $path finish]
	    }
            $path itemconfigure back   -state disabled
            $path itemconfigure cancel -state disabled
        } else {
            set txt [Widget::cget $items($item) -nexttext]
            $path itemconfigure next -text $txt -command [list $path next]
        }
    }

    event generate $path <<WizardStep>>

    if {[string equal $next ""]} { event generate $path <<WizardLastStep>>  }
    if {[string equal $back ""]} { event generate $path <<WizardFirstStep>> }

    return $item
}


proc Wizard::widgets { path command args } {
    Widget::getVariable $path items
    Widget::getVariable $path widgets
    Widget::getVariable $path stepWidgets

    switch -- $command {
	"set" {
	    set node [lindex $args 0]
	    if {[string equal $node ""]} {
		set err [BWidget::wrongNumArgsString \
			"$path widgets set <name> ?option ..?"]
		return -code error $err
	    }
	    set args [lreplace $args 0 0]
	    set item $path.#widget#$node

	    Widget::init Wizard::Widget $item $args
	    set step   [Widget::cget $item -step]
	    set widget [Widget::cget $item -widget]
	    if {[string equal $step ""]} {
		set widgets($node) $widget
	    } else {
		set stepWidgets($step,$node) $widget
	    }
	    return $widget
	}

	"get" {
	    set node [lindex $args 0]
	    if {[string equal $node ""]} {
		return [array names widgets]
	    }
	    set args [lreplace $args 0 0]

	    array set map  [list Wizard::Widget {}]
	    array set map  [Widget::parseArgs Wizard::Widget $args]
	    array set data $map(Wizard::Widget)

	    if {[info exists data(-step)]} {
	    	set step $data(-step)
	    } else {
		set step [$path step current]
	    }

	    ## If a widget exists for this step, return it.
	    if {[info exists stepWidgets($step,$node)]} {
		return $stepWidgets($step,$node)
	    }

	    ## See if a widget exists on the global level.
	    if {![info exists widgets($node)]} {
		return -code error "item \"$node\" does not exist"
	    }
	    return $widgets($node)
	}

	default {
	    set err [BWidget::badOptionString option $command [list get set]]
	    return -code error $err
	}
    }
}


proc Wizard::variable { path step option } {
    set item $path.$step
    return [Widget::varForOption $item $option]
}


proc Wizard::branch { path {node "current"} } {
    Widget::getVariable $path data
    if {[string equal $node "current"]} { set item [$path step current] }
    if {[string equal $node ""]} { return "root" }
    if {[info exists data($node,branch)]} { return $data($node,branch) }
    return -code error "item \"$node\" does not exist"
}


proc Wizard::traverse { path node } {
    Widget::getVariable $path items

    if {$node == "root"} { return 1 }

    if {![_is_branch $path $node]} {
        return -code error "branch \"$node\" does not exist"
    }

    set cmd [Widget::cget $items($node) -command]
    if {[string equal $cmd ""]} { return 1 }
    return [uplevel #0 $cmd]
}


proc Wizard::exists { path item } {
    Widget::getVariable $path items
    return [info exists items($item)]
}


proc Wizard::createStep { path item {delete 0} } {
    Widget::getVariable $path data
    Widget::getVariable $path items
    Widget::getVariable $path steps

    if {![_is_step $path $item]} { return }

    if {$delete} {
        if {[$path.steps exists $item]} {
            $path.steps delete $item
        }
        if {[info exists data($item,realized)]} {
            unset data($item,realized)
        }
    }

    if {![info exists data($item,realized)]} {
        ## Eval the global createcommand if we have one, appending the item.
        set cmd [Widget::cget $path -createcommand]
        if {![string equal $cmd ""]} {
            uplevel #0 $cmd [list $item]
        }

        ## Eval this item's createcommand if we have one.
        set cmd [Widget::cget $items($item) -createcommand]
        if {![string equal $cmd ""]} {
            uplevel #0 $cmd
        }

        set data($item,realized) 1
    }

    return
}


proc Wizard::getoption { path item option } {
    Widget::getVariable $path items
    return [Widget::getOption $option "" $path $items($item)]
}


proc Wizard::reorder { path parent nodes } {
    Widget::getVariable $path branches
    set branches($parent) $nodes
}


proc Wizard::_insert_button { path idx node args } {
    Widget::getVariable $path data
    Widget::getVariable $path items
    Widget::getVariable $path buttons
    Widget::getVariable $path widgets

    set buttons($node) 1
    set widgets($node) [eval $path.buttons insert $idx $args]
    set item   [string map [list $path.buttons.b {}] $widgets($node)]
    set items($node) $item
    return $widgets($node)
}


proc Wizard::_insert_step { path idx branch node args } {
    Widget::getVariable $path data
    Widget::getVariable $path steps
    Widget::getVariable $path items
    Widget::getVariable $path widgets
    Widget::getVariable $path branches

    set steps($node) 1
    lappend data(steps) $node
    set data($node,branch) $branch
    if {$idx == "end"} {
        lappend branches($branch) $node
    } else {
	set branches($branch) [linsert $branches($branch) $idx $node]
    }

    set items($node) $path.$node
    Widget::init Wizard::Step $items($node) $args
    set widgets($node) [$path.steps add $node]
    if {[Widget::cget $items($node) -create]} { $path createStep $node }
    return $widgets($node)
}


proc Wizard::_insert_branch { path idx branch node args } {
    Widget::getVariable $path data
    Widget::getVariable $path items
    Widget::getVariable $path branches

    set branches($node)    [list]
    lappend data(branches) $node
    set data($node,branch) $branch
    if {$idx == "end"} {
        lappend branches($branch) $node
    } else {
        set branches($branch) [linsert $branches($branch) $idx $node]
    }

    set items($node) $path.$node
    Widget::init Wizard::Branch $items($node) $args
}


proc Wizard::_is_step { path node } {
    Widget::getVariable $path steps
    return [info exists steps($node)]
}


proc Wizard::_is_branch { path node } {
    Widget::getVariable $path branches
    return [info exists branches($node)]
}


# ------------------------------------------------------------------------------
#  Command Wizard::_destroy
# ------------------------------------------------------------------------------
proc Wizard::_destroy { path } {
    Widget::destroy $path
}


proc SimpleWizard { path args } {
    option add *WizLayoutSimple*Label.padX                5    interactive
    option add *WizLayoutSimple*Label.anchor              nw   interactive
    option add *WizLayoutSimple*Label.justify             left interactive
    option add *WizLayoutSimple*Label.borderWidth         0    interactive
    option add *WizLayoutSimple*Label.highlightThickness  0    interactive

    set cmd [list Wizard::layout::simple $path]
    return [eval [list Wizard $path] $args [list -createcommand $cmd]]
}


proc ClassicWizard { path args } {
    option add *WizLayoutClassic*Label.padX                5    interactive
    option add *WizLayoutClassic*Label.anchor              nw   interactive
    option add *WizLayoutClassic*Label.justify             left interactive
    option add *WizLayoutClassic*Label.borderWidth         0    interactive
    option add *WizLayoutClassic*Label.highlightThickness  0    interactive

    set cmd [list Wizard::layout::classic $path]
    return [eval [list Wizard $path] $args [list -createcommand $cmd]]
}


proc Wizard::layout::simple { wizard step } {
    set frame [$wizard widgets get $step]

    set layout [$wizard widgets set layout -widget $frame.layout -step $step]

    foreach w [list titleframe pretext posttext clientArea] {
	set $w [$wizard widgets set $w -widget $layout.$w -step $step]
    }

    foreach w [list title subtitle icon] {
	set $w [$wizard widgets set $w -widget $titleframe.$w -step $step]
    }

    frame $layout -class WizLayoutSimple

    pack $layout -expand 1 -fill both

    # Client area. This is where the caller places its widgets.
    frame $clientArea -bd 8 -relief flat

    Separator $layout.sep1 -relief groove -orient horizontal

    # title and subtitle and icon
    frame $titleframe -bd 4 -relief flat -background white
    label $title -background white -textvariable [$wizard variable $step -text1]
    label $subtitle -height 2 -background white -padx 15 -width 40 \
    	-textvariable [$wizard variable $step -text2]

    label $icon -borderwidth 0 -background white -anchor c
    set iconImage [$wizard getoption $step -icon]
    if {![string equal $iconImage ""]} { $icon configure -image $iconImage }

    set labelfont [font actual [$title cget -font]]
    $title configure -font [concat $labelfont -weight bold]

    # put the title, subtitle and icon inside the frame we've built for them
    grid $title    -in $titleframe -row 0 -column 0 -sticky nsew
    grid $subtitle -in $titleframe -row 1 -column 0 -sticky nsew
    grid $icon     -in $titleframe -row 0 -column 1 -rowspan 2 -padx 8
    grid columnconfigure $titleframe 0 -weight 1
    grid columnconfigure $titleframe 1 -weight 0

    # pre and post text.
    label $pretext  -textvariable [$wizard variable $step -text3]
    label $posttext -textvariable [$wizard variable $step -text4]

    # when our label widgets change size we want to reset the
    # wraplength to that same size.
    foreach widget {title subtitle pretext posttext} {
	bind [set $widget] <Configure> {
            # yeah, I know this looks weird having two after idle's, but
            # it helps prevent the geometry manager getting into a tight
            # loop under certain circumstances
            #
            # note that subtracting 10 is just a somewhat arbitrary number
            # to provide a little padding...
            after idle {after idle {%W configure -wraplength [expr {%w -10}]}}
        }
    }

    grid $titleframe  -row 0 -column 0 -sticky nsew -padx 0
    grid $layout.sep1 -row 1 -sticky ew 
    grid $pretext     -row 2 -sticky nsew -padx 8 -pady 8
    grid $clientArea  -row 3 -sticky nsew -padx 8 -pady 8
    grid $posttext    -row 4 -sticky nsew -padx 8 -pady 8

    grid columnconfigure $layout 0 -weight 1
    grid rowconfigure    $layout 0 -weight 0
    grid rowconfigure    $layout 1 -weight 0
    grid rowconfigure    $layout 2 -weight 0
    grid rowconfigure    $layout 3 -weight 1
    grid rowconfigure    $layout 4 -weight 0
}

proc Wizard::layout::classic { wizard step } {
    set frame [$wizard widgets get $step]

    set layout [$wizard widgets set layout -widget $frame.layout -step $step]
    foreach w [list title subtitle icon pretext posttext clientArea] {
	set $w [$wizard widgets set $w -widget $layout.$w -step $step]
    }

    frame $layout -class WizLayoutClassic

    pack $layout -expand 1 -fill both

    # Client area. This is where the caller places its widgets.
    frame $clientArea -bd 8 -relief flat
    
    Separator $layout.sep1 -relief groove -orient vertical

    # title and subtitle
    label $title    -textvariable [$wizard variable $step -text1]
    label $subtitle -textvariable [$wizard variable $step -text2] -height 2

    array set labelfont [font actual [$title cget -font]]
    incr labelfont(-size) 6
    set  labelfont(-weight) bold
    $title configure -font [array get labelfont]

    # pre and post text. 
    label $pretext  -textvariable [$wizard variable $step -text3]
    label $posttext -textvariable [$wizard variable $step -text4]

    # when our label widgets change size we want to reset the
    # wraplength to that same size.
    foreach widget {title subtitle pretext posttext} {
        bind [set $widget] <Configure> {
            # yeah, I know this looks weird having two after idle's, but
            # it helps prevent the geometry manager getting into a tight
            # loop under certain circumstances
            #
            # note that subtracting 10 is just a somewhat arbitrary number
            # to provide a little padding...
            after idle {after idle {%W configure -wraplength [expr {%w -10}]}}
        }
    }

    label $icon -borderwidth 1 -relief sunken -background white \
        -anchor c -width 96 -image Wizard::none
    set iconImage [$wizard getoption $step -icon]
    if {![string equal $iconImage ""]} { $icon configure -image $iconImage }

    grid $icon       -row 0 -column 0 -sticky nsew -padx 8 -pady 8 -rowspan 5
    grid $title      -row 0 -column 1 -sticky ew   -padx 8 -pady 8
    grid $subtitle   -row 1 -column 1 -sticky ew   -padx 8 -pady 8
    grid $pretext    -row 2 -column 1 -sticky ew   -padx 8
    grid $clientArea -row 3 -column 1 -sticky nsew -padx 8
    grid $posttext   -row 4 -column 1 -sticky ew   -padx 8 -pady 24

    grid columnconfigure $layout 0 -weight 0
    grid columnconfigure $layout 1 -weight 1

    grid rowconfigure    $layout 0 -weight 0
    grid rowconfigure    $layout 1 -weight 0
    grid rowconfigure    $layout 2 -weight 0
    grid rowconfigure    $layout 3 -weight 1
    grid rowconfigure    $layout 4 -weight 0
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<








































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/bwidget-1.9.8/xpm2image.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
# ----------------------------------------------------------------------------
#  xpm2image.tcl
#  Slightly modified xpm-to-image command
#  $Id: xpm2image.tcl,v 1.5 2004/09/09 22:17:03 hobbs Exp $
# ------------------------------------------------------------------------------
#
#  Copyright 1996 by Roger E. Critchlow Jr., San Francisco, California
#  All rights reserved, fair use permitted, caveat emptor.
#  rec@elf.org
# 
# ----------------------------------------------------------------------------

proc _xpm-to-image_process_line { line } {
    upvar 1 data data
    set line [string map {"\t" " "} $line]

    set idx $data(chars_per_pixel)
    incr idx -1
    set cname [string range $line 0 $idx]


    set lend [string trim [string range $line $data(chars_per_pixel) end]]

    ## now replace multiple spaces with just one..
    while {-1 != [string first  "  " $lend]} {
        set lend [string map {"  " " "} $lend]
    }
    set cl [split $lend " "]

    set idx 0
    set clen [llength $cl]

    ## scan through the line, looking for records of type c, g or m
    while { $idx < $clen } {
        set key [lindex $cl $idx]
        if { [string equal $key {}] } {
            incr idx
            continue
        }

        while { ![string equal $key "c"]
                && ![string equal $key "m"]
                && ![string equal $key "g"]
                && ![string equal $key "g4"]
                && ![string equal $key ""]
        } { 
            incr idx
            set key [lindex $cl $idx]
        }

        incr idx
        set color [string tolower [lindex $cl $idx]]

        ## one file used opaque to mean black
        if { [string equal -nocase $color "opaque"] } {
            set color "black"
        }
        set data(color-$key-$cname) $color
        if { [string equal -nocase $color "none"] } {
            set data(transparent) $cname
        }
        incr idx
    }

    
    foreach key {c g g4 m} {
        if {[info exists data(color-$key-$cname)]} {
            set color $data(color-$key-$cname)
            set data(color-$cname) $color
            set data(cname-$color) $cname
            lappend data(colors) $color
            break
        }
    }
    if { ![info exists data(color-$cname)] } {
        error "color definition {$line} failed to define a color"
    }
}

proc xpm-to-image { file } {
    set f [open $file]
    set string [read $f]
    close $f

    # parse the strings in the xpm data
    #
    set xpm {}
    foreach line [split $string "\n"] {
        ## some files have blank lines in them, skip those
        ## also, some files indent each line with spaces - remove those
        set line [string trim $line]
        if { $line eq "" } { continue }

        if {[regexp {^"([^\"]*)"} $line all meat]} {
            if {[string first XPMEXT $meat] == 0} {
                break
            }
            lappend xpm $meat
        }
    }
    #
    # extract the sizes in the xpm data
    #
    set sizes  [lindex $xpm 0]
    set nsizes [llength $sizes]
    if { $nsizes == 4 || $nsizes == 6 || $nsizes == 7 } {
        set data(width)   [lindex $sizes 0]
        set data(height)  [lindex $sizes 1]
        set data(ncolors) [lindex $sizes 2]
        set data(chars_per_pixel) [lindex $sizes 3]
        set data(x_hotspot) 0
        set data(y_hotspot) 0
        if {[llength $sizes] >= 6} {
            set data(x_hotspot) [lindex $sizes 4]
            set data(y_hotspot) [lindex $sizes 5]
        }
    } else {
	    error "size line {$sizes} in $file did not compute"
    }

    #
    # extract the color definitions in the xpm data
    #
    foreach line [lrange $xpm 1 $data(ncolors)] {
        _xpm-to-image_process_line $line
    }

    #
    # extract the image data in the xpm data
    #
    set image [image create photo -width $data(width) -height $data(height)]
    set y 0
    set idx 0
    foreach line [lrange $xpm [expr {1+$data(ncolors)}] [expr {1+$data(ncolors)+$data(height)}]] {
        set x 0
        set pixels {}
        while { [string length $line] > 0 } {
            set pixel [string range $line 0 [expr {$data(chars_per_pixel)-1}]]
            ## see if they lied about the number of colors by not counting
            ## "none" in the color count entry
            set none 0
            if { ($idx == 0) && ([info exists data(cname-none)]) &&  \
                ![info exists data(color-$pixel)] } {
                ## it appears that way - process this line as another
                ## color entry
                _xpm-to-image_process_line $line
                incr idx
                set none 1
                break;
            }
            incr idx
            set c $data(color-$pixel)
            if { [string equal $c none] } {
                if { [string length $pixels] } {
                    $image put [list $pixels] -to [expr {$x-[llength $pixels]}] $y
                    set pixels {}
                }
            } else {
                lappend pixels $c
            }
            set line [string range $line $data(chars_per_pixel) end]
            incr x
        }
        if { $none == 1 } {
            continue
        }
        if { [llength $pixels] } {
            $image put [list $pixels] -to [expr {$x-[llength $pixels]}] $y
        }
        incr y
    }

    #
    # return the image
    #
    return $image
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


































































































































































































































































































































































Added scriptlibs/machelp/TextSweep User Help.mht.

more than 10,000 changes

Deleted scriptlibs/machelp/help.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
#+##########################################################################
#
# Hypertext HelpSystem.tcl -- A help system based on wiki 1194 and tile
# by Keith Vetter, May 2007
#
# with support for images and launching external clients for URL by Kevin Walzer
# 

package require xplat

namespace eval ::Help {
    variable W                                  ;# Various widgets
    variable pages                              ;# All the help pages
    variable alias                              ;# Alias to help pages
    variable state
    variable font TkTextFont
 
    array unset pages
    array unset alias
    array unset state
    array set state {history {} seen {} current {} all {} allTOC {} haveTOC 0}
    array set W {top .helpSystem main "" tree ""}
    array set alias {index Index previous Previous back Back search Search
        history History next Next}

    if {![info exists library]} {
	variable library [file dirname [info script]]
    }
}


 
## BON HELP
##+##########################################################################
#
# Help Section
#
# Based on http://wiki.tcl.tk/1194
#
#  AddPage title aliases text  -- register a hypertext page
#  Help ?title?                -- bring up a toplevel showing the specified page
#                                 or a index of titles, if not specified
#
# Hypertext pages are in a subset of Wiki format:
#   indented lines come in fixed font without evaluation;
#   blank lines break paragraphs
#   a line starting with "   * " gets a bullet
#   a line starting with "   - " gets a dash
#   a line starting with "   1. " will be a numbered list
#    repeating the initial *,- or "1" will indent the list
#
#   text enclosed by '''<text>''' is embolden
#   text enclosed by ''<text>'' is italics
#   all lines without leading blanks are displayed without explicit
#      linebreak (but possibly word-wrapped)
#   a link is the title of another page in brackets (see examples at
#      end). Links are displayed underlined and blue (or purple if they
#      have been visited before), and change the cursor to a pointing
#      hand. Clicking on a link of course brings up that page.
#
# In addition, you get "Index", "Search" (case-insensitive regexp in
# titles and full text), "History", and "Back" links at the bottom of
# pages.
 
 
##+##########################################################################
#
# ::Help::Help -- initializes and creates the help dialog
#
proc ::Help::Help {{title ""}} {
    variable W
 
    if {![winfo exists $W(top)]} {
        ::Help::DoDisplay $W(top)
    }
 
    raise $W(top)
    ::Help::Show $title
}
##+##########################################################################
#
# ::Help::ReadHelpFiles -- reads "help.txt" in the packages directory
# and creates all the help pages.
#
proc ::Help::ReadHelpFiles {dir} {

    set fname [file join $dir help.txt]
    set fin [open $fname r]
    set data [read $fin] ; list
    close $fin
 
    regsub -all -line {^-+$} $data \x01 data
    regsub -all -line {^\#.*$\n} $data {} data
    foreach section [split $data \x01] {
        set n [regexp -line {^title:\s*(.*)$} $section => title]
        if {! $n} {
            puts "Bad help section\n'[string range $section 0 400]'"
            continue
        }
        set aliases {}
        foreach {. alias} [regexp -all -line -inline {^alias:\s*(.*)$} $section] {
            lappend aliases $alias
        }
 
        regsub -all -line {^(title:|alias:).*$\n} $section {} section
        ::Help::AddPage $title $aliases $section
    }
    ::Help::BuildTOC
}

##+##########################################################################
#
# ::Help::Read Images -- reads "images.tcl" in the packages directory
# and creates all images for the help pages.
##+##########################################################################

proc ::Help::ReadImages {dir} {

    variable library
	
	if {[tk windowingsystem] eq "win32"} {
	 source [file join $library win_images.tcl]
	 }
	 
	 if {[tk windowingsystem] eq "aqua"} {
	 source [file join $library images.tcl]
	 }
}


#
# ::Help::AddPage -- Adds another page to the help system
#
proc ::Help::AddPage {title aliases body} {
    variable pages
    variable state
    variable alias
 
    set title [string trim $title]
    set body [string trim $body "\n"]
    regsub -all {\\\n} $body {} body            ;# Remove escaped lines
    regsub -all {[ \t]+\n} $body "\n" body      ;# Remove trailing spaces
    regsub -all {([^\n])\n([^\s])} $body {\1 \2} body ;# Unwrap paragraphs
 
    set pages($title) $body
 
    lappend aliases [string tolower $title]
    foreach name $aliases { set alias([string tolower $name]) $title }
 
    if {[lsearch $state(all) $title] == -1} {
        set state(all) [lsort [lappend state(all) $title]]
    }
}
##+##########################################################################
#
# ::Help::DoDisplay -- Creates our help display. If we have tile 0.7.8 then
# we will also have a TOC pane.
#
proc ::Help::DoDisplay {TOP} {
    variable state
 
    catch {destroy $TOP}
    toplevel $TOP
    wm title $TOP "Help"

     frame $TOP.bottom -bd 2 -relief ridge
     ttk::button $TOP.b -text "Print" -command [list ::Help::PrintHelp $TOP]
     pack $TOP.bottom -side bottom -fill both
     pack $TOP.b -side bottom -expand 1 -pady 10 -in $TOP.bottom
 
    set P $TOP.p
    if {1} {                       ;# Need tags on treeview
        set state(haveTOC) 1
        ::ttk::panedwindow $P -orient horizontal
 
        pack $P -side top -fill both -expand 1
        frame $P.toc -relief ridge
        frame $P.help -bd 2 -relief ridge
 
        $P add $P.toc
        $P add $P.help
        ::Help::CreateTOC $P.toc
        ::Help::CreateHelp $P.help
    } else {
        set state(haveTOC) 0
        frame $P
        pack $P -side top -fill both -expand 1
        ::Help::CreateHelp $P
    }

    bind $TOP <Command-W> [list wm withdraw $TOP]
    bind $TOP <Command-w> [list wm withdraw $TOP]

}
##+##########################################################################
#
# ::Help::CreateTOC -- Creates a TOC display from tile's treeview widget
#
proc ::Help::CreateTOC {TOC} {
    variable W
 
    set W(tree) $TOC.tree
    ttk::scrollbar $TOC.sby -orient vert -command "$W(tree) yview"
    #scrollbar $TOC.sbx -orient hori -command "$W(tree) xview"
 
    ::ttk::treeview $W(tree) -padding {0 0 0 0} -selectmode browse \
        -yscrollcommand "$TOC.sby set"  ;#$ -xscrollcommand "$TOC.sbx set" 
 
    grid $W(tree) $TOC.sby -sticky news
    #grid $TOC.sbx -sticky ew
    grid rowconfigure $TOC 0 -weight 1
    grid columnconfigure $TOC 0 -weight 1
 
    $W(tree) heading #0 -text "Table of Contents"
    $W(tree) tag configure link -foreground blue
    # NB. binding to buttonpress sometimes "misses" clicks
    #$W(tree) tag bind link <ButtonPress> ::Help::ButtonPress
    bind $W(tree) <<TreeviewSelect>> ::Help::TreeviewSelection
    ::Help::BuildTOC
}
##+##########################################################################
#
# ::Help::CreateHelp -- Creates our main help widget
#
proc ::Help::CreateHelp {w} {
    variable W
    variable font
 
    set W(main) $w.t
    text $w.t -border 5 -relief flat -wrap word -state disabled -width 60 \
        -yscrollcommand "$w.s set" -padx 5 -font $font
    ttk::scrollbar $w.s -orient vert -command "$w.t yview"
    pack $w.s -fill y -side right
    pack $w.t -fill both -expand 1 -side left
 
    $w.t tag config link -foreground blue -underline 1
    $w.t tag config seen -foreground purple4 -underline 1
    $w.t tag bind link <Enter> "$w.t config -cursor hand2"
    $w.t tag bind link <Leave> "$w.t config -cursor {}"
    $w.t tag bind link <1> "::Help::Click $w.t %x %y"
    $w.t tag config hdr -font {-size 18}
    $w.t tag config fix -font \
        "[font actual [$w.t cget -font]] -family Courier"
    $w.t tag config bold -font \
        "[font actual [$w.t cget -font]] -weight bold"
    $w.t tag config italic -font \
        "[font actual [$w.t cget -font]] -slant italic"
 
    set l1 [font measure $font "   "]
    set l2 [font measure $font "   \u2022   "]
    set l3 [font measure $font "       \u2013   "]
    set l3 [expr {$l2 + ($l2 - $l1)}]
    $w.t tag config bullet -lmargin1 $l1 -lmargin2 $l2
    $w.t tag config number -lmargin1 $l1 -lmargin2 $l2
    $w.t tag config dash -lmargin1 $l1 -lmargin2 $l2
 
    bind $w.t <n> [list ::Help::Next $w.t 1]
    bind $w.t <p> [list ::Help::Next $w.t -1]
    bind $w.t <b> [list ::Help::Back $w.t]
    bind $w.t <Key-space> [bind Text <Key-Next>]
 
    # Create the bitmap for our bullet
    if {0 && [lsearch [image names] ::img::bullet] == -1} {
        image create bitmap ::img::bullet -data {
            #define bullet_width  11
            #define bullet_height 9
            static char bullet_bits[] = {
                0x00,0x00, 0x00,0x00, 0x70,0x00, 0xf8,0x00, 0xf8,0x00,
                0xf8,0x00, 0x70,0x00, 0x00,0x00, 0x00,0x00
            };
        }
    }
}
##+##########################################################################
#
# ::Help::Click -- Handles clicking a link on the help page
#
proc ::Help::Click {w x y} {
    set range [$w tag prevrange link "[$w index @$x,$y] + 1 char"]

    	if {[llength $range] && [regexp "http*" [eval $w get $range]]} { 
    	    xplat::launch [eval $w get $range]
    	    return
    	}
    	if {[llength $range] &&  [regexp "@" [eval $w get $range]]} {

    	    set mail [eval $w get $range]
    	    xplat::launch "mailto:$mail"
    	    return
    	}
    if {[llength $range]} {::Help::Show [eval $w get $range]}
    
}
##+##########################################################################
#
# ::Help::Back -- Goes back in help history
#
proc ::Help::Back {w} {
    variable state
 
    set l [llength $state(history)]
    if {$l <= 1} return
    set last [lindex $state(history) [expr {$l-2}]]
    set history [lrange $state(history) 0 [expr {$l-3}]]
    ::Help::Show $last
 
}
##+##########################################################################
#
# ::Help::Next -- Goes to next help page
#
proc ::Help::Next {w dir} {
    variable state
 
    set what $state(all)
    if {$state(allTOC) ne {}} {set what $state(allTOC)} ;# TOC order if we can
 
    set n [lsearch -exact $what $state(current)]
    set n [expr {($n + $dir) % [llength $what]}]
    set next [lindex $what $n]
    ::Help::Show $next
   
}
##+##########################################################################
#
# ::Help::Listpage -- Puts up a help page with a bunch of links (all or history)
#
proc ::Help::Listpage {w llist} {
    foreach i $llist {$w insert end \n; ::Help::Showlink $w $i}
}
##+##########################################################################
#
# ::Help::Search -- Creates search help page
#
proc ::Help::Search {w} {
    $w insert end "\nSearch phrase:      "
    entry $w.e -textvar ::Help::state(search)
    $w window create end -window $w.e
    focus $w.e
    $w.e select range 0 end
    bind $w.e <Return> "::Help::DoSearch $w"
    button $w.b -text "Search Help" -command "::Help::DoSearch $w"
    $w window create end -window $w.b
}
##+##########################################################################
#
# ::Help::DoSearch -- Does actual help search
#
proc ::Help::DoSearch {w} {
    variable pages
    variable state
 
    $w config -state normal
    $w insert end "\n\nSearch results for '$state(search)':\n"
    foreach i $state(all) {
        if {[regexp -nocase $state(search) $i]} { ;# Found in title
            $w insert end \n
            ::Help::Showlink $w $i
        } elseif {[regexp -nocase -indices -- $state(search) $pages($i) pos]} {
            set p1 [expr {[lindex $pos 0]-20}]
            set p2 [expr {[lindex $pos 1]+20}]
            regsub -all \n [string range $pages($i) $p1 $p2] " " context
            $w insert end \n
            ::Help::Showlink $w $i
            $w insert end " - ...$context..."
        }
    }
    $w config -state disabled
}
##+##########################################################################
#
# ::Help::Showlink -- Displays link specially
#
proc ::Help::Showlink {w link {tag {}}} {
    variable state
 
    set tag [concat $tag link]
    set title [::Help::FindPage $link]
    if {[lsearch -exact $state(seen) $title] > -1} {
        lappend tag seen
    }

    if {[lsearch [image names] $link] >= 0} {
	set end0 [$w index end]
        $w insert end "\n"
        $w image create end -image $link
        $w insert end "\n"
	return
    }
	
    $w insert end $link $tag
}


##+##########################################################################
#
# ::Help::FindPage -- Finds actual pages given a possible alias
#
proc ::Help::FindPage {title} {
    variable pages
    variable alias
 
    if {[info exists pages($title)]} { return $title }
    set title2 [string tolower $title]
    if {[info exists alias($title2)]} { return $alias($title2) }
    return "ERROR!"
}
##+##########################################################################
#
# ::Help::Show -- Shows help or meta-help page
#
proc ::Help::Show {title} {
    variable pages
    variable alias
    variable state
    variable W
 
    set w $W(main)
    set title [::Help::FindPage $title]
 
    if {[lsearch -exact $state(seen) $title] == -1} {lappend state(seen) $title}
    $w config -state normal
    $w delete 1.0 end
    $w insert end $title hdr "\n"
    set next 0                                  ;# Some pages have no next page
    switch -- $title {
        Back    { ::Help::Back $w; return}
        History { ::Help::Listpage $w $state(history)}
        Next    { ::Help::Next $w 1; return}
        Previous { ::Help::Next $w -1; return}
        Index   { ::Help::Listpage $w $state(all)}
        Search  { ::Help::Search $w}
        default { ::Help::ShowPage $w $title ; set next 1 }
    }
 
    # Add bottom of the page links
    $w insert end \n------\n {}
    if {! $state(haveTOC) && [info exists alias(toc)]} {
        $w insert end TOC link " - " {}
    }
    $w insert end Index link " - " {} Search link
    if {$next} {
        $w insert end " - " {} Previous link " - " {} Next link
    }
    if {[llength $state(history)]} {
        $w insert end " - " {} History link " - " {} Back link
    }
 
    $w insert end \n
    lappend state(history) $title
    $w config -state disabled
 
    set state(current) $title
  
}
##+##########################################################################
#
# ::Help::ShowPage -- Shows a text help page, doing wiki type transforms
#
proc ::Help::ShowPage {w title} {

    variable pages
 
    set endash \u2013
    set emdash \u2014
    set bullet \u2022
 
    $w insert end \n                            ;# Space down from the title
    if {! [info exists pages($title)]} {
        set lines [list "This help page is missing."]
    } else {
        set lines [split $pages($title) \n]
    }
 
    foreach line $lines {
        set tag {}
        set op1 ""
        if {[regexp {^ +([1*-]+)\s*(.*)} $line -> op txt]} {
            set op1 [string index $op 0]
            set lvl [expr {[string length $op] - 1}]
            set indent [string repeat "     " $lvl]
            if {$op1 eq "1"} {                  ;# Number
                if {! [info exists number($lvl)]} { set number($lvl) 0 }
                set tag number
                incr number($lvl)
                $w insert end "$indent $number($lvl)" $tag
            } elseif {$op1 eq "*"} {            ;# Bullet
                set tag bullet
                $w insert end "$indent $bullet " $tag
            } elseif {$op1 eq "-"} {            ;# Dash
                set tag dash
                $w insert end "$indent $endash " $tag
            }
            set line $txt
        } elseif {[string match " *" $line]} {  ;# Line beginning w/ a space
            $w insert end $line\n fix
            unset -nocomplain number
            continue
        }
        if {$op1 ne "1"} {unset -nocomplain number}
 
        while {1} {                             ;# Look for markups
            set link0 [set bold0 [set ital0 $line]]
            set n1 [regexp {^(.*?)[[](.*?)[]](.*$)} $line -> link0 link link1]
            set n2 [regexp {^(.*?)'''(.*?)'''(\s*.*$)} $line -> bold0 bold bold1]
            set n3 [regexp {^(.*?)''(.*?)''(\s*.*$)} $line -> ital0 ital ital1]
            if {$n1 == 0 && $n2 == 0 && $n3 == 0} break
 
            set len1 [expr {$n1 ? [string length $link0] : 9999}]
            set len2 [expr {$n2 ? [string length $bold0] : 9999}]
            set len3 [expr {$n3 ? [string length $ital0] : 9999}]
 
            if {$len1 < $len3} {
                $w insert end $link0 $tag
                ::Help::Showlink $w $link $tag
                set line $link1
            } elseif {$len2 <= $len3} {
                $w insert end $bold0 $tag $bold [concat $tag bold]
                set line $bold1
            } else {
                $w insert end $ital0 $tag $ital [concat $tag italic]
                set line $ital1
            }
        }
        $w insert end "$line\n" $tag
    }

}


##+##########################################################################
#
# ::Help::BuildTOC -- Fills in our TOC widget based on a TOC page
#
proc ::Help::BuildTOC {} {
    variable W
    variable pages
    variable state
 
    set state(allTOC) {}                        ;# All pages in TOC ordering
    if {! [winfo exists $W(tree)]} return
    set tocData $pages([::Help::FindPage toc])
 
    $W(tree) delete [$W(tree) child {}]
    unset -nocomplain parent
    set parent() {}
 
    regsub -all {'{2,}} $tocData {} tocData
    foreach line [split $tocData \n] {
        set n [regexp {^\s*(-+)\s*(.*)} $line => dashes txt]
        if {! $n} continue
 
        set isLink [regexp {^\[(.*)\]$} $txt => txt]
        set pDashes [string range $dashes 1 end]
        set parent($dashes) [$W(tree) insert $parent($pDashes) end -text $txt]
        if {$isLink} {
            $W(tree) item $parent($dashes) -tag link
 
            set ptitle [::Help::FindPage $txt]
            if {[lsearch $state(allTOC) $ptitle] == -1} {
                lappend state(allTOC) $ptitle
            }
        }
    }
}
##+##########################################################################
#
# ::Help::ButtonPress -- Handles clicking on a TOC link
# !!! Sometimes misses clicks, so we're using TreeviewSelection instead
#
proc ::Help::ButtonPress {} {
    variable W
 
    set id [$W(tree) selection]
    set title [$W(tree) item $id -text]
    ::Help::Show $title
}
##+##########################################################################
#
# ::Help::TreeviewSelection -- Handles clicking on any item in the TOC
#
proc ::Help::TreeviewSelection {} {
    variable W
 
    set id [$W(tree) selection]
    set title [$W(tree) item $id -text]
    set tag [$W(tree) item $id -tag]
    if {$tag eq "link"} {
        ::Help::Show $title
    } else {                                    ;# Make all children visible
        set last [lindex [$W(tree) children $id] end]
        if {$last ne {} && [$W(tree) item $id -open]} {
            $W(tree) see $last
        }
    }
}
proc CenterWindow {w} {
    wm withdraw $w
    set x [expr [winfo screenwidth $w]/2 - [winfo reqwidth $w]/2 \
               - [winfo vrootx [winfo parent $w]]]
    set y [expr [winfo screenheight $w]/2 - [winfo reqheight $w]/2 \
               - [winfo vrooty [winfo parent $w]]]
    wm geom $w +$x+$y
    wm deiconify $w
}
 

proc ::Help::PrintHelp {w} {

    if {[tk windowingsystem] eq "aqua"} {

    set printfile [open [file join $::env(TMPDIR) help.txt] w+]
    puts $printfile [$w.p.help.t get 1.0 end]
    close $printfile	
    exec /usr/bin/textutil -convert html  [file join $::env(TMPDIR) help.txt] -output  [file join $::env(TMPDIR) help.html] 2>[file join $::env(TMPDIR) converterr] 
    catch {exec /usr/sbin/cupsfilter -i "text/html" [file join $::env(TMPDIR) help.html] > [file join $::env(TMPDIR) help.pdf] 2>[file join $::env(TMPDIR) printerr]} 
    after 100
    cocoaprint::print [file join $::env(TMPDIR) help.pdf] $w
}

    if {[tk windowingsystem] eq "win32"}  {
	set printfile [open [file join $::env(TMP) help.txt] w+]
	puts $printfile [$w.p.help.t get 1.0 end]
	close $printfile
	xplat::print [file join $::env(TMP) help.txt]
    }
	
}


::Help::ReadHelpFiles $library
::Help::ReadImages $library
::Help::Help "QuickWho User Help"


<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/machelp/help.txt.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
title: QuickWho User Help
alias: TOC

 - [Overview of QuickWho]
 - [Installing QuickWho]
 - [Using QuickWho]
 - [Scriptability and Services]
 - [Help]
 - [Acknowledgments]
 - [History]
 - [License]

-------------------
title: Overview of QuickWho
alias: Overview

QuickWho provides a rich array of information about specific Internet domains that surpasses other command-line, GUI or web-based "whois" tools. Are you curious about who owns a particular domain name? Do you want to contact them, or gather more information about them? QuickWho can help you with these tasks.

[quickwho-main]

'''Why QuickWho?'''

QuickWho compared to other "whois" tools:

 * Much richer than other "whois" tools: includes geographic data, map data, and simple "whois" data, as well as raw whois output.
Geolocation of domains via map data.
 * Less cumbersome than using an Internet-based whois tool. No need to load web page into browser.
 * Pleasant-to-use, platform-native interface.

-------------------
title: Installing QuickWho
alias: Installing

To download QuickWho, go to [http://www.codebykevin.com/quickwho.html]. You can install the application anywhere on your machine. The downloadable version is a 30-day demo; if you like QuickWho, you can purchase the program and run it past the 30-day trial limit.

-------------------
title: Using QuickWho
alias: Using

QuickWho provides a rich array of information about specific Internet domains. It offers several ways to get information about a domain. The fastest way is to type in the name of the domain name you are querying in the search field, hit return or the "information" toolbar button, and view the data in the text display. You can also select "Get Information" from the "whois" menu.

[quickwho-main]

Here is an overview of what QuickWho provides:

* Distills basic whois data to an at-a-glance list, with both domain information and geographic information about the domain. This is done through a mix of approaches: the Python pythonwhois library, for basic information about the domain; and the ip-api domain information server, which retrieves geographic information about the domain (city/state/country, latitude, longitude) based on the IP address. The raw whois data can also be displayed; this can be configured in the preferences. The result is that more precise, accurate whois data is delivered.

* Displays the text data as rich text with clickable URL's for domain names and e-mail addresses, to facilitate e-mailing or displaying domain information in a browser.

* Displays map information from the domain, based on OpenMapquest ([http://open.mapquestapi.com/staticmap/]) for map data.This can be useful for gathering more information about the domain.

-------------------
title: Scriptability and Services
alias: Scripting

'''Mac Scripting'''

QuickWho offers basic AppleScript support with the "get domain" AppleScript command. The "get domain" call takes a domain name as a parameter, and will display data about that domain in the QuickWho GUI and will also log the data information to standard output for use in other applications. To use QuickWho's AppleScript support, create an AppleScript like this:

   tell application "QuickWho"
      get domain "apple.com"
   end tell

Then, run the script in Script Editor or as part of a larger AppleScript package.

As an example of integrating a QuickWho AppleScript with other applications, here is another sample script:
 
   tell application "QuickWho"
      set thetext to (do script "getDomain \"apple.com\"")
      tell application "TextEdit"
         make new document with properties {text:thetext}
      end tell
   end tell

QuickWho can also be called from the Mac's Services menu. To call QuickWho from the services menu, highlight a domain name in a Services-aware application (such as Safari, Mail or TextEdit) and select "QuickWho: Display Domain Information" from the Services menu. That domain name will be passed to QuickWho and the domain information displayed in QuickWho's main window.

QuickWho also supports the ability to call other Mac applications from the Services menu. To call another application's service--for instance, to display a domain in Safari--simply highlight the text in QuickWho and then select the appropriate item from the Services menu.

'''Windows Scripting'''

Windows scripting is currently under development.


 
-------------------
title: Help
alias: Help

QuickWho provides comprehensive user documentation from the "Help" menu, and also provides tooltips for the toolbar buttons. Additional user support is available via the "Contact Code by Kevin" item in the Help menu.
 
-------------------
title: Acknowledgments
alias: Acknowledgments

The following open-source technologies have gone into the development of QuickWho:

 * The Tcl/Tk GUI toolkit. Website: http://www.tcl.tk. License: [http://www.tcl.tk/software/tcltk/license.html]
 * The Python programming language. Website: http://www.python.org. License: [http://www.python.org].
 * Ip-API ([http://www.ip-api.com]) for geo/IP data.
 * OpenMapquest ([http://open.mapquestapi.com/staticmap/]) for map data.
 * App icon from the Gnome project. Website: [http://www.gnome.org]. License: [http://creativecommons.org/licenses/by-sa/3.0/].
 * Toolbar icons from Iconic project. Website and license: [https://github.com/somerandomdude/Iconic].
 * Help viewer by Keith Vetter: [http://wiki.tcl.tk/19649].
 * pythonwhois library. Website and license: [https://pypi.python.org/pypi/pythonwhois/2.4.3]
 
-------------------
title: QuickWho Version History
alias: History

'''6.4 (March 17, 2018):'''
 * Improved error handling if geo-ip data cannot be obtained.
 * Migrate to new source code server.

'''6.3 (February 24, 2018):'''
 * Improved resizing of main window for efficient UI.
 * Removal of console on Windows.

'''6.2 (May 1, 2017):'''
 * Improved scrolling performance, security support on macOS.
 * Improved security support on Windows.

'''6.1 (March 1, 2017):'''
 * Improved security on software updates.
 * Minor UI enhancements.

'''6.0 (May 1, 2016):'''
 * Updated whois library returns much better results.
 * Update to Python 3 modernizes development.
 * Initial port to Windows. 
 * Update of geo-ip web service.

'''5.1 (April 15, 2014):'''
 * Improvements to Sparkle update engine.
 * Minor bug fixes.

'''5.0 (January 1, 2014):'''
 * Updated, modern UI with support for Retina displays.
 * Fullscreen support.
 * Supports Lion-stye auto- and sudden-termination.
 * More responsive display of data.
 * Update to printing engine.

'''4.0 (May 1, 2012):'''
 * Significant improvement in domain accuracy.
 * New under-the-hood application structure for better compliance with Mac App Store guidelines.
 * Minor bug fixes.

'''3.3 (December 1, 2011):'''
 * Integration with Lion sandbox requirements.
 * New engines for geolocation and map data.
 * Other bug fixes.

'''3.2 (April 15, 2011):'''
 * Fix bug that prevents displaying of some domain data.
 * Improved stability when printing output; print preview and saving as PDF/Postscript now supported.
 * Native-UI toolbars.

'''3.1 (October 15, 2010):'''
 * Now supports native printing.
 * Minor bug fixes.

'''3.0 (July 12, 2010):'''
 * Complete rewrite with significantly expanded functionality.
 * Displays distilled whois information and geographic data.
 * Displays map information about specific Internet domain.
 * More robust AppleScript support and Services integration.

'''2.3 (April 12, 2010)'''
 * Fixed bugs in window menu that could cause application to freeze or crash.

'''2.2 (March 18, 2010)'''
 * Additional support options through help menu.
 * Fixed potentially serious UI glitches with sheet windows and window menu.
 * Keyboard shortcuts now work correctly.

'''2.1 (January 21, 2010):'''
 * Now a fully 64-bit application.
 * Now includes support for AppleScript and Services.
 * Main window behavior now fully conforms to Mac UI standards: window hides when closed or via Command-W, and minimizes via Command-M.
 * Bug fixes and optimizations for faster output.
 * Assorted user interface improvements.

'''2.0 (October 19, 2009):'''
 * Now built on the Cocoa frameworks.
 * Updated user interface includes more modern button styles.
 * Faster, more intuitive help viewer.

'''1.1 (April 7, 2009):'''
 * Enhanced GUI with toolbar and keyboard shortcuts.
 * Quickly query multiple servers for whois information by browsing tree view.
 * Configure text display through preferences menu.
 * Save and print whois information.

'''1.0 (December 1, 2008):'''
 * Initial commercial release.

-------------------
title: License
alias: License
 
'''The MIT License (MIT)'''

QuickWho source code: [https://www.codebykevin.com/fossil.cgi/quickwho/]

Copyright (c) 2018 WordTech Communications LLC

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






































































































































































































































































































































































































































Deleted scriptlibs/machelp/images.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
image create photo quickwho-main -data {

R0lGODlh1gKbAfcAAAkJCTMyMyQhIEU7NlJKOjo8RRFpVDBjW0hHSFhXWVBPUGVb
WGZYTG5mWlhbZUxXZ1tkbWhnaHRsZ3h0a2drdXh3d2xzdV9iXj9BPYV7dod3a45t
WvFgXXORdXaoeVCNdDu0W4+Id7Kud5ifdNi9eM25c+i7adrFetXHdeXJeerQd/7A
QeTBTWt4h3V7hm17lWR5oHFx/1hW/y9SqpJ6uXmDiXiGl2yLknmrjXaIp3aNrmWh
mXmT1oeIh5iWiYWMlomTmZeYl5GPh6aZjoiqh5Wri4i2i5W0jJmplYu4lZy8mpe4
lYarl6immaW6mra5mLGvj4mXp5WcpoeYt4uUrpmkqZmntpC2qaeop6m7pLa5qKSs
tqm0ube5t7atpaKdps67i8W6r+OrkZzDnJfHmZHGk6LDnajGmrjHmq3OlJvHpJrN
qqTEoqvEpKTLo6vLpazMqqnHqrPMrLfHqa3Tq6bVqLLTrbnUqqjKtbzMs7fKtKzV
tbTUsrvUtLXas7vbtbzburrWurvhubHisdrHh8fJmdnKl9nVms/Oj+XKh+fUiOPM
luXWmPLWjMbLp9fMpsnVqdTVrNTarNvbrNnWpsbKt8PTtMTUu8vVvMPbvMvbvcnX
tNTVs9Tas9vbtNTbvNvbu9jVuNTJueTYqOXat+fQqcbivdniudriqubkqOXkuPHp
r+njmYibxJasz6m3xrW8xaW52qiyzZCP/6i85LCx/Z6n97nEybnZxbrI1a3P0Lrj
yqnH6rfO7KjT4MHBwc7OzsfJx9TMxszcw8fZxtPcxNjax8bM1cra19PT09zc3Nfa
1tbM1OTbx+Td1vHZyszjxMjkyNPixdvjxNTjytvky9nqy8rj19zk09zr0tjm2djx
1ePkzObnyePl0+Pr0+Tk2+Tq2+ro2efy2PHn08ra5dbd5MTb9M/O/crj6dnl6Mvk
9Mbk/Mnl/cvo/cbm9tTo99ry6+Pk5Ozs7Ofo5vLs5/bz7Ofs9Ozy9/Pz8/////f4
+Ozx6uPc9MW6+AAAACH5BAEAAP8AIf8LSUNDUkdCRzEwMTL/AAAPNGFwcGwCEAAA
bW50clJHQiBYWVogB+AAAQACABEAMAAqYWNzcEFQUEwAAAAAQVBQTAAAAAAAAAAA
AAAAAAAAAAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARZGVzYwAAAVAAAABiZHNjbQAAAbQAAAQa
Y3BydAAABdAAAAAjd3RwdAAABfQAAAAUclhZWgAABggAAAAUZ1hZWgAABhwAAAAU
YlhZWgAABjAAAAAUclRSQwAABkQAAAgMYWFyZwAADlAAAAAgdmNndAAADnAAAAAw
bmRp/24AAA6gAAAAPmNoYWQAAA7gAAAALG1tb2QAAA8MAAAAKGJUUkMAAAZEAAAI
DGdUUkMAAAZEAAAIDGFhYmcAAA5QAAAAIGFhZ2cAAA5QAAAAIGRlc2MAAAAAAAAA
CERpc3BsYXkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtbHVjAAAA
AAAAACIAAAAMaHJIUgAAABQAAAGoa29LUgAAAAwAAAG8bmJOTwAAABIAAAHIaWQA
AAAAABIAAAHaaHVIVQAAABQAAP8B7GNzQ1oAAAAWAAACAGRhREsAAAAcAAACFnVr
VUEAAAAcAAACMmFyAAAAAAAUAAACTml0SVQAAAAUAAACYnJvUk8AAAASAAACdm5s
TkwAAAAWAAACiGhlSUwAAAAWAAACnmVzRVMAAAASAAACdmZpRkkAAAAQAAACtHpo
VFcAAAAMAAACxHZpVk4AAAAOAAAC0HNrU0sAAAAWAAAC3npoQ04AAAAMAAACxHJ1
UlUAAAAkAAAC9GZyRlIAAAAWAAADGG1zAAAAAAASAAADLmNhRVMAAAAYAAADQHRo
VEgAAAAMAAADWGVzWEwAAAASAAACdmRlREUAAAAQAAADZGX/blVTAAAAEgAAA3Rw
dEJSAAAAGAAAA4ZwbFBMAAAAEgAAA55lbEdSAAAAIgAAA7BzdlNFAAAAEAAAA9J0
clRSAAAAFAAAA+JqYUpQAAAADgAAA/ZwdFBUAAAAFgAABAQATABDAEQAIAB1ACAA
YgBvAGoAac7st+wAIABMAEMARABGAGEAcgBnAGUALQBMAEMARABMAEMARAAgAFcA
YQByAG4AYQBTAHoA7QBuAGUAcwAgAEwAQwBEAEIAYQByAGUAdgBuAP0AIABMAEMA
RABMAEMARAAtAGYAYQByAHYAZQBzAGsA5gByAG0EGgQ+BDsETAQ+BEAEPgQyBDgE
OQAg/wBMAEMARCAPAEwAQwBEACAGRQZEBkgGRgYpAEwAQwBEACAAYwBvAGwAbwBy
AGkATABDAEQAIABjAG8AbABvAHIASwBsAGUAdQByAGUAbgAtAEwAQwBEIA8ATABD
AEQAIAXmBdEF4gXVBeAF2QBWAOQAcgBpAC0ATABDAERfaYJyACAATABDAEQATABD
AEQAIABNAOAAdQBGAGEAcgBlAGIAbgDpACAATABDAEQEJgQyBDUEQgQ9BD4EOQAg
BBYEGgAtBDQEOARBBD8EOwQ1BDkATABDAEQAIABjAG8AdQBsAGUAdQByAFcAYQBy
AG4AYQAgAEwAQwBEAEwAQwBEAP8gAGUAbgAgAGMAbwBsAG8AcgBMAEMARAAgDioO
NQBGAGEAcgBiAC0ATABDAEQAQwBvAGwAbwByACAATABDAEQATABDAEQAIABDAG8A
bABvAHIAaQBkAG8ASwBvAGwAbwByACAATABDAEQDiAOzA8cDwQPJA7wDtwAgA78D
uAPMA70DtwAgAEwAQwBEAEYA5AByAGcALQBMAEMARABSAGUAbgBrAGwAaQAgAEwA
QwBEMKsw6TD8ACAATABDAEQATABDAEQAIABhACAAQwBvAHIAZQBzAAB0ZXh0AAAA
AENvcHlyaWdodCBBcHBsZSBJbmMuLCAyMDE2AABYWVogAAD/AAAAAPMWAAEAAAAB
FspYWVogAAAAAAAAccAAADmKAAABZ1hZWiAAAAAAAABhIwAAueYAABP2WFlaIAAA
AAAAACPyAAAMkAAAvdBjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgALQAy
ADYAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8AowCo
AK0AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQEr
ATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZ
AeEB/+kB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwC
tgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oD
xwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4F
DQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsG
jAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDII
RghaCG4IggiWCKoIvgjSCOcI+/8JEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQon
Cj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxc
DHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3eDfgOEw4uDkkOZA5/DpsOtg7S
Du4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExExEU8RbRGM
EaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSL
FK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb/+hcdF0EXZReJF64X
0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsb
YxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMf
Ph9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgj
ZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn
3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4s
oizX/y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC
Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbp
NyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTyk
POM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1
QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kd
SWNJqUnwSjdKfUrESwxLU0uaS//iTCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP
3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSPVNtVKFV1VcJWD1ZcVqlW
91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpe
bF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedm
PWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJu
a27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHD/dMx1KHWFdeF2Pnab
dvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+E
f+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjO
iTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6
kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJ
nPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9
p26n/+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx
1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9
Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3I
vMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnU
y9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3h
ROHM4lPi2+Nj4+vkc+T85YTmDf/mlucf56noMui86Ubp0Opb6uXrcOv77IbtEe2c
7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn
+3f8B/yY/Sn9uv5L/tz/bf//cGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAA
Cg52Y2d0AAAAAAAAAAEAAQAAAAAAAAABAAAAAQAAAAAAAAABAAAAAQAAAAAAAAAB
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
IAzb93zq13rAIAqeyAzOsHvNtwzGIAh1UAZpoArCp37PR36SmH3uJ4RNqImOmITp
x3sRqIm6uHzkN32smImtmInNF4vE6IBCyH/kpYvKOIyaSIQMyIqxaIzNt3zLKIvE
+Iu7WIfWaIy0aI3ux4vD6IrMyIqu+I3WmIvMmH7leIvdKIDXOIq/mIzdaISb+IyS
WI3e6ICzZ4/t2IzB8AvH6Iv1l4TqR4HUSJCd9IpGuI7j6Hyy+IT8F4fKCI0OiYsU
qIvcWJC6uI+uqHsYuY0YqY8dmZHuiIAa6ZHQKI7m2IuZiI752Iv4SP5+zKBJH+mK
5YiNsoiS48cMFSiF+tiMsEiOHzmMzEh/rdiNMBmNttiKPJmU97iOR2mL6fh85tCP
o0iQP9mPFImLT9iMyliHN7mVE3mTYSmLvdiGmmiTaTmRbNmWY+mNb7mWbumNYVmW
RzmXcCmXeLmXfNmQ5aiWfKmMaFmWQRmYhnmXxKiWDSmYh3mUdmmYPEmMCcmWMsmP
bmmPYemXG3mYj9mYnRmYdvmMdRmXnNmWlomXwDiajWma11iWn7maefmSePmZp3mZ
m5mPe/marLmaCUmNmggMyQCcbUmNwrl8xVmcoSScwhmcv7mcwKmcuvic0Tmd0vmV
zDmd18mcyv7pnPcIDMvplr55j8EpncT5fMDpm9/pleaZnumpjN4JneO5npLYnm3J
nd5pnHsJn9m5n8X5m9jpnPg5nN7pnwRqns+Hns9ZnsOJneNZifxJnfNJnwc6oQ6a
nMpJnNVpnO3poPLJoPsZStEZoPs5ohNqoAUanKHUSQ6aniK6oQSanA9aneJpotRo
oRmqn/2Jo7uIouLJntk5oAf6nf1ZoMsJohDaoAZanhqKnRZ6oh4anySqngZaiUJq
otlppDuKl50UnrB5mFzapV5aomA6ppL4pWTamJM5kWYamGu6oG16pmwZnsuXpuAJ
p1/5pna6oHkKm725p3zKm3uKp346l/6COqh1aqeFOqNZaqh4WSLSkSMqEqktIqmQ
Sh+Wyh6SoSOXuqmS2iGXGh+WQiKcOqrwIaqfih2kWqqd+h7GkarN4aqVuqqYwQ8e
oqmuqqqjShuZ2h6xOiKhuh67GiKgequW2qvEyqu2Sh+xaqzzwBnH6hm0Kqu4+ium
eqwRQa2Yiq2pcSOVoavbCiPP+hThOq7kSh+7ih+5Oq7nuqnr6hntWq7iSq7veqnt
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
WWxFVCRFdpjFCPSuo3uup1GuKOuJ7xqvknC/nguJRwQJMTKwMsO157I395sJQgvC
0DilL0FG9uuzmLhGThSr7oJGsJo3rwmvJsuIZdwyKztHrkHGfDOwe/hG8HLHKAuz
ezhGjUg9YPQtd3xHh7jHspHGh/7ox4vAh2+0PIqIxyYLSGV0R4rAh3iICGmMwxyK
yImkSIisyIikRomcSLDRQ0K7Lu66SDjMspDMSIzUSIksyZDcyDhMSYxsSZYEyYuk
RiyTSYucSZusyJLMyFLJSZXUSYukyJeESKE8JZXsyJNkSZ9MSpkkSqQkr5X8R5ts
yqIUypTkSKN0yqFkSpI0yTikx6A8yqWcypD8SqxUyqzsyqrkSYqMB6BUSodzSTgs
y6WsSUKbS7GUS7CEw7acSL5Ey6ukh7sESrhkyVHRQ8zYQMyoQMxoKsRMzMZkTMeM
TAucTMh0zMesTL2hwMisQL3Rm8jETMbcQM1MzA08wccMTf7EBM3MFM3QxMzE3EzV
tMzVVM3F/MzJxMzO9MwJFE3chEzXfE3ajE3JnMwVlM3eRM7YdM3ZRM7kbE4VhE3Y
nM3lbM7qhE3brM7j1E7KpE3exM4LZEzlrEzVTE3fDE/UZE3i3E715E3ItE3qdM/x
NM3G7Mz2BM3URE/cxE7fxM/tzM/eLM/yBIZlsMBjGM/KXMwDBc8DXU/z5EwGTU8G
XcwEDc7wfNDuhFAITVD7BIYSc8C68NAPFYoQFVETK8AHFEC9GMD7Y9EWXcAPJdEW
9b8UnVFOOUAX3TAT1dETbdEYndEavYsYjdH9A1IVBdEdLdEVtdEaTUAaRdIX/dAi
Rf7REhUK7AMtadQHfFRS4wMlHy3ALe2/FD1RMKXSMH1SHJ1SM/3STVlRJnXAAbxR
EdPRIY3STiHTI9XR4fNSLuXTPvXTPwXUQCU+5stS5PmFSdMHiAgKxaTAY+hAvQmG
EWQGRyVBEqRUDKRUSF3BEWxUE+SdfFiGkOg6y9M6A1TABxyxBOS6VWXVVnXVV4XV
WJXVVkW7WDVVFk0dfhCHcOCHcbAHftgGbVCl1LEHeyBWe/DVRL0HfDAeUyVWVi3W
aDVWsUjV5jHWWbUH6IvVbM0HaS1WDjs9bCu9G2u7HLvWyaAHfEjXfbjWVm1XDoPW
bhULsbtTQbXXe8XXfNXXaP4DO3r4hV+AhUhN1IdI1ASogNPogRBwgR6ogRBA2A5Y
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


}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<








































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/machelp/machelp.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package provide machelp 1.0 

package require xplat
namespace eval machelp {


    if {![info exists library]} {
	variable library [file dirname [info script]]
    }


    #set app name and version to parse help url correctly
    proc setAppName {app version} {

	variable appname
	variable appversion
	
	set appname $app
	set appversion $version

    }
    

    #open help url online
    proc userhelp {} {

	variable appname
	variable appversion
	variable library

	source [file join $machelp::library help.tcl]

    }

    #e-mail developer for assistance
    proc usermail {} { 

	variable appname
	variable appversion

	xplat::launch mailto:kw@codebykevin.com?subject=$appname
    }

    #access user forum
    proc userforum {} { 

	variable appname
	variable appversion

	xplat::launch http://www.codebykevin.com/forum/
    }


    #e-mail developer for assistance
    proc appweb {} { 

	variable appname
	variable appversion

	xplat::launch http://www.codebykevin.com/$appname.html

    }

  #sign up for newsletter
    proc newsletter {} {
	
	variable appname
	variable version

	xplat::launch http://www.codebykevin.com/newsletter.html

    }


    namespace export *

}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


























































































































































Deleted scriptlibs/machelp/pkgIndex.tcl.

1
2
3
4
5
package ifneeded machelp 1.0 [list source [file join $dir machelp.tcl]]



    
<
<
<
<
<










Deleted scriptlibs/machelp/win_images.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
image create photo quickwho-main -data {

R0lGODlhSAPYAfcAAAICAhcXFy8vMCEfIWNQLStQZFFQUmxVUnFmWFNWallncmhp
aGxzdnR0dHh5eXFub2ZdZz85RrU1NKVjLtNrMbRST45tVLppV7ltTot1crV0bI9Z
VsZpScVoVs92TsZ1bs1eUb4yOXOIdkWqNamZMOCiI/HWKpCGeK6OdqmbWtiHVOeS
WPGnWMyKdOmZZe2WafKnasusbevXWJ7QTBhlmVZuj3d6hmx1jV1xo3Rx/1he9TFa
yox4jKN6k453/8h8hiScqXuDiHiGl22Lln+TqnqTp3ONq2Obphmb03GXxnKt0F+e
4WrT8iLM0oeHh4SJlJiZl5KQkLCUjpmlmaakm7enkomUoY+Zo4CUq4eXqoebtJKT
qouju5eou5Wqqaipp7a0qre4t6yvsqiaqceKh8eXls6Tjs2tlda4qM+yreW1seGj
lbfHuqDOsNbMmNjIqNjVqsbFutjIt9jXt8vRrubYuebOsdXkuOvmuOXWlpaqxZqz
y5e00Zm205y51Z+72JW62Yitzae3yaS+26W61bK3yZGP/7Gz/p2h7dC26LrEx6bA
3anD3qrE17jI2LHUy73jxbrn06zG4a/J5KfK5rLL5bTO6LPJ4rrS67nU6bPR9ZrT
5sbFxczMzMfIx8rVytfXycnM0s7S3srW1tPU1Nzc3NfZ19fKx+fJxufZx+fa1vLW
0cbmytfmysvo1tPm09Pq1Nzk3NTr293s3dnm193x3dfy2M3x1ujmyfToyuPk3OLt
3evs3Ojo1vXq2OPx3ery2vfz2vDyzMjY6dTc7tfb5Nbd8Njf8dnY/8jS9+rZ8Mvn
6d3t49zt69bn6N3x493x69Xy5szk9MXk/snl/cvp/cjn9tTl893i89Tq9Nvs89Tq
+9jp+9vy+M3x6+Pk5OPt4+vt5OPt6+3u7ejl5vPt5PLu6/jp5uPx5Ovy5eTy6uzz
6+v56vPz5Pvz5PPz7Pr07Pr66+Ln9OPs9Ozv+Ont9fXs9+zz8+30+ub19/Hx8P37
9PP1+vX7/f////j29CH5BAAAAAAALAAAAABIA9gBAAj+APkIFKinDxc9AxMqXMhQ
YJ+GECNKnMjwIZ+HFi1SFEhoo8eFHT+GhDjyo8KSJlOq5INypcuXMPfAnEmzJkub
OHMylKmzp8+fQIO+1KNlSxctXYxq8ZJ0CxenRpXu4YJ0i9OkXLxw4dKF6tExT7nw
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
1LK16GqJzexNJzvU1OYzsEm96FKvNtCCRrepqX3sWq/62qpOLKS1XW5Sz1rWts11
nHdtZ1/XV9uXNu+xuc3oY69a2XtmtrWfLepbTzvRTHa0nX8NcG7T29ttdva0PT1u
Sm8b0OdW9zz+T91uUUu8zvour8I/bmxXA3vQhH5tn5NNZ2/Pk93O3rO9Ld1aUj/b
5dYWtaaR++ZFwDrRsQ76weWsc53He9OL/vTJbf1sgROd59gWdLpZy2ejs7YR3l76
m/UgCJs1yKth4ITaOSEGLKC1EYzI8KrMTggsiIGsd0flXweR1T5AwAMcoIBbK8CD
MEAhA2MoRAbcSoHGfyADhKizFm6AAxyIQRzFEMQkJtHrScSdAQLAwSAEYQMFMNAK
gRDEA+L1BD08IQmNEEIgGGEF2BerEVjggxYgoEzO91oSvv998H9P/OIHf/ieT77x
i+9mziOf+MMH/uabz3zgQx/W0O88Izb+T4lBK1/40Wd++K2f/epbP/rTF38jnC98
Ng+fEuknv/znH//yU5/87l9+8yexfuHT3/z+p3/mt3mbV2jbh37jZ38BCIDz14D1
J3z9h3z512vwd3ydt4DSV33Ph38NKH+b138XuIEMOH4J2HkEaIAP+IDit4IM6IDQ
p4IiaIK/V4G/t302uHmM0IIa2HzY53sl6IIBSIMdyILkd3yTAH83uH0KaIEmqAeE
cAkEOAl6IFVUeAV7QICScAl2wQWOwH5aAAVbAAVQkAWTcAkXiAldwGI/wFce0AEf
cAEZkAFwKIce4FYdAAI/kAGSUAmTUAmSwAd6gAVciAlZWAl8SID+l3AJXsBZFWiI
UWiIkHgJhpiIkmiGewiJkBiFBHiIiNiHhuhmlSCJj6iJo7h5nOiJpOiIpdiHm6iJ
p+iKpniKqoiFs0iKtliGrHiLfJiJm/iKpniLnliIsKiLnviKrwh8hyh9q2iMwHiI
quiHuUiLzPiLtliL0eiMvliNsMiL2kiMvAiF1kiNrfiLUJiKzViMw4iFuaiM4xiN
4miOqNiHyKiJl5iO2RiP7YiNwLiKv8iN8KiN34iP/HiNuLiP/+iKvqiK7CiQBWmN
nPiQsjh9A7mLjgiOBul8rriHseiO4UiKl3CA7ciRIWmITjgrrpIJyYBJJ5lJr7Jh
euAIKfn+KpcgCIKwB5qnkrHSBYSQAWbwA6zkkz75Aa2ES2ZABmbQSmTwAMWIiUyJ
iYkIiRbVlNjIlJIolVbpiEy5lFcplVWplVuJlVfplc+Yibz4lU7ZlBsJiZbQlZqw
lpgolmZplXCZlXRJkXLZlFUZl3VJlpqwlXn5legolY+YiX95l29pl1u5eZagmLEI
lnr5mGfpiIu5lKiYmHgJmYd5mH15lYUZlmSJlr1YkWaplawYl4w5CZOZmZgJmXmJ
mo25i7iommE5l2rpmly5mqv5l+Uom585iXqZlhV5CX1pCYupmrTpiQsmCIVACDTZ
nM7JnDTJnF0gCXugk88JnYKAnc3+WZ2HwAM8oAHfGYc90AMakAEaQJ4acJ7mmQFP
YIibSZyWUAnEaYjzKZ+WgAmGiJ/uKZ/7KZVtCZ9MqZ8ACp8Eap+byZTDOZ/6uZ/z
GZ8HSqD1+Z/2SZ+QeKD0CaASKonwmaCRyKDx2Z8fap8QegkQWqAXCqD9OaFM6aD8
WaEoWqEi2qIiGqGYWKIfaqE1Wp+YqJ8cuqIpKp/vGaJBeqKV8KA2GqJFqqI4OqRF
WqKYaKFHGqImmqRP2pQsOqA3mqOW8J86CqE/aqM/qqVNyaMqWqNfyqRUWp8YqpZH
WqU0WqVK6qQwyqZgeqJCiqBWmqRY+qXEyaXzSaJb2qBUOqj+ZoqjRBqKBOqnd1qg
S1qmaDqndNqnaoqiKEqi74mnk1qggNqmHpqlbhqKi+AYhPAQHTE4fUAIe1CqE9II
ofhULJGqLBESVxWrWGUJg7AFemAUXBAsSaEFZvVJoGQUfegqlYA8xUqsxooJxImT
zNqsynqfzHqs+Kms04qs0Oqs2Nqs92kJmSCt1Sqt3pqt4tqs4JqszBqf53qt44pJ
4bqu7pqt91murqKu5+qs7Zqt8lqt03qt7VqsW/qu5qqS+QqvABuw5Fqw7hqvAUuv
OMmwBjuu+Vqu/IqT/qoJCHuvA4utDgux+Iqw74qxALusG7ux+jqxyJqwBXuvE2ux
Gkv+spiEruyKPPcZPCbrseLarjEps5gQkyzrKvjAD/hAD/gwtEI7tEY7tP1wtPZw
tPiwtEx7tEKbtExbtFOLD1JrtFQ7tE77tFibtUxrD0CLtFVLtFzbtFtbtmf7tPQQ
tljLtVRLtUnrtfhwD1frtHLbtPowtkGrt0pbtka7tXJrD3krtlBLtmjLtlo7tncr
uHzbtmXrtfRwtUH7tkzLD2lLtWlruEY7uHCbD39buI1LuaB7tJbrt4mruX87uFar
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
D25errfh86ZXEoY6e3lBN/4sNy+9AyK+lhfuv/Gf3LgPf0h6L8LMj6+3/QUnv3Hb
NX6Ct5/4Icf++YnYxNnfALJfu3ycwfnZ/xEKwq3X/alfVRlKkjgg9vxfeomYUzng
ezggM9WcSRmHAA4fl6yf/B3gkDCcwwGgm1BVROzBXTiCItCgIvhQDfpQDupgIfAg
mCgCmPQgDx6SYABfiBCfVBFcsMTLRwyaXgUX0/DW4VVaoj0epxEeW4BFY0nhGElh
UpxWT6TaGAEFYcVaUpAF4ZUaTKTWTrAhG9rAEzyBEDgBHMohHNrhHeLhHN6hEOzh
HPLhEzjBH+LhE0CBFRjiIW4BFLShUFzBFWxBIzriI0LiJD6BDdiAA9gAA2CiJmai
AzDAJzaAJjZAKH5iKZpiKT5AKdoAI07+YitCIhQ0ohVcgRXAYiNuwU7UoiLaoite
QSUywCX+4icCYyl6IgOQYigqwCkyQDIuIwM8gAK8IS9OohaMwS42IjUa4jRuAS1K
oytWoxZYozRS4yRmgSRKoi2eoyO2olWcozl24zs2YjWqIy9qgSJKYhbA4zXKoy2C
YzfKohWMgVVAolXU4jvCYjZ2Iz4+4jk+Ui2mYyNOAUKuYySGYzreokVC4jjyY0Fa
JBQ80jp+JDp+5CPJois+5ENKo0UmYkjqYyMqZDdqJC9WogNgoiUKoymG4iiOojGC
Ik72ZANYQRAwQBDgIzbS4z6+4hWU4zbSYhZYARwe4iDi4R8GYiD+wmFVUqUgAqIc
1iEgxuET8IBWduUTWEkf0qETBMFX+uEeemVWbiVZxuFa2uEc+qEeWuVa6iEfWqVe
poUeDqJefuVY2mFYvqVXBqZf0iFcxiVbwmEw0qQlPqYnSOZkSuY+ecI+cYInxAFl
cuZkYiYnfMJkdkJnSmYncIJpckIcYGZlpuZkqqZlZqYndMJormZm7hNt0uYpnGZm
dsIpyGZpzuZlUmZoXqZpekIoZKZveuZlfiZzMmdsciZsriZqOmdlduYpjOZk+mZw
/qZkfoJvxqZyiudxKidpfuZqOqdlWuc+KWdt2qZ0nicn6GZ8xmd6qqdtUqZ6siZ0
xiZ7umelfUrnc+pnfM7ne+InfAonfYKngdamgKLnf1ZnZ76nZ8KmdepmdPYnfwro
ZYaCdXpohbLmczpofvLnbjqofBqoa3rChW5mgh5odQbohE6ohNLnctJnjJpnfq6o
aY5mdupocfqoiu7njTZnc1Joc35Cf3YnaXYmcYomk3onlKInZwbpcELplXKmk2Lp
lWopZVYpZ7bolb6mjU4pid6mh8IoegZpdgYEADs=


}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Changes to scriptlibs/regproc/pkgIndex.tcl.

1
2
3
4
5
6
7
8
9
10
11
# Tcl package index file, version 1.1
# This file is generated by the "pkg_mkIndex" command
# and sourced either when an application starts up or
# by a "package unknown" script.  It invokes the
# "package ifneeded" command to set up package-related
# information so that packages will be loaded automatically
# in response to "package require" commands.  When this
# script is sourced, the variable $dir must contain the
# full path name of this file's directory.

package ifneeded regproc 1.4 [list source [file join $dir regproc.tcl]]










|
1
2
3
4
5
6
7
8
9
10
11
# Tcl package index file, version 1.1
# This file is generated by the "pkg_mkIndex" command
# and sourced either when an application starts up or
# by a "package unknown" script.  It invokes the
# "package ifneeded" command to set up package-related
# information so that packages will be loaded automatically
# in response to "package require" commands.  When this
# script is sourced, the variable $dir must contain the
# full path name of this file's directory.

package ifneeded regproc 1.6 [list source [file join $dir regproc.tcl]]

Changes to scriptlibs/regproc/regproc.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16











17
18
19
20
21
22
23














24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
#regproc.tcl  routines to register serial numbers

#Copyright 2015 WordTech Communications LLC

#MIT license

package provide regproc 1.4
package require http
package require xplat


image create photo _unlock -data  {
    R0lGODlhGAAgAIABAAAAAP///yH+GkNyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFj

    ACH5BAEKAAEALAAAAAAYACAAAAJRjI+gq+jO4npQWmqsBvQenzBYVE1YQH7imWbm
    ib5xA89cPcp4uPX+DwwKh7SdbWXUGF2S5VHn6oBURWrL+lBmb6UrTpucfsE14u85
    tKZ5wkMBADs=











}

image create photo _check -data {
    R0lGODlhIAAaAIABAAQHB////yH+GkNyZWF0ZWQgd2l0aCBHSU1QIG9uIGEgTWFj
    ACH5BAEKAAEALAAAAAAgABoAAAJMjI+pCeuvgIR0yVtzuFxDDnoWGIoHWZobikUV
    2zLTA89yfLNjetY7iag1Ir4VzCFMfpI6ChOYeeJeTxVTZRBie6htEOrl2sJcsmVb
    AAA7














}


namespace eval regproc {

    if {![info exists library]} {
	variable library [file dirname [info script]]
    }
    variable datadir
    variable expired
    set expired 0


    #set the 30-day clock for application/version
    proc setClock {} {
	variable datadir 
	variable appname
	variable appversion
	variable appstore

	set launchTime [clock seconds]
	set saveTime [open $datadir/$appname$appversion.dat w]
	puts $saveTime $launchTime
	close $saveTime
    }

    #read the time set
    proc readClock {} {
	variable datadir 
	variable appstatus 
	variable expstatus 
	variable appname
	variable appversion
	variable appstore
	variable expired

	set curTime [clock seconds]
	set oldTime [read [open $datadir/$appname$appversion.dat r]]
	set expDate [clock scan "30 days" -base $oldTime]
	if {$curTime < $expDate } {
	    set expired 0
	    regproc::makePitch	
	} else {
	    set expired 1
	    regproc::expiredPitch
	}
    }
    
    #check to see if a time has been set
    proc checkClock {} {
	variable datadir 
	variable appname
	variable appversion
	variable appstore
	variable expired

	if {[file exists $datadir/.$appname$appversion.rc]} {
	    
	    catch "file rename $datadir/.$appname$appversion.rc $datadir/$appname$appversion.dat"
	    regproc::readClock
	    return
	}

	if  {![file exists  $datadir/$appname$appversion.dat]} {
	    regproc::setClock 
	    regproc::readClock
	} else {
	    regproc::readClock
	}
    }

    #dialog before demo has expired
    proc makePitch {} {
	variable version 
	variable appname
	variable appstore
	variable licensetitle
	set licensetitle "Purchase $appname"

	toplevel .purchase
	regproc::makeModal .purchase
	wm title .purchase $licensetitle
	wm resizable .purchase 0 0

	wm withdraw .purchase
	wm transient .purchase .

	wm protocol .purchase WM_DELETE_WINDOW {}

	ttk::frame .purchase.top -padding 10
	pack .purchase.top -side top -fill both -expand yes
	ttk::label .purchase.top.label -text "You are currently using a demo of $appname. This version will give you the chance to try \n$appname free of charge for 30 days. Would you like to buy $appname now?" -image _unlock -compound left -anchor n 

	pack .purchase.top.label  -side top -fill x -expand yes

	ttk::frame .purchase.bottom -padding 5
	pack .purchase.bottom -side bottom -fill both -expand yes

	ttk::frame .purchase.bottom.upper
	pack .purchase.bottom.upper -side top -fill both -expand no


	ttk::frame .purchase.bottom.lower -padding 5
	pack .purchase.bottom.lower -side bottom -fill both -expand no

	ttk::button .purchase.bottom.lower.install -text "Purchase" -default active -command "xplat::launch  http://www.codebykevin.com/$appname.html; regproc::getReg; destroy .purchase"
	ttk::button .purchase.bottom.lower.cancel -text "Cancel" -command " destroy .purchase; raise ."
	pack  .purchase.bottom.lower.install .purchase.bottom.lower.cancel  -side right -fill both -expand no
	
	::tk::PlaceWindow .purchase widget .

	wm deiconify .purchase
	focus .purchase.bottom.lower.install

	if {[tk windowingsystem] eq "aqua"} {
	    after idle [list after 0 wm attributes .purchase -notify 1]

	    bind all <FocusIn> [list  wm attributes . -notify 0]
	}

    }

    #dialog after demo has expired
    proc expiredPitch {} {
	variable version 
	variable appname
	variable appstore
	variable expired
	variable licensetitle

	set licensetitle "Purchase $appname"

	toplevel .expired
	regproc::makeModal .expired
	wm title .expired $licensetitle
	wm resizable .expired 0 0



	wm withdraw .expired
	wm transient .expired .

	wm protocol .expired WM_DELETE_WINDOW {}

	ttk::frame .expired.top -padding 10
	pack .expired.top -side top -fill both -expand yes
	ttk::label .expired.top.label -text "This demo of $appname is now expired. Would you like to buy $appname now?" -image _unlock -compound left -anchor n 

	pack .expired.top.label  -side top -fill x -expand yes

	ttk::frame .expired.bottom -padding 5
	pack .expired.bottom -side bottom -fill both -expand yes

	ttk::frame .expired.bottom.upper
	pack .expired.bottom.upper -side top -fill both -expand no


	ttk::frame .expired.bottom.lower -padding 5
	pack .expired.bottom.lower -side bottom -fill both -expand no

	ttk::button .expired.bottom.lower.install -text "Purchase" -default active -command "xplat::launch http://www.codebykevin.com/$appname.html; regproc::getReg; destroy .expired"
	ttk::button .expired.bottom.lower.cancel -text "Cancel" -command " destroy .expired; exit"
	pack  .expired.bottom.lower.install .expired.bottom.lower.cancel  -side right -fill both -expand no
	
	::tk::PlaceWindow .expired widget .

	wm deiconify .expired
	focus .expired.bottom.lower.install

	if {[tk windowingsystem] eq "aqua"} {
	    after idle [list after 0 wm attributes .expired -notify 1]

	    bind all <FocusIn> [list  wm attributes . -notify 0]
	}
    }

    #check for license, validate if found, set demo pitch if not found
    proc readLic {application version} {

	variable serial 
	variable datadir
	variable appname
	variable appversion
	variable appstore

	set appname $application
	set appversion $version

	set datadir [xplat::appconfig $appname]

	if {[file exists $datadir/.lic] } {
	    file rename $datadir/.lic $datadir/lic.dat
	}

	if {[file exists $datadir/lic.dat]} {
	    
	    set licnum [open $datadir/lic.dat r]
	    set serial [read $licnum]
	    close $licnum
	    return
	} else {
	    set serial "Demo"
	    regproc::checkClock
	    
	}
    }


    #write license to file
    proc setLic {} {
	variable serial
	variable serialbase
	variable datadir
	variable appname
	variable regwindow
	variable appstore
	variable expired

	if {$serial == ""} {
	    tk_messageBox -icon warning -title "Incorrect Serial Number" -message "Incorrect Serial Number" -detail "Incorrect serial number. The application will exit now." -parent .number
	    exit
	}

	set count 20000

	for {set i 1} {$i < $count} {incr i 1} {

	    lappend serialbase [string toupper $appname]-[expr $i * 5]-[expr $i/11]-[expr $i - 1]-[string toupper [string trim [string range $appname 0 1]]]
	}
	

	set output [lsearch  -inline $serialbase $serial]
	
	if {$output >= 0} {
	    cd $datadir
	    set lic [open $datadir/lic.dat w]
	    puts $lic "$serial"
	    close $lic
		grab release .number
	    tk_messageBox -icon info -title "Thank You" -message "Thank You" -detail "Thank you for registering $appname." -parent .number
	    destroy .number
	    #display window that was hidden
	    catch {wm deiconify .}

	} else {
	    if {$expired == 1} {
		grab release .number
		tk_messageBox -icon warning -title "Incorrect Serial Number" -message "Incorrect Serial Number" -detail "Incorrect serial number. The application will exit now." -parent .number
		exit
	    }
	    grab release .number
	    tk_messageBox -icon warning -title "Incorrect Serial Number" -message "Incorrect Serial Number" -detail "Incorrect serial number. Please try again." -parent .number
	    regproc::getReg
	}
    }



    #generate license numbers
    proc genList {application} {

	variable appname
	variable regwindow
	variable appstore

	set appname $application

	set count 20000

	for {set i 1} {$i < $count} {incr i 1} {

	    lappend serialbase [string toupper $appname]-[expr $i * 5]-[expr $i/11]-[expr $i - 1]-[string toupper [string trim [string range $appname 0 1]]]
	}


	if [file exists  $::env(HOME)/[list $appname]-list] {
	    file delete  $::env(HOME)/[list $appname]-list
	}

	foreach item $serialbase {
	    split $item\n
	    set keylist [open $::env(HOME)/[list $appname]-list a]
	    puts $keylist $item
	    close $keylist
	}
    }

    #dialog to input registration number from demo prompt
    proc getReg {} {


	variable serial
	variable regwindow
	variable appstore
	variable expired
	variable appname
	variable licensetitle

	set licensetitle "License" 

	catch {destroy .number}
	toplevel .number
	wm title .number $licensetitle
	regproc::makeModal .number
	wm resizable .number 0 0

	wm withdraw .number
	wm transient .number .
    

	wm protocol .number WM_DELETE_WINDOW {}

	ttk::frame .number.top -padding 10
	pack .number.top -side top -fill both -expand yes

	
	ttk::label .number.top.label -text "Please enter your serial number for $appname\nin the field below:" -image _check -compound left -anchor n -padding 10
	pack .number.top.label -side top -fill both -expand yes

	ttk::entry .number.top.entry -textvariable [namespace current]::serial
	pack .number.top.entry -side bottom -fill both -expand yes

	ttk::frame .number.bottom -padding 5
	pack .number.bottom -side bottom -fill both -expand yes

	ttk::frame .number.bottom.upper
	pack .number.bottom.upper -side top -fill both -expand no


	ttk::frame .number.bottom.lower -padding 5
	pack .number.bottom.lower -side bottom -fill both -expand no

	bind .number <Return> {grab release .number; regproc::setLic;  raise .}
	ttk::button .number.bottom.lower.install -text "Register" -default active -command {grab release .number; regproc::setLic; raise .}
	ttk::button .number.bottom.lower.cancel -text "Cancel" -command "grab release .number; regproc::exitIfExpired; destroy .number; raise ."
	pack  .number.bottom.lower.install .number.bottom.lower.cancel  -side right -fill both -expand no
	
	::tk::PlaceWindow .number widget .

	wm deiconify .number
	focus .number.bottom.lower.install
	if {[tk windowingsystem] eq "aqua"} {
	    after idle [list after 0 wm attributes .number -notify 1]
	    bind all <FocusIn>  [list  wm attributes . -notify 0]
	}
    }

    proc exitIfExpired {} {

	variable expired
	if {$expired == 1} {
	    exit
	} 

    }

    proc makeModal {w} {

	variable licensetitle
	if {[tk windowingsystem] eq "aqua" } {
	    destroy $w; toplevel $w;  tk::unsupported::MacWindowStyle style $w  modal; wm title $w $licensetitle
	}
	if {[tk windowingsystem] eq "win32"} {






|
<



|
|
>
|
|
<
>
>
>
>
>
>
>
>
>
>
>


|
<
<
<
<
>
>
>
>
>
>
>
>
>
>
>
>
>
>













<
<
<
<
<
<
|
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<





|













|













|
|















<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







1
2
3
4
5
6
7

8
9
10
11
12
13
14
15

16
17
18
19
20
21
22
23
24
25
26
27
28
29




30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56






57





58














































59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108







109


































































































































































































































110
111
112
113
114
115
116
#regproc.tcl  routines to register serial numbers

#Copyright 2015 WordTech Communications LLC

#MIT license

package provide regproc 1.6

package require xplat


image create bitmap _unlock -data  {
 
#define xbm_security_closed_32_width 32
#define xbm_security_closed_32_height 32
static char xbm_security_closed_32_bits[] = {

  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0xF8, 0x1F, 0x00, 
  0x00, 0xFC, 0x3F, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x7E, 0x7E, 0x00, 
  0x00, 0x1E, 0x78, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x1F, 0xF8, 0x00, 
  0x00, 0x0F, 0xF0, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0xC0, 0xFF, 0xFF, 0x03, 
  0xC0, 0xFF, 0xFF, 0x03, 0xC0, 0xFF, 0xFF, 0x03, 0xC0, 0xFF, 0xFF, 0x03, 
  0xC0, 0xFF, 0xFF, 0x03, 0xC0, 0xFF, 0xFF, 0x03, 0xC0, 0xFF, 0xFF, 0x03, 
  0xC0, 0xFF, 0xFF, 0x03, 0xC0, 0xFF, 0xFF, 0x03, 0xC0, 0xFF, 0xFF, 0x03, 
  0xC0, 0xFF, 0xFF, 0x03, 0xC0, 0xFF, 0xFF, 0x03, 0xC0, 0xFF, 0xFF, 0x03, 
  0xC0, 0xFF, 0xFF, 0x03, 0xC0, 0xFF, 0xFF, 0x03, 0xC0, 0xFF, 0xFF, 0x03, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
}

image create bitmap _check -data {




#define xbm_folder_sans_accept_32_width 32
#define xbm_folder_sans_accept_32_height 32
static char xbm_folder_sans_accept_32_bits[] = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 
  0x03, 0xFF, 0xFF, 0x3F, 0x03, 0xFF, 0xFF, 0x3F, 0x03, 0xFF, 0xFF, 0xFF, 
  0x03, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0xC0, 
  0x03, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0xC0, 0x03, 0x00, 0xF0, 0xC3, 
  0x03, 0x00, 0xFC, 0xCF, 0x03, 0x00, 0x1F, 0xFF, 0x03, 0x00, 0x07, 0xF8, 
  0x03, 0x80, 0x03, 0xF0, 0x03, 0x80, 0x01, 0xE6, 0x03, 0xC0, 0x01, 0xE7, 
  0x03, 0xC0, 0x98, 0xEF, 0x03, 0xC0, 0xDC, 0xC7, 0x03, 0xC0, 0xFD, 0xC3, 
  0x03, 0xC0, 0xF8, 0xC0, 0x03, 0xC0, 0xF1, 0xE0, 0x03, 0x80, 0x61, 0xE0, 
  0x03, 0x80, 0x03, 0xF0, 0x03, 0x00, 0x07, 0xF8, 0x03, 0x00, 0x1F, 0xFE, 
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, };
}


namespace eval regproc {

    if {![info exists library]} {
	variable library [file dirname [info script]]
    }
    variable datadir
    variable expired
    set expired 0








  





    #dialog to request donation














































    proc makePitch {} {
	variable version 
	variable appname
	variable appstore
	variable licensetitle
	set licensetitle "Support Our Work"

	toplevel .purchase
	regproc::makeModal .purchase
	wm title .purchase $licensetitle
	wm resizable .purchase 0 0

	wm withdraw .purchase
	wm transient .purchase .

	wm protocol .purchase WM_DELETE_WINDOW {}

	ttk::frame .purchase.top -padding 10
	pack .purchase.top -side top -fill both -expand yes
	ttk::label .purchase.top.label -text "SUPPORT OUR WORK\n\nDeveloping free and open source software is not free.\nWould you support the development of this application\nwith a single or recurring donation?" -image _check -compound left -anchor n 

	pack .purchase.top.label  -side top -fill x -expand yes

	ttk::frame .purchase.bottom -padding 5
	pack .purchase.bottom -side bottom -fill both -expand yes

	ttk::frame .purchase.bottom.upper
	pack .purchase.bottom.upper -side top -fill both -expand no


	ttk::frame .purchase.bottom.lower -padding 5
	pack .purchase.bottom.lower -side bottom -fill both -expand no

	ttk::button .purchase.bottom.lower.install -text "Donate" -default active -command "xplat::launch  https://liberapay.com/codebykevin/donate; exit"
	ttk::button .purchase.bottom.lower.cancel -text "Later" -command "exit"
	pack  .purchase.bottom.lower.install .purchase.bottom.lower.cancel  -side right -fill both -expand no
	
	::tk::PlaceWindow .purchase widget .

	wm deiconify .purchase
	focus .purchase.bottom.lower.install

	if {[tk windowingsystem] eq "aqua"} {
	    after idle [list after 0 wm attributes .purchase -notify 1]

	    bind all <FocusIn> [list  wm attributes . -notify 0]
	}

    }








  


































































































































































































































    proc makeModal {w} {

	variable licensetitle
	if {[tk windowingsystem] eq "aqua" } {
	    destroy $w; toplevel $w;  tk::unsupported::MacWindowStyle style $w  modal; wm title $w $licensetitle
	}
	if {[tk windowingsystem] eq "win32"} {

Changes to scriptlibs/softwareupdate/softwareupdate.tcl.

173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209

	wm withdraw .updateprogress
	update idletasks

	ttk::frame .updateprogress.f -padding 5
	pack .updateprogress.f -fill both -expand yes

	label .updateprogress.f.l -bg gray95 -image $icon -bd 0 -relief flat -highlightthickness 0 -width [image width $icon] -height [image height $icon]
	pack .updateprogress.f.l -side left -fill both -expand yes

	frame .updateprogress.f.r -bg gray95 -bd 0 -highlightcolor gray95
	pack .updateprogress.f.r -side right -fill both -expand yes
	
	
	ttk::label .updateprogress.f.r.t -text "Checking for updates..." -padding 5
	pack .updateprogress.f.r.t -side top -fill both -expand yes

	ttk::frame .updateprogress.f.r.f -padding 5
	pack .updateprogress.f.r.f -side top -fill both -expand yes
	
	ttk::progressbar .updateprogress.f.r.f.progress -mode indeterminate -orient horizontal
	pack .updateprogress.f.r.f.progress -fill both -expand yes -side top

	.updateprogress.f.r.f.progress start

	ttk::button .updateprogress.f.r.f.b -text "Cancel" -command {destroy .updateprogress}

	pack .updateprogress.f.r.f.b -side bottom -fill both -expand no

	wm geometry .updateprogress 400x100
	wm resizable .updateprogress 0 0

	wm deiconify .updateprogress
	raise .updateprogress

	wm transient .updateprogress .








|
|

|


















<







173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201

202
203
204
205
206
207
208

	wm withdraw .updateprogress
	update idletasks

	ttk::frame .updateprogress.f -padding 5
	pack .updateprogress.f -fill both -expand yes

	ttk::label .updateprogress.f.l -image $icon  -padding 10
	pack .updateprogress.f.l -side left -fill both -expand yes 

	ttk::frame .updateprogress.f.r
	pack .updateprogress.f.r -side right -fill both -expand yes
	
	
	ttk::label .updateprogress.f.r.t -text "Checking for updates..." -padding 5
	pack .updateprogress.f.r.t -side top -fill both -expand yes

	ttk::frame .updateprogress.f.r.f -padding 5
	pack .updateprogress.f.r.f -side top -fill both -expand yes
	
	ttk::progressbar .updateprogress.f.r.f.progress -mode indeterminate -orient horizontal
	pack .updateprogress.f.r.f.progress -fill both -expand yes -side top

	.updateprogress.f.r.f.progress start

	ttk::button .updateprogress.f.r.f.b -text "Cancel" -command {destroy .updateprogress}

	pack .updateprogress.f.r.f.b -side bottom -fill both -expand no


	wm resizable .updateprogress 0 0

	wm deiconify .updateprogress
	raise .updateprogress

	wm transient .updateprogress .

Deleted scriptlibs/tablelist5.13/CHANGES.txt.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
What is new in Tablelist 5.13?
------------------------------

1. Added support for Mac OS X 10.10 (Yosemite) (thanks to Kevin Walzer
   for his proposal).

2. Renamed the four arrow styles having the shape of an angle from
   "flat7x5", ..., "flat10x6" to "flatAngle7x5", ..., "flatAngle10x6"
   (POTENTIAL INCOMPATIBILITY!); added the arrow styles "flat7x5",
   "flat9x6", "flatAngle7x4" (which is now the default on Yosemite),
   "flatAngle9x5", and "flatAngle10x7".

3. Added the tree style "mate", inspired by a few GTK+ themes of the
   MATE desktop.

4. Added the "-showeditcursor" configuration option, used to let the
   cursor take on the shape of a pencil whenever a mouse klick would
   start an editing session (thanks to Rene Zaumseil and Cesare
   Bavazzano for their proposals).

5. New column configuration option "-changetitlesnipside", which allows
   you to override the alignment-specific default snip side for the
   column's title (thanks to John Vella for his proposal).

6. Support for the word "last" as row, column, cell, or child index,
   indicating the last row/column/cell of the tablelist or the last
   child of a given parent node (remember that the meaning of "end" as a
   row, column, or child index is subcommand-specific).

7. The description of the "imagelabelpath" subcommand in the reference
   manual now contains an example showing how to define bindings for the
   embedded images.

8. Eliminated the endless loop generated by the "yview" subcommand when
   synchronizing two or more tablelist widgets (thanks to Paul Obermeier
   for his bug report).

What was new in Tablelist 5.12.1?
---------------------------------

This is a bugfix-only release.  The corrected files in the "scripts"
directory are "tablelistEdit.tcl" and "tablelistUtil.tcl".

1. Appended the missing 4th argument to the two invocations of the
   procedure "tablelist::moveOrActivate" in the file
   "tablelistEdit.tcl" (thanks to Patrick Fradin and Ralf Fassel for
   their bug reports).

2. Fixed a typo in the file "tablelistUtil.tcl" (Thanks to Patrick
   Fradin for reporting this bug).

What was new in Tablelist 5.12?
-------------------------------

1. Added the "-customdragsource" configuration option, used to indicate
   whether the tablelist widget is a drag source for some drag & drop
   implementation other than TkDND and the drag & drop framework
   included in BWidget.

2. Improvements and extensions in the default binding scripts.  Besides
   providing full compatibility with the Tk listbox, they now perform an
   automatic drag-friendly handling of the selection and of pointer
   movements with mouse button 1 down if the "-customdragsource" option
   was set to true or the tablelist's body was registered as a TkDND or
   BWidget drag source (thanks to Will Duquette for his proposal).  The
   same holds true for the local drag & drop via the "move" subcommand.

3. Added the "hidetargetmark", "showtargetmark", "targetmarkpath", and
   "targetmarkpos" subcommands, for enhanced drop target support (thanks
   to Trevor Williams for his proposal).

4. Added a "Drag & Drop Support" section to the reference manual, with
   examples demonstrating the use of the new subcommands mentioned
   above in a tablelist widget registered as a TkDND or BWidget drop
   target.

5. The visibility of the horizontal separator placed just below the last
   tablelist row if the value of the "-showseparators" option is true
   and that of the "-fullseparators" option is false, can now be 
   controlled with the aid of the new "-showhorizseparator"
   configuration option (thanks to Martyn Smith for his proposal).

6. New values "flat5x3" and "flat5x4" for the "-arrowstyle"
   configuration option, suiting current versions of the Ubuntu Linux
   distribution.

7. Adapted the look & feel of the tree styles "adwaita", "ubuntu", and
   "mint" to current versions of the GTK+ 3 theme Adwaita and of the
   Linux distributions Ubuntu Linux and Linux Mint, respectively.

8. Fixed a long-standing bug related to horizontal scrolling in an empty
   tablelist widget with positve "-titlecolumns" value (thanks to Ulrich
   Seidl for his bug report).

What was new in Tablelist 5.11?
-------------------------------

1. Added the "findrowname" and "findcolumnname" subcommands (thanks to
   Adrian Medrano Calvo for his proposal and discussions on this
   subject).

2. Collapsing a row no longer leads to renumbering the lines for the
   purpose of updating a column configured to display the line numbers
   (thanks to Will Duquette for his proposal).

3. For improved appearance, if the value of the "-showseparators" option
   is true and that of the "-fullseparators" option is false, then a
   horizontal separator is now placed just below the last tablelist row
   (thanks to Allan Silverstein for his proposal).

4. Worked around a peculiarity of Tk on Windows, which caused problems
   when resizing the tablelist window in the presence of embedded images
   or multi-line elements (thanks to Will Duquette for his bug report).

5. Added the missing actualization of the active and anchor row indices
   after moving an item to a different position (thanks to Will Duquette
   for his bug report).

6. Fixed two bugs in Tablelist_tile, related to header labels with
   embedded images (thanks to Ulrich Seidl for his bug reports).

7. Numerous further improvements in the code and documentation.

What was new in Tablelist 5.10?
-------------------------------

1.  Added the "-acceptdropcommand" configuration option, used to control
    whether the local drag & drop may move a specified item just before
    a given row (thanks to Nagu and Georgios Petasis for discussions on
    this subject).

2.  Added the "-instanttoggle" configuration option, related to the cell
    editing with the aid of a Tk or tile checkbutton (thanks to Rich
    Wellner for his proposal and discussions on this topic).

3.  Added the "-tight" configuration option, used to eliminate the
    one-pixel additional space left below each tablelist row for Tk
    listbox compatibility (thanks to Koen Breugelmans for his proposal
    and discussions on this subject).

4.  Added the "isviewable" and "viewablerowcount" subcommands (thanks to
    Nagu for proposing the latter).

5.  Improvements related to the value of the "-data" option for the
    virtual events <<TablelistColumnMoved>> and <<TablelistRowMoved>>
    (thanks to Georgios Petasis for discussions on this topic).

6.  The item deletion has become significantly faster, especially in
    tablelists used as tree widgets and in the presence of embedded
    images and/or multi-line elements (thanks to Rob Ratcliff and Rene
    Zaumseil for requesting this performance improvement).

7.  Guarded against column deletions from within non-default binding
    scripts for the header labels (thanks to Ulrich Seidl for his
    input).

8.  Restored the support for Tcl/Tk versions earlier than 8.3, by
    cleaning up the use of elided text in the underlying text widget.
    Similarly, restored the support for Tcl/Tk 8.0, by cleaning up the
    use of "regsub" and that of the <MouseWheel> event (thanks to Joerg
    Mueck for reporting the first two issues).

9.  Improved the package loading mechanism (thanks to Paul Obermeier for
    his bug report).

10. Guarded against potential item insertions or deletions from within
    the command specified as the value of the "-editendcommand" option
    (thanks to Julian H J Loaring for his bug report).

11. Guarded against deletion of embedded images or windows from within
    the command specified as the value of the "-tooltipaddcommand"
    option (thanks to Jan Kandziora for his bug report).

12. Fixed a bug related to column deletion if the "-selecttype" option
    has the value "cell" (thanks to Ulrich Seidl for his bug report).

13. Several further code improvements and minor bug fixes.

What was new in Tablelist 5.9?
------------------------------

1. Added the "-valign" column and cell configuration option, for
   controlling the vertical alignment of embedded images and windows
   (thanks to Trevor Williams for his proposal).

2. The "-stripebackground" and "-stripeforeground" options can now be
   specified at column level, too (thanks to Christian Gollwitzer for
   his proposal).

3. Improvements related to the Windows 7 platform.

4. Worked around a text widget bug in Tk versions 8.5 and later, related
   to getting the index of the last line in the window if some of the
   lines are elided (thanks to Bernhard Wallner for his bug report).

5. Corrected a typo in the implementation of the "rowconfigure"
   subcommand, introduced in the last Tablelist version (thanks to Jerzy
   Witkowski for reporting this bug).

6. Fixed a bug related to resetting the "-(select)background" and
   "-(select)foreground options at column, row, and cell levels,
   introduced in the previous Tablelist version (thanks to Christian
   Gollwitzer for his bug report).

7. Several further improvements in the code, demo scripts, and
   documentation.

What was new in Tablelist 5.8?
------------------------------

1.  Support for interactive cell editing with the aid of the ctext
    widget (thanks to Sait Dogru for his proposal).

2.  Added the "canceledediting" subcommand (thanks to Martyn Smith for
    his proposal).

3.  The "selection" and "cellselection" subcommands have become by
    orders of magnitude faster (thanks to Jean-Francois Beaud for his
    input that motivated me to speed up these subcommands).

4.  The "-(select)background" and "-(select)foreground options at
    column, row, and cell levels now impose by far less performance
    penalty than in earlier Tablelist versions.

5.  The keyboard traversal during interactive cell editing is now aware
    of changes like appending a new row, performed by the procedure
    specified as the value of the "-editendcommand" configuration option
    (thanks to Andreas Leitgeb for his proposal).

6.  For Tk versions 8.5 or later, most virtual events are now generated
    with the "-data" option set to a suitable event-specific value
    (thanks to Christian Gollwitzer, Andreas Leitgeb, and Nagu for their
    proposals).

7.  Improvements related to the selection mode "extended".

8.  Worked around a peculiarity of Tk on Windows, related to deleting an
    embedded window while resizing a text widget interactively (thanks
    to Harald Oehlmann for his bug report and discussions on this
    topic).

9.  Eliminated a regression introduced in Tablelist version 5.6, related
    to vertical scrolling under Tk 8.5 or later in the presence of
    embedded images or windows (thanks to Patrick Fradin for reporting
    this bug).

10. Fixed a screen refresh problem introduced in Tablelist version 5.6,
    related to wrapped multiline elements (thanks to Rob for his bug
    report).

11. Further code improvements (thanks to Harald Oehlmann for his
    valuable contribution).

12. Added a "Virtual Events" section to the reference manual (thanks to
    Andreas Leitgeb for his proposal).

What was new in Tablelist 5.7?
------------------------------

1.  Added the "cellbbox" subcommand.

2.  Added the "editinfo" subcommand (thanks to Trevor Williams for his
    proposal).

3.  Adapted the tree styles "ubuntu" and "mint" to the latest Ubuntu
    Linux and Linux Mint releases.

4.  Minor change related to the ttk::combobox widget used as edit window
    (thanks to Julian H J Loaring for his input).

5.  Improved the multi-platform support by increased use of virtual
    events.

6.  Worked around a bug in some earlier Tk versions, related to
    checkbuttons without indicator (thanks to Allan Silverstein for his
    input).

7.  Restored the support for Tcl/Tk versions earlier than 8.4, which has
    been broken since the previous Tablelist release, due to the use of
    the "namespace exists" command, introduced in Tcl 8.4 (thanks to
    Ralf Fassel for drawing my attention to this issue).

8.  Fixed a copy & paste bug related to embedded windows, introduced in
    the previous Tablelist version (thanks to Heng Li and David Hanks
    for their bug reports).

9.  Fixed a long-standing bug related to the "cancelediting" subcommand
    and the "-forceeditendcommand" option (thanks to Julian H J Loaring
    for his bug report).

10. Fixed a long-standing minor bug that caused the "-labelbg" column
    configuration option to be accepted by Tablelist_tile, contrary to
    the option of the same name at widget level (thanks to Bernhard
    Wallner for his bug report).

11. Several further improvements in the code and demo scripts (thanks to
    Patrick Fradin for his valuable contribution and to Marianne Baumann
    for her input related to the "-showlabels" option).

What was new in Tablelist 5.6?
------------------------------

1.  Added the tree styles "adwaita", "mint", and "ubuntu", inspired by a
    few GTK+ 3 themes on popular Linux distributions.

2.  Added the "-windowupdate" cell configuration option (thanks to
    Trevor Williams for his valuable contribution).

3.  The item insertion and sorting have become significantly faster,
    especially when using static-width columns.

4.  Embedded windows are now hidden during interactive cell editing
    (thanks to Trevor Williams for discussions on this subject).

5.  Extended the support for the "tileqt" theme to work on KDE 4, too.

6.  Improvements in the documentation (thanks to Glenn Herteg for his
    proposal).

7.  Guarded against the case that a tablelist widget is deleted and its
    name is reused for a widget of a different class (thanks to Roger
    Niva for his valuable input).

8.  Guarded against scripts that start by destroying all children of the
    root window (thanks to Helmut Giese and Gerhard Kraus for drawing my
    attention to this case).

9.  Fixed two bugs related to the "move" subcommand, introduced in
    Tablelist version 5.2 (thanks to "DrS" and Trevor Williams for their
    bug reports).

10. Several further improvements and minor bug fixes.

What was new in Tablelist 5.5?
------------------------------

1. Hidden tablelist elements are no longer excluded from the selection
   (thanks to Martyn Smith for his proposal).  (They are, however,
   ignored when exporting the selection.)

2. Added the "cornerpath" and "cornerlabelpath" subcommands.  The first
   one makes it quite easy to respect the native Mac OS X look & feel,
   where the vertical scrollbar appears placed under the header (thanks
   to Torsten Berg for a related page on the Wiki, which provided me the
   idea for these subcommands).  The "cornerpath" subcommand is now used
   in all demo scrips that contain vertical scrollbars.

3. Added support for the appearance-related changes introduced in Mac
   OS X 10.7 (Lion).

4. On Mac OS X Aqua, the default values of the "-move(column)cursor"
   and "-resizecursor" options are now native cursors.  Besides
   improving the look & feel of tablelist widgets on the Mac, this
   change also works around the problem that on Mac OS X 10.7, Tk
   versions 8.5 and 8.6 can only use native and native-mapped cursors.

5. Removed the "-labelbackground" option from Tablelist_tile, because
   current versions of the tile engine no longer support setting the
   background color for the header labels (and even with earlier tile
   versions, some themes ignored any attempt to change the background
   color of the header labels).

6. Adapted the code to some changes in current tile versions, to make
   sure that in disabled state the tile-based column labels will appear
   in the theme-specific disabled foreground color, as it was the case
   with earlier tile versions (thanks to "tombert" for his related
   posting on comp.lang.tcl).

7. Improved a few binding scripts (thanks to Ulrich Seidl for his bug
   report and testing).

8. Fixed a bug related to embedded windows in a tablelist used as a
   tree widget (again, thanks to Ulrich Seidl for his bug report and
   testing).

9. Several further improvements in the code, demo scripts, and
   documentation.

What was new in Tablelist 5.4?
------------------------------

1. Added the "-populatecommand" configuration option, used by the
   "searchcolumn" subcommand to insert child items on demand before
   checking whether they contain the specified pattern.
   
2. Added the "-autoscan" configuration option, which can be used to
   deactivate the automatic scrolling triggered by leaving the
   tablelist window with mouse button 1 down, in order to avoid any
   conflicts with drag & drop via tkdnd (thanks to Patrick Fradin for
   his valuable contribution).

3. New "isexpanded" subcommand.

4. New value "flat9x6" for the "-arrowstyle" configuration option.

5. Adapted the tree style "oxygen2" to the look of current KDE 4
   versions.

6. Worked around some peculiarities of Tk on Mac OS X Aqua (thanks to
   Torsten Berg for her problem report and discussions on this topic).

7. Improved the check for PNG support in Tk (thanks to Ian Gay for his
   posting on the Wiki related to this subject).

8. Fixed a bug related to the tree style "aqua", introduced in
   Tablelist version 5.3 (thanks to Julian H J Loaring for his bug
   report).

9. Numerous further improvements in the code and documentation.

What was new in Tablelist 5.3.1?
--------------------------------

This release contains just one bug-fix and an enhancement:

1. Fixed a bug related to the "-hide" row configuration option,
   introduced in the previous Tablelist version (thanks to Ralf Fassel
   and Michal Sosnowski for their bug reports).

2. Extended the support for the native "Aqua-blue" background for the
   header label of the sort column (which in the previous Tablelist
   release was restricted to Tk versions 8.6 and above) to the Cocoa-
   based Tk patch levels 8.5.9 and above (thanks to Kevin Walzer for
   discussions on this topic and to Paul Obermeier for enabling me to
   access the ActiveTcl 8.5.8 distribution for the Mac).

What was new in Tablelist 5.3?
------------------------------

1. The interactive row move operation (i.e., local drag & drop) now
   supports moving an item outside its parent and dropping it under
   another item as a child (thanks to Dr. Detlef Groth for his
   proposal, thorough testing, and discussions on this topic).

2. Added the "-acceptchildcommand" configuration option, related to the
   local drag & drop.

3. New "searchcolumn" subcommand, supporting a rich set of options
   (thanks to Matthew Callaghan, Adrian Davis, and Jeff Godfrey for
   their proposals).

4. New "getformatted", "getformattedcolumns", and "getformattedcells"
   subcommands.

5. Support for interactive cell editing with the aid of the Tk core and
   tile menubutton widgets (thanks to Georgios Petasis for his
   proposal).

6. Support for the row indices "top" and "bottom" (thanks to Julian H J
   Loaring and Paul Obermeier for their proposals).  Likewise, support
   for the column indices "left" and "right".

7. New value "photo7x7" for the "-arrowstyle" configuration option,
   needed for the "aqua" theme.

8. Adapted the appearance of tablelist widgets on the Macintosh to
   current versions of OS X Aqua.

9. Numerous further improvements and minor bug fixes.

What was new in Tablelist 5.2?
------------------------------

1.  Added the "-fullseparators" configuration option (thanks to Kevin
    Partin, Martyn Smith, and Harald Oehlmann for their proposals).

2.  Added the tree styles "ambiance", "dust", "dustSand", "newWave",
    "plastik", and "radiance".

3.  The implementation of the "collapse(all)" and "expand(all)"
    subcommands no longer makes use of the "-hide" row configuration
    option, hence you are now free to set the latter (via
    "rowconfigure", "configrowlist", "configrows", or "togglerowhide"),
    regardless of whether the tablelist widget displays a tree
    hierarchy or just a plain list.

4.  The "move" subcommand now supports moving an item outside its
    parent.

5.  Deleting the whole content of a tablelist widget has become
    significantly faster (thanks to Harold Campbell for his input).

6.  Worked around a peculiarity of the text widget related to tag
    handling when deleting a range of lines from its end (thanks to
    Batox for his bug report).

7.  Minor improvements and bug-fixes in the binding scripts (thanks to
    Bernhard Wallner, Batox, and Roger Niva for their bug reports).

8.  Fixed a bug related to the "-selecttype cell" configuration option,
    (re)introduced in Tablelist version 5.0 (thanks to Harold Campbell
    and Dietmar Mueller for their bug reports).

9.  Fixed a bug related to row hiding via "configrowlist" or
    "configrows", introduced in Tablelist version 5.0 (thanks to Michal
    Sosnowski for his bug report).

10. Fixed a long-standing bug related to tooltip support (thanks to
    Trevor Williams for his bug report).

11. Several further improvements and minor bug fixes.

What was new in Tablelist 5.1?
------------------------------

This is a bugfix-only release.  The corrected files in the "scripts"
directory are "tablelistBind.tcl", "tablelistSort.tcl",
"tablelistUtil.tcl", and "tablelistWidget.tcl".

1. Fixed a bug related to item deletion, introduced in the previous
   Tablelist version (thanks to Aric Bills and Roger Niva for their bug
   reports).

2. Fixed a bug related to multi-column sorting, introduced in the
   previous Tablelist version (thanks to Albrecht Mucha for his bug
   report).

3. Fixed a long-standing bug related to column deletion (thanks to
   Liang Sian Yin for his bug report).

4. Fixed a few further minor bugs and typos, introduced in the previous
   Tablelist version (thanks to Patrick Fradin, Roger Niva, Harald
   Oehlmann, and Peter Spjuth for their bug reports).

What was new in Tablelist 5.0?
------------------------------

1.  A tablelist widget is now not only a multi-column listbox, but also
    a multi-column tree widget (thanks to Sebastien Barre, Tillmann
    Basien, Jos Decoster, Dr. Detlef Groth, Kai Morich, Georgios
    Petasis, and Kevin Walzer for their proposals, as well as to Paul
    Obermeier for testing the preliminary version).  This is achieved
    with the aid of the new configuration options "-collapsecommand",
    "-expandcommand", "-treecolumn", and "-treestyle", along with the
    new subcommands "childcount", "childindex", "childkeys", "collapse",
    "collapseall", "depth", "descendantcount", "expand", "expandall",
    "expandedkeys", "insertchild(ren)", "insertchildlist", "noderow",
    "parentkey", and "toplevelkey".

2.  Added the "-editselectedonly" configuration option, related to
    starting the interactive cell editing with mouse button 1 (thanks to
    Julian H J Loaring for discussions on this topic).

3.  New values "flat6x4", "flat9x7", and "flat10x6" for the
    "-arrowstyle" configuration option.

4.  New value "asciinocase" for the "-sortmode" column configuration
    option.

5.  New subcommands "applysorting", "getfullkeys", and "refreshsorting".

6.  Two new demo scripts (and their tile-based counterparts)
    illustrating the use of a tablelist as multi-column tree widget.

7.  The subcommands "insert", "insertlist", "insertchild(ren)", and
    "insertchildlist" now return the list of full keys corresponding to
    the items just inserted.

8.  Fixed a long-standing bug related to the "-labelfont" option (thanks
    to Jacek Jendrysik for his bug report).

9.  Fixed a bug related to the "-text" column configuration option
    (thanks to Paul Obermeier for his bug report).

10. Fixed a long-standing bug related to embedded windows in right-
    aligned columns (thanks to Jerzy Witkowski for his bug report).

11. Numerous further improvements in the code and documentation.

What was new in Tablelist 4.12?
-------------------------------

1.  Added the "labeltag" subcommand and the helper command "tablelist::
    getTablelistColumn", designed to be used in non-default binding
    scripts for the header labels.

2.  Support for interactive cell editing with the aid of the tile
    spinbox widget.  The demo script "tileWidgets.tcl" now uses this
    widget when available.

3.  Support for interactive cell editing with the aid of the new mentry
    widget for IPv6 addresses.

4.  Improved the support for Windows Vista and added explicit support
    for the "vista" theme.

5.  Updated the support for the themes "plastik" and "keramik"; added
    support for the "keramik_alt" theme.

6.  Support for the native "Aqua-blue" background, set for the header
    label of the sort column (thanks to Kevin Walzer for his proposal
    and valuable contribution).  For technical reasons, this feature is
    only supported for Mac-Tk versions using Cocoa.

7.  Further improvements in the support for Mac OS X Aqua (thanks to
    Daniel Steffen and Kevin Walzer for their valuable feedback).

8.  Improvements in the binding scripts related to interactive cell
    editing (thanks to Hadas Porat for discussions on this subject).

9.  The binding for the <Double-Button-1> event in the resize area of a
    column header now works as expected for large lists, too.

10. Eliminated a minor regression related to interactive cell editing,
    introduced in the previous Tablelist version (thanks to Kai Morich
    for his valuable input).

11. Fixed a small bug related to interactive cell editing with the aid
    of a text widget (thanks to Bryan Oakley for his bug report and
    valuable suggestion).

12. Fixed a long-standing bug related to the "-listvariable" option in
    disabled state (thanks to Ralf Fassel for his bug report).

13. Added a version-related hint to the "How to use it?" section of the
    Tablelist Programmer's Guide.

What was new in Tablelist 4.11?
-------------------------------

1.  Added the "-columntitles" configuration option, which is mainly a
    simplified form of the "-columns" option (thanks to Roy Terry for
    his proposal).

2.  Added the virtual events <<TablelistColHiddenStateChanged>> and
    <<TablelistRowHiddenStateChanged>>, generated after toggling the
    hidden state of a column or row, respectively (thanks to Jeff 
    Godfrey for his proposal).

3.  Besides with <Button-3>, the optimal column width can now be set
    with <Double-Button-1> in the resize area of the column's header.
    Similarly, the effect of <Shift-Button-3> can also be achieved with
    <Shift-Double-Button-1> in the column label's resize area.

4.  Support for Windows Vista (thanks to Jeremy Cowgar for his input).

5.  The recommended package name is now "tablelist" rather than
    "Tablelist", for compatibility with the ActiveTcl distribution; the
    demo scripts have been changed accordingly.

6.  Made sure that the "-tooltipdelcommand" configuration option won't
    affect other widgets (thanks to Jeff Godfrey for drawing my
    attention to this issue).

7.  Fixed a long-standing nasty bug related to the "yview" subcommand
    (thanks to Nestor Patino for his bug report and very helpful example
    script).

8.  Fixed two bugs related to the "-listvariable" configuration option
    (again, thanks to Nestor Patino for his valuable input).

9.  Fixed a bug related to the item deletion when using Tcl/Tk 8.5
    (thanks to Jos Decoster and Sven Wuytack for their valuable
    contribution to finding and fixing this bug).

10. Fixed a bug related to the "-windowdestroy" cell configuration
    option, introduced in Tablelist 4.9 (thanks to Sebastien Barre for
    his bug report).

What was new in Tablelist 4.10?
-------------------------------

1.  Support for individual binding scripts controlling the interactive
    cell editing, with the aid of the new "editwintag" subcommand
    (thanks to Oscar Fuentes for his valuable input).

2.  Complemented the "attrib" subcommand with the new subcommands
    "hasattrib" and "unsetattrib".

3.  Support for column-, row-, and cell-specific attributes, with the
    aid of the new subcommands "columnattrib", "hascolumnattrib",
    "unsetcolumnattrib", "rowattrib", "hasrowattrib", "unsetrowattrib",
    "cellattrib", "hascellattrib", and "unsetcellattrib".

4.  Support for interactive cell editing with the aid of the new mentry
    widget of type "DateTime", introduced in version 3.2 of the Mentry
    package (thanks to Florian Murr for his proposal).

5.  Made sure that the default bindings are set up immediately when
    loading the package, prior to creating any tablelist widget (thanks
    to Schelte Bron for his proposal and discussions on this topic).

6.  Re-established the support for tile widgets as edit windows in non-
    tile-based tablelist widgets (again, thanks to Schelte Bron for
    reporting that this was broken in the last few Tablelist versions).

7.  Adapted the handling of the tile checkbutton as edit window in the
    "xpnative" theme to some changes made in tile 0.8 (thanks to Jeff
    Godfrey for his bug report).

8.  Guarded against potential widget deletion from within user-defined
    binding scripts or "update (idletasks)" (thanks to Schelte Bron and
    Jan Kandziora for their bug reports).

9.  Updated the (very rarely needed) distribution file "repair.tcl" to
    work with current Tablelist versions (thanks to Robert Stollf for
    his bug report).

10. Corrected the description of the "-height" option in the reference
    manual (thanks to Glenn Herteg for his bug report concerning the
    case "-height 0").

11. Improved the color handling in the "disabled" state (thanks to Rolf
    Ade for his bug report and discussions on this topic).

12. Made the handling of elided text more robust (thanks to Jos Decoster
    for his bug report and valuable contribution).

13. Several further improvements and minor bug fixes (thanks to Albrecht
    Mucha for his valuable input).

What was new in Tablelist 4.9?
------------------------------

1.  Added the "-wrap" column configuration option, which makes it
    possible to display long texts in word-wrapped multi-line rather
    than snipped form (thanks to Alexander Schoepe and Anant Adke for
    their proposals).  Also, added support for interactive cell editing
    with a word- or char-wrapped text widget when using Tk 8.5 (thanks
    to Juberi Rajib for discussions on this topic).

2.  Support for dynamic-width embedded windows, with the aid of the new
    "-stretchwindow" cell configuration option (thanks to Kurt Kurczyk,
    Bryan Oakley, and Rasmus Debitsch for their proposals). The demo
    script "embeddedWindows.tcl" and its tile-based counterpart now make
    use of this option.

3.  New "formatinfo" subcommand, returning information about the cell
    whose content is being formatted by a command specified as the value
    of the "-formatcommand" column configuration option (thanks to Goran
    Ivankovic and Sebastien Barre for their proposals).

4.  Changed the default value of the "-activestyle" configuration option
    from "underline" to "frame" and that of the "-setfocus" option from
    0 to 1, making them conform to similar changes in Tk 8.5 related to
    the listbox widget.

5.  Improved the appearance of the header labels for the "aqua" theme
    (thanks to Torsten Berg for discussing this topic on the Wiki).

6.  Eliminated the potential invocation of the "unknown" command from
    within the Tablelist code (thanks to Roger Niva for discussions on
    this topic).

7.  When starting the interactive cell editing with the aid of a
    combobox widget, the list associated with the latter is only dropped
    down if the combobox is read-only (thanks to Bryan Oakley for his
    proposal).

8.  The "setThemeDefaults" command no longer throws an error if the
    current theme is not explicitly supported by Tablelist.  Instead, it
    uses the options set by the current theme and falls back to the
    "default" one for the rest (thanks to Schelte Bron for his valuable
    contribution).

9.  Improved the tablelist widget's appearance when the header labels
    are not shown (thanks to Mark Garvey for his input).

10. Fixed two bugs related to the optimized item insertion (thanks to
    Harold Campbell and Bryan Oakley for their bug reports).

11. Fixed a bug related to the "-showlinenumbers" column configuration
    option (thanks to Martin Lemburg for his bug report).

12. Several further improvements and minor bug fixes.

What was new in Tablelist 4.8?
------------------------------

This release fixes a few nasty bugs related to the optimized item
insertion, introduced in the previous Tablelist version (thanks to
Harold Campbell, Roger Niva, and Joerg Klingseisen for their bug
reports).

What was new in Tablelist 4.7?
------------------------------

1.  Significant performance improvements related to the "insert",
    "rowconfigure", "sort", "sortbycolumn", and "sortbycolumnlist"
    subcommands (thanks to Harold Campbell for his valuable
    contribution to speeding up the item insertion).  The extent of the
    speed-up depends on the configuration options present at column,
    row, and cell levels.

2.  Support for cell- and column label-specific balloon help, with the
    aid of the new configuration options "-tooltipaddcommand" and
    "-tooltipdelcommand".

3.  New subcommands "iselemsnipped" and "istitlesnipped", which make it
    very easy to display the full cell texts and column titles as
    tooltips for cells and header labels with snipped contents.

4.  New subcommands "configcolumnlist", "configcolumns",
    "configrowlist", "configrows", "configcelllist", and "configcells",
    which allow you to configure several columns/rows/cells with a
    single command invocation (thanks to Harold Campbell, Jeff Godfrey,
    and Paul Obermeier for their proposals).

5.  Worked around some performance problems regarding the "switch"
    command in Tcl 8.5a6/8.5b1 and ActiveTcl 8.4.14.

6.  Made sure that ActiveState's "style::as" package won't break the
    mousewheel bindings (thanks to Michael Schlenker for drawing my
    attention to this problem).

7.  Improved the focus handling when resizing a column interactively
    (thanks to Jorge Enderr for his bug report).

8.  Corrected a typo in the adaptation of vertical scrolling to the
    text widget changes made in Tk 8.5 (thanks to Julian M Noble for
    his posting on the Wiki related to this subject).

9.  Fixed a bug related to hidden rows when having "-selecttype cell",
    introduced in Tablelist version 4.3 (thanks to Harold Campbell for
    his bug report and discussions on this subject).

10. Fixed a bug in the "cellconfigure" subcommand, introduced in the
    previous Tablelist release (thanks to Roy Terry for reporting this
    problem on the Wiki).

11. Fixed a bug in the "-changesnipside" option (thanks to Kai Morich
    for his bug report).

12. Numerous further improvements in the code and documentation.

What was new in Tablelist 4.6?
------------------------------

1.  Tablelist_tile now supports tile 0.8 and Tk 8.5a6/8.5b1 (where tile
    is integrated in the core).  The new commands "tablelist::setTheme",
    "tablelist::getCurrentTheme", and "tablelist::getThemes" enable you
    to set and get the current theme and to query the available ones,
    without having to worry about the incompatibilities between the
    various tile versions.

2.  New column configuration option "-changesnipside", which allows you
    to override the alignment-specific default snip side (thanks to
    Georgios Petasis for his proposal).

3.  New "columnwidth" subcommand, with the options "-requested",
    "-stretched", and "-total" (thanks to Matthew Callaghan, Richard
    Finstad, Lieven Forrez, and Tom Roeder for their proposals).

4.  Support for the new virtual event <<TablelistColumnResized>>,
    generated after resizing a column interactively (thanks to Kurt
    Kurczyk for his proposal).

5.  Visual improvement:  Within an active row, the gap to the left or
    right of an embedded image or window no longer appears underlined
    (when the "-activestyle" option has its default value "underline").

6.  Embedded images and windows are no longer hidden during interactive
    cell editing (except the editing with the aid of a Tk or tile
    checkbutton widget).

7.  Significantly improved the redraw and stretching behavior when
    resizing a column interactively.

8.  Eliminated some annoying visual effects caused by hidden columns
    when displaying the items of an already visible tablelist widget
    (thanks to Rolf Ade for discussions on this topic).

9.  Adapted the implementation of vertical scrolling to the text widget
    changes made in Tk 8.5 (thanks to Julian M Noble for his posting on
    the Wiki related to this subject).

10. Fixed a bug related to hidden rows, introduced in Tablelist version
    4.3 (thanks to Matthew Callaghan for his bug report).

11. Eliminated the possible endless loop caused by some option database
    settings in the "seecell" subcommand (thanks to Erik Allaert and
    Mauro Comin for reporting this bug).

12. Added a detailed performance-related hint to the description of the
    "-listvariable" configuration option.

13. Numerous further improvements and minor bug fixes.

What was new in Tablelist 4.5?
------------------------------

1.  Static-width columns are now displayed much faster than in earlier
    Tablelist releases.

2.  Quite significantly reduced the performance penalty imposed by
    various column, row, and cell configuration options when sorting,
    redisplaying, moving, or deleting tablelist items.

3.  Embedded images are now handled much more efficiently and are
    displayed much faster than in earlier Tablelist versions.

4.  New column configuration option "-showlinenumbers" (thanks to Rolf
    Schroedter and Sean Xu for their proposals and to Kathrin Klaes for
    testing the implementation).

5.  Support for tile-based multi-entry widgets (introduced in Mentry
    3.0) used as edit windows.

6.  Significantly improved the handling of the <<ThemeChanged>> virtual
    event.

7.  Defined more reasonable windowing system- and theme-specific default
    values for the "-arrowdisabledcolor" option.

8.  Improved and simplified the package loading mechanism (thanks to
    Andreas Kupries for his valuable contribution).

9.  Eliminated the "togglevisibility" subcommand, which was deprecated
    in the previous Tablelist version in favor of "togglecolumnhide".

10. Fixed a bug in the implementation of the "deletecolumns" subcommand,
    introduced in the previous Tablelist release (thanks to Kai Morich,
    Kurt Kurczyk, and Dave Leslie for their bug reports).

11. Fixed two binding-related bugs (thanks to Mark Garvey and Kurt
    Kurczyk for their bug reports).

12. Fixed a bug related to the handling of the "tileqt" theme (thanks to
    Andres Garcia for his bug report).

13. Fixed a small but annoying bug related to the "-maxwidth" column
    configuration option, introduced in the previous Tablelist version.

14. Numerous further improvements and minor bug fixes (thanks to
    Patrick Fradin and Georgios Petasis for their valuable feedback).

What was new in Tablelist 4.4?
------------------------------

1.  New row configuration option "-hide" (thanks to Jeff Godfrey,
    Patrick Fradin. Hemang Lavana, and Martyn Smith for their
    proposals, and especially to Harold Campbell for providing the
    initial implementation and testing the final one.)  For performance
    reasons this option is implemented by using elided text in the
    underlying text widget, and therefore it is not supported for Tk
    versions earlier than 8.3.

2.  New subcommand "togglerowhide" for hiding/unhiding several rows at
    a time (not supported for Tk versions earlier than 8.3).

3.  Renamed the "togglevisibility" subcommand to "togglecolumnhide".
    The old name is still supported, but will be eliminated in the next
    Tablelist release.

4.  New command "tablelist::setThemeDefaults", which can be used to
    make sure that classical Tk widgets, e.g., text, will have a theme-
    specific appearance, just like the tile widgets.  The tile-based
    demo scripts now make use of this command.

5.  When using the "tileqt" theme, the version number of TileQt must be
    0.3 or higher (thanks to Georgios Petasis for providing the new
    "tileqt" features used in this Tablelist release).

6.  For Tk 8.3 or later, hidden columns are now handled by using elided
    text, which results in very significant performance improvements
    (thanks to Harold Campbell for his valuable contribution).

7.  Improved the handling of the "-listvariable" option in connection
    with snit widgetadaptors (thanks to Rolf Ade for his bug-fix).

8.  Corrected a typo in the implementation of the "move" subcommand,
    introduced in the previous release (thanks to Jerome Siot for his
    bug report).

9.  Improved the handling of the virtual event <<ThemeChanged>> (thanks
    to Wofgang Grosser for his bug report).

10. Fixed a long-standing bug related to hidden columns (thanks to Dave
    Leslie for his bug report).

11. Worked around a peculiarity of the "place" command on Windows,
    which caused refresh problems in column labels with images (thanks
    to Sebastien Barre for his bug report).

12. Numerous further improvements and minor bug fixes.

What was new in Tablelist 4.3?
------------------------------

1. Support for multi-line cells:  Newline characters now force line
   breaks when displaying the items (thanks to Sebastien Barre,
   Tillmann Basien, Cameron Laird, Kai Morich, and Vaclav Snajdr for
   their proposals).  In addition, interactive cell editing can now
   take place with the aid of a text widget, too (this has caused a few
   minor changes in the default key bindings for the edit window).

2. Support for multi-column sorting with the aid of the new subcommands
   "sortbycolumnlist", "sortcolumnlist", and "sortorderlist", as well
   as of the new command "tablelist::addToSortColumns".  The latter is
   designed to be specified as the value of the new widget and column
   configuration option "-labelcommand2", whose value is invoked on 
   <Shift-Button-1> events.  Multi-column sorting is visualized by
   means of multiple sort arrows, which are displayed together with the
   corresponding sort ranks.  (Thanks to Harold Campbell for proposing
   most of these features, providing the initial implementation, and
   testing the final one.)

3. New configuration option "-setfocus", specifying whether mouse
   button 1 should set the focus to the tablelist's body (thanks to
   Tillmann Basien for discussions on this topic).

4. Replaced the contents of the directory "images" with a script file
   containing procedures that create the bitmap images from inline data
   (thanks to Mats Bengtsson, Patrick Fradin, and Kai Morich for their
   proposals).

5. Fixed a bug related to the use of a tile entry within a non-tile-
   based tablelist widget on Windows XP (thanks to Schelte Bron for his
   bug report).

6. The handling of <Command-Key> events during interactive cell editing
   is now explicitly restricted to Mac OS Classic and Mac OS X Aqua,
   because, strangely enough, on Windows these events are generated by
   simple keypresses if Num Lock is active.

7. Numerous further code improvements, minor bug-fixes, and support for
   several recent changes in tile.

8. Cleaned up the documentation, to make sure that the HTML files
   generated for the ActiveTcl distribution with the tool HTML Tidy
   will be syntactically identical to the original ones.

What was new in Tablelist 4.2?
------------------------------

1.  The resize area of the header labels now consists of a few pixels
    on both sides of the right edge (thanks to Bryan Oakley for
    suggesting this improvement).

2.  Made sure that the header labels have the right appearance in the
    "aqua" theme when using tile version 0.6.4 or later (thanks to
    Bryan Oakley for his bug report).

3.  Several further improvements related to Mac OS X Aqua (for example,
    support for the "Command" key during keyboard navigation between
    the editable cells).

4.  Fixed a very long-standing bug in the "containing" subcommand
    (thanks to Mats Bengtsson, Schelte Bron, and Mark Garvey for their
    bug reports).

5.  Fixed a bug related to the "xpnative" theme, introduced in the
    previous release (thanks to Mark Garvey, Jeff Godfrey, and Uwe
    Koloska for their bug reports).

6.  Fixed another very long-standing bug, related to insertion and
    deletion of columns having images in their labels (thanks to
    Sebastien Barre for his bug report).

7.  Fixed an old bug related to embedding images or windows into hidden
    cells (again, thanks to Sebastien Barre for reporting this bug).

8.  The demo scripts now work independently of their location (this
    small improvement reflects the fact that Tablelist is now included
    in tklib, where the examples are in a location different from
    "$tablelist::library/demos").

9.  Adapted two tile-based demo scripts to the recently released tile
    version 0.7.

10. Several further improvements in the code and documentation (thanks
    to Patrick Fradin for his valuable contribution).

What was new in Tablelist 4.1?
------------------------------

1.  Significantly extended the tile support in the Tablelist_tile
    package:  Header labels now look and behave like the column
    headings of treeview widgets, and over a dozen configuration
    options have theme-specific default values (thanks to Paul
    Obermeier for his excellent "poImgview" application, which helped
    me a lot during this work, as well as to Georgios Petasis for his
    Qt-related hints).

2.  Header labels containing the mouse cursor are now set into active
    state.  Their appearance is controlled in the Tablelist package by
    the new configuration options "-labelactivebackground" and
    "-labelactiveforeground", while the Tablelist_tile package uses
    theme-specific background and foreground colors for the active and
    pressed states of the labels.

3.  New configuration option "-arrowstyle", specifying the flat or
    sunken relief and the dimensions of the arrow indicating the
    sorting order.  This option has windowing system- and theme-
    specific default values.

4.  New configuration option "-protecttitlecolumns", used to protect
    the title column boundary from being crossed when moving a column
    interactively (thanks to Schelte Bron for his proposal).

5.  New configuration option "-spacing", specifying additional space to
    provide above and below each tablelist row (thanks to Sebastien
    Barre for his proposal).

6.  New column configuration option "-stretchable", complementing the
    global "-stretch" option (thanks to Sebastien Barre for his
    proposal).

7.  New row configuration option "-name", whose value can also be used
    as a row index and as the first component of a cell index (thanks
    to John Kozura for his proposal).

8.  New cell configuration option "-windowdestroy", specifying a script
    to be invoked when a window embedded into the cell is destroyed
    (thanks to Sebastien Barre for his proposal).

9.  New "imagelabelpath" subcommand (thanks to Schelte Bron for his
    proposal).

10. Keyboard navigation during interactive cell editing now works on
    Mac OS X Aqua, too.

11. Restored the support for Tcl/Tk versions earlier than 8.3, by
    cleaning up the handling of the "-titlecolumns" option (thanks to
    Andreas Flach and Brian O'Hagan for their bug reports).

12. Restored the support for Tcl/Tk versions earlier than 8.0.4, which
    has been broken since release 3.5, due to the use of the
    <MouseWheel> event, introduced in Tk 8.0.4 (thanks to Brian O'Hagan
    for his valuable contribution).

13. Worked around a peculiarity of the text widget's "dump -window"
    command (thanks to Greg Reynolds for his bug-fix).

14. Fixed a binding-related bug in "extended" selection mode (thanks to
    David Mattinson for his bug-fix).

15. Numerous further improvements and minor bug fixes (thanks to
    Schelte Bron, Patrick Fradin, Silas Justiniano, and Uwe Koloska for
    their bug reports and valuable contributions).

What was new in Tablelist 4.0?
------------------------------

1.  Support for the tile entry, combobox, and checkbutton widgets for
    interactive cell editing (thanks to Miguel Bagnon, Andy Black,
    Adrian Chan, and Mark Garvey for their proposals and to Mats
    Bengtsson and Kevin Walzer for their support on the Macintosh).
    See the new reference page "tablelistTile.html" for details.

2.  Support for tile-compatibility:  By just specifying "package
    require Tablelist_tile" instead of "package require Tablelist", the
    tablelist widgets will have a modern theme-specific appearance
    (again, thanks to the above-mentioned Tablelist users for their
    suggestions and assistance).  See the "How to use it?" and "More on
    Tablelist_tile" sections of the tutorial "tablelist.html" for
    details.

3.  New demo script "tileWidgets.tcl", illustrating the use of tile
    widgets for interactive cell editing and of the Tablelist_tile
    package.  All the other demo scripts are now provided in both a
    traditional and a tile-based version.  See the "Tile-based demo
    scripts" section of the tutorial "tablelist.html" for an example
    and some screenshots.

4.  The Tk checkbutton used for interactive cell editing is now a
    platform-specific checkbutton widget on Windows and the Macintosh
    (thanks to Mats Bengtsson for his help related to the Macintosh
    platform).

5.  The "-editwindow" option is now available at cell level, too
    (thanks to Kenneth Green for his proposal).

6.  New subcommand "togglevisibility" for hiding/unhiding several
    columns at a time (thanks to Stefan Finzel and Kai Morich for their
    proposals).

7.  Support for the new virtual event <<TablelistSelectionLost>>,
    generated when a tablelist widget having "-exportselection 1" loses
    the selection (thanks to Aldo Buratti for his proposal).

8.  After sorting the items, the "most important" row is automatically
    brought into view (thanks to Kai Morich for his valuable input).

9.  Worked around a peculiarity of Tk for Windows, related to mouse
    events (thanks to Tore Morkemo and Mike Collins for their bug
    reports).

10. Worked around a problem related to the visibility of the up/down-
    arrow on Mac OS X Aqua (thanks to Kevin Walzer for his bug report).

11. Fixed a bug in the "seecell" subcommand, introduced in Tablelist
    version 3.7 (thanks to Stefan Finzel for his bug report).

12. Fixed a bug in the "rowconfigure" subcommand, introduced in the
    previous Tablelist release (thanks to Tore Morkemo for his bug
    report).

13. Eliminated the memory leak caused by incomplete cleanup on deleting
    rows with embedded windows (thanks to David Cockerell for his bug
    report).

14. Fixed a small timing-related bug in the "editcell" subcommand
    (thanks to Kenneth Green for his bug report).

15. Numerous further improvements and minor bug fixes (thanks to Greg
    Reynolds for his valuable input).

What was new in Tablelist 3.8?
------------------------------

1. New configuration option "-forceeditendcommand", controlling the
   invocation of the script corresponding to the value of the
   "-editendcommand" option (thanks to Nestor Patino for his proposal).
 
2. New subcommands "getcells" and "windowpath" (thanks to Jeff Godfrey
   and Mike Collins for their proposals).

3. Support for the new virtual event <<TablelistCellRestored>>,
   generated by the "cancelediting" subcommand.

4. Significantly improved the performance of the "delete",
   "deletecolumns", and "movecolumn" subcommands for tablelist widgets
   having color or font options set at column, row, or cell level
   (thanks to Michael Bahr for his valuable feedback).

5. Improved the autoscrolling with the left mouse button in both the
   body and the header of a tablelist widget having title columns.

6. Fixed a bug related to the "-titlecolumns" option, introduced in the
   previous Tablelist release (thanks to Alexander Schoepe for his bug
   report).

7. Fixed a typo in the implementation of the "seecell" subcommand,
   introduced in the previous Tablelist release (thanks to Patrick
   Fradin for his bug report).

8. Improved the demo script "embeddedWindows.tcl" (thanks to Patrick
   Fradin for his valuable input).

9. Several further improvements and minor bug fixes.

What was new in Tablelist 3.7?
------------------------------

1. New configuration option "-titlecolumns", specifying the number of
   the non-scrollable columns at the left edge of the window (thanks to
   Goran Ivankovic, Paul Kienzle, Hemang Lavana, and Takeshi Sakamoto
   for their proposals).  For technical reasons (the use of the
   "-elide" option for a text widget tag), this option is not supported
   for Tk versions earlier than 8.3.

2. Extended the "separatorpath" and "separators" subcommands, to
   support the new special separator, which is displayed to mark the
   end of the title columns, independently of the value of the
   "-showseparators" option.

3. The "-stripebackground" and "-stripeforeground" options now have a
   higher priority than the "-background" and "-foreground" column
   configuration options, respectively (see the demo script
   "styles.tcl", which has been extended to illustrate this change).

4. Improved the handling of embedded images with transparent
   background, complementing the changes made in the previous Tablelist
   release (thanks to Kai Morich for his valuable contribution).

5. Improved the implementation of the "seecell" subcommand for centered
   and right-aligned columns.

6. Fixed two bugs related to the "rowconfigure" subcommand, introduced
   in Tablelist version 3.5 (thanks to Ted Branscomb and Roger Niva for
   their bug reports).

7. Fixed an old bug related to the "movecolumn" subcommand.

8. Several further improvements and minor bug fixes.

What was new in Tablelist 3.6?
------------------------------

1.  Support for embedded windows, with the aid of the new cell
    configuration option "-window" (thanks to Wolf Grossi, Glenn
    Herteg, Takeshi Sakamoto, and Keesang Song for proposing this
    option).

2.  New demo script "embeddedWindows.tcl" illustrating the use of
    embedded windows in tablelist widgets; this is discussed in a new
    section of the tutorial "tablelist.html".

3.  Significantly improved and optimized the handling of embedded
    images.

4.  Simplified the support for user-defined binding scripts with the
    aid of the new commands "tablelist::getTablelistPath" and
    "tablelist::convEventFields", as well as of a new binding tag whose
    name is returned by the new "bodytag" subcommand (which is now used
    in the demo script "browse.tcl").

5.  Support for the new virtual events <<TablelistRowMoved>>,
    <<TablelistColumnMoved>>, <<TablelistColumnSorted>> and
    <<TablelistCellUpdated>> (thanks to John Vidolich for his
    proposal).  In addition, the new virtual event <<TablelistSelect>>
    can now be used instead of <<ListboxSelect>> (which is supported
    for compatibility reasons).

6.  New subcommand "itemlistvar", for accessing the tablelist widget's
    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
    bug report).

8.  Fixed two bugs related to the "cellselection" subcommand (thanks to
    John Vidolich for his bug report).

9.  Fixed a few typos and minor bugs in the default binding scripts
    (thanks to Patrick Fradin, Tore Morkemo, and Torsten Reincke for
    their bug reports).

10. Numerous further improvements and minor bug fixes.

What was new in Tablelist 3.5?
------------------------------

1.  New configuration option "-selecttype" with the values "row" and
    "cell", and new binding scripts supporting these two selection
    types (thanks to Kevin Partin for his proposal and to Dietmar
    Mueller for his valuable contribution).

2.  New subcommands "activatecell", "cellselection", and
    "curcellselection", used in the binding scripts mentioned above.

3.  The words "active" and "anchor" are now recognized as valid column
    and cell indices, too.

4.  New configuration options "-movablerows" and "-movecursor", and new
    mouse bindings for moving a row interactively (thanks to Dan Rogahn
    for his valuable contribution).

5.  The key sequences used for navigation between the editable cells
    now also move the active item or element and change the
    (cell)selection and the (cell)selection anchor in the body of the
    tablelist widget.

6.  Improved the handling and appearance of the checkbutton widget when
    used as edit window (thanks to Kevin Partin for reporting a problem
    experienced when the tablelist is embedded into an Iwidgets
    dialogshell).

7.  The "-listvariable" option now supports variable names returned by
    the "itcl::scope" command, too (thanks to Nicolae Mihalache for his
    bug report).

8.  Fixed a very long-standing bug related to horizontal scrolling when
    using a non-default font (thanks to Brand Hilton for his bug report
    and fix).

9.  Fixed another very long-standing bug, related to list variables
    (thanks to Dr. Detlef Groth and John R. Smith for their bug
    reports).

10. Numerous further improvements and minor bug fixes (thanks to
    Patrick Fradin for his valuable input).

What was new in Tablelist 3.4?
------------------------------

1.  New column configuration option "-editwindow", specifying the
    widget type used for interactive cell editing in the respective
    column (thanks to Damon Courtney, Patrick Fradin, and Keesang Song
    for their proposals and to Mats Bengtsson and Benny Riefenstein for
    their help related to the Macintosh platform).  The edit window may
    be a Tk core entry, spinbox, or checkbutton, or one of the 16
    supported widgets from the packages BWidget, Iwidgets, combobox (by
    Bryan Oakley), and Mentry.

2.  New subcommand "editwinpath".

3.  Three new demo scripts illustrating the use of the "-editwindow"
    option; these are discussed in a new section of the tutorial
    "tablelist.html".

4.  New column configuration option "-maxwidth" (thanks to Tore Morkemo
    for his proposal).

5.  The <Shift-Button-3> event in a column label now restores the
    column's last static width (thanks to Dietmar Mueller for his
    valuable input).

6.  Changing a tablelist's font now updates the column widths
    accordingly.

7.  Improved the handling of the "-setgrid" option.

8.  Improved the error handling related to the option database in the
    general mega-widget utility module "mwutil.tcl".

9.  Fixed a minor bug in the "containingcolumn" subcommand (thanks to
    David Mattinson for his bug report).

10. Restored the support for Tcl/Tk versions earlier than 8.0.4, which
    has been broken since release 3.0, due to the use of the
    <MouseWheel> event, introduced in Tk 8.0.4.

11. Further code improvements (thanks to Patrick Fradin for his
    valuable input).

12. Many improvements in the documentation, including a new Quick
    Reference section (thanks to Dietmar Mueller for his valuable
    contribution).

What was new in Tablelist 3.3?
------------------------------

1. New column configuration option "-text" (thanks to Paul Kienzle for
   his proposal).

2. New subcommands "containing", "containingcolumn", "containingcell",
   and "fillcolumn".

3. New subcommands "deletecolumns", "insertcolumns", and
   "insertcolumnlist" (thanks to Kevin Partin and Paul Kienzle for
   their proposals).

4. Renamed the subcommands "getcolumn" and "getkey" to "getcolumns" and
   "getkeys", respectively.  (This won't break any existing scripts,
   because the old command names are abbreviations of the new ones.)

5. Restored the support for Tcl/Tk versions earlier than 8.4, which was
   broken in Tablelist 3.1 and 3.2, due to the use of the improved
   syntax of the "place configure" command, introduced in Tk 8.4
   (thanks to David Mattinson, Kurt Braganza, and Alexander Baath for
   reporting this problem).

6. Fixed a bug in the "editcell" subcommand, introduced in Tablelist
   3.1 (thanks to Damon Courtney for his bug report).

7. Improved the demo script "config.tcl" (thanks to Mats Bengtsson for
   his input).

8. Restructured the code by moving several procedures from the
   distribution file "tablelistWidget.tcl" into smaller, more
   manageable modules.

9. Numerous further improvements and minor bug fixes.

What was new in Tablelist 3.2?
------------------------------

1. The key associated with a tablelist item can now be used as a row
   index and as the first component of a cell index of the form
   "row,col".

2. The "delete", "get", "getcolumn", "getkey", "selection clear", and
   "selection set" subcommands now also accept a list of indices as
   single argument (thanks to Damon Courtney and Erik Leunissen for
   their proposals).

3. Made the interactive "movecolumn" operation more intuitive and
   compatible with the behavior exhibited by similar actions in popular
   applications on various platforms (thanks to Paul Kienzle for his
   suggestion).  For example, the target position of the column being
   moved is now indicated by a temporary gap displayed in the
   tablelist's header.

4. New configuration option "-targetcolor", used to set the color of
   the gap mentioned above.

5. Fixed a bug related to the <MouseWheel> event, caused by a missing
   close-bracket in the last release (thanks to Patrick Fradin for his
   bug report).

6. Fixed a bug that raised an error in the "movecolumn" command for an
   empty tablelist widget (thanks to Paul Kienzle for his bug report).

7. The workaround in the "xview" and "yview" subcommands for a Tk bug
   under Mac OS X Aqua is now only activated for that windowing system,
   since (as reported by Patrick Fradin) it caused problems on some
   other systems.

8. Further minor code improvements.

What was new in Tablelist 3.1?
------------------------------

1.  New configuration options "-movablecolumns" and
    "-movecolumncursor".

2.  New column configuration option "-name", whose value can also be
    used as a column index and as the second component of a cell index
    of the form "row,col".

3.  New subcommands "move", "movecolumn", "getcolumn", "getkey", and
    "finishediting" (thanks to Damon Courtney, Daniel Fehrenbach, Jeff
    Godfrey, and Kevin Partin for their proposals).

4.  Extended the scope of the "cancelediting" subcommand.

5.  New mouse bindings for moving a column interactively.

6.  The autoscrolling, as described in the "DEFAULT BINDINGS" section
    of the "listbox" manual entry, is now implemented for the header of
    a tablelist widget, too.

7.  The interactive cell editing is now finished by any mouse click in
    the tablelist's body, outside the cell just being edited (thanks to
    Patrick Fradin and Jeff Godfrey for this suggestion).

8.  The value returned by the "selection includes" command no longer
    depends on the tablelist's state.

9.  Worked around a bug in Tk 8.4.0 and 8.4.1 related to the "selection
    handle" command, which caused crashes under KDE 3.0 (thanks to
    Andres Garcia for reporting this and to Joe English for suggesting
    the workaround and fixing the bug in Tk 8.4.2).

10. Improved the support of Mac OS X Aqua and Mac OS Classic (thanks to
    Mats Bengtsson, Raymond Calande, Techin Alex Kang, Bernhard
    Spinnler, and especially to Benny Riefenstein for their valuable
    contributions).

11. Fixed a bug related to the invocation of the "cellconfigure"
    subcommand from within a pre-edit callback (thanks to Dr. Johannes-
    Heinrich Vogeler for his bug report).

12. Several performance improvements (thanks to Patrick Fradin for his
    valuable suggestions).

13. Improved the platform-specific stuff in the demo scripts
    "config.tcl" and "browse.tcl".

14. Numerous further improvements in the code and documentation.

What was new in Tablelist 3.0?
------------------------------

The main new feature provided by this release is the support for
interactive cell editing (thanks to Juri Shimon, Dr. Johannes-Heinrich
Vogeler, and Jeff Godfrey for their proposal).  The first three items
below are related to this subject:

1. New configuration options "-editstartcommand" and "-editendcommand".

2. New column and cell configuration option "-editable".

3. New subcommands "editcell", "entrypath", "cancelediting", and
   "rejectinput".

Further changes:

4. New subcommands "seecolumn" and "seecell".

5. Tabulator and newline characters are now retained in the internal
   list, displayed as "\t" and "\n", and supported by interactive cell
   editing (thanks to Jacek Jenrysik for his query concerning multi-
   line items).

6. The redisplay and sorting of tablelist items have become
   dramatically faster (thanks to Matt Becker for his input that
   determined me to optimize these operations, and also for his
   testing).

7. Further performance improvements (thanks to Patrick Fradin for his
   valuable contribution).

8. The option values displayed by the demo script "config.tcl" can now
   be edited interactively.

9. Minor improvements in the code and documentation.

What was new in Tablelist 2.8?
------------------------------

1. The trailing or leading ellipsis ("...") used when displaying the
   elements that don't fit into their cells can now be replaced with an
   arbitrary string specified with the aid of the new "-snipstring"
   configuration option (thanks to Tore Morkemo for his proposal).

2. New value "none" for the "-activestyle" configuration option.

3. When exporting the selection, the elements of the hidden columns are
   now skipped and the contents of the visible cells are transformed
   according to the value of the "-formatcommand" option for the
   corresponding columns.

4. Improved and simplified the focus control (thanks to Juri Shimon and
   Gopal Reddy for their bug reports).

5. Further minor code improvements.

What was new in Tablelist 2.7?
------------------------------

1. Increased the speed of the "insert" and "insertlist" subcommands as
   well as that of item insertions with the aid of the "-listvariable"
   option by a factor of about 1.3.  The "insert" subcommand is now
   about 2.3 times faster than in version 2.4.  Compared to version
   2.4, item insertion with the aid of the "-listvariable" option has
   become more than 10 times faster.

2. The number of pixels by which a column is stretched is now
   proportional to its width in pixels.  Based on this change,
   significantly improved the stretching behavior after an interactive
   column resize operation (thanks to Mats Bengtsson for his valuable
   suggestions).

3. Fixed a bug in the "-(label)font" and "-labelborderwidth"
   configuration options, introduced in version 2.5 (thanks to Bastien
   Chevreux for his bug report).

4. Fixed a bug in the "columncget", "rowcget", and "cellcget"
   subcommands, introduced in version 2.3 (again, thanks to Bastien
   Chevreux for reporting this bug).

5. Fixed a bug in the binding scripts for the binding tag
   "TablelistBody" (thanks to Miguel Bagnon for his bug report).

6. Applied a patch proposed by Jeff Adamczak that works around a bug in
   the "lsort" command, present in Tcl versions 8.0 - 8.3.2.

7. Applied a patch proposed (in a slightly different form) by Mats
   Bengtsson that works around a bug in the "info script" command on
   the Macintosh.

8. Further minor code improvements.

What was new in Tablelist 2.6?
------------------------------

The only change in this version is a bug-fix eliminating a rather nasty
bug in the "insert" and "insertlist" subcommands, introduced in the
previous release.  Thanks to Mats Bengtsson for his bug report and to
Jeffrey Hobbs for suggesting me to bump the version number to 2.6.

What was new in Tablelist 2.5?
------------------------------

1. Increased the speed of the "insert" subcommand by a factor of about
   1.8 and that of item insertions with the aid of the "-listvariable"
   option by a factor of about 8.  (These figures are based on speed
   measurements made with two tablelist widgets: one having 1000 rows
   and 10 columns and another one with 5000 rows and 20 columns.)

2. The "delete", "sort", and "sortbycolumn" subcommands, as well as row
   and cell updates with the aid of the "rowconfigure" and
   "cellconfigure" operations have also become significantly faster.

3. New "insertlist" subcommand.

4. New "-stripeheight" configuration option (thanks to Gregory Samoluk
   for his proposal).

5. If no columns are to be stretched then the blank space following the
   header labels is now filled with a dummy, insensitive label having
   the same background, borderwidth, and relief as the "normal" header
   labels.

6. Fixed a bug concerning the placement of the arrow indicating the
   sorting order (thanks to Robert Minichino for his bug report).

7. Improved the handling of header labels with embedded images, to
   eliminate some peculiarities experienced on Windows.

8. Several further improvements and minor bug fixes.

What was new in Tablelist 2.4?
------------------------------

1. New column configuration option "-formatcommand" (thanks to Jeff
   Godfrey for his proposal).  This option is now used in the demo
   script "browse.tcl".

2. New row configuration option "-selectable" (thanks to Tore Morkemo
   for this proposal).

3. Significantly improved the performance of the row and cell updates,
   as well as of the "delete" subcommand (thanks to Emanuele Lupi for
   her input that determined me to optimize these operations).

4. The widget implementation is now fully compatible with the recent
   changes made in Tk 8.4a4 (thanks to Patrick Fradin for his input).

5. Pop-up menus as children of a tablelist widget cause no problem any
   longer (thanks to Andres Garcia and Bastien Chevreux for reporting
   this bug, introduced in the previous release).

6. Fixed a bug caused by the delayed redisplay after changing the
   number of columns (thanks to Tore Morkemo for his bug report).

7. Minor improvements in the code and documentation.

What was new in Tablelist 2.3?
------------------------------

1. New configuration option "-activestyle", enabling to surround the
   active item with a frame instead of underlining it.

2. The columns can now be separated with borders, by making use of the
   new configuration option "-showseparators".

3. A nice distinguishing effect for the rows can now be obtained with
   the aid of the new configuration options "-stripebackground" and
   "-stripeforeground".

4. New tablelist widget subcommands "separatorpath" and "separators".

5. Fixed a bug related to the column index if the header labels are
   hidden (thanks to Emanuele Lupi for her bug report).

6. New demo script "styles.tcl", showing several ways to improve the
   appearance of a tablelist widget.

7. The demo scripts "config.tcl" and "browse.tcl" now make use of the
   new "-stripebackground" option.

8. Numerous further improvements and minor bug fixes (thanks to Patrick
   Fradin for his valuable input).

What was new in Tablelist 2.2?
------------------------------

1. The "-font" configuration option can now be specified at column,
   row, and cell level, too (this was proposed and partly implemented
   by Patrick Fradin).  The data will be aligned properly, no matter if
   the fonts are of different sizes.

2. Significantly improved the performance of the Tcl command associated
   with a tablelist widget, especially that of the "delete", "sort",
   and "sortbycolumn" subcommands for a large number (i.e., several
   thousands) of items.

3. Corrected the creation of the arrow indicating the sorting order, to
   make sure that it works under all supported Tcl/Tk versions (thanks
   to Juri Shimon and Andres Garcia for their bug reports).

4. Several improvements in the demo scripts "config.tcl" and
   "browse.tcl".  Among others, the GUIs generated by these scripts now
   have a better platform-specific look & feel (many thanks to Mats
   Bengtsson for his valuable suggestions concerning the Macintosh
   platform).

5. Further minor improvements in the code.

What was new in Tablelist 2.1?
------------------------------

1. The up- or down-arrow indicating the sorting order now has a 3-D
   border, giving the arrow a sunken relief.

2. Due to the new 3-D look of the arrow, the default values of the
   "-arrowcolor" and "-arrowdisabledcolor" configuration options have
   been changed to an empty string, indicating that the arrow will
   inherit the background color of the label in which it is placed.

3. Several improvements in the demo script "browse.tcl".

4. Minor improvements in the code and documentation.

5. The distribution file "tablelist2_1.zip" for Windows now includes
   the "tablelist2.1" directory, hence it is no longer necessary to
   create this folder before unpacking the distribution file (thanks to
   Kevin Partin for this suggestion).

What was new in Tablelist 2.0?
------------------------------

1.  New cell configuration option "-image", used to set and retrieve
    the image to be displayed (by itself or together with a text) in a
    cell of a tablelist widget.

2.  New column configuration option "-labelimage" specifying the image
    to be displayed (by itself or combined with a text) in a column
    label.

3.  The alignment of a header label can now be defined to be different
    from that of the elements contained in its column, by using the new
    column configuration option "-labelalign".

4.  Renamed the column configuration option "-justify" to "-align",
    because (at least in the case of the header labels) this actually
    specifies not only the justification, but also the anchor point.
    Hopefully, this POTENTIAL INCOMPATIBILITY will not break too many
    existing applications, because the column alignments are usually
    specified within the "-columns" global option.

5.  Fixed a bug that raised an error when some configuration options
    were specified at widget creation time before the "-columns" option
    (thanks to Bastien Chevreux for his bug report).

6.  Reverted the implementation of the focus control to that contained
    in the pre-1.6 Tablelist releases, because its simplified version
    from the last release failed to work as expected if a tablelist was
    the only widget taking the focus during keyboard traversal (thanks
    to Juri Shimon for his bug report).

7.  Fixed a bug that caused an erronous return value of the "labels"
    subcommand if the arrow indicating the sorting order was displayed.

8.  Several performance improvements, kindly contributed by Patrick
    Fradin.

9.  To improve the performance even further, the invocations of "info
    exists" for array elements are no longer replaced with a call to a
    helper procedure (introduced in Tablelist 1.2), because the Tcl bug
    that made this necessary for Tcl versions 8.2, 8.3.0 - 8.3.2, and
    8.4a1 was fixed in Tcl 8.3.3 and 8.4a2.  If for some reason you
    cannot upgrade your Tcl/Tk version, then you should patch the file
    "tablelistWidget.tcl" with the aid of the script "repair.tcl", as
    described in the files "README.txt" and "tablelist.html".

10. The demo script "browse.tcl" now inserts an image into the first
    cell of each row of the tablelist widget.

11. Numerous further improvements and minor bug fixes.

What was new in Tablelist 1.6?
------------------------------

1. The value of the "-stretch" configuration option is now ignored if
   the width of the tablelist widget was specified as zero or less.
   This change was necessary in order to improve the behavior of
   dynamic-width tablelist widgets with the "-setgrid" option set to
   true.

2. By pressing mouse button 1 over a header label, the label's relief
   is now only changed to "sunken" if the value of the global or
   column-specific "-labelcommand" option is nonempty.

3. Several improvements concerning hidden columns (thanks to Juri
   Shimon for his bug report).

4. Made the focus control more straight-forward.

5. Extended the "How to use it?" section of the tutorial
   "tablelist.html".

What was new in Tablelist 1.5?
------------------------------

This version contains mainly bug fixes and small improvements.  Many
thanks to Andres Garcia, Bastien Chevreux, and Patrick Fradin for their
valuable contributions.

1. Fixed a bug concerning the "-label*" configuration options.

2. Fixed the erronous invocation of "getSubCmd" in the selection
   handler "fetchSelection" (this bug was introduced in version 1.1).

3. Elements that don't fit into their cells are now displayed with a
   trailing or leading ellipsis ("..."), depending on the column
   alignment.

4. Several further improvements and minor bug fixes.

What was new in Tablelist 1.4?
------------------------------

1. New "-stretch" configuration option specifying the columns that are
   to be stretched in order to eliminate the blank space that might
   appear at the right of the table.

2. Improved the error handling in the "attrib", "configure",
   "columnconfigure", "rowconfigure", and "cellconfigure" subcommands.

3. Improved the demo scripts "browse.tcl" and "config.tcl".

What was new in Tablelist 1.3?
------------------------------

1. The "sortbycolumn" subcommand now per default places an up- or
   down-arrow indicating the sorting order into the respective column's
   label.  This can be enabled or disabled with the new "-showarrow"
   configuration option, at both widget and column level.

2. New configuration options "-arrowcolor", "-arrowdisabledcolor", and
   "-incrarrowtype" to control the appearance of the arrow mentioned
   above.

3. New "resetsortinfo" subcommand, used to reset the information about
   the sorting of the items.

4. Improved the demo script "browse.tcl".

5. Further improvements in the code and documentation.

What was new in Tablelist 1.2?
------------------------------

1. Whereever possible, eliminated the invocations of "info exists" for
   array elements.  This works around a severe bug in Tcl versions 8.2
   and 8.3 (fixed in 8.4a2), which causes excessive memory use when
   calling "info exists" on a non-existent array element.  Some serious
   memory leaks in earlier Tablelist versions when run under Tcl/Tk 8.2
   or 8.3 (reported by Henning Hanusa and Christian Burrini) could be
   tracked down to this very annoying Tcl bug (which I was not aware of
   until recently).

2. The help variables used in the initialization of the "tablelist"
   namespace are now declared with the "variable" keyword, in order to
   avoid any conflicts with global variables.

3. Improved the parsing of configuration and command options.

What was new in Tablelist 1.1?
------------------------------

This version contains mainly bug fixes and small improvements.  Many
thanks to Patrick Fradin, Bastien Chevreux, and Mats Bengtsson for
their valuable contributions.

1. Fixed some bugs in the implementation of the "-listvariable" option.
   Also, the value of this option can now be an array element, not only
   a scalar variable.

2. Fixed a bug in the implementation of the "get" subcommand.

3. New "sortcolumn" and "sortorder" subcommands to query the arguments
   of the last sorting.

4. Improved the look & feel of tablelist widgets on the Macintosh.

5. Worked around a bug in Tk 8.3.0 (fixed in 8.3.1) concerning listbox
   widgets with configured "-cursor" option.

6. Several further improvements and minor bug fixes.

What was new in Tablelist 1.0?
------------------------------

1.  New "-resizable" option for the "columnconfigure" subcommand.

2.  New "labels" subcommand. returning the list of the header labels.

3.  The "-disabledforeground" and "-state" configuration options no
    longer require Tk version 8.3 or higher.

4.  All "-label*" column configuration options can now have an empty
    string as value, meaning that the corresponding global option will
    be used instead of the column-specific one.

5.  Improved the output of the "columnconfigure" subcommand.

6.  The help variables used in the coordinate transformations within
    the scripts defined for the "TablelistBody" binding tag have been
    moved into the "tablelist" namespace, in order to avoid any
    conflicts with global variables.

7.  Improved cross-platform support with the aid of the new <<Button3>>
    virtual event.

8.  Fixed a bug in the "compareAsSet" procedure of the demo script
    "config.tcl".

9.  New demo script "browse.tcl", containing a simple widget browser
    based on a tablelist.

10. Both demo scripts now use a namespace for their procedures, to
    avoid any conflicts when evaluating them with the "source" command.

11. The tutorial "tablelist.html" is now completed and includes a
    detailed discussion of both demo scripts mentioned above.

12. Numerous further improvements in the code and documentation.

What was new in Tablelist 0.9?
------------------------------

1. The documentation now includes the tutorial "tablelist.html" (part
   of which is still work in progress), as well as reference pages for
   the two exported commands "tablelist::tablelist" and
   "tablelist::sortByColumn".

2. The "-listvariable" configuration option is now fully implemented.

3. A column of a tablelist widget can now be made invisible by using
   the new "-hide" option of the "columnconfigure" subcommand.

4. The contents of a row can now be updated with the new "-text" option
   of the "rowconfigure" subcommand.

5. For Tk versions 8.3 or higher the "tablelist::tablelist" command now
   supports the "-disabledforeground", "-labeldisabledforeground", and
   "-state" configuration options.

6. Replaced "[focus]" with "[focus -displayof $win]", so that the code
   will work properly in applications using multiple displays.
   Similarly, the "font measure" command is now invoked with the
   "-displayof $win" option.  This also works around a peculiarity of
   the "font measure" command.

7. Renamed "tablelistBindingTag" to "Tablelist".

8. Fixed a bug in the private procedure "colIndex", for arguments of
   the form "@x,y".  This procedure is invoked (directly or indirectly)
   in the implementation of all commands that take a column or cell
   index or an x coordinate as argument.

9. Numerous further improvements and minor bug fixes.
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<








































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/COPYRIGHT.txt.

1
2
3
4
5
6
7
8
9
10
Multi-column listbox and tree widget package Tablelist, version 5.13
Copyright (c) 2000-2015  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
in all copies and that this notice is included verbatim in any
distributions.

This software is distributed WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
<
<
<
<
<
<
<
<
<
<




















Deleted scriptlibs/tablelist5.13/README.txt.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
       The Multi-Column Listbox and Tree Widget Package Tablelist

                                   by

                             Csaba Nemethi

                       csaba.nemethi@t-online.de 


What is Tablelist?
------------------

Tablelist is a library package for Tcl/Tk versions 8.0 or higher,
written in pure Tcl/Tk code.  It contains:

  - the implementation of the "tablelist" mega-widget, including a
    general utility module for mega-widgets;
  - a demo script containing a useful procedure that displays the
    configuration options of an arbitrary widget in a tablelist and
    enables you to edit their values interactively;
  - a demo script implementing a widget browser based on a tablelist
    used as multi-column listbox;
  - a demo script implementing a widget browser based on a tablelist
    used as multi-column tree widget;
  - a demo script implementing a directory viewer based on a tablelist
    used as multi-column tree widget;
  - a demo script showing several ways to improve the appearance of a
    tablelist widget;
  - four further demo scripts, illustrating the interactive cell
    editing with the aid of various widgets from the Tk core and from
    the packages tile, BWidget, Iwidgets, combobox (by Bryan Oakley),
    and Mentry;
  - one further demo script, with a tablelist widget containing
    embedded windows;
  - tile-based counterparts of the above-mentioned demo scripts;
  - a tutorial in HTML format;
  - reference pages in HTML format.

A tablelist is a multi-column listbox and tree widget.  The width of
each column can be dynamic (i.e., just large enough to hold all its
elements, including the header) or static (specified in characters or
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,
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.

The Tablelist package provides a great variety of tree styles
controlling the look & feel of the column that displays the tree
hierarchy with the aid of indentations and expand/collapse controls.

Interactive editing of the elements of a tablelist widget can be
enabled for individual cells and for entire columns.  A great variety
of widgets from the Tk core and from the packages tile, BWidget,
Iwidgets, combobox, ctext, and Mentry (or Mentry_tile) is supported for
being used as embedded edit window.  In addition, a rich set of keyboard
bindings is provided for a comfortable navigation between the editable
cells.

The Tcl command corresponding to a tablelist widget is very similar to
the one associated with a normal listbox.  There are column-, row-, and
cell-specific counterparts of the "configure" and "cget" subcommands
("columnconfigure", "rowconfigure", "cellconfigure", ...).  They can be
used, among others, to insert images into the cells and the header
labels, or to insert embedded windows into the cells.  The "index",
"nearest", and "see" command options refer to the rows, but similar
subcommands are provided for the columns and cells ("columnindex",
"cellindex", ...).  The items can be sorted with the "sort",
"sortbycolumn", and "sortbycolumnlist" command options.

The bindings defined for the body of a tablelist widget make it behave
just like a normal listbox.  This includes the support for the virtual
event <<ListboxSelect>> (which is equivalent to <<TablelistSelect>>).
In addition, version 2.3 or higher of the widget callback package Wcb
(written in pure Tcl/Tk code as well) can be used to define callbacks
for the "activate", "selection set", and "selection clear" commands,
and Wcb version 3.0 or higher also supports callbacks for the
"activatecell", "cellselection set", and "cellselection clear"
commands.  The download location of Wcb is

    http://www.nemethi.de

How to get it?
--------------

Tablelist is available for free download from the same URL as Wcb.  The
distribution file is "tablelist5.13.tar.gz" for UNIX and
"tablelist5_13.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

    http://core.tcl.tk/tklib

How to install it?
------------------

Install the package as a subdirectory of one of the directories given
by the "auto_path" variable.  For example, you can install it as a
directory at the same level as the Tcl and Tk script libraries.  The
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.13.tar.gz":

    gunzip -c tablelist5.13.tar.gz | tar -xf -

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

On Windows, use WinZip or some other program capable of unpacking the
distribution file "tablelist5_13.zip" into the directory
"tablelist5.13", 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
file "tablelistMove.tcl" in the same directory is only required for
scripts invoking the "move" or "movecolumn" tablelist command.  Finally,
the file "tablelistThemes.tcl" is only needed for applications using
the package Tablelist_tile (see next section).

Next, you should check the exact version number of your Tcl/Tk
distribution, given by the "tcl_patchLevel" and "tk_patchLevel"
variables.  If you are using Tcl/Tk version 8.2.X, 8.3.0 - 8.3.2, or
8.4a1, then you should proceed as described in the "How to install it?"
section of the file "tablelist.html", located in the "doc" directory.

How to use it?
--------------

The Tablelist distribution provides two packages, called Tablelist and
Tablelist_tile.  The main difference between the two is that
Tablelist_tile enables the tile-based, theme-specific appearance of
tablelist widgets; this package requires Tcl/Tk 8.4 or higher and tile
0.6 or higher.  It is not possible to use both packages in one and the
same application, because both are implemented in the same "tablelist"
namespace and provide identical commands.

To be able to use the commands and variables implemented in the package
Tablelist, your scripts must contain one of the lines

    package require tablelist ?version?
    package require Tablelist ?version?

Likewise, to be able to use the commands and variables implemented in
the package Tablelist_tile, your scripts must contain one of the lines

    package require tablelist_tile ?version?
    package require Tablelist_tile ?version?

Since the packages Tablelist and Tablelist_tile are implemented in the
"tablelist" namespace, you must either import the procedures you need,
or use qualified names like "tablelist::tablelist".

For a detailed description of the commands and variables provided by
Tablelist and of the examples contained in the "demos" directory, see
the tutorial "tablelist.html" and the reference pages, all located in
the "doc" directory.
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<










































































































































































































































































































































Deleted scriptlibs/tablelist5.13/demos/browse.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
#==============================================================================
# Demonstrates how to use a tablelist widget for displaying information about
# the children of an arbitrary widget.
#
# Copyright (c) 2000-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

package require tablelist 5.13

namespace eval demo {
    variable dir [file dirname [info script]]

    #
    # Create two images, needed in the procedure putChildren
    #
    variable leafImg [image create bitmap -file [file join $dir leaf.xbm] \
		      -background coral -foreground gray50]
    variable compImg [image create bitmap -file [file join $dir comp.xbm] \
		      -background yellow -foreground gray50]
}

source [file join $demo::dir config.tcl]

#------------------------------------------------------------------------------
# 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
# tablelist widget.
#------------------------------------------------------------------------------
proc demo::displayChildren w {
    if {![winfo exists $w]} {
	bell
	tk_messageBox -title "Error" -icon error -message \
	    "Bad window path name \"$w\""
	return ""
    }

    #
    # Create a top-level widget of the class DemoTop
    #
    set top .browseTop
    for {set n 2} {[winfo exists $top]} {incr n} {
	set top .browseTop$n
    }
    toplevel $top -class DemoTop

    #
    # Create a vertically scrolled tablelist widget with 9 dynamic-width
    # columns and interactive sort capability within the top-level
    #
    set tf $top.tf
    frame $tf
    set tbl $tf.tbl
    set vsb $tf.vsb
    tablelist::tablelist $tbl \
	-columns {0 "Path Name"	left
		  0 "Class"	left
		  0 "X"		right
		  0 "Y"		right
		  0 "Width"	right
		  0 "Height"	right
		  0 "Mapped"	center
		  0 "Viewable"	center
		  0 "Manager"	left} \
	-labelcommand demo::labelCmd -yscrollcommand [list $vsb set] -width 0
    if {[$tbl cget -selectborderwidth] == 0} {
	$tbl configure -spacing 1
    }
    foreach col {2 3 4 5} {
	$tbl columnconfigure $col -sortmode integer
    }
    foreach col {6 7} {
	$tbl columnconfigure $col -formatcommand demo::formatBoolean
    }
    scrollbar $vsb -orient vertical -command [list $tbl yview]

    #
    # When displaying the information about the children of any
    # ancestor of the label widgets, the widths of some of the
    # labels and thus also the widths and x coordinates of some
    # children may change.  For this reason, make sure the items
    # will be updated after any change in the sizes of the labels
    #
    foreach l [$tbl labels] {
	bind $l <Configure> [list demo::updateItemsDelayed $tbl]
    }
    bind $tbl <Configure> [list demo::updateItemsDelayed $tbl]

    #
    # Create a pop-up menu with two command entries; bind the script
    # associated with its first entry to the <Double-1> event, too
    #
    set menu $top.menu
    menu $menu -tearoff no
    $menu add command -label "Display Children" \
		      -command [list demo::putChildrenOfSelWidget $tbl]
    $menu add command -label "Display Config" \
		      -command [list demo::dispConfigOfSelWidget $tbl]
    set bodyTag [$tbl bodytag]
    bind $bodyTag <Double-1>   [list demo::putChildrenOfSelWidget $tbl]
    bind $bodyTag <<Button3>>  [bind TablelistBody <Button-1>]
    bind $bodyTag <<Button3>> +[bind TablelistBody <ButtonRelease-1>]
    bind $bodyTag <<Button3>> +[list demo::postPopupMenu $top %X %Y]

    #
    # Create three buttons within a frame child of the top-level widget
    #
    set bf $top.bf
    frame $bf
    set b1 $bf.b1
    set b2 $bf.b2
    set b3 $bf.b3
    button $b1 -text "Refresh"
    button $b2 -text "Parent"
    button $b3 -text "Close" -command [list destroy $top]

    #
    # Manage the widgets
    #
    grid $tbl -row 0 -rowspan 2 -column 0 -sticky news
    variable winSys
    if {[string compare $winSys "aqua"] == 0} {
	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
    pack $b1 $b2 $b3 -side left -expand yes -pady 10
    pack $bf -side bottom -fill x
    pack $tf -side top -expand yes -fill both

    #
    # Populate the tablelist with the data of the given widget's children
    #
    putChildren $w $tbl
    return $tbl
}

#------------------------------------------------------------------------------
# demo::putChildren
#
# Outputs the data of the children of the widget w into the tablelist widget
# tbl.
#------------------------------------------------------------------------------
proc demo::putChildren {w tbl} {
    #
    # The following check is necessary because this procedure
    # is also invoked by the "Refresh" and "Parent" buttons
    #
    if {![winfo exists $w]} {
	bell
	set choice [tk_messageBox -title "Error" -icon warning \
		    -message "Bad window path name \"$w\" -- replacing\
			      it with nearest existent ancestor" \
		    -type okcancel -default ok -parent [winfo toplevel $tbl]]
	if {[string compare $choice "ok"] == 0} {
	    while {![winfo exists $w]} {
		set last [string last "." $w]
		if {$last != 0} {
		    incr last -1
		}
		set w [string range $w 0 $last]
	    }
	} else {
	    return ""
	}
    }

    set top [winfo toplevel $tbl]
    wm title $top "Children of the [winfo class $w] Widget \"$w\""

    $tbl resetsortinfo
    $tbl delete 0 end

    #
    # Display the data of the children of the
    # widget w in the tablelist widget tbl
    #
    variable leafImg
    variable compImg
    foreach c [winfo children $w] {
	#
	# Insert the data of the current child into the tablelist widget
	#
	set item {}
	lappend item $c [winfo class $c] [winfo x $c] [winfo y $c] \
		     [winfo width $c] [winfo height $c] [winfo ismapped $c] \
		     [winfo viewable $c] [winfo manager $c]
	$tbl insert end $item

	#
	# Insert an image into the first cell of the row
	#
	if {[llength [winfo children $c]] == 0} {
	    $tbl cellconfigure end,0 -image $leafImg
	} else {
	    $tbl cellconfigure end,0 -image $compImg
	}
    }

    #
    # Configure the "Refresh" and "Parent" buttons
    #
    $top.bf.b1 configure -command [list demo::putChildren $w $tbl]
    set b2 $top.bf.b2
    set p [winfo parent $w]
    if {[string compare $p ""] == 0} {
	$b2 configure -state disabled
    } else {
	$b2 configure -state normal -command [list demo::putChildren $p $tbl]
    }
}

#------------------------------------------------------------------------------
# demo::formatBoolean
#
# Returns "yes" or "no", according to the specified boolean value.
#------------------------------------------------------------------------------
proc demo::formatBoolean val {
    return [expr {$val ? "yes" : "no"}]
}

#------------------------------------------------------------------------------
# demo::labelCmd
#
# Sorts the contents 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).
#------------------------------------------------------------------------------
proc demo::labelCmd {tbl col} {
    tablelist::sortByColumn $tbl $col
    updateItemsDelayed $tbl
}

#------------------------------------------------------------------------------
# demo::updateItemsDelayed
#
# Arranges for the items of the tablelist widget tbl to be updated 500 ms later.
#------------------------------------------------------------------------------
proc demo::updateItemsDelayed tbl {
    #
    # Schedule the demo::updateItems command for execution
    # 500 ms later, but only if it is not yet pending
    #
    if {[string compare [$tbl attrib afterId] ""] == 0} {
	$tbl attrib afterId [after 500 [list demo::updateItems $tbl]]
    }
}

#------------------------------------------------------------------------------
# demo::updateItems
#
# Updates the items of the tablelist widget tbl.
#------------------------------------------------------------------------------
proc demo::updateItems tbl {
    #
    # Reset the tablelist's "afterId" attribute
    #
    $tbl attrib afterId ""

    #
    # Update the items
    #
    set rowCount [$tbl size]
    for {set row 0} {$row < $rowCount} {incr row} {
	set c [$tbl cellcget $row,0 -text]
	if {![winfo exists $c]} {
	    continue
	}

	set item {}
	lappend item $c [winfo class $c] [winfo x $c] [winfo y $c] \
		     [winfo width $c] [winfo height $c] [winfo ismapped $c] \
		     [winfo viewable $c] [winfo manager $c]
	$tbl rowconfigure $row -text $item
    }

    #
    # Repeat the last sort operation (if any)
    #
    $tbl refreshsorting
}

#------------------------------------------------------------------------------
# demo::putChildrenOfSelWidget
#
# Outputs the data of the children of the selected widget into the tablelist
# widget tbl.
#------------------------------------------------------------------------------
proc demo::putChildrenOfSelWidget tbl {
    set w [$tbl cellcget [$tbl curselection],0 -text]
    if {![winfo exists $w]} {
	bell
	tk_messageBox -title "Error" -icon error -message \
	    "Bad window path name \"$w\"" -parent [winfo toplevel $tbl]
	return ""
    }

    if {[llength [winfo children $w]] == 0} {
	bell
    } else {
	putChildren $w $tbl
    }
}

#------------------------------------------------------------------------------
# demo::dispConfigOfSelWidget
#
# Displays the configuration options of the selected widget within the
# tablelist tbl in a tablelist widget contained in a newly created top-level
# widget.
#------------------------------------------------------------------------------
proc demo::dispConfigOfSelWidget tbl {
    demo::displayConfig [$tbl cellcget [$tbl curselection],0 -text]
}

#------------------------------------------------------------------------------
# demo::postPopupMenu
#
# Posts the pop-up menu $top.menu at the given screen position.  Before posting
# the menu, the procedure enables/disables its first entry, depending upon
# whether the selected widget has children or not.
#------------------------------------------------------------------------------
proc demo::postPopupMenu {top rootX rootY} {
    set tbl $top.tf.tbl
    set w [$tbl cellcget [$tbl curselection],0 -text]
    if {![winfo exists $w]} {
	bell
	tk_messageBox -title "Error" -icon error -message \
	    "Bad window path name \"$w\"" -parent $top
	return ""
    }

    set menu $top.menu
    if {[llength [winfo children $w]] == 0} {
	$menu entryconfigure 0 -state disabled
    } else {
	$menu entryconfigure 0 -state normal
    }

    tk_popup $menu $rootX $rootY
}

#------------------------------------------------------------------------------

if {$tcl_interactive} {
    return "\nTo display information about the children of an arbitrary\
	    widget, enter\n\n\tdemo::displayChildren <widgetName>\n"
} else {
    wm withdraw .
    tk_messageBox -title $argv0 -icon warning -message \
	"Please source this script into\nan interactive wish session"
    exit 1
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<










































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/demos/browseTree.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
#==============================================================================
# Demonstrates how to use a tablelist widget for displaying information about
# the children of an arbitrary widget.
#
# Copyright (c) 2010-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

package require Tk 8.3
package require tablelist 5.13

namespace eval demo {
    variable dir [file dirname [info script]]

    #
    # Create two images, needed in the procedure putChildren
    #
    variable leafImg [image create bitmap -file [file join $dir leaf.xbm] \
		      -background coral -foreground gray50]
    variable compImg [image create bitmap -file [file join $dir comp.xbm] \
		      -background yellow -foreground gray50]
}

source [file join $demo::dir config.tcl]

#------------------------------------------------------------------------------
# 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
# tablelist widget.
#------------------------------------------------------------------------------
proc demo::displayChildren w {
    if {![winfo exists $w]} {
	bell
	tk_messageBox -title "Error" -icon error -message \
	    "Bad window path name \"$w\""
	return ""
    }

    #
    # Create a top-level widget of the class DemoTop
    #
    set top .browseTop
    for {set n 2} {[winfo exists $top]} {incr n} {
	set top .browseTop$n
    }
    toplevel $top -class DemoTop

    #
    # Create a vertically scrolled tablelist widget with 9 dynamic-width
    # columns and interactive sort capability within the top-level
    #
    set tf $top.tf
    frame $tf
    set tbl $tf.tbl
    set vsb $tf.vsb
    tablelist::tablelist $tbl \
	-columns {0 "Path Name"	left
		  0 "Class"	left
		  0 "X"		right
		  0 "Y"		right
		  0 "Width"	right
		  0 "Height"	right
		  0 "Mapped"	center
		  0 "Viewable"	center
		  0 "Manager"	left} \
	-expandcommand demo::expandCmd -labelcommand demo::labelCmd \
	-yscrollcommand [list $vsb set] -setgrid no -width 0
    if {[$tbl cget -selectborderwidth] == 0} {
	$tbl configure -spacing 1
    }
    foreach col {2 3 4 5} {
	$tbl columnconfigure $col -sortmode integer
    }
    foreach col {6 7} {
	$tbl columnconfigure $col -formatcommand demo::formatBoolean
    }
    scrollbar $vsb -orient vertical -command [list $tbl yview]

    #
    # When displaying the information about the children of any
    # ancestor of the label widgets, the widths of some of the
    # labels and thus also the widths and x coordinates of some
    # children may change.  For this reason, make sure the items
    # will be updated after any change in the sizes of the labels
    #
    foreach l [$tbl labels] {
	bind $l <Configure> [list demo::updateItemsDelayed $tbl]
    }
    bind $tbl <Configure> [list demo::updateItemsDelayed $tbl]

    #
    # Create a pop-up menu with two command entries; bind the script
    # associated with its first entry to the <Double-1> event, too
    #
    set menu $top.menu
    menu $menu -tearoff no
    $menu add command -label "Display Children" \
		      -command [list demo::putChildrenOfSelWidget $tbl]
    $menu add command -label "Display Config" \
		      -command [list demo::dispConfigOfSelWidget $tbl]
    set bodyTag [$tbl bodytag]
    bind $bodyTag <Double-1>   [list demo::putChildrenOfSelWidget $tbl]
    bind $bodyTag <<Button3>>  [bind TablelistBody <Button-1>]
    bind $bodyTag <<Button3>> +[bind TablelistBody <ButtonRelease-1>]
    bind $bodyTag <<Button3>> +[list demo::postPopupMenu $top %X %Y]

    #
    # Create three buttons within a frame child of the top-level widget
    #
    set bf $top.bf
    frame $bf
    set b1 $bf.b1
    set b2 $bf.b2
    set b3 $bf.b3
    button $b1 -text "Refresh"
    button $b2 -text "Parent"
    button $b3 -text "Close" -command [list destroy $top]

    #
    # Manage the widgets
    #
    grid $tbl -row 0 -rowspan 2 -column 0 -sticky news
    variable winSys
    if {[string compare $winSys "aqua"] == 0} {
	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
    pack $b1 $b2 $b3 -side left -expand yes -pady 10
    pack $bf -side bottom -fill x
    pack $tf -side top -expand yes -fill both

    #
    # Populate the tablelist with the data of the given widget's children
    #
    putChildren $w $tbl root
    return $tbl
}

#------------------------------------------------------------------------------
# demo::putChildren
#
# Outputs the data of the children of the widget w into the tablelist widget
# tbl, as child items of the one identified by nodeIdx.
#------------------------------------------------------------------------------
proc demo::putChildren {w tbl nodeIdx} {
    #
    # The following check is necessary because this procedure
    # is also invoked by the "Refresh" and "Parent" buttons
    #
    if {![winfo exists $w]} {
	bell
	if {[string compare $nodeIdx "root"] == 0} {
	    set choice [tk_messageBox -title "Error" -icon warning \
			-message "Bad window path name \"$w\" -- replacing\
				  it with nearest existent ancestor" \
			-type okcancel -default ok \
			-parent [winfo toplevel $tbl]]
	    if {[string compare $choice "ok"] == 0} {
		while {![winfo exists $w]} {
		    set last [string last "." $w]
		    if {$last != 0} {
			incr last -1
		    }
		    set w [string range $w 0 $last]
		}
	    } else {
		return ""
	    }
	} else {
	    return ""
	}
    }

    if {[string compare $nodeIdx "root"] == 0} {
	set top [winfo toplevel $tbl]
	wm title $top "Children of the [winfo class $w] Widget \"$w\""

	$tbl resetsortinfo
	$tbl delete 0 end
	set row 0
    } else {
	set row [expr {$nodeIdx + 1}]
    }

    #
    # Display the data of the children of the
    # widget w in the tablelist widget tbl
    #
    variable leafImg
    variable compImg
    foreach c [winfo children $w] {
	#
	# Insert the data of the current child into the tablelist widget
	#
	set item {}
	lappend item \
		[winfo name $c] [winfo class $c] [winfo x $c] [winfo y $c] \
		[winfo width $c] [winfo height $c] [winfo ismapped $c] \
		[winfo viewable $c] [winfo manager $c]
	$tbl insertchild $nodeIdx end $item

	#
	# Insert an image into the first cell of the row; mark the
	# row as collapsed if the child widget has children itself
	#
	if {[llength [winfo children $c]] == 0} {
	    $tbl cellconfigure $row,0 -image $leafImg
	} else {
	    $tbl cellconfigure $row,0 -image $compImg
	    $tbl collapse $row
	}

	$tbl rowattrib $row pathName $c
	incr row
    }

    if {[string compare $nodeIdx "root"] == 0} {
	#
	# Configure the "Refresh" and "Parent" buttons
	#
	$top.bf.b1 configure -command [list demo::refreshView $w $tbl]
	set b2 $top.bf.b2
	set p [winfo parent $w]
	if {[string compare $p ""] == 0} {
	    $b2 configure -state disabled
	} else {
	    $b2 configure -state normal -command \
		[list demo::putChildren $p $tbl root]
	}
    }
}

#------------------------------------------------------------------------------
# demo::expandCmd
#
# Outputs the data of the children of the widget 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.
#------------------------------------------------------------------------------
proc demo::expandCmd {tbl row} {
    if {[$tbl childcount $row] == 0} {
	set w [$tbl rowattrib $row pathName]
	putChildren $w $tbl $row

	#
	# Apply the last sorting (if any) to the new items
	#
	$tbl refreshsorting $row
    }
}

#------------------------------------------------------------------------------
# demo::formatBoolean
#
# Returns "yes" or "no", according to the specified boolean value.
#------------------------------------------------------------------------------
proc demo::formatBoolean val {
    return [expr {$val ? "yes" : "no"}]
}

#------------------------------------------------------------------------------
# demo::labelCmd
#
# Sorts the contents 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).
#------------------------------------------------------------------------------
proc demo::labelCmd {tbl col} {
    tablelist::sortByColumn $tbl $col
    updateItemsDelayed $tbl
}

#------------------------------------------------------------------------------
# demo::updateItemsDelayed
#
# Arranges for the items of the tablelist widget tbl to be updated 500 ms later.
#------------------------------------------------------------------------------
proc demo::updateItemsDelayed tbl {
    #
    # Schedule the demo::updateItems command for execution
    # 500 ms later, but only if it is not yet pending
    #
    if {[string compare [$tbl attrib afterId] ""] == 0} {
	$tbl attrib afterId [after 500 [list demo::updateItems $tbl]]
    }
}

#------------------------------------------------------------------------------
# demo::updateItems
#
# Updates the items of the tablelist widget tbl.
#------------------------------------------------------------------------------
proc demo::updateItems tbl {
    #
    # Reset the tablelist's "afterId" attribute
    #
    $tbl attrib afterId ""

    #
    # Update the items
    #
    set rowCount [$tbl size]
    for {set row 0} {$row < $rowCount} {incr row} {
	set c [$tbl rowattrib $row pathName]
	if {![winfo exists $c]} {
	    continue
	}

	set item {}
	lappend item \
		[winfo name $c] [winfo class $c] [winfo x $c] [winfo y $c] \
		[winfo width $c] [winfo height $c] [winfo ismapped $c] \
		[winfo viewable $c] [winfo manager $c]
	$tbl rowconfigure $row -text $item
    }

    #
    # Repeat the last sort operation (if any)
    #
    $tbl refreshsorting
}

#------------------------------------------------------------------------------
# demo::putChildrenOfSelWidget
#
# Outputs the data of the children of the selected widget into the tablelist
# widget tbl.
#------------------------------------------------------------------------------
proc demo::putChildrenOfSelWidget tbl {
    set w [$tbl rowattrib [$tbl curselection] pathName]
    if {![winfo exists $w]} {
	bell
	tk_messageBox -title "Error" -icon error -message \
	    "Bad window path name \"$w\"" -parent [winfo toplevel $tbl]
	return ""
    }

    if {[llength [winfo children $w]] == 0} {
	bell
    } else {
	putChildren $w $tbl root
    }
}

#------------------------------------------------------------------------------
# demo::dispConfigOfSelWidget
#
# Displays the configuration options of the selected widget within the
# tablelist tbl in a tablelist widget contained in a newly created top-level
# widget.
#------------------------------------------------------------------------------
proc demo::dispConfigOfSelWidget tbl {
    demo::displayConfig [$tbl rowattrib [$tbl curselection] pathName]
}

#------------------------------------------------------------------------------
# demo::postPopupMenu
#
# Posts the pop-up menu $top.menu at the given screen position.  Before posting
# the menu, the procedure enables/disables its first entry, depending upon
# whether the selected widget has children or not.
#------------------------------------------------------------------------------
proc demo::postPopupMenu {top rootX rootY} {
    set tbl $top.tf.tbl
    set w [$tbl rowattrib [$tbl curselection] pathName]
    if {![winfo exists $w]} {
	bell
	tk_messageBox -title "Error" -icon error -message \
	    "Bad window path name \"$w\"" -parent $top
	return ""
    }

    set menu $top.menu
    if {[llength [winfo children $w]] == 0} {
	$menu entryconfigure 0 -state disabled
    } else {
	$menu entryconfigure 0 -state normal
    }

    tk_popup $menu $rootX $rootY
}

#------------------------------------------------------------------------------
# demo::refreshView
#
# Redisplays the data of the children of the widget w in the tablelist widget
# tbl and restores the expanded states of the items as well as the vertical
# view.
#------------------------------------------------------------------------------
proc demo::refreshView {w tbl} {
    #
    # Save the vertical view and get the path names of
    # the child widgets displayed in the expanded rows
    #
    set yView [$tbl yview]
    foreach key [$tbl expandedkeys] {
	set pathName [$tbl rowattrib $key pathName]
	set expandedWidgets($pathName) 1
    }

    #
    # Redisplay the data of the widget's (possibly changed) children and
    # restore the expanded states of the children, along with the vertical view
    #
    putChildren $w $tbl root
    restoreExpandedStates $tbl root expandedWidgets
    $tbl yview moveto [lindex $yView 0]
}

#------------------------------------------------------------------------------
# demo::restoreExpandedStates
#   
# Expands those children of the parent identified by nodeIdx that display the
# data of child widgets whose path names are the names of the elements of the
# array specified by the last argument.
#------------------------------------------------------------------------------
proc demo::restoreExpandedStates {tbl nodeIdx expandedWidgetsName} {
    upvar $expandedWidgetsName expandedWidgets

    foreach key [$tbl childkeys $nodeIdx] {
	set pathName [$tbl rowattrib $key pathName]
	if {[info exists expandedWidgets($pathName)]} {
	    $tbl expand $key -partly
	    restoreExpandedStates $tbl $key expandedWidgets
	}
    }
}

#------------------------------------------------------------------------------

if {$tcl_interactive} {
    return "\nTo display information about the children of an arbitrary\
	    widget, enter\n\n\tdemo::displayChildren <widgetName>\n"
} else {
    wm withdraw .
    tk_messageBox -title $argv0 -icon warning -message \
	"Please source this script into\nan interactive wish session"
    exit 1
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
























































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/demos/browseTree_tile.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
#==============================================================================
# Demonstrates how to use a tablelist widget for displaying information about
# the children of an arbitrary widget.
#
# Copyright (c) 2010-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

package require tablelist_tile 5.13

namespace eval demo {
    variable dir [file dirname [info script]]

    #
    # Create two images, needed in the procedure putChildren
    #
    variable leafImg [image create bitmap -file [file join $dir leaf.xbm] \
		      -background coral -foreground gray50]
    variable compImg [image create bitmap -file [file join $dir comp.xbm] \
		      -background yellow -foreground gray50]
}

source [file join $demo::dir config_tile.tcl]

#
# Work around the improper appearance of the tile scrollbars in the aqua theme
#
if {[tablelist::getCurrentTheme] eq "aqua"} {
    interp alias {} ttk::scrollbar {} ::scrollbar
}

#------------------------------------------------------------------------------
# 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
# tablelist widget.
#------------------------------------------------------------------------------
proc demo::displayChildren w {
    if {![winfo exists $w]} {
	bell
	tk_messageBox -title "Error" -icon error -message \
	    "Bad window path name \"$w\""
	return ""
    }

    #
    # Create a top-level widget of the class DemoTop
    #
    set top .browseTop
    for {set n 2} {[winfo exists $top]} {incr n} {
	set top .browseTop$n
    }
    toplevel $top -class DemoTop

    #
    # Create a vertically scrolled tablelist widget with 9 dynamic-width
    # columns and interactive sort capability within the top-level
    #
    set tf $top.tf
    ttk::frame $tf
    set tbl $tf.tbl
    set vsb $tf.vsb
    tablelist::tablelist $tbl \
	-columns {0 "Path Name"	left
		  0 "Class"	left
		  0 "X"		right
		  0 "Y"		right
		  0 "Width"	right
		  0 "Height"	right
		  0 "Mapped"	center
		  0 "Viewable"	center
		  0 "Manager"	left} \
	-expandcommand demo::expandCmd -labelcommand demo::labelCmd \
	-yscrollcommand [list $vsb set] -setgrid no -width 0
    if {[$tbl cget -selectborderwidth] == 0} {
	$tbl configure -spacing 1
    }
    foreach col {2 3 4 5} {
	$tbl columnconfigure $col -sortmode integer
    }
    foreach col {6 7} {
	$tbl columnconfigure $col -formatcommand demo::formatBoolean
    }
    ttk::scrollbar $vsb -orient vertical -command [list $tbl yview]

    #
    # When displaying the information about the children of any
    # ancestor of the label widgets, the widths of some of the
    # labels and thus also the widths and x coordinates of some
    # children may change.  For this reason, make sure the items
    # will be updated after any change in the sizes of the labels
    #
    foreach l [$tbl labels] {
	bind $l <Configure> [list demo::updateItemsDelayed $tbl]
    }
    bind $tbl <Configure> [list demo::updateItemsDelayed $tbl]

    #
    # Create a pop-up menu with two command entries; bind the script
    # associated with its first entry to the <Double-1> event, too
    #
    set menu $top.menu
    menu $menu -tearoff no
    $menu add command -label "Display Children" \
		      -command [list demo::putChildrenOfSelWidget $tbl]
    $menu add command -label "Display Config" \
		      -command [list demo::dispConfigOfSelWidget $tbl]
    set bodyTag [$tbl bodytag]
    bind $bodyTag <Double-1>   [list demo::putChildrenOfSelWidget $tbl]
    bind $bodyTag <<Button3>>  [bind TablelistBody <Button-1>]
    bind $bodyTag <<Button3>> +[bind TablelistBody <ButtonRelease-1>]
    bind $bodyTag <<Button3>> +[list demo::postPopupMenu $top %X %Y]

    #
    # Create three buttons within a tile frame child of the top-level widget
    #
    set bf $top.bf
    ttk::frame $bf
    set b1 $bf.b1
    set b2 $bf.b2
    set b3 $bf.b3
    ttk::button $b1 -text "Refresh"
    ttk::button $b2 -text "Parent"
    ttk::button $b3 -text "Close" -command [list destroy $top]

    #
    # Manage the widgets
    #
    grid $tbl -row 0 -rowspan 2 -column 0 -sticky news
    if {[tablelist::getCurrentTheme] eq "aqua"} {
	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
    pack $b1 $b2 $b3 -side left -expand yes -pady 10
    pack $bf -side bottom -fill x
    pack $tf -side top -expand yes -fill both

    #
    # Populate the tablelist with the data of the given widget's children
    #
    putChildren $w $tbl root
    return $tbl
}

#------------------------------------------------------------------------------
# demo::putChildren
#
# Outputs the data of the children of the widget w into the tablelist widget
# tbl, as child items of the one identified by nodeIdx.
#------------------------------------------------------------------------------
proc demo::putChildren {w tbl nodeIdx} {
    #
    # The following check is necessary because this procedure
    # is also invoked by the "Refresh" and "Parent" buttons
    #
    if {![winfo exists $w]} {
	bell
	if {[string compare $nodeIdx "root"] == 0} {
	    set choice [tk_messageBox -title "Error" -icon warning \
			-message "Bad window path name \"$w\" -- replacing\
				  it with nearest existent ancestor" \
			-type okcancel -default ok \
			-parent [winfo toplevel $tbl]]
	    if {[string compare $choice "ok"] == 0} {
		while {![winfo exists $w]} {
		    set last [string last "." $w]
		    if {$last != 0} {
			incr last -1
		    }
		    set w [string range $w 0 $last]
		}
	    } else {
		return ""
	    }
	} else {
	    return ""
	}
    }

    if {[string compare $nodeIdx "root"] == 0} {
	set top [winfo toplevel $tbl]
	wm title $top "Children of the [winfo class $w] Widget \"$w\""

	$tbl resetsortinfo
	$tbl delete 0 end
	set row 0
    } else {
	set row [expr {$nodeIdx + 1}]
    }

    #
    # Display the data of the children of the
    # widget w in the tablelist widget tbl
    #
    variable leafImg
    variable compImg
    foreach c [winfo children $w] {
	#
	# Insert the data of the current child into the tablelist widget
	#
	set item {}
	lappend item \
		[winfo name $c] [winfo class $c] [winfo x $c] [winfo y $c] \
		[winfo width $c] [winfo height $c] [winfo ismapped $c] \
		[winfo viewable $c] [winfo manager $c]
	$tbl insertchild $nodeIdx end $item

	#
	# Insert an image into the first cell of the row; mark the
	# row as collapsed if the child widget has children itself
	#
	if {[llength [winfo children $c]] == 0} {
	    $tbl cellconfigure $row,0 -image $leafImg
	} else {
	    $tbl cellconfigure $row,0 -image $compImg
	    $tbl collapse $row
	}

	$tbl rowattrib $row pathName $c
	incr row
    }

    if {[string compare $nodeIdx "root"] == 0} {
	#
	# Configure the "Refresh" and "Parent" buttons
	#
	$top.bf.b1 configure -command [list demo::refreshView $w $tbl]
	set b2 $top.bf.b2
	set p [winfo parent $w]
	if {[string compare $p ""] == 0} {
	    $b2 configure -state disabled
	} else {
	    $b2 configure -state normal -command \
		[list demo::putChildren $p $tbl root]
	}
    }
}

#------------------------------------------------------------------------------
# demo::expandCmd
#
# Outputs the data of the children of the widget 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.
#------------------------------------------------------------------------------
proc demo::expandCmd {tbl row} {
    if {[$tbl childcount $row] == 0} {
	set w [$tbl rowattrib $row pathName]
	putChildren $w $tbl $row

	#
	# Apply the last sorting (if any) to the new items
	#
	$tbl refreshsorting $row
    }
}

#------------------------------------------------------------------------------
# demo::formatBoolean
#
# Returns "yes" or "no", according to the specified boolean value.
#------------------------------------------------------------------------------
proc demo::formatBoolean val {
    return [expr {$val ? "yes" : "no"}]
}

#------------------------------------------------------------------------------
# demo::labelCmd
#
# Sorts the contents 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).
#------------------------------------------------------------------------------
proc demo::labelCmd {tbl col} {
    tablelist::sortByColumn $tbl $col
    updateItemsDelayed $tbl
}

#------------------------------------------------------------------------------
# demo::updateItemsDelayed
#
# Arranges for the items of the tablelist widget tbl to be updated 500 ms later.
#------------------------------------------------------------------------------
proc demo::updateItemsDelayed tbl {
    #
    # Schedule the demo::updateItems command for execution
    # 500 ms later, but only if it is not yet pending
    #
    if {[string compare [$tbl attrib afterId] ""] == 0} {
	$tbl attrib afterId [after 500 [list demo::updateItems $tbl]]
    }
}

#------------------------------------------------------------------------------
# demo::updateItems
#
# Updates the items of the tablelist widget tbl.
#------------------------------------------------------------------------------
proc demo::updateItems tbl {
    #
    # Reset the tablelist's "afterId" attribute
    #
    $tbl attrib afterId ""

    #
    # Update the items
    #
    set rowCount [$tbl size]
    for {set row 0} {$row < $rowCount} {incr row} {
	set c [$tbl rowattrib $row pathName]
	if {![winfo exists $c]} {
	    continue
	}

	set item {}
	lappend item \
		[winfo name $c] [winfo class $c] [winfo x $c] [winfo y $c] \
		[winfo width $c] [winfo height $c] [winfo ismapped $c] \
		[winfo viewable $c] [winfo manager $c]
	$tbl rowconfigure $row -text $item
    }

    #
    # Repeat the last sort operation (if any)
    #
    $tbl refreshsorting
}

#------------------------------------------------------------------------------
# demo::putChildrenOfSelWidget
#
# Outputs the data of the children of the selected widget into the tablelist
# widget tbl.
#------------------------------------------------------------------------------
proc demo::putChildrenOfSelWidget tbl {
    set w [$tbl rowattrib [$tbl curselection] pathName]
    if {![winfo exists $w]} {
	bell
	tk_messageBox -title "Error" -icon error -message \
	    "Bad window path name \"$w\"" -parent [winfo toplevel $tbl]
	return ""
    }

    if {[llength [winfo children $w]] == 0} {
	bell
    } else {
	putChildren $w $tbl root
    }
}

#------------------------------------------------------------------------------
# demo::dispConfigOfSelWidget
#
# Displays the configuration options of the selected widget within the
# tablelist tbl in a tablelist widget contained in a newly created top-level
# widget.
#------------------------------------------------------------------------------
proc demo::dispConfigOfSelWidget tbl {
    demo::displayConfig [$tbl rowattrib [$tbl curselection] pathName]
}

#------------------------------------------------------------------------------
# demo::postPopupMenu
#
# Posts the pop-up menu $top.menu at the given screen position.  Before posting
# the menu, the procedure enables/disables its first entry, depending upon
# whether the selected widget has children or not.
#------------------------------------------------------------------------------
proc demo::postPopupMenu {top rootX rootY} {
    set tbl $top.tf.tbl
    set w [$tbl rowattrib [$tbl curselection] pathName]
    if {![winfo exists $w]} {
	bell
	tk_messageBox -title "Error" -icon error -message \
	    "Bad window path name \"$w\"" -parent $top
	return ""
    }

    set menu $top.menu
    if {[llength [winfo children $w]] == 0} {
	$menu entryconfigure 0 -state disabled
    } else {
	$menu entryconfigure 0 -state normal
    }

    tk_popup $menu $rootX $rootY
}

#------------------------------------------------------------------------------
# demo::refreshView
#
# Redisplays the data of the children of the widget w in the tablelist widget
# tbl and restores the expanded states of the items as well as the vertical
# view.
#------------------------------------------------------------------------------
proc demo::refreshView {w tbl} {
    #
    # Save the vertical view and get the path names of
    # the child widgets displayed in the expanded rows
    #
    set yView [$tbl yview]
    foreach key [$tbl expandedkeys] {
	set pathName [$tbl rowattrib $key pathName]
	set expandedWidgets($pathName) 1
    }

    #
    # Redisplay the data of the widget's (possibly changed) children and
    # restore the expanded states of the children, along with the vertical view
    #
    putChildren $w $tbl root
    restoreExpandedStates $tbl root expandedWidgets
    $tbl yview moveto [lindex $yView 0]
}

#------------------------------------------------------------------------------
# demo::restoreExpandedStates
#   
# Expands those children of the parent identified by nodeIdx that display the
# data of child widgets whose path names are the names of the elements of the
# array specified by the last argument.
#------------------------------------------------------------------------------
proc demo::restoreExpandedStates {tbl nodeIdx expandedWidgetsName} {
    upvar $expandedWidgetsName expandedWidgets

    foreach key [$tbl childkeys $nodeIdx] {
	set pathName [$tbl rowattrib $key pathName]
	if {[info exists expandedWidgets($pathName)]} {
	    $tbl expand $key -partly
	    restoreExpandedStates $tbl $key expandedWidgets
	}
    }
}

#------------------------------------------------------------------------------

if {$tcl_interactive} {
    return "\nTo display information about the children of an arbitrary\
	    widget, enter\n\n\tdemo::displayChildren <widgetName>\n"
} else {
    wm withdraw .
    tk_messageBox -title $argv0 -icon warning -message \
	"Please source this script into\nan interactive wish session"
    exit 1
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/demos/browse_tile.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
#==============================================================================
# Demonstrates how to use a tablelist widget for displaying information about
# children of an arbitrary widget.
#
# Copyright (c) 2000-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

package require tablelist_tile 5.13

namespace eval demo {
    variable dir [file dirname [info script]]

    #
    # Create two images, needed in the procedure putChildren
    #
    variable leafImg [image create bitmap -file [file join $dir leaf.xbm] \
		      -background coral -foreground gray50]
    variable compImg [image create bitmap -file [file join $dir comp.xbm] \
		      -background yellow -foreground gray50]
}

source [file join $demo::dir config_tile.tcl]

#
# Work around the improper appearance of the tile scrollbars in the aqua theme
#
if {[tablelist::getCurrentTheme] eq "aqua"} {
    interp alias {} ttk::scrollbar {} ::scrollbar
}

#------------------------------------------------------------------------------
# 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
# tablelist widget.
#------------------------------------------------------------------------------
proc demo::displayChildren w {
    if {![winfo exists $w]} {
	bell
	tk_messageBox -title "Error" -icon error -message \
	    "Bad window path name \"$w\""
	return ""
    }

    #
    # Create a top-level widget of the class DemoTop
    #
    set top .browseTop
    for {set n 2} {[winfo exists $top]} {incr n} {
	set top .browseTop$n
    }
    toplevel $top -class DemoTop

    #
    # Create a vertically scrolled tablelist widget with 9 dynamic-width
    # columns and interactive sort capability within the top-level
    #
    set tf $top.tf
    ttk::frame $tf
    set tbl $tf.tbl
    set vsb $tf.vsb
    tablelist::tablelist $tbl \
	-columns {0 "Path Name"	left
		  0 "Class"	left
		  0 "X"		right
		  0 "Y"		right
		  0 "Width"	right
		  0 "Height"	right
		  0 "Mapped"	center
		  0 "Viewable"	center
		  0 "Manager"	left} \
	-labelcommand demo::labelCmd -yscrollcommand [list $vsb set] -width 0
    if {[$tbl cget -selectborderwidth] == 0} {
	$tbl configure -spacing 1
    }
    foreach col {2 3 4 5} {
	$tbl columnconfigure $col -sortmode integer
    }
    foreach col {6 7} {
	$tbl columnconfigure $col -formatcommand demo::formatBoolean
    }
    ttk::scrollbar $vsb -orient vertical -command [list $tbl yview]

    #
    # When displaying the information about the children of any
    # ancestor of the label widgets, the widths of some of the
    # labels and thus also the widths and x coordinates of some
    # children may change.  For this reason, make sure the items
    # will be updated after any change in the sizes of the labels
    #
    foreach l [$tbl labels] {
	bind $l <Configure> [list demo::updateItemsDelayed $tbl]
    }
    bind $tbl <Configure> [list demo::updateItemsDelayed $tbl]

    #
    # Create a pop-up menu with two command entries; bind the script
    # associated with its first entry to the <Double-1> event, too
    #
    set menu $top.menu
    menu $menu -tearoff no
    $menu add command -label "Display Children" \
		      -command [list demo::putChildrenOfSelWidget $tbl]
    $menu add command -label "Display Config" \
		      -command [list demo::dispConfigOfSelWidget $tbl]
    set bodyTag [$tbl bodytag]
    bind $bodyTag <Double-1>   [list demo::putChildrenOfSelWidget $tbl]
    bind $bodyTag <<Button3>>  [bind TablelistBody <Button-1>]
    bind $bodyTag <<Button3>> +[bind TablelistBody <ButtonRelease-1>]
    bind $bodyTag <<Button3>> +[list demo::postPopupMenu $top %X %Y]

    #
    # Create three buttons within a tile frame child of the top-level widget
    #
    set bf $top.bf
    ttk::frame $bf
    set b1 $bf.b1
    set b2 $bf.b2
    set b3 $bf.b3
    ttk::button $b1 -text "Refresh"
    ttk::button $b2 -text "Parent"
    ttk::button $b3 -text "Close" -command [list destroy $top]

    #
    # Manage the widgets
    #
    grid $tbl -row 0 -rowspan 2 -column 0 -sticky news
    if {[tablelist::getCurrentTheme] eq "aqua"} {
	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
    pack $b1 $b2 $b3 -side left -expand yes -pady 10
    pack $bf -side bottom -fill x
    pack $tf -side top -expand yes -fill both

    #
    # Populate the tablelist with the data of the given widget's children
    #
    putChildren $w $tbl
    return $tbl
}

#------------------------------------------------------------------------------
# demo::putChildren
#
# Outputs the data of the children of the widget w into the tablelist widget
# tbl.
#------------------------------------------------------------------------------
proc demo::putChildren {w tbl} {
    #
    # The following check is necessary because this procedure
    # is also invoked by the "Refresh" and "Parent" buttons
    #
    if {![winfo exists $w]} {
	bell
	set choice [tk_messageBox -title "Error" -icon warning \
		    -message "Bad window path name \"$w\" -- replacing\
			      it with nearest existent ancestor" \
		    -type okcancel -default ok -parent [winfo toplevel $tbl]]
	if {[string compare $choice "ok"] == 0} {
	    while {![winfo exists $w]} {
		set last [string last "." $w]
		if {$last != 0} {
		    incr last -1
		}
		set w [string range $w 0 $last]
	    }
	} else {
	    return ""
	}
    }

    set top [winfo toplevel $tbl]
    wm title $top "Children of the [winfo class $w] Widget \"$w\""

    $tbl resetsortinfo
    $tbl delete 0 end

    #
    # Display the data of the children of the
    # widget w in the tablelist widget tbl
    #
    variable leafImg
    variable compImg
    foreach c [winfo children $w] {
	#
	# Insert the data of the current child into the tablelist widget
	#
	set item {}
	lappend item $c [winfo class $c] [winfo x $c] [winfo y $c] \
		     [winfo width $c] [winfo height $c] [winfo ismapped $c] \
		     [winfo viewable $c] [winfo manager $c]
	$tbl insert end $item

	#
	# Insert an image into the first cell of the row
	#
	if {[llength [winfo children $c]] == 0} {
	    $tbl cellconfigure end,0 -image $leafImg
	} else {
	    $tbl cellconfigure end,0 -image $compImg
	}
    }

    #
    # Configure the "Refresh" and "Parent" buttons
    #
    $top.bf.b1 configure -command [list demo::putChildren $w $tbl]
    set b2 $top.bf.b2
    set p [winfo parent $w]
    if {[string compare $p ""] == 0} {
	$b2 configure -state disabled
    } else {
	$b2 configure -state normal -command [list demo::putChildren $p $tbl]
    }
}

#------------------------------------------------------------------------------
# demo::formatBoolean
#
# Returns "yes" or "no", according to the specified boolean value.
#------------------------------------------------------------------------------
proc demo::formatBoolean val {
    return [expr {$val ? "yes" : "no"}]
}

#------------------------------------------------------------------------------
# demo::labelCmd
#
# Sorts the contents 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).
#------------------------------------------------------------------------------
proc demo::labelCmd {tbl col} {
    tablelist::sortByColumn $tbl $col
    updateItemsDelayed $tbl
}

#------------------------------------------------------------------------------
# demo::updateItemsDelayed
#
# Arranges for the items of the tablelist widget tbl to be updated 500 ms later.
#------------------------------------------------------------------------------
proc demo::updateItemsDelayed tbl {
    #
    # Schedule the demo::updateItems command for execution
    # 500 ms later, but only if it is not yet pending
    #
    if {[string compare [$tbl attrib afterId] ""] == 0} {
	$tbl attrib afterId [after 500 [list demo::updateItems $tbl]]
    }
}

#------------------------------------------------------------------------------
# demo::updateItems
#
# Updates the items of the tablelist widget tbl.
#------------------------------------------------------------------------------
proc demo::updateItems tbl {
    #
    # Reset the tablelist's "afterId" attribute
    #
    $tbl attrib afterId ""

    #
    # Update the items
    #
    set rowCount [$tbl size]
    for {set row 0} {$row < $rowCount} {incr row} {
	set c [$tbl cellcget $row,0 -text]
	if {![winfo exists $c]} {
	    continue
	}

	set item {}
	lappend item $c [winfo class $c] [winfo x $c] [winfo y $c] \
		     [winfo width $c] [winfo height $c] [winfo ismapped $c] \
		     [winfo viewable $c] [winfo manager $c]
	$tbl rowconfigure $row -text $item
    }

    #
    # Repeat the last sort operation (if any)
    #
    $tbl refreshsorting
}

#------------------------------------------------------------------------------
# demo::putChildrenOfSelWidget
#
# Outputs the data of the children of the selected widget into the tablelist
# widget tbl.
#------------------------------------------------------------------------------
proc demo::putChildrenOfSelWidget tbl {
    set w [$tbl cellcget [$tbl curselection],0 -text]
    if {![winfo exists $w]} {
	bell
	tk_messageBox -title "Error" -icon error -message \
	    "Bad window path name \"$w\"" -parent [winfo toplevel $tbl]
	return ""
    }

    if {[llength [winfo children $w]] == 0} {
	bell
    } else {
	putChildren $w $tbl
    }
}

#------------------------------------------------------------------------------
# demo::dispConfigOfSelWidget
#
# Displays the configuration options of the selected widget within the
# tablelist tbl in a tablelist widget contained in a newly created top-level
# widget.
#------------------------------------------------------------------------------
proc demo::dispConfigOfSelWidget tbl {
    demo::displayConfig [$tbl cellcget [$tbl curselection],0 -text]
}

#------------------------------------------------------------------------------
# demo::postPopupMenu
#
# Posts the pop-up menu $top.menu at the given screen position.  Before posting
# the menu, the procedure enables/disables its first entry, depending upon
# whether the selected widget has children or not.
#------------------------------------------------------------------------------
proc demo::postPopupMenu {top rootX rootY} {
    set tbl $top.tf.tbl
    set w [$tbl cellcget [$tbl curselection],0 -text]
    if {![winfo exists $w]} {
	bell
	tk_messageBox -title "Error" -icon error -message \
	    "Bad window path name \"$w\"" -parent $top
	return ""
    }

    set menu $top.menu
    if {[llength [winfo children $w]] == 0} {
	$menu entryconfigure 0 -state disabled
    } else {
	$menu entryconfigure 0 -state normal
    }

    tk_popup $menu $rootX $rootY
}

#------------------------------------------------------------------------------

if {$tcl_interactive} {
    return "\nTo display information about the children of an arbitrary\
	    widget, enter\n\n\tdemo::displayChildren <widgetName>\n"
} else {
    wm withdraw .
    tk_messageBox -title $argv0 -icon warning -message \
	"Please source this script into\nan interactive wish session"
    exit 1
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






















































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/demos/bwidget.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
#!/usr/bin/env wish

#==============================================================================
# Demonstrates the interactive tablelist cell editing with the aid of some
# widgets from the BWidget package and of the Tk core checkbutton and
# menubutton widgets.
#
# Copyright (c) 2004-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

package require Tk 8.4				;# because of "-compound"
package require tablelist 5.13
package require BWidget

wm title . "Serial Line Configuration"

#
# Add some entries to the Tk option database
#
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

#
# Register some widgets from the BWidget package for interactive cell editing
#
tablelist::addBWidgetEntry
tablelist::addBWidgetSpinBox
tablelist::addBWidgetComboBox

#
# Create the images "checkedImg" and "uncheckedImg", as well as 16 images of
# names like "img#FF0000", displaying colors identified by names like "red"
#
source [file join $dir images.tcl]

#
# Create a tablelist widget with editable columns (except the first one)
#
set tbl .tbl
tablelist::tablelist $tbl \
    -columns {0 "No."		  right
	      0 "Available"	  center
	      0 "Name"		  left
	      0 "Baud Rate"	  right
	      0 "Data Bits"	  center
	      0 "Parity"	  left
	      0 "Stop Bits"	  center
	      0 "Handshake"	  left
	      0 "Activation Date" center
	      0 "Activation Time" center
	      0 "Cable Color"	  center} \
    -editstartcommand editStartCmd -editendcommand editEndCmd \
    -height 0 -width 0
if {[$tbl cget -selectborderwidth] == 0} {
    $tbl configure -spacing 1
}
$tbl columnconfigure 0 -sortmode integer
$tbl columnconfigure 1 -name available -editable yes -editwindow checkbutton \
    -formatcommand emptyStr
$tbl columnconfigure 2 -name lineName  -editable yes -editwindow Entry \
    -sortmode dictionary
$tbl columnconfigure 3 -name baudRate  -editable yes -editwindow ComboBox \
    -sortmode integer
$tbl columnconfigure 4 -name dataBits  -editable yes -editwindow SpinBox
$tbl columnconfigure 5 -name parity    -editable yes -editwindow ComboBox
$tbl columnconfigure 6 -name stopBits  -editable yes -editwindow ComboBox
$tbl columnconfigure 7 -name handshake -editable yes -editwindow ComboBox
$tbl columnconfigure 8 -name actDate   -editable yes -editwindow Entry \
    -formatcommand formatDate -sortmode integer
$tbl columnconfigure 9 -name actTime   -editable yes -editwindow Entry \
    -formatcommand formatTime -sortmode integer
$tbl columnconfigure 10 -name color    -editable yes -editwindow menubutton \
    -formatcommand emptyStr

proc emptyStr   val { return "" }
proc formatDate val { return [clock format $val -format "%Y-%m-%d"] }
proc formatTime val { return [clock format $val -format "%H:%M:%S"] }

#
# Populate the tablelist widget; set the activation
# date & time to 10 minutes past the current clock value
#
set clock [expr {[clock seconds] + 600}]
for {set i 0; set n 1} {$i < 16} {set i $n; incr n} {
    $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
    $tbl cellconfigure end,color -image img[lindex $colorValues $i]
}

set btn [button .btn -text "Close" -command exit]

#
# Manage the widgets
#
pack $btn -side bottom -pady 10
pack $tbl -side top -expand yes -fill both

#------------------------------------------------------------------------------
# editStartCmd
#
# Applies some configuration options to the edit window; if the latter is a
# ComboBox, the procedure populates it.
#------------------------------------------------------------------------------
proc editStartCmd {tbl row col text} {
    set w [$tbl editwinpath]

    switch [$tbl columncget $col -name] {
	lineName {
	    #
	    # Set an upper limit of 20 for the number of characters
	    #
	    $w configure -invalidcommand bell -validate key \
			 -validatecommand {expr {[string length %P] <= 20}}
	}

	baudRate {
	    #
	    # Populate the ComboBox and allow no more
	    # than 6 digits in its Entry component
	    #
	    $w configure -values {50 75 110 300 1200 2400 4800 9600 19200 38400
				  57600 115200 230400 460800 921600}
	    $w configure -invalidcommand bell -validate key -validatecommand \
		{expr {[string length %P] <= 6 && [regexp {^[0-9]*$} %S]}}
	}

	dataBits {
	    #
	    # Configure the SpinBox
	    #
	    $w configure -range {5 8 1} -editable no
	}

	parity {
	    #
	    # Populate the ComboBox and make it non-editable
	    #
	    $w configure -values {None Even Odd Mark Space} -editable no
	}

	stopBits {
	    #
	    # Populate the ComboBox and make it non-editable
	    #
	    $w configure -values {1 1.5 2} -editable no
	}

	handshake {
	    #
	    # Populate the ComboBox and make it non-editable
	    #
	    $w configure -values {XON/XOFF RTS/CTS None} -editable no
	}

	actDate {
	    #
	    # Set an upper limit of 10 for the number of characters
	    # and allow only digits and the "-" character in it
	    #
	    $w configure -invalidcommand bell -validate key -validatecommand \
		{expr {[string length %P] <= 10 && [regexp {^[0-9-]*$} %S]}}
	}

	actTime {
	    #
	    # Set an upper limit of 8 for the number of characters
	    # and allow only digits and the ":" character in it
	    #
	    $w configure -invalidcommand bell -validate key -validatecommand \
		{expr {[string length %P] <= 8 && [regexp {^[0-9:]*$} %S]}}
	}

	color {
	    #
	    # Populate the menu and make sure the menubutton will display the
	    # color name rather than $text, which is "", due to -formatcommand
	    #
	    set menu [$w cget -menu]
	    foreach name $::colorNames {
		$menu add radiobutton -compound left \
		    -image img$::colors($name) -label $name
	    }
	    $menu entryconfigure 8 -columnbreak 1
	    return [$tbl cellcget $row,$col -text]
	}
    }

    return $text
}

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

	baudRate {
	    #
	    # Check whether the baud rate is an integer in the range 50..921600
	    #
	    if {![regexp {^[0-9]+$} $text] || $text < 50 || $text > 921600} {
		bell
		tk_messageBox -title "Error" -icon error -message \
		    "The baud rate must be an integer in the range 50..921600"
		$tbl rejectinput
	    }
	}

	actDate {
	    #
	    # Get the activation date in seconds from the last argument 
	    #
	    if {[catch {clock scan $text} actDate] != 0} {
		bell
		tk_messageBox -title "Error" -icon error -message "Invalid date"
		$tbl rejectinput
		return ""
	    }

	    #
	    # Check whether the activation clock value is later than the
	    # current one; if this is the case then make sure the cells
	    # "actDate" and "actTime" will have the same internal value
	    #
	    set actTime [$tbl cellcget $row,actTime -text]
	    set actClock [clock scan [formatTime $actTime] -base $actDate]
	    if {$actClock <= [clock seconds]} {
		bell
		tk_messageBox -title "Error" -icon error -message \
		    "The activation date & time must be in the future"
		$tbl rejectinput
	    } else {
		$tbl cellconfigure $row,actTime -text $actClock
		return $actClock
	    }
	}

	actTime {
	    #
	    # Get the activation clock value in seconds from the last argument 
	    #
	    set actDate [$tbl cellcget $row,actDate -text]
	    if {[catch {clock scan $text -base $actDate} actClock] != 0} {
		bell
		tk_messageBox -title "Error" -icon error -message "Invalid time"
		$tbl rejectinput
		return ""
	    }

	    #
	    # Check whether the activation clock value is later than the
	    # current one; if this is the case then make sure the cells
	    # "actDate" and "actTime" will have the same internal value
	    #
	    if {$actClock <= [clock seconds]} {
		bell
		tk_messageBox -title "Error" -icon error -message \
		    "The activation date & time must be in the future"
		$tbl rejectinput
	    } else {
		$tbl cellconfigure $row,actDate -text $actClock
		return $actClock
	    }
	}

	color {
	    #
	    # Update the image contained in the cell
	    #
	    $tbl cellconfigure $row,$col -image img$::colors($text)
	}
    }

    return $text
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/demos/bwidget_tile.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
#!/usr/bin/env wish

#==============================================================================
# Demonstrates the interactive tablelist cell editing with the aid of some
# widgets from the BWidget package and of the Tk core checkbutton and
# menubutton widgets.
#
# Copyright (c) 2004-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

package require tablelist_tile 5.13
package require BWidget

wm title . "Serial Line Configuration"

#
# Add some entries to the Tk option database
#
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

#
# Register some widgets from the BWidget package for interactive cell editing
#
tablelist::addBWidgetEntry
tablelist::addBWidgetSpinBox
tablelist::addBWidgetComboBox

#
# Create the images "checkedImg" and "uncheckedImg", as well as 16 images of
# names like "img#FF0000", displaying colors identified by names like "red"
#
source [file join $dir images.tcl]

#
# Improve the window's appearance by using a tile
# frame as a container for the other widgets
#
set f [ttk::frame .f]

#
# Create a tablelist widget with editable columns (except the first one)
#
set tbl $f.tbl
tablelist::tablelist $tbl \
    -columns {0 "No."		  right
	      0 "Available"	  center
	      0 "Name"		  left
	      0 "Baud Rate"	  right
	      0 "Data Bits"	  center
	      0 "Parity"	  left
	      0 "Stop Bits"	  center
	      0 "Handshake"	  left
	      0 "Activation Date" center
	      0 "Activation Time" center
	      0 "Cable Color"	  center} \
    -editstartcommand editStartCmd -editendcommand editEndCmd \
    -height 0 -width 0
if {[$tbl cget -selectborderwidth] == 0} {
    $tbl configure -spacing 1
}
$tbl columnconfigure 0 -sortmode integer
$tbl columnconfigure 1 -name available -editable yes -editwindow checkbutton \
    -formatcommand emptyStr
$tbl columnconfigure 2 -name lineName  -editable yes -editwindow Entry \
    -sortmode dictionary
$tbl columnconfigure 3 -name baudRate  -editable yes -editwindow ComboBox \
    -sortmode integer
$tbl columnconfigure 4 -name dataBits  -editable yes -editwindow SpinBox
$tbl columnconfigure 5 -name parity    -editable yes -editwindow ComboBox
$tbl columnconfigure 6 -name stopBits  -editable yes -editwindow ComboBox
$tbl columnconfigure 7 -name handshake -editable yes -editwindow ComboBox
$tbl columnconfigure 8 -name actDate   -editable yes -editwindow Entry \
    -formatcommand formatDate -sortmode integer
$tbl columnconfigure 9 -name actTime   -editable yes -editwindow Entry \
    -formatcommand formatTime -sortmode integer
$tbl columnconfigure 10 -name color    -editable yes -editwindow menubutton \
    -formatcommand emptyStr

proc emptyStr   val { return "" }
proc formatDate val { return [clock format $val -format "%Y-%m-%d"] }
proc formatTime val { return [clock format $val -format "%H:%M:%S"] }

#
# Populate the tablelist widget; set the activation
# date & time to 10 minutes past the current clock value
#
set clock [expr {[clock seconds] + 600}]
for {set i 0; set n 1} {$i < 16} {set i $n; incr n} {
    $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
    $tbl cellconfigure end,color -image img[lindex $colorValues $i]
}

set btn [ttk::button $f.btn -text "Close" -command exit]

#
# Manage the widgets
#
pack $btn -side bottom -pady 10
pack $tbl -side top -expand yes -fill both
pack $f -expand yes -fill both

#------------------------------------------------------------------------------
# editStartCmd
#
# Applies some configuration options to the edit window; if the latter is a
# ComboBox, the procedure populates it.
#------------------------------------------------------------------------------
proc editStartCmd {tbl row col text} {
    set w [$tbl editwinpath]

    switch [$tbl columncget $col -name] {
	lineName {
	    #
	    # Set an upper limit of 20 for the number of characters
	    #
	    $w configure -invalidcommand bell -validate key \
			 -validatecommand {expr {[string length %P] <= 20}}
	}

	baudRate {
	    #
	    # Populate the ComboBox and allow no more
	    # than 6 digits in its Entry component
	    #
	    $w configure -values {50 75 110 300 1200 2400 4800 9600 19200 38400
				  57600 115200 230400 460800 921600}
	    $w configure -invalidcommand bell -validate key -validatecommand \
		{expr {[string length %P] <= 6 && [regexp {^[0-9]*$} %S]}}
	}

	dataBits {
	    #
	    # Configure the SpinBox
	    #
	    $w configure -range {5 8 1} -editable no
	}

	parity {
	    #
	    # Populate the ComboBox and make it non-editable
	    #
	    $w configure -values {None Even Odd Mark Space} -editable no
	}

	stopBits {
	    #
	    # Populate the ComboBox and make it non-editable
	    #
	    $w configure -values {1 1.5 2} -editable no
	}

	handshake {
	    #
	    # Populate the ComboBox and make it non-editable
	    #
	    $w configure -values {XON/XOFF RTS/CTS None} -editable no
	}

	actDate {
	    #
	    # Set an upper limit of 10 for the number of characters
	    # and allow only digits and the "-" character in it
	    #
	    $w configure -invalidcommand bell -validate key -validatecommand \
		{expr {[string length %P] <= 10 && [regexp {^[0-9-]*$} %S]}}
	}

	actTime {
	    #
	    # Set an upper limit of 8 for the number of characters
	    # and allow only digits and the ":" character in it
	    #
	    $w configure -invalidcommand bell -validate key -validatecommand \
		{expr {[string length %P] <= 8 && [regexp {^[0-9:]*$} %S]}}
	}

	color {
	    #
	    # Populate the menu and make sure the menubutton will display the
	    # color name rather than $text, which is "", due to -formatcommand
	    #
	    set menu [$w cget -menu]
	    foreach name $::colorNames {
		$menu add radiobutton -compound left \
		    -image img$::colors($name) -label $name
	    }
	    $menu entryconfigure 8 -columnbreak 1
	    return [$tbl cellcget $row,$col -text]
	}
    }

    return $text
}

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

	baudRate {
	    #
	    # Check whether the baud rate is an integer in the range 50..921600
	    #
	    if {![regexp {^[0-9]+$} $text] || $text < 50 || $text > 921600} {
		bell
		tk_messageBox -title "Error" -icon error -message \
		    "The baud rate must be an integer in the range 50..921600"
		$tbl rejectinput
	    }
	}

	actDate {
	    #
	    # Get the activation date in seconds from the last argument 
	    #
	    if {[catch {clock scan $text} actDate] != 0} {
		bell
		tk_messageBox -title "Error" -icon error -message "Invalid date"
		$tbl rejectinput
		return ""
	    }

	    #
	    # Check whether the activation clock value is later than the
	    # current one; if this is the case then make sure the cells
	    # "actDate" and "actTime" will have the same internal value
	    #
	    set actTime [$tbl cellcget $row,actTime -text]
	    set actClock [clock scan [formatTime $actTime] -base $actDate]
	    if {$actClock <= [clock seconds]} {
		bell
		tk_messageBox -title "Error" -icon error -message \
		    "The activation date & time must be in the future"
		$tbl rejectinput
	    } else {
		$tbl cellconfigure $row,actTime -text $actClock
		return $actClock
	    }
	}

	actTime {
	    #
	    # Get the activation clock value in seconds from the last argument 
	    #
	    set actDate [$tbl cellcget $row,actDate -text]
	    if {[catch {clock scan $text -base $actDate} actClock] != 0} {
		bell
		tk_messageBox -title "Error" -icon error -message "Invalid time"
		$tbl rejectinput
		return ""
	    }

	    #
	    # Check whether the activation clock value is later than the
	    # current one; if this is the case then make sure the cells
	    # "actDate" and "actTime" will have the same internal value
	    #
	    if {$actClock <= [clock seconds]} {
		bell
		tk_messageBox -title "Error" -icon error -message \
		    "The activation date & time must be in the future"
		$tbl rejectinput
	    } else {
		$tbl cellconfigure $row,actDate -text $actClock
		return $actClock
	    }
	}

	color {
	    #
	    # Update the image contained in the cell
	    #
	    $tbl cellconfigure $row,$col -image img$::colors($text)
	}
    }

    return $text
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


















































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/demos/checked.gif.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/demos/clsdFolder.gif.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/demos/comp.xbm.

1
2
3
4
5
#define comp_width 14
#define comp_height 12
static unsigned char comp_bits[] = {
   0xff, 0x3f, 0x01, 0x20, 0xfd, 0x3f, 0x05, 0x20, 0xf5, 0x3f, 0x15, 0x20,
   0xd5, 0x3f, 0x55, 0x20, 0x55, 0x3f, 0x55, 0x21, 0x55, 0x21, 0xff, 0x3f};
<
<
<
<
<










Deleted scriptlibs/tablelist5.13/demos/config.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
#==============================================================================
# Demonstrates how to use a tablelist widget for displaying and editing the
# configuration options of an arbitrary widget.
#
# Copyright (c) 2000-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

package require tablelist 5.13

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:
    #
    # Name		Class
    # -----------------------------
    # tf		Frame
    #   tbl		  Tabellist
    #   vsb, hsb	  Scrollbar
    # bf		Frame
    #   b1, b2, b3	  Button
    #
    variable winSys
    if {[catch {tk windowingsystem} winSys] != 0} {
	switch $::tcl_platform(platform) {
	    unix	{ set winSys x11 }
	    windows	{ set winSys win32 }
	    macintosh	{ set winSys classic }
	}
    }
    if {[string compare $winSys "x11"] == 0} {
	#
	# Create the font TkDefaultFont if not yet present
	#
	catch {font create TkDefaultFont -family Helvetica -size -12}

	option add *DemoTop*Font			TkDefaultFont
	option add *DemoTop*selectBackground		#678db2
	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.tbl.background		white
    option add *DemoTop.tf.tbl.stripeBackground		#e4e8ec
    option add *DemoTop.tf.tbl.setGrid			yes
    option add *DemoTop.tf.tbl*Entry.background		white
    option add *DemoTop.bf.Button.width			10
}

#------------------------------------------------------------------------------
# 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
# tablelist widget.
#------------------------------------------------------------------------------
proc demo::displayConfig w {
    if {![winfo exists $w]} {
	bell
	tk_messageBox -title "Error" -icon error -message \
	    "Bad window path name \"$w\""
	return ""
    }

    #
    # Create a top-level widget of the class DemoTop
    #
    set top .configTop
    for {set n 2} {[winfo exists $top]} {incr n} {
	set top .configTop$n
    }
    toplevel $top -class DemoTop
    wm title $top "Configuration Options of the [winfo class $w] Widget \"$w\""

    #
    # Create a scrolled tablelist widget with 5 dynamic-width
    # columns and interactive sort capability within the top-level
    #
    set tf $top.tf
    frame $tf
    set tbl $tf.tbl
    set vsb $tf.vsb
    set hsb $tf.hsb
    tablelist::tablelist $tbl \
	-columns {0 "Command-Line Name"
		  0 "Database/Alias Name"
		  0 "Database Class"
		  0 "Default Value"
		  0 "Current Value"} \
	-labelcommand tablelist::sortByColumn -sortcommand demo::compareAsSet \
	-editendcommand demo::applyValue -height 15 -width 100 -stretch all \
	-xscrollcommand [list $hsb set] -yscrollcommand [list $vsb set]
    if {[$tbl cget -selectborderwidth] == 0} {
	$tbl configure -spacing 1
    }
    $tbl columnconfigure 3 -maxwidth 30
    $tbl columnconfigure 4 -maxwidth 30 -editable yes
    scrollbar $vsb -orient vertical   -command [list $tbl yview]
    scrollbar $hsb -orient horizontal -command [list $tbl xview]

    #
    # Create three buttons within a frame child of the top-level widget
    #
    set bf $top.bf
    frame $bf
    set b1 $bf.b1
    set b2 $bf.b2
    set b3 $bf.b3
    button $b1 -text "Refresh"     -command [list demo::putConfig $w $tbl]
    button $b2 -text "Sort as Set" -command [list $tbl sort]
    button $b3 -text "Close"       -command [list destroy $top]

    #
    # Manage the widgets
    #
    grid $tbl -row 0 -rowspan 2 -column 0 -sticky news
    variable winSys
    if {[string compare $winSys "aqua"] == 0} {
	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
    grid columnconfigure $tf 0 -weight 1
    pack $b1 $b2 $b3 -side left -expand yes -pady 10
    pack $bf -side bottom -fill x
    pack $tf -side top -expand yes -fill both

    #
    # Populate the tablelist with the configuration options of the given widget
    #
    putConfig $w $tbl
    return $tbl
}

#------------------------------------------------------------------------------
# demo::putConfig
#
# Outputs the configuration options of the widget w into the tablelist widget
# tbl.
#------------------------------------------------------------------------------
proc demo::putConfig {w tbl} {
    if {![winfo exists $w]} {
	bell
	tk_messageBox -title "Error" -icon error -message \
	    "Bad window path name \"$w\"" -parent [winfo toplevel $tbl]
	return ""
    }

    #
    # Display the configuration options of w in the tablelist widget tbl
    #
    $tbl delete 0 end
    foreach configSet [$w configure] {
	#
	# Insert the list configSet into the tablelist widget
	#
	$tbl insert end $configSet

	if {[llength $configSet] == 2} {
	    $tbl rowconfigure end -foreground gray50 -selectforeground gray75
	    $tbl cellconfigure end -editable no
	} else {
	    #
	    # Change the colors of the first and last cell of the row
	    # if the current value is different from the default one
	    #
	    set default [lindex $configSet 3]
	    set current [lindex $configSet 4]
	    if {[string compare $default $current] != 0} {
		foreach col {0 4} {
		    $tbl cellconfigure end,$col \
			 -foreground red -selectforeground yellow
		}
	    }
	}
    }

    $tbl sortbycolumn 0
    $tbl activate 0
    $tbl attrib widget $w
}

#------------------------------------------------------------------------------
# demo::compareAsSet
#
# Compares two items of a tablelist widget used to display the configuration
# options of an arbitrary widget.  The item in which the current value is
# different from the default one is considered to be less than the other; if
# both items fulfil this condition or its negation then string comparison is
# applied to the two option names.
#------------------------------------------------------------------------------
proc demo::compareAsSet {item1 item2} {
    foreach {opt1 dbName1 dbClass1 default1 current1} $item1 \
	    {opt2 dbName2 dbClass2 default2 current2} $item2 {
	set changed1 [expr {[string compare $default1 $current1] != 0}]
	set changed2 [expr {[string compare $default2 $current2] != 0}]
	if {$changed1 == $changed2} {
	    return [string compare $opt1 $opt2]
	} elseif {$changed1} {
	    return -1
	} else {
	    return 1
	}
    }
}

#------------------------------------------------------------------------------
# demo::applyValue
#
# Applies the new value of the configuraton option contained in the given row
# of the tablelist widget tbl to the widget whose options are displayed in it,
# and updates the colors of the first and last cell of the row.
#------------------------------------------------------------------------------
proc demo::applyValue {tbl row col text} {
    #
    # Try to apply the new value of the option contained in
    # the given row to the widget whose options are displayed
    # in the tablelist; reject the value if the attempt fails
    #
    set w [$tbl attrib widget]
    set opt [$tbl cellcget $row,0 -text]
    if {[catch {$w configure $opt $text} result] != 0} {
	bell
	tk_messageBox -title "Error" -icon error -message $result \
	    -parent [winfo toplevel $tbl]
	$tbl rejectinput
	return ""
    }

    #
    # Replace the new option value with its canonical form and
    # update the colors of the first and last cell of the row
    #
    set text [$w cget $opt]
    set default [$tbl cellcget $row,3 -text]
    if {[string compare $default $text] == 0} {
	foreach col {0 4} {
	    $tbl cellconfigure $row,$col \
		 -foreground "" -selectforeground ""
	}
    } else {
	foreach col {0 4} {
	    $tbl cellconfigure $row,$col \
		 -foreground red -selectforeground yellow
	}
    }

    return $text
}

#------------------------------------------------------------------------------

if {$tcl_interactive} {
    return "\nTo display the configuration options of an arbitrary\
	    widget, enter\n\n\tdemo::displayConfig <widgetName>\n"
} else {
    wm withdraw .
    tk_messageBox -title $argv0 -icon warning -message \
	"Please source this script into\nan interactive wish session"
    exit 1
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
























































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/demos/config_tile.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
#==============================================================================
# Demonstrates how to use a tablelist widget for displaying and editing the
# configuration options of an arbitrary widget.
#
# Copyright (c) 2000-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

package require tablelist_tile 5.13

namespace eval demo {
    #
    # Get the current windowing system ("x11", "win32", 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:
    #
    # Name		Class
    # -----------------------------
    # tf		TFrame
    #   tbl		  Tabellist
    #   vsb, hsb	  TScrollbar
    # bf		TFrame
    #   b1, b2, b3	  TButton
    #
    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)]
    set selectFg   [winfo rgb . $tablelist::themeDefaults(-selectforeground)]
    set selectFgEqForeground [expr {$selectFg eq $foreground}]
    variable currentTheme [tablelist::getCurrentTheme]
    if {$currentTheme ne "aqua"} {
	option add *DemoTop*selectBackground \
		   $tablelist::themeDefaults(-selectbackground)
	option add *DemoTop*selectForeground \
		   $tablelist::themeDefaults(-selectforeground)
	option add *DemoTop*selectBorderWidth \
		   $tablelist::themeDefaults(-selectborderwidth)
    }
    option add *DemoTop.tf.tbl.background		white
    option add *DemoTop.tf.tbl.stripeBackground		#e4e8ec
    option add *DemoTop.tf.tbl.setGrid			yes
    option add *DemoTop.tf.tbl*Entry.background		white
    option add *DemoTop.bf.TButton.width		10
}

#
# Work around the improper appearance of the tile scrollbars in the aqua theme
#
if {$demo::currentTheme eq "aqua"} {
    interp alias {} ttk::scrollbar {} ::scrollbar
}

#------------------------------------------------------------------------------
# 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
# tablelist widget.
#------------------------------------------------------------------------------
proc demo::displayConfig w {
    if {![winfo exists $w]} {
	bell
	tk_messageBox -title "Error" -icon error -message \
	    "Bad window path name \"$w\""
	return ""
    }

    #
    # Create a top-level widget of the class DemoTop
    #
    set top .configTop
    for {set n 2} {[winfo exists $top]} {incr n} {
	set top .configTop$n
    }
    toplevel $top -class DemoTop
    wm title $top "Configuration Options of the [winfo class $w] Widget \"$w\""

    #
    # Create a scrolled tablelist widget with 5 dynamic-width
    # columns and interactive sort capability within the top-level
    #
    set tf $top.tf
    ttk::frame $tf
    set tbl $tf.tbl
    set vsb $tf.vsb
    set hsb $tf.hsb
    tablelist::tablelist $tbl \
	-columns {0 "Command-Line Name"
		  0 "Database/Alias Name"
		  0 "Database Class"
		  0 "Default Value"
		  0 "Current Value"} \
	-labelcommand tablelist::sortByColumn -sortcommand demo::compareAsSet \
	-editendcommand demo::applyValue -height 15 -width 100 -stretch all \
	-xscrollcommand [list $hsb set] -yscrollcommand [list $vsb set]
    if {[$tbl cget -selectborderwidth] == 0} {
	$tbl configure -spacing 1
    }
    $tbl columnconfigure 3 -maxwidth 30
    $tbl columnconfigure 4 -maxwidth 30 -editable yes
    ttk::scrollbar $vsb -orient vertical   -command [list $tbl yview]
    ttk::scrollbar $hsb -orient horizontal -command [list $tbl xview]

    #
    # Create three buttons within a tile frame child of the top-level widget
    #
    set bf $top.bf
    ttk::frame $bf
    set b1 $bf.b1
    set b2 $bf.b2
    set b3 $bf.b3
    ttk::button $b1 -text "Refresh"     -command [list demo::putConfig $w $tbl]
    ttk::button $b2 -text "Sort as Set" -command [list $tbl sort]
    ttk::button $b3 -text "Close"       -command [list destroy $top]

    #
    # Manage the widgets
    #
    grid $tbl -row 0 -rowspan 2 -column 0 -sticky news
    if {[tablelist::getCurrentTheme] eq "aqua"} {
	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
    grid columnconfigure $tf 0 -weight 1
    pack $b1 $b2 $b3 -side left -expand yes -pady 10
    pack $bf -side bottom -fill x
    pack $tf -side top -expand yes -fill both

    #
    # Populate the tablelist with the configuration options of the given widget
    #
    putConfig $w $tbl
    return $tbl
}

#------------------------------------------------------------------------------
# demo::putConfig
#
# Outputs the configuration options of the widget w into the tablelist widget
# tbl.
#------------------------------------------------------------------------------
proc demo::putConfig {w tbl} {
    if {![winfo exists $w]} {
	bell
	tk_messageBox -title "Error" -icon error -message \
	    "Bad window path name \"$w\"" -parent [winfo toplevel $tbl]
	return ""
    }

    #
    # Display the configuration options of w in the tablelist widget tbl
    #
    $tbl delete 0 end
    foreach configSet [$w configure] {
	#
	# Insert the list configSet into the tablelist widget
	#
	$tbl insert end $configSet

	if {[llength $configSet] == 2} {
	    $tbl rowconfigure end -foreground gray50 -selectforeground gray75
	    $tbl cellconfigure end -editable no
	} else {
	    #
	    # Change the colors of the first and last cell of the row
	    # if the current value is different from the default one
	    #
	    set default [lindex $configSet 3]
	    set current [lindex $configSet 4]
	    if {[string compare $default $current] != 0} {
		foreach col {0 4} {
		    $tbl cellconfigure end,$col -foreground red
		    if {$demo::selectFgEqForeground} {
			$tbl cellconfigure end,$col -selectforeground red
		    } else {
			$tbl cellconfigure end,$col -selectforeground yellow
		    }
		}
	    }
	}
    }

    $tbl sortbycolumn 0
    $tbl activate 0
    $tbl attrib widget $w
}

#------------------------------------------------------------------------------
# demo::compareAsSet
#
# Compares two items of a tablelist widget used to display the configuration
# options of an arbitrary widget.  The item in which the current value is
# different from the default one is considered to be less than the other; if
# both items fulfil this condition or its negation then string comparison is
# applied to the two option names.
#------------------------------------------------------------------------------
proc demo::compareAsSet {item1 item2} {
    foreach {opt1 dbName1 dbClass1 default1 current1} $item1 \
	    {opt2 dbName2 dbClass2 default2 current2} $item2 {
	set changed1 [expr {[string compare $default1 $current1] != 0}]
	set changed2 [expr {[string compare $default2 $current2] != 0}]
	if {$changed1 == $changed2} {
	    return [string compare $opt1 $opt2]
	} elseif {$changed1} {
	    return -1
	} else {
	    return 1
	}
    }
}

#------------------------------------------------------------------------------
# demo::applyValue
#
# Applies the new value of the configuraton option contained in the given row
# of the tablelist widget tbl to the widget whose options are displayed in it,
# and updates the colors of the first and last cell of the row.
#------------------------------------------------------------------------------
proc demo::applyValue {tbl row col text} {
    #
    # Try to apply the new value of the option contained in
    # the given row to the widget whose options are displayed
    # in the tablelist; reject the value if the attempt fails
    #
    set w [$tbl attrib widget]
    set opt [$tbl cellcget $row,0 -text]
    if {[catch {$w configure $opt $text} result] != 0} {
	bell
	tk_messageBox -title "Error" -icon error -message $result \
	    -parent [winfo toplevel $tbl]
	$tbl rejectinput
	return ""
    }

    #
    # Replace the new option value with its canonical form and
    # update the colors of the first and last cell of the row
    #
    set text [$w cget $opt]
    set default [$tbl cellcget $row,3 -text]
    if {[string compare $default $text] == 0} {
	foreach col {0 4} {
	    $tbl cellconfigure $row,$col \
		 -foreground "" -selectforeground ""
	}
    } else {
	foreach col {0 4} {
	    $tbl cellconfigure $row,$col -foreground red
	    if {$demo::selectFgEqForeground} {
		$tbl cellconfigure $row,$col -selectforeground red
	    } else {
		$tbl cellconfigure $row,$col -selectforeground yellow
	    }
	}
    }

    return $text
}

#------------------------------------------------------------------------------

if {$tcl_interactive} {
    return "\nTo display the configuration options of an arbitrary\
	    widget, enter\n\n\tdemo::displayConfig <widgetName>\n"
} else {
    wm withdraw .
    tk_messageBox -title $argv0 -icon warning -message \
	"Please source this script into\nan interactive wish session"
    exit 1
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<














































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/demos/dirViewer.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
#!/usr/bin/env wish

#==============================================================================
# Demonstrates how to use a tablelist widget for displaying the contents of a
# directory.
#
# Copyright (c) 2010-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

package require Tk 8.3
package require tablelist 5.13

#
# Add some entries to the Tk option database
#
set dir [file dirname [info script]]
source [file join $dir option.tcl]

#
# Create three images
#
image create photo clsdFolderImg -file [file join $dir clsdFolder.gif]
image create photo openFolderImg -file [file join $dir openFolder.gif]
image create photo fileImg       -file [file join $dir file.gif]

#------------------------------------------------------------------------------
# displayContents
#
# Displays the contents of the directory dir in a tablelist widget.
#------------------------------------------------------------------------------
proc displayContents dir {
    #
    # Create a scrolled tablelist widget with 3 dynamic-
    # width columns and interactive sort capability
    #
    set tf .tf
    frame $tf -class ScrollArea
    set tbl $tf.tbl
    set vsb $tf.vsb
    set hsb $tf.hsb
    tablelist::tablelist $tbl \
	-columns {0 "Name"	    left
		  0 "Size"	    right
		  0 "Date Modified" left} \
	-expandcommand expandCmd -collapsecommand collapseCmd \
	-xscrollcommand [list $hsb set] -yscrollcommand [list $vsb set] \
	-movablecolumns no -setgrid no -showseparators yes -height 18 -width 80
    if {[$tbl cget -selectborderwidth] == 0} {
	$tbl configure -spacing 1
    }
    $tbl columnconfigure 0 -formatcommand formatString -sortmode dictionary
    $tbl columnconfigure 1 -formatcommand formatSize -sortmode integer
    $tbl columnconfigure 2 -formatcommand formatString
    scrollbar $vsb -orient vertical   -command [list $tbl yview]
    scrollbar $hsb -orient horizontal -command [list $tbl xview]

    #
    # Create a pop-up menu with one command entry; bind the script
    # associated with its entry to the <Double-1> event, too
    #
    set menu .menu
    menu $menu -tearoff no
    $menu add command -label "Display Contents" \
		      -command [list putContentsOfSelFolder $tbl]
    set bodyTag [$tbl bodytag]
    bind $bodyTag <<Button3>>  [bind TablelistBody <Button-1>]
    bind $bodyTag <<Button3>> +[bind TablelistBody <ButtonRelease-1>]
    bind $bodyTag <<Button3>> +[list postPopupMenu %X %Y]
    bind $bodyTag <Double-1>   [list putContentsOfSelFolder $tbl]

    #
    # Create three buttons within a frame child of the main widget
    #
    set bf .bf
    frame $bf
    set b1 $bf.b1
    set b2 $bf.b2
    set b3 $bf.b3
    button $b1 -width 10 -text "Refresh"
    button $b2 -width 10 -text "Parent"
    button $b3 -width 10 -text "Close" -command exit

    #
    # Manage the widgets
    #
    grid $tbl -row 0 -rowspan 2 -column 0 -sticky news
    global winSys
    if {[string compare $winSys "aqua"] == 0} {
	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
    grid columnconfigure $tf 0 -weight 1
    pack $b1 $b2 $b3 -side left -expand yes -pady 10
    pack $bf -side bottom -fill x
    pack $tf -side top -expand yes -fill both

    #
    # Populate the tablelist with the contents of the given directory
    #
    $tbl sortbycolumn 0
    putContents $dir $tbl root
}

#------------------------------------------------------------------------------
# putContents
#
# Outputs the contents of the directory dir into the tablelist widget tbl, as
# child items of the one identified by nodeIdx.
#------------------------------------------------------------------------------
proc putContents {dir tbl nodeIdx} {
    #
    # The following check is necessary because this procedure
    # is also invoked by the "Refresh" and "Parent" buttons
    #
    if {[string compare $dir ""] != 0 &&
	(![file isdirectory $dir] || ![file readable $dir])} {
	bell
	if {[string compare $nodeIdx "root"] == 0} {
	    set choice [tk_messageBox -title "Error" -icon warning -message \
			"Cannot read directory \"[file nativename $dir]\"\
			-- replacing it with nearest existent ancestor" \
			-type okcancel -default ok]
	    if {[string compare $choice "ok"] == 0} {
		while {![file isdirectory $dir] || ![file readable $dir]} {
		    set dir [file dirname $dir]
		}
	    } else {
		return ""
	    }
	} else {
	    return ""
	}
    }

    if {[string compare $nodeIdx "root"] == 0} {
	if {[string compare $dir ""] == 0} {
	    if {[llength [file volumes]] == 1} {
		wm title . "Contents of the File System"
	    } else {
		wm title . "Contents of the File Systems"
	    }
	} else {
	    wm title . "Contents of the Directory \"[file nativename $dir]\""
	}

	$tbl delete 0 end
	set row 0
    } else {
	set row [expr {$nodeIdx + 1}]
    }

    #
    # Build a list from the data of the subdirectories and
    # files of the directory dir.  Prepend a "D" or "F" to
    # each entry's name and modification date & time, for
    # sorting purposes (it will be removed by formatString).
    #
    set itemList {}
    if {[string compare $dir ""] == 0} {
	foreach volume [file volumes] {
	    lappend itemList [list D[file nativename $volume] -1 D $volume]
	}
    } else {
	foreach entry [glob -nocomplain -types {d f} -directory $dir *] {
	    if {[catch {file mtime $entry} modTime] != 0} {
		continue
	    }

	    if {[file isdirectory $entry]} {
		lappend itemList [list D[file tail $entry] -1 \
		    D[clock format $modTime -format "%Y-%m-%d %H:%M"] $entry]
	    } else {
		lappend itemList [list F[file tail $entry] [file size $entry] \
		    F[clock format $modTime -format "%Y-%m-%d %H:%M"] ""]
	    }
	}
    }

    #
    # Sort the above list and insert it into the tablelist widget
    # tbl as list of children of the row identified by nodeIdx
    #
    set itemList [$tbl applysorting $itemList]
    $tbl insertchildlist $nodeIdx end $itemList

    #
    # Insert an image into the first cell of each newly inserted row
    #
    foreach item $itemList {
	set name [lindex $item end]
	if {[string compare $name ""] == 0} {			;# file
	    $tbl cellconfigure $row,0 -image fileImg
	} else {						;# directory
	    $tbl cellconfigure $row,0 -image clsdFolderImg
	    $tbl rowattrib $row pathName $name

	    #
	    # Mark the row as collapsed if the directory is non-empty
	    #
	    if {[file readable $name] && [llength \
		[glob -nocomplain -types {d f} -directory $name *]] != 0} {
		$tbl collapse $row
	    }
	}

	incr row
    }

    if {[string compare $nodeIdx "root"] == 0} {
	#
	# Configure the "Refresh" and "Parent" buttons
	#
	.bf.b1 configure -command [list refreshView $dir $tbl]
	set b2 .bf.b2
	if {[string compare $dir ""] == 0} {
	    $b2 configure -state disabled
	} else {
	    $b2 configure -state normal
	    set p [file dirname $dir]
	    if {[string compare $p $dir] == 0} {
		$b2 configure -command [list putContents "" $tbl root]
	    } else {
		$b2 configure -command [list putContents $p $tbl root]
	    }
	}
    }
}

#------------------------------------------------------------------------------
# formatString
#
# Returns the substring obtained from the specified value by removing its first
# character.
#------------------------------------------------------------------------------
proc formatString val {
    return [string range $val 1 end]
}

#------------------------------------------------------------------------------
# formatSize
#
# Returns an empty string if the specified value is negative and the value
# itself in user-friendly format otherwise.
#------------------------------------------------------------------------------
proc formatSize val {
    if {$val < 0} {
	return ""
    } elseif {$val < 1024} {
	return "$val bytes"
    } elseif {$val < 1048576} {
	return [format "%.1f KB" [expr {$val / 1024.0}]]
    } elseif {$val < 1073741824} {
	return [format "%.1f MB" [expr {$val / 1048576.0}]]
    } else {
	return [format "%.1f GB" [expr {$val / 1073741824.0}]]
    }
}

#------------------------------------------------------------------------------
# expandCmd
#
# Outputs the contents 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.
#------------------------------------------------------------------------------
proc expandCmd {tbl row} {
    if {[$tbl childcount $row] == 0} {
	set dir [$tbl rowattrib $row pathName]
	putContents $dir $tbl $row
    }

    if {[$tbl childcount $row] != 0} {
	$tbl cellconfigure $row,0 -image openFolderImg
    }
}

#------------------------------------------------------------------------------
# collapseCmd
#
# Updates the image displayed in the first cell of the specified row of the
# tablelist widget tbl.
#------------------------------------------------------------------------------
proc collapseCmd {tbl row} {
    $tbl cellconfigure $row,0 -image clsdFolderImg
}

#------------------------------------------------------------------------------
# putContentsOfSelFolder
#
# Outputs the contents of the selected folder into the tablelist widget tbl.
#------------------------------------------------------------------------------
proc putContentsOfSelFolder tbl {
    set row [$tbl curselection]
    if {[$tbl hasrowattrib $row pathName]} {		;# directory item
	set dir [$tbl rowattrib $row pathName]
	if {[file isdirectory $dir] && [file readable $dir]} {
	    if {[llength [glob -nocomplain -types {d f} -directory $dir *]]
		== 0} {
		bell
	    } else {
		putContents $dir $tbl root
	    }
	} else {
	    bell
	    tk_messageBox -title "Error" -icon error -message \
		"Cannot read directory \"[file nativename $dir]\""
	    return ""
	}
    } else {						;# file item
	bell
    }
}

#------------------------------------------------------------------------------
# postPopupMenu
#
# Posts the pop-up menu .menu at the given screen position.  Before posting
# the menu, the procedure enables/disables its only entry, depending upon
# whether the selected item represents a readable directory or not.
#------------------------------------------------------------------------------
proc postPopupMenu {rootX rootY} {
    set tbl .tf.tbl
    set row [$tbl curselection]
    set menu .menu
    if {[$tbl hasrowattrib $row pathName]} {		;# directory item
	set dir [$tbl rowattrib $row pathName]
	if {[file isdirectory $dir] && [file readable $dir]} {
	    if {[llength [glob -nocomplain -types {d f} -directory $dir *]]
		== 0} {
		$menu entryconfigure 0 -state disabled
	    } else {
		$menu entryconfigure 0 -state normal
	    }
	} else {
	    bell
	    tk_messageBox -title "Error" -icon error -message \
		"Cannot read directory \"[file nativename $dir]\""
	    return ""
	}
    } else {						;# file item
	$menu entryconfigure 0 -state disabled
    }

    tk_popup $menu $rootX $rootY
}

#------------------------------------------------------------------------------
# refreshView
#
# Redisplays the contents 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} {
    #
    # Save the vertical view and get the path names
    # of the folders displayed in the expanded rows
    #
    set yView [$tbl yview]
    foreach key [$tbl expandedkeys] {
	set pathName [$tbl rowattrib $key pathName]
	set expandedFolders($pathName) 1
    }

    #
    # Redisplay the directory's (possibly changed) contents and restore
    # the expanded states of the folders, along with the vertical view
    #
    putContents $dir $tbl root
    restoreExpandedStates $tbl root expandedFolders
    $tbl yview moveto [lindex $yView 0]
}

#------------------------------------------------------------------------------
# restoreExpandedStates
#
# Expands those children of the parent identified by nodeIdx that display
# folders whose path names are the names of the elements of the array specified
# by the last argument.
#------------------------------------------------------------------------------
proc restoreExpandedStates {tbl nodeIdx expandedFoldersName} {
    upvar $expandedFoldersName expandedFolders

    foreach key [$tbl childkeys $nodeIdx] {
	set pathName [$tbl rowattrib $key pathName]
	if {[string compare $pathName ""] != 0 &&
	    [info exists expandedFolders($pathName)]} {
	    $tbl expand $key -partly
	    restoreExpandedStates $tbl $key expandedFolders
	}
    }
}

displayContents ""
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


























































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/demos/dirViewer_tile.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
#!/usr/bin/env wish

#==============================================================================
# Demonstrates how to use a tablelist widget for displaying the contents of a
# directory.
#
# Copyright (c) 2010-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

package require tablelist_tile 5.13

#
# Add some entries to the Tk option database
#
set dir [file dirname [info script]]
source [file join $dir option_tile.tcl]

#
# Create three images
#
image create photo clsdFolderImg -file [file join $dir clsdFolder.gif]
image create photo openFolderImg -file [file join $dir openFolder.gif]
image create photo fileImg       -file [file join $dir file.gif]

#
# Work around the improper appearance of the tile scrollbars in the aqua theme
#
if {[tablelist::getCurrentTheme] eq "aqua"} {
    interp alias {} ttk::scrollbar {} ::scrollbar
}

#------------------------------------------------------------------------------
# displayContents
#
# Displays the contents of the directory dir in a tablelist widget.
#------------------------------------------------------------------------------
proc displayContents dir {
    #
    # Create a scrolled tablelist widget with 3 dynamic-
    # width columns and interactive sort capability
    #
    set tf .tf
    ttk::frame $tf -class ScrollArea
    set tbl $tf.tbl
    set vsb $tf.vsb
    set hsb $tf.hsb
    tablelist::tablelist $tbl \
	-columns {0 "Name"	    left
		  0 "Size"	    right
		  0 "Date Modified" left} \
	-expandcommand expandCmd -collapsecommand collapseCmd \
	-xscrollcommand [list $hsb set] -yscrollcommand [list $vsb set] \
	-movablecolumns no -setgrid no -showseparators yes -height 18 -width 80
    if {[$tbl cget -selectborderwidth] == 0} {
	$tbl configure -spacing 1
    }
    $tbl columnconfigure 0 -formatcommand formatString -sortmode dictionary
    $tbl columnconfigure 1 -formatcommand formatSize -sortmode integer
    $tbl columnconfigure 2 -formatcommand formatString
    ttk::scrollbar $vsb -orient vertical   -command [list $tbl yview]
    ttk::scrollbar $hsb -orient horizontal -command [list $tbl xview]

    #
    # Create a pop-up menu with one command entry; bind the script
    # associated with its entry to the <Double-1> event, too
    #
    set menu .menu
    menu $menu -tearoff no
    $menu add command -label "Display Contents" \
		      -command [list putContentsOfSelFolder $tbl]
    set bodyTag [$tbl bodytag]
    bind $bodyTag <<Button3>>  [bind TablelistBody <Button-1>]
    bind $bodyTag <<Button3>> +[bind TablelistBody <ButtonRelease-1>]
    bind $bodyTag <<Button3>> +[list postPopupMenu %X %Y]
    bind $bodyTag <Double-1>   [list putContentsOfSelFolder $tbl]

    #
    # Create three buttons within a frame child of the main widget
    #
    set bf .bf
    ttk::frame $bf
    set b1 $bf.b1
    set b2 $bf.b2
    set b3 $bf.b3
    ttk::button $b1 -width 10 -text "Refresh"
    ttk::button $b2 -width 10 -text "Parent"
    ttk::button $b3 -width 10 -text "Close" -command exit

    #
    # Manage the widgets
    #
    grid $tbl -row 0 -rowspan 2 -column 0 -sticky news
    if {[tablelist::getCurrentTheme] eq "aqua"} {
	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
    grid columnconfigure $tf 0 -weight 1
    pack $b1 $b2 $b3 -side left -expand yes -pady 10
    pack $bf -side bottom -fill x
    pack $tf -side top -expand yes -fill both

    #
    # Populate the tablelist with the contents of the given directory
    #
    $tbl sortbycolumn 0
    putContents $dir $tbl root
}

#------------------------------------------------------------------------------
# putContents
#
# Outputs the contents of the directory dir into the tablelist widget tbl, as
# child items of the one identified by nodeIdx.
#------------------------------------------------------------------------------
proc putContents {dir tbl nodeIdx} {
    #
    # The following check is necessary because this procedure
    # is also invoked by the "Refresh" and "Parent" buttons
    #
    if {[string compare $dir ""] != 0 &&
	(![file isdirectory $dir] || ![file readable $dir])} {
	bell
	if {[string compare $nodeIdx "root"] == 0} {
	    set choice [tk_messageBox -title "Error" -icon warning -message \
			"Cannot read directory \"[file nativename $dir]\"\
			-- replacing it with nearest existent ancestor" \
			-type okcancel -default ok]
	    if {[string compare $choice "ok"] == 0} {
		while {![file isdirectory $dir] || ![file readable $dir]} {
		    set dir [file dirname $dir]
		}
	    } else {
		return ""
	    }
	} else {
	    return ""
	}
    }

    if {[string compare $nodeIdx "root"] == 0} {
	if {[string compare $dir ""] == 0} {
	    if {[llength [file volumes]] == 1} {
		wm title . "Contents of the File System"
	    } else {
		wm title . "Contents of the File Systems"
	    }
	} else {
	    wm title . "Contents of the Directory \"[file nativename $dir]\""
	}

	$tbl delete 0 end
	set row 0
    } else {
	set row [expr {$nodeIdx + 1}]
    }

    #
    # Build a list from the data of the subdirectories and
    # files of the directory dir.  Prepend a "D" or "F" to
    # each entry's name and modification date & time, for
    # sorting purposes (it will be removed by formatString).
    #
    set itemList {}
    if {[string compare $dir ""] == 0} {
	foreach volume [file volumes] {
	    lappend itemList [list D[file nativename $volume] -1 D $volume]
	}
    } else {
	foreach entry [glob -nocomplain -types {d f} -directory $dir *] {
	    if {[catch {file mtime $entry} modTime] != 0} {
		continue
	    }

	    if {[file isdirectory $entry]} {
		lappend itemList [list D[file tail $entry] -1 \
		    D[clock format $modTime -format "%Y-%m-%d %H:%M"] $entry]
	    } else {
		lappend itemList [list F[file tail $entry] [file size $entry] \
		    F[clock format $modTime -format "%Y-%m-%d %H:%M"] ""]
	    }
	}
    }

    #
    # Sort the above list and insert it into the tablelist widget
    # tbl as list of children of the row identified by nodeIdx
    #
    set itemList [$tbl applysorting $itemList]
    $tbl insertchildlist $nodeIdx end $itemList

    #
    # Insert an image into the first cell of each newly inserted row
    #
    foreach item $itemList {
	set name [lindex $item end]
	if {[string compare $name ""] == 0} {			;# file
	    $tbl cellconfigure $row,0 -image fileImg
	} else {						;# directory
	    $tbl cellconfigure $row,0 -image clsdFolderImg
	    $tbl rowattrib $row pathName $name

	    #
	    # Mark the row as collapsed if the directory is non-empty
	    #
	    if {[file readable $name] && [llength \
		[glob -nocomplain -types {d f} -directory $name *]] != 0} {
		$tbl collapse $row
	    }
	}

	incr row
    }

    if {[string compare $nodeIdx "root"] == 0} {
	#
	# Configure the "Refresh" and "Parent" buttons
	#
	.bf.b1 configure -command [list refreshView $dir $tbl]
	set b2 .bf.b2
	if {[string compare $dir ""] == 0} {
	    $b2 configure -state disabled
	} else {
	    $b2 configure -state normal
	    set p [file dirname $dir]
	    if {[string compare $p $dir] == 0} {
		$b2 configure -command [list putContents "" $tbl root]
	    } else {
		$b2 configure -command [list putContents $p $tbl root]
	    }
	}
    }
}

#------------------------------------------------------------------------------
# formatString
#
# Returns the substring obtained from the specified value by removing its first
# character.
#------------------------------------------------------------------------------
proc formatString val {
    return [string range $val 1 end]
}

#------------------------------------------------------------------------------
# formatSize
#
# Returns an empty string if the specified value is negative and the value
# itself in user-friendly format otherwise.
#------------------------------------------------------------------------------
proc formatSize val {
    if {$val < 0} {
	return ""
    } elseif {$val < 1024} {
	return "$val bytes"
    } elseif {$val < 1048576} {
	return [format "%.1f KB" [expr {$val / 1024.0}]]
    } elseif {$val < 1073741824} {
	return [format "%.1f MB" [expr {$val / 1048576.0}]]
    } else {
	return [format "%.1f GB" [expr {$val / 1073741824.0}]]
    }
}

#------------------------------------------------------------------------------
# expandCmd
#
# Outputs the contents 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.
#------------------------------------------------------------------------------
proc expandCmd {tbl row} {
    if {[$tbl childcount $row] == 0} {
	set dir [$tbl rowattrib $row pathName]
	putContents $dir $tbl $row
    }

    if {[$tbl childcount $row] != 0} {
	$tbl cellconfigure $row,0 -image openFolderImg
    }
}

#------------------------------------------------------------------------------
# collapseCmd
#
# Updates the image displayed in the first cell of the specified row of the
# tablelist widget tbl.
#------------------------------------------------------------------------------
proc collapseCmd {tbl row} {
    $tbl cellconfigure $row,0 -image clsdFolderImg
}

#------------------------------------------------------------------------------
# putContentsOfSelFolder
#
# Outputs the contents of the selected folder into the tablelist widget tbl.
#------------------------------------------------------------------------------
proc putContentsOfSelFolder tbl {
    set row [$tbl curselection]
    if {[$tbl hasrowattrib $row pathName]} {		;# directory item
	set dir [$tbl rowattrib $row pathName]
	if {[file isdirectory $dir] && [file readable $dir]} {
	    if {[llength [glob -nocomplain -types {d f} -directory $dir *]]
		== 0} {
		bell
	    } else {
		putContents $dir $tbl root
	    }
	} else {
	    bell
	    tk_messageBox -title "Error" -icon error -message \
		"Cannot read directory \"[file nativename $dir]\""
	    return ""
	}
    } else {						;# file item
	bell
    }
}

#------------------------------------------------------------------------------
# postPopupMenu
#
# Posts the pop-up menu .menu at the given screen position.  Before posting
# the menu, the procedure enables/disables its only entry, depending upon
# whether the selected item represents a readable directory or not.
#------------------------------------------------------------------------------
proc postPopupMenu {rootX rootY} {
    set tbl .tf.tbl
    set row [$tbl curselection]
    set menu .menu
    if {[$tbl hasrowattrib $row pathName]} {		;# directory item
	set dir [$tbl rowattrib $row pathName]
	if {[file isdirectory $dir] && [file readable $dir]} {
	    if {[llength [glob -nocomplain -types {d f} -directory $dir *]]
		== 0} {
		$menu entryconfigure 0 -state disabled
	    } else {
		$menu entryconfigure 0 -state normal
	    }
	} else {
	    bell
	    tk_messageBox -title "Error" -icon error -message \
		"Cannot read directory \"[file nativename $dir]\""
	    return ""
	}
    } else {						;# file item
	$menu entryconfigure 0 -state disabled
    }

    tk_popup $menu $rootX $rootY
}

#------------------------------------------------------------------------------
# refreshView
#
# Redisplays the contents 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} {
    #
    # Save the vertical view and get the path names
    # of the folders displayed in the expanded rows
    #
    set yView [$tbl yview]
    foreach key [$tbl expandedkeys] {
	set pathName [$tbl rowattrib $key pathName]
	set expandedFolders($pathName) 1
    }

    #
    # Redisplay the directory's (possibly changed) contents and restore
    # the expanded states of the folders, along with the vertical view
    #
    putContents $dir $tbl root
    restoreExpandedStates $tbl root expandedFolders
    $tbl yview moveto [lindex $yView 0]
}

#------------------------------------------------------------------------------
# restoreExpandedStates
#
# Expands those children of the parent identified by nodeIdx that display
# folders whose path names are the names of the elements of the array specified
# by the last argument.
#------------------------------------------------------------------------------
proc restoreExpandedStates {tbl nodeIdx expandedFoldersName} {
    upvar $expandedFoldersName expandedFolders

    foreach key [$tbl childkeys $nodeIdx] {
	set pathName [$tbl rowattrib $key pathName]
	if {[string compare $pathName ""] != 0 &&
	    [info exists expandedFolders($pathName)]} {
	    $tbl expand $key -partly
	    restoreExpandedStates $tbl $key expandedFolders
	}
    }
}

displayContents ""
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/demos/embeddedWindows.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
#!/usr/bin/env wish

#==============================================================================
# Demonstrates the use of embedded windows in tablelist widgets.
#
# Copyright (c) 2004-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

package require tablelist 5.13

wm title . "Tk Library Scripts"

#
# Add some entries to the Tk option database
#
set dir [file dirname [info script]]
source [file join $dir option.tcl]

#
# Create the font TkFixedFont if not yet present
#
catch {font create TkFixedFont -family Courier -size -12}

#
# Create an image to be displayed in buttons embedded in a tablelist widget
#
image create photo openImg -file [file join $dir open.gif]

#
# Create a vertically scrolled tablelist widget with 5
# dynamic-width columns and interactive sort capability
#
set tf .tf
frame $tf -class ScrollArea 
set tbl $tf.tbl
set vsb $tf.vsb
tablelist::tablelist $tbl \
    -columns {0 "File Name" left
	      0 "Bar Chart" center
	      0 "File Size" right
	      0 "View"      center
	      0 "Seen"      center} \
    -setgrid no -yscrollcommand [list $vsb set] -width 0
if {[$tbl cget -selectborderwidth] == 0} {
    $tbl configure -spacing 1
}
$tbl columnconfigure 0 -name fileName
$tbl columnconfigure 1 -formatcommand emptyStr -sortmode integer
$tbl columnconfigure 2 -name fileSize -sortmode integer
$tbl columnconfigure 4 -name seen
scrollbar $vsb -orient vertical -command [list $tbl yview]

proc emptyStr val { return "" }

eval font create BoldFont [font actual [$tbl cget -font]] -weight bold

#
# Populate the tablelist widget
#
cd $tk_library
set maxFileSize 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
    }
}

#------------------------------------------------------------------------------
# createFrame
#
# Creates a frame widget w to be embedded into the specified cell of the
# tablelist widget tbl, as well as a child frame representing the size of the
# file whose name is diplayed in the first column of the cell's row.
#------------------------------------------------------------------------------
proc createFrame {tbl row col w} {
    #
    # Create the frame and replace the binding tag "Frame"
    # with "TablelistBody" in the list of its binding tags
    #
    frame $w -width 102 -height 14 -background ivory -borderwidth 1 \
	     -relief solid
    bindtags $w [lreplace [bindtags $w] 1 1 TablelistBody]

    #
    # Create the child frame and replace the binding tag "Frame"
    # with "TablelistBody" in the list of its binding tags
    #
    frame $w.f -height 12 -background red -borderwidth 1 -relief raised
    bindtags $w.f [lreplace [bindtags $w] 1 1 TablelistBody]

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

#------------------------------------------------------------------------------
# createButton
#
# Creates a button widget w to be embedded into the specified cell of the
# tablelist widget tbl.
#------------------------------------------------------------------------------
proc createButton {tbl row col w} {
    set key [$tbl getkeys $row]
    button $w -image openImg -highlightthickness 0 -takefocus 0 \
	      -command [list viewFile $tbl $key]
}

#------------------------------------------------------------------------------
# viewFile
#
# Displays the contents of the file whose name is contained in the row with the
# given key of the tablelist widget tbl.
#------------------------------------------------------------------------------
proc viewFile {tbl key} {
    set top .top$key
    if {[winfo exists $top]} {
	raise $top
	return ""
    }

    toplevel $top
    set fileName [$tbl cellcget k$key,fileName -text]
    wm title $top "File \"$fileName\""

    #
    # Create a vertically scrolled text widget as a grandchild of the toplevel
    #
    set tf $top.tf
    frame $tf -class ScrollArea 
    set txt $tf.txt
    set vsb $tf.vsb
    text $txt -background white -font TkFixedFont -setgrid yes \
	      -yscrollcommand [list $vsb set]
    catch {$txt configure -tabstyle wordprocessor}	;# for Tk 8.5 and above
    scrollbar $vsb -orient vertical -command [list $txt yview]

    #
    # Insert the file's contents into the text widget
    #
    set chan [open $fileName]
    $txt insert end [read $chan]
    close $chan

    set btn [button $top.btn -text "Close" -command [list destroy $top]]

    #
    # Manage the widgets
    #
    grid $txt -row 0 -column 0 -sticky news
    grid $vsb -row 0 -column 1 -sticky ns
    grid rowconfigure    $tf 0 -weight 1
    grid columnconfigure $tf 0 -weight 1
    pack $btn -side bottom -pady 10
    pack $tf  -side top -expand yes -fill both

    #
    # Mark the file as seen
    #
    $tbl rowconfigure k$key -font BoldFont
    $tbl cellconfigure k$key,seen -text yes
}

#------------------------------------------------------------------------------

#
# Create embedded windows in the columns no. 1 and 3
#
set rowCount [$tbl size]
for {set row 0} {$row < $rowCount} {incr row} {
    $tbl cellconfigure $row,1 -window createFrame -stretchwindow yes
    $tbl cellconfigure $row,3 -window createButton
}

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} {
    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
pack $btn -side bottom -pady 10
pack $tf  -side top -expand yes -fill both
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/demos/embeddedWindows_tile.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
#!/usr/bin/env wish

#==============================================================================
# Demonstrates the use of embedded windows in tablelist widgets.
#
# Copyright (c) 2004-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

package require tablelist_tile 5.13

wm title . "Tile Library Scripts"

#
# Add some entries to the Tk option database
#
set dir [file dirname [info script]]
source [file join $dir option_tile.tcl]

#
# Create the font TkFixedFont if not yet present
#
catch {font create TkFixedFont -family Courier -size -12}

#
# Create an image to be displayed in buttons embedded in a tablelist widget
#
image create photo openImg -file [file join $dir open.gif]

if {[tablelist::getCurrentTheme] eq "aqua"} {
    #
    # Work around the improper appearance of the tile scrollbars
    #
    interp alias {} ttk::scrollbar {} ::scrollbar
} else {
    #
    # Make the embedded buttons as small as possible.  Recall that in most
    # themes, the tile buttons consist of the following element hierarchy:
    #
    # Button.border
    #     Button.focus	      (one of its options is -focusthickness)
    #         Button.padding  (two of its options are -padding and -shiftrelief)
    #             Button.label
    #
    if {[info commands "::ttk::style"] ne ""} {
	interp alias {} styleConfig {} ttk::style configure
    } elseif {[string compare $tile::version "0.7"] >= 0} {
	interp alias {} styleConfig {} style configure
    } else {
	interp alias {} styleConfig {} style default
    }
    styleConfig Embedded.TButton -focusthickness 0 -padding 0 -shiftrelief 0
}

#
# Create a vertically scrolled tablelist widget with 5
# dynamic-width columns and interactive sort capability
#
set tf .tf
ttk::frame $tf -class ScrollArea
set tbl $tf.tbl
set vsb $tf.vsb
tablelist::tablelist $tbl \
    -columns {0 "File Name" left
	      0 "Bar Chart" center
	      0 "File Size" right
	      0 "View"      center
	      0 "Seen"      center} \
    -setgrid no -yscrollcommand [list $vsb set] -width 0
if {[$tbl cget -selectborderwidth] == 0} {
    $tbl configure -spacing 1
}
$tbl columnconfigure 0 -name fileName
$tbl columnconfigure 1 -formatcommand emptyStr -sortmode integer
$tbl columnconfigure 2 -name fileSize -sortmode integer
$tbl columnconfigure 4 -name seen
ttk::scrollbar $vsb -orient vertical -command [list $tbl yview]

proc emptyStr val { return "" }

eval font create BoldFont [font actual [$tbl cget -font]] -weight bold

#
# Populate the tablelist widget
#
if {[info exists ttk::library]} {
    cd $ttk::library
} else {
    cd $tile::library
}
set maxFileSize 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
    }
}

#------------------------------------------------------------------------------
# createFrame
#
# Creates a frame widget w to be embedded into the specified cell of the
# tablelist widget tbl, as well as a child frame representing the size of the
# file whose name is diplayed in the first column of the cell's row.
#------------------------------------------------------------------------------
proc createFrame {tbl row col w} {
    #
    # Create the frame and replace the binding tag "Frame"
    # with "TablelistBody" in the list of its binding tags
    #
    frame $w -width 102 -height 14 -background ivory -borderwidth 1 \
	     -relief solid
    bindtags $w [lreplace [bindtags $w] 1 1 TablelistBody]

    #
    # Create the child frame and replace the binding tag "Frame"
    # with "TablelistBody" in the list of its binding tags
    #
    frame $w.f -height 12 -background red -borderwidth 1 -relief raised
    bindtags $w.f [lreplace [bindtags $w] 1 1 TablelistBody]

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

#------------------------------------------------------------------------------
# createButton
#
# Creates a button widget w to be embedded into the specified cell of the
# tablelist widget tbl.
#------------------------------------------------------------------------------
proc createButton {tbl row col w} {
    set key [$tbl getkeys $row]
    ttk::button $w -style Embedded.TButton -image openImg -takefocus 0 \
		   -command [list viewFile $tbl $key]
}

#------------------------------------------------------------------------------
# viewFile
#
# Displays the contents of the file whose name is contained in the row with the
# given key of the tablelist widget tbl.
#------------------------------------------------------------------------------
proc viewFile {tbl key} {
    set top .top$key
    if {[winfo exists $top]} {
	raise $top
	return ""
    }

    toplevel $top
    set fileName [$tbl cellcget k$key,fileName -text]
    wm title $top "File \"$fileName\""

    #
    # Create a vertically scrolled text widget as a grandchild of the toplevel
    #
    set tf $top.tf
    ttk::frame $tf -class ScrollArea
    set txt $tf.txt
    set vsb $tf.vsb
    text $txt -background white -font TkFixedFont -highlightthickness 0 \
	      -setgrid yes -yscrollcommand [list $vsb set]
    catch {$txt configure -tabstyle wordprocessor}	;# for Tk 8.5 and above
    ttk::scrollbar $vsb -orient vertical -command [list $txt yview]

    #
    # Insert the file's contents into the text widget
    #
    set chan [open $fileName]
    $txt insert end [read $chan]
    close $chan

    set bf $top.bf
    ttk::frame $bf
    set btn [ttk::button $bf.btn -text "Close" -command [list destroy $top]]

    #
    # Manage the widgets
    #
    grid $txt -row 0 -column 0 -sticky news
    grid $vsb -row 0 -column 1 -sticky ns
    grid rowconfigure    $tf 0 -weight 1
    grid columnconfigure $tf 0 -weight 1
    pack $btn -pady 10
    pack $bf -side bottom -fill x
    pack $tf -side top -expand yes -fill both

    #
    # Mark the file as seen
    #
    $tbl rowconfigure k$key -font BoldFont
    $tbl cellconfigure k$key,seen -text yes
}

#------------------------------------------------------------------------------

#
# Create embedded windows in the columns no. 1 and 3
#
set rowCount [$tbl size]
for {set row 0} {$row < $rowCount} {incr row} {
    $tbl cellconfigure $row,1 -window createFrame -stretchwindow yes
    $tbl cellconfigure $row,3 -window createButton
}

set bf .bf
ttk::frame $bf
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"} {
    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
pack $btn -pady 10
pack $bf -side bottom -fill x
pack $tf -side top -expand yes -fill both
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<










































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/demos/file.gif.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/demos/images.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#==============================================================================
# Creates some images.
#
# Copyright (c) 2011-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

#
# Create two images, to be displayed in tablelist cells with boolean values
#
image create photo checkedImg   -file [file join $dir checked.gif]
image create photo uncheckedImg -file [file join $dir unchecked.gif]

#
# Create 16 images representing different colors
#
set colorNames {
    "red" "green" "blue" "magenta"
    "yellow" "cyan" "white" "light gray"
    "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
    #800000 #008000 #000080 #800080
    #808000 #008080 #808080 #000000
}
foreach name $colorNames value $colorValues {
    set colors($name) $value
}
foreach value $colorValues {
    image create photo img$value -height 13 -width 13
    img$value put gray50 -to 0 0 13 1				;# top edge
    img$value put gray50 -to 0 1 1 12				;# left edge
    img$value put gray75 -to 0 12 13 13				;# bottom edge
    img$value put gray75 -to 12 1 13 12				;# right edge
    img$value put $value -to 1 1 12 12
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<












































































Deleted scriptlibs/tablelist5.13/demos/iwidgets.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
#!/usr/bin/env wish

#==============================================================================
# Demonstrates the interactive tablelist cell editing with the aid of some
# widgets from the Iwidgets package and of the Tk core checkbutton and
# menubutton widgets.
#
# Copyright (c) 2004-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

package require Tk 8.4				;# because of "-compound"
package require tablelist 5.13
package require Iwidgets

wm title . "Serial Line Configuration"

#
# Add some entries to the Tk option database
#
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
option add *Tablelist*Dateentry*Label.background	white
option add *Tablelist*Timeentry*Label.background	white

#
# Register some widgets from the Iwidgets package for interactive cell editing
#
tablelist::addIncrEntryfield
tablelist::addIncrSpinint
tablelist::addIncrCombobox
tablelist::addIncrDateTimeWidget dateentry -seconds
tablelist::addIncrDateTimeWidget timeentry -seconds

#
# Create the images "checkedImg" and "uncheckedImg", as well as 16 images of
# names like "img#FF0000", displaying colors identified by names like "red"
#
source [file join $dir images.tcl]

#
# Create a tablelist widget with editable columns (except the first one)
#
set tbl .tbl
tablelist::tablelist $tbl \
    -columns {0 "No."		  right
	      0 "Available"	  center
	      0 "Name"		  left
	      0 "Baud Rate"	  right
	      0 "Data Bits"	  center
	      0 "Parity"	  left
	      0 "Stop Bits"	  center
	      0 "Handshake"	  left
	      0 "Activation Date" center
	      0 "Activation Time" center
	      0 "Cable Color"	  center} \
    -editstartcommand editStartCmd -editendcommand editEndCmd \
    -height 0 -width 0
if {[$tbl cget -selectborderwidth] == 0} {
    $tbl configure -spacing 1
}
$tbl columnconfigure 0 -sortmode integer
$tbl columnconfigure 1 -name available -editable yes -editwindow checkbutton \
    -formatcommand emptyStr
$tbl columnconfigure 2 -name lineName  -editable yes -editwindow entryfield \
    -sortmode dictionary
$tbl columnconfigure 3 -name baudRate  -editable yes -editwindow combobox \
    -sortmode integer
$tbl columnconfigure 4 -name dataBits  -editable yes -editwindow spinint
$tbl columnconfigure 5 -name parity    -editable yes -editwindow combobox
$tbl columnconfigure 6 -name stopBits  -editable yes -editwindow combobox
$tbl columnconfigure 7 -name handshake -editable yes -editwindow combobox
$tbl columnconfigure 8 -name actDate   -editable yes -editwindow dateentry \
    -formatcommand formatDate -sortmode integer
$tbl columnconfigure 9 -name actTime   -editable yes -editwindow timeentry \
    -formatcommand formatTime -sortmode integer
$tbl columnconfigure 10 -name color    -editable yes -editwindow menubutton \
    -formatcommand emptyStr

proc emptyStr   val { return "" }
proc formatDate val { return [clock format $val -format "%Y-%m-%d"] }
proc formatTime val { return [clock format $val -format "%H:%M:%S"] }

#
# Populate the tablelist widget; set the activation
# date & time to 10 minutes past the current clock value
#
set clock [expr {[clock seconds] + 600}]
for {set i 0; set n 1} {$i < 16} {set i $n; incr n} {
    $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
    $tbl cellconfigure end,color -image img[lindex $colorValues $i]
}

set btn [button .btn -text "Close" -command exit]

#
# Manage the widgets
#
pack $btn -side bottom -pady 10
pack $tbl -side top -expand yes -fill both

#------------------------------------------------------------------------------
# editStartCmd
#
# Applies some configuration options to the edit window; if the latter is a
# combobox, the procedure populates it.
#------------------------------------------------------------------------------
proc editStartCmd {tbl row col text} {
    set w [$tbl editwinpath]

    switch [$tbl columncget $col -name] {
	lineName {
	    #
	    # Set an upper limit of 20 for the number of characters
	    #
	    $w configure -pasting no -fixed 20
	}

	baudRate {
	    #
	    # Populate the combobox and allow no more
	    # than 6 digits in its entry component
	    #
	    $w insert list end 50 75 110 300 1200 2400 4800 9600 19200 38400 \
			       57600 115200 230400 460800 921600
	    $w configure -pasting no -fixed 6 -validate numeric
	}

	dataBits {
	    #
	    # Configure the spinint widget
	    #
	    $w configure -range {5 8} -wrap no -pasting no -fixed 1 \
			 -validate {regexp {^[5-8]$} %c}
	}

	parity {
	    #
	    # Populate the combobox and make it non-editable
	    #
	    $w insert list end None Even Odd Mark Space
	    $w configure -editable no -listheight 120
	}

	stopBits {
	    #
	    # Populate the combobox and make it non-editable
	    #
	    $w insert list end 1 1.5 2
	    $w configure -editable no -listheight 90
	}

	handshake {
	    #
	    # Populate the combobox and make it non-editable
	    #
	    $w insert list end XON/XOFF RTS/CTS None
	    $w configure -editable no -listheight 90
	}

	actDate {
	    #
	    # Set the date format "%Y-%m-%d"
	    #
	    $w configure -int yes
	}

	actTime {
	    #
	    # Set the time format "%H:%M:%S"
	    #
	    $w configure -format military
	}

	color {
	    #
	    # Populate the menu and make sure the menubutton will display the
	    # color name rather than $text, which is "", due to -formatcommand
	    #
	    set menu [$w cget -menu]
	    foreach name $::colorNames {
		$menu add radiobutton -compound left \
		    -image img$::colors($name) -label $name
	    }
	    $menu entryconfigure 8 -columnbreak 1
	    return [$tbl cellcget $row,$col -text]
	}
    }

    return $text
}

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

	baudRate {
	    #
	    # Check whether the baud rate is an integer in the range 50..921600
	    #
	    if {![regexp {^[0-9]+$} $text] || $text < 50 || $text > 921600} {
		bell
		tk_messageBox -title "Error" -icon error -message \
		    "The baud rate must be an integer in the range 50..921600"
		$tbl rejectinput
	    }
	}

	dataBits {
	    #
	    # Check whether the # of data bits is an integer in the range 5..8
	    #
	    if {![regexp {^[5-8]$} $text]} {
		bell
		tk_messageBox -title "Error" -icon error -message \
		    "The # of data bits must be an integer in the range 5..8"
		$tbl rejectinput
	    }
	}

	actDate {
	    #
	    # Check whether the activation clock value is later than the
	    # current one; if this is the case then make sure the cells
	    # "actDate" and "actTime" will have the same internal value
	    #
	    set actTime [$tbl cellcget $row,actTime -text]
	    set actClock [clock scan [formatTime $actTime] -base $text]
	    if {$actClock <= [clock seconds]} {
		bell
		tk_messageBox -title "Error" -icon error -message \
		    "The activation date & time must be in the future"
		$tbl rejectinput
	    } else {
		$tbl cellconfigure $row,actTime -text $actClock
		return $actClock
	    }
	}

	actTime {
	    #
	    # Check whether the activation clock value is later than the
	    # current one; if this is the case then make sure the cells
	    # "actDate" and "actTime" will have the same internal value
	    #
	    set actDate [$tbl cellcget $row,actDate -text]
	    set actClock [clock scan [formatTime $text] -base $actDate]
	    if {$actClock <= [clock seconds]} {
		bell
		tk_messageBox -title "Error" -icon error -message \
		    "The activation date & time must be in the future"
		$tbl rejectinput
	    } else {
		$tbl cellconfigure $row,actDate -text $actClock
		return $actClock
	    }
	}

	color {
	    #
	    # Update the image contained in the cell
	    #
	    $tbl cellconfigure $row,$col -image img$::colors($text)
	}
    }

    return $text
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/demos/iwidgets_tile.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
#!/usr/bin/env wish

#==============================================================================
# Demonstrates the interactive tablelist cell editing with the aid of some
# widgets from the Iwidgets package and of the Tk core checkbutton and
# menubutton widgets.
#
# Copyright (c) 2004-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

package require tablelist_tile 5.13
package require Iwidgets

wm title . "Serial Line Configuration"

#
# Add some entries to the Tk option database
#
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
option add *Tablelist*Dateentry*Label.background	white
option add *Tablelist*Timeentry*Label.background	white

#
# Register some widgets from the Iwidgets package for interactive cell editing
#
tablelist::addIncrEntryfield
tablelist::addIncrSpinint
tablelist::addIncrCombobox
tablelist::addIncrDateTimeWidget dateentry -seconds
tablelist::addIncrDateTimeWidget timeentry -seconds

#
# Create the images "checkedImg" and "uncheckedImg", as well as 16 images of
# names like "img#FF0000", displaying colors identified by names like "red"
#
source [file join $dir images.tcl]

#
# Improve the window's appearance by using a tile
# frame as a container for the other widgets
#
set f [ttk::frame .f]

#
# Create a tablelist widget with editable columns (except the first one)
#
set tbl $f.tbl
tablelist::tablelist $tbl \
    -columns {0 "No."		  right
	      0 "Available"	  center
	      0 "Name"		  left
	      0 "Baud Rate"	  right
	      0 "Data Bits"	  center
	      0 "Parity"	  left
	      0 "Stop Bits"	  center
	      0 "Handshake"	  left
	      0 "Activation Date" center
	      0 "Activation Time" center
	      0 "Cable Color"	  center} \
    -editstartcommand editStartCmd -editendcommand editEndCmd \
    -height 0 -width 0
if {[$tbl cget -selectborderwidth] == 0} {
    $tbl configure -spacing 1
}
$tbl columnconfigure 0 -sortmode integer
$tbl columnconfigure 1 -name available -editable yes -editwindow checkbutton \
    -formatcommand emptyStr
$tbl columnconfigure 2 -name lineName  -editable yes -editwindow entryfield \
    -sortmode dictionary
$tbl columnconfigure 3 -name baudRate  -editable yes -editwindow combobox \
    -sortmode integer
$tbl columnconfigure 4 -name dataBits  -editable yes -editwindow spinint
$tbl columnconfigure 5 -name parity    -editable yes -editwindow combobox
$tbl columnconfigure 6 -name stopBits  -editable yes -editwindow combobox
$tbl columnconfigure 7 -name handshake -editable yes -editwindow combobox
$tbl columnconfigure 8 -name actDate   -editable yes -editwindow dateentry \
    -formatcommand formatDate -sortmode integer
$tbl columnconfigure 9 -name actTime   -editable yes -editwindow timeentry \
    -formatcommand formatTime -sortmode integer
$tbl columnconfigure 10 -name color    -editable yes -editwindow menubutton \
    -formatcommand emptyStr

proc emptyStr   val { return "" }
proc formatDate val { return [clock format $val -format "%Y-%m-%d"] }
proc formatTime val { return [clock format $val -format "%H:%M:%S"] }

#
# Populate the tablelist widget; set the activation
# date & time to 10 minutes past the current clock value
#
set clock [expr {[clock seconds] + 600}]
for {set i 0; set n 1} {$i < 16} {set i $n; incr n} {
    $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
    $tbl cellconfigure end,color -image img[lindex $colorValues $i]
}

set btn [ttk::button $f.btn -text "Close" -command exit]

#
# Manage the widgets
#
pack $btn -side bottom -pady 10
pack $tbl -side top -expand yes -fill both
pack $f -expand yes -fill both

#------------------------------------------------------------------------------
# editStartCmd
#
# Applies some configuration options to the edit window; if the latter is a
# combobox, the procedure populates it.
#------------------------------------------------------------------------------
proc editStartCmd {tbl row col text} {
    set w [$tbl editwinpath]

    switch [$tbl columncget $col -name] {
	lineName {
	    #
	    # Set an upper limit of 20 for the number of characters
	    #
	    $w configure -pasting no -fixed 20
	}

	baudRate {
	    #
	    # Populate the combobox and allow no more
	    # than 6 digits in its entry component
	    #
	    $w insert list end 50 75 110 300 1200 2400 4800 9600 19200 38400 \
			       57600 115200 230400 460800 921600
	    $w configure -pasting no -fixed 6 -validate numeric
	}

	dataBits {
	    #
	    # Configure the spinint widget
	    #
	    $w configure -range {5 8} -wrap no -pasting no -fixed 1 \
			 -validate {regexp {^[5-8]$} %c}
	}

	parity {
	    #
	    # Populate the combobox and make it non-editable
	    #
	    $w insert list end None Even Odd Mark Space
	    $w configure -editable no -listheight 120
	}

	stopBits {
	    #
	    # Populate the combobox and make it non-editable
	    #
	    $w insert list end 1 1.5 2
	    $w configure -editable no -listheight 90
	}

	handshake {
	    #
	    # Populate the combobox and make it non-editable
	    #
	    $w insert list end XON/XOFF RTS/CTS None
	    $w configure -editable no -listheight 90
	}

	actDate {
	    #
	    # Set the date format "%Y-%m-%d"
	    #
	    $w configure -int yes
	}

	actTime {
	    #
	    # Set the time format "%H:%M:%S"
	    #
	    $w configure -format military
	}

	color {
	    #
	    # Populate the menu and make sure the menubutton will display the
	    # color name rather than $text, which is "", due to -formatcommand
	    #
	    set menu [$w cget -menu]
	    foreach name $::colorNames {
		$menu add radiobutton -compound left \
		    -image img$::colors($name) -label $name
	    }
	    $menu entryconfigure 8 -columnbreak 1
	    return [$tbl cellcget $row,$col -text]
	}
    }

    return $text
}

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

	baudRate {
	    #
	    # Check whether the baud rate is an integer in the range 50..921600
	    #
	    if {![regexp {^[0-9]+$} $text] || $text < 50 || $text > 921600} {
		bell
		tk_messageBox -title "Error" -icon error -message \
		    "The baud rate must be an integer in the range 50..921600"
		$tbl rejectinput
	    }
	}

	dataBits {
	    #
	    # Check whether the # of data bits is an integer in the range 5..8
	    #
	    if {![regexp {^[5-8]$} $text]} {
		bell
		tk_messageBox -title "Error" -icon error -message \
		    "The # of data bits must be an integer in the range 5..8"
		$tbl rejectinput
	    }
	}

	actDate {
	    #
	    # Check whether the activation clock value is later than the
	    # current one; if this is the case then make sure the cells
	    # "actDate" and "actTime" will have the same internal value
	    #
	    set actTime [$tbl cellcget $row,actTime -text]
	    set actClock [clock scan [formatTime $actTime] -base $text]
	    if {$actClock <= [clock seconds]} {
		bell
		tk_messageBox -title "Error" -icon error -message \
		    "The activation date & time must be in the future"
		$tbl rejectinput
	    } else {
		$tbl cellconfigure $row,actTime -text $actClock
		return $actClock
	    }
	}

	actTime {
	    #
	    # Check whether the activation clock value is later than the
	    # current one; if this is the case then make sure the cells
	    # "actDate" and "actTime" will have the same internal value
	    #
	    set actDate [$tbl cellcget $row,actDate -text]
	    set actClock [clock scan [formatTime $text] -base $actDate]
	    if {$actClock <= [clock seconds]} {
		bell
		tk_messageBox -title "Error" -icon error -message \
		    "The activation date & time must be in the future"
		$tbl rejectinput
	    } else {
		$tbl cellconfigure $row,actDate -text $actClock
		return $actClock
	    }
	}

	color {
	    #
	    # Update the image contained in the cell
	    #
	    $tbl cellconfigure $row,$col -image img$::colors($text)
	}
    }

    return $text
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<












































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/demos/leaf.xbm.

1
2
3
4
5
#define leaf_width 14
#define leaf_height 12
static unsigned char leaf_bits[] = {
   0xff, 0x3f, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20,
   0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0xff, 0x3f};
<
<
<
<
<










Deleted scriptlibs/tablelist5.13/demos/miscWidgets.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
#!/usr/bin/env wish

#==============================================================================
# Demonstrates the interactive tablelist cell editing with the aid of Bryan
# 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-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

package require Tk 8.4		;# because of "-compound" and the spinbox widget
package require tablelist 5.13
package require combobox
package require mentry

wm title . "Serial Line Configuration"

#
# Add some entries to the Tk option database
#
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
option add *Tablelist*Combobox.background		white
option add *Tablelist*Combobox.elementBorderWidth	2
option add *Tablelist*Mentry.background			white

#
# Register Bryan Oakley's combobox widget as well as the mentry
# widgets of type "Date" and "Time" for interactive cell editing
#
tablelist::addOakleyCombobox
tablelist::addDateMentry Ymd -
tablelist::addTimeMentry HMS :

#
# Create the images "checkedImg" and "uncheckedImg", as well as 16 images of
# names like "img#FF0000", displaying colors identified by names like "red"
#
source [file join $dir images.tcl]

#
# Create a tablelist widget with editable columns (except the first one)
#
set tbl .tbl
tablelist::tablelist $tbl \
    -columns {0 "No."		  right
	      0 "Available"	  center
	      0 "Name"		  left
	      0 "Baud Rate"	  right
	      0 "Data Bits"	  center
	      0 "Parity"	  left
	      0 "Stop Bits"	  center
	      0 "Handshake"	  left
	      0 "Activation Date" center
	      0 "Activation Time" center
	      0 "Cable Color"	  center} \
    -editstartcommand editStartCmd -editendcommand editEndCmd \
    -height 0 -width 0
if {[$tbl cget -selectborderwidth] == 0} {
    $tbl configure -spacing 1
}
$tbl columnconfigure 0 -sortmode integer
$tbl columnconfigure 1 -name available -editable yes -editwindow checkbutton \
    -formatcommand emptyStr
$tbl columnconfigure 2 -name lineName  -editable yes -editwindow entry \
    -sortmode dictionary
$tbl columnconfigure 3 -name baudRate  -editable yes -editwindow combobox \
    -sortmode integer
$tbl columnconfigure 4 -name dataBits  -editable yes -editwindow spinbox
$tbl columnconfigure 5 -name parity    -editable yes -editwindow combobox
$tbl columnconfigure 6 -name stopBits  -editable yes -editwindow combobox
$tbl columnconfigure 7 -name handshake -editable yes -editwindow combobox
$tbl columnconfigure 8 -name actDate   -editable yes -editwindow dateMentry \
    -formatcommand formatDate -sortmode integer
$tbl columnconfigure 9 -name actTime   -editable yes -editwindow timeMentry \
    -formatcommand formatTime -sortmode integer
$tbl columnconfigure 10 -name color    -editable yes -editwindow menubutton \
    -formatcommand emptyStr

proc emptyStr   val { return "" }
proc formatDate val { return [clock format $val -format "%Y-%m-%d"] }
proc formatTime val { return [clock format $val -format "%H:%M:%S"] }

#
# Populate the tablelist widget; set the activation
# date & time to 10 minutes past the current clock value
#
set clock [expr {[clock seconds] + 600}]
for {set i 0; set n 1} {$i < 16} {set i $n; incr n} {
    $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
    $tbl cellconfigure end,color -image img[lindex $colorValues $i]
}

set btn [button .btn -text "Close" -command exit]

#
# Manage the widgets
#
pack $btn -side bottom -pady 10
pack $tbl -side top -expand yes -fill both

#------------------------------------------------------------------------------
# editStartCmd
#
# Applies some configuration options to the edit window; if the latter is a
# combobox, the procedure populates it.
#------------------------------------------------------------------------------
proc editStartCmd {tbl row col text} {
    set w [$tbl editwinpath]

    switch [$tbl columncget $col -name] {
	lineName {
	    #
	    # Set an upper limit of 20 for the number of characters
	    #
	    wcb::callback $w before insert {wcb::checkEntryLen 20}
	}

	baudRate {
	    #
	    # Populate the combobox and allow no more
	    # than 6 digits in its entry component
	    #
	    $w list insert end 50 75 110 300 1200 2400 4800 9600 19200 38400 \
			       57600 115200 230400 460800 921600
	    wcb::callback [$tbl entrypath] before insert \
		{wcb::checkEntryLen 6} {wcb::checkStrForRegExp {^[0-9]*$}}
	}

	dataBits {
	    #
	    # Configure the spinbox
	    #
	    $w configure -from 5 -to 8 -state readonly
	}

	parity {
	    #
	    # Populate the combobox and make it non-editable
	    #
	    $w list insert end None Even Odd Mark Space
	    $w configure -editable no
	}

	stopBits {
	    #
	    # Populate the combobox and make it non-editable
	    #
	    $w list insert end 1 1.5 2
	    $w configure -editable no
	}

	handshake {
	    #
	    # Populate the combobox and make it non-editable
	    #
	    $w list insert end XON/XOFF RTS/CTS None
	    $w configure -editable no
	}

	actDate -
	actTime {
	    #
	    # Configure the mentry widget
	    #
	    $w configure -justify center
	}

	color {
	    #
	    # Populate the menu and make sure the menubutton will display the
	    # color name rather than $text, which is "", due to -formatcommand
	    #
	    set menu [$w cget -menu]
	    foreach name $::colorNames {
		$menu add radiobutton -compound left \
		    -image img$::colors($name) -label $name
	    }
	    $menu entryconfigure 8 -columnbreak 1
	    return [$tbl cellcget $row,$col -text]
	}
    }

    return $text
}

#
# Message strings corresponding to the values
# returned by mentry::getClockVal on failure
#
array set msgs {
    EMPTY	"Field value missing"
    BAD		"Invalid field value"
    BAD_DATE	"Invalid date"
    BAD_YEAR	"Unsupported year"
}

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

	baudRate {
	    #
	    # Check whether the baud rate is an integer in the range 50..921600
	    #
	    if {![regexp {^[0-9]+$} $text] || $text < 50 || $text > 921600} {
		bell
		tk_messageBox -title "Error" -icon error -message \
		    "The baud rate must be an integer in the range 50..921600"
		$tbl rejectinput
	    }
	}

	actDate {
	    #
	    # Check whether the last argument is a clock value in seconds
	    #
	    if {![string is digit $text]} {
		bell
		tk_messageBox -title "Error" -icon error -message $::msgs($text)
		$tbl rejectinput
		return ""
	    }

	    #
	    # Check whether the activation clock value is later than the
	    # current one; if this is the case then make sure the cells
	    # "actDate" and "actTime" will have the same internal value
	    #
	    set actTime [$tbl cellcget $row,actTime -text]
	    set actClock [clock scan [formatTime $actTime] -base $text]
	    if {$actClock <= [clock seconds]} {
		bell
		tk_messageBox -title "Error" -icon error -message \
		    "The activation date & time must be in the future"
		$tbl rejectinput
	    } else {
		$tbl cellconfigure $row,actTime -text $actClock
		return $actClock
	    }
	}

	actTime {
	    #
	    # Check whether the last argument is a clock value in seconds
	    #
	    if {![string is digit $text]} {
		bell
		tk_messageBox -title "Error" -icon error -message $::msgs($text)
		$tbl rejectinput
		return ""
	    }

	    #
	    # Check whether the activation clock value is later than the
	    # current one; if this is the case then make sure the cells
	    # "actDate" and "actTime" will have the same internal value
	    #
	    set actDate [$tbl cellcget $row,actDate -text]
	    set actClock [clock scan [formatTime $text] -base $actDate]
	    if {$actClock <= [clock seconds]} {
		bell
		tk_messageBox -title "Error" -icon error -message \
		    "The activation date & time must be in the future"
		$tbl rejectinput
	    } else {
		$tbl cellconfigure $row,actDate -text $actClock
		return $actClock
	    }
	}

	color {
	    #
	    # Update the image contained in the cell
	    #
	    $tbl cellconfigure $row,$col -image img$::colors($text)
	}
    }

    return $text
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




























































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/demos/miscWidgets_tile.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
#!/usr/bin/env wish

#==============================================================================
# Demonstrates the interactive tablelist cell editing with the aid of Bryan
# 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-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

package require tablelist_tile 5.13
package require combobox
package require mentry

wm title . "Serial Line Configuration"

#
# Add some entries to the Tk option database
#
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
option add *Tablelist*Combobox.background		white
option add *Tablelist*Combobox.elementBorderWidth	2
option add *Tablelist*Mentry.background			white

#
# Register Bryan Oakley's combobox widget as well as the mentry
# widgets of type "Date" and "Time" for interactive cell editing
#
tablelist::addOakleyCombobox
tablelist::addDateMentry Ymd -
tablelist::addTimeMentry HMS :

#
# Create the images "checkedImg" and "uncheckedImg", as well as 16 images of
# names like "img#FF0000", displaying colors identified by names like "red"
#
source [file join $dir images.tcl]

#
# Improve the window's appearance by using a tile
# frame as a container for the other widgets
#
set f [ttk::frame .f]

#
# Create a tablelist widget with editable columns (except the first one)
#
set tbl $f.tbl
tablelist::tablelist $tbl \
    -columns {0 "No."		  right
	      0 "Available"	  center
	      0 "Name"		  left
	      0 "Baud Rate"	  right
	      0 "Data Bits"	  center
	      0 "Parity"	  left
	      0 "Stop Bits"	  center
	      0 "Handshake"	  left
	      0 "Activation Date" center
	      0 "Activation Time" center
	      0 "Cable Color"	  center} \
    -editstartcommand editStartCmd -editendcommand editEndCmd \
    -height 0 -width 0
if {[$tbl cget -selectborderwidth] == 0} {
    $tbl configure -spacing 1
}
$tbl columnconfigure 0 -sortmode integer
$tbl columnconfigure 1 -name available -editable yes -editwindow checkbutton \
    -formatcommand emptyStr
$tbl columnconfigure 2 -name lineName  -editable yes -editwindow entry \
    -sortmode dictionary
$tbl columnconfigure 3 -name baudRate  -editable yes -editwindow combobox \
    -sortmode integer
$tbl columnconfigure 4 -name dataBits  -editable yes -editwindow spinbox
$tbl columnconfigure 5 -name parity    -editable yes -editwindow combobox
$tbl columnconfigure 6 -name stopBits  -editable yes -editwindow combobox
$tbl columnconfigure 7 -name handshake -editable yes -editwindow combobox
$tbl columnconfigure 8 -name actDate   -editable yes -editwindow dateMentry \
    -formatcommand formatDate -sortmode integer
$tbl columnconfigure 9 -name actTime   -editable yes -editwindow timeMentry \
    -formatcommand formatTime -sortmode integer
$tbl columnconfigure 10 -name color    -editable yes -editwindow menubutton \
    -formatcommand emptyStr

proc emptyStr   val { return "" }
proc formatDate val { return [clock format $val -format "%Y-%m-%d"] }
proc formatTime val { return [clock format $val -format "%H:%M:%S"] }

#
# Populate the tablelist widget; set the activation
# date & time to 10 minutes past the current clock value
#
set clock [expr {[clock seconds] + 600}]
for {set i 0; set n 1} {$i < 16} {set i $n; incr n} {
    $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
    $tbl cellconfigure end,color -image img[lindex $colorValues $i]
}

set btn [ttk::button $f.btn -text "Close" -command exit]

#
# Manage the widgets
#
pack $btn -side bottom -pady 10
pack $tbl -side top -expand yes -fill both
pack $f -expand yes -fill both

#------------------------------------------------------------------------------
# editStartCmd
#
# Applies some configuration options to the edit window; if the latter is a
# combobox, the procedure populates it.
#------------------------------------------------------------------------------
proc editStartCmd {tbl row col text} {
    set w [$tbl editwinpath]

    switch [$tbl columncget $col -name] {
	lineName {
	    #
	    # Set an upper limit of 20 for the number of characters
	    #
	    wcb::callback $w before insert {wcb::checkEntryLen 20}
	}

	baudRate {
	    #
	    # Populate the combobox and allow no more
	    # than 6 digits in its entry component
	    #
	    $w list insert end 50 75 110 300 1200 2400 4800 9600 19200 38400 \
			       57600 115200 230400 460800 921600
	    wcb::callback [$tbl entrypath] before insert \
		{wcb::checkEntryLen 6} {wcb::checkStrForRegExp {^[0-9]*$}}
	}

	dataBits {
	    #
	    # Configure the spinbox
	    #
	    $w configure -from 5 -to 8 -state readonly
	}

	parity {
	    #
	    # Populate the combobox and make it non-editable
	    #
	    $w list insert end None Even Odd Mark Space
	    $w configure -editable no
	}

	stopBits {
	    #
	    # Populate the combobox and make it non-editable
	    #
	    $w list insert end 1 1.5 2
	    $w configure -editable no
	}

	handshake {
	    #
	    # Populate the combobox and make it non-editable
	    #
	    $w list insert end XON/XOFF RTS/CTS None
	    $w configure -editable no
	}

	actDate -
	actTime {
	    #
	    # Configure the mentry widget
	    #
	    $w configure -justify center
	}

	color {
	    #
	    # Populate the menu and make sure the menubutton will display the
	    # color name rather than $text, which is "", due to -formatcommand
	    #
	    set menu [$w cget -menu]
	    foreach name $::colorNames {
		$menu add radiobutton -compound left \
		    -image img$::colors($name) -label $name
	    }
	    $menu entryconfigure 8 -columnbreak 1
	    return [$tbl cellcget $row,$col -text]
	}
    }

    return $text
}

#
# Message strings corresponding to the values
# returned by mentry::getClockVal on failure
#
array set msgs {
    EMPTY	"Field value missing"
    BAD		"Invalid field value"
    BAD_DATE	"Invalid date"
    BAD_YEAR	"Unsupported year"
}

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

	baudRate {
	    #
	    # Check whether the baud rate is an integer in the range 50..921600
	    #
	    if {![regexp {^[0-9]+$} $text] || $text < 50 || $text > 921600} {
		bell
		tk_messageBox -title "Error" -icon error -message \
		    "The baud rate must be an integer in the range 50..921600"
		$tbl rejectinput
	    }
	}

	actDate {
	    #
	    # Check whether the last argument is a clock value in seconds
	    #
	    if {![string is digit $text]} {
		bell
		tk_messageBox -title "Error" -icon error -message $::msgs($text)
		$tbl rejectinput
		return ""
	    }

	    #
	    # Check whether the activation clock value is later than the
	    # current one; if this is the case then make sure the cells
	    # "actDate" and "actTime" will have the same internal value
	    #
	    set actTime [$tbl cellcget $row,actTime -text]
	    set actClock [clock scan [formatTime $actTime] -base $text]
	    if {$actClock <= [clock seconds]} {
		bell
		tk_messageBox -title "Error" -icon error -message \
		    "The activation date & time must be in the future"
		$tbl rejectinput
	    } else {
		$tbl cellconfigure $row,actTime -text $actClock
		return $actClock
	    }
	}

	actTime {
	    #
	    # Check whether the last argument is a clock value in seconds
	    #
	    if {![string is digit $text]} {
		bell
		tk_messageBox -title "Error" -icon error -message $::msgs($text)
		$tbl rejectinput
		return ""
	    }

	    #
	    # Check whether the activation clock value is later than the
	    # current one; if this is the case then make sure the cells
	    # "actDate" and "actTime" will have the same internal value
	    #
	    set actDate [$tbl cellcget $row,actDate -text]
	    set actClock [clock scan [formatTime $text] -base $actDate]
	    if {$actClock <= [clock seconds]} {
		bell
		tk_messageBox -title "Error" -icon error -message \
		    "The activation date & time must be in the future"
		$tbl rejectinput
	    } else {
		$tbl cellconfigure $row,actDate -text $actClock
		return $actClock
	    }
	}

	color {
	    #
	    # Update the image contained in the cell
	    #
	    $tbl cellconfigure $row,$col -image img$::colors($text)
	}
    }

    return $text
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<








































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/demos/open.gif.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/demos/openFolder.gif.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/demos/option.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#==============================================================================
# Contains some Tk option database settings.
#
# Copyright (c) 2004-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

#
# Get the current windowing system ("x11", "win32", "classic", or "aqua")
#
if {[catch {tk windowingsystem} winSys] != 0} {
    switch $::tcl_platform(platform) {
	unix      { set winSys x11 }
	windows   { set winSys win32 }
	macintosh { set winSys classic }
    }
}

#
# Add some entries to the Tk option database
#
if {[string compare $winSys "x11"] == 0} {
    #
    # Create the font TkDefaultFont if not yet present
    #
    catch {font create TkDefaultFont -family Helvetica -size -12}

    option add *Font			TkDefaultFont
    option add *selectBackground	#678db2
    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	#e4e8ec
option add *Tablelist.setGrid		yes
option add *Tablelist.movableColumns	yes
option add *Tablelist.labelCommand	tablelist::sortByColumn
option add *Tablelist.labelCommand2	tablelist::addToSortColumns
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






















































































Deleted scriptlibs/tablelist5.13/demos/option_tile.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#==============================================================================
# Contains some Tk option database settings.
#
# Copyright (c) 2004-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

#
# Get the current windowing system ("x11", "win32", or
# "aqua") and add some entries to the Tk option database
#
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"} {
    option add *Listbox.selectBackground \
	       $tablelist::themeDefaults(-selectbackground)
    option add *Listbox.selectForeground \
	       $tablelist::themeDefaults(-selectforeground)
} else {
    option add *selectBackground  $tablelist::themeDefaults(-selectbackground)
    option add *selectForeground  $tablelist::themeDefaults(-selectforeground)
}
option add *selectBorderWidth     $tablelist::themeDefaults(-selectborderwidth)
option add *Tablelist.background	white
option add *Tablelist.stripeBackground	#e4e8ec
option add *Tablelist.setGrid		yes
option add *Tablelist.movableColumns	yes
option add *Tablelist.labelCommand	tablelist::sortByColumn
option add *Tablelist.labelCommand2	tablelist::addToSortColumns
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<








































































Deleted scriptlibs/tablelist5.13/demos/styles.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#!/usr/bin/env wish

#==============================================================================
# Demonstrates some ways of improving the look & feel of a tablelist widget.
#
# Copyright (c) 2002-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

package require tablelist 5.13

wm title . "Tablelist Styles"

#
# Get the current windowing system ("x11", "win32", "classic",
# or "aqua") and add some entries to the Tk option database
#
if {[catch {tk windowingsystem} winSys] != 0} {
    switch $::tcl_platform(platform) {
	unix      { set winSys x11 }
	windows   { set winSys win32 }
	macintosh { set winSys classic }
    }
}
if {[string compare $winSys "x11"] == 0} {
    #
    # Create the font TkDefaultFont if not yet present
    #
    catch {font create TkDefaultFont -family Helvetica -size -12}

    option add *Font			TkDefaultFont
    option add *selectBackground	#678db2
    option add *selectForeground	white
}

#
# Create, configure, and populate 8 tablelist widgets
#
frame .f
for {set n 0} { $n < 8} {incr n} {
    set tbl .f.tbl$n
    tablelist::tablelist $tbl \
	-columntitles {"Label 0" "Label 1" "Label 2" "Label 3"} \
	-background white -height 4 -width 40 -stretch all
    if {[$tbl cget -selectborderwidth] == 0} {
	$tbl configure -spacing 1
    }

    switch $n {
	1 {
	    $tbl configure -showseparators yes
	}
	2 {
	    $tbl configure -stripebackground #e4e8ec
	}
	3 {
	    $tbl configure -stripebackground #e4e8ec -showseparators yes
	}
	4 {
	    $tbl columnconfigure 1 -background LightYellow
	    $tbl columnconfigure 3 -background LightCyan
	}
	5 {
	    $tbl configure -showseparators yes
	    $tbl columnconfigure 1 -background LightYellow
	    $tbl columnconfigure 3 -background LightCyan
	}
	6 {
	    $tbl configure -stripebackground #e4e8ec
	    $tbl columnconfigure 1 -background LightYellow \
		-stripebackground #e5e5c9
	    $tbl columnconfigure 3 -background LightCyan \
		-stripebackground #c9e5e5
	}
	7 {
	    $tbl configure -stripebackground #e4e8ec -showseparators yes
	    $tbl columnconfigure 1 -background LightYellow \
		-stripebackground #e5e5c9
	    $tbl columnconfigure 3 -background LightCyan \
		-stripebackground #c9e5e5
	}
    }

    foreach row {0 1 2 3} {
	$tbl insert end \
	     [list "Cell $row,0" "Cell $row,1" "Cell $row,2" "Cell $row,3"]
    }
}

button .close -text "Close" -command exit
frame .bottom -height 10

#
# Manage the widgets
#
grid .f.tbl0 .f.tbl1 -sticky news -padx 5 -pady 5
grid .f.tbl2 .f.tbl3 -sticky news -padx 5 -pady 5
grid .f.tbl4 .f.tbl5 -sticky news -padx 5 -pady 5
grid .f.tbl6 .f.tbl7 -sticky news -padx 5 -pady 5
grid rowconfigure    .f {0 1 2 3} -weight 1
grid columnconfigure .f {0 1}     -weight 1
pack .bottom .close -side bottom
pack .f -side top -expand yes -fill both -padx 5 -pady 5
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<












































































































































































































Deleted scriptlibs/tablelist5.13/demos/styles_tile.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#!/usr/bin/env wish

#==============================================================================
# Demonstrates some ways of improving the look & feel of a tablelist widget.
#
# Copyright (c) 2002-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

package require tablelist_tile 5.13

wm title . "Tablelist Styles"

#
# Improve the window's appearance by using a tile
# frame as a container for the other widgets
#
set f [ttk::frame .f]

#
# Create, configure, and populate 8 tablelist widgets
#
ttk::frame $f.f
for {set n 0} { $n < 8} {incr n} {
    set tbl $f.f.tbl$n
    tablelist::tablelist $tbl \
	-columntitles {"Label 0" "Label 1" "Label 2" "Label 3"} \
	-background white -stripebackground "" -height 4 -width 40 -stretch all
    if {[$tbl cget -selectborderwidth] == 0} {
	$tbl configure -spacing 1
    }

    switch $n {
	1 {
	    $tbl configure -showseparators yes
	}
	2 {
	    $tbl configure -stripebackground #e4e8ec
	}
	3 {
	    $tbl configure -stripebackground #e4e8ec -showseparators yes
	}
	4 {
	    $tbl columnconfigure 1 -background LightYellow
	    $tbl columnconfigure 3 -background LightCyan
	}
	5 {
	    $tbl configure -showseparators yes
	    $tbl columnconfigure 1 -background LightYellow
	    $tbl columnconfigure 3 -background LightCyan
	}
	6 {
	    $tbl configure -stripebackground #e4e8ec
	    $tbl columnconfigure 1 -background LightYellow \
		-stripebackground #e5e5c9
	    $tbl columnconfigure 3 -background LightCyan \
		-stripebackground #c9e5e5
	}
	7 {
	    $tbl configure -stripebackground #e4e8ec -showseparators yes
	    $tbl columnconfigure 1 -background LightYellow \
		-stripebackground #e5e5c9
	    $tbl columnconfigure 3 -background LightCyan \
		-stripebackground #c9e5e5
	}
    }

    foreach row {0 1 2 3} {
	$tbl insert end \
	     [list "Cell $row,0" "Cell $row,1" "Cell $row,2" "Cell $row,3"]
    }
}

ttk::button $f.close -text "Close" -command exit
ttk::frame $f.bottom -height 10

#
# Manage the widgets
#
grid $f.f.tbl0 $f.f.tbl1 -sticky news -padx 5 -pady 5
grid $f.f.tbl2 $f.f.tbl3 -sticky news -padx 5 -pady 5
grid $f.f.tbl4 $f.f.tbl5 -sticky news -padx 5 -pady 5
grid $f.f.tbl6 $f.f.tbl7 -sticky news -padx 5 -pady 5
grid rowconfigure    $f.f {0 1 2 3} -weight 1
grid columnconfigure $f.f {0 1}     -weight 1
pack $f.bottom $f.close -side bottom
pack $f.f -side top -expand yes -fill both -padx 5 -pady 5
pack $f -expand yes -fill both
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<














































































































































































Deleted scriptlibs/tablelist5.13/demos/tileWidgets.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
#!/usr/bin/env wish

#==============================================================================
# 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-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

package require tablelist_tile 5.13

wm title . "Serial Line Configuration"

#
# Add some entries to the Tk option database
#
set dir [file dirname [info script]]
source [file join $dir option_tile.tcl]
option add *Tablelist*Spinbox.background		white
option add *Tablelist*Spinbox.readonlyBackground	white

#
# Create the images "checkedImg" and "uncheckedImg", as well as 16 images of
# names like "img#FF0000", displaying colors identified by names like "red"
#
source [file join $dir images.tcl]

#
# Improve the window's appearance by using a tile
# frame as a container for the other widgets
#
set f [ttk::frame .f]

#
# Work around the improper appearance of the tile scrollbars in the aqua theme
#
if {[tablelist::getCurrentTheme] eq "aqua"} {
    interp alias {} ttk::scrollbar {} ::scrollbar
}

#
# Create a tablelist widget with editable columns (except the first one)
#
set tbl $f.tbl
tablelist::tablelist $tbl \
    -columns {0 "No."		  right
	      0 "Available"	  center
	      0 "Name"		  left
	      0 "Baud Rate"	  right
	      0 "Data Bits"	  center
	      0 "Parity"	  left
	      0 "Stop Bits"	  center
	      0 "Handshake"	  left
	      0 "Activation Date" center
	      0 "Activation Time" center
	      0 "Cable Color"	  center} \
    -editstartcommand editStartCmd -editendcommand editEndCmd \
    -height 0 -width 0
if {[$tbl cget -selectborderwidth] == 0} {
    $tbl configure -spacing 1
}
$tbl columnconfigure 0 -sortmode integer
$tbl columnconfigure 1 -name available -editable yes \
    -editwindow ttk::checkbutton -formatcommand emptyStr
$tbl columnconfigure 2 -name lineName  -editable yes -editwindow ttk::entry \
    -sortmode dictionary
$tbl columnconfigure 3 -name baudRate  -editable yes -editwindow ttk::combobox \
    -sortmode integer
if {[info commands ttk::spinbox] eq ""} {
    $tbl columnconfigure 4 -name dataBits -editable yes -editwindow spinbox
} else {
    $tbl columnconfigure 4 -name dataBits -editable yes -editwindow ttk::spinbox
}
$tbl columnconfigure 5 -name parity    -editable yes -editwindow ttk::combobox
$tbl columnconfigure 6 -name stopBits  -editable yes -editwindow ttk::combobox
$tbl columnconfigure 7 -name handshake -editable yes -editwindow ttk::combobox
$tbl columnconfigure 8 -name actDate   -editable yes -editwindow ttk::entry \
    -formatcommand formatDate -sortmode integer
$tbl columnconfigure 9 -name actTime   -editable yes -editwindow ttk::entry \
    -formatcommand formatTime -sortmode integer
$tbl columnconfigure 10 -name color    -editable yes \
    -editwindow ttk::menubutton -formatcommand emptyStr

proc emptyStr   val { return "" }
proc formatDate val { return [clock format $val -format "%Y-%m-%d"] }
proc formatTime val { return [clock format $val -format "%H:%M:%S"] }

#
# Populate the tablelist widget; set the activation
# date & time to 10 minutes past the current clock value
#
set clock [expr {[clock seconds] + 600}]
for {set i 0; set n 1} {$i < 16} {set i $n; incr n} {
    $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
    $tbl cellconfigure end,color -image img[lindex $colorValues $i]
}

set btn [ttk::button $f.btn -text "Close" -command exit]

#
# Manage the widgets
#
pack $btn -side bottom -pady 10
pack $tbl -side top -expand yes -fill both
pack $f -expand yes -fill both

#------------------------------------------------------------------------------
# editStartCmd
#
# Applies some configuration options to the edit window; if the latter is a
# combobox, the procedure populates it.
#------------------------------------------------------------------------------
proc editStartCmd {tbl row col text} {
    set w [$tbl editwinpath]

    switch [$tbl columncget $col -name] {
	lineName {
	    #
	    # Set an upper limit of 20 for the number of characters
	    #
	    $w configure -invalidcommand bell -validate key \
			 -validatecommand {expr {[string length %P] <= 20}}
	}

	baudRate {
	    #
	    # Populate the combobox and allow no more
	    # than 6 digits in its entry component
	    #
	    $w configure -values {50 75 110 300 1200 2400 4800 9600 19200 38400
				  57600 115200 230400 460800 921600}
	    $w configure -invalidcommand bell -validate key -validatecommand \
		{expr {[string length %P] <= 6 && [regexp {^[0-9]*$} %S]}}
	}

	dataBits {
	    #
	    # Configure the spinbox
	    #
	    $w configure -from 5 -to 8 -state readonly
	}

	parity {
	    #
	    # Populate the combobox and make it non-editable
	    #
	    $w configure -values {None Even Odd Mark Space} -state readonly
	}

	stopBits {
	    #
	    # Populate the combobox and make it non-editable
	    #
	    $w configure -values {1 1.5 2} -state readonly
	}

	handshake {
	    #
	    # Populate the combobox and make it non-editable
	    #
	    $w configure -values {XON/XOFF RTS/CTS None} -state readonly
	}

	actDate {
	    #
	    # Set an upper limit of 10 for the number of characters
	    # and allow only digits and the "-" character in it
	    #
	    $w configure -invalidcommand bell -validate key -validatecommand \
		{expr {[string length %P] <= 10 && [regexp {^[0-9-]*$} %S]}}
	}

	actTime {
	    #
	    # Set an upper limit of 8 for the number of characters
	    # and allow only digits and the ":" character in it
	    #
	    $w configure -invalidcommand bell -validate key -validatecommand \
		{expr {[string length %P] <= 8 && [regexp {^[0-9:]*$} %S]}}
	}

	color {
	    #
	    # Populate the menu and make sure the menubutton will display the
	    # color name rather than $text, which is "", due to -formatcommand
	    #
	    set menu [$w cget -menu]
	    foreach name $::colorNames {
		$menu add radiobutton -compound left \
		    -image img$::colors($name) -label $name
	    }
	    $menu entryconfigure 8 -columnbreak 1
	    return [$tbl cellcget $row,$col -text]
	}
    }

    return $text
}

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

	baudRate {
	    #
	    # Check whether the baud rate is an integer in the range 50..921600
	    #
	    if {![regexp {^[0-9]+$} $text] || $text < 50 || $text > 921600} {
		bell
		tk_messageBox -title "Error" -icon error -message \
		    "The baud rate must be an integer in the range 50..921600"
		$tbl rejectinput
	    }
	}

	actDate {
	    #
	    # Get the activation date in seconds from the last argument 
	    #
	    if {[catch {clock scan $text} actDate] != 0} {
		bell
		tk_messageBox -title "Error" -icon error -message "Invalid date"
		$tbl rejectinput
		return ""
	    }

	    #
	    # Check whether the activation clock value is later than the
	    # current one; if this is the case then make sure the cells
	    # "actDate" and "actTime" will have the same internal value
	    #
	    set actTime [$tbl cellcget $row,actTime -text]
	    set actClock [clock scan [formatTime $actTime] -base $actDate]
	    if {$actClock <= [clock seconds]} {
		bell
		tk_messageBox -title "Error" -icon error -message \
		    "The activation date & time must be in the future"
		$tbl rejectinput
	    } else {
		$tbl cellconfigure $row,actTime -text $actClock
		return $actClock
	    }
	}

	actTime {
	    #
	    # Get the activation clock value in seconds from the last argument 
	    #
	    set actDate [$tbl cellcget $row,actDate -text]
	    if {[catch {clock scan $text -base $actDate} actClock] != 0} {
		bell
		tk_messageBox -title "Error" -icon error -message "Invalid time"
		$tbl rejectinput
		return ""
	    }

	    #
	    # Check whether the activation clock value is later than the
	    # current one; if this is the case then make sure the cells
	    # "actDate" and "actTime" will have the same internal value
	    #
	    if {$actClock <= [clock seconds]} {
		bell
		tk_messageBox -title "Error" -icon error -message \
		    "The activation date & time must be in the future"
		$tbl rejectinput
	    } else {
		$tbl cellconfigure $row,actDate -text $actClock
		return $actClock
	    }
	}

	color {
	    #
	    # Update the image contained in the cell
	    #
	    $tbl cellconfigure $row,$col -image img$::colors($text)
	}
    }

    return $text
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




















































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/demos/unchecked.gif.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/adwaita.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/ambiance.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/aqua.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/arrowStyles.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/baghira.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/browse.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/browseTree.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/bwidget.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/config.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/dirViewer.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/dust.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/dustSand.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/embeddedWindows.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/embeddedWindows_tile.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/gtk.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/index.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<html>
<head>
  <title>The Multi-Column Listbox and Tree Widget Package Tablelist
  5.13</title>

  <meta name="Author" content="Csaba Nemethi">
  <meta name="Keywords" content=
  "tablelist, multi-column, listbox, tree, widget, tile">
</head>

<body bgcolor="#FFFFFF">
  <div align="center">
    <h1>The Multi-Column Listbox and Tree Widget Package Tablelist 5.13</h1>

    <h3>by</h3>

    <h2>Csaba Nemethi</h2>

    <address>
      <a href="mailto:csaba.nemethi@t-online.de">csaba.nemethi@t-online.de</a>
    </address>
  </div>

  <hr>

  <h2>Contents</h2>

  <p><a href="tablelist.html">Tablelist Programmer's Guide</a></p>

  <p><a href="tablelistWidget.html">The <code>tablelist::tablelist</code>
  Command</a></p>

  <p><a href="tablelistColSort.html">Commands for Interactive Sorting by One or
  More Columns</a></p>

  <p><a href="tablelistBinding.html">Helper Commands Used in Tablelist Binding
  Scripts</a></p>

  <p><a href="tablelistTkCore.html">Interactive Tablelist Cell Editing Using Tk
  Core Widgets</a></p>

  <p><a href="tablelistTile.html">Interactive Tablelist Cell Editing Using Tile
  Widgets</a></p>

  <p><a href="tablelistBWidget.html">Interactive Tablelist Cell Editing Using
  the BWidget Package</a></p>

  <p><a href="tablelistIwidgets.html">Interactive Tablelist Cell Editing Using
  the Iwidgets Package</a></p>

  <p><a href="tablelistCombobox.html">Interactive Tablelist Cell Editing Using
  the combobox Package</a></p>

  <p><a href="tablelistCtext.html">Interactive Tablelist Cell Editing Using
  the ctext Package</a></p>

  <p><a href="tablelistMentry.html">Interactive Tablelist Cell Editing Using
  the Mentry Package</a></p>

  <p><a href="tablelistThemes.html">Commands Related to Tile Themes</a></p>
</body>
</html>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




























































































































Deleted scriptlibs/tablelist5.13/doc/klearlooks.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/mate.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/mint.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/newWave.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/oxygen1.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/oxygen2.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/phase.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/plastik.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/plastique.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/radiance.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/styles.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/stylesheet.css.

1
2
3
4
5
6
7
8
/* generic class defining a top margin whose height equals the font size */
.tm {margin-top: 1em}

/* background and border for the <pre> tag */
pre {background: #F7F7F7; border: silver solid 1px}

/* color for the <span> tag */
span {color: #E00000}
<
<
<
<
<
<
<
<
















Deleted scriptlibs/tablelist5.13/doc/tablelist.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
<html>
<head>
  <title>Tablelist Programmer's Guide</title>

  <meta name="Author" content="Csaba Nemethi">
  <meta name="Keywords" content=
  "tablelist, multi-column, listbox, tree, widget, tile">

  <link rel="stylesheet" type="text/css" href="stylesheet.css">
</head>

<body bgcolor="#FFFFFF">
  <div align="center">
    <h1>Tablelist Programmer's Guide</h1>

    <h2>For Tablelist Version 5.13</h2>

    <h3>by</h3>

    <h2>Csaba Nemethi</h2>

    <address>
      <a href="mailto:csaba.nemethi@t-online.de">csaba.nemethi@t-online.de</a>
    </address>
  </div>
  <hr>

  <h2 id="contents">Contents</h2>

  <h4><a href="#overview">Overview</a></h4>

  <ul>
    <li><a href="#ov_what">What is Tablelist?</a></li>

    <li><a href="#ov_get">How to Get It?</a></li>

    <li><a href="#ov_install">How to Install It?</a></li>

    <li><a href="#ov_use">How to Use It?</a></li>

    <li><a href="#ov_tile">More on Tablelist_tile</a></li>
  </ul>

  <h4><a href="#examples">Examples</a></h4>

  <ul>
    <li><a href="#ex_config">A tablelist Widget for Displaying and Editing
    Configuration Options</a></li>

    <li><a href="#ex_browse">Two Widget Browsers Based on a tablelist</a></li>

    <li><a href="#ex_dirViewer">A Directory Viewer Based on a
    tablelist</a></li>

    <li><a href="#ex_styles">Improving the Look &amp; Feel of a tablelist
    Widget</a></li>

    <li><a href="#ex_editing">Advanced Interactive tablelist Cell
    Editing</a></li>

    <li><a href="#ex_windows">A tablelist Widget Containing Embedded
    Windows</a></li>

    <li><a href="#ex_tile">Tile-Based Demo Scripts</a></li>
  </ul>

  <div align="center">
    <p><a href="index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="overview">Overview</h2>

  <h3 id="ov_what">What is Tablelist?</h3>

  <p>Tablelist is a library package for Tcl/Tk versions 8.0 or higher, written
  in pure Tcl/Tk code.&nbsp; It contains:</p>

  <ul>
    <li>the implementation of the <a href=
    "tablelistWidget.html"><b>tablelist</b> mega-widget</a>, including a
    general utility module for mega-widgets;</li>

    <li>a demo script containing a useful procedure that displays the
    configuration options of an arbitrary widget in a tablelist and enables you
    to edit their values interactively;</li>

    <li>a demo script implementing a widget browser based on a tablelist used
    as multi-column listbox;</li>

    <li>a demo script implementing a widget browser based on a tablelist used
    as multi-column tree widget;</li>

    <li>a demo script implementing a directory viewer based on a tablelist used
    as multi-column tree widget;</li>

    <li>a demo script showing several ways to improve the appearance of a
    tablelist widget;</li>

    <li>four further demo scripts, illustrating the interactive cell editing
    with the aid of various widgets from the Tk core and from the packages
    tile, BWidget, Iwidgets, combobox (by Bryan Oakley), and Mentry;</li>

    <li>one further demo script, with a tablelist widget containing embedded
    windows;</li>

    <li>tile-based counterparts of the above-mentioned demo scripts;</li>

    <li>this tutorial;</li>

    <li>reference pages in HTML format.</li>
  </ul>

  <p>A tablelist is a multi-column listbox and tree widget.&nbsp; The width of
  each column can be dynamic (i.e., just large enough to hold all its elements,
  including the header) or static (specified in characters or pixels).&nbsp;
  The columns are, per default, resizable.&nbsp; The alignment of each column
  can be specified as <code>left</code>, <code>right</code>, or
  <code>center</code>.</p>

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

  <p>The Tablelist package provides a great variety of tree styles controlling
  the look &amp; feel of the column that displays the tree hierarchy with the
  aid of indentations and expand/collapse controls.</p>

  <p>Interactive editing of the elements of a tablelist widget can be enabled
  for individual cells and for entire columns.&nbsp; A great variety of widgets
  from the Tk core and from the packages tile, BWidget, Iwidgets, combobox,
  ctext, and Mentry (or Mentry_tile) is supported for being used as embedded
  edit window.&nbsp; In addition, a rich set of keyboard bindings is provided
  for a comfortable navigation between the editable cells.</p>

  <p>The Tcl command corresponding to a tablelist widget is very similar to the
  one associated with a normal listbox.&nbsp; There are column-, row-, and
  cell-specific counterparts of the <code>configure</code> and
  <code>cget</code> subcommands (<code>columnconfigure</code>,
  <code>rowconfigure</code>, <code>cellconfigure</code>, ...).&nbsp; They can
  be used, among others, to insert images into the cells and the header labels,
  or to insert embedded windows into the cells.&nbsp; The <code>index</code>,
  <code>nearest</code>, and <code>see</code> command options refer to the rows,
  but similar subcommands are provided for the columns and cells
  (<code>columnindex</code>, <code>cellindex</code>, ...).&nbsp; The items can
  be sorted with the <code>sort</code>, <code>sortbycolumn</code>, and
  <code>sortbycolumnlist</code> command options.</p>

  <p>The bindings defined for the body of a tablelist widget make it behave
  just like a normal listbox.&nbsp; This includes the support for the virtual
  event <code>&lt;&lt;ListboxSelect&gt;&gt;</code> (which is equivalent to
  <code>&lt;&lt;TablelistSelect&gt;&gt;</code>).&nbsp; In addition, versions
  2.3 or higher of the widget callback package Wcb (written in pure Tcl/Tk code
  as well) can be used to define callbacks for the <code>activate</code>,&nbsp;
  <code>selection set</code>,&nbsp; and&nbsp; <code>selection
  clear</code>&nbsp; commands, and Wcb versions 3.0 or higher also support
  callbacks for the <code>activatecell</code>,&nbsp; <code>cellselection
  set</code>,&nbsp; and&nbsp; <code>cellselection clear</code>&nbsp;
  commands.&nbsp; The download location of Wcb is</p>

  <blockquote>
    <address>
      <a href="http://www.nemethi.de">http://www.nemethi.de</a>
    </address>
  </blockquote>

  <h3 id="ov_get">How to Get It?</h3>

  <p>Tablelist is available for free download from the same URL as Wcb.&nbsp;
  The distribution file is <code>tablelist5.13.tar.gz</code> for UNIX and
  <code>tablelist5_13.zip</code> for Windows.&nbsp; 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.</p>

  <p>Tablelist is also included in tklib, which has the address</p>

  <blockquote>
    <address>
      <a href="http://core.tcl.tk/tklib">http://core.tcl.tk/tklib</a>
    </address>
  </blockquote>

  <h3 id="ov_install">How to Install It?</h3>

  <p>Install the package as a subdirectory of one of the directories given by
  the <code>auto_path</code> variable.&nbsp; For example, you can install it as
  a directory at the same level as the Tcl and Tk script libraries.&nbsp; The
  locations of these library directories are given by the
  <code>tcl_library</code> and <code>tk_library</code> variables,
  respectively.</p>

  <p>To install Tablelist <i>on UNIX</i>, <code>cd</code> to the desired
  directory and unpack the distribution file
  <code>tablelist5.13.tar.gz</code>:</p>

  <blockquote>
    <pre>
gunzip -c tablelist5.13.tar.gz | tar -xf -
</pre>
  </blockquote>

  <p>This command will create a directory named <code>tablelist5.13</code>,
  with the subdirectories <code>demos</code>, <code>doc</code>, and
  <code>scripts</code>.</p>

  <p><i>On Windows</i>, use WinZip or some other program capable of unpacking
  the distribution file <code>tablelist5_13.zip</code> into the directory
  <code>tablelist5.13</code>, with the subdirectories <code>demos</code>,
  <code>doc</code>, and <code>scripts</code>.</p>

  <p>The file <code>tablelistEdit.tcl</code> in the <code>scripts</code>
  directory is only needed for applications making use of interactive cell
  editing.&nbsp; Similarly, the file <code>tablelistMove.tcl</code> in the same
  directory is only required for scripts invoking the <code>move</code> or
  <code>movecolumn</code> command.&nbsp; Finally, the file
  <code>tablelistThemes.tcl</code> is only needed for applications using the
  package Tablelist_tile (see next section).</p>

  <p>Next, you should check the exact version number of your Tcl/Tk
  distribution, given by the <code>tcl_patchLevel</code> and
  <code>tk_patchLevel</code> variables.&nbsp; If you are using Tcl/Tk version
  8.2.X, 8.3.0 - 8.3.2, or 8.4a1, then you should upgrade your Tcl/Tk
  distribution to a higher release.&nbsp; This is because a bug in these Tcl
  versions (fixed in Tcl 8.3.3 and 8.4a2) causes excessive memory use when
  calling&nbsp; <code>info exists</code>&nbsp; on non-existent array elements,
  and Tablelist makes a lot of invocations of this command.</p>

  <p>If for some reason you cannot upgrade your Tcl/Tk version, then you should
  execute the Tcl script <code>repair.tcl</code> in the directory
  <code>scripts</code>.&nbsp; This script makes backup copies of several files
  contained in this directory, and then creates new versions of them by
  replacing all invocations of&nbsp; <code>info exists</code>&nbsp; for array
  elements with a call to the helper procedure
  <code>arrElemExists</code>.&nbsp; The patched files work with all Tcl/Tk
  releases starting with 8.0, but the original ones have a much better
  performance.</p>

  <p>Notice that in tklib the Tablelist <code>demos</code> directory is
  replaced with the subdirectory <code>tablelist</code> of the
  <code>examples</code> directory.&nbsp; Please take this into account when
  reading the <a href="#examples">examples</a> below.</p>

  <h3 id="ov_use">How to Use It?</h3>

  <p>The Tablelist distribution provides two packages, called <b>Tablelist</b>
  and <b>Tablelist_tile</b>.&nbsp; The main difference between the two is that
  Tablelist_tile enables the tile-based, theme-specific appearance of tablelist
  widgets; this package requires Tcl/Tk 8.4 or higher and tile 0.6 or
  higher.&nbsp; It is not possible to use both packages in one and the same
  application, because both are implemented in the same <code>tablelist</code>
  namespace and provide identical commands.</p>

  <p>To be able to access the commands and variables defined in the package
  Tablelist, your scripts must contain one of the lines</p>

  <blockquote>
    <pre>
package require tablelist ?<i>version</i>?
package require Tablelist ?<i>version</i>?
</pre>
  </blockquote>

  <p>You can use either one of the two statements above because the file
  <code>tablelist.tcl</code> contains both lines</p>

  <blockquote>
    <pre>
package provide tablelist ...
package provide Tablelist ...
</pre>
  </blockquote>

  <p>Likewise, to be able to access the commands and variables defined in the
  package Tablelist_tile, your scripts must contain one of the lines</p>

  <blockquote>
    <pre>
package require tablelist_tile ?<i>version</i>?
package require Tablelist_tile ?<i>version</i>?
</pre>
  </blockquote>

  <p>Again, you can use either one of the two statements above because the file
  <code>tablelist_tile.tcl</code> contains both lines</p>

  <blockquote>
    <pre>
package provide tablelist_tile ...
package provide Tablelist_tile ...
</pre>
  </blockquote>

  <p>You are free to remove one of the above lines from
  <code>tablelist.tcl</code> and <code>tablelist_tile.tcl</code>, respectively,
  if you want to prevent the corresponding packages from making themselves
  known under two different names each.&nbsp; Of course, by doing so you
  restrict the argument of&nbsp; <code>package require</code>&nbsp; to a single
  name per package.</p>

  <p>Please note that <b>ActiveTcl versions 8.5 and later use a modified
  package mechanism, which only exports the all-lowercase names
  <code>tablelist</code> and <code>tablelist_tile</code></b>.</p>

  <p><b>REMARK:</b>&nbsp; If you have an earlier Tablelist version as part of
  ActiveTcl 8.5 or above and the new Tablelist release 5.13, then it is highly
  recommended to specify the version number <code>5.13</code> in the&nbsp;
  <code>package require</code>&nbsp; command, because otherwise the interpreter
  will load the old Tablelist version included in ActiveTcl as Tcl
  Module.&nbsp; The <a href="#examples">examples</a> below use the
  statement&nbsp; <code>package require tablelist 5.13</code>,&nbsp; and their
  tile-based counterparts invoke the command&nbsp; <code>package require
  tablelist_tile 5.13</code>.</p>

  <p>Since the packages Tablelist and Tablelist_tile are implemented in the
  <code>tablelist</code> namespace, you must either invoke the</p>

  <blockquote>
    <pre>
namespace import tablelist::<i>pattern</i> ?tablelist::<i>pattern ...</i>?
</pre>
  </blockquote>

  <p>command to import the <i>procedures</i> you need, or use qualified names
  like <code>tablelist::tablelist</code>.&nbsp; In the examples below we have
  chosen the latter approach.</p>

  <p>To access Tablelist <i>variables</i>, you <i>must</i> use qualified
  names.&nbsp; There are only three Tablelist variables (and one more when
  using Tablelist_tile) that are designed to be accessed outside the namespace
  <code>tablelist</code>:</p>

  <ul>
    <li>The variable <code>tablelist::version</code> holds the current version
    number of the Tablelist and Tablelist_tile packages.</li>

    <li>The variable <code>tablelist::library</code> holds the location of the
    Tablelist installation directory.</li>

    <li>The read-only variable <code>tablelist::usingTile</code> has the value
    <code>0</code> in the package Tablelist and the value <code>1</code> in
    Tablelist_tile.</li>

    <li>In Tablelist_tile the array <code>tablelist::themeDefaults</code> holds
    the theme-specific default values of a series of Tablelist configuration
    options.</li>
  </ul>

  <h3 id="ov_tile">More on Tablelist_tile</h3>

  <p>A tablelist widget consists of a body (containing the items) and a header
  (displaying the column titles).&nbsp; Both components are contained in a
  hull, implemented as a frame.&nbsp; The header has a rather complex
  structure, consisting mainly of frame and label widgets.&nbsp; 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.&nbsp; 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.</p>

  <p>From the above it follows that <b>the package Tablelist_tile will only
  work as expected if the Tk <code>frame</code> and <code>label</code> commands
  haven't been overridden by using&nbsp; <code>namespace import -force
  ttk::*</code>&nbsp; at global scope</b>.&nbsp; While earlier tile releases
  suggested using this command at global scope for the really adventurous, in
  newer tile versions this is considered a Really Bad Idea, causing many things
  to break.&nbsp; Instead, <b>you should explicitly invoke
  <code>ttk::frame</code>, <code>ttk::label</code>, etc. whenever you want to
  use a tile widget</b>.</p>

  <p><b>Overriding some other Tk widgets at global scope may be equally
  dangerous when using various widgets from the Tk core and from the packages
  BWidget, Iwidgets, combobox (by Bryan Oakley), ctext, and Mentry for
  interactive cell editing</b>, because these packages expect Tk widgets, which
  may not always be replaced by their tile counterparts.</p>

  <p>Another restriction to be taken into account (as of tile version 0.8) is
  due to the fact that the&nbsp; <code>(ttk::)style theme use</code>&nbsp;
  command can only be used to set the current theme, but not to retrieve
  it.&nbsp; For this reason, the package Tablelist_tile makes use of the
  variable <code>ttk::currentTheme</code> or <code>tile::currentTheme</code>
  (depending on the tile version), which is set by the
  <code>ttk::setTheme</code> or <code>tile::setTheme</code> procedure.&nbsp;
  From this it follows that <b>the tile-based tablelist widgets will only have
  the expected appearance if the platform-specific default theme is either left
  unchanged or replaced with another theme by invoking the procedure
  <code>ttk::setTheme</code> or <code>tile::setTheme</code>, depending on the
  current tile version</b>.&nbsp; (See also the <code><a href=
  "tablelistThemes.html#setTheme">tablelist::setTheme</a></code> command.)</p>

  <p>After these cautions concerning the use of tile, the rest of this section
  describes the differences between the packages Tablelist and
  Tablelist_tile.</p>

  <p>The Tablelist_tile package checks whether the required Tcl, Tk, and tile
  versions are present, by executing the commands</p>

  <blockquote>
    <pre>
package require Tcl 8.4
package require Tk  8.4
if {$::tk_version &lt; 8.5 || [regexp {^8\.5a[1-5]$} $::tk_patchLevel]} {
    package require tile 0.6
}
</pre>
  </blockquote>

  <p>The last command above reflects the fact that, beginning with Tk 8.5a6,
  tile is integrated into the Tk core and therefore it should only be loaded
  explicitly when using an earlier Tk version.</p>

  <p>Apart from this and the <code>_tile</code> suffix in the&nbsp;
  <code>package require</code>&nbsp; command, the only difference (from the
  programmer's point of view) between the packages Tablelist and Tablelist_tile
  is related to the supported configuration options:&nbsp; The
  <code>-highlightbackground</code>, <code>-highlightcolor</code>,
  <code>-highlightthickness</code>, <code>-labelbackground</code>,
  <code>-labelactivebackground</code>, <code>-labelactiveforeground</code>,
  <code>-labeldisabledforeground</code>, and <code>-labelheight</code> options
  (the latter at both widget and column levels), present in the Tablelist
  package, are not supported by Tablelist_tile.&nbsp; The first three are
  standard Tk widget options that are not available for tile widgets.&nbsp; The
  <code>-labelbackground</code> option stands for the <code>-background</code>
  option of the column labels, and current versions of the tile engine don't
  support setting the background color for these widgets with a special header
  layout.&nbsp; The remaining options stand for the
  <code>-activebackground</code>, <code>-activeforeground</code>,
  <code>-disabledforeground</code>, and <code>-height</code> options of the
  column labels, and these configuration options are not supported for tile
  label widgets.</p>

  <p>Also, take into account that in some themes, setting the
  <code>-labelborderwidth</code> option (at widget or column level) to a value
  other than the default might be ignored by tile and thus could cause
  alignment problems.&nbsp; This is because the border of tile widgets is drawn
  with theme-specific methods, which will not always produce the results known
  from Tk widgets.</p>

  <p>Finally, notice that, when using the <code>tileqt</code> theme, the
  version number of the <code>tile::theme::tileqt</code> package must be 0.4 or
  higher, and <code>tileqt</code> itself won't work with tile versions earlier
  than 0.7.</p>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="examples">Examples</h2>

  <h3 id="ex_config">A tablelist Widget for Displaying and Editing
  Configuration Options</h3>

  <p>The file <code>config.tcl</code> in the <code>demos</code> directory
  contains a procedure <code>demo::displayConfig</code> 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.&nbsp;
  This procedure can prove to be quite useful during interactive GUI
  development.&nbsp; To test it, start <code>wish</code> and evaluate the file
  by using the <code>source</code> command as follows:</p>

  <ul>
    <li>If <code>wish</code> was started in the <code>demos</code> directory
    then it is sufficient to enter

      <blockquote>
        <pre>
source config.tcl
</pre>
      </blockquote>
    </li>

    <li>If <code>wish</code> was started in some other directory then you can
    use the <code>tablelist::library</code> variable to find the location of
    the file.&nbsp; For example, assuming that your Tablelist installation has
    the directory structure described in the <a href="#ov_install">How to
    install it?</a> section, the required commands are:

      <blockquote>
        <pre>
package require tablelist 5.13
source [file join $tablelist::library demos config.tcl]
</pre>
      </blockquote>
    </li>
  </ul>

  <p>In both cases, the script will print the following message to
  <code>stdout</code>:</p>

  <blockquote>
    <pre>
To display the configuration options of an arbitrary widget, enter

        demo::displayConfig &lt;widgetName&gt;
</pre>
  </blockquote>

  <p>The result looks like in the following figure:</p>

  <blockquote>
    <img src="config.png" alt="Configuration Options" width="825" height=
    "367">
  </blockquote>

  <p>It is assumed that the Tcl command associated with the widget specified by
  <code>&lt;widgetName&gt;</code> has a <code>configure</code> subcommand
  which, when invoked without any argument, returns a list describing all of
  the available configuration options for the widget, in the common format
  known from the standard Tk widgets.&nbsp; The
  <code>demo::displayConfig</code> procedure inserts the items of this list
  into a scrolled tablelist with 5 dynamic-width columns and interactive sort
  capability, and returns the name of the newly created tablelist widget:</p>

  <blockquote>
    <pre>
package require tablelist 5.13

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:
    #
    # Name              Class
    # -----------------------------
    # tf                Frame
    #   tbl               Tabellist
    #   vsb, hsb          Scrollbar
    # bf                Frame
    #   b1, b2, b3        Button
    #
    variable winSys
    if {[catch {tk windowingsystem} winSys] != 0} {
        switch $::tcl_platform(platform) {
            unix        { set winSys x11 }
            windows     { set winSys win32 }
            macintosh   { set winSys classic }
        }
    }
    if {[string compare $winSys "x11"] == 0} {
        #
        # Create the font TkDefaultFont if not yet present
        #
        catch {font create TkDefaultFont -family Helvetica -size -12}

        option add *DemoTop*Font                        TkDefaultFont
        option add *DemoTop*selectBackground            #678db2
        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.tbl.background               white
    option add *DemoTop.tf.tbl.stripeBackground         #e4e8ec
    option add *DemoTop.tf.tbl.setGrid                  yes
    option add *DemoTop.tf.tbl*Entry.background         white
    option add *DemoTop.bf.Button.width                 10
}

#------------------------------------------------------------------------------
# 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
# tablelist widget.
#------------------------------------------------------------------------------
proc demo::displayConfig w {
    if {![winfo exists $w]} {
        bell
        tk_messageBox -title "Error" -icon error -message \
            "Bad window path name \"$w\""
        return ""
    }

    #
    # Create a top-level widget of the class DemoTop
    #
    set top .configTop
    for {set n 2} {[winfo exists $top]} {incr n} {
        set top .configTop$n
    }
    toplevel $top -class DemoTop
    wm title $top "Configuration Options of the [winfo class $w] Widget \"$w\""

    #
    # Create a scrolled tablelist widget with 5 dynamic-width
    # columns and interactive sort capability within the top-level
    #
    set tf $top.tf
    frame $tf
    set tbl $tf.tbl
    set vsb $tf.vsb
    set hsb $tf.hsb
    tablelist::tablelist $tbl \
        -columns {0 "Command-Line Name"
                  0 "Database/Alias Name"
                  0 "Database Class"
                  0 "Default Value"
                  0 "Current Value"} \
        -labelcommand tablelist::sortByColumn -sortcommand demo::compareAsSet \
        -editendcommand demo::applyValue -height 15 -width 100 -stretch all \
        -xscrollcommand [list $hsb set] -yscrollcommand [list $vsb set]
    if {[$tbl cget -selectborderwidth] == 0} {
        $tbl configure -spacing 1
    }
    $tbl columnconfigure 3 -maxwidth 30
    $tbl columnconfigure 4 -maxwidth 30 -editable yes
    scrollbar $vsb -orient vertical   -command [list $tbl yview]
    scrollbar $hsb -orient horizontal -command [list $tbl xview]

    #
    # Create three buttons within a frame child of the top-level widget
    #
    set bf $top.bf
    frame $bf
    set b1 $bf.b1
    set b2 $bf.b2
    set b3 $bf.b3
    button $b1 -text "Refresh"     -command [list demo::putConfig $w $tbl]
    button $b2 -text "Sort as Set" -command [list $tbl sort]
    button $b3 -text "Close"       -command [list destroy $top]

    #
    # Manage the widgets
    #
    grid $tbl -row 0 -rowspan 2 -column 0 -sticky news
    variable winSys
    if {[string compare $winSys "aqua"] == 0} {
        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
    grid columnconfigure $tf 0 -weight 1
    pack $b1 $b2 $b3 -side left -expand yes -pady 10
    pack $bf -side bottom -fill x
    pack $tf -side top -expand yes -fill both

    #
    # Populate the tablelist with the configuration options of the given widget
    #
    putConfig $w $tbl
    return $tbl
}
</pre>
  </blockquote>

  <p>The procedure invokes the <code><a href=
  "tablelistWidget.html">tablelist::tablelist</a></code> command to create a
  tablelist widget.&nbsp; The value of the <code><a href=
  "tablelistWidget.html#columns">-columns</a></code> option passed to this
  command specifies the widths, titles, and alignments of the 5 columns.&nbsp;
  The width of each column is given as <code>0</code>, specifying that the
  column's width is to be made just large enough to hold all the elements in
  the column, including its title, which is the string following the
  width.&nbsp; We have omitted the alignment specifications (which can
  optionally follow the titles), because the columns shall all be
  left-justified.</p>

  <p>Since all columns are of dynamic width and left-aligned, instead of
  <code>-columns</code> we could have used the <code><a href=
  "tablelistWidget.html#columntitles">-columntitles</a></code> option as
  follows:</p>

  <blockquote>
    <pre>
    tablelist::tablelist $tbl \
        -columntitles {"Command-Line Name"
                       "Database/Alias Name"
                       "Database Class"
                       "Default Value"
                       "Current Value"} \
        . . .
</pre>
  </blockquote>

  <p>The command <code><a href=
  "tablelistColSort.html#sortByColumn">tablelist::sortByColumn</a></code>,
  specified as the value of the <code><a href=
  "tablelistWidget.html#labelcommand">-labelcommand</a></code> option, will be
  invoked whenever mouse button 1 is released over one of the labels.&nbsp;
  This command sorts the items based on the column corresponding to that label,
  in the right order, by invoking the <code><a href=
  "tablelistWidget.html#sortbycolumn">sortbycolumn</a></code> subcommand of the
  Tcl command associated with the tablelist widget.</p>

  <p>As seen from the creation of the button displaying the text&nbsp;
  <code>"Sort as Set"</code>,&nbsp; the items will also be sorted by invoking
  the <code><a href="tablelistWidget.html#sort">sort</a></code>
  subcommand.&nbsp; This makes it necessary to specify a command to be used for
  the comparison of the items, as the value of the <code><a href=
  "tablelistWidget.html#sortcommand">-sortcommand</a></code> option.&nbsp; In
  our example this is the <code>demo::compareAsSet</code> procedure shown
  below.</p>

  <p>The <code><a href=
  "tablelistWidget.html#editendcommand">-editendcommand</a></code> 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
  temporary embedded entry widget used for the editing are different from its
  original one.&nbsp; Per default, the elements of a tablelist widget can only
  be edited programmatically, but we enable the interactive editing for the
  cells of the last column with the aid of the <code><a href=
  "tablelistWidget.html#col_editable">-editable</a></code> column configuration
  option.</p>

  <p>By specifying the value <code>all</code> for the <code><a href=
  "tablelistWidget.html#stretch">-stretch</a></code> configuration option we
  make sure that all of the columns will be stretched to eliminate the blank
  space that might appear at the right of the table.</p>

  <p>If the default value of the <code>-selectborderwidth</code> option is
  <code>0</code> (this is the case on the Windows and Macintosh platforms, and
  also in an X11 envronment with Tk 8.5 or above) then we use the
  <code><a href="tablelistWidget.html#spacing">-spacing</a></code> option to
  provide some additional space above and below the rows.</p>

  <p>For the last two columns of the tablelist we use the <code><a href=
  "tablelistWidget.html#col_maxwidth">-maxwidth</a></code> column configuration
  option, to make sure that the dynamic widths of these columns won't exceed 30
  average-width characters.</p>

  <p>Besides the options given on the command line, our tablelist widget will
  automatically inherit the ones contained in the Tk option database entries
  specified in the namespace initialization preceding the
  <code>demo::displayConfig</code> procedure.&nbsp; The database name
  <code>stripeBackground</code> corresponds to the <code><a href=
  "tablelistWidget.html#stripebackground">-stripebackground</a></code>
  configuration option.&nbsp; According to this entry, every other row of the
  tablelist widget will be displayed in the background color
  <code>#e4e8ec</code>, which improves the readability of the items and gives
  the widget a nice appearance.</p>

  <p>The option database entries given for the windowing systems other than
  <code>x11</code> are implicitly used when managing the tablelist widget and
  the two scrollbars with the aid of <code>grid</code>.&nbsp; Notice how the
  <code><a href="tablelistWidget.html#cornerpath">cornerpath</a></code>
  subcommand enables us to achieve a native look &amp; feel with respect to the
  vertical scrollbar on the windowing system <code>aqua</code>.</p>

  <p>We populate the tablelist by invoking the <code>demo::putConfig</code>
  procedure discussed below.&nbsp; The same script is associated with the
  <b>Refresh</b> button, as the value of its <code>-command</code>
  configuration option.&nbsp; This procedure is implemented as follows:</p>

  <blockquote>
    <pre>
#------------------------------------------------------------------------------
# demo::putConfig
#
# Outputs the configuration options of the widget w into the tablelist widget
# tbl.
#------------------------------------------------------------------------------
proc demo::putConfig {w tbl} {
    if {![winfo exists $w]} {
        bell
        tk_messageBox -title "Error" -icon error -message \
            "Bad window path name \"$w\"" -parent [winfo toplevel $tbl]
        return ""
    }

    #
    # Display the configuration options of w in the tablelist widget tbl
    #
    $tbl delete 0 end
    foreach configSet [$w configure] {
        #
        # Insert the list configSet into the tablelist widget
        #
        $tbl insert end $configSet

        if {[llength $configSet] == 2} {
            $tbl rowconfigure end -foreground gray50 -selectforeground gray75
            $tbl cellconfigure end -editable no
        } else {
            #
            # Change the colors of the first and last cell of the row
            # if the current value is different from the default one
            #
            set default [lindex $configSet 3]
            set current [lindex $configSet 4]
            if {[string compare $default $current] != 0} {
                foreach col {0 4} {
                    $tbl cellconfigure end,$col \
                         -foreground red -selectforeground yellow
                }
            }
        }
    }

    $tbl sortbycolumn 0
    $tbl activate 0
    $tbl attrib widget $w
}
</pre>
  </blockquote>

  <p>After deleting the current items of the tablelist widget <code>tbl</code>,
  the procedure inserts the items of the list returned by the
  <code>configure</code> subcommand of the Tcl command associated with the
  widget <code>w</code>.&nbsp; For each option that is merely an abbreviated
  form of some other one, we use the <code><a href=
  "tablelistWidget.html#rowconfigure">rowconfigure</a></code> tablelist
  subcommand to change the normal and selection foreground colors of the item
  just appended, and we disable the interactive editing in the last inserted
  cell by using the <code><a href=
  "tablelistWidget.html#cell_editable">-editable</a></code> cell configuration
  option.&nbsp; The <code><a href=
  "tablelistWidget.html#cellconfigure">cellconfigure</a></code> tablelist
  operation is also invoked for each real option whose current value is
  different from the default one, to change the values of the
  <code>-foreground</code> and <code>-selectforeground</code> options of the
  cells no. 0 and 4, containing the command-line name of the option and its
  current value.</p>

  <p>Each tablelist widget may have any number of private <b>attributes</b>,
  which can be set and retrieved with the aid of the <code><a href=
  "tablelistWidget.html#attrib">attrib</a></code> subcommand of the Tcl command
  corresponding to the widget.&nbsp; The <code>demo::putConfig</code> procedure
  sets the <code>widget</code> attribute to the name of the widget whose
  options are displayed in the tablelist.</p>

  <p>The implementation of the comparison command
  <code>demo::compareAsSet</code> mentioned above is quite simple:</p>

  <blockquote>
    <pre>
#------------------------------------------------------------------------------
# demo::compareAsSet
#
# Compares two items of a tablelist widget used to display the configuration
# options of an arbitrary widget.  The item in which the current value is
# different from the default one is considered to be less than the other; if
# both items fulfil this condition or its negation then string comparison is
# applied to the two option names.
#------------------------------------------------------------------------------
proc demo::compareAsSet {item1 item2} {
    foreach {opt1 dbName1 dbClass1 default1 current1} $item1 \
            {opt2 dbName2 dbClass2 default2 current2} $item2 {
        set changed1 [expr {[string compare $default1 $current1] != 0}]
        set changed2 [expr {[string compare $default2 $current2] != 0}]
        if {$changed1 == $changed2} {
            return [string compare $opt1 $opt2]
        } elseif {$changed1} {
            return -1
        } else {
            return 1
        }
    }
}
</pre>
  </blockquote>

  <p>Finally, here is the implementation of the <code>demo::applyValue</code>
  procedure, specified as the value of the <code>-editendcommand</code>
  option:</p>

  <blockquote>
    <pre>
#------------------------------------------------------------------------------
# demo::applyValue
#
# Applies the new value of the configuraton option contained in the given row
# of the tablelist widget tbl to the widget whose options are displayed in it,
# and updates the colors of the first and last cell of the row.
#------------------------------------------------------------------------------
proc demo::applyValue {tbl row col text} {
    #
    # Try to apply the new value of the option contained in
    # the given row to the widget whose options are displayed
    # in the tablelist; reject the value if the attempt fails
    #
    set w [$tbl attrib widget]
    set opt [$tbl cellcget $row,0 -text]
    if {[catch {$w configure $opt $text} result] != 0} {
        bell
        tk_messageBox -title "Error" -icon error -message $result \
            -parent [winfo toplevel $tbl]
        $tbl rejectinput
        return ""
    }

    #
    # Replace the new option value with its canonical form and
    # update the colors of the first and last cell of the row
    #
    set text [$w cget $opt]
    set default [$tbl cellcget $row,3 -text]
    if {[string compare $default $text] == 0} {
        foreach col {0 4} {
            $tbl cellconfigure $row,$col \
                 -foreground "" -selectforeground ""
        }
    } else {
        foreach col {0 4} {
            $tbl cellconfigure $row,$col \
                 -foreground red -selectforeground yellow
        }
    }

    return $text
}
</pre>
  </blockquote>

  <p>The procedure retrieves the name of the widget whose options are displayed
  in the tablelist, as the value of its <code>widget</code> attribute, and
  invokes the <code><a href="tablelistWidget.html#cellcget">cellcget</a></code>
  tablelist subcommand to get the name of the option specified in the first
  cell of the row whose last element was just edited.&nbsp; Next, it tries to
  apply the new value of the option to the widget, and invokes the
  <code><a href="tablelistWidget.html#rejectinput">rejectinput</a></code>
  subcommand if the attempt fails.&nbsp; Otherwise it replaces the new option
  value with its canonical form and updates the normal and selection foreground
  colors of the cells no. 0 and 4.&nbsp; The canonical form of the option value
  is given by the <code>cget</code> subcommand of the Tcl command associated
  with that widget.&nbsp; For example, a boolean value will always be replaced
  with <code>1</code> or <code>0</code>, even if the entry contains the string
  <code>yes</code> or <code>no</code>.&nbsp; 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.</p>

  <h3 id="ex_browse">Two Widget Browsers Based on a tablelist</h3>

  <p>The files <code>browse.tcl</code> and <code>browseTree.tcl</code> in the
  <code>demos</code> directory contain a procedure
  <code>demo::displayChildren</code> that displays information about the
  children of an arbitrary widget in a tablelist contained in a newly created
  top-level widget.&nbsp; To test it, start <code>wish</code> and evaluate the
  chosen file by using the <code>source</code> command, in a similar way as in
  the case of the <a href="#ex_config">previous example</a>.</p>

  <p>Both scripts will print the following message to <code>stdout</code>:</p>

  <blockquote>
    <pre>
To display information about the children of an arbitrary widget, enter

        demo::displayChildren &lt;widgetName&gt;
</pre>
  </blockquote>

  <p>The tablelist created by the procedure <code>demo::displayChildren</code>
  in the file <code>browse.tcl</code> is a multi-column listbox:</p>

  <blockquote>
    <img src="browse.png" alt="Widget Browser" width="595" height="269">
  </blockquote>

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

  <blockquote>
    <img src="browseTree.png" alt="Widget Browser" width="621" height="269">
  </blockquote>

  <p>The <code>demo::displayChildren</code> command inserts some data of the
  children of the widget specified by <code>&lt;widgetName&gt;</code> into a
  vertically scrolled tablelist with 9 dynamic-width columns and interactive
  sort capability, and returns the name of the newly created tablelist
  widget.&nbsp; By double-clicking an item or invoking the first entry of a
  pop-up menu within the body of the tablelist, you can display the data of the
  children of the widget corresponding to the selected item, and with the
  second menu entry you can display its configuration options (see the <a href=
  "#ex_config">previous example</a> for details).&nbsp; To go one level up,
  click on the <b>Parent</b> button.</p>

  <p>There is a lot of code common to the scripts <code>browse.tcl</code> and
  <code>browseTree.tcl</code>.&nbsp; We will restrict the description below to
  the second one, which requires Tk 8.3 or later, due to the use of several
  tree-related tablelist options and subcommands.</p>

  <blockquote>
    <pre>
package require Tk 8.3
package require tablelist 5.13

namespace eval demo {
    variable dir [file dirname [info script]]

    #
    # Create two images, needed in the procedure putChildren
    #
    variable leafImg [image create bitmap -file [file join $dir leaf.xbm] \
                      -background coral -foreground gray50]
    variable compImg [image create bitmap -file [file join $dir comp.xbm] \
                      -background yellow -foreground gray50]
}

source [file join $demo::dir config.tcl]

#------------------------------------------------------------------------------
# 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
# tablelist widget.
#------------------------------------------------------------------------------
proc demo::displayChildren w {
    if {![winfo exists $w]} {
        bell
        tk_messageBox -title "Error" -icon error -message \
            "Bad window path name \"$w\""
        return ""
    }

    #
    # Create a top-level widget of the class DemoTop
    #
    set top .browseTop
    for {set n 2} {[winfo exists $top]} {incr n} {
        set top .browseTop$n
    }
    toplevel $top -class DemoTop

    #
    # Create a vertically scrolled tablelist widget with 9 dynamic-width
    # columns and interactive sort capability within the top-level
    #
    set tf $top.tf
    frame $tf
    set tbl $tf.tbl
    set vsb $tf.vsb
    tablelist::tablelist $tbl \
        -columns {0 "Path Name" left
                  0 "Class"     left
                  0 "X"         right
                  0 "Y"         right
                  0 "Width"     right
                  0 "Height"    right
                  0 "Mapped"    center
                  0 "Viewable"  center
                  0 "Manager"   left} \
        -expandcommand demo::expandCmd -labelcommand demo::labelCmd \
        -yscrollcommand [list $vsb set] -setgrid no -width 0
    if {[$tbl cget -selectborderwidth] == 0} {
        $tbl configure -spacing 1
    }
    foreach col {2 3 4 5} {
        $tbl columnconfigure $col -sortmode integer
    }
    foreach col {6 7} {
        $tbl columnconfigure $col -formatcommand demo::formatBoolean
    }
    scrollbar $vsb -orient vertical -command [list $tbl yview]

    #
    # When displaying the information about the children of any
    # ancestor of the label widgets, the widths of some of the
    # labels and thus also the widths and x coordinates of some
    # children may change.  For this reason, make sure the items
    # will be updated after any change in the sizes of the labels
    #
    foreach l [$tbl labels] {
        bind $l &lt;Configure&gt; [list demo::updateItemsDelayed $tbl]
    }
    bind $tbl &lt;Configure&gt; [list demo::updateItemsDelayed $tbl]

    #
    # Create a pop-up menu with two command entries; bind the script
    # associated with its first entry to the &lt;Double-1&gt; event, too
    #
    set menu $top.menu
    menu $menu -tearoff no
    $menu add command -label "Display Children" \
                      -command [list demo::putChildrenOfSelWidget $tbl]
    $menu add command -label "Display Config" \
                      -command [list demo::dispConfigOfSelWidget $tbl]
    set bodyTag [$tbl bodytag]
    bind $bodyTag &lt;Double-1&gt;   [list demo::putChildrenOfSelWidget $tbl]
    bind $bodyTag &lt;&lt;Button3&gt;&gt;  [bind TablelistBody &lt;Button-1&gt;]
    bind $bodyTag &lt;&lt;Button3&gt;&gt; +[bind TablelistBody &lt;ButtonRelease-1&gt;]
    bind $bodyTag &lt;&lt;Button3&gt;&gt; +[list demo::postPopupMenu $top %X %Y]

    #
    # Create three buttons within a frame child of the top-level widget
    #
    set bf $top.bf
    frame $bf
    set b1 $bf.b1
    set b2 $bf.b2
    set b3 $bf.b3
    button $b1 -text "Refresh"
    button $b2 -text "Parent"
    button $b3 -text "Close" -command [list destroy $top]

    #
    # Manage the widgets
    #
    . . .

    #
    # Populate the tablelist with the data of the given widget's children
    #
    putChildren $w $tbl root
    return $tbl
}
</pre>
  </blockquote>

  <p>The procedure invokes the <code><a href=
  "tablelistWidget.html">tablelist::tablelist</a></code> command to create a
  tablelist widget.&nbsp; The value of the <code><a href=
  "tablelistWidget.html#columns">-columns</a></code> option passed to this
  command specifies the widths, titles, and alignments of the 9 columns.&nbsp;
  The width of each column is given as <code>0</code>, specifying that the
  column's width is to be made just large enough to hold all the elements in
  the column, including its title, which is the string following the
  width.&nbsp; Each of the titles is followed by an alignment, which indicates
  how to justify both the elements and the title of the respective column.</p>

  <p>We want to display not only the data of the given widget's children, but
  also those of its further descendants.&nbsp; To this end, we need a command
  to be invoked whenever an item corresponding to a widget with children gets
  expanded.&nbsp; This command is specified as the value of the <code><a href=
  "tablelistWidget.html#expandcommand">-expandcommand</a></code> option.&nbsp;
  As discussed later, the <code>demo::expandCmd</code> procedure will insert
  the children of the row that is about to be expanded, if it has no children
  yet.</p>

  <p>The command <code>demo::labelCmd</code>, specified as the value of the
  <code><a href="tablelistWidget.html#labelcommand">-labelcommand</a></code>
  option, will be invoked whenever mouse button 1 is released over one of the
  labels.&nbsp; We will discuss this procedure later.</p>

  <p>We specify the value <code>0</code> for the widget's <code><a href=
  "tablelistWidget.html#width">-width</a></code> option, meaning that the
  tablelist's width shall be made just large enough to hold all its
  columns.</p>

  <p>After creating the tablelist widget, we make sure that the elements of its
  columns 2, 3, 4, and 5 (displaying the x and y coordinates as well as the
  widths and heights of the children) will be compared as integers when sorting
  the items based on one of these columns.&nbsp; We do this with the aid of the
  <code><a href=
  "tablelistWidget.html#columnconfigure">columnconfigure</a></code> tablelist
  operation.</p>

  <p>The same <code>columnconfigure</code> subcommand enables us to specify
  that, when displaying the elements of columns 6 and 7 (having the titles
  <code>"Mapped"</code> and <code>"Viewable"</code>, respectively), the boolean
  values <code>1</code> and <code>0</code> will be replaced with the strings
  <code>"yes"</code> and <code>"no"</code>, returned by the
  <code>demo::formatBoolean</code> command shown below.</p>

  <p>After creating the vertical scrollbar, we iterate over the elements of the
  list containing the path names of all header labels of the tablelist widget,
  returned by the <code><a href="tablelistWidget.html#labels">labels</a></code>
  subcommand of the Tcl command corresponding to the widget.&nbsp; For each
  element of the list, we bind the procedure
  <code>demo::updateItemsDelayed</code> to the <code>&lt;Configure&gt;</code>
  event.&nbsp; In this way we make sure the procedure will be invoked whenever
  the header label indicated by that list element changes size.</p>

  <p>The four invocations of the <code>bind</code> command following the
  creation of the pop-up menu make use of a binding tag whose name depends on
  the path name of the tablelist widget and is returned by the <code><a href=
  "tablelistWidget.html#bodytag">bodytag</a></code> subcommand of the Tcl
  command associated with the tablelist widget.&nbsp; The advantage of using
  this tag instead of the path name of the tablelist's body is that this
  binding tag is associated not only with the body but also with the separator
  frames and with the labels displaying embedded images.&nbsp; This is
  important in our example because we want to make sure the
  <code>&lt;&lt;Button3&gt;&gt;</code> and <code>&lt;Double-1&gt;</code> events
  will be handled in the same way within a label containing an embedded image
  as in the rest of the tablelist's body.&nbsp; Both the <code><a href=
  "tablelistWidget.html#button3">&lt;&lt;Button3&gt;&gt;</a></code> virtual
  event (used in the first three <code>bind</code> commands) and the
  <code><a href="tablelistWidget.html#body_bindings">TablelistBody</a></code>
  binding tag (used in the first binding script) are created by the Tablelist
  package.&nbsp; The first three <code>bind</code> commands make sure that a
  <code>&lt;&lt;Button3&gt;&gt;</code> virtual event will select and activate
  the nearest item and will post a pop-up menu with two command entries that
  refer to the widget described by that item.</p>

  <p>We populate the tablelist by invoking the <code>demo::putChildren</code>
  procedure, implemented as follows:</p>

  <blockquote id="putChildren">
    <pre>
#------------------------------------------------------------------------------
# demo::putChildren
#
# Outputs the data of the children of the widget w into the tablelist widget
# tbl, as child items of the one identified by nodeIdx.
#------------------------------------------------------------------------------
proc demo::putChildren {w tbl nodeIdx} {
    . . .

    if {[string compare $nodeIdx "root"] == 0} {
        set top [winfo toplevel $tbl]
        wm title $top "Children of the [winfo class $w] Widget \"$w\""

        $tbl resetsortinfo
        $tbl delete 0 end
        set row 0
    } else {
        set row [expr {$nodeIdx + 1}]
    }

    #
    # Display the data of the children of the
    # widget w in the tablelist widget tbl
    #
    variable leafImg
    variable compImg
    foreach c [winfo children $w] {
        #
        # Insert the data of the current child into the tablelist widget
        #
        set item {}
        lappend item \
                [winfo name $c] [winfo class $c] [winfo x $c] [winfo y $c] \
                [winfo width $c] [winfo height $c] [winfo ismapped $c] \
                [winfo viewable $c] [winfo manager $c]
        $tbl insertchild $nodeIdx end $item

        #
        # Insert an image into the first cell of the row; mark the
        # row as collapsed if the child widget has children itself
        #
        if {[llength [winfo children $c]] == 0} {
            $tbl cellconfigure end,0 -image $leafImg
        } else {
            $tbl cellconfigure end,0 -image $compImg
            $tbl collapse $row
        }

        $tbl rowattrib $row pathName $c
        incr row
    }

    if {[string compare $nodeIdx "root"] == 0} {
        #
        # Configure the "Refresh" and "Parent" buttons
        #
        $top.bf.b1 configure -command [list demo::refreshView $w $tbl]
        set b2 $top.bf.b2
        set p [winfo parent $w]
        if {[string compare $p ""] == 0} {
            $b2 configure -state disabled
        } else {
            $b2 configure -state normal -command \
                [list demo::putChildren $p $tbl root]
        }
    }
}
</pre>
  </blockquote>

  <p>The last argument of this procedure indicates the tree node to become the
  parent of the items displaying the data of the children of the widget passed
  as first argument.&nbsp; If this parent is the invisible <code>root</code>
  node then we first reset the sorting information by invoking the
  <code><a href="tablelistWidget.html#resetsortinfo">resetsortinfo</a></code>
  tablelist subcommand and delete the current items of the tablelist widget
  <code>tbl</code>.&nbsp; The procedure then iterates over the children of the
  specified widget and inserts the items built from some data retrieved by
  using the <code>winfo</code> command.&nbsp; Each new item is added to the end
  of the parent node's list of children with the aid of the <code><a href=
  "tablelistWidget.html#insertchildren">insertchild(ren)</a></code>
  subcommand.</p>

  <p>For each child widget, we invoke the <code><a href=
  "tablelistWidget.html#cellconfigure">cellconfigure</a></code> tablelist
  operation to set the value of the <code>-image</code> option of the
  corresponding row's first cell, containing the leaf name of the child.&nbsp;
  In this way, the procedure inserts the image <code>$leafImg</code> or
  <code>$compImg</code> into the first cell, depending on whether the child in
  question is a leaf or a composite widget.&nbsp; (Remember that both images
  were created outside this procedure, within the initialization of the
  <code>demo</code> namespace.)</p>

  <p>We mark every newly created row corresponding to a child widget that has
  children itself as collapsed by invoking the <code><a href=
  "tablelistWidget.html#collapse">collapse</a></code> subcommand.&nbsp; This
  will prepend an expand/collapse control to the contents of the first column,
  whose column index <code>0</code> is the default value of the <code><a href=
  "tablelistWidget.html#treecolumn">-treecolumn</a></code> configuration
  option.</p>

  <p>We use the <code><a href=
  "tablelistWidget.html#rowattrib">rowattrib</a></code> tablelist subcommand to
  remember the full path name of every child widget as a private attribute
  associated with the corresponding tablelist row, because it will be needed at
  several places later on.</p>

  <p>As mentioned above, the <code>demo::expandCmd</code> procedure will be
  invoked automatically when expanding a row that contains an expand/collapse
  control:</p>

  <blockquote>
    <pre>
------------------------------------------------------------------------------
# demo::expandCmd
#
# Outputs the data of the children of the widget 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.
#------------------------------------------------------------------------------
proc demo::expandCmd {tbl row} {
    if {[$tbl childcount $row] == 0} {
        set w [$tbl rowattrib $row pathName]
        putChildren $w $tbl $row

        #
        # Apply the last sorting (if any) to the new items
        #
        $tbl refreshsorting $row
    }
}
</pre>
  </blockquote>

  <p>The procedure invokes the <code><a href=
  "tablelistWidget.html#childcount">childcount</a></code> subcommand to check
  whether the children of the row that is about to be expanded have already
  been inserted into the tablelist widget, and inserts them if this is not the
  case.&nbsp; It also makes sure that the child items will be displayed in the
  order corresponding to the last sorting (if any), with the aid of the
  <code><a href="tablelistWidget.html#refreshsorting">refreshsorting</a></code>
  tablelist subcommand.&nbsp; Any sorting (if needed) will only be performed on
  the child items just inserted into the tablelist widget.</p>

  <p>The <code>demo::formatBoolean</code> and <code>demo::labelCmd</code>
  procedures mentioned above are trivial:</p>

  <blockquote>
    <pre>
#------------------------------------------------------------------------------
# demo::formatBoolean
#
# Returns "yes" or "no", according to the specified boolean value.
#------------------------------------------------------------------------------
proc demo::formatBoolean val {
    return [expr {$val ? "yes" : "no"}]
}

#------------------------------------------------------------------------------
# demo::labelCmd
#
# Sorts the contents 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).
#------------------------------------------------------------------------------
proc demo::labelCmd {tbl col} {
    tablelist::sortByColumn $tbl $col
    updateItemsDelayed $tbl
}
</pre>
  </blockquote>

  <p>The command <code><a href=
  "tablelistColSort.html#sortByColumn">tablelist::sortByColumn</a></code> sorts
  the items of the tablelist widget by the specified column in the right order,
  by invoking the <code><a href=
  "tablelistWidget.html#sortbycolumn">sortbycolumn</a></code> subcommand of the
  Tcl command associated with the tablelist widget.</p>

  <p>The implementation of the <code>demo::updateItemsDelayed</code> command,
  invoked in this procedure and already encountered in the
  <code>demo::displayChildren</code> procedure above, is quite simple:</p>

  <blockquote>
    <pre>
#------------------------------------------------------------------------------
# demo::updateItemsDelayed
#
# Arranges for the items of the tablelist widget tbl to be updated 500 ms later.
#------------------------------------------------------------------------------
proc demo::updateItemsDelayed tbl {
    #
    # Schedule the demo::updateItems command for execution
    # 500 ms later, but only if it is not yet pending
    #
    if {[string compare [$tbl attrib afterId] ""] == 0} {
        $tbl attrib afterId [after 500 [list demo::updateItems $tbl]]
    }
}

#------------------------------------------------------------------------------
# demo::updateItems
#
# Updates the items of the tablelist widget tbl.
#------------------------------------------------------------------------------
proc demo::updateItems tbl {
    #
    # Reset the tablelist's "afterId" attribute
    #
    $tbl attrib afterId ""

    #
    # Update the items
    #
    set rowCount [$tbl size]
    for {set row 0} {$row &lt; $rowCount} {incr row} {
        set c [$tbl cellcget $row,0 -text]
        if {![winfo exists $c]} {
            continue
        }

        set item {}
        lappend item \
                [winfo name $c] [winfo class $c] [winfo x $c] [winfo y $c] \
                [winfo width $c] [winfo height $c] [winfo ismapped $c] \
                [winfo viewable $c] [winfo manager $c]
        $tbl rowconfigure $row -text $item
    }

    #
    # Repeat the last sort operation (if any)
    #
    $tbl refreshsorting
}
</pre>
  </blockquote>

  <p>As already mentioned in the <a href="#ex_config">previous example</a>,
  each tablelist widget may have any number of private attributes, which can be
  set and retrieved with the aid of the <code><a href=
  "tablelistWidget.html#attrib">attrib</a></code> subcommand of the Tcl command
  corresponding to the widget.&nbsp; The <code>afterId</code> attribute is set
  by the <code>demo::updateItemsDelayed</code> procedure when sheduling the
  <code>demo::updateItems</code> command for execution 500 ms later, but only
  if its value is an empty string.&nbsp; For this reason, the
  <code>demo::updateItems</code> procedure resets this attribute.&nbsp; It also
  makes use of the <code><a href=
  "tablelistWidget.html#cellcget">cellcget</a></code> tablelist subcommand to
  get the path names contained in the first cell of each row, and updates the
  data of the children with the aid of the <code><a href=
  "tablelistWidget.html#rowconfigure">rowconfigure</a></code> subcommand.&nbsp;
  After updating the items, the procedure repeats the most recent sorting based
  on a column (if there was one), with the aid of the <code><a href=
  "tablelistWidget.html#refreshsorting">refreshsorting</a></code>
  subcommand.</p>

  <p>The procedures <code>demo::putChildrenOfSelWidget</code>,
  <code>demo::dispConfigOfSelWidget</code>, and
  <code>demo::postPopupMenu</code> (see <code>demo::displayChildren</code>) are
  also straight-forward.&nbsp; For example, the
  <code>demo::putChildrenOfSelWidget</code> command shown below makes use of
  the <code><a href="tablelistWidget.html#curselection">curselection</a></code>
  subcommand to get the index of the selected row.&nbsp; More precisely,
  <code>curselection</code> returns a list, but in our case this list will have
  exactly one element, hence it can be used directly as the first component of
  a cell index.</p>

  <blockquote>
    <pre>
#------------------------------------------------------------------------------
# demo::putChildrenOfSelWidget
#
# Outputs the data of the children of the selected widget into the tablelist
# widget tbl.
#------------------------------------------------------------------------------
proc demo::putChildrenOfSelWidget tbl {
    set w [$tbl cellcget [$tbl curselection],0 -text]
    if {![winfo exists $w]} {
        bell
        tk_messageBox -title "Error" -icon error -message \
            "Bad window path name \"$w\"" -parent [winfo toplevel $tbl]
        return ""
    }

    if {[llength [winfo children $w]] == 0} {
        bell
    } else {
        putChildren $w $tbl
    }
}
</pre>
  </blockquote>

  <p>The procedure <code>demo::refreshView</code>, associated with the
  <b>Refresh</b> button, is implemented as follows:</p>

  <blockquote>
    <pre>
#------------------------------------------------------------------------------
# demo::refreshView
#
# Redisplays the data of the children of the widget w in the tablelist widget
# tbl and restores the expanded states of the items as well as the vertical
# view.
#------------------------------------------------------------------------------
proc demo::refreshView {w tbl} {
    #
    # Save the vertical view and get the path names of
    # the child widgets displayed in the expanded rows
    #
    set yView [$tbl yview]
    foreach key [$tbl expandedkeys] {
        set pathName [$tbl rowattrib $key pathName]
        set expandedWidgets($pathName) 1
    }

    #
    # Redisplay the data of the widget's (possibly changed) children and
    # restore the expanded states of the children, along with the vertical view
    #
    putChildren $w $tbl root
    restoreExpandedStates $tbl root expandedWidgets
    $tbl yview moveto [lindex $yView 0]
}
</pre>
  </blockquote>

  <p>Before redisplaying the tablelist's contents via
  <code>demo::putChildren</code>, we get the full keys of the currently
  expanded items with the aid of the <code><a href=
  "tablelistWidget.html#expandedkeys">expandedkeys</a></code> tablelist
  subcommand and insert the correspondig widget paths into the array
  <code>expandedWidgets</code>.&nbsp; After redisplaying the data of the
  (possibly changed) children of the widget given as first argument, we pass
  this array to the <code>demo::restoreExpandedStates</code> procedure shown
  below:</p>

  <blockquote>
    <pre>
#------------------------------------------------------------------------------
# restoreExpandedStates
#
# Expands those children of the parent identified by nodeIdx that display the
# data of child widgets whose path names are the names of the elements of the
# array specified by the last argument.
#------------------------------------------------------------------------------
proc demo::restoreExpandedStates {tbl nodeIdx expandedWidgetsName} {
    upvar $expandedWidgetsName expandedWidgets

    foreach key [$tbl childkeys $nodeIdx] {
        set pathName [$tbl rowattrib $key pathName]
        if {[info exists expandedWidgets($pathName)]} {
            $tbl expand $key -partly
            restoreExpandedStates $tbl $key expandedWidgets
        }
    }
}
</pre>
  </blockquote>

  <p>The procedure retrieves the list of full keys of the children of the
  parent node indicated by <code>nodeIdx</code>, by means of the <code><a href=
  "tablelistWidget.html#childkeys">childkeys</a></code> tablelist
  subcommand.&nbsp; It then loops over this list, and for each key for which
  the corresponding row was previously expanded, it invokes the <code><a href=
  "tablelistWidget.html#expand">expand</a></code> tablelist subcommand and then
  calls itself recursively to restore the expanded states of that row's
  children.</p>

  <h3 id="ex_dirViewer">A Directory Viewer Based on a tablelist</h3>

  <p>The script <code>dirViewer.tcl</code> in the <code>demos</code> directory
  displays the contents of the volumes mounted on the system (e.g., the root
  <code>/</code> on UNIX and the local drives on Windows) in a tablelist used
  as multi-column tree widget:</p>

  <blockquote>
    <img src="dirViewer.png" alt="Directory Viewer" width="665" height="418">
  </blockquote>

  <p>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
  corresponding to the selected item.&nbsp; To go one level up, click on the
  <b>Parent</b> button.</p>

  <p>There are a lot of similarities between this script and the one discussed
  in the <a href="#ex_browse">previous section</a>.&nbsp; In the following we
  will only present a few procedures that invoke tablelist commands not
  encountered in the examples above:</p>

  <blockquote>
    <pre>
package require Tk 8.3
package require tablelist 5.13

#
# Add some entries to the Tk option database
#
set dir [file dirname [info script]]
source [file join $dir option.tcl]

#
# Create three images
#
image create photo clsdFolderImg -file [file join $dir clsdFolder.gif]
image create photo openFolderImg -file [file join $dir openFolder.gif]
image create photo fileImg       -file [file join $dir file.gif]

#------------------------------------------------------------------------------
# displayContents
#
# Displays the contents of the directory dir in a tablelist widget.
#------------------------------------------------------------------------------
proc displayContents dir {
    #
    # Create a scrolled tablelist widget with 3 dynamic-
    # width columns and interactive sort capability
    #
    set tf .tf
    frame $tf -class ScrollArea
    set tbl $tf.tbl
    set vsb $tf.vsb
    set hsb $tf.hsb
    tablelist::tablelist $tbl \
        -columns {0 "Name"          left
                  0 "Size"          right
                  0 "Date Modified" left} \
        -expandcommand expandCmd -collapsecommand collapseCmd \
        -xscrollcommand [list $hsb set] -yscrollcommand [list $vsb set] \
        -movablecolumns no -setgrid no -showseparators yes -height 20 -width 80
    if {[$tbl cget -selectborderwidth] == 0} {
        $tbl configure -spacing 1
    }
    $tbl columnconfigure 0 -formatcommand formatString -sortmode dictionary
    $tbl columnconfigure 1 -formatcommand formatSize -sortmode integer
    $tbl columnconfigure 2 -formatcommand formatString
    scrollbar $vsb -orient vertical   -command [list $tbl yview]
    scrollbar $hsb -orient horizontal -command [list $tbl xview]

    . . .

    #
    # Populate the tablelist with the contents of the given directory
    #
    $tbl sortbycolumn 0
    putContents $dir $tbl root
}
</pre>
  </blockquote>

  <p>The procedure <code>displayContents</code> creates the tablelist widget
  and the two scrollbars as children of a frame of class
  <code>ScrollArea</code>.&nbsp; For this class, the file
  <code>option.tcl</code>, <code>source</code>d into the main script, contains
  some look &amp; feel related settings similar to the ones encountered in our
  <a href="#ex_config">first example</a>:</p>

  <blockquote>
    <pre>
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
    . . .
}
</pre>
  </blockquote>

  <p>The procedure specifies a value not only for the <code><a href=
  "tablelistWidget.html#expandcommand">-expandcommand</a></code> option of the
  tablelist it creates, but also for its <code><a href=
  "tablelistWidget.html#collapsecommand">-collapsecommand</a></code>
  option.&nbsp; The latter will merely restore the image shown in the first
  column to the one displaying a closed folder (see below).</p>

  <blockquote>
    <pre>
#------------------------------------------------------------------------------
# putContents
#
# Outputs the contents of the directory dir into the tablelist widget tbl, as
# child items of the one identified by nodeIdx.
#------------------------------------------------------------------------------
proc putContents {dir tbl nodeIdx} {
    . . .

    if {[string compare $nodeIdx "root"] == 0} {
        if {[string compare $dir ""] == 0} {
            if {[llength [file volumes]] == 1} {
                wm title . "Contents of the File System"
            } else {
                wm title . "Contents of the File Systems"
            }
        } else {
            wm title . "Contents of the Directory \"[file nativename $dir]\""
        }

        $tbl delete 0 end
        set row 0
    } else {
        set row [expr {$nodeIdx + 1}]
    }

    #
    # Build a list from the data of the subdirectories and
    # files of the directory dir.  Prepend a "D" or "F" to
    # each entry's name and modification date &amp; time, for
    # sorting purposes (it will be removed by formatString).
    #
    set itemList {}
    if {[string compare $dir ""] == 0} {
        foreach volume [file volumes] {
            lappend itemList [list D[file nativename $volume] -1 D $volume]
        }
    } else {
        foreach entry [glob -nocomplain -types {d f} -directory $dir *] {
            if {[catch {file mtime $entry} modTime] != 0} {
                continue
            }

            if {[file isdirectory $entry]} {
                lappend itemList [list D[file tail $entry] -1 \
                    D[clock format $modTime -format "%Y-%m-%d %H:%M"] $entry]
            } else {
                lappend itemList [list F[file tail $entry] [file size $entry] \
                    F[clock format $modTime -format "%Y-%m-%d %H:%M"] ""]
            }
        }
    }

    #
    # Sort the above list and insert it into the tablelist widget
    # tbl as list of children of the row identified by nodeIdx
    #
    set itemList [$tbl applysorting $itemList]
    $tbl insertchildlist $nodeIdx end $itemList

    #
    # Insert an image into the first cell of each newly inserted row
    #
    foreach item $itemList {
        set name [lindex $item end]
        if {[string compare $name ""] == 0} {                   ;# file
            $tbl cellconfigure $row,0 -image fileImg
        } else {                                                ;# directory
            $tbl cellconfigure $row,0 -image clsdFolderImg
            $tbl rowattrib $row pathName $name

            #
            # Mark the row as collapsed if the directory is non-empty
            #
            if {[file readable $name] &amp;&amp; [llength \
                [glob -nocomplain -types {d f} -directory $name *]] != 0} {
                $tbl collapse $row
            }
        }

        incr row
    }

    . . .
}
</pre>
  </blockquote>

  <p>The main difference between the procedure <code>putContents</code> above
  and the procedure <code><a href="#putChildren">demo::putChildren</a></code>
  described in the <a href="#ex_browse">previous section</a> is related to the
  way child items are inserted into the tablelist widget.&nbsp; Instead of
  inserting them individually with the aid of the <code><a href=
  "tablelistWidget.html#insertchildren">insertchild(ren)</a></code> tablelist
  subcommand, here we add the relevant data to a list of items and then invoke
  the much more performant <code><a href=
  "tablelistWidget.html#insertchildlist">insertchildlist</a></code>
  subcommand.&nbsp; Also, instead of first inserting the items and then sorting
  them via <code><a href=
  "tablelistWidget.html#refreshsorting">refreshsorting</a></code>, we first
  perform the necessary sortings on the above-mentioned list of items by
  invoking the <code><a href=
  "tablelistWidget.html#applysorting">applysorting</a></code> subcommand.&nbsp;
  Again, this is much faster than sorting the already inserted child items.</p>

  <p>This procedure also illustrates an effective technique based on the
  <code><a href=
  "tablelistWidget.html#col_formatcommand">-formatcommand</a></code> column
  configuration option:&nbsp; In the tablelist widget's internal list, the
  names and modification times of the directories and files are preceded by a
  <code>D</code> and <code>F</code>, respectively.&nbsp; This makes sure that
  the directories will sort before the files (when sorting in ascending
  order).&nbsp; When displaying the items, the Tablelist code will
  automatically invoke the <code>formatString</code> procedure, which removes
  the first character.&nbsp; Similarly, in the widget's internal list, the size
  of a directory is set to <code>-1</code>, which sorts before the sizes of the
  files.&nbsp; The <code>formatSize</code> procedure, invoked automatically
  when displaying the items, replaces this value with an empty string:</p>

  <blockquote>
    <pre>
#------------------------------------------------------------------------------
# formatString
#
# Returns the substring obtained from the specified value by removing its first
# character.
#------------------------------------------------------------------------------
proc formatString val {
    return [string range $val 1 end]
}

#------------------------------------------------------------------------------
# formatSize
#
# Returns an empty string if the specified value is negative and the value
# itself in user-friendly format otherwise.
#------------------------------------------------------------------------------
proc formatSize val {
    if {$val &lt; 0} {
        return ""
    } elseif {$val &lt; 1024} {
        return "$val bytes"
    } elseif {$val &lt; 1048576} {
        return [format "%.1f KB" [expr {$val / 1024.0}]]
    } elseif {$val &lt; 1073741824} {
        return [format "%.1f MB" [expr {$val / 1048576.0}]]
    } else {
        return [format "%.1f GB" [expr {$val / 1073741824.0}]]
    }
}
</pre>
  </blockquote>

  <p>Besides its common task of inserting the children of the row to be
  expanded, the <code>expandCmd</code> procedure shown below also changes the
  image contained in the first column to the one displaying an open
  folder.&nbsp; The <code>collapseCmd</code> procedure restores the image to
  the one displaying a closed folder:</p>

  <blockquote>
    <pre>
#------------------------------------------------------------------------------
# expandCmd
#
# Outputs the contents 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.
#------------------------------------------------------------------------------
proc expandCmd {tbl row} {
    if {[$tbl childcount $row] == 0} {
        set dir [$tbl rowattrib $row pathName]
        putContents $dir $tbl $row
    }

    if {[$tbl childcount $row] != 0} {
        $tbl cellconfigure $row,0 -image openFolderImg
    }
}

#------------------------------------------------------------------------------
# collapseCmd
#
# Updates the image displayed in the first cell of the specified row of the
# tablelist widget tbl.
#------------------------------------------------------------------------------
proc collapseCmd {tbl row} {
    $tbl cellconfigure $row,0 -image clsdFolderImg
}

. . .

displayContents ""
</pre>
  </blockquote>

  <p>The last line of the script invokes the procedure
  <code>displayContents</code> with an empty string as argument, i.e., displays
  the volumes mounted on the system.</p>

  <h3 id="ex_styles">Improving the Look &amp; Feel of a tablelist Widget</h3>

  <p>The script <code>styles.tcl</code> in the <code>demos</code> directory
  demonstrates some ways of making tablelist widgets smarter and improving the
  readability of their items.&nbsp; It creates 8 tablelist widgets, shown in
  the following figure:</p>

  <blockquote>
    <img src="styles.png" alt="Styles" width="686" height="477">
  </blockquote>

  <p>Here is the relevant code segment:</p>

  <blockquote>
    <pre>
#
# Create, configure, and populate 8 tablelist widgets
#
frame .f
for {set n 0} { $n &lt; 8} {incr n} {
    set tbl .f.tbl$n
    tablelist::tablelist $tbl \
        -columntitles {"Label 0" "Label 1" "Label 2" "Label 3"} \
        -background white -height 4 -width 40 -stretch all
    if {[$tbl cget -selectborderwidth] == 0} {
        $tbl configure -spacing 1
    }

    switch $n {
        1 {
            $tbl configure -showseparators yes
        }
        2 {
            $tbl configure -stripebackground #e4e8ec
        }
        3 {
            $tbl configure -stripebackground #e4e8ec -showseparators yes
        }
        4 {
            $tbl columnconfigure 1 -background LightYellow
            $tbl columnconfigure 3 -background LightCyan
        }
        5 {
            $tbl configure -showseparators yes
            $tbl columnconfigure 1 -background LightYellow
            $tbl columnconfigure 3 -background LightCyan
        }
        6 {
            $tbl configure -stripebackground #e4e8ec
            $tbl columnconfigure 1 -background LightYellow \
                -stripebackground #e5e5c9
            $tbl columnconfigure 3 -background LightCyan \
                -stripebackground #c9e5e5
        }
        7 {
            $tbl configure -stripebackground #e4e8ec -showseparators yes
            $tbl columnconfigure 1 -background LightYellow \
                -stripebackground #e5e5c9
            $tbl columnconfigure 3 -background LightCyan \
                -stripebackground #c9e5e5
        }
    }

    foreach row {0 1 2 3} {
        $tbl insert end \
             [list "Cell $row,0" "Cell $row,1" "Cell $row,2" "Cell $row,3"]
    }
}
</pre>
  </blockquote>

  <p>The only configuration option used here but not discussed in the first
  three examples (although already encountered in the <a href=
  "#ex_dirViewer">previous one</a>) is <code><a href=
  "tablelistWidget.html#showseparators">-showseparators</a></code>.&nbsp; The
  visual effect it produces looks nice both by itself and combined with
  horizontal or vertical stripes, created by using the <code><a href=
  "tablelistWidget.html#stripebackground">-stripebackground</a></code> option
  and the <code><a href=
  "tablelistWidget.html#columnconfigure">columnconfigure</a></code> subcommand,
  respectively.</p>

  <h3 id="ex_editing">Advanced Interactive tablelist Cell Editing</h3>

  <p>The scripts <code>tileWidgets.tcl</code>, <code>bwidget.tcl</code>,
  <code>iwidgets.tcl</code>, and <code>miscWidgets.tcl</code> in the
  <code>demos</code> directory create a tablelist widget displaying some
  parameters of 16 serial lines, and demonstrate how to use various widgets
  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.&nbsp; The following figure shows the tablelist widget, together with
  a BWidget ComboBox used to edit the contents of one of its cells:</p>

  <blockquote>
    <img src="bwidget.png" alt="Serial Line Configuration" width="829" height=
    "371">
  </blockquote>

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

  <blockquote>
    <pre>
package require Tk 8.4                          ;# because of "-compound"
package require tablelist 5.13
package require BWidget

wm title . "Serial Line Configuration"

#
# Add some entries to the Tk option database
#
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

#
# Register some widgets from the BWidget package for interactive cell editing
#
tablelist::addBWidgetEntry
tablelist::addBWidgetSpinBox
tablelist::addBWidgetComboBox

#
# Create the images "checkedImg" and "uncheckedImg", as well as 16 images of
# names like "img#FF0000", displaying colors identified by names like "red"
#
source [file join $dir images.tcl]

#
# Create a tablelist widget with editable columns (except the first one)
#
set tbl .tbl
tablelist::tablelist $tbl \
    -columns {0 "No."             right
              0 "Available"       center
              0 "Name"            left
              0 "Baud Rate"       right
              0 "Data Bits"       center
              0 "Parity"          left
              0 "Stop Bits"       center
              0 "Handshake"       left
              0 "Activation Date" center
              0 "Activation Time" center
              0 "Cable Color"     center} \
    -editstartcommand editStartCmd -editendcommand editEndCmd \
    -height 0 -width 0
if {[$tbl cget -selectborderwidth] == 0} {
    $tbl configure -spacing 1
}
$tbl columnconfigure 0 -sortmode integer
$tbl columnconfigure 1 -name available -editable yes -editwindow checkbutton \
    -formatcommand emptyStr
$tbl columnconfigure 2 -name lineName  -editable yes -editwindow Entry \
    -sortmode dictionary
$tbl columnconfigure 3 -name baudRate  -editable yes -editwindow ComboBox \
    -sortmode integer
$tbl columnconfigure 4 -name dataBits  -editable yes -editwindow SpinBox
$tbl columnconfigure 5 -name parity    -editable yes -editwindow ComboBox
$tbl columnconfigure 6 -name stopBits  -editable yes -editwindow ComboBox
$tbl columnconfigure 7 -name handshake -editable yes -editwindow ComboBox
$tbl columnconfigure 8 -name actDate   -editable yes -editwindow Entry \
    -formatcommand formatDate -sortmode integer
$tbl columnconfigure 9 -name actTime   -editable yes -editwindow Entry \
    -formatcommand formatTime -sortmode integer
$tbl columnconfigure 10 -name color    -editable yes -editwindow menubutton \
    -formatcommand emptyStr

proc emptyStr   val { return "" }
proc formatDate val { return [clock format $val -format "%Y-%m-%d"] }
proc formatTime val { return [clock format $val -format "%H:%M:%S"] }

#
# Populate the tablelist widget; set the activation
# date &amp; time to 10 minutes past the current clock value
#
set clock [expr {[clock seconds] + 600}]
for {set i 0; set n 1} {$i &lt; 16} {set i $n; incr n} {
    $tbl insert end [list $n [expr {$i &lt; 8}] "Line $n" 9600 8 None 1 XON/XOFF \
        $clock $clock [lindex $colorNames $i]]

    set availImg [expr {($i &lt; 8) ? "checkedImg" : "uncheckedImg"}]
    $tbl cellconfigure end,available -image $availImg
    $tbl cellconfigure end,color -image img[lindex $colorValues $i]
}

set btn [button .btn -text "Close" -command exit]

#
# Manage the widgets
#
pack $btn -side bottom -pady 10
pack $tbl -side top -expand yes -fill both
</pre>
  </blockquote>

  <p>We invoke the <code><a href=
  "tablelistBWidget.html#Entry">tablelist::addBWidgetEntry</a></code>,
  <code><a href=
  "tablelistBWidget.html#SpinBox">tablelist::addBWidgetSpinBox</a></code>, and
  <code><a href=
  "tablelistBWidget.html#ComboBox">tablelist::addBWidgetComboBox</a></code>
  commands to register the Entry, SpinBox, and ComboBox widgets from the
  BWidget package for interactive cell editing.&nbsp; These commands return the
  values <code>"Entry"</code>, <code>"SpinBox"</code>, and
  <code>"ComboBox"</code>, respectively, which we then use in the
  <code><a href="tablelistWidget.html#col_editwindow">-editwindow</a></code>
  column configuration option to set the edit window for the columns no. 2,
  ..., 10.&nbsp; In columns no. 1 and 10 we use the Tk core checkbutton and
  menubutton widgets, which are automatically registered for interactive cell
  editing.</p>

  <p>Notice the use of the <code><a href=
  "tablelistWidget.html#col_name">-name</a></code> column configuration option,
  which allows us to access the columns by their names instead of by numerical
  column indices.&nbsp; This is important, because the file
  <code>option.tcl</code>, which is <code>source</code>d into the main script,
  contains the line</p>

  <blockquote>
    <pre>
option add *Tablelist.movableColumns    yes
</pre>
  </blockquote>

  <p>The <code>editStartCmd</code> and <code>editEndCmd</code> procedures shown
  below use the <code><a href=
  "tablelistWidget.html#columncget">columncget</a></code> subcommand to
  retrieve the name of the column from the numerical column index.</p>

  <p>By the way, two further option database settings contained in the file
  <code>option.tcl</code> are:</p>

  <blockquote>
    <pre>
option add *Tablelist.labelCommand      tablelist::sortByColumn
option add *Tablelist.labelCommand2     tablelist::addToSortColumns
</pre>
  </blockquote>

  <p>The <code><a href=
  "tablelistColSort.html#sortByColumn">tablelist::sortByColumn</a></code> and
  <code><a href=
  "tablelistColSort.html#addToSortColumns">tablelist::addToSortColumns</a></code>
  commands specified in these settings enable the user to sort the items by one
  or more columns, with the aid of the left mouse button and of the
  <code>Shift</code> key.</p>

  <p>The <code>editStartCmd</code> procedure, specified as the value of the
  <code><a href=
  "tablelistWidget.html#editstartcommand">-editstartcommand</a></code>
  configuration option, needs the path name of the edit window, in order to be
  able to configure the widget in various ways.&nbsp; This is a common
  situation, and Tablelist provides the <code><a href=
  "tablelistWidget.html#editwinpath">editwinpath</a></code> subcommand for this
  purpose:</p>

  <blockquote>
    <pre>
#------------------------------------------------------------------------------
# editStartCmd
#
# Applies some configuration options to the edit window; if the latter is a
# ComboBox, the procedure populates it.
#------------------------------------------------------------------------------
proc editStartCmd {tbl row col text} {
    set w [$tbl editwinpath]

    switch [$tbl columncget $col -name] {
        lineName {
            #
            # Set an upper limit of 20 for the number of characters
            #
            $w configure -invalidcommand bell -validate key \
                         -validatecommand {expr {[string length %P] &lt;= 20}}
        }

        baudRate {
            #
            # Populate the ComboBox and allow no more
            # than 6 digits in its Entry component
            #
            $w configure -values {50 75 110 300 1200 2400 4800 9600 19200 38400
                                  57600 115200 230400 460800 921600}
            $w configure -invalidcommand bell -validate key -validatecommand \
                {expr {[string length %P] &lt;= 6 &amp;&amp; [regexp {^[0-9]*$} %S]}}
        }

        dataBits {
            #
            # Configure the SpinBox
            #
            $w configure -range {5 8 1} -editable no
        }

        parity {
            #
            # Populate the ComboBox and make it non-editable
            #
            $w configure -values {None Even Odd Mark Space} -editable no
        }

        . . .

        color {
            #
            # Populate the menu and make sure the menubutton will display the
            # color name rather than $text, which is "", due to -formatcommand
            #
            set menu [$w cget -menu]
            foreach name $::colorNames {
                $menu add radiobutton -compound left \
                    -image img$::colors($name) -label $name
            }
            $menu entryconfigure 8 -columnbreak 1
            return [$tbl cellcget $row,$col -text]
        }
    }

    return $text
}
</pre>
  </blockquote>

  <p>The <code>editEndCmd</code> procedure, specified as the value of the
  <code><a href=
  "tablelistWidget.html#editendcommand">-editendcommand</a></code>
  configuration option, is responsible for a final validation of the edit
  window's text.&nbsp; Another purpose of this command is to convert the text
  contained in the edit window to the cell's new <i>internal</i> contents,
  which is necessary because the internal value of the activation date and time
  is a clock value in seconds:</p>

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

        baudRate {
            #
            # Check whether the baud rate is an integer in the range 50..921600
            #
            if {![regexp {^[0-9]+$} $text] || $text &lt; 50 || $text &gt; 921600} {
                bell
                tk_messageBox -title "Error" -icon error -message \
                    "The baud rate must be an integer in the range 50..921600"
                $tbl rejectinput
            }
        }

        actDate {
            #
            # Get the activation date in seconds from the last argument
            #
            if {[catch {clock scan $text} actDate] != 0} {
                bell
                tk_messageBox -title "Error" -icon error -message "Invalid date"
                $tbl rejectinput
                return ""
            }

            #
            # Check whether the activation clock value is later than the
            # current one; if this is the case then make sure the cells
            # "actDate" and "actTime" will have the same internal value
            #
            set actTime [$tbl cellcget $row,actTime -text]
            set actClock [clock scan [formatTime $actTime] -base $actDate]
            if {$actClock &lt;= [clock seconds]} {
                bell
                tk_messageBox -title "Error" -icon error -message \
                    "The activation date &amp; time must be in the future"
                $tbl rejectinput
            } else {
                $tbl cellconfigure $row,actTime -text $actClock
                return $actClock
            }
        }

        . . .

        color {
            #
            # Update the image contained in the cell
            #
            $tbl cellconfigure $row,$col -image img$::colors($text)
        }
    }

    return $text
}
</pre>
  </blockquote>

  <p>As mentioned above, the scripts <code>tileWidgets.tcl</code>,
  <code>iwidgets.tcl</code>, and <code>miscWidgets.tcl</code> are similar to
  <code>bwidget.tcl</code>.&nbsp; The first one makes use of the tile entry,
  spinbox, combobox, checkbutton, and menubutton widgets.&nbsp; The second one
  uses (besides the Tk core checkbutton and menubutton) the entryfield,
  spinint, combobox, dateentry, and timeentry widgets from the Iwidgets package
  and the validation facilities specific to that library.&nbsp; The third
  script makes use of the entry, spinbox, checkbutton, and menubutton widgets
  from the Tk core, Bryan Oakley's combobox, and of the mentry widgets of type
  <code>"Date"</code> and <code>"Time"</code>, and it performs the entry
  validation with the aid of the Wcb package (which is required anyway for the
  Mentry library).</p>

  <h3 id="ex_windows">A tablelist Widget Containing Embedded Windows</h3>

  <p>The script <code>embeddedWindows.tcl</code> in the <code>demos</code>
  directory creates a tablelist widget whose items correspond to the Tk library
  scripts.&nbsp; The size of each file (in bytes) is not only displayed as a
  number, but is also illustrated with the aid of a frame with red background,
  created as a child of an embedded frame with ivory background.&nbsp; The
  files can be viewed by clicking on the corresponding embedded button
  widgets.</p>

  <p>The following screenshot shows the tablelist widget with the mouse cursor
  over the first header label, causing this label to appear in
  <code>active</code> state:</p>

  <blockquote>
    <img src="embeddedWindows.png" alt="Embedded Windows" width="422" height=
    "269">
  </blockquote>

  <p>First, we create and populate the tablelist widget:</p>

  <blockquote>
    <pre>
package require tablelist 5.13

wm title . "Tk Library Scripts"

#
# Add some entries to the Tk option database
#
set dir [file dirname [info script]]
source [file join $dir option.tcl]

#
# Create the font TkFixedFont if not yet present
#
catch {font create TkFixedFont -family Courier -size -12}

#
# Create an image to be displayed in buttons embedded in a tablelist widget
#
image create photo openImg -file [file join $dir open.gif]

#
# Create a vertically scrolled tablelist widget with 5
# dynamic-width columns and interactive sort capability
#
set tf .tf
frame $tf -class ScrollArea
set tbl $tf.tbl
set vsb $tf.vsb
tablelist::tablelist $tbl \
    -columns {0 "File Name" left
              0 "Bar Chart" center
              0 "File Size" right
              0 "View"      center
              0 "Seen"      center} \
    -setgrid no -yscrollcommand [list $vsb set] -width 0
if {[$tbl cget -selectborderwidth] == 0} {
    $tbl configure -spacing 1
}
$tbl columnconfigure 0 -name fileName
$tbl columnconfigure 1 -formatcommand emptyStr -sortmode integer
$tbl columnconfigure 2 -name fileSize -sortmode integer
$tbl columnconfigure 4 -name seen
scrollbar $vsb -orient vertical -command [list $tbl yview]

proc emptyStr val { return "" }

eval font create BoldFont [font actual [$tbl cget -font]] -weight bold

#
# Populate the tablelist widget
#
cd $tk_library
set maxFileSize 0
foreach fileName [lsort [glob *.tcl]] {
    set fileSize [file size $fileName]
    $tbl insert end [list $fileName $fileSize $fileSize "" no]

    if {$fileSize &gt; $maxFileSize} {
        set maxFileSize $fileSize
    }
}
</pre>
  </blockquote>

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

  <p>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
  <code><a href="tablelistWidget.html#cell_window">-window</a></code> cell
  configuration option.&nbsp; Here is the script that creates a frame to be
  embedded into the column displaying the bar chart:</p>

  <blockquote>
    <pre>
#------------------------------------------------------------------------------
# createFrame
#
# Creates a frame widget w to be embedded into the specified cell of the
# tablelist widget tbl, as well as a child frame representing the size of the
# file whose name is diplayed in the first column of the cell's row.
#------------------------------------------------------------------------------
proc createFrame {tbl row col w} {
    #
    # Create the frame and replace the binding tag "Frame"
    # with "TablelistBody" in the list of its binding tags
    #
    frame $w -width 102 -height 14 -background ivory -borderwidth 1 \
             -relief solid
    bindtags $w [lreplace [bindtags $w] 1 1 TablelistBody]

    #
    # Create the child frame and replace the binding tag "Frame"
    # with "TablelistBody" in the list of its binding tags
    #
    frame $w.f -height 12 -background red -borderwidth 1 -relief raised
    bindtags $w.f [lreplace [bindtags $w] 1 1 TablelistBody]

    #
    # Manage the child frame
    #
    set fileSize [$tbl cellcget $row,fileSize -text]
    place $w.f -relwidth [expr {double($fileSize) / $::maxFileSize}]
}
</pre>
  </blockquote>

  <p>Since the frame will be embedded into the tablelist's body, we want to
  have the same handling of the mouse events in the frame and in its child
  frame as in the rest of the tablelist's body.&nbsp; To this end we replace
  the binding tag <code>Frame</code> (which has no own bindings anyway) with
  <code><a href="tablelistWidget.html#body_bindings">TablelistBody</a></code>,
  thus making sure that the default binding scripts associated with that tag
  will be valid for the parent frame and its child, too.</p>

  <p>We <code>place</code> the red child frame within its parent using the
  <code>-relwidth</code> option, to make sure that its width will remain
  proportional to the size of the corresponding file when resizing the parent
  frame (which will happen when resizing its column, as seen below).</p>

  <p>The creation script for the buttons used for viewing the Tk library files
  is quite simple:</p>

  <blockquote>
    <pre>
#------------------------------------------------------------------------------
# createButton
#
# Creates a button widget w to be embedded into the specified cell of the
# tablelist widget tbl.
#------------------------------------------------------------------------------
proc createButton {tbl row col w} {
    set key [$tbl getkeys $row]
    button $w -image openImg -highlightthickness 0 -takefocus 0 \
              -command [list viewFile $tbl $key]
}

#------------------------------------------------------------------------------
# viewFile
#
# Displays the contents of the file whose name is contained in the row with the
# given key of the tablelist widget tbl.
#------------------------------------------------------------------------------
proc viewFile {tbl key} {
    set top .top$key
    if {[winfo exists $top]} {
        raise $top
        return ""
    }

    toplevel $top
    set fileName [$tbl cellcget k$key,fileName -text]
    wm title $top "File \"$fileName\""

    #
    # Create a vertically scrolled text widget as a grandchild of the toplevel
    #
    set tf $top.tf
    frame $tf -class ScrollArea
    set txt $tf.txt
    set vsb $tf.vsb
    text $txt -background white -font TkFixedFont -setgrid yes \
              -yscrollcommand [list $vsb set]
    catch {$txt configure -tabstyle wordprocessor}      ;# for Tk 8.5 and above
    scrollbar $vsb -orient vertical -command [list $txt yview]

    #
    # Insert the file's contents into the text widget
    #
    set chan [open $fileName]
    $txt insert end [read $chan]
    close $chan

    . . .

    #
    # Mark the file as seen
    #
    $tbl rowconfigure k$key -font BoldFont
    $tbl cellconfigure k$key,seen -text yes
}
</pre>
  </blockquote>

  <p>Each file will be displayed in a text widget contained in a top-level
  whose name is <code>.top$key</code>, where <code>$key</code> is obtained with
  the aid of the <code><a href=
  "tablelistWidget.html#getkeys">getkeys</a></code> subcommand.&nbsp; 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.&nbsp; (Remember that the embedded windows will be destroyed and
  automatically recreated when sorting the items or moving the columns.)</p>

  <p>Having implemented the creation scripts for the frames and buttons, we can
  now use the <code><a href=
  "tablelistWidget.html#cellconfigure">cellconfigure</a></code> subcommand to
  effectively create these widgets as embedded windows.&nbsp; Notice the
  <code><a href=
  "tablelistWidget.html#cell_stretchwindow">-stretchwindow</a></code> option
  used for the embedded frames, to make sure that their width will be adapted
  to that of the containing column when the latter is being resized
  interactively.</p>

  <blockquote>
    <pre>
#
# Create embedded windows in the columns no. 1 and 3
#
set rowCount [$tbl size]
for {set row 0} {$row &lt; $rowCount} {incr row} {
    $tbl cellconfigure $row,1 -window createFrame -stretchwindow yes
    $tbl cellconfigure $row,3 -window createButton
}
</pre>
  </blockquote>

  <h3 id="ex_tile">Tile-Based Demo Scripts</h3>

  <p>The Tablelist distribution contains also tile-based counterparts of the
  demo scripts discussed above.&nbsp; As described in the <a href=
  "#ov_tile">More on Tablelist_tile</a> section of this tutorial, it is quite
  easy to port an application using the Tablelist package to one based on
  Tablelist_tile.&nbsp; For example, let's see how to transform the demo script
  <code><a href="#ex_editing">bwidget.tcl</a></code> into a tile-based one,
  called <code>bwidget_tile.tcl</code>.&nbsp; The changes are shown below in
  <span>red</span> color:</p>

  <p>First, we replace the starting lines</p>

  <blockquote>
    <pre>
package require Tk 8.3                          ;# because of entry validation
package require tablelist 5.13
</pre>
  </blockquote>

  <p>with</p>

  <blockquote>
    <pre>
package require tablelist<span>_tile</span> 5.13
</pre>
  </blockquote>

  <p>and the command</p>

  <blockquote>
    <pre>
source [file join $dir option.tcl]
</pre>
  </blockquote>

  <p>with</p>

  <blockquote>
    <pre>
source [file join $dir option<span>_tile</span>.tcl]
</pre>
  </blockquote>

  <p>To ensure that the overall appearance of the GUI will conform to the
  currently used theme, we create a theme-specific container for our
  widgets:</p>

  <blockquote>
    <pre>
<span>#
# Improve the window's appearance by using a tile
# frame as a container for the other widgets
#
set f [ttk::frame .f]</span>
</pre>
  </blockquote>

  <p>This implies that we have to replace the statement</p>

  <blockquote>
    <pre>
set tbl .tbl
</pre>
  </blockquote>

  <p>defining the path name of our tablelist widget with</p>

  <blockquote>
    <pre>
set tbl <span>$f</span>.tbl
</pre>
  </blockquote>

  <p>Similarly, instead of a Tk button created by the command</p>

  <blockquote>
    <pre>
set btn [button .btn -text "Close" -command exit]
</pre>
  </blockquote>

  <p>we use a tile button that is a child of the above tile frame:</p>

  <blockquote>
    <pre>
set btn [<span>ttk::</span>button <span>$f</span>.btn -text "Close" -command exit]
</pre>
  </blockquote>

  <p>We manage this frame in the usual manner:</p>

  <blockquote>
    <pre>
<span>pack $f -expand yes -fill both</span>
</pre>
  </blockquote>

  <p>The script <code>option_tile.tcl</code> is nearly identical to
  <code>option.tcl</code>.&nbsp; Its tile-specific part uses the values written
  by the command <code><a href=
  "tablelistThemes.html#setThemeDefaults">tablelist::setThemeDefaults</a></code>
  into the array <code>tablelist::themeDefaults</code>, to make sure that the
  selection will have the same theme-specific look in all the widgets created
  by the application:</p>

  <blockquote>
    <pre>
<span>tablelist::setThemeDefaults
if {[tablelist::getCurrentTheme] eq "aqua"} {
    option add *Listbox.selectBackground \
               $tablelist::themeDefaults(-selectbackground)
    option add *Listbox.selectForeground \
               $tablelist::themeDefaults(-selectforeground)
} else {
    option add *selectBackground  $tablelist::themeDefaults(-selectbackground)
    option add *selectForeground  $tablelist::themeDefaults(-selectforeground)
}
option add *selectBorderWidth     $tablelist::themeDefaults(-selectborderwidth)</span>
</pre>
  </blockquote>

  <p>The demo script <code>tileWidgets.tcl</code> uses not only the
  Tablelist_tile package for creating a tablelist widget with a modern
  theme-specific look &amp; feel, but also the tile entry, spinbox, combobox,
  checkbutton, and menubutoon widgets for interactive cell editing.&nbsp; The
  resulting window has a nice theme-specific appearance:</p>

  <blockquote>
    <img src="tileWidgets.png" alt="Serial Line Configuration" width="827"
    height="366">
  </blockquote>

  <p>The tile-based version of the demo script <code><a href=
  "#ex_windows">embeddedWindows.tcl</a></code> contains a bit more changes, but
  most of them are not Tablelist-specific.&nbsp; Please take a look at the file
  <code>embeddedWindows_tile.tcl</code> in the <code>demos</code> directory for
  the details.&nbsp; Here is a screenshot of the resulting window:</p>

  <blockquote>
    <img src="embeddedWindows_tile.png" alt="Embedded Windows" width="420"
    height="264">
  </blockquote>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
</body>
</html>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/doc/tablelistBWidget.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
<html>
<head>
  <title>Interactive Tablelist Cell Editing Using the BWidget Package</title>

  <meta name="Author" content="Csaba Nemethi">
  <meta name="Keywords" content="tablelist, editing, BWidget">

  <link rel="stylesheet" type="text/css" href="stylesheet.css">
</head>

<body bgcolor="#FFFFFF">
  <div align="center">
    <h1>Interactive Tablelist Cell Editing Using the BWidget Package</h1>

    <h2>For Tablelist Version 5.13</h2>

    <h3>by</h3>

    <h2>Csaba Nemethi</h2>

    <address>
      <a href="mailto:csaba.nemethi@t-online.de">csaba.nemethi@t-online.de</a>
    </address>
  </div>
  <hr>

  <h2 id="contents">Contents</h2>

  <ul>
    <li><a href="#overview">Overview</a></li>

    <li><a href="#Entry">The <code><b>tablelist::addBWidgetEntry</b></code>
    Command</a></li>

    <li><a href="#SpinBox">The <code><b>tablelist::addBWidgetSpinBox</b></code>
    Command</a></li>

    <li><a href="#ComboBox">The
    <code><b>tablelist::addBWidgetComboBox</b></code> Command</a></li>
  </ul>

  <div align="center">
    <p><a href="index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="overview">Overview</h2>

  <p>The BWidget package is a library extension for Tcl/Tk versions 8.1.1 or
  higher, written in pure Tcl/Tk code.&nbsp; Its download location is</p>

  <blockquote>
    <address>
      <a href=
      "http://sourceforge.net/projects/tcllib/files">http://sourceforge.net/projects/tcllib/files</a>
    </address>
  </blockquote>

  <p>Tablelist supports interactive cell editing with the aid of the Entry,
  SpinBox, and ComboBox widgets from the BWidget package.&nbsp; The steps
  needed for using one of these widgets for editing the cells of a given column
  are as follows:</p>

  <ol>
    <li>Register the desired widget for interactive cell editing by invoking
    one of the commands described in this reference page.</li>

    <li class="tm">Use the tablelist widget's <code><b><a href=
    "tablelistWidget.html#columnconfigure">columnconfigure</a></b></code>
    subcommand to set the given column's <code><b><a href=
    "tablelistWidget.html#col_editable">-editable</a></b></code> option to true
    and its <code><b><a href=
    "tablelistWidget.html#col_editwindow">-editwindow</a></b></code> option to
    the value returned by the command mentioned above.&nbsp; (These options are
    supported at cell level, too, with the aid of the <code><b><a href=
    "tablelistWidget.html#cellconfigure">cellconfigure</a></b></code>
    subcommand.)</li>
  </ol>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="Entry">The <code><b>tablelist::addBWidgetEntry</b></code>
  Command</h2>

  <dl>
    <dt><b>NAME</b></dt>

    <dd><code>tablelist::addBWidgetEntry</code> &ndash; Register the Entry
    widget from the BWidget package for interactive cell editing</dd>

    <dt class="tm"><b>SYNOPSIS</b></dt>

    <dd>
      <pre>
<b>tablelist::addBWidgetEntry</b> ?<i>name</i>?
</pre>
    </dd>

    <dt><b>DESCRIPTION</b></dt>

    <dd>This command registers the Entry widget from the BWidget package for
    interactive cell editing in tablelist widgets.&nbsp; The optional argument
    specifies the name to be used for the Entry widget as the value of the
    <code><b><a href=
    "tablelistWidget.html#col_editwindow">-editwindow</a></b></code> column or
    cell configuration option.&nbsp; It may be any string that is different
    from the <a href="tablelistTkCore.html">Tk core</a> and <a href=
    "tablelistTile.html">tile</a> edit window names.&nbsp; The default is
    <code><b>Entry</b></code>.&nbsp; The command returns its
    <code><i>name</i></code> argument.</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, editing, BWidget, Entry</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="SpinBox">The <code><b>tablelist::addBWidgetSpinBox</b></code>
  Command</h2>

  <dl>
    <dt><b>NAME</b></dt>

    <dd><code>tablelist::addBWidgetSpinBox</code> &ndash; Register the SpinBox
    widget from the BWidget package for interactive cell editing</dd>

    <dt class="tm"><b>SYNOPSIS</b></dt>

    <dd>
      <pre>
<b>tablelist::addBWidgetSpinBox</b> ?<i>name</i>?
</pre>
    </dd>

    <dt><b>DESCRIPTION</b></dt>

    <dd>This command registers the SpinBox widget from the BWidget package for
    interactive cell editing in tablelist widgets.&nbsp; The optional argument
    specifies the name to be used for the SpinBox widget as the value of the
    <code><b><a href=
    "tablelistWidget.html#col_editwindow">-editwindow</a></b></code> column or
    cell configuration option.&nbsp; It may be any string that is different
    from the <a href="tablelistTkCore.html">Tk core</a> and <a href=
    "tablelistTile.html">tile</a> edit window names.&nbsp; The default is
    <code><b>SpinBox</b></code>.&nbsp; The command returns its
    <code><i>name</i></code> argument.</dd>

    <dd class="tm">The temporary embedded SpinBox widget associated with the
    above <code><i>name</i></code> will be created with its
    <code><b>-editable</b></code> option set to <code>1</code>.&nbsp; You can
    use the script corresponding to the <code><b><a href=
    "tablelistWidget.html#editstartcommand">-editstartcommand</a></b></code>
    tablelist configuration option to make the SpinBox non-editable or define
    validations for it, as well as for setting its (range of) values and its
    <code><b>-wrap</b></code> option.</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, editing, BWidget, SpinBox</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="ComboBox">The <code><b>tablelist::addBWidgetComboBox</b></code>
  Command</h2>

  <dl>
    <dt><b>NAME</b></dt>

    <dd><code>tablelist::addBWidgetComboBox</code> &ndash; Register the
    ComboBox widget from the BWidget package for interactive cell editing</dd>

    <dt class="tm"><b>SYNOPSIS</b></dt>

    <dd>
      <pre>
<b>tablelist::addBWidgetComboBox</b> ?<i>name</i>?
</pre>
    </dd>

    <dt><b>DESCRIPTION</b></dt>

    <dd>This command registers the ComboBox widget from the BWidget package for
    interactive cell editing in tablelist widgets.&nbsp; The optional argument
    specifies the name to be used for the ComboBox widget as the value of the
    <code><b><a href=
    "tablelistWidget.html#col_editwindow">-editwindow</a></b></code> column or
    cell configuration option.&nbsp; It may be any string that is different
    from the <a href="tablelistTkCore.html">Tk core</a> and <a href=
    "tablelistTile.html">tile</a> edit window names.&nbsp; The default is
    <code><b>ComboBox</b></code>.&nbsp; The command returns its
    <code><i>name</i></code> argument.</dd>

    <dd class="tm">The temporary embedded ComboBox widget associated with the
    above <code><i>name</i></code> will be created with its
    <code><b>-editable</b></code> option set to <code>1</code>.&nbsp; You can
    use the script corresponding to the <code><b><a href=
    "tablelistWidget.html#editstartcommand">-editstartcommand</a></b></code>
    tablelist configuration option to make the ComboBox non-editable or define
    validations for it, as well as for populating its listbox component (with
    the aid of the ComboBox widget's <code><b>-values</b></code> option).</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, editing, BWidget, ComboBox</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
</body>
</html>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/doc/tablelistBinding.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
<html>
<head>
  <title>Helper Commands Used in Tablelist Binding Scripts</title>

  <meta name="Author" content="Csaba Nemethi">
  <meta name="Keywords" content="tablelist, binding script">

  <link rel="stylesheet" type="text/css" href="stylesheet.css">
</head>

<body bgcolor="#FFFFFF">
  <div align="center">
    <h1>Helper Commands Used in Tablelist Binding Scripts</h1>

    <h2>For Tablelist Version 5.13</h2>

    <h3>by</h3>

    <h2>Csaba Nemethi</h2>

    <address>
      <a href="mailto:csaba.nemethi@t-online.de">csaba.nemethi@t-online.de</a>
    </address>
  </div>
  <hr>

  <h2 id="contents">Contents</h2>

  <ul>
    <li><a href="#overview">Overview</a></li>

    <li><a href="#convEventFields">The
    <code><b>tablelist::convEventFields</b></code> Command</a></li>

    <li><a href="#getTablelistPath">The
    <code><b>tablelist::getTablelistPath</b></code> Command</a></li>

    <li><a href="#getTablelistColumn">The
    <code><b>tablelist::getTablelistColumn</b></code> Command</a></li>
  </ul>

  <div align="center">
    <p><a href="index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="overview">Overview</h2>

  <p>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 <code><b><a href="tablelistWidget.html#bodytag">bodytag</a></b></code>
  and <code><b><a href="tablelistWidget.html#labeltag">labeltag</a></b></code>
  subcommands of the Tcl command associated with a tablelist widget.&nbsp; The
  first two of these commands are also used in the default binding scripts
  associated with the binding tag <code><b>TablelistBody</b></code>.&nbsp; For
  details and examples see the sections <a href=
  "tablelistWidget.html#body_bindings">DEFAULT AND INDIVIDUAL BINDINGS FOR THE
  TABLELIST BODY</a> and <a href="tablelistWidget.html#label_bindings">DEFAULT
  AND INDIVIDUAL BINDINGS FOR THE HEADER LABELS</a>.</p>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="convEventFields">The <code><b>tablelist::convEventFields</b></code>
  Command</h2>

  <dl>
    <dt><b>NAME</b></dt>

    <dd><code>tablelist::convEventFields</code> &ndash; Convert event fields
    relative to a descendant of a tablelist widget</dd>

    <dt class="tm"><b>SYNOPSIS</b></dt>

    <dd>
      <pre>
<b>tablelist::convEventFields</b> <i>descendantPathName</i> <i>x</i> <i>y</i>
</pre>
    </dd>

    <dt><b>DESCRIPTION</b></dt>

    <dd>This command gets the path name of a tablelist widget and the x and y
    coordinates relative to the latter from the path name
    <code><i>descendantPathName</i></code> of one of its descendants and from
    the x and y coordinates <code><i>x</i></code>, <code><i>y</i></code>
    relative to this descendant.&nbsp; The command returns these values as the
    components of a list consisting of three elements.</dd>

    <dd class="tm">
      In a binding script, the descendant widget corresponds to the event field
      <code><b>%W</b></code>, which can be the tablelist's body, one of the
      separator frames, a label widget displaying an embedded image, or (a
      descendant of) an embedded window.&nbsp; It can also be a header label or
      an additional widget placed by Tablelist into a header label for
      displaying a header image or a sort arrow.&nbsp; Likewise, the arguments
      <code><i>x</i></code> and <code><i>y</i></code> correspond to the event
      fields <code><b>%x</b></code> and <code><b>%y</b></code>.&nbsp; The three
      elements of the list returned by the command are usually assigned to the
      help variables <code><b>tablelist::W</b></code>,
      <code><b>tablelist::x</b></code>, and <code><b>tablelist::y</b></code>,
      by using the statement

      <blockquote>
        <pre>
foreach {tablelist::W tablelist::x tablelist::y} \
    [tablelist::convEventFields %W %x %y] {}
</pre>
      </blockquote>
    </dd>

    <dt><b>KEYWORDS</b></dt>

    <dd>tablelist, event fields, binding script</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="getTablelistPath">The <code><b>tablelist::getTablelistPath</b></code>
  Command</h2>

  <dl>
    <dt><b>NAME</b></dt>

    <dd><code>tablelist::getTablelistPath</code> &ndash; Get the path name of a
    tablelist widget from the path name of one of its descendants</dd>

    <dt class="tm"><b>SYNOPSIS</b></dt>

    <dd>
      <pre>
<b>tablelist::getTablelistPath</b> <i>descendantPathName</i>
</pre>
    </dd>

    <dt><b>DESCRIPTION</b></dt>

    <dd>This command gets the path name of a tablelist widget from the path
    name <code><i>descendantPathName</i></code> of one of its descendants.</dd>

    <dd class="tm">In a binding script, the descendant widget corresponds to
    the event field <code><b>%W</b></code>, which can be the tablelist's body,
    one of the separator frames, a label widget displaying an embedded image,
    or (a descendant of) an embedded window.&nbsp; It can also be a header
    label or an additional widget placed by Tablelist into a header label for
    displaying a header image or a sort arrow.&nbsp; The return value is often
    assigned to the help variable <code><b>tablelist::W</b></code>.</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, path name, binding script</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="getTablelistColumn">The
  <code><b>tablelist::getTablelistColumn</b></code> Command</h2>

  <dl>
    <dt><b>NAME</b></dt>

    <dd><code>tablelist::getTablelistColumn</code> &ndash; Get the column
    number from the path name of a tablelist header label</dd>

    <dt class="tm"><b>SYNOPSIS</b></dt>

    <dd>
      <pre>
<b>tablelist::getTablelistColumn</b> <i>headerLabelPathName</i>
</pre>
    </dd>

    <dt><b>DESCRIPTION</b></dt>

    <dd>This command gets the column number from the path name
    <code><i>headerLabelPathName</i></code> of a tablelist header label or of
    an additional widget placed by Tablelist into a header label for displaying
    a header image or a sort arrow.</dd>

    <dd class="tm">In a binding script, the command argument corresponds to the
    event field <code><b>%W</b></code>.&nbsp; The return value is often
    assigned to the help variable <code><b>tablelist::col</b></code>.</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, path name, binding script</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
</body>
</html>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


























































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/doc/tablelistColSort.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
<html>
<head>
  <title>Commands for Interactive Sorting by One or More Columns</title>

  <meta name="Author" content="Csaba Nemethi">
  <meta name="Keywords" content="tablelist, sort, column, widget">

  <link rel="stylesheet" type="text/css" href="stylesheet.css">
</head>

<body bgcolor="#FFFFFF">
  <div align="center">
    <h1>Commands for Interactive Sorting by One or More Columns</h1>

    <h2>For Tablelist Version 5.13</h2>

    <h3>by</h3>

    <h2>Csaba Nemethi</h2>

    <address>
      <a href="mailto:csaba.nemethi@t-online.de">csaba.nemethi@t-online.de</a>
    </address>
  </div>
  <hr>

  <h2 id="contents">Contents</h2>

  <ul>
    <li><a href="#overview">Overview</a></li>

    <li><a href="#sortByColumn">The <code><b>tablelist::sortByColumn</b></code>
    Command</a></li>

    <li><a href="#addToSortColumns">The
    <code><b>tablelist::addToSortColumns</b></code> Command</a></li>
  </ul>

  <div align="center">
    <p><a href="index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="overview">Overview</h2>

  <p>The commands described in this reference page enable the user to sort the
  items of a tablelist widget based on one or more of its columns, with the aid
  of the left mouse button.</p>

  <p>If the <code><b><a href=
  "#sortByColumn">tablelist::sortByColumn</a></b></code> command was specified
  as the value of the <code><b><a href=
  "tablelistWidget.html#labelcommand">-labelcommand</a></b></code>
  configuration option, then by pressing mouse button 1 over one of the header
  labels and later releasing it over the same label, the items will be sorted
  based on the elements of the corresponding column.</p>

  <p>If the <code><b><a href=
  "#addToSortColumns">tablelist::addToSortColumns</a></b></code> command was
  specified as the value of the <code><b><a href=
  "tablelistWidget.html#labelcommand2">-labelcommand2</a></b></code>
  configuration option, then by pressing mouse button 1 together with the
  <code>Shift</code> key over one of the header labels and later releasing it
  over the same label, the corresponding column will be appended to the list of
  sort columns, or (if it was already contained in that list) the corresponding
  sort order will be toggled; in both cases, the items will be sorted based on
  the updated lists of sort columns and sort orders.</p>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="sortByColumn">The <code><b>tablelist::sortByColumn</b></code>
  Command</h2>

  <dl>
    <dt><b>NAME</b></dt>

    <dd><code>tablelist::sortByColumn</code> &ndash; Sort the items of a
    tablelist widget based on one of its columns</dd>

    <dt class="tm"><b>SYNOPSIS</b></dt>

    <dd>
      <pre>
<b>tablelist::sortByColumn</b> <i>pathName</i> <i>columnIndex</i>
</pre>
    </dd>

    <dt><b>DESCRIPTION</b></dt>

    <dd>This command sorts the items of the <a href=
    "tablelistWidget.html">tablelist</a> widget <code><i>pathName</i></code>
    based on the elements of the column specified by
    <code><i>columnIndex</i></code>.&nbsp; This is done by invoking the
    <code><b><a href=
    "tablelistWidget.html#sortbycolumn">sortbycolumn</a></b></code> subcommand
    of the Tcl command associated with the given tablelist widget.&nbsp; If the
    items were last sorted in increasing order, based on the same column given
    by <code><i>columnIndex</i></code>, and no subsequent invocation of the
    <code><b><a href=
    "tablelistWidget.html#resetsortinfo">resetsortinfo</a></b></code>
    subcommand was made, then the last argument passed to
    <code><b>sortbycolumn</b></code> will be <code><b>-decreasing</b></code>,
    otherwise <code><b>-increasing</b></code>.</dd>

    <dd class="tm">After sorting the items, the virtual event
    <code><b>&lt;&lt;TablelistColumnSorted&gt;&gt;</b></code> is
    generated.&nbsp; For Tk versions 8.5 or higher, this virtual event is
    generated with its <code><b>-data</b></code> option set to a list
    consisting of the numerical column index and the sort order
    (<code><b>decreasing</b></code> or <code><b>increasing</b></code>).&nbsp;
    The command returns the sort order, as <code><b>decreasing</b></code> or
    <code><b>increasing</b></code>.</dd>

    <dd class="tm">If the specified column's <code><b><a href=
    "tablelistWidget.html#col_showlinenumbers">-showlinenumbers</a></b></code>
    option has been set to true, then the actions described above are not
    performed and the return value is an empty string.</dd>

    <dd class="tm"><code><b>tablelist::sortByColumn</b></code> is usually
    specified as the value of the <code><b><a href=
    "tablelistWidget.html#labelcommand">-labelcommand</a></b></code>
    configuration option for a tablelist widget.</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, sort, column, widget</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="addToSortColumns">The <code><b>tablelist::addToSortColumns</b></code>
  Command</h2>

  <dl>
    <dt><b>NAME</b></dt>

    <dd><code>tablelist::addToSortColumns</code> &ndash; Add a column index to
    the list of sort columns and perform the multi-column sorting</dd>

    <dt class="tm"><b>SYNOPSIS</b></dt>

    <dd>
      <pre>
<b>tablelist::addToSortColumns</b> <i>pathName</i> <i>columnIndex</i>
</pre>
    </dd>

    <dt><b>DESCRIPTION</b></dt>

    <dd>This command adds the column index specified by
    <code><i>columnIndex</i></code> to the list of sort columns of the <a href=
    "tablelistWidget.html">tablelist</a> widget <code><i>pathName</i></code>
    and sorts the items based on the elements of the columns indicated by the
    modified list.&nbsp; This is done by invoking the <code><b><a href=
    "tablelistWidget.html#sortbycolumnlist">sortbycolumnlist</a></b></code>
    subcommand of the Tcl command associated with the given tablelist
    widget.&nbsp; The two arguments passed to
    <code><b>sortbycolumnlist</b></code> are built as follows: (a) if the given
    column index is already contained in the widget's list of sort columns
    (returned by the <code><b><a href=
    "tablelistWidget.html#sortcolumnlist">sortcolumnlist</a></b></code>
    subcommand) then this list is left unchanged and the sort order list
    (returned by the <code><b><a href=
    "tablelistWidget.html#sortorderlist">sortorderlist</a></b></code>
    subcommand) is updated by toggling its corresponding element from
    <code><b>increasing</b></code> to <code><b>decreasing</b></code> and
    vice-versa; (b) otherwise the column index is appended to the list of sort
    columns and the value <code><b>increasing</b></code> is appended to the
    list of sort orders.</dd>

    <dd class="tm">After sorting the items by passing the two updated lists to
    the <code><b>sortbycolumnlist</b></code> subcommand, the virtual event
    <code><b>&lt;&lt;TablelistColumnsSorted&gt;&gt;</b></code> (note the plural
    form!) is generated.&nbsp; For Tk versions 8.5 or higher, this virtual
    event is generated with its <code><b>-data</b></code> option set to a list
    consisting of the two above-mentioned updated lists passed to
    <code><b>sortbycolumnlist</b></code> as arguments.&nbsp; The command
    returns the new sort order corresponding to the given column, as
    <code><b>decreasing</b></code> or <code><b>increasing</b></code>.</dd>

    <dd class="tm">If the specified column's <code><b><a href=
    "tablelistWidget.html#col_showlinenumbers">-showlinenumbers</a></b></code>
    option has been set to true, then the actions described above are not
    performed and the return value is an empty string.</dd>

    <dd class="tm"><code><b>tablelist::addToSortColumns</b></code> is usually
    specified as the value of the <code><b><a href=
    "tablelistWidget.html#labelcommand2">-labelcommand2</a></b></code>
    configuration option for a tablelist widget.</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, sort, column list, widget</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
</body>
</html>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/doc/tablelistCombobox.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<html>
<head>
  <title>Interactive Tablelist Cell Editing Using the combobox Package</title>

  <meta name="Author" content="Csaba Nemethi">
  <meta name="Keywords" content="tablelist, editing, combobox">

  <link rel="stylesheet" type="text/css" href="stylesheet.css">
</head>

<body bgcolor="#FFFFFF">
  <div align="center">
    <h1>Interactive Tablelist Cell Editing Using the combobox Package</h1>

    <h2>For Tablelist Version 5.13</h2>

    <h3>by</h3>

    <h2>Csaba Nemethi</h2>

    <address>
      <a href="mailto:csaba.nemethi@t-online.de">csaba.nemethi@t-online.de</a>
    </address>
  </div>
  <hr>

  <h2 id="contents">Contents</h2>

  <ul>
    <li><a href="#overview">Overview</a></li>

    <li><a href="#combobox">The
    <code><b>tablelist::addOakleyCombobox</b></code> Command</a></li>
  </ul>

  <div align="center">
    <p><a href="index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="overview">Overview</h2>

  <p>Bryan Oakley's combobox package is a library extension for Tcl/Tk versions
  8.0 or higher, written in pure Tcl/Tk code.&nbsp; Its download location
  is</p>

  <blockquote>
    <address>
      <a href=
      "http://www1.clearlight.com/~oakley/tcl/combobox">http://www1.clearlight.com/~oakley/tcl/combobox</a>
    </address>
  </blockquote>

  <p>Tablelist supports interactive cell editing with the aid of the combobox
  widget implemented in the package mentioned above.&nbsp; The steps needed for
  using this widget for editing the cells of a given column are as follows:</p>

  <ol>
    <li>Register the combobox widget for interactive cell editing by invoking
    the <code><b><a href=
    "#combobox">tablelist::addOakleyCombobox</a></b></code> command described
    below.</li>

    <li class="tm">Use the tablelist widget's <code><b><a href=
    "tablelistWidget.html#columnconfigure">columnconfigure</a></b></code>
    subcommand to set the given column's <code><b><a href=
    "tablelistWidget.html#col_editable">-editable</a></b></code> option to true
    and its <code><b><a href=
    "tablelistWidget.html#col_editwindow">-editwindow</a></b></code> option to
    the value returned by the command mentioned above.&nbsp; (These options are
    supported at cell level, too, with the aid of the <code><b><a href=
    "tablelistWidget.html#cellconfigure">cellconfigure</a></b></code>
    subcommand.)</li>
  </ol>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="combobox">The <code><b>tablelist::addOakleyCombobox</b></code>
  Command</h2>

  <dl>
    <dt><b>NAME</b></dt>

    <dd><code>tablelist::addOakleyCombobox</code> &ndash; Register Bryan
    Oakley's combobox widget for interactive cell editing</dd>

    <dt class="tm"><b>SYNOPSIS</b></dt>

    <dd>
      <pre>
<b>tablelist::addOakleyCombobox</b> ?<i>name</i>?
</pre>
    </dd>

    <dt><b>DESCRIPTION</b></dt>

    <dd>This command registers Bryan Oakley's combobox widget for interactive
    cell editing in tablelist widgets.&nbsp; The optional argument specifies
    the name to be used for the combobox widget as the value of the
    <code><b><a href=
    "tablelistWidget.html#col_editwindow">-editwindow</a></b></code> column or
    cell configuration option.&nbsp; It may be any string that is different
    from the <a href="tablelistTkCore.html">Tk core</a> and <a href=
    "tablelistTile.html">tile</a> edit window names.&nbsp; The default is
    <code><b>combobox</b></code>.&nbsp; The command returns its
    <code><i>name</i></code> argument.</dd>

    <dd class="tm">The temporary embedded combobox widget associated with the
    above <code><i>name</i></code> will be created with its
    <code><b>-editable</b></code> option set to <code>1</code>.&nbsp; You can
    use the script corresponding to the <code><b><a href=
    "tablelistWidget.html#editstartcommand">-editstartcommand</a></b></code>
    tablelist configuration option to make the combobox non-editable or define
    validations for its entry child (whose path name can be obtained by
    invoking the tablelist widget's <code><b><a href=
    "tablelistWidget.html#entrypath">entrypath</a></b></code> subcommand, or by
    appending <code><b>.entry</b></code> to the path name of the combobox
    widget, or, if using combobox version 2.3 or later, with the aid of the
    combobox widget's&nbsp; <code><b>subwidget entry</b></code>&nbsp;
    subcommand), as well as for populating its listbox component (by using the
    combobox widget's&nbsp; <code><b>list insert</b></code>&nbsp;
    subcommand).</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, editing, combobox</dd>
  </dl>

  <div align="center">
    <p><a href="index.html">Start page</a></p>
  </div>
</body>
</html>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


















































































































































































































































































Deleted scriptlibs/tablelist5.13/doc/tablelistCtext.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
<html>
<head>
  <title>Interactive Tablelist Cell Editing Using the ctext Package</title>

  <meta name="Author" content="Csaba Nemethi">
  <meta name="Keywords" content="tablelist, editing, ctext">

  <link rel="stylesheet" type="text/css" href="stylesheet.css">
</head>

<body bgcolor="#FFFFFF">
  <div align="center">
    <h1>Interactive Tablelist Cell Editing Using the ctext Package</h1>

    <h2>For Tablelist Version 5.13</h2>

    <h3>by</h3>

    <h2>Csaba Nemethi</h2>

    <address>
      <a href="mailto:csaba.nemethi@t-online.de">csaba.nemethi@t-online.de</a>
    </address>
  </div>
  <hr>

  <h2 id="contents">Contents</h2>

  <ul>
    <li><a href="#overview">Overview</a></li>

    <li><a href="#ctext">The <code><b>tablelist::addCtext</b></code>
    Command</a></li>
  </ul>

  <div align="center">
    <p><a href="index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="overview">Overview</h2>

  <p>George Peter Staplin's ctext package is a library extension for Tcl/Tk
  versions 8.0 or higher, written in pure Tcl/Tk code.&nbsp; It is part of
  tklib, which has the address</p>

  <blockquote>
    <address>
      <a href="http://core.tcl.tk/tklib">http://core.tcl.tk/tklib</a>
    </address>
  </blockquote>

  <p>Tablelist supports interactive cell editing with the aid of the ctext
  widget implemented in the package mentioned above.&nbsp; The steps needed for
  using this widget for editing the cells of a given column are as follows:</p>

  <ol>
    <li>Register the ctext widget for interactive cell editing by invoking the
    <code><b><a href="#ctext">tablelist::addCtext</a></b></code> command
    described below.</li>

    <li class="tm">Use the tablelist widget's <code><b><a href=
    "tablelistWidget.html#columnconfigure">columnconfigure</a></b></code>
    subcommand to set the given column's <code><b><a href=
    "tablelistWidget.html#col_editable">-editable</a></b></code> option to true
    and its <code><b><a href=
    "tablelistWidget.html#col_editwindow">-editwindow</a></b></code> option to
    the value returned by the command mentioned above.&nbsp; (These options are
    supported at cell level, too, with the aid of the <code><b><a href=
    "tablelistWidget.html#cellconfigure">cellconfigure</a></b></code>
    subcommand.)</li>
  </ol>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="ctext">The <code><b>tablelist::addCtext</b></code> Command</h2>

  <dl>
    <dt><b>NAME</b></dt>

    <dd><code>tablelist::addCtext</code> &ndash; Register the ctext widget for
    interactive cell editing</dd>

    <dt class="tm"><b>SYNOPSIS</b></dt>

    <dd>
      <pre>
<b>tablelist::addCtext</b> ?<i>name</i>?
</pre>
    </dd>

    <dt><b>DESCRIPTION</b></dt>

    <dd>This command registers the ctext widget for interactive cell editing in
    tablelist widgets.&nbsp; The optional argument specifies the name to be
    used for the ctext widget as the value of the <code><b><a href=
    "tablelistWidget.html#col_editwindow">-editwindow</a></b></code> column or
    cell configuration option.&nbsp; It may be any string that is different
    from the <a href="tablelistTkCore.html">Tk core</a> and <a href=
    "tablelistTile.html">tile</a> edit window names.&nbsp; The default is
    <code><b>ctext</b></code>.&nbsp; The command returns its
    <code><i>name</i></code> argument.</dd>

    <dd class="tm">The temporary embedded ctext widget used for interactive
    cell editing will be created with its <code><b>-padx</b></code> and
    <code><b>-pady</b></code> options set to <code>2</code>, its
    <code><b>-wrap</b></code> option set to <code><b>none</b></code>, and its
    initial height set to the number of lines contained in it.&nbsp; There is,
    however, an exception from this rule:&nbsp; If the <code><b><a href=
    "tablelistWidget.html#col_wrap">-wrap</a></b></code> option of the cell's
    column was set to true and Tk version 8.5 or higher is being used, then the
    ctext widget's <code><b>-wrap</b></code> option will be set to
    <code><b>word</b></code> and its initial height will equal the number of
    <i>display</i> lines (taking into account the line wraps) contained in
    it.&nbsp; You can use the script corresponding to the <code><b><a href=
    "tablelistWidget.html#editstartcommand">-editstartcommand</a></b></code>
    tablelist configuration option to override the initial settings according
    to your needs.</dd>

    <dd class="tm">If the ctext widget's <code><b>-wrap</b></code> option was
    set to <code><b>word</b></code> or <code><b>char</b></code> (either by
    Tablelist or from within the above-mentioned script) and Tk version 8.5 or
    higher is being used, then, whenever its width changes (e.g., due to
    interactive column resizing), its height will be set automatically to the
    number of display lines contained in it.&nbsp; (The number of display lines
    is retrieved with the aid of the&nbsp; <code><b>count
    -displaylines</b></code>&nbsp; ctext widget subcommand, introduced in Tk
    8.5.)</dd>

    <dd class="tm">If the widget callback package Wcb was loaded into the
    interpreter (via&nbsp; <code><b>package require Wcb</b></code>&nbsp;
    or&nbsp; <code><b>package require wcb</b></code>)&nbsp; then the ctext
    widget's height will be updated automatically whenever text is inserted
    into or deleted from it, which makes the editing much more
    user-friendly.&nbsp; This is achieved by using an appropriately defined
    after-<code><b>insert</b></code> and after-<code><b>delete</b></code>
    callback for the edit window.&nbsp; You can use the script corresponding to
    the <code><b><a href=
    "tablelistWidget.html#editstartcommand">-editstartcommand</a></b></code>
    tablelist configuration option to define further callbacks for the ctext
    widget.&nbsp; (The above-mentioned callback is created via
    <code><b>wcb::cbappend</b></code>, <i>after</i> returning from that
    script.)</dd>

    <dd class="tm">The <code>Tab</code> key is reserved for navigation between
    the editable cells, but the user can insert a tabulator character into the
    ctext widget by pressing <code>Control-i</code>.</dd>

    <dd class="tm">Unlike in the case of the other widgets used for interactive
    cell editing (except the Tk core text widget), the <code>Return</code> and
    <code>KP_Enter</code> keys insert a newline character into the ctext
    widget.&nbsp; <code>Control-j</code> can also be used for inserting a
    newline.&nbsp; <code>Control-Return</code> and
    <code>Control-KP_Enter</code> terminate the editing and destroy the edit
    window.</dd>

    <dd class="tm"><code>Control-Home</code> and <code>Control-End</code> have
    their well-known text widget-specific bindings, just like
    <code>Meta-&lt;</code> and <code>Meta-&gt;</code> if
    <code><b>tk_strictMotif</b></code> is false.&nbsp; Again, this is different
    from the behavior of the other widgets used for interactive cell editing
    (except the Tk core text widget).&nbsp; For jumping into the first/last
    editable cell, the user can press
    <code>Alt-Home</code>/<code>Alt-End</code> or
    <code>Meta-Home</code>/<code>Meta-End</code>
    (<code>Command-Home</code>/<code>Command-End</code> on Mac OS Classic and
    Mac OS X Aqua).</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, editing, ctext</dd>
  </dl>

  <div align="center">
    <p><a href="index.html">Start page</a></p>
  </div>
</body>
</html>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<












































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/doc/tablelistIwidgets.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
<html>
<head>
  <title>Interactive Tablelist Cell Editing Using the Iwidgets Package</title>

  <meta name="Author" content="Csaba Nemethi">
  <meta name="Keywords" content="tablelist, editing, Iwidgets">

  <link rel="stylesheet" type="text/css" href="stylesheet.css">
</head>

<body bgcolor="#FFFFFF">
  <div align="center">
    <h1>Interactive Tablelist Cell Editing Using the Iwidgets Package</h1>

    <h2>For Tablelist Version 5.13</h2>

    <h3>by</h3>

    <h2>Csaba Nemethi</h2>

    <address>
      <a href="mailto:csaba.nemethi@t-online.de">csaba.nemethi@t-online.de</a>
    </address>
  </div>
  <hr>

  <h2 id="contents">Contents</h2>

  <ul>
    <li><a href="#overview">Overview</a></li>

    <li><a href="#entryfield">The
    <code><b>tablelist::addIncrEntryfield</b></code> Command</a></li>

    <li><a href="#dateTime">The
    <code><b>tablelist::addIncrDateTimeWidget</b></code> Command</a></li>

    <li><a href="#spinner">The <code><b>tablelist::addIncrSpinner</b></code>
    Command</a></li>

    <li><a href="#spinint">The <code><b>tablelist::addIncrSpinint</b></code>
    Command</a></li>

    <li><a href="#combobox">The <code><b>tablelist::addIncrCombobox</b></code>
    Command</a></li>
  </ul>

  <div align="center">
    <p><a href="index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="overview">Overview</h2>

  <p>The Iwidgets package (also known as [incr Widgets]) is a library extension
  for Tcl/Tk versions 8.0 or higher, written in pure Tcl/Tk code.&nbsp; It
  requires the compiled packages Itcl and Itk (also known as [incr Tcl] and
  [incr Tk], respectively).&nbsp; The download location of these three library
  packages is</p>

  <blockquote>
    <address>
      <a href=
      "http://sourceforge.net/projects/incrtcl/files">http://sourceforge.net/projects/incrtcl/files</a>
    </address>
  </blockquote>

  <p>Tablelist supports interactive cell editing with the aid of the
  entryfield, datefield, dateentry, timefield, timeentry, spinner, spinint, and
  combobox widgets from the Iwidgets package.&nbsp; The steps needed for using
  one of these widgets for editing the cells of a given column are as
  follows:</p>

  <ol>
    <li>Register the desired widget for interactive cell editing by invoking
    one of the commands described in this reference page.</li>

    <li class="tm">Use the tablelist widget's <code><b><a href=
    "tablelistWidget.html#columnconfigure">columnconfigure</a></b></code>
    subcommand to set the given column's <code><b><a href=
    "tablelistWidget.html#col_editable">-editable</a></b></code> option to true
    and its <code><b><a href=
    "tablelistWidget.html#col_editwindow">-editwindow</a></b></code> option to
    the value returned by the command mentioned above.&nbsp; (These options are
    supported at cell level, too, with the aid of the <code><b><a href=
    "tablelistWidget.html#cellconfigure">cellconfigure</a></b></code>
    subcommand.)</li>
  </ol>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="entryfield">The <code><b>tablelist::addIncrEntryfield</b></code>
  Command</h2>

  <dl>
    <dt><b>NAME</b></dt>

    <dd><code>tablelist::addIncrEntryfield</code> &ndash; Register the
    entryfield widget from the Iwidgets package for interactive cell
    editing</dd>

    <dt class="tm"><b>SYNOPSIS</b></dt>

    <dd>
      <pre>
<b>tablelist::addIncrEntryfield</b> ?<i>name</i>?
</pre>
    </dd>

    <dt><b>DESCRIPTION</b></dt>

    <dd>This command registers the entryfield widget from the Iwidgets package
    for interactive cell editing in tablelist widgets.&nbsp; The optional
    argument specifies the name to be used for the entryfield widget as the
    value of the <code><b><a href=
    "tablelistWidget.html#col_editwindow">-editwindow</a></b></code> column or
    cell configuration option.&nbsp; It may be any string that is different
    from the <a href="tablelistTkCore.html">Tk core</a> and <a href=
    "tablelistTile.html">tile</a> edit window names.&nbsp; The default is
    <code><b>entryfield</b></code>.&nbsp; The command returns its
    <code><i>name</i></code> argument.</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, editing, Iwidgets, entryfield</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="dateTime">The <code><b>tablelist::addIncrDateTimeWidget</b></code>
  Command</h2>

  <dl>
    <dt><b>NAME</b></dt>

    <dd><code>tablelist::addIncrDateTimeWidget</code> &ndash; Register the
    datefield, dateentry, timefield, or timeentry widget from the Iwidgets
    package for interactive cell editing</dd>

    <dt class="tm"><b>SYNOPSIS</b></dt>

    <dd>
      <pre>
<b>tablelist::addIncrDateTimeWidget</b> <b>datefield</b>|<b>dateentry</b>|<b>timefield</b>|<b>timeentry</b> ?<b>-seconds</b>? ?<i>name</i>?
</pre>
    </dd>

    <dt><b>DESCRIPTION</b></dt>

    <dd>This command registers the datefield, dateentry, timefield, or
    timeentry widget from the Iwidgets package for interactive cell editing in
    tablelist widgets.&nbsp; If the <code><b>-seconds</b></code> argument is
    present then the <code><b><a href=
    "tablelistWidget.html#finishediting">finishediting</a></b></code>
    subcommand of the Tcl command associated with the tablelist widget will
    retrieve the contents of the embedded window used for interactive cell
    editing as an integer clock value (in seconds), otherwise as a
    string.&nbsp; Use this option for tablelist widgets whose internal list
    contains date or time information in seconds (displayed with the aid of
    commands given by the <code><b><a href=
    "tablelistWidget.html#col_formatcommand">-formatcommand</a></b></code>
    column configuration option).&nbsp; The second optional argument specifies
    the name to be used for the datefield, dateentry, timefield, or timeentry
    widget as the value of the <code><b><a href=
    "tablelistWidget.html#col_editwindow">-editwindow</a></b></code> column or
    cell configuration option.&nbsp; It may be any string that is different
    from the <a href="tablelistTkCore.html">Tk core</a> and <a href=
    "tablelistTile.html">tile</a> edit window names.&nbsp; The default is
    <code><b>datefield</b></code>, <code><b>dateentry</b></code>,
    <code><b>timefield</b></code>, or <code><b>timeentry</b></code>, as given
    by the first argument.&nbsp; The command returns its
    <code><i>name</i></code> argument.</dd>

    <dd class="tm">When editing a cell with the aid of the temporary embedded
    datefield, dateentry, timefield, or timeentry widget associated with the
    above <code><i>name</i></code>, you can use the script corresponding to the
    <code><b><a href=
    "tablelistWidget.html#editstartcommand">-editstartcommand</a></b></code>
    tablelist configuration option to set any of the widget's options, like
    <code><b>-gmt</b></code>, <code><b>-iq</b></code>, <code><b>-int</b></code>
    ("international" date format, supported by datefield and dateentry
    widgets), or <code><b>-format</b></code> (for timefield and timeentry
    widgets, with the values <code><b>civilian</b></code> and
    <code><b>military</b></code>).</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, editing, Iwidgets, datefield, dateentry, timefield,
    timeentry</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="spinner">The <code><b>tablelist::addIncrSpinner</b></code>
  Command</h2>

  <dl>
    <dt><b>NAME</b></dt>

    <dd><code>tablelist::addIncrSpinner</code> &ndash; Register the spinner
    widget from the Iwidgets package for interactive cell editing</dd>

    <dt class="tm"><b>SYNOPSIS</b></dt>

    <dd>
      <pre>
<b>tablelist::addIncrSpinner</b> ?<i>name</i>?
</pre>
    </dd>

    <dt><b>DESCRIPTION</b></dt>

    <dd>This command registers the spinner widget from the Iwidgets package for
    interactive cell editing in tablelist widgets.&nbsp; The optional argument
    specifies the name to be used for the spinner widget as the value of the
    <code><b><a href=
    "tablelistWidget.html#col_editwindow">-editwindow</a></b></code> column or
    cell configuration option.&nbsp; It may be any string that is different
    from the <a href="tablelistTkCore.html">Tk core</a> and <a href=
    "tablelistTile.html">tile</a> edit window names.&nbsp; The default is
    <code><b>spinner</b></code>.&nbsp; The command returns its
    <code><i>name</i></code> argument.</dd>

    <dd class="tm">When editing a cell with the aid of the temporary embedded
    spinner widget associated with the above <code><i>name</i></code>, you can
    use the script corresponding to the <code><b><a href=
    "tablelistWidget.html#editstartcommand">-editstartcommand</a></b></code>
    tablelist configuration option to define validations for the widget or set
    any of its other options, like <code><b>-decrement</b></code> and
    <code><b>-increment</b></code>.</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, editing, Iwidgets, spinner</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="spinint">The <code><b>tablelist::addIncrSpinint</b></code>
  Command</h2>

  <dl>
    <dt><b>NAME</b></dt>

    <dd><code>tablelist::addIncrSpinint</code> &ndash; Register the spinint
    widget from the Iwidgets package for interactive cell editing</dd>

    <dt class="tm"><b>SYNOPSIS</b></dt>

    <dd>
      <pre>
<b>tablelist::addIncrSpinint</b> ?<i>name</i>?
</pre>
    </dd>

    <dt><b>DESCRIPTION</b></dt>

    <dd>This command registers the spinint widget from the Iwidgets package for
    interactive cell editing in tablelist widgets.&nbsp; The optional argument
    specifies the name to be used for the spinint widget as the value of the
    <code><b><a href=
    "tablelistWidget.html#col_editwindow">-editwindow</a></b></code> column or
    cell configuration option.&nbsp; It may be any string that is different
    from the <a href="tablelistTkCore.html">Tk core</a> and <a href=
    "tablelistTile.html">tile</a> edit window names.&nbsp; The default is
    <code><b>spinint</b></code>.&nbsp; The command returns its
    <code><i>name</i></code> argument.</dd>

    <dd class="tm">When editing a cell with the aid of the temporary embedded
    spinint widget associated with the above <code><i>name</i></code>, you can
    use the script corresponding to the <code><b><a href=
    "tablelistWidget.html#editstartcommand">-editstartcommand</a></b></code>
    tablelist configuration option to define validations for the widget or set
    any of its other options, like <code><b>-range</b></code>,
    <code><b>-step</b></code>, and <code><b>-wrap</b></code>.</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, editing, Iwidgets, spinint</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="combobox">The <code><b>tablelist::addIncrCombobox</b></code>
  Command</h2>

  <dl>
    <dt><b>NAME</b></dt>

    <dd><code>tablelist::addIncrCombobox</code> &ndash; Register the combobox
    widget from the Iwidgets package for interactive cell editing</dd>

    <dt class="tm"><b>SYNOPSIS</b></dt>

    <dd>
      <pre>
<b>tablelist::addIncrCombobox</b> ?<i>name</i>?
</pre>
    </dd>

    <dt><b>DESCRIPTION</b></dt>

    <dd>This command registers the dropdown-style combobox widget from the
    Iwidgets package for interactive cell editing in tablelist widgets.&nbsp;
    The optional argument specifies the name to be used for the combobox widget
    as the value of the <code><b><a href=
    "tablelistWidget.html#col_editwindow">-editwindow</a></b></code> column or
    cell configuration option.&nbsp; It may be any string that is different
    from the <a href="tablelistTkCore.html">Tk core</a> and <a href=
    "tablelistTile.html">tile</a> edit window names.&nbsp; The default is
    <code><b>combobox</b></code>.&nbsp; The command returns its
    <code><i>name</i></code> argument.</dd>

    <dd class="tm">The temporary embedded combobox widget associated with the
    above <code><i>name</i></code> will be created with its
    <code><b>-editable</b></code> option set to <code>1</code>.&nbsp; You can
    use the script corresponding to the <code><b><a href=
    "tablelistWidget.html#editstartcommand">-editstartcommand</a></b></code>
    tablelist configuration option to make the combobox non-editable or define
    validations for it, as well as for populating its listbox component (by
    using the combobox widget's&nbsp; <code><b>insert list</b></code>&nbsp;
    subcommand).</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, editing, Iwidgets, combobox</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
</body>
</html>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/doc/tablelistMentry.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
<html>
<head>
  <title>Interactive Tablelist Cell Editing Using the Mentry Package</title>

  <meta name="Author" content="Csaba Nemethi">
  <meta name="Keywords" content="tablelist, editing, Mentry">

  <link rel="stylesheet" type="text/css" href="stylesheet.css">
</head>

<body bgcolor="#FFFFFF">
  <div align="center">
    <h1>Interactive Tablelist Cell Editing Using the Mentry Package</h1>

    <h2>For Tablelist Version 5.13</h2>

    <h3>by</h3>

    <h2>Csaba Nemethi</h2>

    <address>
      <a href="mailto:csaba.nemethi@t-online.de">csaba.nemethi@t-online.de</a>
    </address>
  </div>
  <hr>

  <h2 id="contents">Contents</h2>

  <ul>
    <li><a href="#overview">Overview</a></li>

    <li><a href="#Date">The <code><b>tablelist::addDateMentry</b></code>
    Command</a></li>

    <li><a href="#Time">The <code><b>tablelist::addTimeMentry</b></code>
    Command</a></li>

    <li><a href="#DateTime">The
    <code><b>tablelist::addDateTimeMentry</b></code> Command</a></li>

    <li><a href="#FixedPoint">The
    <code><b>tablelist::addFixedPointMentry</b></code> Command</a></li>

    <li><a href="#IPAddr">The <code><b>tablelist::addIPAddrMentry</b></code>
    Command</a></li>

    <li><a href="#IPv6Addr">The
    <code><b>tablelist::addIPv6AddrMentry</b></code> Command</a></li>
  </ul>

  <div align="center">
    <p><a href="index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="overview">Overview</h2>

  <p>The multi-entry package Mentry is a library extension for Tcl/Tk versions
  8.0 or higher, written in pure Tcl/Tk code.&nbsp; Its download location
  is</p>

  <blockquote>
    <address>
      <a href="http://www.nemethi.de">http://www.nemethi.de</a>
    </address>
  </blockquote>

  <p>Starting with version 3.0, the Mentry distribution provides not only the
  package Mentry, but also its tile-based equivalent Mentry_tile, which enables
  the theme-specific appearance of mentry widgets; this package requires Tcl/Tk
  8.4 or higher and tile 0.6 or higher.</p>

  <p>Tablelist supports interactive cell editing with the aid of the mentry
  widgets of type <code>"Date"</code>, <code>"Time"</code>,
  <code>"DateTime</code>, <code>"FixedPoint"</code>, <code>"IPAddr"</code>, and
  <code>"IPv6Addr"</code>.&nbsp; The steps needed for using one of these
  widgets for editing the cells of a given column are as follows:</p>

  <ol>
    <li>Register the desired widget for interactive cell editing by invoking
    one of the commands described in this reference page.</li>

    <li class="tm">Use the tablelist widget's <code><b><a href=
    "tablelistWidget.html#columnconfigure">columnconfigure</a></b></code>
    subcommand to set the given column's <code><b><a href=
    "tablelistWidget.html#col_editable">-editable</a></b></code> option to true
    and its <code><b><a href=
    "tablelistWidget.html#col_editwindow">-editwindow</a></b></code> option to
    the value returned by the command mentioned above.&nbsp; (These options are
    supported at cell level, too, with the aid of the <code><b><a href=
    "tablelistWidget.html#cellconfigure">cellconfigure</a></b></code>
    subcommand.)</li>
  </ol>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="Date">The <code><b>tablelist::addDateMentry</b></code> Command</h2>

  <dl>
    <dt><b>NAME</b></dt>

    <dd><code>tablelist::addDateMentry</code> &ndash; Register the mentry
    widget of type <code>"Date"</code> for interactive cell editing</dd>

    <dt class="tm"><b>SYNOPSIS</b></dt>

    <dd>
      <pre>
<b>tablelist::addDateMentry</b> <i>format separator</i> ?<b>-gmt</b>? ?<i>name</i>?
</pre>
    </dd>

    <dt><b>DESCRIPTION</b></dt>

    <dd>This command registers the widget created by the
    <code><b>mentry::dateMentry</b></code> command from the Mentry (or
    Mentry_tile) package for interactive cell editing in tablelist
    widgets.&nbsp; The <code><i>format</i></code> and
    <code><i>separator</i></code> arguments have the same meanings as in the
    <code><b>mentry::dateMentry</b></code> command.&nbsp; If the
    <code><b>-gmt</b></code> argument is present then both the internal clock
    value and its external date representation in the mentry widget will be
    viewed as Greenwich Mean Time, otherwise as local time.&nbsp; The second
    optional argument specifies the name to be used for the mentry widget as
    the value of the <code><b><a href=
    "tablelistWidget.html#col_editwindow">-editwindow</a></b></code> column or
    cell configuration option.&nbsp; It may be any string that is different
    from the <a href="tablelistTkCore.html">Tk core</a> and <a href=
    "tablelistTile.html">tile</a> edit window names.&nbsp; The default is
    <code><b>dateMentry</b></code>.&nbsp; The command returns its
    <code><i>name</i></code> argument.</dd>

    <dd class="tm">A tablelist column having the above <code><i>name</i></code>
    as the value of its <code><b>-editwindow</b></code> option must contain as
    internal cell values date information in seconds (displayed with the aid of
    a command given by the <code><b><a href=
    "tablelistWidget.html#col_formatcommand">-formatcommand</a></b></code>
    column configuration option).&nbsp; The <code><b><a href=
    "tablelistWidget.html#finishediting">finishediting</a></b></code>
    subcommand of the Tcl command associated with the tablelist widget will
    retrieve the contents of the embedded window used for interactive cell
    editing by invoking the <code><b>mentry::getClockVal</b></code>
    command.&nbsp; The value returned by this command (a clock value in seconds
    or one of the error strings <code>"EMPTY"</code>, <code>"BAD"</code>,
    <code>"BAD_DATE"</code>, or <code>"BAD_YEAR"</code>) will be passed to the
    script corresponding to the <code><b><a href=
    "tablelistWidget.html#editendcommand">-editendcommand</a></b></code>
    tablelist configuration option (if any), as its last argument.&nbsp; If
    this value is one of the above error strings then the script should reject
    the mentry's contents by invoking the <code><b><a href=
    "tablelistWidget.html#rejectinput">rejectinput</a></b></code>
    subcommand.</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, editing, Mentry, date</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="Time">The <code><b>tablelist::addTimeMentry</b></code> Command</h2>

  <dl>
    <dt><b>NAME</b></dt>

    <dd><code>tablelist::addTimeMentry</code> &ndash; Register the mentry
    widget of type <code>"Time"</code> for interactive cell editing</dd>

    <dt class="tm"><b>SYNOPSIS</b></dt>

    <dd>
      <pre>
<b>tablelist::addTimeMentry</b> <i>format separator</i> ?<b>-gmt</b>? ?<i>name</i>?
</pre>
    </dd>

    <dt><b>DESCRIPTION</b></dt>

    <dd>This command registers the widget created by the
    <code><b>mentry::timeMentry</b></code> command from the Mentry (or
    Mentry_tile) package for interactive cell editing in tablelist
    widgets.&nbsp; The <code><i>format</i></code> and
    <code><i>separator</i></code> arguments have the same meanings as in the
    <code><b>mentry::timeMentry</b></code> command.&nbsp; If the
    <code><b>-gmt</b></code> argument is present then both the internal clock
    value and its external time representation in the mentry widget will be
    viewed as Greenwich Mean Time, otherwise as local time.&nbsp; The second
    optional argument specifies the name to be used for the mentry widget as
    the value of the <code><b><a href=
    "tablelistWidget.html#col_editwindow">-editwindow</a></b></code> column or
    cell configuration option.&nbsp; It may be any string that is different
    from the <a href="tablelistTkCore.html">Tk core</a> and <a href=
    "tablelistTile.html">tile</a> edit window names.&nbsp; The default is
    <code><b>timeMentry</b></code>.&nbsp; The command returns its
    <code><i>name</i></code> argument.</dd>

    <dd class="tm">A tablelist column having the above <code><i>name</i></code>
    as the value of its <code><b>-editwindow</b></code> option must contain as
    internal cell values time information in seconds (displayed with the aid of
    a command given by the <code><b><a href=
    "tablelistWidget.html#col_formatcommand">-formatcommand</a></b></code>
    column configuration option).&nbsp; The <code><b><a href=
    "tablelistWidget.html#finishediting">finishediting</a></b></code>
    subcommand of the Tcl command associated with the tablelist widget will
    retrieve the contents of the embedded window used for interactive cell
    editing by invoking the <code><b>mentry::getClockVal</b></code>
    command.&nbsp; The value returned by this command (a clock value in seconds
    or one of the error strings <code>"EMPTY"</code> or <code>"BAD"</code>)
    will be passed to the script corresponding to the <code><b><a href=
    "tablelistWidget.html#editendcommand">-editendcommand</a></b></code>
    tablelist configuration option (if any), as its last argument.&nbsp; If
    this value is one of the above error strings then the script should reject
    the mentry's contents by invoking the <code><b><a href=
    "tablelistWidget.html#rejectinput">rejectinput</a></b></code>
    subcommand.</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, editing, Mentry, time</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="DateTime">The <code><b>tablelist::addDateTimeMentry</b></code>
  Command</h2>

  <dl>
    <dt><b>NAME</b></dt>

    <dd><code>tablelist::addDateTimeMentry</code> &ndash; Register the mentry
    widget of type <code>"DateTime"</code> for interactive cell editing</dd>

    <dt class="tm"><b>SYNOPSIS</b></dt>

    <dd>
      <pre>
<b>tablelist::addDateTimeMentry</b> <i>format dateSeparator timeSeparator</i> ?<b>-gmt</b>? ?<i>name</i>?
</pre>
    </dd>

    <dt><b>DESCRIPTION</b></dt>

    <dd>This command registers the widget created by the
    <code><b>mentry::dateTimeMentry</b></code> command from the Mentry (or
    Mentry_tile) package for interactive cell editing in tablelist
    widgets.&nbsp; The <code><i>format</i></code>,
    <code><i>dateSeparator</i></code>, and <code><i>timeSeparator</i></code>
    arguments have the same meanings as in the
    <code><b>mentry::dateTimeMentry</b></code> command.&nbsp; If the
    <code><b>-gmt</b></code> argument is present then both the internal clock
    value and its external date &amp; time representation in the mentry widget
    will be viewed as Greenwich Mean Time, otherwise as local time.&nbsp; The
    second optional argument specifies the name to be used for the mentry
    widget as the value of the <code><b><a href=
    "tablelistWidget.html#col_editwindow">-editwindow</a></b></code> column or
    cell configuration option.&nbsp; It may be any string that is different
    from the <a href="tablelistTkCore.html">Tk core</a> and <a href=
    "tablelistTile.html">tile</a> edit window names.&nbsp; The default is
    <code><b>dateTimeMentry</b></code>.&nbsp; The command returns its
    <code><i>name</i></code> argument.</dd>

    <dd class="tm">A tablelist column having the above <code><i>name</i></code>
    as the value of its <code><b>-editwindow</b></code> option must contain as
    internal cell values date &amp; time information in seconds (displayed with
    the aid of a command given by the <code><b><a href=
    "tablelistWidget.html#col_formatcommand">-formatcommand</a></b></code>
    column configuration option).&nbsp; The <code><b><a href=
    "tablelistWidget.html#finishediting">finishediting</a></b></code>
    subcommand of the Tcl command associated with the tablelist widget will
    retrieve the contents of the embedded window used for interactive cell
    editing by invoking the <code><b>mentry::getClockVal</b></code>
    command.&nbsp; The value returned by this command (a clock value in seconds
    or one of the error strings <code>"EMPTY"</code>, <code>"BAD"</code>,
    <code>"BAD_DATE"</code>, or <code>"BAD_YEAR"</code>) will be passed to the
    script corresponding to the <code><b><a href=
    "tablelistWidget.html#editendcommand">-editendcommand</a></b></code>
    tablelist configuration option (if any), as its last argument.&nbsp; If
    this value is one of the above error strings then the script should reject
    the mentry's contents by invoking the <code><b><a href=
    "tablelistWidget.html#rejectinput">rejectinput</a></b></code>
    subcommand.</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, editing, Mentry, date, time</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="FixedPoint">The <code><b>tablelist::addFixedPointMentry</b></code>
  Command</h2>

  <dl>
    <dt><b>NAME</b></dt>

    <dd><code>tablelist::addFixedPointMentry</code> &ndash; Register the mentry
    widget of type <code>"FixedPoint"</code> for interactive cell editing</dd>

    <dt class="tm"><b>SYNOPSIS</b></dt>

    <dd>
      <pre>
<b>tablelist::addFixedPointMentry</b> <i>count1 count2</i> ?<b>-comma</b>? ?<i>name</i>?
</pre>
    </dd>

    <dt><b>DESCRIPTION</b></dt>

    <dd>This command registers the widget created by the
    <code><b>mentry::fixedPointMentry</b></code> command from the Mentry (or
    Mentry_tile) package for interactive cell editing in tablelist
    widgets.&nbsp; The <code><i>count1</i></code>, <code><i>count2</i></code>,
    and <code><i>-comma</i></code> arguments have the same meanings as in the
    <code><b>mentry::fixedPointMentry</b></code> command.&nbsp; The second
    optional argument specifies the name to be used for the mentry widget as
    the value of the <code><b><a href=
    "tablelistWidget.html#col_editwindow">-editwindow</a></b></code> column or
    cell configuration option.&nbsp; It may be any string that is different
    from the <a href="tablelistTkCore.html">Tk core</a> and <a href=
    "tablelistTile.html">tile</a> edit window names.&nbsp; The default is
    <code><b>fixedPointMentry_</b><i>count1</i><b>.</b><i>count2</i></code>
    (e.g., <code><b>fixedPointMentry_6.2</b></code>) or
    <code><b>fixedPointMentry_</b><i>count1</i><b>,</b><i>count2</i></code>
    (e.g., <code><b>fixedPointMentry_6,2</b></code>), depending on the presence
    of the optional <code><b>-comma</b></code> argument.&nbsp; The command
    returns its <code><i>name</i></code> argument.</dd>

    <dd class="tm">A tablelist column having the above <code><i>name</i></code>
    as the value of its <code><b>-editwindow</b></code> option must contain
    real numbers as internal cell values.&nbsp; The <code><b><a href=
    "tablelistWidget.html#finishediting">finishediting</a></b></code>
    subcommand of the Tcl command associated with the tablelist widget will
    retrieve the contents of the embedded window used for interactive cell
    editing by invoking the <code><b>mentry::getReal</b></code> command.&nbsp;
    The value returned by this command (a real number or the error string
    <code>"EMPTY"</code>) will be passed to the script corresponding to the
    <code><b><a href=
    "tablelistWidget.html#editendcommand">-editendcommand</a></b></code>
    tablelist configuration option (if any), as its last argument.&nbsp; If
    this value is the above error string then the script should reject the
    mentry's contents by invoking the <code><b><a href=
    "tablelistWidget.html#rejectinput">rejectinput</a></b></code>
    subcommand.</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, editing, Mentry, real number</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="IPAddr">The <code><b>tablelist::addIPAddrMentry</b></code>
  Command</h2>

  <dl>
    <dt><b>NAME</b></dt>

    <dd><code>tablelist::addIPAddrMentry</code> &ndash; Register the mentry
    widget of type <code>"IPAddr"</code> for interactive cell editing</dd>

    <dt class="tm"><b>SYNOPSIS</b></dt>

    <dd>
      <pre>
<b>tablelist::addIPAddrMentry</b> ?<i>name</i>?
</pre>
    </dd>

    <dt><b>DESCRIPTION</b></dt>

    <dd>This command registers the widget created by the
    <code><b>mentry::ipAddrMentry</b></code> command from the Mentry (or
    Mentry_tile) package for interactive cell editing in tablelist
    widgets.&nbsp; The optional argument specifies the name to be used for the
    mentry widget as the value of the <code><b><a href=
    "tablelistWidget.html#col_editwindow">-editwindow</a></b></code> column or
    cell configuration option.&nbsp; It may be any string that is different
    from the <a href="tablelistTkCore.html">Tk core</a> and <a href=
    "tablelistTile.html">tile</a> edit window names.&nbsp; The default is
    <code><b>ipAddrMentry</b></code>.&nbsp; The command returns its
    <code><i>name</i></code> argument.</dd>

    <dd class="tm">A tablelist column having the above <code><i>name</i></code>
    as the value of its <code><b>-editwindow</b></code> option must contain IP
    addresses as internal cell values.&nbsp; The <code><b><a href=
    "tablelistWidget.html#finishediting">finishediting</a></b></code>
    subcommand of the Tcl command associated with the tablelist widget will
    retrieve the contents of the embedded window used for interactive cell
    editing by invoking the <code><b>mentry::getIPAddr</b></code>
    command.&nbsp; The value returned by this command (an IP address or the
    error string <code>"EMPTY"</code>) will be passed to the script
    corresponding to the <code><b><a href=
    "tablelistWidget.html#editendcommand">-editendcommand</a></b></code>
    tablelist configuration option (if any), as its last argument.&nbsp; If
    this value is the above error string then the script should reject the
    mentry's contents by invoking the <code><b><a href=
    "tablelistWidget.html#rejectinput">rejectinput</a></b></code>
    subcommand.</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, editing, Mentry, IP address</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="IPv6Addr">The <code><b>tablelist::addIPv6AddrMentry</b></code>
  Command</h2>

  <dl>
    <dt><b>NAME</b></dt>

    <dd><code>tablelist::addIPv6AddrMentry</code> &ndash; Register the mentry
    widget of type <code>"IPv6Addr"</code> for interactive cell editing</dd>

    <dt class="tm"><b>SYNOPSIS</b></dt>

    <dd>
      <pre>
<b>tablelist::addIPv6AddrMentry</b> ?<i>name</i>?
</pre>
    </dd>

    <dt><b>DESCRIPTION</b></dt>

    <dd>This command registers the widget created by the
    <code><b>mentry::ipv6AddrMentry</b></code> command from the Mentry (or
    Mentry_tile) package for interactive cell editing in tablelist
    widgets.&nbsp; The optional argument specifies the name to be used for the
    mentry widget as the value of the <code><b><a href=
    "tablelistWidget.html#col_editwindow">-editwindow</a></b></code> column or
    cell configuration option.&nbsp; It may be any string that is different
    from the <a href="tablelistTkCore.html">Tk core</a> and <a href=
    "tablelistTile.html">tile</a> edit window names.&nbsp; The default is
    <code><b>ipv6AddrMentry</b></code>.&nbsp; The command returns its
    <code><i>name</i></code> argument.</dd>

    <dd class="tm">A tablelist column having the above <code><i>name</i></code>
    as the value of its <code><b>-editwindow</b></code> option must contain
    IPv6 addresses as internal cell values.&nbsp; The <code><b><a href=
    "tablelistWidget.html#finishediting">finishediting</a></b></code>
    subcommand of the Tcl command associated with the tablelist widget will
    retrieve the contents of the embedded window used for interactive cell
    editing by invoking the <code><b>mentry::getIPv6Addr</b></code>
    command.&nbsp; The value returned by this command (an IPv6 address or the
    error string <code>"EMPTY"</code>) will be passed to the script
    corresponding to the <code><b><a href=
    "tablelistWidget.html#editendcommand">-editendcommand</a></b></code>
    tablelist configuration option (if any), as its last argument.&nbsp; If
    this value is the above error string then the script should reject the
    mentry's contents by invoking the <code><b><a href=
    "tablelistWidget.html#rejectinput">rejectinput</a></b></code>
    subcommand.</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, editing, Mentry, IPv6 address</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
</body>
</html>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/doc/tablelistThemes.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
<html>
<head>
  <title>Commands Related to Tile Themes</title>

  <meta name="Author" content="Csaba Nemethi">
  <meta name="Keywords" content="tablelist, theme, tile">

  <link rel="stylesheet" type="text/css" href="stylesheet.css">
</head>

<body bgcolor="#FFFFFF">
  <div align="center">
    <h1>Commands Related to Tile Themes</h1>

    <h2>For Tablelist Version 5.13</h2>

    <h3>by</h3>

    <h2>Csaba Nemethi</h2>

    <address>
      <a href="mailto:csaba.nemethi@t-online.de">csaba.nemethi@t-online.de</a>
    </address>
  </div>
  <hr>

  <h2 id="contents">Contents</h2>

  <ul>
    <li><a href="#overview">Overview</a></li>

    <li><a href="#setTheme">The <code><b>tablelist::setTheme</b></code>
    Command</a></li>

    <li><a href="#getCurrentTheme">The
    <code><b>tablelist::getCurrentTheme</b></code> Command</a></li>

    <li><a href="#getThemes">The <code><b>tablelist::getThemes</b></code>
    Command</a></li>

    <li><a href="#setThemeDefaults">The
    <code><b>tablelist::setThemeDefaults</b></code> Command</a></li>
  </ul>

  <div align="center">
    <p><a href="index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="overview">Overview</h2>

  <p>The commands described in this reference page should only be invoked when
  using the package Tablelist_tile.&nbsp; They enable you to set and query the
  current theme, to retrieve a list of the available themes, and to make sure
  that your widgets will have a theme-specific appearance.</p>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="setTheme">The <code><b>tablelist::setTheme</b></code> Command</h2>

  <dl>
    <dt><b>NAME</b></dt>

    <dd><code>tablelist::setTheme</code> &ndash; Set the current theme</dd>

    <dt class="tm"><b>SYNOPSIS</b></dt>

    <dd>
      <pre>
<b>tablelist::setTheme</b> <i>theme</i>
</pre>
    </dd>

    <dt><b>DESCRIPTION</b></dt>

    <dd>This command sets the current theme to <code><i>theme</i></code>,
    loading it if necessary.&nbsp; It is simply an alias for
    <code><b>ttk::setTheme</b></code> or <code><b>tile::setTheme</b></code>,
    depending on the tile version loaded into the interpreter.&nbsp; (The
    <code><b>tile::setTheme</b></code> command was renamed to
    <code><b>ttk::setTheme</b></code> in tile version 0.8.)</dd>

    <dd class="tm">Being just an alias for a tile library procedure, the
    <code><b>tablelist::setTheme</b></code> command does exactly the same as
    the original one: It loads the package implementing the given theme if
    needed, sets the theme to the specified one, and saves the latter in the
    variable <code><b>ttk::currentTheme</b></code> or
    <code><b>tile::currentTheme</b></code>, depending on the current tile
    version.</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, theme, tile</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="getCurrentTheme">The <code><b>tablelist::getCurrentTheme</b></code>
  Command</h2>

  <dl>
    <dt><b>NAME</b></dt>

    <dd><code>tablelist::getCurrentTheme</code> &ndash; Get the current
    theme</dd>

    <dt class="tm"><b>SYNOPSIS</b></dt>

    <dd>
      <pre>
<b>tablelist::getCurrentTheme</b>
</pre>
    </dd>

    <dt><b>DESCRIPTION</b></dt>

    <dd>This command returns the value of the variable
    <code><b>ttk::currentTheme</b></code> or
    <code><b>tile::currentTheme</b></code>, depending on the tile version
    loaded into the interpreter.&nbsp; (The namespace containing the variable
    <code><b>currentTheme</b></code> was changed in tile version 0.8 from
    <code><b>tile</b></code> to <code><b>ttk</b></code>.)</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, theme, tile</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="getThemes">The <code><b>tablelist::getThemes</b></code> Command</h2>

  <dl>
    <dt><b>NAME</b></dt>

    <dd><code>tablelist::getThemes</code> &ndash; Get the themes registered in
    the package database</dd>

    <dt class="tm"><b>SYNOPSIS</b></dt>

    <dd>
      <pre>
<b>tablelist::getThemes</b>
</pre>
    </dd>

    <dt><b>DESCRIPTION</b></dt>

    <dd>This command returns a list of the themes registered in the package
    database.&nbsp; It is simply an alias for <code><b>ttk::themes</b></code>
    or <code><b>tile::availableThemes</b></code>, depending on the tile version
    loaded into the interpreter.&nbsp; (The
    <code><b>tile::availableThemes</b></code> command was renamed to
    <code><b>ttk::themes</b></code> in tile version 0.8.)</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, theme, tile</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="setThemeDefaults"><code><b>tablelist::setThemeDefaults</b></code>
  Command</h2>

  <dl>
    <dt><b>NAME</b></dt>

    <dd><code>tablelist::setThemeDefaults</code> &ndash; Set theme-specific
    default values of some tablelist configuration options</dd>

    <dt class="tm"><b>SYNOPSIS</b></dt>

    <dd>
      <pre>
<b>tablelist::setThemeDefaults</b>
</pre>
    </dd>

    <dt><b>DESCRIPTION</b></dt>

    <dd>This command populates the array
    <code><b>tablelist::themeDefaults</b></code> with theme-specific default
    values of a series of Tablelist configuration options.&nbsp; The array
    names are the command-line names of the options, and the corresponding
    array values are the default values of these configuration options for the
    currently set tile theme.</dd>

    <dd class="tm">The options whose names and values are written into the
    array <code><b>tablelist::themeDefaults</b></code> are:
    <code><b>-background</b></code>, <code><b>-foreground</b></code>,
    <code><b>-disabledforeground</b></code>,
    <code><b>-stripebackground</b></code>,
    <code><b>-selectbackground</b></code>,
    <code><b>-selectforeground</b></code>,
    <code><b>-selectborderwidth</b></code>, <code><b>-font</b></code>,
    <code><b>-labelforeground</b></code>, <code><b>-labelfont</b></code>,
    <code><b>-labelborderwidth</b></code>, <code><b>-labelpady</b></code>,
    <code><b>-arrowcolor</b></code>, <code><b>-arrowdisabledcolor</b></code>,
    <code><b>-arrowstyle</b></code>, and <code><b>-treestyle</b></code>.&nbsp;
    In addition, the command sets some other array elements to theme-specific
    default values of the background and foreground colors of the column labels
    in <code><b>normal</b></code>, <code><b>disabled</b></code>,
    <code><b>active</b></code>, and <code><b>pressed</b></code> states.&nbsp;
    (Tablelist needs the label colors for handling sort arrows and images with
    transparent background in the column labels.)</dd>

    <dd class="tm">The <code><b>tablelist::setThemeDefaults</b></code> command
    is invoked by Tablelist_tile automatically whenever a tablelist widget is
    createad or the <code><b>&lt;&lt;ThemeChanged&gt;&gt;</b></code> virtual
    event is received by a tablelist widget.&nbsp; In the latter case, the
    widget is reconfigured, using the new default values of those options that
    were not set explicitly to values different from the corresponding
    defaults.</dd>

    <dd class="tm">Besides being used by the Tablelist_tile code, this command
    can also be invoked in Tcl scripts, still before creating any tile-based
    tablelist widget.&nbsp; By calling it explicitly and using the values
    written by it into the array <code><b>tablelist::themeDefaults</b></code>,
    you can make sure that classical Tk widgets, e.g., listbox and text, will
    have a theme-specific appearance, just like the tile widgets.&nbsp; For
    example, you can add some common configuration options to the option
    database as follows:</dd>

    <dd>
      <blockquote>
        <pre>
tablelist::setThemeDefaults
if {$tile::currentTheme eq "aqua"} {
    option add *Listbox.selectBackground \
               $tablelist::themeDefaults(-selectbackground)
    option add *Listbox.selectForeground \
               $tablelist::themeDefaults(-selectforeground)
} else {
    option add *selectBackground  $tablelist::themeDefaults(-selectbackground)
    option add *selectForeground  $tablelist::themeDefaults(-selectforeground)
}
option add *selectBorderWidth     $tablelist::themeDefaults(-selectborderwidth)
</pre>
      </blockquote>
    </dd>

    <dt><b>KEYWORDS</b></dt>

    <dd>tablelist, theme, tile</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
</body>
</html>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


























































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/doc/tablelistTile.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
<html>
<head>
  <title>Interactive Tablelist Cell Editing Using Tile Widgets</title>

  <meta name="Author" content="Csaba Nemethi">
  <meta name="Keywords" content="tablelist, editing, tile">

  <link rel="stylesheet" type="text/css" href="stylesheet.css">
</head>

<body bgcolor="#FFFFFF">
  <div align="center">
    <h1>Interactive Tablelist Cell Editing Using Tile Widgets</h1>

    <h2>For Tablelist Version 5.13</h2>

    <h3>by</h3>

    <h2>Csaba Nemethi</h2>

    <address>
      <a href="mailto:csaba.nemethi@t-online.de">csaba.nemethi@t-online.de</a>
    </address>
  </div>
  <hr>

  <h2 id="contents">Contents</h2>

  <ul>
    <li><a href="#overview">Overview</a></li>

    <li><a href="#entry">Interactive Cell Editing Using the tile entry
    Widget</a></li>

    <li><a href="#spinbox">Interactive Cell Editing Using the tile spinbox
    Widget</a></li>

    <li><a href="#combobox">Interactive Cell Editing Using the tile combobox
    Widget</a></li>

    <li><a href="#checkbutton">Interactive Cell Editing Using the tile
    checkbutton Widget</a></li>

    <li><a href="#menubutton">Interactive Cell Editing Using the tile
    menubutton Widget</a></li>
  </ul>

  <div align="center">
    <p><a href="index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="overview">Overview</h2>

  <p>The tile theme engine is a compiled library extension for Tcl/Tk versions
  8.4 or higher.&nbsp; Beginning with Tk 8.5a6, tile is integrated into the Tk
  core.&nbsp; For earlier Tk versions it can be downloaded from the address</p>

  <blockquote>
    <address>
      <a href=
      "http://sourceforge.net/projects/tktable/files/tile/">http://sourceforge.net/projects/tktable//files/tile</a>
    </address>
  </blockquote>

  <p>Tablelist supports interactive cell editing with the aid of the tile
  entry, spinbox, combobox, checkbutton, and menubutton widgets, accessed as
  <code><b>ttk::entry</b></code>, <code><b>ttk::spinbox</b></code>,
  <code><b>ttk::combobox</b></code>, <code><b>ttk::checkbutton</b></code>, and
  <code><b>ttk::menubutton</b></code>, respectively.&nbsp; The version of the
  tile package must be 0.6 or higher (the tile spinbox requires even tile 0.8.3
  or later, or, alternatively, Tk 8.6 or later).&nbsp; These widgets are
  automatically registered for cell editing, hence the only action needed for
  using one of them for editing the cells of a given column is as follows:</p>

  <p>Use the tablelist widget's <code><b><a href=
  "tablelistWidget.html#columnconfigure">columnconfigure</a></b></code>
  subcommand to set the given column's <code><b><a href=
  "tablelistWidget.html#col_editable">-editable</a></b></code> option to true
  and its <code><b><a href=
  "tablelistWidget.html#col_editwindow">-editwindow</a></b></code> option to
  <code><b>ttk::entry</b></code>, <code><b>ttk::spinbox</b></code>,
  <code><b>ttk::combobox</b></code>, <code><b>ttk::checkbutton</b></code>, or
  <code><b>ttk::menubutton</b></code>, respectively.&nbsp; (These options are
  supported at cell level, too, with the aid of the <code><b><a href=
  "tablelistWidget.html#cellconfigure">cellconfigure</a></b></code>
  subcommand.)</p>

  <p>One known limitation of the currently available tile versions is that
  the&nbsp; <code><b>style theme use</b></code>&nbsp; command can only be used
  to set the current theme, but not to retrieve it.&nbsp; For this reason,
  Tablelist makes use of the variable <code><b>ttk::currentTheme</b></code> or
  <code><b>tile::currentTheme</b></code> (depending on the tile version), which
  is set by the <code><b>ttk::setTheme</b></code> or
  <code><b>tile::setTheme</b></code> procedure.&nbsp; From this it follows that
  the tile widgets used for interactive cell editing will only be managed as
  expected if the platform-specific default theme is either left unchanged or
  replaced with another theme by invoking the procedure
  <code><b>ttk::currentTheme</b></code> or <code><b>tile::setTheme</b></code>,
  depending on the current tile version.&nbsp; (See also the <code><b><a href=
  "tablelistThemes.html#setTheme">tablelist::setTheme</a></b></code>
  command.)</p>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="entry">Interactive Cell Editing Using the tile entry Widget</h2>

  <dl>
    <dt><b>DESCRIPTION</b></dt>

    <dd>The temporary embedded tile entry widget used for interactive cell
    editing will be created with an explicitly set value for its
    <code><b>-style</b></code> option.&nbsp; Apart from its theme-specific
    appearance, it behaves just like its Tk core counterpart.</dd>

    <dd class="tm">If an application uses the tile entry widget for interactive
    cell editing and also the Wcb package (even if not for that widget), then
    the version of Wcb must be 3.1 or higher (because earlier Wcb releases
    didn't support any tile widgets).</dd>

    <dt><b>KEYWORDS</b></dt>

    <dd>tablelist, editing, tile, entry</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="spinbox">Interactive Cell Editing Using the tile spinbox Widget</h2>

  <dl>
    <dt><b>DESCRIPTION</b></dt>

    <dd>The temporary embedded tile spinbox widget used for interactive cell
    editing will be created with an explicitly set value for its
    <code><b>-style</b></code> option and with its <code><b>-state</b></code>
    option set to <code><b>normal</b></code>, which makes the widget
    editable.&nbsp; You can use the script corresponding to the
    <code><b><a href=
    "tablelistWidget.html#editstartcommand">-editstartcommand</a></b></code>
    tablelist configuration option to set the state of the spinbox to
    <code><b>readonly</b></code> or define validations for it, as well as for
    setting its (range of) values and its <code><b>-wrap</b></code>
    option.&nbsp; Apart from its theme-specific appearance, it behaves just
    like its Tk core counterpart.</dd>

    <dd class="tm">If an application uses the tile spinbox widget for
    interactive cell editing and also the Wcb package (even if not for that
    widget), then the version of Wcb must be 3.2 or higher (because the support
    for the new tile spinbox widget was added to Wcb in its version 3.2).</dd>

    <dt><b>KEYWORDS</b></dt>

    <dd>tablelist, editing, tile, spinbox</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="combobox">Interactive Cell Editing Using the tile combobox
  Widget</h2>

  <dl>
    <dt><b>DESCRIPTION</b></dt>

    <dd>The temporary embedded tile combobox widget used for interactive cell
    editing will be created with an explicitly set value for its
    <code><b>-style</b></code> option and with its <code><b>-state</b></code>
    option set to <code><b>normal</b></code>, which makes the widget
    editable.&nbsp; You can use the script corresponding to the
    <code><b><a href=
    "tablelistWidget.html#editstartcommand">-editstartcommand</a></b></code>
    tablelist configuration option to set the state of the combobox to
    <code><b>readonly</b></code> or define validations for it, as well as for
    populating its listbox component (with the aid of the combobox widget's
    <code><b>-values</b></code> option).</dd>

    <dd class="tm">If an application uses the tile combobox widget for
    interactive cell editing and also the Wcb package (even if not for that
    widget), then the version of Wcb must be 3.1 or higher (because earlier Wcb
    releases didn't support any tile widgets).</dd>

    <dt><b>KEYWORDS</b></dt>

    <dd>tablelist, editing, tile, combobox</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="checkbutton">Interactive Cell Editing Using the tile checkbutton
  Widget.</h2>

  <dl>
    <dt><b>DESCRIPTION</b></dt>

    <dd>The temporary embedded tile checkbutton widget used for interactive
    cell editing will be created with explicitly set values for its
    <code><b>-style</b></code> and <code><b>-variable</b></code> options.&nbsp;
    You can use the script corresponding to the <code><b><a href=
    "tablelistWidget.html#editstartcommand">-editstartcommand</a></b></code>
    tablelist configuration option to set any other configuration options, like
    <code><b>-offvalue</b></code> and <code><b>-onvalue</b></code>, according
    to the <i>internal</i> values of the cells.&nbsp; Since the default values
    of the <code><b>-offvalue</b></code> and <code><b>-onvalue</b></code> tile
    checkbutton options are <code>0</code> and <code>1</code>, you don't need
    to change these options if the cells have the same internal values
    <code>0</code> and <code>1</code>.</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, editing, tile, checkbutton</dd>
  </dl>
  <hr>

  <h2 id="menubutton">Interactive Cell Editing Using the tile menubutton
  Widget.</h2>

  <dl>
    <dt><b>DESCRIPTION</b></dt>

    <dd>The temporary embedded tile menubutton widget used for interactive cell
    editing will be created with explicitly set values for its
    <code><b>-style</b></code> and <code><b>-textvariable</b></code>
    options.&nbsp; In addition, a menu with its <code><b>-tearoff</b></code>
    option set to <code>0</code> and an appropriate script as the value of its
    <code><b>-postcommand</b></code> option is created and set as the value of
    the menubutton's <code><b>-menu</b></code> option.&nbsp; In an X11
    environment, the menu's appearance is adapted to that of the tablelist
    widget by setting its <code><b>-background</b></code>,
    <code><b>-foreground</b></code>, <code><b>-activebackground</b></code>,
    <code><b>-activeforeground</b></code>, and
    <code><b>-activeborderwidth</b></code> options to appropriate values.&nbsp;
    You can use the script corresponding to the <code><b><a href=
    "tablelistWidget.html#editstartcommand">-editstartcommand</a></b></code>
    tablelist configuration option to set any other options of the menubutton
    and/or its associated menu.&nbsp; You will, however, need this script in
    the first place for populating the menu, preferably with radiobutton
    entries.&nbsp; For every radiobutton entry added to the menu, the Tablelist
    implementation will make sure that its value (which can be specified by
    setting the entry's <code><b>-value</b></code> or
    <code><b>-label</b></code> option) will be displayed in the menubutton as
    its text when the entry is selected.&nbsp; (Tablelist achieves this by
    setting the menu entry's <code><b>-variable</b></code> option to the value
    of the menubutton's <code><b>-textvariable</b></code> option.)&nbsp; For
    menu entries of types other than radiobutton (e.g., for command entries) it
    is the responsibility of the application to make sure that the selected
    entry's text will be shown in the menubutton (for example, with the aid of
    the menu entry's <code><b>-command</b></code> option).</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, editing, tile, menubutton</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
</body>
</html>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/doc/tablelistTkCore.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
<html>
<head>
  <title>Interactive Tablelist Cell Editing Using Tk Core Widgets</title>

  <meta name="Author" content="Csaba Nemethi">
  <meta name="Keywords" content="tablelist, editing, Tk core">

  <link rel="stylesheet" type="text/css" href="stylesheet.css">
</head>

<body bgcolor="#FFFFFF">
  <div align="center">
    <h1>Interactive Tablelist Cell Editing Using Tk Core Widgets</h1>

    <h2>For Tablelist Version 5.13</h2>

    <h3>by</h3>

    <h2>Csaba Nemethi</h2>

    <address>
      <a href="mailto:csaba.nemethi@t-online.de">csaba.nemethi@t-online.de</a>
    </address>
  </div>
  <hr>

  <h2 id="contents">Contents</h2>

  <ul>
    <li><a href="#overview">Overview</a></li>

    <li><a href="#entry">Interactive Cell Editing Using the entry
    Widget</a></li>

    <li><a href="#text">Interactive Cell Editing Using the text Widget</a></li>

    <li><a href="#spinbox">Interactive Cell Editing Using the spinbox
    Widget</a></li>

    <li><a href="#checkbutton">Interactive Cell Editing Using the checkbutton
    Widget</a></li>

    <li><a href="#menubutton">Interactive Cell Editing Using the menubutton
    Widget</a></li>
  </ul>

  <div align="center">
    <p><a href="index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="overview">Overview</h2>

  <p>Tablelist supports interactive cell editing with the aid of the Tk core
  entry, text, spinbox, checkbutton, and menubutton widgets.&nbsp; These
  widgets are automatically registered for cell editing, hence the only action
  needed for using one of them for editing the cells of a given column is as
  follows:</p>

  <p>Use the tablelist widget's <code><b><a href=
  "tablelistWidget.html#columnconfigure">columnconfigure</a></b></code>
  subcommand to set the given column's <code><b><a href=
  "tablelistWidget.html#col_editable">-editable</a></b></code> option to true
  and its <code><b><a href=
  "tablelistWidget.html#col_editwindow">-editwindow</a></b></code> option to
  <code><b>entry</b></code>, <code><b>text</b></code>,
  <code><b>spinbox</b></code>, <code><b>checkbutton</b></code>, or
  <code><b>menubutton</b></code>, respectively.&nbsp; (These options are
  supported at cell level, too, with the aid of the <code><b><a href=
  "tablelistWidget.html#cellconfigure">cellconfigure</a></b></code>
  subcommand.)&nbsp; Since the default value of the
  <code><b>-editwindow</b></code> column configuration option is
  <code><b>entry</b></code>, it is not necessary to set it explicitly if the
  editing should take place with the aid of an embedded entry widget.</p>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="entry">Interactive Cell Editing Using the entry Widget</h2>

  <dl>
    <dt><b>DESCRIPTION</b></dt>

    <dd>As mentioned above, the interactive cell editing in a tablelist widget
    takes place per default with the aid of an embedded entry widget.&nbsp;
    Refer to the <a href="tablelistWidget.html#cell_editing">INTERACTIVE CELL
    EDITING</a> section of the reference page describing the
    <code><b>tablelist::tablelist</b></code> command for details on the editing
    process.</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, editing, entry</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="text">Interactive Cell Editing Using the text Widget</h2>

  <dl>
    <dt><b>DESCRIPTION</b></dt>

    <dd>The temporary embedded text widget used for interactive cell editing
    will be created with its <code><b>-padx</b></code> and
    <code><b>-pady</b></code> options set to <code>2</code>, its
    <code><b>-wrap</b></code> option set to <code><b>none</b></code>, and its
    initial height set to the number of lines contained in it.&nbsp; There is,
    however, an exception from this rule:&nbsp; If the <code><b><a href=
    "tablelistWidget.html#col_wrap">-wrap</a></b></code> option of the cell's
    column was set to true and Tk version 8.5 or higher is being used, then the
    text widget's <code><b>-wrap</b></code> option will be set to
    <code><b>word</b></code> and its initial height will equal the number of
    <i>display</i> lines (taking into account the line wraps) contained in
    it.&nbsp; You can use the script corresponding to the <code><b><a href=
    "tablelistWidget.html#editstartcommand">-editstartcommand</a></b></code>
    tablelist configuration option to override the initial settings according
    to your needs.</dd>

    <dd class="tm">If the text widget's <code><b>-wrap</b></code> option was
    set to <code><b>word</b></code> or <code><b>char</b></code> (either by
    Tablelist or from within the above-mentioned script) and Tk version 8.5 or
    higher is being used, then, whenever its width changes (e.g., due to
    interactive column resizing), its height will be set automatically to the
    number of display lines contained in it.&nbsp; (The number of display lines
    is retrieved with the aid of the&nbsp; <code><b>count
    -displaylines</b></code>&nbsp; text widget subcommand, introduced in Tk
    8.5.)</dd>

    <dd class="tm">If the widget callback package Wcb was loaded into the
    interpreter (via&nbsp; <code><b>package require Wcb</b></code>&nbsp;
    or&nbsp; <code><b>package require wcb</b></code>)&nbsp; then the text
    widget's height will be updated automatically whenever text is inserted
    into or deleted from it, which makes the editing much more
    user-friendly.&nbsp; This is achieved by using an appropriately defined
    after-<code><b>insert</b></code> and after-<code><b>delete</b></code>
    callback for the edit window.&nbsp; You can use the script corresponding to
    the <code><b><a href=
    "tablelistWidget.html#editstartcommand">-editstartcommand</a></b></code>
    tablelist configuration option to define further callbacks for the text
    widget.&nbsp; (The above-mentioned callback is created via
    <code><b>wcb::cbappend</b></code>, <i>after</i> returning from that
    script.)</dd>

    <dd class="tm">The <code>Tab</code> key is reserved for navigation between
    the editable cells, but the user can insert a tabulator character into the
    text widget by pressing <code>Control-i</code>.</dd>

    <dd class="tm">Unlike in the case of the other widgets used for interactive
    cell editing, the <code>Return</code> and <code>KP_Enter</code> keys insert
    a newline character into the text widget.&nbsp; <code>Control-j</code> can
    also be used for inserting a newline.&nbsp; <code>Control-Return</code> and
    <code>Control-KP_Enter</code> terminate the editing and destroy the edit
    window.</dd>

    <dd class="tm"><code>Control-Home</code> and <code>Control-End</code> have
    their well-known text widget-specific bindings, just like
    <code>Meta-&lt;</code> and <code>Meta-&gt;</code> if
    <code><b>tk_strictMotif</b></code> is false.&nbsp; Again, this is different
    from the behavior of the other widgets used for interactive cell
    editing.&nbsp; For jumping into the first/last editable cell, the user can
    press <code>Alt-Home</code>/<code>Alt-End</code> or
    <code>Meta-Home</code>/<code>Meta-End</code>
    (<code>Command-Home</code>/<code>Command-End</code> on Mac OS Classic and
    Mac OS X Aqua).</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, editing, text</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="spinbox">Interactive Cell Editing Using the spinbox Widget</h2>

  <dl>
    <dt><b>DESCRIPTION</b></dt>

    <dd>The temporary embedded spinbox widget used for interactive cell editing
    will be created with its <code><b>-state</b></code> option set to
    <code><b>normal</b></code>, which makes the widget editable.&nbsp; You can
    use the script corresponding to the <code><b><a href=
    "tablelistWidget.html#editstartcommand">-editstartcommand</a></b></code>
    tablelist configuration option to set the state of the spinbox to
    <code><b>readonly</b></code> or define validations for it, as well as for
    setting its (range of) values and its <code><b>-wrap</b></code>
    option.</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, editing, spinbox</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="checkbutton">Interactive Cell Editing Using the checkbutton
  Widget</h2>

  <dl>
    <dt><b>DESCRIPTION</b></dt>

    <dd>On Windows, Mac OS Classic, and Mac OS X Aqua the temporary embedded
    checkbutton widget used for interactive cell editing will be created with
    explicitly set values for its <code><b>-borderwidth</b></code>,
    <code><b>-font</b></code>, <code><b>-padx</b></code>,
    <code><b>-pady</b></code>, and <code><b>-variable</b></code> options.&nbsp;
    In an X11 environment it will be created with explicitly set values for its
    <code><b>-borderwidth</b></code>, <code><b>-indicatoron</b></code>,
    <code><b>-image</b></code>, <code><b>-selectimage</b></code>,
    <code><b>-selectcolor</b></code>, and <code><b>-variable</b></code>
    options.&nbsp; You can use the script corresponding to the
    <code><b><a href="tablelistWidget.html#editstartcommand">-editstartcommand</a></b></code>
    tablelist configuration option to set any other options, like
    <code><b>-offvalue</b></code> and <code><b>-onvalue</b></code>, according
    to the <i>internal</i> values of the cells.&nbsp; Since the default values
    of the <code><b>-offvalue</b></code> and <code><b>-onvalue</b></code>
    checkbutton options are <code>0</code> and <code>1</code>, you don't need
    to change these options if the cells have the same internal values
    <code>0</code> and <code>1</code>.</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, editing, checkbutton</dd>
  </dl>
  <hr>

  <h2 id="menubutton">Interactive Cell Editing Using the menubutton Widget</h2>

  <dl>
    <dt><b>DESCRIPTION</b></dt>

    <dd>The temporary embedded menubutton widget used for interactive cell
    editing will be created with explicitly set values for its
    <code><b>-anchor</b></code>, <code><b>-indicatoron</b></code>,
    <code><b>-justify</b></code>, <code><b>-padx</b></code>,
    <code><b>-pady</b></code>, <code><b>-relief</b></code>, and
    <code><b>-textvariable</b></code> options.&nbsp; In addition, a menu with
    its <code><b>-tearoff</b></code> option set to <code>0</code> and an
    appropriate script as the value of its <code><b>-postcommand</b></code>
    option is created and set as the value of the menubutton's
    <code><b>-menu</b></code> option.&nbsp; In an X11 environment, the menu's
    appearance is adapted to that of the tablelist widget by setting its
    <code><b>-background</b></code>, <code><b>-foreground</b></code>,
    <code><b>-activebackground</b></code>,
    <code><b>-activeforeground</b></code>, and
    <code><b>-activeborderwidth</b></code> options to appropriate values.&nbsp;
    You can use the script corresponding to the <code><b><a href=
    "tablelistWidget.html#editstartcommand">-editstartcommand</a></b></code>
    tablelist configuration option to set any other options of the menubutton
    and/or its associated menu.&nbsp; You will, however, need this script in
    the first place for populating the menu, preferably with radiobutton
    entries.&nbsp; For every radiobutton entry added to the menu, the Tablelist
    implementation will make sure that its value (which can be specified by
    setting the entry's <code><b>-value</b></code> or
    <code><b>-label</b></code> option) will be displayed in the menubutton as
    its text when the entry is selected.&nbsp; (Tablelist achieves this by
    setting the menu entry's <code><b>-variable</b></code> option to the value
    of the menubutton's <code><b>-textvariable</b></code> option.)&nbsp; For
    menu entries of types other than radiobutton (e.g., for command entries) it
    is the responsibility of the application to make sure that the selected
    entry's text will be shown in the menubutton (for example, with the aid of
    the menu entry's <code><b>-command</b></code> option).</dd>

    <dt class="tm"><b>KEYWORDS</b></dt>

    <dd>tablelist, editing, menubutton</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
</body>
</html>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/doc/tablelistWidget.html.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586
6587
6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
6635
6636
6637
6638
6639
6640
6641
6642
6643
6644
6645
6646
6647
6648
6649
6650
6651
6652
6653
6654
6655
6656
6657
6658
6659
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669
6670
6671
6672
6673
6674
6675
6676
6677
6678
6679
6680
6681
6682
6683
6684
6685
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695
6696
6697
6698
6699
6700
6701
6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730
6731
6732
6733
6734
6735
6736
6737
6738
6739
6740
6741
6742
6743
6744
6745
6746
6747
6748
6749
6750
6751
6752
6753
6754
6755
6756
6757
6758
6759
6760
6761
6762
6763
6764
6765
6766
6767
6768
6769
6770
6771
6772
6773
6774
6775
6776
6777
6778
6779
6780
6781
6782
6783
6784
6785
6786
6787
6788
6789
6790
6791
6792
6793
6794
6795
6796
6797
6798
6799
6800
6801
6802
6803
6804
6805
6806
6807
6808
6809
6810
6811
6812
6813
6814
6815
6816
6817
6818
6819
6820
6821
6822
6823
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
6839
6840
6841
6842
6843
6844
6845
6846
6847
6848
6849
6850
6851
6852
6853
6854
6855
6856
6857
6858
6859
6860
6861
6862
6863
6864
6865
6866
6867
6868
6869
6870
6871
6872
6873
6874
6875
6876
6877
6878
6879
6880
6881
6882
6883
6884
6885
6886
6887
6888
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902
6903
6904
6905
6906
6907
6908
6909
6910
6911
6912
6913
6914
6915
6916
6917
6918
6919
6920
6921
6922
6923
6924
6925
6926
6927
6928
6929
6930
6931
6932
6933
6934
6935
6936
6937
6938
6939
6940
6941
6942
6943
6944
6945
6946
6947
6948
6949
6950
6951
6952
6953
6954
6955
6956
6957
6958
6959
6960
6961
6962
6963
6964
6965
6966
6967
6968
6969
6970
6971
6972
6973
6974
6975
6976
6977
6978
6979
6980
6981
6982
6983
6984
6985
6986
6987
6988
6989
6990
6991
6992
6993
6994
6995
6996
6997
6998
6999
7000
7001
7002
7003
7004
7005
7006
7007
7008
7009
7010
7011
7012
7013
7014
7015
7016
7017
7018
7019
7020
7021
7022
7023
7024
7025
7026
7027
7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
7043
7044
7045
7046
7047
7048
7049
7050
7051
7052
7053
7054
7055
7056
7057
7058
7059
7060
7061
7062
7063
7064
7065
7066
7067
7068
7069
7070
7071
7072
7073
7074
7075
7076
7077
7078
7079
7080
7081
7082
7083
7084
7085
7086
7087
7088
7089
7090
7091
7092
7093
7094
7095
7096
7097
7098
7099
7100
7101
7102
7103
7104
7105
7106
7107
7108
7109
7110
7111
7112
7113
7114
7115
7116
7117
7118
7119
7120
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130
7131
7132
7133
7134
7135
7136
7137
7138
7139
7140
7141
7142
7143
7144
7145
7146
7147
7148
7149
7150
7151
7152
7153
7154
7155
7156
7157
7158
7159
7160
7161
7162
7163
7164
7165
7166
7167
7168
7169
7170
7171
7172
7173
7174
7175
7176
7177
7178
7179
7180
7181
7182
7183
7184
7185
7186
7187
7188
7189
7190
7191
7192
7193
7194
7195
7196
7197
7198
7199
7200
7201
7202
7203
7204
7205
7206
7207
7208
7209
7210
7211
7212
7213
7214
7215
7216
7217
7218
7219
7220
7221
7222
7223
7224
7225
7226
7227
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
7239
7240
7241
7242
7243
7244
7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
7255
7256
7257
7258
7259
7260
7261
7262
7263
7264
7265
7266
7267
7268
7269
7270
7271
7272
7273
7274
7275
7276
7277
7278
7279
7280
7281
7282
7283
7284
7285
7286
7287
7288
7289
7290
7291
7292
7293
7294
7295
7296
7297
7298
7299
7300
7301
7302
7303
7304
7305
7306
7307
7308
7309
7310
7311
7312
7313
7314
7315
7316
7317
7318
7319
7320
7321
7322
7323
7324
7325
7326
7327
7328
7329
7330
7331
7332
7333
7334
7335
7336
7337
7338
7339
7340
7341
7342
7343
7344
7345
7346
7347
7348
7349
7350
7351
7352
7353
7354
7355
7356
7357
7358
7359
7360
7361
7362
7363
7364
7365
7366
7367
7368
7369
7370
7371
7372
7373
7374
7375
7376
7377
7378
7379
7380
7381
7382
7383
7384
7385
7386
7387
7388
7389
7390
7391
7392
7393
7394
7395
7396
7397
7398
7399
7400
7401
7402
7403
7404
7405
7406
7407
7408
7409
7410
7411
7412
7413
7414
7415
7416
7417
7418
7419
7420
7421
7422
7423
7424
7425
7426
7427
7428
7429
7430
7431
7432
7433
7434
7435
7436
7437
7438
7439
7440
7441
7442
7443
7444
7445
7446
7447
7448
7449
7450
7451
7452
7453
7454
7455
7456
7457
7458
7459
7460
7461
7462
7463
7464
7465
7466
7467
7468
7469
7470
7471
7472
7473
7474
7475
7476
7477
7478
7479
7480
7481
7482
7483
7484
7485
7486
7487
7488
7489
7490
7491
7492
7493
7494
7495
7496
7497
7498
7499
7500
7501
7502
7503
7504
7505
7506
7507
7508
7509
7510
7511
7512
7513
7514
7515
7516
7517
7518
7519
7520
7521
7522
7523
7524
7525
7526
7527
7528
7529
7530
7531
7532
7533
7534
7535
7536
7537
7538
7539
7540
7541
7542
7543
7544
7545
7546
7547
7548
7549
7550
7551
7552
7553
7554
7555
7556
7557
7558
7559
7560
7561
7562
7563
7564
7565
7566
7567
7568
7569
7570
7571
7572
7573
7574
7575
7576
7577
7578
7579
7580
7581
7582
7583
7584
7585
7586
7587
7588
7589
7590
7591
7592
7593
7594
7595
7596
7597
7598
7599
7600
7601
7602
7603
7604
7605
7606
7607
7608
7609
7610
7611
7612
7613
7614
7615
7616
7617
7618
7619
7620
7621
7622
7623
7624
7625
7626
7627
7628
7629
7630
7631
7632
7633
7634
7635
7636
7637
7638
7639
7640
7641
7642
7643
7644
7645
7646
7647
7648
7649
7650
7651
7652
7653
7654
7655
7656
7657
7658
7659
7660
7661
7662
7663
7664
7665
7666
7667
7668
7669
7670
7671
7672
7673
7674
7675
7676
7677
7678
7679
7680
7681
7682
7683
7684
7685
7686
7687
7688
7689
7690
7691
7692
7693
7694
7695
7696
7697
7698
7699
7700
7701
7702
7703
7704
7705
7706
7707
7708
7709
7710
7711
7712
7713
7714
7715
7716
7717
7718
7719
7720
7721
7722
7723
7724
7725
7726
7727
7728
7729
7730
7731
7732
7733
7734
7735
7736
7737
7738
7739
7740
7741
7742
7743
7744
7745
7746
7747
7748
7749
7750
7751
7752
7753
7754
7755
7756
7757
7758
7759
7760
7761
7762
7763
7764
7765
7766
7767
7768
7769
7770
7771
7772
7773
7774
7775
7776
7777
7778
7779
7780
7781
7782
7783
7784
7785
7786
7787
7788
7789
7790
7791
7792
7793
7794
7795
7796
7797
7798
7799
7800
7801
7802
7803
7804
7805
7806
7807
7808
7809
7810
7811
7812
7813
7814
7815
7816
7817
7818
7819
7820
7821
7822
7823
7824
7825
7826
7827
7828
7829
7830
7831
7832
7833
7834
7835
7836
7837
7838
7839
7840
7841
7842
7843
7844
7845
7846
7847
7848
7849
7850
7851
7852
7853
7854
7855
7856
7857
7858
7859
7860
7861
7862
7863
7864
7865
7866
7867
7868
7869
7870
7871
7872
7873
7874
7875
7876
7877
7878
7879
7880
7881
7882
7883
7884
7885
7886
7887
7888
7889
7890
7891
7892
7893
7894
7895
7896
7897
7898
7899
7900
7901
7902
7903
7904
7905
7906
7907
7908
7909
7910
7911
7912
7913
7914
7915
7916
7917
7918
7919
7920
7921
7922
7923
7924
7925
7926
7927
7928
7929
7930
7931
7932
7933
7934
7935
7936
7937
7938
7939
7940
7941
7942
7943
7944
7945
7946
7947
7948
7949
7950
7951
7952
7953
7954
7955
7956
7957
7958
7959
7960
7961
7962
7963
7964
7965
7966
7967
7968
7969
7970
7971
7972
7973
7974
7975
7976
7977
7978
7979
7980
7981
7982
7983
7984
7985
7986
7987
7988
7989
7990
7991
7992
7993
7994
7995
7996
7997
7998
7999
8000
8001
8002
8003
8004
8005
8006
8007
8008
8009
8010
8011
8012
8013
8014
8015
8016
8017
8018
8019
8020
8021
8022
8023
8024
8025
8026
8027
8028
8029
8030
8031
8032
8033
8034
8035
8036
8037
8038
8039
8040
8041
8042
8043
8044
8045
8046
8047
8048
8049
8050
8051
8052
8053
8054
8055
8056
8057
8058
8059
8060
8061
8062
8063
8064
8065
8066
8067
8068
8069
8070
8071
8072
8073
8074
8075
8076
8077
8078
8079
8080
8081
8082
8083
8084
8085
8086
8087
8088
8089
8090
8091
8092
8093
8094
8095
8096
8097
8098
8099
8100
8101
8102
8103
8104
8105
8106
8107
8108
8109
8110
8111
8112
8113
8114
8115
8116
8117
8118
8119
8120
8121
8122
8123
8124
8125
8126
8127
8128
8129
8130
8131
8132
8133
8134
8135
8136
8137
8138
8139
8140
8141
8142
8143
8144
8145
8146
8147
8148
8149
8150
8151
8152
8153
8154
8155
8156
8157
8158
8159
8160
8161
8162
8163
8164
8165
8166
8167
8168
8169
8170
8171
8172
8173
8174
8175
8176
8177
8178
8179
8180
8181
8182
8183
8184
8185
8186
8187
8188
8189
8190
8191
8192
8193
8194
8195
8196
8197
8198
8199
8200
8201
8202
8203
8204
8205
8206
8207
8208
8209
8210
8211
8212
8213
8214
8215
8216
8217
8218
8219
8220
8221
8222
8223
8224
8225
8226
8227
8228
8229
8230
8231
8232
8233
8234
8235
8236
8237
8238
8239
8240
8241
8242
8243
8244
8245
8246
8247
8248
8249
8250
8251
8252
8253
8254
8255
8256
8257
8258
8259
8260
8261
8262
8263
8264
8265
8266
8267
8268
8269
8270
8271
8272
8273
8274
8275
8276
8277
8278
8279
8280
8281
8282
8283
8284
8285
8286
8287
8288
8289
8290
8291
8292
8293
8294
8295
8296
8297
8298
8299
8300
8301
8302
8303
8304
8305
8306
8307
8308
8309
8310
8311
8312
8313
8314
8315
8316
8317
8318
8319
8320
8321
8322
8323
8324
8325
8326
8327
8328
8329
8330
8331
8332
8333
8334
8335
8336
8337
8338
8339
8340
8341
8342
8343
8344
8345
8346
8347
8348
8349
8350
8351
8352
8353
8354
8355
8356
8357
8358
8359
8360
8361
8362
8363
8364
8365
8366
8367
8368
8369
8370
8371
8372
8373
8374
8375
8376
8377
8378
8379
8380
8381
8382
8383
8384
8385
8386
8387
8388
8389
8390
8391
8392
8393
8394
8395
8396
8397
8398
8399
8400
8401
8402
8403
8404
8405
8406
8407
8408
8409
8410
8411
8412
8413
8414
8415
8416
8417
8418
8419
8420
8421
8422
8423
8424
8425
8426
8427
8428
8429
8430
8431
8432
8433
8434
8435
8436
8437
8438
8439
8440
8441
8442
8443
8444
8445
8446
8447
8448
8449
8450
8451
8452
8453
8454
8455
8456
8457
8458
8459
8460
8461
8462
8463
8464
8465
8466
8467
8468
8469
8470
8471
8472
8473
8474
8475
8476
8477
8478
8479
8480
8481
8482
8483
8484
8485
8486
8487
8488
8489
8490
8491
8492
8493
8494
8495
8496
8497
8498
8499
8500
8501
8502
8503
8504
8505
8506
8507
8508
8509
8510
8511
8512
8513
8514
8515
8516
8517
8518
8519
8520
8521
8522
8523
8524
8525
8526
8527
8528
8529
8530
8531
8532
8533
8534
8535
8536
8537
8538
8539
8540
8541
8542
8543
8544
8545
8546
8547
8548
8549
8550
8551
8552
8553
8554
8555
8556
8557
8558
8559
8560
8561
8562
8563
8564
8565
8566
8567
8568
8569
8570
8571
8572
8573
8574
8575
8576
8577
8578
8579
8580
8581
8582
8583
8584
8585
8586
8587
8588
8589
8590
8591
8592
8593
8594
8595
8596
8597
8598
8599
8600
8601
8602
8603
8604
8605
8606
8607
8608
8609
8610
8611
8612
8613
8614
8615
8616
8617
8618
8619
8620
8621
8622
8623
8624
8625
8626
8627
8628
8629
8630
8631
8632
8633
8634
8635
8636
8637
8638
8639
8640
8641
8642
8643
8644
8645
8646
8647
8648
8649
8650
8651
8652
8653
8654
8655
8656
8657
8658
8659
8660
8661
8662
8663
8664
8665
8666
8667
8668
8669
8670
8671
8672
8673
8674
8675
8676
8677
8678
8679
8680
8681
8682
8683
8684
8685
8686
8687
8688
8689
8690
8691
8692
8693
8694
8695
8696
8697
8698
8699
8700
8701
8702
8703
8704
8705
8706
8707
8708
8709
8710
8711
8712
8713
8714
8715
8716
8717
8718
8719
8720
8721
8722
8723
8724
8725
8726
8727
8728
8729
8730
8731
8732
8733
8734
8735
8736
8737
8738
8739
8740
8741
8742
8743
8744
8745
8746
8747
8748
8749
8750
8751
8752
8753
8754
8755
8756
8757
8758
8759
8760
8761
8762
8763
8764
8765
8766
8767
8768
8769
8770
8771
8772
8773
8774
8775
8776
8777
8778
8779
8780
8781
8782
8783
8784
8785
8786
8787
8788
8789
8790
8791
8792
8793
8794
8795
8796
8797
8798
8799
8800
8801
8802
8803
8804
8805
8806
8807
8808
8809
8810
8811
8812
8813
8814
8815
8816
8817
8818
8819
8820
8821
8822
8823
8824
8825
8826
8827
8828
8829
8830
8831
8832
8833
8834
8835
8836
8837
8838
8839
8840
8841
8842
8843
8844
8845
8846
8847
8848
8849
8850
8851
8852
8853
8854
8855
8856
8857
8858
8859
8860
8861
8862
8863
8864
8865
8866
8867
8868
8869
8870
8871
8872
8873
8874
8875
8876
8877
8878
8879
8880
8881
8882
8883
8884
8885
8886
8887
8888
8889
8890
8891
8892
8893
8894
8895
8896
8897
8898
8899
8900
8901
8902
8903
8904
8905
8906
8907
8908
8909
8910
8911
8912
8913
8914
8915
8916
8917
8918
8919
8920
8921
8922
8923
8924
8925
8926
8927
8928
8929
8930
8931
8932
8933
8934
8935
8936
8937
8938
8939
8940
8941
8942
8943
8944
8945
8946
8947
8948
8949
8950
8951
8952
8953
8954
8955
8956
8957
8958
8959
8960
8961
8962
8963
8964
8965
8966
8967
8968
8969
8970
8971
8972
8973
8974
8975
8976
8977
8978
8979
8980
8981
8982
8983
8984
8985
8986
8987
8988
8989
8990
8991
8992
8993
8994
8995
8996
8997
8998
8999
9000
9001
9002
9003
9004
9005
9006
9007
9008
9009
9010
9011
9012
9013
9014
9015
9016
9017
9018
9019
9020
9021
9022
9023
9024
9025
9026
9027
9028
9029
9030
9031
9032
9033
9034
9035
9036
9037
9038
9039
9040
9041
9042
9043
9044
9045
9046
9047
9048
9049
9050
9051
9052
9053
9054
9055
9056
9057
9058
9059
9060
9061
9062
9063
9064
9065
9066
9067
9068
9069
9070
9071
9072
9073
9074
9075
9076
9077
9078
9079
9080
9081
9082
9083
9084
9085
9086
9087
9088
9089
9090
9091
9092
9093
9094
9095
9096
9097
9098
9099
9100
9101
9102
9103
9104
9105
9106
9107
9108
9109
9110
9111
9112
9113
9114
9115
9116
9117
9118
9119
9120
9121
9122
9123
9124
9125
9126
9127
9128
9129
9130
9131
9132
9133
9134
9135
9136
9137
9138
9139
9140
9141
9142
9143
9144
9145
9146
9147
9148
9149
9150
9151
9152
9153
9154
9155
9156
9157
9158
9159
9160
9161
9162
9163
9164
9165
9166
9167
9168
9169
9170
9171
9172
9173
9174
9175
9176
9177
9178
9179
9180
9181
9182
9183
9184
9185
9186
9187
9188
9189
9190
9191
9192
9193
9194
9195
9196
9197
9198
9199
9200
9201
9202
9203
9204
9205
9206
9207
9208
9209
9210
9211
9212
9213
9214
9215
9216
9217
9218
9219
9220
9221
9222
9223
9224
9225
9226
9227
9228
9229
9230
9231
9232
9233
9234
9235
9236
9237
9238
9239
9240
9241
9242
9243
9244
9245
9246
9247
9248
9249
9250
9251
9252
9253
9254
9255
9256
9257
9258
9259
9260
9261
9262
9263
9264
9265
9266
9267
9268
9269
9270
9271
9272
9273
9274
9275
9276
9277
9278
9279
9280
9281
9282
9283
9284
9285
9286
9287
9288
9289
9290
9291
9292
9293
9294
9295
9296
9297
9298
9299
9300
9301
9302
9303
9304
9305
9306
9307
9308
9309
9310
9311
9312
9313
9314
9315
9316
9317
9318
9319
9320
9321
9322
9323
9324
9325
9326
9327
9328
9329
9330
9331
9332
9333
9334
9335
9336
9337
9338
9339
9340
9341
9342
9343
9344
9345
9346
9347
9348
9349
9350
9351
9352
9353
9354
9355
9356
9357
9358
9359
9360
9361
9362
9363
9364
9365
9366
9367
9368
9369
9370
9371
9372
9373
9374
9375
9376
9377
9378
9379
9380
9381
9382
9383
9384
9385
9386
9387
9388
9389
9390
9391
9392
9393
9394
9395
9396
9397
9398
9399
9400
9401
9402
9403
9404
9405
9406
9407
9408
9409
9410
9411
9412
9413
9414
9415
9416
9417
9418
9419
9420
9421
9422
9423
9424
9425
9426
9427
9428
9429
9430
9431
9432
9433
9434
9435
9436
9437
9438
9439
9440
9441
9442
9443
9444
9445
9446
9447
9448
9449
9450
9451
9452
9453
9454
9455
9456
9457
9458
9459
9460
9461
9462
9463
9464
9465
9466
9467
9468
9469
9470
9471
9472
9473
9474
9475
9476
9477
9478
9479
9480
9481
9482
9483
9484
9485
9486
9487
9488
9489
9490
9491
9492
9493
9494
9495
9496
9497
9498
9499
9500
9501
9502
9503
9504
9505
9506
9507
9508
9509
9510
9511
9512
9513
9514
9515
9516
9517
9518
9519
9520
9521
9522
9523
9524
9525
9526
9527
9528
9529
9530
9531
9532
9533
9534
9535
9536
9537
9538
9539
9540
9541
9542
9543
9544
9545
9546
9547
9548
9549
9550
9551
9552
9553
9554
9555
9556
9557
9558
9559
9560
9561
9562
9563
9564
9565
9566
9567
9568
9569
9570
9571
9572
9573
9574
9575
9576
9577
9578
9579
9580
9581
9582
9583
9584
9585
9586
9587
9588
9589
9590
9591
9592
9593
9594
9595
9596
9597
9598
9599
9600
9601
9602
9603
9604
9605
9606
<html>
<head>
  <title>The tablelist::tablelist Command</title>

  <meta name="Author" content="Csaba Nemethi">
  <meta name="Keywords" content=
  "tablelist, multi-column, listbox, tree, widget">

  <link rel="stylesheet" type="text/css" href="stylesheet.css">
</head>

<body bgcolor="#FFFFFF">
  <div align="center">
    <h1>The <code><b>tablelist::tablelist</b></code> Command</h1>

    <h2>For Tablelist Version 5.13</h2>

    <h3>by</h3>

    <h2>Csaba Nemethi</h2>

    <address>
      <a href="mailto:csaba.nemethi@t-online.de">csaba.nemethi@t-online.de</a>
    </address>
  </div>
  <hr>

  <h2 id="contents">Contents</h2>

  <ul>
    <li><a href="#quick_ref">Quick Reference</a></li>

    <li><a href="#detailed_ref">Detailed Reference</a></li>
  </ul>

  <div align="center">
    <p><a href="index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="quick_ref">Quick Reference</h2>

  <dl>
    <dt><a href="#name">NAME</a></dt>

    <dd><code>tablelist::tablelist</code> &ndash; Create and manipulate
    tablelist widgets</dd>

    <dt class="tm"><a href="#synopsis">SYNOPSIS</a></dt>

    <dd>
      <pre>
<b>tablelist::tablelist</b> <i>pathName</i> ?<i>options</i>?
</pre>
    </dd>

    <dt><a href="#std_options">STANDARD OPTIONS</a></dt>

    <dd>
      <pre>
<b>-borderwidth          -highlightthickness  -setgrid
-cursor               -relief              -xscrollcommand
-exportselection      -selectbackground    -yscrollcommand
-highlightbackground  -selectborderwidth
-highlightcolor       -selectforeground</b>
</pre>
    </dd>

    <dt><a href="#body_options">OPTIONS FOR THE BODY COMPONENT OF THE
    WIDGET</a></dt>

    <dd>
      <pre>
<b>-background  -disabledforeground  -font  -foreground</b>
</pre>
    </dd>

    <dt><a href="#widget_options">WIDGET-SPECIFIC OPTIONS</a></dt>

    <dd><code><b><a href="#acceptchildcommand">-acceptchildcommand</a></b>
    <i>command</i></code></dd>

    <dd><code><b><a href="#acceptdropcommand">-acceptdropcommand</a></b>
    <i>command</i></code></dd>

    <dd><code><b><a href="#activestyle">-activestyle</a></b>
    <b>frame</b>|<b>none</b>|<b>underline</b></code></dd>

    <dd><code><b><a href="#arrowcolor">-arrowcolor</a></b>
    <i>color</i></code></dd>

    <dd><code><b><a href="#arrowdisabledcolor">-arrowdisabledcolor</a></b>
    <i>color</i></code></dd>

    <dd><code><b><a href="#arrowstyle">-arrowstyle</a></b>
    <b>flat5x3</b>|<b>flat5x4</b>|<b>flat6x4</b>|<b>flat7x4</b>|<b>flat7x5</b>|<b>flat7x7</b>|<b>flat8x5</b>|<b>flat9x5</b>|<b>flat9x6</b>|<br>
    &nbsp;<b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flatAngle7x4</b>|<b>flatAngle7x5</b>|<b>flatAngle9x5</b>|<b>flatAngle9x6</b>|<b>flat1Angle9x7</b>|<br>
    &nbsp;<b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flatAngle10x6</b>|<b>flatAngle10x7</b>|<b>photo7x7</b>|<b>sunken8x7</b>|<b>sunken10x9</b>|<b>sunken12x11</b></code></dd>

    <dd><code><b><a href="#autoscan">-autoscan</a></b>
    <i>boolean</i></code></dd>

    <dd><code><b><a href="#collapsecommand">-collapsecommand</a></b>
    <i>command</i></code></dd>

    <dd><code><b><a href="#columns">-columns</a></b> {<i>width</i> <i>title</i>
    ?<b>left</b>|<b>right</b>|<b>center</b>? <i>width</i> <i>title</i>
    ?<b>left</b>|<b>right</b>|<b>center</b>? ...}</code></dd>

    <dd><code><b><a href="#columntitles">-columntitles</a></b> {<i>title</i>
    <i>title</i> ...}</code></dd>

    <dd><code><b><a href="#customdragsource">-customdragsource</a></b>
    <i>boolean</i></code></dd>

    <dd><code><b><a href="#editendcommand">-editendcommand</a></b>
    <i>command</i></code></dd>

    <dd><code><b><a href="#editselectedonly">-editselectedonly</a></b>
    <i>boolean</i></code></dd>

    <dd><code><b><a href="#editstartcommand">-editstartcommand</a></b>
    <i>command</i></code></dd>

    <dd><code><b><a href="#expandcommand">-expandcommand</a></b>
    <i>command</i></code></dd>

    <dd><code><b><a href="#forceeditendcommand">-forceeditendcommand</a></b>
    <i>boolean</i></code></dd>

    <dd><code><b><a href="#fullseparators">-fullseparators</a></b>
    <i>boolean</i></code></dd>

    <dd><code><b><a href="#height">-height</a></b> <i>lines</i></code></dd>

    <dd><code><b><a href="#incrarrowtype">-incrarrowtype</a></b>
    <b>up</b>|<b>down</b></code></dd>

    <dd><code><b><a href="#instanttoggle">-instanttoggle</a></b>
    <i>boolean</i></code></dd>

    <dd><code><b><a href=
    "#labelactivebackground">-labelactivebackground</a></b>
    <i>color</i></code></dd>

    <dd><code><b><a href=
    "#labelactiveforeground">-labelactiveforeground</a></b>
    <i>color</i></code></dd>

    <dd><code><b><a href="#labelbackground">-labelbackground</a></b>
    <i>color</i></code>&nbsp; or&nbsp; <code><b>-labelbg</b>
    <i>color</i></code></dd>

    <dd><code><b><a href="#labelborderwidth">-labelborderwidth</a></b>
    <i>screenDistance</i></code>&nbsp; or&nbsp; <code><b>-labelbd</b>
    <i>screenDistance</i></code></dd>

    <dd><code><b><a href="#labelcommand">-labelcommand</a></b>
    <i>command</i></code></dd>

    <dd><code><b><a href="#labelcommand2">-labelcommand2</a></b>
    <i>command</i></code></dd>

    <dd><code><b><a href=
    "#labeldisabledforeground">-labeldisabledforeground</a></b>
    <i>color</i></code></dd>

    <dd><code><b><a href="#labelfont">-labelfont</a></b>
    <i>font</i></code></dd>

    <dd><code><b><a href="#labelforeground">-labelforeground</a></b>
    <i>color</i></code>&nbsp; or&nbsp; <code><b>-labelfg</b>
    <i>color</i></code></dd>

    <dd><code><b><a href="#labelheight">-labelheight</a></b>
    <i>lines</i></code></dd>

    <dd><code><b><a href="#labelpady">-labelpady</a></b>
    <i>screenDistance</i></code></dd>

    <dd><code><b><a href="#labelrelief">-labelrelief</a></b>
    <b>raised</b>|<b>sunken</b>|<b>flat</b>|<b>ridge</b>|<b>solid</b>|<b>groove</b></code></dd>

    <dd><code><b><a href="#listvariable">-listvariable</a></b>
    <i>variable</i></code></dd>

    <dd><code><b><a href="#movablecolumns">-movablecolumns</a></b>
    <i>boolean</i></code></dd>

    <dd><code><b><a href="#movablerows">-movablerows</a></b>
    <i>boolean</i></code></dd>

    <dd><code><b><a href="#movecolumncursor">-movecolumncursor</a></b>
    <i>cursor</i></code></dd>

    <dd><code><b><a href="#movecursor">-movecursor</a></b>
    <i>cursor</i></code></dd>

    <dd><code><b><a href="#populatecommand">-populatecommand</a></b>
    <i>command</i></code></dd>

    <dd><code><b><a href="#protecttitlecolumns">-protecttitlecolumns</a></b>
    <i>boolean</i></code></dd>

    <dd><code><b><a href="#resizablecolumns">-resizablecolumns</a></b>
    <i>boolean</i></code></dd>

    <dd><code><b><a href="#resizecursor">-resizecursor</a></b>
    <i>cursor</i></code></dd>

    <dd><code><b><a href="#selectmode">-selectmode</a></b>
    <b>single</b>|<b>browse</b>|<b>multiple</b>|<b>extended</b></code></dd>

    <dd><code><b><a href="#selecttype">-selecttype</a></b>
    <b>row</b>|<b>cell</b></code></dd>

    <dd><code><b><a href="#setfocus">-setfocus</a></b>
    <i>boolean</i></code></dd>

    <dd><code><b><a href="#showarrow">-showarrow</a></b>
    <i>boolean</i></code></dd>

    <dd><code><b><a href="#showeditcursor">-showeditcursor</a></b>
    <i>boolean</i></code></dd>

    <dd><code><b><a href="#showhorizseparator">-showhorizseparator</a></b>
    <i>boolean</i></code></dd>

    <dd><code><b><a href="#showlabels">-showlabels</a></b>
    <i>boolean</i></code></dd>

    <dd><code><b><a href="#showseparators">-showseparators</a></b>
    <i>boolean</i></code></dd>

    <dd><code><b><a href="#snipstring">-snipstring</a></b>
    <i>string</i></code></dd>

    <dd><code><b><a href="#sortcommand">-sortcommand</a></b>
    <i>command</i></code></dd>

    <dd><code><b><a href="#spacing">-spacing</a></b>
    <i>screenDistance</i></code></dd>

    <dd><code><b><a href="#state">-state</a></b>
    <b>normal</b>|<b>disabled</b></code></dd>

    <dd><code><b><a href="#stretch">-stretch</a></b>
    <b>all</b>|<i>columnIndexList</i></code></dd>

    <dd><code><b><a href="#stripebackground">-stripebackground</a></b>
    <i>color</i></code>&nbsp; or&nbsp; <code><b>-stripebg</b>
    <i>color</i></code></dd>

    <dd><code><b><a href="#stripeforeground">-stripeforeground</a></b>
    <i>color</i></code>&nbsp; or&nbsp; <code><b>-stripefg</b>
    <i>color</i></code></dd>

    <dd><code><b><a href="#stripeheight">-stripeheight</a></b>
    <i>lines</i></code></dd>

    <dd><code><b><a href="#takefocus">-takefocus</a></b>
    <b>0</b>|<b>1</b>|<b>""</b>|<i>command</i></code></dd>

    <dd><code><b><a href="#targetcolor">-targetcolor</a></b>
    <i>color</i></code></dd>

    <dd><code><b><a href="#tight">-tight</a></b> <i>boolean</i></code></dd>

    <dd><code><b><a href="#titlecolumns">-titlecolumns</a></b>
    <i>number</i></code></dd>

    <dd><code><b><a href="#tooltipaddcommand">-tooltipaddcommand</a></b>
    <i>command</i></code></dd>

    <dd><code><b><a href="#tooltipdelcommand">-tooltipdelcommand</a></b>
    <i>command</i></code></dd>

    <dd><code><b><a href="#treecolumn">-treecolumn</a></b>
    <i>columnIndex</i></code></dd>

    <dd><code><b><a href="#treestyle">-treestyle</a></b>
    <b>adwaita</b>|<b>ambiance</b>|<b>aqua</b>|<b>baghira</b>|<b>dust</b>|<b>dustSand</b>|<b>gtk</b>|<br>
    &nbsp;<b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;klearlooks</b>|<b>mate</b>|<b>mint</b>|<b>newWave</b>|<b>oxygen1</b>|<b>oxygen2</b>|<br>
    &nbsp;<b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;phase</b>|<b>plastik</b>|<b>plastique</b>|<b>radiance</b>|<b>ubuntu</b>|<br>
    &nbsp;<b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vistaAero</b>|<b>vistaClassic</b>|<b>win7Aero</b>|<b>win7Classic</b>|<br>
    &nbsp;<b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;winnative</b>|<b>winxpBlue</b>|<b>winxpOlive</b>|<b>winxpSilver</b></code></dd>

    <dd><code><b><a href="#width">-width</a></b> <i>characters</i></code></dd>

    <dt class="tm"><a href="#col_options">COLUMN CONFIGURATION OPTIONS</a></dt>

    <dd><code><b><a href="#col_align">-align</a></b>
    <b>left</b>|<b>right</b>|<b>center</b></code></dd>

    <dd><code><b><a href="#col_background">-background</a></b>
    <i>color</i></code>&nbsp; or&nbsp; <code><b>-bg</b>
    <i>color</i></code></dd>

    <dd><code><b><a href="#col_changesnipside">-changesnipside</a></b>
    <i>boolean</i></code></dd>

    <dd><code><b><a href=
    "#col_changetitlesnipside">-changetitlesnipside</a></b>
    <i>boolean</i></code></dd>

    <dd><code><b><a href="#col_editable">-editable</a></b>
    <i>boolean</i></code></dd>

    <dd><code><b><a href="#col_editwindow">-editwindow</a></b>
    <i>name</i></code></dd>

    <dd><code><b><a href="#col_font">-font</a></b> <i>font</i></code></dd>

    <dd><code><b><a href="#col_foreground">-foreground</a></b>
    <i>color</i></code>&nbsp; or&nbsp; <code><b>-fg</b>
    <i>color</i></code></dd>

    <dd><code><b><a href="#col_formatcommand">-formatcommand</a></b>
    <i>command</i></code></dd>

    <dd><code><b><a href="#col_hide">-hide</a></b> <i>boolean</i></code></dd>

    <dd><code><b><a href="#col_labelalign">-labelalign</a></b>
    <b>left</b>|<b>right</b>|<b>center</b></code></dd>

    <dd><code><b><a href="#col_labelopts">-labelbackground</a></b>
    <i>color</i></code>&nbsp; or&nbsp; <code><b>-labelbg</b>
    <i>color</i></code></dd>

    <dd><code><b><a href="#col_labelopts">-labelborderwidth</a></b>
    <i>screenDistance</i></code>&nbsp; or&nbsp; <code><b>-labelbd</b>
    <i>screenDistance</i></code></dd>

    <dd><code><b><a href="#col_labelopts">-labelcommand</a></b>
    <i>command</i></code></dd>

    <dd><code><b><a href="#col_labelopts">-labelcommand2</a></b>
    <i>command</i></code></dd>

    <dd><code><b><a href="#col_labelopts">-labelfont</a></b>
    <i>font</i></code></dd>

    <dd><code><b><a href="#col_labelopts">-labelforeground</a></b>
    <i>color</i></code>&nbsp; or&nbsp; <code><b>-labelfg</b>
    <i>color</i></code></dd>

    <dd><code><b><a href="#col_labelopts">-labelheight</a></b>
    <i>lines</i></code></dd>

    <dd><code><b><a href="#col_labelimage">-labelimage</a></b>
    <i>image</i></code></dd>

    <dd><code><b><a href="#col_labelopts">-labelpady</a></b>
    <i>screenDistance</i></code></dd>

    <dd><code><b><a href="#col_labelopts">-labelrelief</a></b>
    <b>raised</b>|<b>sunken</b>|<b>flat</b>|<b>ridge</b>|<b>solid</b>|<b>groove</b></code></dd>

    <dd><code><b><a href="#col_maxwidth">-maxwidth</a></b>
    <i>width</i></code></dd>

    <dd><code><b><a href="#col_name">-name</a></b> <i>name</i></code></dd>

    <dd><code><b><a href="#col_resizable">-resizable</a></b>
    <i>boolean</i></code></dd>

    <dd><code><b><a href="#col_selectbackground">-selectbackground</a></b>
    <i>color</i></code></dd>

    <dd><code><b><a href="#col_selectforeground">-selectforeground</a></b>
    <i>color</i></code></dd>

    <dd><code><b><a href="#col_showarrow">-showarrow</a></b>
    <i>boolean</i></code></dd>

    <dd><code><b><a href="#col_showlinenumbers">-showlinenumbers</a></b>
    <i>boolean</i></code></dd>

    <dd><code><b><a href="#col_sortcommand">-sortcommand</a></b>
    <i>command</i></code></dd>

    <dd><code><b><a href="#col_sortmode">-sortmode</a></b>
    <b>ascii</b>|<b>asciinocase</b>|<b>command</b>|<b>dictionary</b>|<b>integer</b>|<b>real</b></code></dd>

    <dd><code><b><a href="#col_stretchable">-stretchable</a></b>
    <i>boolean</i></code></dd>

    <dd><code><b><a href="#col_stripebackground">-stripebackground</a></b>
    <i>color</i></code></dd>

    <dd><code><b><a href="#col_stripeforeground">-stripeforeground</a></b>
    <i>color</i></code></dd>

    <dd><code><b><a href="#col_text">-text</a></b> <i>list</i></code></dd>

    <dd><code><b><a href="#col_title">-title</a></b> <i>title</i></code></dd>

    <dd><code><b><a href="#col_valign">-valign</a></b>
    <b>center</b>|<b>top</b>|<b>bottom</b></code></dd>

    <dd><code><b><a href="#col_width">-width</a></b> <i>width</i></code></dd>

    <dd><code><b><a href="#col_wrap">-wrap</a></b> <i>boolean</i></code></dd>

    <dt class="tm"><a href="#row_options">ROW CONFIGURATION OPTIONS</a></dt>

    <dd><code><b><a href="#row_background">-background</a></b>
    <i>color</i></code>&nbsp; or&nbsp; <code><b>-bg</b>
    <i>color</i></code></dd>

    <dd><code><b><a href="#row_font">-font</a></b> <i>font</i></code></dd>

    <dd><code><b><a href="#row_foreground">-foreground</a></b>
    <i>color</i></code>&nbsp; or&nbsp; <code><b>-fg</b>
    <i>color</i></code></dd>

    <dd><code><b><a href="#row_hide">-hide</a></b> <i>boolean</i></code></dd>

    <dd><code><b><a href="#row_name">-name</a></b> <i>name</i></code></dd>

    <dd><code><b><a href="#row_selectable">-selectable</a></b>
    <i>boolean</i></code></dd>

    <dd><code><b><a href="#row_selectbackground">-selectbackground</a></b>
    <i>color</i></code></dd>

    <dd><code><b><a href="#row_selectforeground">-selectforeground</a></b>
    <i>color</i></code></dd>

    <dd><code><b><a href="#row_text">-text</a></b> <i>list</i></code></dd>

    <dt class="tm"><a href="#cell_options">CELL CONFIGURATION OPTIONS</a></dt>

    <dd><code><b><a href="#cell_background">-background</a></b>
    <i>color</i></code>&nbsp; or&nbsp; <code><b>-bg</b>
    <i>color</i></code></dd>

    <dd><code><b><a href="#cell_editable">-editable</a></b>
    <i>boolean</i></code></dd>

    <dd><code><b><a href="#cell_editwindow">-editwindow</a></b>
    <i>name</i></code></dd>

    <dd><code><b><a href="#cell_font">-font</a></b> <i>font</i></code></dd>

    <dd><code><b><a href="#cell_foreground">-foreground</a></b>
    <i>color</i></code>&nbsp; or&nbsp; <code><b>-fg</b>
    <i>color</i></code></dd>

    <dd><code><b><a href="#cell_image">-image</a></b> <i>image</i></code></dd>

    <dd><code><b><a href="#cell_selectbackground">-selectbackground</a></b>
    <i>color</i></code></dd>

    <dd><code><b><a href="#cell_selectforeground">-selectforeground</a></b>
    <i>color</i></code></dd>

    <dd><code><b><a href="#cell_stretchwindow">-stretchwindow</a></b>
    <i>boolean</i></code></dd>

    <dd><code><b><a href="#cell_text">-text</a></b> <i>text</i></code></dd>

    <dd><code><b><a href="#cell_valign">-valign</a></b>
    <b>center</b>|<b>top</b>|<b>bottom</b></code></dd>

    <dd><code><b><a href="#cell_window">-window</a></b>
    <i>command</i></code></dd>

    <dd><code><b><a href="#cell_windowdestroy">-windowdestroy</a></b>
    <i>command</i></code></dd>

    <dd><code><b><a href="#cell_windowupdate">-windowupdate</a></b>
    <i>command</i></code></dd>

    <dt class="tm"><a href="#description">DESCRIPTION</a></dt>

    <dt class="tm"><a href="#colors_and_fonts">COLORS AND FONTS</a></dt>

    <dt class="tm"><a href="#tree_widget">USING A TABLELIST AS MULTI-COLUMN
    TREE WIDGET</a></dt>

    <dt class="tm"><a href="#cell_editing">INTERACTIVE CELL EDITING</a></dt>

    <dt class="tm"><a href="#drag_and_drop_support">DRAG &amp; DROP
    SUPPORT</a></dt>

    <dt class="tm"><a href="#virtual_events">VIRTUAL EVENTS</a></dt>

    <dt class="tm"><a href="#row_indices">ROW INDICES</a></dt>

    <dd>
      <pre>
<i>number</i>  <b>k</b><i>number</i>  <b>active</b>  <b>anchor</b>  <b>end</b>  <b>last</b>  <b>top</b>  <b>bottom</b>  <b>@</b><i>x</i><b>,</b><i>y</i>  <i>name</i>
</pre>
    </dd>

    <dt><a href="#node_indices">NODE INDICES</a></dt>

    <dd>
      <pre>
<b>root</b>  <i>number</i>  <b>k</b><i>number</i>  <b>active</b>  <b>anchor</b>  <b>end</b>  <b>last</b>  <b>top</b>  <b>bottom</b>  <b>@</b><i>x</i><b>,</b><i>y</i>  <i>name</i>
</pre>
    </dd>

    <dt><a href="#col_indices">COLUMN INDICES</a></dt>

    <dd>
      <pre>
<i>number</i>  <b>active</b>  <b>anchor</b>  <b>end</b>  <b>last</b>  <b>left</b>  <b>right</b>  <b>@</b><i>x</i><b>,</b><i>y</i>  <i>name</i>
</pre>
    </dd>

    <dt><a href="#cell_indices">CELL INDICES</a></dt>

    <dd>
      <pre>
<i>row</i><b>,</b><i>col</i>  <b>active</b>  <b>anchor</b>  <b>end</b>  <b>last</b>  <b>@</b><i>x</i><b>,</b><i>y</i>

    <i>row</i>: <i>number</i>  <b>k</b><i>number</i>  <b>active</b>  <b>anchor</b>  <b>end</b>  <b>last</b>  <b>top</b>  <b>bottom</b>  <i>name</i>
    <i>col</i>: <i>number</i>  <b>active</b>  <b>anchor</b>  <b>end</b>  <b>last</b>  <b>left</b>  <b>right</b>  <i>name</i>
</pre>
    </dd>

    <dt><a href="#widget_command">WIDGET COMMAND</a></dt>

    <dd><code><i>pathName</i> <b><a href="#activate">activate</a></b>
    <i>index</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#activatecell">activatecell</a></b>
    <i>cellIndex</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#applysorting">applysorting</a></b>
    <i>itemList</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#attrib">attrib</a></b> ?<i>name</i>?
    ?<i>value</i> <i>name</i> <i>value</i> ...?</code></dd>

    <dd><code><i>pathName</i> <b><a href="#bbox">bbox</a></b>
    <i>index</i></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#bodypath">bodypath</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href="#bodytag">bodytag</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#canceledediting">canceledediting</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#cancelediting">cancelediting</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href="#cellattrib">cellattrib</a></b>
    <i>cellIndex</i> ?<i>name</i>? ?<i>value</i> <i>name</i> <i>value</i>
    ...?</code></dd>

    <dd><code><i>pathName</i> <b><a href="#cellbbox">cellbbox</a></b>
    <i>cellIndex</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#cellcget">cellcget</a></b>
    <i>cellIndex</i> <i>option</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#cellconfigure">cellconfigure</a></b>
    <i>cellIndex</i> ?<i>option</i>? ?<i>value</i> <i>option</i> <i>value</i>
    ...?</code></dd>

    <dd><code><i>pathName</i> <b><a href="#cellindex">cellindex</a></b>
    <i>cellIndex</i></code></dd>

    <dd>
      <code><i>pathName</i> <b><a href="#cellselection">cellselection</a></b>
      <i>option</i> <i>args</i></code>

      <dl>
        <dd><code><i>pathName</i> <b>cellselection</b> <b>anchor</b>
        <i>cellIndex</i></code></dd>

        <dd><code><i>pathName</i> <b>cellselection</b> <b>clear</b>
        <i>firstCell</i> <i>lastCell</i></code></dd>

        <dd><code><i>pathName</i> <b>cellselection</b> <b>clear</b>
        <i>cellIndexList</i></code></dd>

        <dd><code><i>pathName</i> <b>cellselection</b> <b>includes</b>
        <i>cellIndex</i></code></dd>

        <dd><code><i>pathName</i> <b>cellselection</b> <b>set</b>
        <i>firstCell</i> <i>lastCell</i></code></dd>

        <dd><code><i>pathName</i> <b>cellselection</b> <b>set</b>
        <i>cellIndexList</i></code></dd>
      </dl>
    </dd>

    <dd><code><i>pathName</i> <b><a href="#cget">cget</a></b>
    <i>option</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#childcount">childcount</a></b>
    <i>nodeIndex</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#childindex">childindex</a></b>
    <i>index</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#childkeys">childkeys</a></b>
    <i>nodeIndex</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#collapse">collapse</a></b>
    <i>index</i> ?<b>-fully</b>|<b>-partly</b>?</code></dd>

    <dd><code><i>pathName</i> <b><a href="#collapseall">collapseall</a></b>
    ?<b>-fully</b>|<b>-partly</b>?</code></dd>

    <dd><code><i>pathName</i> <b><a href="#columnattrib">columnattrib</a></b>
    <i>columnIndex</i> ?<i>name</i>? ?<i>value</i> <i>name</i> <i>value</i>
    ...?</code></dd>

    <dd><code><i>pathName</i> <b><a href="#columncget">columncget</a></b>
    <i>columnIndex</i> <i>option</i></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#columnconfigure">columnconfigure</a></b> <i>columnIndex</i>
    ?<i>option</i>? ?<i>value</i> <i>option</i> <i>value</i> ...?</code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#columncount">columncount</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href="#columnindex">columnindex</a></b>
    <i>columnIndex</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#columnwidth">columnwidth</a></b>
    <i>columnIndex</i>
    ?<b>-requested</b>|<b>-stretched</b>|<b>-total</b>?</code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#configcelllist">configcelllist</a></b> {<i>cellIndex</i> <i>option</i>
    <i>value</i> <i>cellIndex</i> <i>option</i> <i>value</i> ...}</code></dd>

    <dd><code><i>pathName</i> <b><a href="#configcells">configcells</a></b>
    ?<i>cellIndex</i> <i>option</i> <i>value</i> <i>cellIndex</i> <i>option</i>
    <i>value</i> ...?</code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#configcolumnlist">configcolumnlist</a></b> {<i>columnIndex</i>
    <i>option</i> <i>value</i> <i>columnIndex</i> <i>option</i> <i>value</i>
    ...}</code></dd>

    <dd><code><i>pathName</i> <b><a href="#configcolumns">configcolumns</a></b>
    ?<i>columnIndex</i> <i>option</i> <i>value</i> <i>columnIndex</i>
    <i>option</i> <i>value</i> ...?</code></dd>

    <dd><code><i>pathName</i> <b><a href="#configrowlist">configrowlist</a></b>
    {<i>index</i> <i>option</i> <i>value</i> <i>index</i> <i>option</i>
    <i>value</i> ...}</code></dd>

    <dd><code><i>pathName</i> <b><a href="#configrows">configrows</a></b>
    ?<i>index</i> <i>option</i> <i>value</i> <i>index</i> <i>option</i>
    <i>value</i> ...?</code></dd>

    <dd><code><i>pathName</i> <b><a href="#configure">configure</a></b>
    ?<i>option</i>? ?<i>value</i> <i>option</i> <i>value</i> ...?</code></dd>

    <dd><code><i>pathName</i> <b><a href="#containing">containing</a></b>
    <i>y</i></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#containingcell">containingcell</a></b> <i>x</i> <i>y</i></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#containingcolumn">containingcolumn</a></b> <i>x</i></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#cornerlabelpath">cornerlabelpath</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#cornerpath">cornerpath</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#curcellselection">curcellselection</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#curselection">curselection</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href="#delete">delete</a></b> <i>first</i>
    <i>last</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#delete">delete</a></b>
    <i>indexList</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#deletecolumns">deletecolumns</a></b>
    <i>firstColumn</i> <i>lastColumn</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#deletecolumns">deletecolumns</a></b>
    <i>columnIndexList</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#depth">depth</a></b>
    <i>nodeIndex</i></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#descendantcount">descendantcount</a></b> <i>nodeIndex</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#editcell">editcell</a></b>
    <i>cellIndex</i></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#editinfo">editinfo</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#editwinpath">editwinpath</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#editwintag">editwintag</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#entrypath">entrypath</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href="#expand">expand</a></b> <i>index</i>
    ?<b>-fully</b>|<b>-partly</b>?</code></dd>

    <dd><code><i>pathName</i> <b><a href="#expandall">expandall</a></b>
    ?<b>-fully</b>|<b>-partly</b>?</code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#expandedkeys">expandedkeys</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href="#fillcolumn">fillcolumn</a></b>
    <i>columnIndex</i> <i>text</i></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#findcolumnname">findcolumnname</a></b> <i>name</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#findrowname">findrowname</a></b>
    <i>name</i> ?<b>-descend</b>? ?<b>-parent</b> <i>nodeIndex</i>?</code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#finishediting">finishediting</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#formatinfo">formatinfo</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href="#get">get</a></b> <i>first</i>
    <i>last</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#get">get</a></b>
    <i>indexList</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#getcells">getcells</a></b>
    <i>firstCell</i> <i>lastCell</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#getcells">getcells</a></b>
    <i>cellIndexList</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#getcolumns">getcolumns</a></b>
    <i>firstColumn</i> <i>lastColumn</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#getcolumns">getcolumns</a></b>
    <i>columnIndexList</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#getformatted">getformatted</a></b>
    <i>first</i> <i>last</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#getformatted">getformatted</a></b>
    <i>indexList</i></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#getformattedcells">getformattedcells</a></b> <i>firstCell</i>
    <i>lastCell</i></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#getformattedcells">getformattedcells</a></b>
    <i>cellIndexList</i></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#getformattedcolumns">getformattedcolumns</a></b> <i>firstColumn</i>
    <i>lastColumn</i></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#getformattedcolumns">getformattedcolumns</a></b>
    <i>columnIndexList</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#getfullkeys">getfullkeys</a></b>
    <i>first</i> <i>last</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#getfullkeys">getfullkeys</a></b>
    <i>indexList</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#getkeys">getkeys</a></b>
    <i>first</i> <i>last</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#getkeys">getkeys</a></b>
    <i>indexList</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#hasattrib">hasattrib</a></b>
    <i>name</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#hascellattrib">hascellattrib</a></b>
    <i>cellIndex</i> <i>name</i></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#hascolumnattrib">hascolumnattrib</a></b> <i>columnIndex</i>
    <i>name</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#hasrowattrib">hasrowattrib</a></b>
    <i>index</i> <i>name</i></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#hidetargetmark">hidetargetmark</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#imagelabelpath">imagelabelpath</a></b> <i>cellIndex</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#index">index</a></b>
    <i>index</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#insert">insert</a></b> <i>index</i>
    ?<i>item</i> <i>item</i> ...?</code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#insertchildlist">insertchildlist</a></b> <i>parentNodeIndex</i>
    <i>childIndex</i> <i>itemList</i></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#insertchildren">insertchild(ren)</a></b> <i>parentNodeIndex</i>
    <i>childIndex</i> ?<i>item</i> <i>item</i> ...?</code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#insertcolumnlist">insertcolumnlist</a></b> <i>columnIndex</i>
    {<i>width</i> <i>title</i> ?<b>left</b>|<b>right</b>|<b>center</b>?
    <i>width</i> <i>title</i> ?<b>left</b>|<b>right</b>|<b>center</b>?
    ...}</code></dd>

    <dd><code><i>pathName</i> <b><a href="#insertcolumns">insertcolumns</a></b>
    <i>columnIndex</i> ?<i>width</i> <i>title</i>
    ?<b>left</b>|<b>right</b>|<b>center</b>? <i>width</i> <i>title</i>
    ?<b>left</b>|<b>right</b>|<b>center</b>? ...?</code></dd>

    <dd><code><i>pathName</i> <b><a href="#insertlist">insertlist</a></b>
    <i>index</i> <i>itemList</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#iselemsnipped">iselemsnipped</a></b>
    <i>cellIndex</i> <i>fullTextName</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#isexpanded">isexpanded</a></b>
    <i>index</i></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#istitlesnipped">istitlesnipped</a></b> <i>columnIndex</i>
    <i>fullTextName</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#isviewable">isviewable</a></b>
    <i>index</i></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#itemlistvar">itemlistvar</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href="#labelpath">labelpath</a></b>
    <i>columnIndex</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#labels">labels</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#labeltag">labeltag</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href="#move">move</a></b>
    <i>sourceIndex</i> <i>targetIndex</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#move">move</a></b>
    <i>sourceIndex</i> <i>targetParentNodeIndex</i>
    <i>targetChildIndex</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#movecolumn">movecolumn</a></b>
    <i>sourceColumn</i> <i>targetColumn</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#nearest">nearest</a></b>
    <i>y</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#nearestcell">nearestcell</a></b>
    <i>x</i> <i>y</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#nearestcolumn">nearestcolumn</a></b>
    <i>x</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#noderow">noderow</a></b>
    <i>parentNodeIndex</i> <i>childIndex</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#parentkey">parentkey</a></b>
    <i>nodeIndex</i></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#refreshsorting">refreshsorting</a></b>
    ?<i>parentNodeIndex</i>?</code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#rejectinput">rejectinput</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#resetsortinfo">resetsortinfo</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href="#rowattrib">rowattrib</a></b>
    <i>index</i> ?<i>name</i>? ?<i>value</i> <i>name</i> <i>value</i>
    ...?</code></dd>

    <dd><code><i>pathName</i> <b><a href="#rowcget">rowcget</a></b>
    <i>index</i> <i>option</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#rowconfigure">rowconfigure</a></b>
    <i>index</i> ?<i>option</i>? ?<i>value</i> <i>option</i> <i>value</i>
    ...?</code></dd>

    <dd><code><i>pathName</i> <b><a href="#scan">scan</a></b>
    <b>mark</b>|<b>dragto</b> <i>x</i> <i>y</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#searchcolumn">searchcolumn</a></b>
    <i>columnIndex</i> <i>pattern</i> ?<i>options</i>?</code></dd>

    <dd><code><i>pathName</i> <b><a href="#see">see</a></b>
    <i>index</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#seecell">seecell</a></b>
    <i>cellIndex</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#seecolumn">seecolumn</a></b>
    <i>columnIndex</i></code></dd>

    <dd>
      <code><i>pathName</i> <b><a href="#selection">selection</a></b>
      <i>option</i> <i>args</i></code>

      <dl>
        <dd><code><i>pathName</i> <b>selection</b> <b>anchor</b>
        <i>index</i></code></dd>

        <dd><code><i>pathName</i> <b>selection</b> <b>clear</b> <i>first</i>
        <i>last</i></code></dd>

        <dd><code><i>pathName</i> <b>selection</b> <b>clear</b>
        <i>indexList</i></code></dd>

        <dd><code><i>pathName</i> <b>selection</b> <b>includes</b>
        <i>index</i></code></dd>

        <dd><code><i>pathName</i> <b>selection</b> <b>set</b> <i>first</i>
        <i>last</i></code></dd>

        <dd><code><i>pathName</i> <b>selection</b> <b>set</b>
        <i>indexList</i></code></dd>
      </dl>
    </dd>

    <dd><code><i>pathName</i> <b><a href="#separatorpath">separatorpath</a></b>
    ?<i>columnIndex</i>?</code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#separators">separators</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#showtargetmark">showtargetmark</a></b> <b>before</b>|<b>inside</b>
    <i>index</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#size">size</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href="#sort">sort</a></b>
    ?<b>-increasing</b>|<b>-decreasing</b>?</code></dd>

    <dd><code><i>pathName</i> <b><a href="#sortbycolumn">sortbycolumn</a></b>
    <i>columnIndex</i> ?<b>-increasing</b>|<b>-decreasing</b>?</code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#sortbycolumnlist">sortbycolumnlist</a></b> <i>columnIndexList</i>
    ?<i>sortOrderList</i>?</code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#sortcolumn">sortcolumn</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#sortcolumnlist">sortcolumnlist</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#sortorder">sortorder</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#sortorderlist">sortorderlist</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#targetmarkpath">targetmarkpath</a></b></code></dd>

    <dd><code><i>pathName</i> <b><a href="#targetmarkpos">targetmarkpos</a></b>
    <i>y</i> ?<b>-any</b>|<b>-horizontal</b>|<b>-vertical</b>?</code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#togglecolumnhide">togglecolumnhide</a></b> <i>firstColumn</i>
    <i>lastColumn</i></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#togglecolumnhide">togglecolumnhide</a></b>
    <i>columnIndexList</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#togglerowhide">togglerowhide</a></b>
    <i>first</i> <i>last</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#togglerowhide">togglerowhide</a></b>
    <i>indexList</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#toplevelkey">toplevelkey</a></b>
    <i>index</i></code></dd>

    <dd><code><i>pathName</i> <b><a href="#unsetattrib">unsetattrib</a></b>
    <i>name</i></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#unsetcellattrib">unsetcellattrib</a></b> <i>cellIndex</i>
    <i>name</i></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#unsetcolumnattrib">unsetcolumnattrib</a></b> <i>columnIndex</i>
    <i>name</i></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#unsetrowattrib">unsetrowattrib</a></b> <i>index</i>
    <i>name</i></code></dd>

    <dd><code><i>pathName</i> <b><a href=
    "#viewablerowcount">viewablerowcount</a></b> ?<i>first</i>
    <i>last</i>?</code></dd>

    <dd><code><i>pathName</i> <b><a href="#windowpath">windowpath</a></b>
    <i>cellIndex</i></code></dd>

    <dd>
      <code><i>pathName</i> <b><a href="#xview">xview</a></b>
      <i>args</i></code>

      <dl>
        <dd><code><i>pathName</i> <b>xview</b></code></dd>

        <dd><code><i>pathName</i> <b>xview</b> <i>units</i></code></dd>

        <dd><code><i>pathName</i> <b>xview</b> <b>moveto</b>
        <i>fraction</i></code></dd>

        <dd><code><i>pathName</i> <b>xview</b> <b>scroll</b> <i>number</i>
        <b>units</b>|<b>pages</b></code></dd>
      </dl>
    </dd>

    <dd>
      <code><i>pathName</i> <b><a href="#yview">yview</a></b>
      <i>args</i></code>

      <dl>
        <dd><code><i>pathName</i> <b>yview</b></code></dd>

        <dd><code><i>pathName</i> <b>yview</b> <i>units</i></code></dd>

        <dd><code><i>pathName</i> <b>yview</b> <b>moveto</b>
        <i>fraction</i></code></dd>

        <dd><code><i>pathName</i> <b>yview</b> <b>scroll</b> <i>number</i>
        <b>units</b>|<b>pages</b></code></dd>
      </dl>
    </dd>

    <dt class="tm"><a href="#body_bindings">DEFAULT AND INDIVIDUAL BINDINGS FOR
    THE TABLELIST BODY</a></dt>

    <dt class="tm"><a href="#label_bindings">DEFAULT AND INDIVIDUAL BINDINGS
    FOR THE HEADER LABELS</a></dt>

    <dt class="tm"><a href="#edit_bindings">DEFAULT BINDINGS FOR INTERACTIVE
    CELL EDITING</a></dt>

    <dt class="tm"><a href="#keywords">KEYWORDS</a></dt>

    <dd>tablelist, multi-column, listbox, tree, widget</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
  <hr>

  <h2 id="detailed_ref">Detailed Reference</h2>

  <dl>
    <dt id="name"><b>NAME</b></dt>

    <dd><code>tablelist::tablelist</code> &ndash; Create and manipulate
    tablelist widgets</dd>

    <dt class="tm" id="synopsis"><b>SYNOPSIS</b></dt>

    <dd>
      <pre>
<b>tablelist::tablelist</b> <i>pathName</i> ?<i>options</i>?
</pre>
    </dd>

    <dt id="std_options"><b>STANDARD OPTIONS</b></dt>

    <dd>
      <pre>
<b>-borderwidth          -highlightthickness  -setgrid
-cursor               -relief              -xscrollcommand
-exportselection      -selectbackground    -yscrollcommand
-highlightbackground  -selectborderwidth
-highlightcolor       -selectforeground</b>
</pre>
    </dd>

    <dd>See the <b>options</b> manual entry for details on the standard
    options.&nbsp; The <code><b>-highlightbackground</b></code>,
    <code><b>-highlightcolor</b></code>, and
    <code><b>-highlightthickness</b></code> options are only supported by the
    Tablelist package, but not by Tablelist_tile.&nbsp; When using the package
    Tablelist_tile, the options <code><b>-selectbackground</b></code>,
    <code><b>-selectborderwidth</b></code>, and
    <code><b>-selectforeground</b></code> have theme-specific default
    values.</dd>

    <dt class="tm" id="body_options"><b>OPTIONS FOR THE BODY COMPONENT OF THE
    WIDGET</b></dt>

    <dd>
      <pre>
<b>-background  -disabledforeground  -font  -foreground</b>
</pre>
    </dd>

    <dd>These options (described in the <b>options</b> manual entry) are only
    valid for the body component of the tablelist widget.&nbsp; 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.&nbsp; When using the
    package Tablelist_tile, these options have theme-specific default
    values.</dd>

    <dt class="tm" id="widget_options"><b>WIDGET-SPECIFIC OPTIONS</b></dt>

    <dd class="tm" id="acceptchildcommand">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-acceptchildcommand</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;acceptChildCommand</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;AcceptChildCommand</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies a Tcl command used to decide whether a given tablelist
        node may accept a specified item being <a href=
        "#local_drag_and_drop">moved interactively</a> as a child.&nbsp; 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.</p>

        <p>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
        system, the command specified by this option might look like in the
        (pseudo-)code below:</p>

        <blockquote>
          <pre>
proc acceptChildCmd {tbl targetParentNodeIdx sourceRow} {
    if {[string compare $targetParentNodeIdx "root"] == 0} {
        <i># Allow only volumes as top-level items</i>
        return [expr {[$tbl <a href="#depth">depth</a> $sourceRow] == 1}]
    } else {
        <i># Allow only directories as parent items</i>
        return [<i>$targetParentNodeIdx represents a directory</i>]
    }
}
</pre>
        </blockquote>

        <p>For technical reasons (the use of the <code><b>-elide</b></code>
        text widget tag option for collapsing a row), this option is not
        supported for Tk versions earlier than 8.3.</p>
      </blockquote>
    </dd>

    <dd id="acceptdropcommand">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-acceptdropcommand</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;acceptDropCommand</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;AcceptDropCommand</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies a Tcl command used to decide whether a given tablelist row
        may accept a specified item being <a href="#local_drag_and_drop">moved
        interactively</a> to be dropped as a sibling just before that
        row.&nbsp; 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
        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.</p>

        <p>For example, to make sure that the position of the last row of a
        tablelist widget won't be affected by the interactive row move
        operation, the command specified by this option might look like in the
        code below:</p>

        <blockquote>
          <pre>
proc acceptDropCmd {tbl targetRow sourceRow} {
    set rowCount [[$tbl <a href="#size">size</a>]
    return [expr {$sourceRow != $rowCount - 1 &amp;&amp; $targetRow &lt; $rowCount}]
}
</pre>
        </blockquote>
      </blockquote>
    </dd>

    <dd id="activestyle">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-activestyle</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;activeStyle</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;ActiveStyle</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies how to diplay the active item or element (depending on the
        value of the <code><b><a href="#selecttype">-selecttype</a></b></code>
        configuration option) when the tablelist has the keyboard focus.&nbsp;
        The allowed values are <code><b>frame</b></code>,
        <code><b>none</b></code>, and <code><b>underline</b></code>.&nbsp; The
        default value <code><b>frame</b></code> shows a thin frame around the
        active item or element, which in most cases looks nice.&nbsp; It looks
        less pretty when applied to the active item if the background color of
        some of its cells was changed by using the <code><b><a href=
        "#columnconfigure">columnconfigure</a></b></code> or <code><b><a href=
        "#cellconfigure">cellconfigure</a></b></code> widget command and no
        column separators are shown.&nbsp; The value <code><b>none</b></code>
        specifies that no special indication of the active item or element is
        to be performed.&nbsp; The value <code><b>underline</b></code> produces
        the same visual effect as in the case of the Tk core listbox.</p>
      </blockquote>
    </dd>

    <dd id="arrowcolor">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-arrowcolor</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;arrowColor</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;ArrowColor</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the color to use for the up- or down-arrow placed into a
        column label by the <code><b><a href=
        "#sortbycolumn">sortbycolumn</a></b></code> or <code><b><a href=
        "#sortbycolumnlist">sortbycolumnlist</a></b></code> subcommand of the
        Tcl command associated with the widget.&nbsp; This option is only
        relevant if the value of the <code><b><a href=
        "#showarrow">-showarrow</a></b></code> option is true.&nbsp; The
        default value depends on the windowing system in the Tablelist package
        and on the current theme in Tablelist_tile.&nbsp; For example, if the
        windowing system is <code><b>x11</b></code> then the default is an
        empty string, indicating that the arrow will inherit the background
        color of the label in which it is placed (but is distinguishable from
        the latter, due to its 3-D border and sunken relief, because in this
        case the <code><b><a href="#arrowstyle">-arrowstyle</a></b></code>
        option has the default value <code><b>sunken10x9</b></code>).&nbsp; On
        the windowing system <code><b>win32</b></code>, the default arrow color
        is <code>#aca899</code> for Windows XP, <code>#569bc0</code> for
        Windows Vista and Windows 7, and an empty string for older Windows
        versions, paired with the default arrow style
        <code><b>flat9x5</b></code>, <code><b>flat7x4</b></code>, and
        <code><b>sunken8x7</b></code>, respectively.&nbsp; Finally, for the
        windowing systems <code><b>classic</b></code> and
        <code><b>aqua</b></code> on the Macintosh, the default arrow color and
        style depend on the version of the operating system:&nbsp; Starting
        with version 10.10 (Yosemite) of Mac OS X, the default arrow color for
        the windowing system <code><b>aqua</b></code> is <code>#404040</code>
        and the default arrow style is <code><b>flatAngle7x4</b></code>.&nbsp;
        For earlier operating system versions, the default values are the arrow
        color <code>#717171</code> and the arrow style
        <code><b>flat7x7</b></code> (or <code><b>photo7x7</b></code>, in the
        presence of PNG support).</p>
      </blockquote>
    </dd>

    <dd id="arrowdisabledcolor">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-arrowdisabledcolor</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;arrowDisabledColor</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;ArrowDisabledColor</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the color to use for the up- or down-arrow placed into a
        column label by the <code><b><a href=
        "#sortbycolumn">sortbycolumn</a></b></code> or <code><b><a href=
        "#sortbycolumnlist">sortbycolumnlist</a></b></code> subcommand of the
        Tcl command associated with the widget when the tablelist's
        <code><b><a href="#state">state</a></b></code> is
        <code><b>disabled</b></code>.&nbsp; This option is only relevant if the
        value of the <code><b><a href="#showarrow">-showarrow</a></b></code>
        option is true.&nbsp; When the default value of the <code><b><a href=
        "#arrowcolor">-arrowcolor</a></b></code> option is an empty string then
        this is the default for the <code><b>-arrowdisabledcolor</b></code>
        option, too; otherwise the latter's default value equals the default
        foreground color of the header labels in <code><b>disabled</b></code>
        state.</p>
      </blockquote>
    </dd>

    <dd id="arrowstyle">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-arrowstyle</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;arrowStyle</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;ArrowStyle</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the relief, shape, width, and height of the up- or
        down-arrow placed into a column label by the <code><b><a href=
        "#sortbycolumn">sortbycolumn</a></b></code> or <code><b><a href=
        "#sortbycolumnlist">sortbycolumnlist</a></b></code> subcommand of the
        Tcl command associated with the widget.&nbsp; This option is only
        relevant if the value of the <code><b><a href=
        "#showarrow">-showarrow</a></b></code> option is true.&nbsp; The
        currently supported values are <code><b>flat5x3</b></code>,
        <code><b>flat5x4</b></code>, <code><b>flat6x4</b></code>,
        <code><b>flat7x4</b></code>, <code><b>flat7x5</b></code>,
        <code><b>flat7x7</b></code>, <code><b>flat8x5</b></code>,
        <code><b>flat9x5</b></code>, <code><b>flat9x6</b></code>,
        <code><b>flatAngle7x4</b></code>, <code><b>flatAngle7x5</b></code>,
        <code><b>flatAngle9x5</b></code>, <code><b>flatAngle9x6</b></code>,
        <code><b>flatAngle9x7</b></code>, <code><b>flatAngle10x6</b></code>,
        <code><b>flatAngle10x7</b></code>, <code><b>photo7x7</b></code>,
        <code><b>sunken8x7</b></code>, <code><b>sunken10x9</b></code>, and
        <code><b>sunken12x11</b></code>, as shown in the picture below.&nbsp;
        The default value depends on the windowing system in the Tablelist
        package and on the current theme in Tablelist_tile; see the description
        of the <code><b><a href="#arrowcolor">-arrowcolor</a></b></code> option
        for details.</p>

        <p><img src="arrowStyles.png" alt="Arrow Styles" width="516" height=
        "95"></p>

        <p>While the sort arrows of the styles <code><b>flat*</b></code> and
        <code><b>sunken*</b></code> are created from bitmaps, the arrow style
        <code><b>photo7x7</b></code> uses PNG images that look and behave very
        close to the native sort arrows on Mac OS X Aqua versions earlier than
        10.10 (Yosemite).&nbsp; This arrow style is only supported if the Tk
        version is either 8.6 (with built-in PNG support), or 8.5 and the
        <code><b>img::png</b></code> package can be loaded into the
        interpreter.&nbsp; When supported, <code><b>photo7x7</b></code> will be
        the default value of the <code><b>-arrowstyle</b></code> option in
        Tablelist_tile with the <code><b>aqua</b></code> theme for Mac OS X
        versions earlier than 10.10 (otherwise <code><b>flat7x7</b></code> will
        be used as default for these earlier OS X versions).&nbsp; When using
        this arrow style, the <code><b><a href=
        "#arrowcolor">-arrowcolor</a></b></code> and <code><b><a href=
        "#arrowdisabledcolor">-arrowdisabledcolor</a></b></code> options have
        no effect, but, due to the transparency information contained in the
        PNG images, the arrows will automatically adapt their color to the
        various states of the header labels, just like the native sort
        arrows.</p>
      </blockquote>
    </dd>

    <dd id="autoscan">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-autoscan</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;autoScan</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;AutoScan</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies a boolean value that controls whether to trigger the
        automatic scrolling when the mouse leaves the tablelist window with
        button 1 down.&nbsp; The default is <code>1</code>, meaning that
        automatic scrolling will be in effect, just like in the case of the Tk
        listbox widget.&nbsp; However, when using the TkDND package or some
        other drag &amp; drop implementation, you might want to set this option
        to <code>0</code>, in order to avoid any conflicts between the drag
        operation and the automatic scrolling.</p>

        <p><b>REMARK:</b>&nbsp; Starting with Tablelist version 5.12, this
        option has become obsolete, because the default bindings now suppress
        the above-mentioned automatic scrolling if the tablelist's body
        component was registered as a drag source for mouse button 1 via
        the&nbsp; <code><b>tkdnd::drag_source register</b></code>&nbsp; or the
        BWidget <code><b>DragSite::register</b></code> command, or the
        tablelist's <code><b><a href=
        "#customdragsource">-customdragsource</a></b></code> option was set to
        true.</p>
      </blockquote>
    </dd>

    <dd id="collapsecommand">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-collapsecommand</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;collapseCommand</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;CollapseCommand</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies a Tcl command to be invoked when collapsing a row of a
        tablelist used as a tree widget (with the aid of the <code><b><a href=
        "#collapse">collapse</a></b></code> or <code><b><a href=
        "#collapseall">collapseall</a></b></code> subcommand).&nbsp; 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 hiding the descendants of the row
        in question.</p>

        <p>For technical reasons (the use of the <code><b>-elide</b></code>
        text widget tag option for collapsing a row), this option is not
        supported for Tk versions earlier than 8.3.</p>
      </blockquote>
    </dd>

    <dd id="columns">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-columns</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;columns</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;Columns</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the widths, titles, and alignments of the columns.&nbsp;
        The option's value must be a list of the form</p>

        <blockquote>
          <pre>
<i>width</i> <i>title</i> ?<i>alignment</i>? <i>width</i> <i>title</i> ?<i>alignment</i>? ...
</pre>
        </blockquote>

        <p>Each <code><i>width</i></code> must be a number.&nbsp; A positive
        value specifies the column's width in average-size characters of the
        widget's font.&nbsp; If <code><i>width</i></code> is negative, its
        absolute value is interpreted as a column width in pixels.&nbsp;
        Finally, a value of zero specifies that the column's width is to be
        made just large enough to hold all the elements in the column,
        including its header (but no larger than the maximum width indicated by
        the <code><b><a href="#col_maxwidth">-maxwidth</a></b></code> column
        configuration option).&nbsp; In all three cases, the effective column
        width will be somewhat greater because of the margins created
        automatically to the left and right of the column.</p>

        <p>Each <code><i>title</i></code> specifies the text to be displayed in
        the column's header, and may optionally be followed in the next list
        element by an <code><i>alignment</i></code>, which specifies how to
        align the elements of the column.&nbsp; Each
        <code><i>alignment</i></code> must be one of <code><b>left</b></code>,
        <code><b>right</b></code>, or <code><b>center</b></code>.&nbsp; The
        default is <code><b>left</b></code>.&nbsp; The
        <code><i>alignment</i></code> also refers to the column's title as long
        as the <code><b><a href="#col_labelalign">-labelalign</a></b></code>
        option hasn't been specified for that column, or if its value is an
        empty string.</p>

        <p>The default value of this option is an empty list, specifying that
        initially the widget has no columns.</p>

        <p><b>REMARK:</b>&nbsp; Columns whose width was specified as zero are
        called <b>dynamic-width</b> columns.&nbsp; In general, they are more
        user-friendly than their <b>static-width</b> counterparts, being that
        their widths are automatically adapted to their contents.&nbsp; 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.&nbsp; (Prior to that
        release, the above-mentioned operations were faster with dynamic-width
        columns than with static-width ones.)</p>
      </blockquote>
    </dd>

    <dd id="columntitles">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-columntitles</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;columnTitles</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;ColumnTitles</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>This option provides a simplified form of specifying dynamic-width,
        left-aligned tablelist columns.&nbsp; Its value is viewed as a list of
        column titles.&nbsp; The default is an empty list.</p>

        <p>In the simplest case that no columns have been specified yet,
        setting this option to the value given by the list</p>

        <blockquote>
          <pre>
<i>title</i> <i>title</i> ...
</pre>
        </blockquote>

        <p>is equivalent to setting the <code><b><a href=
        "#columns">-columns</a></b></code> option to the value given by the
        list</p>

        <blockquote>
          <pre>
0 <i>title</i> left 0 <i>title</i> left ...
</pre>
        </blockquote>

        <p>If the columns have already been specified then this option updates
        their titles (as many of them as possible) and, if the number of
        elements of its value is greater than the number of columns then it
        uses the remaining elements as titles of additional dynamic-width,
        left-aligned columns.&nbsp; For example, if the widget has 3 columns
        and the option's value is a list of length 5 then the option will
        update the titles of the 3 columns and will append 2 new dynamic-width,
        left-aligned columns having as titles the last 2 elements of the
        list.&nbsp; If the widget has 3 columns and the option specifies just 2
        texts then it will update the titles of the first 2 columns only.</p>
      </blockquote>
    </dd>

    <dd id="customdragsource">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-customdragsource</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;customDragSource</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;CustomDragSource</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies a boolean value that indicates whether the tablelist
        widget is a drag source for some drag &amp; drop implementation other
        than TkDND and the drag &amp; drop framework included in BWidget.&nbsp;
        If true then the default bindings will perform an automatic <a href=
        "#global_drag_and_drop">drag-friendly handling of the selection</a> and
        will suppress the automatic scrolling when the mouse leaves the
        tablelist window with button 1 down.&nbsp; The default is
        <code>0</code>.</p>
      </blockquote>
    </dd>

    <dd id="editendcommand">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-editendcommand</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;editEndCommand</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;EditEndCommand</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>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
        temporary embedded widget used for the editing is different from its
        initial one.&nbsp; 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.&nbsp; The
        main purpose of this script is to perform a final validation of the
        edit window's contents.&nbsp; See the description of the
        <code><b><a href=
        "#forceeditendcommand">-forceeditendcommand</a></b></code> option for
        more about the invocation of the command mentioned above, as well as
        the <a href="#cell_editing">INTERACTIVE CELL EDITING</a> section for
        details on the editing process.</p>
      </blockquote>
    </dd>

    <dd id="editselectedonly">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-editselectedonly</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;editSelectedOnly</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;EditSelectedOnly</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies a boolean value that controls whether to start the
        interactive cell editing when mouse button 1 is pressed in an editable
        cell.&nbsp; If this value is true then the editing will only be started
        if the cell has previously been selected (interactively or
        programmatically).&nbsp; In this case, a first left-click will usually
        just select the cell (or its row, depending on the value of the
        <code><b><a href="#selecttype">-selecttype</a></b></code> option), and
        a second mouse click will start the editing session.&nbsp; The default
        is <code>0</code>, meaning that the editing will be started regardless
        of whether the cell is selected or not.</p>
      </blockquote>
    </dd>

    <dd id="editstartcommand">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-editstartcommand</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;editStartCommand</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;EditStartCommand</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies a Tcl command to be invoked when the interactive editing
        of a cell's contents is started.&nbsp; 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
        resulting script is evaluated in the global scope, and the return value
        becomes the initial contents of the temporary embedded widget used for
        the editing.&nbsp; The main purpose of this script is to define
        validations for the edit window's contents.&nbsp; See the <a href=
        "#cell_editing">INTERACTIVE CELL EDITING</a> section for details on the
        editing process.</p>
      </blockquote>
    </dd>

    <dd id="expandcommand">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-expandcommand</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;expandCommand</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;ExpandCommand</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies a Tcl command to be invoked when expanding a row of a
        tablelist used as a tree widget (with the aid of the <code><b><a href=
        "#expand">expand</a></b></code> or <code><b><a href=
        "#expandall">expandall</a></b></code> subcommand).&nbsp; 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.</p>

        <p>For technical reasons (the use of the <code><b>-elide</b></code>
        text widget tag option for collapsing a row), this option is not
        supported for Tk versions earlier than 8.3.</p>

        <p><b>REMARK:</b>&nbsp; It is common practice to use the command
        specified as the value of this option to insert the children of the row
        that is about to be expanded, if it has no children yet.&nbsp; For
        example, the <a href="tablelist.html#ex_dirViewer">Directory Viewer</a>
        demo script uses the command implemented as follows:</p>

        <blockquote>
          <pre>
proc expandCmd {tbl row} {
    if {[$tbl <a href="#childcount">childcount</a> $row] == 0} {
        <i># Get the name of the directory whose leaf name is
        # displayed in the first cell of the specified row</i>
        set dir [$tbl <a href="#rowattrib">rowattrib</a> $row pathName]

        <i># Display the contents of the directory $dir
        # as child items of the one identified by $row</i>
        putContents $dir $tbl $row
    }

    <i># The rest is just eye candy:</i>
    if {[$tbl <a href="#childcount">childcount</a> $row] != 0} {
        <i># Update the image displayed in the row's first cell</i>
        $tbl <a href="#cellconfigure">cellconfigure</a> $row,0 -image openFolderImg
    }
}
</pre>
        </blockquote>
      </blockquote>
    </dd>

    <dd id="forceeditendcommand">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-forceeditendcommand</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;forceEditEndCommand</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;ForceEditEndCommand</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies a boolean value that controls the invocation of the
        command given by the the <code><b><a href=
        "#editendcommand">-editendcommand</a></b></code> option.&nbsp; If this
        value is true then the command will be invoked on normal termination of
        the editing process even if the final text of the temporary embedded
        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).&nbsp; The default value of this
        option is <code>0</code>, 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.&nbsp; See
        the <a href="#cell_editing">INTERACTIVE CELL EDITING</a> section for
        details on the editing process.</p>

        <p>If the option's value is true and no value for the
        <code><b>-editendcommand</b></code> option was specified, then on
        normal termination of the editing process the cell's new contents 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 <code><b><a href=
        "#editstartcommand">-editstartcommand</a></b></code> option).</p>

        <p>Setting this option to true enables you to execute an arbitrary
        action whenever the interactive cell editing is finished.&nbsp; Just
        binding a script to the <code><b>&lt;Destroy&gt;</b></code> event for
        the temporary embedded widget used for the editing won't work, because
        that widget might be destroyed and recreated automatically under
        various circumstances.&nbsp; Alternately, you can use the
        <code><b>&lt;&lt;TablelistCellUpdated&gt;&gt;</b></code> and
        <code><b>&lt;&lt;TablelistCellRestored&gt;&gt;</b></code> virtual
        events, generated by the <code><b><a href=
        "#finishediting">finishediting</a></b></code> and <code><b><a href=
        "#cancelediting">cancelediting</a></b></code> subcommands,
        respectively.</p>
      </blockquote>
    </dd>

    <dd id="fullseparators">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-fullseparators</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;fullSeparators</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;FullSeparators</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies a boolean value that controls whether the separators (if
        any) shall extend all of the way to the bottom of the tablelist's
        body.&nbsp; The default is <code>0</code>, meaning that the height of
        the separators will be adjusted to the widget's content, i.e., they
        won't extend to the bottom of the tablelist's body if there is free
        vertical space left below the widget's last row.</p>
      </blockquote>
    </dd>

    <dd id="height">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-height</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;height</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;Height</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the desired height for the window, in units of characters
        in the font given by the <code><b>-font</b></code> option.&nbsp; This
        is at the same time the desired height in lines, provided that no
        column-, row-, or cell-specific fonts, multi-line elements, or embedded
        images or windows will make the height of any of the rows different
        from the one corresponding to the above-mentioned font.&nbsp; With this
        restriction, if the option's value is zero or less, then the window's
        height is made just large enough to hold all the items in the tablelist
        widget.</p>
      </blockquote>
    </dd>

    <dd id="incrarrowtype">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-incrarrowtype</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;incrArrowType</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;IncrArrowType</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the type of the arrow placed into a column label when
        sorting the items based on that column in increasing order, with the
        aid of the <code><b><a href="#sortbycolumn">sortbycolumn</a></b></code>
        or <code><b><a href="#sortbycolumnlist">sortbycolumnlist</a></b></code>
        subcommand of the Tcl command associated with the widget.&nbsp; The
        value of this option must be one of <code><b>up</b></code> or
        <code><b>down</b></code>.&nbsp; The default is
        <code><b>up</b></code>.&nbsp; This option is only relevant if the value
        of the <code><b><a href="#showarrow">-showarrow</a></b></code> option
        is true.</p>
      </blockquote>
    </dd>

    <dd id="instanttoggle">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-instanttoggle</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;instantToggle</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;InstantToggle</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies a boolean value that controls whether the interactive cell
        editing with the aid of a Tk or tile checkbutton widget, if started
        with the left mouse button, will be finished immediately after
        automatically toggling the checked state of the temporary embedded
        checkbutton.&nbsp; The default value is <code>0</code>, meaning that a
        mouse click into the cell will only start the editing session (and
        automatically toggle the checkbutton's checked state), but not also
        finish it.</p>
      </blockquote>
    </dd>

    <dd id="labelactivebackground">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-labelactivebackground</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;labelActiveBackground</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;Foreground</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the <code><b>-activebackground</b></code> option for the
        header labels, i.e., the background color to use when the mouse cursor
        is positioned over a header label and the value of
        <code><b>tk_strictMotif</b></code> is false.&nbsp; This option is only
        defined in the Tablelist package if the Tk version being used supports
        the <code><b>-activebackground</b></code> option for label
        widgets.&nbsp; This is checked by Tablelist at initialization time, and
        will normally be the case for Tk versions 8.3.2 or higher.&nbsp; On the
        other hand, the Tablelist_tile package doesn't support the
        <code><b>-labelactivebackground</b></code> option.</p>
      </blockquote>
    </dd>

    <dd id="labelactiveforeground">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-labelactiveforeground</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;labelActiveForeground</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;Background</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the <code><b>-activeforeground</b></code> option for the
        header labels, i.e., the foreground color to use when the mouse cursor
        is positioned over a header label and the value of
        <code><b>tk_strictMotif</b></code> is false.&nbsp; This option is only
        defined in the Tablelist package if the Tk version being used supports
        the <code><b>-activeforeground</b></code> option for label
        widgets.&nbsp; This is checked by Tablelist at initialization time, and
        will normally be the case for Tk versions 8.3.2 or higher.&nbsp; On the
        other hand, the Tablelist_tile package doesn't support the
        <code><b>-labelactiveforeground</b></code> option.</p>
      </blockquote>
    </dd>

    <dd id="labelbackground">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-labelbackground</b></code> or
          <code><b>-labelbg</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;labelBackground</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;Background</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the <code><b>-background</b></code> option for the header
        labels.&nbsp; This option is only supported by the Tablelist package,
        but not by Tablelist_tile.</p>
      </blockquote>
    </dd>

    <dd id="labelborderwidth">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-labelborderwidth</b></code> or
          <code><b>-labelbd</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;labelBorderWidth</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;BorderWidth</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the <code><b>-borderwidth</b></code> option for the header
        labels.&nbsp; This option is different from the standard
        <code><b>-borderwidth</b></code> option defined for the tablelist
        widget itself.&nbsp; In the package Tablelist_tile this option has a
        theme-specific default value.</p>

        <p><b>REMARK:</b>&nbsp; Please take into account that in some themes,
        setting this option to a value other than the default might be ignored
        by tile and thus could cause alignment problems.&nbsp; This is because
        the border of tile widgets is drawn with theme-specific methods, which
        will not always produce the results known from Tk widgets.</p>
      </blockquote>
    </dd>

    <dd id="labelcommand">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-labelcommand</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;labelCommand</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;LabelCommand</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>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.&nbsp; When the <code><b>&lt;ButtonRelease-1&gt;</b></code> 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.&nbsp; If the
        tablelist's <code><b><a href="#state">state</a></b></code> is
        <code><b>disabled</b></code> then this action will not take
        place.&nbsp; The most common value of this option is <code><b><a href=
        "tablelistColSort.html#sortByColumn">tablelist::sortByColumn</a></b></code>;
        this command sorts the items based on the column whose index was passed
        to it as second argument.</p>
      </blockquote>
    </dd>

    <dd id="labelcommand2">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-labelcommand2</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;labelCommand2</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;LabelCommand2</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the Tcl command to be invoked when mouse button 1 is
        pressed together with the <code>Shift</code> key over one of the header
        labels and later released over the same label.&nbsp; When the
        <code><b>&lt;ButtonRelease-1&gt;</b></code> 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.&nbsp; If the tablelist's
        <code><b><a href="#state">state</a></b></code> is
        <code><b>disabled</b></code> then this action will not take
        place.&nbsp; The most common value of this option is <code><b><a href=
        "tablelistColSort.html#addToSortColumns">tablelist::addToSortColumns</a></b></code>;
        this command adds the column index passed to it as second argument to
        the list of sort columns and sorts the items based on the columns
        indicated by the modified list.</p>
      </blockquote>
    </dd>

    <dd id="labeldisabledforeground">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-labeldisabledforeground</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;labelDisabledForeground</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;DisabledForeground</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the <code><b>-disabledforeground</b></code> option for the
        header labels, i.e., the foreground color to use for the labels when
        the tablelist's <code><b><a href="#state">state</a></b></code> is
        <code><b>disabled</b></code>.&nbsp; This option is only defined in the
        Tablelist package if the Tk version being used supports the
        <code><b>-disabledforeground</b></code> option for label widgets.&nbsp;
        This is checked by Tablelist at initialization time, and will normally
        be the case for Tk versions 8.3.1 or higher.&nbsp; On the other hand,
        the Tablelist_tile package doesn't support the
        <code><b>-labeldisabledforeground</b></code> option.</p>
      </blockquote>
    </dd>

    <dd id="labelfont">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-labelfont</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;labelFont</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;Font</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the <code><b>-font</b></code> option for the header
        labels.&nbsp; In the package Tablelist_tile this option has a
        theme-specific default value.</p>
      </blockquote>
    </dd>

    <dd id="labelforeground">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-labelforeground</b></code> or
          <code><b>-labelfg</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;labelForeground</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;Foreground</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the <code><b>-foreground</b></code> option for the header
        labels.&nbsp; In the package Tablelist_tile this option has a
        theme-specific default value.</p>
      </blockquote>
    </dd>

    <dd id="labelheight">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-labelheight</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;labelHeight</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;Height</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the <code><b>-height</b></code> option for the header
        labels.&nbsp; This option is only supported by the Tablelist package,
        but not by Tablelist_tile.</p>
      </blockquote>
    </dd>

    <dd id="labelpady">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-labelpady</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;labelPadY</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;Pad</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>In the Tablelist package this option specifies the
        <code><b>-pady</b></code> configuration option for the header
        labels.&nbsp; In the Tablelist_tile package the value of the
        <code><b>-labelpady</b></code> option is mapped to the corresponding
        components of the value of the <code><b>-padding</b></code>
        configuration option of the header labels, and the
        <code><b>-labelpady</b></code> option has a theme-specific default
        value.</p>
      </blockquote>
    </dd>

    <dd id="labelrelief">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-labelrelief</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;labelRelief</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;Relief</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the <code><b>-relief</b></code> option for the header
        labels.&nbsp; This option is different from the standard
        <code><b>-relief</b></code> option defined for the tablelist widget
        itself.&nbsp; The default value is <code><b>raised</b></code>.</p>
      </blockquote>
    </dd>

    <dd id="listvariable">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-listvariable</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;listVariable</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;Variable</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the name of a variable.&nbsp; 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.&nbsp; The value of the variable must be a valid list.&nbsp; 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.&nbsp; Attempts to assign a variable whose value does
        not fulfil these conditions to <code><b>-listvariable</b></code> will
        cause an error.&nbsp; Attempts to unset a variable in use as a
        <code><b>-listvariable</b></code> will fail but will not generate an
        error.</p>

        <p><b>REMARK 1:</b>&nbsp; For increased efficiency, updating the widget
        to reflect a changed value of the variable specified with this option
        is, whenever possible, done at idle time (i.e., when there are no
        events to process).&nbsp; On the other hand, most tablelist subcommands
        make it necessary to perform an <i>immediate</i> update of the widget's
        internal list according to the value of this variable, before executing
        the subcommand in question.&nbsp; Doing this repeatedly can become
        quite inefficient.&nbsp; To avoid performance problems, you should
        always try to separate the operations that build up the value of the
        variable specified by this option from other commands.&nbsp; For
        example, instead of</p>

        <blockquote>
          <pre>
tablelist::tablelist .tbl ... -listvariable var
set var {}
for {set row 0} {$row &lt; 1000} {incr row} {
    lappend var ...
    .tbl <a href="#cellconfigure">cellconfigure</a> $row,3 -image ...
}
</pre>
        </blockquote>

        <p>you should write</p>

        <blockquote>
          <pre>
tablelist::tablelist .tbl ... -listvariable var
set var {}
for {set row 0} {$row &lt; 1000} {incr row} {
    lappend var ...
}
for {set row 0} {$row &lt; 1000} {incr row} {
    .tbl <a href="#cellconfigure">cellconfigure</a> $row,3 -image ...
}
</pre>
        </blockquote>

        <p>The first method above is quite inefficient, because it requires
        1000 updates of the widget's internal list.&nbsp; The second method
        performs incomparably faster, because it needs only one synchronization
        (at the beginning of the second loop).</p>

        <p><b>REMARK 2:</b>&nbsp; It is not recommended to set this option for
        a tablelist used as a tree widget, because adding new items to the list
        specified as its value will result in inserting those list elements
        into the widget without respecting the tree's internal structure.&nbsp;
        There is no problem if you access the variable for reading only, but
        for that purpose it is more efficient to use the <code><b><a href=
        "#itemlistvar">itemlistvar</a></b></code> subcommand rather than the
        <code><b>-listvariable</b></code> option.</p>
      </blockquote>
    </dd>

    <dd id="movablecolumns">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-movablecolumns</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;movableColumns</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;MovableColumns</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies a boolean value that determines whether the columns can be
        moved interactively.&nbsp; See the <a href="#label_bindings">DEFAULT
        AND INDIVIDUAL BINDINGS FOR THE HEADER LABELS</a> section below for
        information on moving a column interactively.&nbsp; The default value
        is <code>0</code>.</p>
      </blockquote>
    </dd>

    <dd id="movablerows">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-movablerows</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;movableRows</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;MovableRows</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies a boolean value that determines whether the rows can be
        moved interactively.&nbsp; See the <a href="#body_bindings">DEFAULT AND
        INDIVIDUAL BINDINGS FOR THE TABLELIST BODY</a> section below for
        information on moving a row interactively.&nbsp; The default value is
        <code>0</code>.</p>
      </blockquote>
    </dd>

    <dd id="movecolumncursor">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-movecolumncursor</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;moveColumnCursor</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;MoveColumnCursor</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the mouse cursor to be used when moving a column
        interactively.&nbsp; The default value is <code><b>icon</b></code> on
        the windowing systems <code><b>x11</b></code> and
        <code><b>win32</b></code>, and the native cursor
        <code><b>closedhand</b></code> on the Macintosh windowing systems
        <code><b>classic</b></code> and <code><b>aqua</b></code>.</p>
      </blockquote>
    </dd>

    <dd id="movecursor">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-movecursor</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;moveCursor</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;MoveCursor</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the mouse cursor to be used when moving a row
        interactively.&nbsp; The default value is <code><b>hand2</b></code> on
        the windowing systems <code><b>x11</b></code> and
        <code><b>win32</b></code>, and the native cursor
        <code><b>pointinghand</b></code> on the Macintosh windowing systems
        <code><b>classic</b></code> and <code><b>aqua</b></code>.</p>
      </blockquote>
    </dd>

    <dd id="populatecommand">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-populatecommand</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;populateCommand</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;PopulateCommand</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies a Tcl command to be invoked by the <code><b><a href=
        "#searchcolumn">searchcolumn</a></b></code> subcommand before examining
        the children (or descendants, when used with the
        <code><b>-descend</b></code> option) of a tablelist row whose children
        have not been inserted yet.&nbsp; 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.&nbsp; 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.</p>

        <p>For technical reasons (the use of the <code><b>-elide</b></code>
        text widget tag option for collapsing a row), this option is not
        supported for Tk versions earlier than 8.3.</p>

        <p><b>REMARK:</b>&nbsp; There are many similarities between this option
        and <code><b><a href=
        "#expandcommand">-expandcommand</a></b></code>.&nbsp; Both options are
        used in the first place to insert children on demand.&nbsp; The main
        differences between them are as follows:</p>

        <ol>
          <li>The command specified by the <code><b>-populatecommand</b></code>
          option is only invoked for rows whose children have not been inserted
          yet, while the one specified by <code><b>-expandcommand</b></code> is
          always invoked before expanding a row, regardless of whether the
          children of that row are already present in the widget or not.</li>

          <li class="tm">The command specified by the
          <code><b>-expandcommand</b></code> option may perform visual changes
          on the node in question, while the role of the one specified by
          <code><b>-populatecommand</b></code> is restricted to inserting the
          children, without altering the node's appearance in any way.</li>
        </ol>

        <p>A logical consequence of the above is that the value of
        <code><b>-populatecommand</b></code> is usually just a stripped-down
        version of the command specified by the
        <code><b>-expandcommand</b></code> option.&nbsp; For example, the
        <a href="tablelist.html#ex_dirViewer">Directory Viewer</a> demo script
        might use a command implemented as follows:</p>

        <blockquote>
          <pre>
proc populateCmd {tbl row} {
    <i># Get the name of the directory whose leaf name is
    # displayed in the first cell of the specified row</i>
    set dir [$tbl <a href="#rowattrib">rowattrib</a> $row pathName]

    <i># Display the contents of the directory $dir
    # as child items of the one identified by $row</i>
    putContents $dir $tbl $row
}
</pre>
        </blockquote>

        <p>Moreover, the <code><b>-expandcommand</b></code> option can be set
        to a command that invokes the one specified by the
        <code><b>-populatecommand</b></code> option:</p>

        <blockquote>
          <pre>
proc expandCmd {tbl row} {
    if {[$tbl <a href="#childcount">childcount</a> $row] == 0} {
        populateCmd $tbl $row
    }

    <i># The rest is just eye candy:</i>
    if {[$tbl <a href="#childcount">childcount</a> $row] != 0} {
        <i># Update the image displayed in the row's first cell</i>
        $tbl <a href="#cellconfigure">cellconfigure</a> $row,0 -image openFolderImg
    }
}
</pre>
        </blockquote>
      </blockquote>
    </dd>

    <dd id="protecttitlecolumns">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-protecttitlecolumns</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;protectTitleColumns</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;ProtectTitleColumns</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies a boolean value that determines whether the boundary of
        the title column area shall be protected from being crossed when moving
        a column interactively.&nbsp; See the <a href="#label_bindings">DEFAULT
        AND INDIVIDUAL BINDINGS FOR THE HEADER LABELS</a> section below for
        information on moving a column interactively.&nbsp; The default value
        is <code>0</code>, specifying that non-title columns can be moved into
        the title column area and vice-versa.</p>
      </blockquote>
    </dd>

    <dd id="resizablecolumns">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-resizablecolumns</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;resizableColumns</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;ResizableColumns</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies a boolean value that determines whether the columns can be
        resized interactively.&nbsp; See the <a href="#label_bindings">DEFAULT
        AND INDIVIDUAL BINDINGS FOR THE HEADER LABELS</a> section below for
        information on interactive column resizing.&nbsp; The default value is
        <code>1</code>.</p>
      </blockquote>
    </dd>

    <dd id="resizecursor">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-resizecursor</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;resizeCursor</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;ResizeCursor</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the mouse cursor to be used during interactive column
        resizing.&nbsp; The default value is
        <code><b>sb_h_double_arrow</b></code> on the windowing systems
        <code><b>x11</b></code> and <code><b>win32</b></code>, and the native
        cursor <code><b>resizeleftright</b></code> on the Macintosh windowing
        systems <code><b>classic</b></code> and <code><b>aqua</b></code>.</p>
      </blockquote>
    </dd>

    <dd id="selectmode">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-selectmode</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;selectMode</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;SelectMode</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies one of several styles for manipulating the
        selection.&nbsp; The value of the option may be arbitrary, but the
        default bindings expect it to be either <code><b>single</b></code>,
        <code><b>browse</b></code>, <code><b>multiple</b></code>, or
        <code><b>extended</b></code>.&nbsp; The default value is
        <code><b>browse</b></code>.</p>
      </blockquote>
    </dd>

    <dd id="selecttype">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-selecttype</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;selectType</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;SelectType</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies one of two selection types for the tablelist widget:
        <code><b>row</b></code> or <code><b>cell</b></code>.&nbsp; If the
        selection type is <code><b>row</b></code> then the default bindings
        will select and deselect entire items, and the whole row having the
        location cursor will be displayed as active when the tablelist has the
        keyboard focus.&nbsp; If the selection type is <code><b>cell</b></code>
        then the default bindings will select and deselect individual elements,
        and the single cell having the location cursor will be displayed as
        active when the tablelist has the keyboard focus.&nbsp; The default
        value is <code><b>row</b></code>.</p>
      </blockquote>
    </dd>

    <dd id="setfocus">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-setfocus</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;setFocus</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;SetFocus</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies a boolean value that determines whether a click with the
        left mouse button anywhere into the tablelist's body, including the
        separators and the embedded images (more precisely, any descendants of
        the tablelist widget having the binding tag <code><b><a href=
        "#body_bindings">TablelistBody</a></b></code>) should set the focus to
        the body of the tablelist widget if the latter's <code><b><a href=
        "#state">state</a></b></code> is <code><b>normal</b></code>.&nbsp; The
        default value is <code>1</code>.</p>
      </blockquote>
    </dd>

    <dd id="showarrow">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-showarrow</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;showArrow</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;ShowArrow</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies a boolean value that determines whether the
        <code><b><a href="#sortbycolumn">sortbycolumn</a></b></code> and
        <code><b><a href="#sortbycolumnlist">sortbycolumnlist</a></b></code>
        subcommands of the Tcl command associated with the widget should place
        an arrow indicating the sort order into the header label(s) of the
        column(s) specified by their first argument.&nbsp; The default value is
        <code>1</code>.</p>
      </blockquote>
    </dd>

    <dd id="showeditcursor">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-showeditcursor</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;showEditCursor</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;ShowEditCursor</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies a boolean value indicating whether the mouse cursor should
        change automatically to one having the shape of a pencil whenever a
        click with mouse button 1 would start an editing session.&nbsp; The
        default value is <code>1</code>.</p>

        <p><b>REMARK:</b>&nbsp; On X11 and Mac OS X Aqua, the cursor set by
        Tablelist when a mouse klick would start the interactive cell editing,
        is Tk's built-in cursor <code><b>pencil</b></code>.&nbsp; 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 <code>pencil.cur</code>, located in the <code>scripts</code>
        subdirectory of the Tablelist installation directory.&nbsp; 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 <code>Temp</code>
        directory.</p>

        <p>The file <code>pencil.cur</code> is a copy of the file&nbsp;
        <code>Ubuntu Handwriting.cur</code>,&nbsp; downloaded from the
        address</p>

        <blockquote>
          <address>
            <a href=
            "http://www.rw-designer.com/cursor-detail/46745">http://www.rw-designer.com/cursor-detail/46745</a>
          </address>
        </blockquote>
      </blockquote>
    </dd>

    <dd id="showhorizseparator">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-showhorizseparator</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;showHorizSeparator</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;ShowHorizSeparator</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies a boolean value that controls whether to place a
        horizontal separator just below the last row if the value of the
        <code><b><a href="#showseparators">-showseparators</a></b></code>
        option is true, that of the <code><b><a href=
        "#fullseparators">-fullseparators</a></b></code> option is false, and
        there is free space left between the last row and the bottom of the
        tablelist window.&nbsp; The default value is <code>1</code>.</p>
      </blockquote>
    </dd>

    <dd id="showlabels">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-showlabels</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;showLabels</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;ShowLabels</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies a boolean value that determines whether the header labels
        are to be shown or not.&nbsp; The default value is <code>1</code>.</p>
      </blockquote>
    </dd>

    <dd id="showseparators">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-showseparators</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;showSeparators</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;ShowSeparators</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies a boolean value that determines whether the columns are to
        be separated with borders.&nbsp; The default value is
        <code>0</code>.&nbsp; The separators are implemented as thin frames
        with sunken relief in the package Tablelist, and as tile separator
        widgets in the package Tablelist_tile.&nbsp; They are attached to the
        right edges of the header labels, and are only created if the value of
        this option is true.&nbsp; In this case, a horizontal separator will
        also be created and placed just below the last row, provided that the
        value of the <code><b><a href=
        "#showhorizseparator">-showhorizseparator</a></b></code> option is
        true, that of the <code><b><a href=
        "#fullseparators">-fullseparators</a></b></code> option is false, and
        there is free space left between the last row and the bottom of the
        tablelist window.</p>

        <p><b>REMARK:</b>&nbsp; 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 <code><b><a href=
        "#stripebackground">-stripebackground</a></b></code> option discussed
        below.</p>
      </blockquote>
    </dd>

    <dd id="snipstring">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-snipstring</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;snipString</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;SnipString</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the string to be used as snip indicator when displaying
        the elements that don't fit into their cells.&nbsp; The default is an
        ellipsis (<code>"..."</code>).</p>
      </blockquote>
    </dd>

    <dd id="sortcommand">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-sortcommand</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;sortCommand</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;SortCommand</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies a command to be used for the comparison of the items when
        invoking the <code><b><a href="#sort">sort</a></b></code> subcommand of
        the Tcl command associated with the tablelist widget.&nbsp; To compare
        two items (viewed as lists of cell contents within one row each) during
        the <code><b>sort</b></code> operation, the command is automatically
        concatenated with the two items and the resulting script is
        evaluated.&nbsp; The script should return an integer less than, equal
        to, or greater than zero if the first item is to be considered less
        than, equal to, or greater than the second, respectively.</p>
      </blockquote>
    </dd>

    <dd id="spacing">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-spacing</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;spacing</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;Spacing</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies additional space to provide above and below each row of
        the widget.&nbsp; The option's value may have any of the standard forms
        for screen distances.&nbsp; It defaults to <code>0</code>.&nbsp; See
        also the <code><b><a href="#tight">-tight</a></b></code> option.</p>
      </blockquote>
    </dd>

    <dd id="state">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-state</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;state</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;State</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies one of two states for the tablelist widget:
        <code><b>normal</b></code> or <code><b>disabled</b></code>.&nbsp; If
        the widget is disabled then neither items nor columns may be inserted,
        deleted, updated, or moved, the items, header labels, and the up- or
        down-arrow are drawn in the <code><b><a href=
        "#body_options">-disabledforeground</a></b></code>, <code><b><a href=
        "#labeldisabledforeground">-labeldisabledforeground</a></b></code>, and
        <code><b><a href=
        "#arrowdisabledcolor">-arrowdisabledcolor</a></b></code> color,
        respectively, the selection cannot be modified and is not shown
        (although the selection information is retained), the header labels are
        completely insensitive, and no interactive cell editing can be
        performed.&nbsp; In addition, in disabled state any color options
        specified at column, row, or cell level will be ignored.</p>
      </blockquote>
    </dd>

    <dd id="stretch">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-stretch</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;stretch</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;Stretch</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the columns to be stretched in order to fill the tablelist
        window if necessary.&nbsp; The option's value may be
        <code><b>all</b></code> or a list of column indices in any of the forms
        described in the <a href="#col_indices">COLUMN INDICES</a> section
        below.&nbsp; In the second case, the specified column indices are
        replaced with their numerical equivalents, except for
        <code><b>end</b></code> and <code><b>last</b></code>, 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.&nbsp; The list will be updated automatically whenever
        columns are inserted, deleted, or moved.&nbsp; The number of pixels by
        which a column is stretched is proportional to its width in
        pixels.&nbsp; 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.&nbsp; (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.)&nbsp; This option is ignored if the value of
        the <code><b><a href="#width">-width</a></b></code> configuration
        option is zero or less.</p>
      </blockquote>
    </dd>

    <dd id="stripebackground">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-stripebackground</b></code> or
          <code><b>-stripebg</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;stripeBackground</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;Background</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the background color to use when displaying the items
        belonging to a stripe.&nbsp; Each stripe is composed of the same number
        <code>stripeHeight</code> of consecutive <a href=
        "#isviewable">viewable</a> items, according to the value of the
        <code><b><a href="#stripeheight">-stripeheight</a></b></code>
        configuration option.&nbsp; The first <code>stripeHeight</code>
        viewable items are "normal" ones; they are followed by a stripe
        composed of the next <code>stripeHeight</code> viewable items, which in
        turn is followed by the same number of "normal" viewable items, and so
        on.&nbsp; 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
        <code><b><a href="#body_options">-background</a></b></code>
        configuration option.&nbsp; When using Tablelist_tile with the
        <code><b>tileqt</b></code> theme then the default value is given by the
        global KDE option <code><b>alternateBackground</b></code>, which in
        turn depends on the current color scheme.&nbsp; In this case it is
        recommended to either keep that default value retrieved from KDE, or to
        use an explicitly specified empty string if no stripes are to be
        displayed.&nbsp; The <code><b>-stripebackground</b></code> option has a
        higher priority than the <code><b>-background</b></code> column
        configuration option, but a lower priority than the
        <code><b>-background</b></code> option specified at row or cell
        level.</p>
      </blockquote>
    </dd>

    <dd id="stripeforeground">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-stripeforeground</b></code> or
          <code><b>-stripefg</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;stripeForeground</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;Foreground</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the foreground color to use when displaying the items
        belonging to a stripe.&nbsp; Each stripe is composed of the same number
        <code>stripeHeight</code> of consecutive <a href=
        "#isviewable">viewable</a> items, according to the value of the
        <code><b><a href="#stripeheight">-stripeheight</a></b></code>
        configuration option.&nbsp; The first <code>stripeHeight</code>
        viewable items are "normal" ones; they are followed by a stripe
        composed of the next <code>stripeHeight</code> viewable items, which in
        turn is followed by the same number of "normal" viewable items, and so
        on.&nbsp; The default value is an empty string, indicating that the
        stripes will inherit the foreground color specified by the
        <code><b><a href="#body_options">-foreground</a></b></code>
        configuration option.&nbsp; The <code><b>-stripeforeground</b></code>
        option has a higher priority than the <code><b>-foreground</b></code>
        column configuration option, but a lower priority than the
        <code><b>-foreground</b></code> option specified at row or cell
        level.</p>
      </blockquote>
    </dd>

    <dd id="stripeheight">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-stripeheight</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;stripeHeight</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;StripeHeight</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the number of items in each stripe.&nbsp; If zero or less
        then no stripes are displayed.&nbsp; The default is <code>1</code>.</p>
      </blockquote>
    </dd>

    <dd id="takefocus">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-takefocus</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;takeFocus</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;TakeFocus</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>This option determines whether the widget accepts the focus during
        keyboard traversal.&nbsp; It is almost identical to the standard option
        of the same name (see the <b>options</b> manual entry for
        details).&nbsp; 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 (<code>Tab</code> and
        <code>Shift-Tab</code>).</p>
      </blockquote>
    </dd>

    <dd id="targetcolor">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-targetcolor</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;targetColor</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;TargetColor</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>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.&nbsp; The target indicator belonging to the tablelist's
        body can also be displayed explicitly with the aid of the
        <code><b><a href="#showtargetmark">showtargetmark</a></b></code>
        subcommand, and its path name can be retrieved via <code><b><a href=
        "#targetmarkpath">targetmarkpath</a></b></code>.&nbsp; The default
        value is <code><b>black</b></code>.</p>
      </blockquote>
    </dd>

    <dd id="tight">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-tight</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;tight</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;Tight</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies a boolean value that determines whether to eliminate the
        one-pixel additional space left below each tablelist row for Tk listbox
        compatibility.&nbsp; The default value is <code>0</code>, which draws a
        one-pixel additional space below each row, just like a Tk core
        listbox.</p>

        <p><b>REMARK:</b>&nbsp; You can set this option to true and at the same
        time provide additional space above and below each row with the aid of
        the <code><b><a href="#spacing">-spacing</a></b></code> configuratiom
        option.&nbsp; As a result, the space below each row will be the same as
        above the row (and not one pixel higher).</p>
      </blockquote>
    </dd>

    <dd id="titlecolumns">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-titlecolumns</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;titleColumns</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;TitleColumns</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the number of the non-scrollable columns at the left edge
        of the window, also called <b>title columns</b>.&nbsp; The positions of
        these columns will not change when adjusting the horizontal view by
        invoking the <code><b><a href="#scan">scan</a></b></code>,
        <code><b><a href="#seecell">seecell</a></b></code>, <code><b><a href=
        "#seecolumn">seecolumn</a></b></code>, or <code><b><a href=
        "#xview">xview</a></b></code> subcommand.&nbsp; The default value is
        <code>0</code>.&nbsp; The value of this option also determines the
        scrolling unit used by the commands mentioned above when shifting the
        horizontal view: if it is positive then the horizontal scrolling is
        performed column-wise, otherwise by character units (the width of the
        <code><b>0</b></code> character).</p>

        <p>The end of the title column area is visualized with the aid of a
        separator, attached to the right edge of the header label corresponding
        to the last non-hidden title column.&nbsp; This special separator is
        always displayed to mark the end of the title columns (if any),
        independently of the value of the <code><b><a href=
        "#showseparators">-showseparators</a></b></code> option.&nbsp; The user
        can easily distinguish it from the other separators by means of its
        background color, which is different from that of the other
        separators.</p>

        <p>For technical reasons (the use of the <code><b>-elide</b></code>
        option for a text widget tag), this option is not supported for Tk
        versions earlier than 8.3.</p>
      </blockquote>
    </dd>

    <dd id="tooltipaddcommand">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-tooltipaddcommand</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;tooltipAddCommand</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;TooltipAddCommand</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies a Tcl command to be used for displaying cell- and column
        label-specific balloon help.&nbsp; 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.&nbsp; Similarly,
        when the mouse pointer enters a header label, the command is
        automatically concatenated with the name of the tablelist widget, the
        number <code>-1</code>, and the column index of the respective label,
        and the resulting script is evaluated in the global scope.&nbsp; In
        both cases, the action described above is only triggered if both the
        value of this option and that of <code><b><a href=
        "#tooltipdelcommand">-tooltipdelcommand</a></b></code> are nonempty
        strings.</p>

        <p>For example, consider the procedure <code>tooltipAddCmd</code> shown
        below, which makes use of the <code><b>DynamicHelp::add</b></code>
        command from the BWidget package to display the full cell and label
        texts as tooltips for the cells and header labels with snipped
        contents.</p>

        <blockquote>
          <pre>
proc tooltipAddCmd {tbl row col} {
    if {($row &gt;= 0 &amp;&amp; [$tbl <a href=
"#iselemsnipped">iselemsnipped</a> $row,$col fullText]) ||
        ($row &lt;  0 &amp;&amp; [$tbl <a href=
"#istitlesnipped">istitlesnipped</a> $col fullText])} {
        DynamicHelp::add $tbl -text $fullText
    }
}
</pre>
        </blockquote>

        <p>A tablelist widget can use this procedure by specifying</p>

        <blockquote>
          <pre>
... -tooltipaddcommand tooltipAddCmd -tooltipdelcommand DynamicHelp::delete
</pre>
        </blockquote>

        <p>If you prefer to use the <code><b>tooltip::tooltip</b></code>
        command from the tooltip package contained in tklib then the procedure
        becomes</p>

        <blockquote>
          <pre>
proc tooltipAddCmd {tbl row col} {
    if {($row &gt;= 0 &amp;&amp; [$tbl <a href=
"#iselemsnipped">iselemsnipped</a> $row,$col fullText]) ||
        ($row &lt;  0 &amp;&amp; [$tbl <a href=
"#istitlesnipped">istitlesnipped</a> $col fullText])} {
        tooltip::tooltip $tbl $fullText
    }
}
</pre>
        </blockquote>

        <p>and can be used by specifying</p>

        <blockquote>
          <pre>
... -tooltipaddcommand tooltipAddCmd -tooltipdelcommand "tooltip::tooltip clear"
</pre>
        </blockquote>

        <p>Please note that in the less common case that the name of your
        tablelist widget contains spaces, the&nbsp; <code><b>tooltip::tooltip
        clear</b></code>&nbsp; command won't work as expected.&nbsp; As a
        workaround you can use the slightly modified approach shown below:</p>

        <blockquote>
          <pre>
proc tooltipDelCmd tbl { tooltip::tooltip $tbl "" }

... -tooltipaddcommand tooltipAddCmd -tooltipdelcommand tooltipDelCmd
</pre>
        </blockquote>

        <p>Both examples above make use of the <code><b><a href=
        "#iselemsnipped">iselemsnipped</a></b></code> and <code><b><a href=
        "#istitlesnipped">istitlesnipped</a></b></code> 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.</p>
      </blockquote>
    </dd>

    <dd id="tooltipdelcommand">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-tooltipdelcommand</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;tooltipDelCommand</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;TooltipDelCommand</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies a Tcl command to be used for removing the cell- or column
        label-specific balloon help.&nbsp; 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.&nbsp; This
        action is only triggered if both the value of this option and that of
        <code><b><a href="#tooltipaddcommand">-tooltipaddcommand</a></b></code>
        are nonempty strings.&nbsp; Common values for this option are
        <code>"DynamicHelp::delete"</code> (which requires the BWidget package)
        and&nbsp; <code>"tooltip::tooltip clear"</code>&nbsp; (which requires
        the tooltip package contained in tklib).&nbsp; Their usage is shown in
        the examples above.</p>
      </blockquote>
    </dd>

    <dd id="treecolumn">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-treecolumn</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;treeColumn</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;TreeColumn</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the column to contain the indentations and expand/collapse
        controls for a tablelist used as a tree widget.&nbsp; The option's
        value may be a column index in any of the forms described in the
        <a href="#col_indices">COLUMN INDICES</a> section below.&nbsp; The
        specified column index is replaced with its numerical equivalent, and
        it will be updated automatically whenever columns are inserted,
        deleted, or moved.&nbsp; The default value is <code>0</code>.</p>

        <p>For technical reasons (the use of the <code><b>-elide</b></code>
        text widget tag option for collapsing a row), this option is not
        supported for Tk versions earlier than 8.3.</p>

        <p><b>REMARK:</b>&nbsp; Please note that the tree structure will only
        be displayed as expected if the column specified by this option is
        left-aligned.&nbsp; It is your responsibility to make sure that this
        restriction is fulfilled when using a tablelist as a tree widget.</p>
      </blockquote>
    </dd>

    <dd id="treestyle">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-treestyle</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;treeStyle</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;TreeStyle</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the look &amp; feel of the column containing the
        indentations and expand/collapse controls for a tablelist used as a
        tree widget.&nbsp; 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.&nbsp; The currently supported values are
        shown at a glance below:</p>

        <table border="2" cellspacing="0" cellpadding="3" rules="groups">
          <colgroup></colgroup>

          <colgroup></colgroup>

          <colgroup></colgroup>

          <colgroup></colgroup>

          <tbody align="center">
            <tr>
              <td><img src="aqua.png" alt="aqua" width="120" height="54"></td>

              <td><img src="gtk.png" alt="gtk" width="120" height="51"></td>

              <td><img src="adwaita.png" alt="adwaita" width="120" height=
              "51"></td>

              <td><img src="ubuntu.png" alt="ubuntu" width="120" height=
              "51"></td>
            </tr>

            <tr>
              <th><code>aqua</code></th>

              <th><code>gtk</code></th>

              <th><code>adwaita</code></th>

              <th><code>ubuntu</code></th>
            </tr>
          </tbody>

          <tbody align="center">
            <tr>
              <td><img src="mint.png" alt="mint" width="120" height="51"></td>

              <td><img src="mate.png" alt="mate" width="120" height="51"></td>

              <td><img src="newWave.png" alt="newWave" width="120" height=
              "51"></td>

              <td></td>
            </tr>

            <tr>
              <th><code>mint</code></th>

              <th><code>mate</code></th>

              <th><code>newWave</code></th>

              <th></th>
            </tr>
          </tbody>

          <tbody align="center">
            <tr>
              <td><img src="plastique.png" alt="plastique" width="120" height=
              "51"></td>

              <td><img src="oxygen1.png" alt="oxygen1" width="120" height=
              "51"></td>

              <td><img src="oxygen2.png" alt="oxygen2" width="120" height=
              "51"></td>

              <td><img src="klearlooks.png" alt="klearlooks" width="120"
              height="51"></td>
            </tr>

            <tr>
              <th><code>plastique</code></th>

              <th><code>oxygen1</code></th>

              <th><code>oxygen2</code></th>

              <th><code>klearlooks</code></th>
            </tr>
          </tbody>

          <tbody align="center">
            <tr>
              <td><img src="plastik.png" alt="plastik" width="120" height=
              "51"></td>

              <td><img src="baghira.png" alt="baghira" width="120" height=
              "51"></td>

              <td><img src="phase.png" alt="phase" width="120" height=
              "51"></td>

              <td></td>
            </tr>

            <tr>
              <th><code>plastik</code></th>

              <th><code>baghira</code></th>

              <th><code>phase</code></th>

              <th></th>
            </tr>
          </tbody>

          <tbody align="center">
            <tr>
              <td><img src="winnative.png" alt="winnative" width="120" height=
              "51"></td>

              <td><img src="winxpBlue.png" alt="winxpBlue" width="120" height=
              "51"></td>

              <td><img src="winxpOlive.png" alt="winxpOlive" width="120"
              height="51"></td>

              <td><img src="winxpSilver.png" alt="winxpSilver" width="120"
              height="51"></td>
            </tr>

            <tr>
              <th><code>winnative</code></th>

              <th><code>winxpBlue</code></th>

              <th><code>winxpOlive</code></th>

              <th><code>winxpSilver</code></th>
            </tr>
          </tbody>

          <tbody align="center">
            <tr>
              <td><img src="vistaAero.png" alt="vistaAero" width="120" height=
              "54"></td>

              <td><img src="vistaClassic.png" alt="vistaClassic" width="120"
              height="51"></td>

              <td><img src="win7Aero.png" alt="win7Aero" width="120" height=
              "54"></td>

              <td><img src="win7Classic.png" alt="win7Classic" width="120"
              height="51"></td>
            </tr>

            <tr>
              <th><code>vistaAero</code></th>

              <th><code>vistaClassic</code></th>

              <th><code>win7Aero</code></th>

              <th><code>win7Classic</code></th>
            </tr>
          </tbody>

          <tbody align="center">
            <tr>
              <td><img src="ambiance.png" alt="ambiance" width="120" height=
              "63"></td>

              <td><img src="dust.png" alt="dust" width="120" height="63"></td>

              <td><img src="dustSand.png" alt="dustSand" width="120" height=
              "63"></td>

              <td><img src="radiance.png" alt="radiance" width="120" height=
              "63"></td>
            </tr>

            <tr>
              <th><code>ambiance</code></th>

              <th><code>dust</code></th>

              <th><code>dustSand</code></th>

              <th><code>radiance</code></th>
            </tr>
          </tbody>
        </table>

        <p>If the tree style is <code><b>aqua</b></code>,
        <code><b>gtk</b></code>, <code><b>adwaita</b></code>,
        <code><b>ubuntu</b></code>, <code><b>mint</b></code>,
        <code><b>mate</b></code>, <code><b>newWave</b></code>,
        <code><b>oxygen2</b></code>, <code><b>vistaAero</b></code>, or
        <code><b>win7Aero</b></code>, and the Tk version is either 8.6 (with
        built-in PNG support) or 8.5 and the <code><b>img::png</b></code>
        package can be loaded into the interpreter, then the images used for
        displaying the expand/collapse controls are PNG images with alpha
        channel.&nbsp; Otherwise (i.e., for the other tree styles or in the
        absence of PNG support) GIF images are used for the expand/collapse
        controls.</p>

        <p>The following table contains a detailed description of the tree
        styles, in alphabetical order:</p>

        <table border="2" cellspacing="0" cellpadding="3">
          <tr bgcolor="#FFFFE0">
            <th align="left">Value</th>

            <th align="center">Screenshot</th>

            <th align="left">Comments</th>
          </tr>

          <tr>
            <td><code><b>adwaita</b></code></td>

            <td><img src="adwaita.png" alt="adwaita" width="120" height=
            "51"></td>

            <td>Inspired by the GTK+ 3 theme Adwaita.</td>
          </tr>

          <tr>
            <td><code><b>ambiance</b></code></td>

            <td><img src="ambiance.png" alt="ambiance" width="120" height=
            "63"></td>

            <td>Inspired by the GTK+ theme Ambiance.&nbsp; Recommended to be
            used with large fonts and images.</td>
          </tr>

          <tr>
            <td><code><b>aqua</b></code></td>

            <td><img src="aqua.png" alt="aqua" width="120" height="54"></td>

            <td>
              <table border="0" cellpadding="0" cellspacing="0">
                <tr valign="top">
                  <td>Tablelist:&nbsp;</td>

                  <td>Default for the windowing systems
                  <code><b>aqua</b></code> and
                  <code><b>classic</b></code>.</td>
                </tr>

                <tr valign="top">
                  <td>Tablelist_tile:&nbsp;</td>

                  <td>Default for the themes <code><b>aqua</b></code> and
                  <code><b>Aquativo</b></code>.</td>
                </tr>
              </table>
            </td>
          </tr>

          <tr>
            <td><code><b>baghira</b></code></td>

            <td><img src="baghira.png" alt="baghira" width="120" height=
            "51"></td>

            <td>
              <table border="0" cellpadding="0" cellspacing="0">
                <tr valign="top">
                  <td>Tablelist_tile:&nbsp;</td>

                  <td>Default for the Qt styles <code><b>baghira</b></code>,
                  <code><b>cde</b></code>, and <code><b>motif</b></code> within
                  the <code><b>tileqt</b></code> theme.&nbsp; Also used by some
                  flavors of <code><b>qtcurve</b></code>.</td>
                </tr>
              </table>
            </td>
          </tr>

          <tr>
            <td><code><b>dust</b></code></td>

            <td><img src="dust.png" alt="dust" width="120" height="63"></td>

            <td>Inspired by the GTK+ theme Dust.&nbsp; Recommended to be used
            with large fonts and images.</td>
          </tr>

          <tr>
            <td><code><b>dustSand</b></code></td>

            <td><img src="dustSand.png" alt="dustSand" width="120" height=
            "63"></td>

            <td>Inspired by the GTK+ theme Dust Sand.&nbsp; Recommended to be
            used with large fonts and images.</td>
          </tr>

          <tr>
            <td><code><b>gtk</b></code></td>

            <td><img src="gtk.png" alt="gtk" width="120" height="51"></td>

            <td>
              <table border="0" cellpadding="0" cellspacing="0">
                <tr valign="top">
                  <td>Tablelist:&nbsp;</td>

                  <td>Default for the windowing system
                  <code><b>x11</b></code>.</td>
                </tr>

                <tr valign="top">
                  <td>Tablelist_tile:&nbsp;</td>

                  <td>Default for the themes <code><b>blue</b></code>,
                  <code><b>clam</b></code>, <code><b>classic</b></code>,
                  <code><b>default</b></code>, <code><b>kroc</b></code>,
                  <code><b>sriv</b></code>, <code><b>srivlg</b></code>, and
                  <code><b>step</b></code>, as well as for the Qt style
                  <code><b>gtk+</b></code> within the
                  <code><b>tileqt</b></code> theme.</td>
                </tr>
              </table>
            </td>
          </tr>

          <tr>
            <td><code><b>klearlooks</b></code></td>

            <td><img src="klearlooks.png" alt="klearlooks" width="120" height=
            "51"></td>

            <td>
              Inspired by the KDE 4 style Klearlooks.<br>

              <table border="0" cellpadding="0" cellspacing="0">
                <tr valign="top">
                  <td>Tablelist_tile:&nbsp;</td>

                  <td>Default for the Qt style <code><b>qtcurve</b></code>
                  within the <code><b>tileqt</b></code> theme.</td>
                </tr>
              </table>
            </td>
          </tr>

          <tr>
            <td><code><b>mate</b></code></td>

            <td><img src="mate.png" alt="mate" width="120" height="51"></td>

            <td>Inspired by a few GTK+ themes of the MATE desktop.</td>
          </tr>

          <tr>
            <td><code><b>mint</b></code></td>

            <td><img src="mint.png" alt="mint" width="120" height="51"></td>

            <td>Inspired by a few GTK+ 3 themes bundled with the Linux Mint
            distribution.</td>
          </tr>

          <tr>
            <td><code><b>newWave</b></code></td>

            <td><img src="newWave.png" alt="newWave" width="120" height=
            "51"></td>

            <td>Inspired by the GTK+ theme New Wave.</td>
          </tr>

          <tr>
            <td><code><b>oxygen1</b></code></td>

            <td><img src="oxygen1.png" alt="oxygen1" width="120" height=
            "51"></td>

            <td>Inspired by the KDE 4 style Oxygen.</td>
          </tr>

          <tr>
            <td><code><b>oxygen2</b></code></td>

            <td><img src="oxygen2.png" alt="oxygen2" width="120" height=
            "51"></td>

            <td>
              <table border="0" cellpadding="0" cellspacing="0">
                <tr valign="top">
                  <td>Tablelist_tile:&nbsp;</td>

                  <td>Default for the Qt style <code><b>oxygen</b></code>
                  within the <code><b>tileqt</b></code> theme.</td>
                </tr>
              </table>
            </td>
          </tr>

          <tr>
            <td><code><b>phase</b></code></td>

            <td><img src="phase.png" alt="phase" width="120" height="51"></td>

            <td>
              <table border="0" cellpadding="0" cellspacing="0">
                <tr valign="top">
                  <td>Tablelist_tile:&nbsp;</td>

                  <td>Default for the Qt style <code><b>phase</b></code> within
                  the <code><b>tileqt</b></code> theme.</td>
                </tr>
              </table>
            </td>
          </tr>

          <tr>
            <td><code><b>plastik</b></code></td>

            <td><img src="plastik.png" alt="plastik" width="120" height=
            "51"></td>

            <td>
              <table border="0" cellpadding="0" cellspacing="0">
                <tr valign="top">
                  <td>Tablelist_tile:&nbsp;</td>

                  <td>Default for the <code><b>plastik</b></code> theme and the
                  Qt style <code><b>plastik</b></code> within the
                  <code><b>tileqt</b></code> theme.</td>
                </tr>
              </table>
            </td>
          </tr>

          <tr>
            <td><code><b>plastique</b></code></td>

            <td><img src="plastique.png" alt="plastique" width="120" height=
            "51"></td>

            <td>
              <table border="0" cellpadding="0" cellspacing="0">
                <tr valign="top">
                  <td>Tablelist_tile:&nbsp;</td>

                  <td>Default for the Qt style <code><b>plastique</b></code>
                  within the <code><b>tileqt</b></code> theme.</td>
                </tr>
              </table>
            </td>
          </tr>

          <tr>
            <td><code><b>radiance</b></code></td>

            <td><img src="radiance.png" alt="radiance" width="120" height=
            "63"></td>

            <td>Inspired by the GTK+ theme Radiance.&nbsp; Recommended to be
            used with large fonts and images.</td>
          </tr>

          <tr>
            <td><code><b>ubuntu</b></code></td>

            <td><img src="ubuntu.png" alt="ubuntu" width="120" height=
            "51"></td>

            <td>Inspired by a couple of GTK+ 3 themes bundled with the Ubuntu
            Linux distribution.</td>
          </tr>

          <tr>
            <td><code><b>vistaAero</b></code></td>

            <td><img src="vistaAero.png" alt="vistaAero" width="120" height=
            "54"></td>

            <td>
              <table border="0" cellpadding="0" cellspacing="0">
                <tr valign="top">
                  <td>Tablelist:&nbsp;</td>

                  <td>Default for the windowing system
                  <code><b>win32</b></code> on Windows Vista.</td>
                </tr>

                <tr valign="top">
                  <td>Tablelist_tile:&nbsp;</td>

                  <td>Default for the <code><b>vista</b></code> theme on
                  Windows Vista with the Vista Aero style.</td>
                </tr>
              </table>
            </td>
          </tr>

          <tr>
            <td><code><b>vistaClassic</b></code></td>

            <td><img src="vistaClassic.png" alt="vistaClassic" width="120"
            height="51"></td>

            <td>
              <table border="0" cellpadding="0" cellspacing="0">
                <tr valign="top">
                  <td>Tablelist:&nbsp;</td>

                  <td>Default for the windowing system
                  <code><b>win32</b></code> on Windows Vista with the Windows
                  Classic style.</td>
                </tr>

                <tr valign="top">
                  <td>Tablelist_tile:&nbsp;</td>

                  <td>Default for the <code><b>vista</b></code> theme on
                  Windows Vista with the Windows Classic style.</td>
                </tr>
              </table>
            </td>
          </tr>

          <tr>
            <td><code><b>win7Aero</b></code></td>

            <td><img src="win7Aero.png" alt="win7Aero" width="120" height=
            "54"></td>

            <td>
              <table border="0" cellpadding="0" cellspacing="0">
                <tr valign="top">
                  <td>Tablelist:&nbsp;</td>

                  <td>Default for the windowing system
                  <code><b>win32</b></code> on Windows 7.</td>
                </tr>

                <tr valign="top">
                  <td>Tablelist_tile:&nbsp;</td>

                  <td>Default for the <code><b>vista</b></code> theme on
                  Windows 7 with the Windows 7 Aero style.</td>
                </tr>
              </table>
            </td>
          </tr>

          <tr>
            <td><code><b>win7Classic</b></code></td>

            <td><img src="win7Classic.png" alt="win7Classic" width="120"
            height="51"></td>

            <td>
              <table border="0" cellpadding="0" cellspacing="0">
                <tr valign="top">
                  <td>Tablelist:&nbsp;</td>

                  <td>Default for the windowing system
                  <code><b>win32</b></code> on Windows 7 with the Windows
                  Classic style.</td>
                </tr>

                <tr valign="top">
                  <td>Tablelist_tile:&nbsp;</td>

                  <td>Default for the <code><b>vista</b></code> theme on
                  Windows 7 with the Windows Classic style.</td>
                </tr>
              </table>
            </td>
          </tr>

          <tr>
            <td><code><b>winnative</b></code></td>

            <td><img src="winnative.png" alt="winnative" width="120" height=
            "51"></td>

            <td>
              <table border="0" cellpadding="0" cellspacing="0">
                <tr valign="top">
                  <td>Tablelist:&nbsp;</td>

                  <td>Default for the windowing system
                  <code><b>win32</b></code> on Windows 2000 and Windows XP with
                  the Windows Classic style.</td>
                </tr>

                <tr valign="top">
                  <td>Tablelist_tile:&nbsp;</td>

                  <td>Default for the themes <code><b>alt</b></code>,
                  <code><b>keramik</b></code>, <code><b>keramik_alt</b></code>,
                  <code><b>winnative</b></code>, and
                  <code><b>xpnative</b></code> with the Windows Classic style,
                  as well as for most Qt styles within the
                  <code><b>tileqt</b></code> theme.</td>
                </tr>
              </table>
            </td>
          </tr>

          <tr>
            <td><code><b>winxpBlue</b></code></td>

            <td><img src="winxpBlue.png" alt="winxpBlue" width="120" height=
            "51"></td>

            <td>
              <table border="0" cellpadding="0" cellspacing="0">
                <tr valign="top">
                  <td>Tablelist:&nbsp;</td>

                  <td>Default for the windowing system
                  <code><b>win32</b></code> on Windows XP with the Blue color
                  scheme.</td>
                </tr>

                <tr valign="top">
                  <td>Tablelist_tile:&nbsp;</td>

                  <td>Default for the <code><b>winxpblue</b></code> theme and
                  the <code><b>xpnative</b></code> theme on Windows XP with the
                  Blue color scheme.</td>
                </tr>
              </table>
            </td>
          </tr>

          <tr>
            <td><code><b>winxpOlive</b></code></td>

            <td><img src="winxpOlive.png" alt="winxpOlive" width="120" height=
            "51"></td>

            <td>
              <table border="0" cellpadding="0" cellspacing="0">
                <tr valign="top">
                  <td>Tablelist:&nbsp;</td>

                  <td>Default for the windowing system
                  <code><b>win32</b></code> on Windows XP with the Olive Green
                  color scheme.</td>
                </tr>

                <tr valign="top">
                  <td>Tablelist_tile:&nbsp;</td>

                  <td>Default for the <code><b>xpnative</b></code> theme on
                  Windows XP with the Olive Green color scheme.</td>
                </tr>
              </table>
            </td>
          </tr>

          <tr>
            <td><code><b>winxpSilver</b></code></td>

            <td><img src="winxpSilver.png" alt="winxpSilver" width="120"
            height="51"></td>

            <td>
              <table border="0" cellpadding="0" cellspacing="0">
                <tr valign="top">
                  <td>Tablelist:&nbsp;</td>

                  <td>Default for the windowing system
                  <code><b>win32</b></code> on Windows XP with the Silver color
                  scheme.</td>
                </tr>

                <tr valign="top">
                  <td>Tablelist_tile:&nbsp;</td>

                  <td>Default for the <code><b>xpnative</b></code> theme on
                  Windows XP with the Silver color scheme.</td>
                </tr>
              </table>
            </td>
          </tr>
        </table>

        <p>For technical reasons (the use of the <code><b>-elide</b></code>
        text widget tag option for collapsing a row), this option is not
        supported for Tk versions earlier than 8.3.</p>
      </blockquote>
    </dd>

    <dd id="width">
      <table border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td>Command-Line Name:&nbsp;</td>

          <td><code><b>-width</b></code></td>
        </tr>

        <tr>
          <td>Database Name:</td>

          <td><code><b>&nbsp;width</b></code></td>
        </tr>

        <tr>
          <td>Database Class:</td>

          <td><code><b>&nbsp;Width</b></code></td>
        </tr>
      </table>

      <blockquote>
        <p>Specifies the desired width for the window, in average-size
        characters of the widget's font.&nbsp; 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.</p>
      </blockquote>
    </dd>

    <dt id="col_options"><b>COLUMN CONFIGURATION OPTIONS</b></dt>

    <dd>The following options are currently supported by the <code><b><a href=
    "#columncget">columncget</a></b></code>, <code><b><a href=
    "#columnconfigure">columnconfigure</a></b></code>, <code><b><a href=
    "#configcolumnlist">configcolumnlist</a></b></code>, and <code><b><a href=
    "#configcolumns">configcolumns</a></b></code> commands:</dd>

    <dd>
      <dl>
        <dt class="tm" id="col_align"><code><b>-align</b>
        <i>alignment</i></code></dt>

        <dd>Specifies how to align the elements of the column.&nbsp; It must be
        one of <code><b>left</b></code>, <code><b>right</b></code>, or
        <code><b>center</b></code>.&nbsp; This option also refers to the
        column's title if the <code><b><a href=
        "#col_labelalign">-labelalign</a></b></code> option hasn't been
        specified for the given column, or if its value is an empty
        string.&nbsp; The <code><b>-align</b></code> option is tied to the
        <code><i>alignment</i></code> element corresponding to this column in
        the list specifying the value of the <code><b><a href=
        "#columns">-columns</a></b></code> option for the tablelist widget;
        changes in either will automatically be reflected in the other.</dd>

        <dt class="tm" id="col_background"><code><b>-background</b>
        <i>color</i></code> or <code><b>-bg</b> <i>color</i></code></dt>

        <dd>Specifies the normal background color to use when displaying the
        contents of the column.</dd>

        <dt class="tm" id="col_changesnipside"><code><b>-changesnipside</b>
        <i>boolean</i></code></dt>

        <dd>Specifies whether to override the alignment-specific default
        position of the <a href="#snipstring">snip indicator</a> when
        displaying the elements of the column (excluding its title).&nbsp; The
        default value is <code>0</code>, meaning that the snip string will be
        appended to the elements if the column's alignment is
        <code><b>left</b></code> or <code><b>center</b></code> and prepended to
        them in case the alignment is <code><b>right</b></code>.</dd>

        <dt class="tm" id= "col_changetitlesnipside">
        <code><b>-changetitlesnipside</b> <i>boolean</i></code></dt>

        <dd>Specifies whether to override the alignment-specific default
        position of the <a href="#snipstring">snip indicator</a> when
        displaying the column's title.&nbsp; The default value is
        <code>0</code>, meaning that the snip string will be appended to the
        title if the column's alignment is <code><b>left</b></code> or
        <code><b>center</b></code> and prepended to it in case the alignment is
        <code><b>right</b></code>.</dd>

        <dt class="tm" id="col_editable"><code><b>-editable</b>
        <i>boolean</i></code></dt>

        <dd>Specifies whether the elements of the column can be edited
        interactively.&nbsp; The default value is <code>0</code>.&nbsp; The
        value of this option can be overridden for individual cells by using
        the <a href="#cell_editable">cell configuration option</a> of the same
        name.</dd>

        <dt class="tm" id="col_editwindow"><code><b>-editwindow</b>
        <i>name</i></code></dt>

        <dd>Specifies the type of the temporary embedded widget to be used for
        interactive editing of the contents of the given column's cells.&nbsp;
        <code><i>name</i></code> may be one of <code><b>entry</b></code> (which
        is the default), <code><b>text</b></code>, <code><b>spinbox</b></code>
        (the latter for Tk versions 8.4 or higher),
        <code><b>checkbutton</b></code>, <code><b>menubutton</b></code>,
        <code><b>ttk::entry</b></code>, <code><b>ttk::spinbox</b></code>,
        <code><b>ttk::combobox</b></code>,
        <code><b>ttk::checkbutton</b></code>, or
        <code><b>ttk::menubutton</b></code> (the latter five only in the
        presence of the tile widget engine), or the value returned by one of
        the registration commands for widgets from the packages <a href=
        "tablelistBWidget.html">BWidget</a>, <a href=
        "tablelistIwidgets.html">Iwidgets</a>, <a href=
        "tablelistCombobox.html">combobox</a> (by Bryan Oakley), <a href=
        "tablelistCtext.html">ctext</a>, and <a href=
        "tablelistMentry.html">Mentry (or Mentry_tile)</a>.&nbsp; For example,
        you can use&nbsp; <code><b>-editwindow ComboBox</b></code>&nbsp;
        <i>after</i> registering the ComboBox widget for interactive cell
        editing with the aid of the <code><b><a href=
        "tablelistBWidget.html#ComboBox">tablelist::addBWidgetComboBox</a></b></code>
        command.&nbsp; Similarly, you can use&nbsp; <code><b>-editwindow
        combobox</b></code>&nbsp; <i>after</i> registering Bryan Oakley's
        combobox widget for interactive cell editing by invoking the
        <code><b><a href=
        "tablelistCombobox.html#combobox">tablelist::addOakleyCombobox</a></b></code>
        command.&nbsp; The value of this option can be overridden for
        individual cells by using the <a href="#cell_editwindow">cell
        configuration option</a> of the same name.</dd>

        <dt class="tm" id="col_font"><code><b>-font</b> <i>font</i></code></dt>

        <dd>Specifies the font to use when displaying the contents of the
        column.</dd>

        <dt class="tm" id="col_foreground"><code><b>-foreground</b>
        <i>color</i></code> or <code><b>-fg</b> <i>color</i></code></dt>

        <dd>Specifies the normal foreground color to use when displaying the
        contents of the column.</dd>

        <dt class="tm" id="col_formatcommand"><code><b>-formatcommand</b>
        <i>command</i></code></dt>

        <dd>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.&nbsp; If <code><i>command</i></code> 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.</dd>

        <dd class="tm">For example, if a time value in seconds is being
        inserted into the cell and <code><i>command</i></code> is the procedure
        <code>formatDate</code> defined as</dd>

        <dd>
          <blockquote>
            <pre>
proc formatDate clockVal {
    return [clock format $clockVal -format "%Y-%m-%d"]
}
</pre>
          </blockquote>
        </dd>

        <dd>then the text displayed in the cell will be the date in the
        specified format, not the time value in seconds.</dd>

        <dd class="tm">This option is also used by Tablelist when building the
        return values of the <code><b><a href=
        "#getformatted">getformatted</a></b></code>, <code><b><a href=
        "#getformattedcolumns">getformattedcolumns</a></b></code>, and
        <code><b><a href="#getformattedcells">getformattedcells</a></b></code>
        subcommands, or searching for a text pattern passed to the
        <code><b><a href="#searchcolumn">searchcolumn</a></b></code> subcommand
        with the <code><b>-formatted</b></code> option.&nbsp; All the other
        subcommands, notably <code><b><a href="#get">get</a></b></code>,
        <code><b><a href="#getcolumns">getcolumns</a></b></code>,
        <code><b><a href="#getcells">getcells</a></b></code>, <code><b><a href=
        "#rowcget">rowcget</a></b></code>, <code><b><a href=
        "#columncget">columncget</a></b></code>, <code><b><a href=
        "#cellcget">cellcget</a></b></code>, <code><b><a href=
        "#sort">sort</a></b></code>, <code><b><a href=
        "#sortbycolumn">sortbycolumn</a></b></code>, <code><b><a href=
        "#sortbycolumnlist">sortbycolumnlist</a></b></code>, and
        <code><b><a href="#refreshsorting">refreshsorting</a></b></code>
        operate on the original cell text, which is contained in the widget's
        internal list.&nbsp; In the case of the above example, this will make
        it possible to sort the items quite easily by time, with a second's
        precision, even if their visual representation only contains the year,
        month, and day.</dd>

        <dd class="tm">The <code><b>-formatcommand</b></code> option comes in
        handy if only images or embedded windows are to be displayed in a
        column but the texts associated with the cells may not simply be empty
        strings because they are needed for other purposes (like sorting or
        editing).&nbsp; 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.</dd>

        <dd class="tm">The demo scripts included in the Tablelist distribution
        contain further examples demonstrating the use of this option.&nbsp;
        The most interesting ones are also described in <a href=
        "tablelist.html">Tablelist Programmer's Guide</a>.</dd>

        <dd class="tm">In the more sophisticated case that the result of the
        formatting should also depend on the cell's row, you will have to
        invoke the <code><b><a href="#formatinfo">formatinfo</a></b></code>
        subcommand, which provides the necessary information about the cell
        whose content is being formatted.</dd>

        <dd class="tm" id="col_formatted">Due to the
        <code><b>-formatcommand</b></code> column configuration option, we will
        distinguish between the internal value of a tablelist element and its
        <b>formatted</b> version.&nbsp; The latter is the result of the
        invocation of the script corresponding to the
        <code><b>-formatcommand</b></code> option of the element's column, or
        the element itself if this option was not set for that column.&nbsp;
        Consequently, the formatted version of a tablelist item is a list
        comprised of the formatted elements of the original item.</dd>

        <dt class="tm" id="col_hide"><code><b>-hide</b>
        <i>boolean</i></code></dt>

        <dd>Specifies whether to hide the column when displaying the widget or
        exporting its selection.&nbsp; The default value is
        <code>0</code>.&nbsp; After toggling the hidden state of a column, the
        <code><b>&lt;&lt;TablelistColHiddenStateChanged&gt;&gt;</b></code>
        virtual event is generated, with its <code><b>-data</b></code> option
        set to the numerical column index for Tk versions 8.5 or higher.</dd>

        <dt class="tm" id="col_labelalign"><code><b>-labelalign</b>
        <i>alignment</i></code></dt>

        <dd>Specifies how to align the column's title.&nbsp; It must be one of
        <code><b>left</b></code>, <code><b>right</b></code>, or
        <code><b>center</b></code>, or an empty string.&nbsp; If this option
        hasn't been specified for the given column, or if its value is an empty
        string, then the header title will have the same alignment as the
        elements of the column, as given by the <code><b><a href=
        "#col_align">-align</a></b></code> column configuration option or by
        the <code><i>alignment</i></code> element corresponding to this column
        in the list specifying the value of the <code><b><a href=
        "#columns">-columns</a></b></code> global option.</dd>

        <dt class="tm" id="col_labelopts"><code><b>-labelbackground</b>
        <i>color</i></code> or <code><b>-labelbg</b> <i>color</i></code><br>
        <code><b>-labelborderwidth</b> <i>screenDistance</i></code> or
        <code><b>-labelbd</b> <i>screenDistance</i></code><br>
        <code><b>-labelcommand</b> <i>command</i></code><br>
        <code><b>-labelcommand2</b> <i>command</i></code><br>
        <code><b>-labelfont</b> <i>fontName</i></code><br>
        <code><b>-labelforeground</b> <i>color</i></code> or
        <code><b>-labelfg</b> <i>color</i></code><br>
        <code><b>-labelheight</b> <i>lines</i></code><br>
        <code><b>-labelpady</b> <i>screenDistance</i></code><br>
        <code><b>-labelrelief</b> <i>relief</i></code></dt>

        <dd>The value of each of these options may also be an empty
        string.&nbsp; These options are the column-specific equivalents of the
        global ones having the same names, described in the <a href=
        "#widget_options">WIDGET-SPECIFIC OPTIONS</a> section.&nbsp; They
        override the options of the same names set at widget level if the
        specified value is not empty.&nbsp; If one of these options hasn't been
        specified for the given column, or if its value is an empty string,
        then that option will not be used at column level; the global option of
        the same name will be used instead.&nbsp; The <code><b><a href=
        "#labelactivebackground">-labelactivebackground</a></b></code>,
        <code><b><a href=
        "#labelactiveforeground">-labelactiveforeground</a></b></code>, and
        <code><b><a href=
        "#labeldisabledforeground">-labeldisabledforeground</a></b></code>
        options are only defined at widget level; there are no column
        configuration options with these names.&nbsp; The
        <code><b>-labelbackground</b></code> and
        <code><b>-labelheight</b></code> options are only supported by the
        Tablelist package, but not by Tablelist_tile.</dd>

        <dt class="tm" id="col_labelimage"><code><b>-labelimage</b>
        <i>image</i></code></dt>

        <dd>Specifies the name of the Tk image to be displayed in the header
        label.&nbsp; <code><i>image</i></code> must be the result of an
        invocation of the&nbsp; <code><b>image create</b></code>&nbsp; command,
        or an empty string, specifying that no image is to be displayed.&nbsp;
        If the label's text is right-aligned then the image will be displayed
        to the right of the text, otherwise to its left.&nbsp; The text and the
        image are separated from each other by a gap corresponding to the width
        of a space character in the given label's font.</dd>

        <dt class="tm" id="col_maxwidth"><code><b>-maxwidth</b>
        <i>width</i></code></dt>

        <dd><code><i>width</i></code> must be a number.&nbsp; A positive value
        specifies the column's maximum width in average-size characters of the
        widget's font.&nbsp; If <code><i>width</i></code> is negative, its
        absolute value is interpreted as a maximum column width in
        pixels.&nbsp; Finally, a value of zero (which is the default) specifies
        that the column's maximum width is to be made just large enough to hold
        all the elements in the column, including its header.&nbsp; This option
        is only relevant if the given column has dynamic width, i.e., if its
        width was set to <code>0</code>.</dd>

        <dt class="tm" id="col_name"><code><b>-name</b> <i>name</i></code></dt>

        <dd>Specifies a name associated with the column.&nbsp; While the
        numerical index of a column might change by inserting, deleting, or
        moving columns, its name remains constant and can be used as a safe
        alternative column index (see the <a href="#col_indices">COLUMN
        INDICES</a> section for details).&nbsp; Similarly, it can also be used
        as the second component of a cell index of the form
        <code><i>row</i><b>,</b><i>col</i></code>, as described in the <a href=
        "#cell_indices">CELL INDICES</a> section.&nbsp; To avoid ambiguities,
        column names should be different from any other forms of column indices
        (like numbers, <code><b>active</b></code>, <code><b>anchor</b></code>,
        <code><b>end</b></code>, <code><b>last</b></code>,
        <code><b>left</b></code>, <code><b>right</b></code>, or any of their
        abbreviations).&nbsp; They should also be different from (any
        abbreviations of) the string <code><b>all</b></code>, which may be
        specified as the value of the <code><b><a href=
        "#stretch">-stretch</a></b></code> configuration option.&nbsp; The
        default value is an empty string.</dd>

        <dt class="tm" id="col_resizable"><code><b>-resizable</b>
        <i>boolean</i></code></dt>

        <dd>Specifies whether the column can be resized interactively.&nbsp;
        See the <a href="#label_bindings">DEFAULT AND INDIVIDUAL BINDINGS FOR
        THE HEADER LABELS</a> section for information on interactive column
        resizing.&nbsp; The default value is <code>1</code>.&nbsp; This option
        is only relevant if the value of the <code><b><a href=
        "#resizablecolumns">-resizablecolumns</a></b></code> widget
        configuration option is true.</dd>

        <dt class="tm" id="col_selectbackground"><code><b>-selectbackground</b>
        <i>color</i></code></dt>

        <dd>Specifies the background color to use when displaying the contents
        of a cell in the given column while the cell is selected.</dd>

        <dt class="tm" id="col_selectforeground"><code><b>-selectforeground</b>
        <i>color</i></code></dt>

        <dd>Specifies the foreground color to use when displaying the contents
        of a cell in the given column while the cell is selected.</dd>

        <dt class="tm" id="col_showarrow"><code><b>-showarrow</b>
        <i>boolean</i></code></dt>

        <dd>Specifies whether the <code><b><a href=
        "#sortbycolumn">sortbycolumn</a></b></code> command with the given
        column index as first argument and the <code><b><a href=
        "#sortbycolumnlist">sortbycolumnlist</a></b></code> command having the
        given column index as element of its first argument should place an
        arrow indicating the sort order into the column's label.&nbsp; The
        default value is <code>1</code>.&nbsp; This option is only relevant if
        the value of the <code><b><a href=
        "#showarrow">-showarrow</a></b></code> widget configuration option is
        true.</dd>

        <dt class="tm" id="col_showlinenumbers"><code><b>-showlinenumbers</b>
        <i>boolean</i></code></dt>

        <dd>Specifies whether the given column should display the line numbers
        (starting with 1 and ending with the number of the non-hidden
        rows).&nbsp; The default value is <code>0</code>.</dd>

        <dd class="tm">The following details assume that the given column's
        <code><b>-showlinenumbers</b></code> option was set to true:&nbsp;
        Associating the line numbers with the non-hidden rows takes place
        automatically whenever items are inserted, deleted, updated, moved, or
        sorted, or their <code><b><a href="#row_hide">-hide</a></b></code>
        option is toggled.&nbsp; For increased efficiency, this is done at idle
        time.&nbsp; 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.&nbsp; The
        line numbers will override any previous contents of the column's
        cells.&nbsp; They are, per default, displayed without leading zeros,
        but this (and the display format in general) can be changed with the
        aid of the <code><b><a href=
        "#col_formatcommand">-formatcommand</a></b></code> column configuration
        option.</dd>

        <dd class="tm">The <code><b><a href=
        "#sortbycolumn">sortbycolumn</a></b></code> and <code><b><a href=
        "#sortbycolumnlist">sortbycolumnlist</a></b></code> subcommands as well
        as the <code><b><a href=
        "tablelistColSort.html#sortByColumn">tablelist::sortByColumn</a></b></code>
        and <code><b><a href=
        "tablelistColSort.html#addToSortColumns">tablelist::addToSortColumns</a></b></code>
        commands check the column indices passed to them as arguments and don't
        perform any sorting by those columns that have been configured to
        display the line numbers (see the corresponding descriptions for
        details).</dd>

        <dd class="tm"><b>REMARK:</b>&nbsp; Please note that the line numbers
        refer to the <i>non-hidden</i> rows, which in case of a tablelist used
        as a tree widget might be different from the <a href=
        "#isviewable">viewable</a> ones.&nbsp; Consequently, collapsing a row
        will, in general, not lead to renumbering the lines (instead, it will
        just elide the corresponding range of line numbers).</dd>

        <dt class="tm" id="col_sortcommand"><code><b>-sortcommand</b>
        <i>command</i></code></dt>

        <dd>This option is only relevant if the value of the <code><b><a href=
        "#col_sortmode">-sortmode</a></b></code> option for the given column is
        <code><b>command</b></code>.&nbsp; It specifies a command to be used
        for the comparison of the column's elements when invoking the
        <code><b><a href="#sortbycolumn">sortbycolumn</a></b></code> command
        with the given column index as first argument or the <code><b><a href=
        "#sortbycolumnlist">sortbycolumnlist</a></b></code> command having the
        given column index as element of its first argument.&nbsp; To compare
        two elements during the <code><b>sortbycolumn</b></code> or
        <code><b>sortbycolumnlist</b></code> operation,
        <code><i>command</i></code> is automatically concatenated with the two
        elements and the resulting script is evaluated.&nbsp; The script should
        return an integer less than, equal to, or greater than zero if the
        first element is to be considered less than, equal to, or greater than
        the second, respectively.</dd>

        <dt class="tm" id="col_sortmode"><code><b>-sortmode</b>
        <i>mode</i></code></dt>

        <dd>Specifies how to compare the column's elements when invoking the
        <code><b><a href="#sortbycolumn">sortbycolumn</a></b></code> command
        with the given column index as first argument or the <code><b><a href=
        "#sortbycolumnlist">sortbycolumnlist</a></b></code> command having the
        given column index as element of its first argument.&nbsp;
        <code><i>mode</i></code> may have any of the following values:</dd>

        <dd class="tm">
          <table border="0" cellpadding="6" cellspacing="0">
            <tr valign="top">
              <td><code><b>ascii</b></code></td>

              <td>Use string comparison with Unicode code-point collation order
              (the name is for backward-compatibility reasons).&nbsp; This is
              the default.</td>
            </tr>

            <tr valign="top">
              <td><code><b>asciinocase&nbsp;&nbsp;</b></code></td>

              <td>This is the same as <code><b>ascii</b></code>, except that
              comparisons are handled in a case-insensitive manner.</td>
            </tr>

            <tr valign="top">
              <td><code><b>command</b></code></td>

              <td>Use the command specified by the <code><b><a href=
              "#col_sortcommand">-sortcommand</a></b></code> column
              configuration option to compare the column's elements.</td>
            </tr>

            <tr valign="top">
              <td><code><b>dictionary</b></code></td>

              <td>Use dictionary-style comparison.&nbsp; This is the same as
              <code><b>ascii</b></code>, except: (a) case is ignored except as
              a tie-breaker; (b) if two strings contain embedded numbers, the
              numbers compare as integers, not characters.&nbsp; For example,
              <code>bigBoy</code> sorts between <code>bigbang</code> and
              <code>bigboy</code>, and <code>x10y</code> sorts between
              <code>x9y</code> and <code>x11y</code>.</td>
            </tr>

            <tr valign="top">
              <td><code><b>integer</b></code></td>

              <td>Convert the elements to integers and use integer
              comparison.</td>
            </tr>

            <tr valign="top">
              <td><code><b>real</b></code></td>

              <td>Convert the elements to floating-point values and use
              floating-point comparison.</td>
            </tr>
          </table>
        </dd>

        <dt class="tm" id="col_stretchable"><code><b>-stretchable</b>
        <i>boolean</i></code></dt>

        <dd>Specifies whether the column is to be stretched in order to fill
        the tablelist window if necessary.&nbsp; The value of this option is
        tied to that of the <code><b><a href="#stretch">-stretch</a></b></code>
        option for the tablelist widget; changes in either will automatically
        be reflected in the other.</dd>

        <dt class="tm" id="col_stripebackground"><code><b>-stripebackground</b>
        <i>color</i></code></dt>

        <dd>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
        stripe.</dd>

        <dt class="tm" id="col_stripeforeground"><code><b>-stripeforeground</b>
        <i>color</i></code></dt>

        <dd>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
        stripe.</dd>

        <dt class="tm" id="col_text"><code><b>-text</b> <i>list</i></code></dt>

        <dd>Specifies a list of strings to be displayed in the cells of the
        given column, i.e., updates the elements contained in the column.&nbsp;
        If the tablelist's <code><b><a href="#state">state</a></b></code> is
        <code><b>disabled</b></code> then this option will be ignored.</dd>

        <dt class="tm" id="col_title"><code><b>-title</b>
        <i>title</i></code></dt>

        <dd>Specifies the text to be displayed in the column's header.&nbsp;
        This option is tied to the <code><i>title</i></code> element
        corresponding to the given column in the list specifying the value of
        the <code><b><a href="#columns">-columns</a></b></code> option for the
        tablelist widget; changes in either will automatically be reflected in
        the other.</dd>

        <dt class="tm" id="col_valign"><code><b>-valign</b>
        <i>verticalAlignment</i></code></dt>

        <dd>Specifies the vertical alignment of embedded images and windows
        displayed in the given column.&nbsp; The
        <code><i>verticalAlignment</i></code> must be one of
        <code><b>center</b></code> (which is the default),
        <code><b>top</b></code>, or <code><b>bottom</b></code>.&nbsp;
        Especially in rows containing multi-line elements, embedded images or
        windows are often not as tall as the rows themselves; in such cases,
        this option enables you to control the column-dependent vertical
        alignment of these embedded objects.&nbsp; The value of this option can
        be overridden for individual cells by using the <a href=
        "#cell_valign">cell configuration option</a> of the same name.</dd>

        <dt class="tm" id="col_width"><code><b>-width</b>
        <i>width</i></code></dt>

        <dd><code><i>width</i></code> must be a number.&nbsp; A positive value
        specifies the column's width in average-size characters of the widget's
        font.&nbsp; If <code><i>width</i></code> is negative, its absolute
        value is interpreted as a column width in pixels.&nbsp; Finally, a
        value of zero specifies that the column's width is to be made just
        large enough to hold all the elements in the column, including its
        header (but no larger than the maximum width indicated by the
        <code><b><a href="#col_maxwidth">-maxwidth</a></b></code> column
        configuration option).&nbsp; This option is tied to the
        <code><i>width</i></code> element corresponding to the given column in
        the list specifying the value of the <code><b><a href=
        "#columns">-columns</a></b></code> option for the tablelist widget;
        changes in either will automatically be reflected in the other.</dd>

        <dt class="tm" id="col_wrap"><code><b>-wrap</b>
        <i>boolean</i></code></dt>

        <dd>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.&nbsp; The default value is <code>0</code>.&nbsp; If the
        specified column has static width or a nonzero <code><b><a href=
        "#col_maxwidth">-maxwidth</a></b></code> 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.&nbsp;
        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.&nbsp;
        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.</dd>
      </dl>
    </dd>

    <dd class="tm">The <code><b>-background</b></code>,
    <code><b>-font</b></code>, <code><b>-foreground</b></code>,
    <code><b>-selectbackground</b></code>,
    <code><b>-selectforeground</b></code>,
    <code><b>-stripebackground</b></code>, and
    <code><b>-stripeforeground</b></code> column configuration options override
    the options of the same names set at widget level (but not the ones set at
    cell or row level) if the specified value is not an empty string.&nbsp; See
    the <a href="#colors_and_fonts">COLORS AND FONTS</a> section for further
    details on these options.</dd>

    <dt class="tm" id="row_options"><b>ROW CONFIGURATION OPTIONS</b></dt>

    <dd>The following options are currently supported by the <code><b><a href=
    "#rowcget">rowcget</a></b></code>, <code><b><a href=
    "#rowconfigure">rowconfigure</a></b></code>, <code><b><a href=
    "#configrowlist">configrowlist</a></b></code>, and <code><b><a href=
    "#configrows">configrows</a></b></code> commands:</dd>

    <dd>
      <dl>
        <dt class="tm" id="row_background"><code><b>-background</b>
        <i>color</i></code> or <code><b>-bg</b> <i>color</i></code></dt>

        <dd>Specifies the normal background color to use when displaying the
        contents of the row.</dd>

        <dt class="tm" id="row_font"><code><b>-font</b> <i>font</i></code></dt>

        <dd>Specifies the font to use when displaying the contents of the
        row.</dd>

        <dt class="tm" id="row_foreground"><code><b>-foreground</b>
        <i>color</i></code> or <code><b>-fg</b> <i>color</i></code></dt>

        <dd>Specifies the normal foreground color to use when displaying the
        contents of the row.</dd>

        <dt class="tm" id="row_hide"><code><b>-hide</b>
        <i>boolean</i></code></dt>

        <dd>Specifies whether to hide the row when displaying the widget or
        exporting its selection.&nbsp; The default value is
        <code>0</code>.&nbsp; After toggling the hidden state of a row, the
        <code><b>&lt;&lt;TablelistRowHiddenStateChanged&gt;&gt;</b></code>
        virtual event is generated, with its <code><b>-data</b></code> option
        set to the numerical row index for Tk versions 8.5 or higher.</dd>

        <dd class="tm">For technical reasons (the use of the
        <code><b>-elide</b></code> option for a text widget tag), this option
        is not supported for Tk versions earlier than 8.3.</dd>

        <dd class="tm"><b>CAUTION:</b>&nbsp; Tk versions 8.3 - 8.4.12 had a bug
        that caused a segmentation fault if the whole content of a text widget
        was elided.&nbsp; This bug was also present in Tk 8.5.a1 -
        8.5.a3.&nbsp; When using one of these earlier Tk versions, this bug
        will produce a crash if all the rows of a tablelist widget are
        hidden.&nbsp; It is your responsibility to avoid such situations when
        using a Tk version having this bug!</dd>

        <dt class="tm" id="row_name"><code><b>-name</b> <i>name</i></code></dt>

        <dd>Specifies a name associated with the row.&nbsp; While the numerical
        index of a row might change by inserting, deleting, or moving rows, or
        by sorting the items, its name remains constant and can be used as a
        safe alternative row index (see the <a href="#row_indices">ROW
        INDICES</a> section for details).&nbsp; Similarly, it can also be used
        as the first component of a cell index of the form
        <code><i>row</i><b>,</b><i>col</i></code>, as described in the <a href=
        "#cell_indices">CELL INDICES</a> section.&nbsp; To avoid ambiguities,
        row names should be different from any other forms of row indices (like
        numbers, full keys, <code><b>active</b></code>,
        <code><b>anchor</b></code>, <code><b>end</b></code>,
        <code><b>last</b></code>, <code><b>top</b></code>,
        <code><b>bottom</b></code>, or any of their abbreviations).&nbsp; The
        default value is an empty string.</dd>

        <dt class="tm" id="row_selectable"><code><b>-selectable</b>
        <i>boolean</i></code></dt>

        <dd>Specifies whether the elements displayed in the given row can be
        selected.&nbsp; The default value is <code>1</code>.&nbsp; If the value
        <code>0</code> was given then any attempt to select the item contained
        in this row with the aid of the&nbsp; <code><b><a href=
        "#selection">selection set</a></b></code>&nbsp; widget command or any
        of its elements by using the&nbsp; <code><b><a href=
        "#cellselection">cellselection set</a></b></code>&nbsp; command will be
        silently ignored; moreover, an existing old (cell) selection is removed
        from the row.</dd>

        <dt class="tm" id="row_selectbackground"><code><b>-selectbackground</b>
        <i>color</i></code></dt>

        <dd>Specifies the background color to use when displaying the contents
        of a cell in the given row while the cell is selected.</dd>

        <dt class="tm" id="row_selectforeground"><code><b>-selectforeground</b>
        <i>color</i></code></dt>

        <dd>Specifies the foreground color to use when displaying the contents
        of a cell in the given row while the cell is selected.</dd>

        <dt class="tm" id="row_text"><code><b>-text</b> <i>list</i></code></dt>

        <dd>Specifies a list of strings to be displayed in the cells of the
        given row, i.e., updates the item contained in the row.&nbsp; If the
        tablelist's <code><b><a href="#state">state</a></b></code> is
        <code><b>disabled</b></code> then this option will be ignored.</dd>
      </dl>
    </dd>

    <dd class="tm">The <code><b>-background</b></code>,
    <code><b>-font</b></code>, <code><b>-foreground</b></code>,
    <code><b>-selectbackground</b></code>, and
    <code><b>-selectforeground</b></code> row configuration options override
    the options of the same names set at column or widget level (but not the
    ones set at cell level) if the specified value is not an empty
    string.&nbsp; See the <a href="#colors_and_fonts">COLORS AND FONTS</a>
    section for further details on these options.</dd>

    <dt class="tm" id="cell_options"><b>CELL CONFIGURATION OPTIONS</b></dt>

    <dd>The following options are currently supported by the <code><b><a href=
    "#cellcget">cellcget</a></b></code>, <code><b><a href=
    "#cellconfigure">cellconfigure</a></b></code>, <code><b><a href=
    "#configcelllist">configcelllist</a></b></code>, and <code><b><a href=
    "#configcells">configcells</a></b></code> commands:</dd>

    <dd>
      <dl>
        <dt class="tm" id="cell_background"><code><b>-background</b>
        <i>color</i></code> or <code><b>-bg</b> <i>color</i></code></dt>

        <dd>Specifies the normal background color to use when displaying the
        contents of the cell.</dd>

        <dt class="tm" id="cell_editable"><code><b>-editable</b>
        <i>boolean</i></code></dt>

        <dd>Specifies whether the contents of the cell can be edited
        interactively.&nbsp; The default value is <code>0</code>.&nbsp; This
        option overrides <a href="#col_editable">the one of the same name</a>
        for the column containing the given cell.</dd>

        <dt class="tm" id="cell_editwindow"><code><b>-editwindow</b>
        <i>name</i></code></dt>

        <dd>Specifies the type of the temporary embedded widget to be used for
        interactive editing of the cell's contents.&nbsp; The default value is
        <code><b>entry</b></code>.&nbsp; This option overrides <a href=
        "#col_editwindow">the one of the same name</a> for the column
        containing the given cell, and may have the same values as its
        column-related counterpart.</dd>

        <dt class="tm" id="cell_font"><code><b>-font</b>
        <i>font</i></code></dt>

        <dd>Specifies the font to use when displaying the contents of the
        cell.</dd>

        <dt class="tm" id="cell_foreground"><code><b>-foreground</b>
        <i>color</i></code> or <code><b>-fg</b> <i>color</i></code></dt>

        <dd>Specifies the normal foreground color to use when displaying the
        contents of the cell.</dd>

        <dt class="tm" id="cell_image"><code><b>-image</b>
        <i>image</i></code></dt>

        <dd>Specifies the name of the Tk image to be displayed in the
        cell.&nbsp; <code><i>image</i></code> must be the result of an
        invocation of the&nbsp; <code><b>image create</b></code>&nbsp; command,
        or an empty string, specifying that no image is to be displayed.&nbsp;
        If the column containing the cell is right-aligned then the image will
        be displayed to the right of the cell's text, otherwise to its
        left.&nbsp; The text and the image are separated from each other by a
        gap of 4 pixels.&nbsp; If for the same cell the <code><b><a href=
        "#cell_window">-window</a></b></code> option was specified with a
        nonempty value then it overrides the <code><b>-image</b></code>
        option.&nbsp; If the tablelist's <code><b><a href=
        "#state">state</a></b></code> is <code><b>disabled</b></code> then this
        option will be ignored.</dd>

        <dd class="tm">To display an image in a cell, Tablelist makes use of an
        embedded label widget (which is created on demand).&nbsp; 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.&nbsp;
        This has the visual effect of cutting off part of the image from its
        right side.&nbsp; 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
        necessary.</dd>

        <dt class="tm" id="cell_selectbackground">
        <code><b>-selectbackground</b> <i>color</i></code></dt>

        <dd>Specifies the background color to use when displaying the contents
        of the cell while it is selected.</dd>

        <dt class="tm" id="cell_selectforeground">
        <code><b>-selectforeground</b> <i>color</i></code></dt>

        <dd>Specifies the foreground color to use when displaying the contents
        of the cell while it is selected.</dd>

        <dt class="tm" id="cell_stretchwindow"><code><b>-stretchwindow</b>
        <i>boolean</i></code></dt>

        <dd>Specifies whether the width of the window embedded into the cell
        shall be adapted dynamically to the width of the cell's column if the
        latter is non-zero (i.e., static).&nbsp; The default value is
        <code>0</code>.&nbsp; If the value of this option is true and the
        column was specified with a non-zero width or was resized
        interactively, then the width of the embedded window (if any) will be
        adjusted automatically so the window fills the whole horizontal space
        belonging to that column (except the left and right margins).&nbsp;
        Please note that in this case the cell's text will remain hidden.&nbsp;
        On the other hand, if the column is of dynamic width then this option
        will be ignored and both the cell's text and its embedded window (if
        any) will be displayed as usual.&nbsp; The easiest way to avoid this
        discrepancy is to set the cell's text to an empty string or make sure
        that the column's elements are always displayed as empty strings, by
        using the <code><b><a href=
        "#col_formatcommand">-formatcommand</a></b></code> column configuration
        option.</dd>

        <dt class="tm" id="cell_text"><code><b>-text</b>
        <i>text</i></code></dt>

        <dd>Specifies the string to be displayed in the given cell, i.e.,
        updates the element contained in the cell.&nbsp; If the tablelist's
        <code><b><a href="#state">state</a></b></code> is
        <code><b>disabled</b></code> then this option will be ignored.</dd>

        <dt class="tm" id="cell_valign"><code><b>-valign</b>
        <i>verticalAlignment</i></code></dt>

        <dd>Specifies the vertical alignment of the embedded image or window
        displayed in the cell (if any).&nbsp; The default value is
        <code><b>center</b></code>.&nbsp; This option overrides <a href=
        "#col_valign">the one of the same name</a> for the column containing
        the given cell, and may have the same values as its column-related
        counterpart.</dd>

        <dt class="tm" id="cell_window"><code><b>-window</b>
        <i>command</i></code></dt>

        <dd>Specifies a Tcl command creating the window to be embedded into the
        cell.&nbsp; 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.&nbsp;
        <code><i>command</i></code> may also be an empty string, specifying
        that no embedded window is to be displayed.&nbsp; If the column
        containing the cell is right-aligned then the window will be displayed
        to the right of the cell's text, otherwise to its left.&nbsp; The text
        and the window are separated from each other by a gap of 4
        pixels.&nbsp; If this option was specified with a nonempty value then
        it overrides the <code><b><a href="#cell_image">-image</a></b></code>
        cell configuration option.&nbsp; If the tablelist's <code><b><a href=
        "#state">state</a></b></code> is <code><b>disabled</b></code> then this
        option will be ignored.</dd>

        <dd class="tm"><b>REMARK:</b>&nbsp; There are several situations where
        the embedded window will be destroyed and later recreated by invoking
        the script mentioned above.&nbsp; 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
        will be redisplayed, which makes it necessary to recreate the embedded
        windows.&nbsp; This operation won't preserve the changes made on the
        embedded windows after their creation.&nbsp; For this reason, you
        should avoid any changes on embedded windows outside their creation
        scripts.</dd>

        <dt class="tm" id="cell_windowdestroy"><code><b>-windowdestroy</b>
        <i>command</i></code></dt>

        <dd>Specifies a Tcl command to be invoked when a window embedded into
        the cell is destroyed.&nbsp; 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, and the
        resulting script is evaluated in the global scope.&nbsp; This option
        provides an easy-to-use alternative to binding a script to the embedded
        window's <code><b>&lt;Destroy&gt;</b></code> event from within its
        creation script, specified as the value of the <code><b><a href=
        "#cell_window">-window</a></b></code> cell configuration option.</dd>

        <dt class="tm" id="cell_windowupdate"><code><b>-windowupdate</b>
        <i>command</i></code></dt>

        <dd>Specifies a Tcl command responsible for adapting the background and
        foreground colors of a window embedded into the cell to the current
        background and foreground colors of the cell itself.&nbsp; The current
        cell colors depend on whether the tablelist widget's <code><b><a href=
        "#state">state</a></b></code> is <code><b>normal</b></code> or
        <code><b>disabled</b></code>, whether the cell is selected, and whether
        its row is displayed with the colors specified by the <code><b><a href=
        "#stripebackground">-stripebackground</a></b></code> and
        <code><b><a href="#stripeforeground">-stripeforeground</a></b></code>
        widget or column configuration options.&nbsp; 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 <code><b>-background</b></code> and the cell's current
        background color, as well as the option name
        <code><b>-foreground</b></code> and the cell's current foreground
        color.&nbsp; The resulting script is then evaluated in the global
        scope.&nbsp; The specified command can use the colors passed to it as
        arguments to set the corresponding colors of the embedded window to the
        same values.</dd>

        <dd class="tm">For example, if the embedded window is a text or ctext
        widget and you want for its background and foreground colors to be
        automatically adapted to the cell's current background and foreground
        colors, then you can achieve this by setting the
        <code><b>-windowupdate</b></code> cell configuration option to
        <code>updateWindow</code>, where the latter is the procedure
        implemented as follows:</dd>

        <dd>
          <blockquote>
            <pre>
proc updateWindow {tbl row col w args} {
    eval [list $w configure] $args
}
</pre>
          </blockquote>
        </dd>

        <dd>With Tcl/Tk 8.5 or above, you can use the more compact form</dd>

        <dd>
          <blockquote>
            <pre>
proc updateWindow {tbl row col w args} {
    $w configure {*}$args
}
</pre>
          </blockquote>
        </dd>

        <dd>In this example, <code>args</code> is a list of the form</dd>

        <dd>
          <blockquote>
            <pre>
-background <i>backgroundColor</i> -foreground <i>foregroundColor</i>
</pre>
          </blockquote>
        </dd>
      </dl>
    </dd>

    <dd>The <code><b>-background</b></code>, <code><b>-font</b></code>,
    <code><b>-foreground</b></code>, <code><b>-selectbackground</b></code>, and
    <code><b>-selectforeground</b></code> cell configuration options override
    the options of the same names set at row, column, or widget level if the
    specified value is not an empty string.&nbsp; See the <a href=
    "#colors_and_fonts">COLORS AND FONTS</a> section for further details on
    these options.</dd>

    <dt class="tm" id="description"><b>DESCRIPTION</b></dt>

    <dd>The <code><b>tablelist::tablelist</b></code> command creates a new
    window named <code><i>pathName</i></code> and of the class
    <code><b>Tablelist</b></code>, and makes it into a <b>tablelist</b>
    widget.&nbsp; 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.&nbsp; The
    <code><b>tablelist::tablelist</b></code> command returns its
    <code><i>pathName</i></code> argument.&nbsp; At the time this command is
    invoked, there must not exist a window named <code><i>pathName</i></code>,
    but <code><i>pathName</i></code>'s parent must exist.</dd>

    <dd class="tm">A tablelist is a multi-column listbox and tree widget,
    implemented as a mega-widget, consisting of a <b>body</b> and a
    <b>header</b>.&nbsp; The body displays a list of <b>items</b>, one per
    line.&nbsp; Each item is a list of <b>elements</b>, which are aligned in
    columns.&nbsp; In other words, an item is the contents of a row, and an
    element is the text contained in a cell.&nbsp; The header consists of label
    widgets displaying the column titles.&nbsp; The labels can be used, among
    others, for interactive column resizing and column-based sorting of the
    items, as described below.</dd>

    <dd class="tm">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.&nbsp; 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.</dd>

    <dd class="tm">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.&nbsp; The Tablelist package provides a great
    variety of tree styles controlling the look &amp; feel of that column, and
    chooses the correct default style depending on the windowing system,
    operating system version, and tile theme.&nbsp; In a tablelist used as a
    multi-column tree widget, every row is at the same time a tree <b>node</b>,
    having exactly one <b>parent</b> node and any number of <b>child</b>
    nodes.&nbsp; The tree's origin is the invisible <b>root</b> node, which has
    no parent itself and whose children are the <b>top-level</b> nodes.</dd>

    <dd class="tm">The elements of a tablelist widget can, per default, be only
    edited programmatically.&nbsp; However, interactive editing can be enabled
    for individual cells and for entire columns.&nbsp; 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.&nbsp; 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.&nbsp; In addition, a rich set of keyboard bindings
    is provided for a comfortable navigation between the editable cells.</dd>

    <dd class="tm">When first created, a new tablelist widget has no
    items.&nbsp; Items may be added, deleted, or updated using widget commands
    described below.&nbsp; In addition, one or more items or elements may be
    selected.&nbsp; If a tablelist widget is exporting its selection (see the
    <code><b>-exportselection</b></code> option), then it will observe the
    standard X11 protocols for handling the selection.&nbsp; Tablelist widget
    selections are available as types <code><b>STRING</b></code> and
    <code><b>UTF8_STRING</b></code>; the value of the selection will be a text
    built by taking all of the rows having at least one <a href=
    "#isviewable">viewable</a> selected element, joining these elements
    together with tabs, and the resulting strings in turn with newlines.&nbsp;
    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
    <code><b>&lt;&lt;TablelistSelectionLost&gt;&gt;</b></code> is
    generated.</dd>

    <dd class="tm">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.&nbsp; Tablelist widgets allow scrolling in
    both directions using the standard <code><b>-xscrollcommand</b></code> and
    <code><b>-yscrollcommand</b></code> options.&nbsp; They also support
    scanning, as described below.</dd>

    <dd class="tm">Each tablelist widget, as well as each tablelist column,
    row, and cell may have any number of <b>attributes</b>, which can be used
    in commands that create or manipulate tablelist widgets for particular
    purposes.</dd>

    <dt class="tm" id="colors_and_fonts"><b>COLORS AND FONTS</b></dt>

    <dd>The <code><b>-background</b></code>, <code><b>-font</b></code>,
    <code><b>-foreground</b></code>, <code><b>-selectbackground</b></code>, and
    <code><b>-selectforeground</b></code> options can also be specified at
    column, row, and cell level, by using the <code><b><a href=
    "#columnconfigure">columnconfigure</a></b></code> (or <code><b><a href=
    "#configcolumnlist">configcolumnlist</a></b></code>, or <code><b><a href=
    "#configcolumns">configcolumns</a></b></code>), <code><b><a href=
    "#rowconfigure">rowconfigure</a></b></code> (or <code><b><a href=
    "#configrowlist">configrowlist</a></b></code>, or <code><b><a href=
    "#configrows">configrows</a></b></code>), and <code><b><a href=
    "#cellconfigure">cellconfigure</a></b></code> (or <code><b><a href=
    "#configcelllist">configcelllist</a></b></code>, or <code><b><a href=
    "#configcells">configcells</a></b></code>) subcommands of the Tcl command
    associated with the tablelist widget.&nbsp; Likewise, the
    <code><b>-stripebackground</b></code> and
    <code><b>-stripeforeground</b></code> options can also be specified at
    column level.&nbsp; For this reason, a particular cell can have up to four
    values for one and the same color or font option.&nbsp; If these values
    conflict, then the option specified at the highest priority level is
    used.&nbsp; The decreasing priority order is cell, row, column,
    widget.</dd>

    <dd class="tm">If one of these options hasn't been specified at cell, row,
    or column level, or if its value for that level is an empty string (this is
    explicitly allowed), then that option will not be used at that particular
    level.</dd>

    <dt class="tm" id="tree_widget"><b>USING A TABLELIST AS MULTI-COLUMN TREE
    WIDGET</b></dt>

    <dd>When using a tablelist widget to display a tree hierarchy, there are a
    few rules to follow:</dd>

    <dd>
      <ol>
        <li class="tm">Do not use the the widget's <code><b><a href=
        "#listvariable">-listvariable</a></b></code> option, or at least do not
        add new items to the variable specified as its value, because adding
        new items to that list will result in inserting those list elements
        into the widget without respecting the tree's internal structure.</li>

        <li class="tm">Make sure that the column specified by the
        <code><b><a href="#treecolumn">-treecolumn</a></b></code> option is
        left-aligned so the tree structure can be displayed as expected.</li>

        <li class="tm">Use the <code><b><a href=
        "#insertchildren">insertchild(ren)</a></b></code> or <code><b><a href=
        "#insertchildlist">insertchildlist</a></b></code> subcommand rather
        than <code><b><a href="#insert">insert</a></b></code> or
        <code><b><a href="#insertlist">insertlist</a></b></code> for inserting
        new items into the widget.</li>
      </ol>
    </dd>

    <dt class="tm" id="cell_editing"><b>INTERACTIVE CELL EDITING</b></dt>

    <dd>Whether or not the contents of a cell of a tablelist widget can be
    edited interactively, depends on the <code><b>-editable</b></code> option
    on both <a href="#cell_editable">cell</a> and <a href=
    "#col_editable">column</a> level.&nbsp; If the cell-level option was set
    explicitly then its value determines the editability of the cell's
    contents.&nbsp; Otherwise the value of the column-level option is used to
    decide whether the cell can be edited interactively.&nbsp; From this rule
    it follows that you can enable interactive cell editing for a whole column
    by setting its <code><b>-editable</b></code> option to true.&nbsp; To
    exclude some of the column's cells from interactive editing, set their
    <code><b>-editable</b></code> option to false.</dd>

    <dd class="tm">The interactive cell editing is started by the
    <code><b><a href="#editcell">editcell</a></b></code> subcommand, which is
    invoked implicitly by clicking with the left mouse button into an editable
    cell (see the <code><b><a href=
    "#editselectedonly">-editselectedonly</a></b></code> option for details) or
    using keyboard navigation to move from one editable cell into
    another.&nbsp; If the selection type is <code><b>cell</b></code> and the
    location cursor is in an editable cell, then the interactive editing of the
    active element can also be started by pressing <code>Return</code> or
    <code>KP_Enter</code>.&nbsp; Per default, the <code><b>editcell</b></code>
    subcommand creates a temporary entry widget and embeds it into the cell
    whose index was passed to it as argument.&nbsp; You can, however, use the
    <code><b>-editwindow</b></code> <a href="#col_editwindow">column</a> or
    <a href="#cell_editwindow">cell</a> configuration option to specify another
    widget instead of an entry, like a Tk core text, spinbox, checkbutton, or
    menubutton widget, or a tile entry, spinbox, combobox, checkbutton, or
    menubutton, or one of the 19 currently supported widgets from the packages
    <a href="tablelistBWidget.html">BWidget</a>, <a href=
    "tablelistIwidgets.html">Iwidgets</a>, <a href=
    "tablelistCombobox.html">combobox</a> (by Bryan Oakley), <a href=
    "tablelistCtext.html">ctext</a>, and <a href="tablelistMentry.html">Mentry
    (or Mentry_tile)</a>.&nbsp; Before specifying a widget from one of these
    library packages as the value of the <code><b>-editwindow</b></code> column
    or cell configuration option, you must register it for interactive cell
    editing by invoking the corresponding <code><b>tablelist::add*</b></code>
    command.&nbsp; The above-mentioned Tk core and tile widgets are
    automatically registered for cell editing.</dd>

    <dd class="tm">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
    the latter by using the <code><b><a href=
    "#col_formatcommand">-formatcommand</a></b></code> option of the cell's
    column.&nbsp; However, if the value of the <code><b><a href=
    "#editstartcommand">-editstartcommand</a></b></code> configuration option
    is a nonempty string, then the text displayed in the cell 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 edit window's
    contents.&nbsp; From within this script you can invoke the
    <code><b><a href="#cancelediting">cancelediting</a></b></code> subcommand,
    which destroys the temporary embedded widget and cancels the editing of its
    contents.&nbsp; The main goal of this script is, however, to enable you to
    define validations for the editing process.&nbsp; This can be done either
    with the aid of the options for entry validation, supported by Tk versions
    8.3 and higher (see the <b>entry</b> reference page), or by using the
    widget callback package <a href="http://www.nemethi.de">Wcb</a>, available
    for Tk versions 8.0 and higher.&nbsp; 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.&nbsp; 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 <code><b><a href="#editwinpath">editwinpath</a></b></code> and
    <code><b><a href="#entrypath">entrypath</a></b></code> subcommands to get
    these path names.&nbsp; Another purpose of the command indicated by the
    <code><b>-editstartcommand</b></code> option is to enable you to prepare
    the edit window in various other ways.&nbsp; For example, if the latter is
    a combobox widget then you can set its <code><b>-editable</b></code> option
    to false or (for a tile combobox) set its state to
    <code><b>readonly</b></code>, and you will have to populate its listbox
    component.&nbsp; In the same script, you can change some of the embedded
    widget's visual attributes (like its background, selection background, or
    selection foreground color).&nbsp; (Notice that this can also be done with
    the aid of the Tk option database.)</dd>

    <dd class="tm">The editing of the text inserted into the edit window uses
    the widget-specific bindings for mouse and keyboard events, with a few
    extensions and changes, as described in the <a href=
    "#edit_bindings">DEFAULT BINDINGS FOR INTERACTIVE CELL EDITING</a>
    section.&nbsp; For example, in entry or entry-like components of the edit
    window, <code>Control-i</code> inserts a tab, <code>Control-j</code>
    inserts a newline, and if the edit window is a text or ctext widget then
    <code>Return</code> and <code>KP_Enter</code> insert a newline character,
    too.&nbsp; <code>Tab</code> and <code>Shift-Tab</code> are used for
    navigation between the editable cells, just like <code>Alt-Left</code>,
    <code>Alt-Right</code>, <code>Alt-Up</code>, <code>Alt-Down</code>,
    <code>Alt-Prior</code>, <code>Alt-Next</code>, <code>Alt-Home</code>, and
    <code>Alt-End</code> (as well as <code>Control-Home</code> and
    <code>Control-End</code>, except in the case of a text or ctext
    widget).&nbsp; On Mac OS Classic and Mac OS X Aqua the <code>Command</code>
    key is used instead of <code>Alt</code>.&nbsp; The editing can be aborted
    with the <code>Escape</code> key (or by invoking the <code><b><a href=
    "#cancelediting">cancelediting</a></b></code> subcommand) and terminated
    normally with <code>Return</code> or <code>KP_Enter</code> (together with
    <code>Control</code> for a text or ctext widget).&nbsp; The bindings for
    the keys used for normal termination of the editing just invoke the
    <code><b><a href="#finishediting">finishediting</a></b></code> subcommand;
    the latter can also be called explicitly to terminate the editing
    programmatically.&nbsp; Normal termination is also triggered by clicking
    with the left mouse button anywhere in the tablelist's body, outside the
    cell just being edited, or moving into another editable cell by using
    keyboard navigation.&nbsp; If the editing was started with the left mouse
    button, the edit window is a Tk or tile checkbutton, and the value of the
    <code><b><a href="#instanttoggle">-instanttoggle</a></b></code> option is
    true, then the normal termination of the editing will take place
    automatically, without any user interaction.</dd>

    <dd class="tm">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.&nbsp; If they are equal then the
    embedded widget is destroyed and the cell's original value is
    restored.&nbsp; If the two strings are different and the value of the
    <code><b><a href="#editendcommand">-editendcommand</a></b></code>
    configuration option is a nonempty string, then the edit window'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 internal contents after destroying the temporary
    embedded widget.&nbsp; The main goal of this script is to enable you to do
    a final validation of the edit window's contents.&nbsp; From within this
    script you can invoke the <code><b><a href=
    "#rejectinput">rejectinput</a></b></code> 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.&nbsp; Another purpose of the command indicated by the
    <code><b>-editendcommand</b></code> option is to convert the edit window's
    text to the cell's new <i>internal</i> contents, which is necessary if, due
    to the <code><b><a href="#col_formatcommand">-formatcommand</a></b></code>
    column configuration option, the cell's internal value is different from
    its external representation.&nbsp; See the description of the
    <code><b><a href="#forceeditendcommand">-forceeditendcommand</a></b></code>
    option for more about the invocation of the command mentioned above.</dd>

    <dt class="tm" id="drag_and_drop_support"><b>DRAG &amp; DROP
    SUPPORT</b></dt>

    <dd>As <a href="#global_drag_and_drop">described in detail</a> in the
    "DEFAULT AND INDIVIDUAL BINDINGS FOR THE TABLELIST BODY" section, the
    default binding scripts perform an automatic drag-friendly handling of the
    selection and of pointer movements with mouse button 1 down if the
    tablelist widget's <code><b><a href=
    "#customdragsource">-customdragsource</a></b></code> opton was set to true
    or its body component was registered as a drag source for mouse button 1
    via the&nbsp; <code><b>tkdnd::drag_source register</b></code>&nbsp; or the
    BWidget <code><b>DragSite::register</b></code> command.</dd>

    <dd class="tm">On the other hand, you can also register a tablelist widget
    as a TkDND drop target, by invoking the&nbsp; <code><b>tkdnd::drop_target
    register</b></code>&nbsp; command.&nbsp; Similarly, you can register the
    body component of a tablelist widget as a drop target for the drag &amp;
    drop framework included in BWidget, with the aid of the
    <code><b>DropSite::register</b></code> command.&nbsp; (Notice that for
    BWidget it is necessary to register the tablelist's <i>body</i> rather than
    the widget itself.)</dd>

    <dd class="tm">The action to be triggered by a drop event over a tablelist
    widget might depend on the row under the mouse and the vertical position of
    the mouse pointer within the containing row (if any).&nbsp; For example,
    your application might insert one or more new siblings before or after the
    row in question, or a child item having that row as parent, depending on
    the vertical position of the mouse pointer within the containing row.&nbsp;
    Alternatively, the drop event might update the item under the mouse, using
    the data associated with the drag source, or perform some other,
    application-specific action.&nbsp; In any case, you can significantly
    increase the user-friendliness of your application by displaying a target
    indicator (a horizontal gap or vertical bar) before or inside the row that
    will be affected by the drop.&nbsp; The examples below demonstrate how to
    achieve this for a tablelist widget <code>$tbl</code> with the aid of the
    <code><b><a href="#showtargetmark">showtargetmark</a></b></code>,
    <code><b><a href="#hidetargetmark">hidetargetmark</a></b></code>,
    <code><b><a href="#targetmarkpos">targetmarkpos</a></b></code>, and
    <code><b><a href="#targetmarkpath">targetmarkpath</a></b></code>
    subcommands.</dd>

    <dd class="tm">
      <b>TkDND EXAMPLE:</b>&nbsp; For an introduction to TkDND see the online
      <a href="http://wiki.tcl.tk/36708">TkDND Tutorial</a> by Georgios
      Petasis.&nbsp; For the following example it is strongly recommended to
      use TkDND version 2.7 or later, which can be downloaded from the location
      
      <blockquote>
        <address>
          <a href=
          "http://sourceforge.net/projects/tkdnd/files/">http://sourceforge.net/projects/tkdnd/files/</a>
        </address>
      </blockquote>

      <blockquote>
        <pre>
package require tkdnd 2.7

tkdnd::drop_target register $tbl DND_Text

bind $tbl &lt;&lt;DropEnter&gt;&gt;    { onTblDropEnterOrPos %W %X %Y %a %b }
bind $tbl &lt;&lt;DropPosition&gt;&gt; { onTblDropEnterOrPos %W %X %Y %a %b }
bind $tbl &lt;&lt;DropLeave&gt;&gt;    { %W <a href=
"#hidetargetmark">hidetargetmark</a> }
bind $tbl &lt;&lt;Drop&gt;&gt;         { onTblDrop %W %A %D }

proc onTblDropEnterOrPos {tbl rootX rootY actions buttons} {
    global place row
    set y [expr {$rootY - [winfo rooty $tbl]}]
    foreach {place row} [$tbl <a href="#targetmarkpos">targetmarkpos</a> $y] {}

    if {<i>some_optional_excluding_condition</i>} {
        $tbl <a href="#hidetargetmark">hidetargetmark</a>
        return refuse_drop
    } else {
        $tbl <a href="#showtargetmark">showtargetmark</a> $place $row
        return copy ;<i># for example</i>
    }
}

proc onTblDrop {tbl action data} {
    <span>handleTblDrop</span> $tbl $data
    return $action
}
</pre>
      </blockquote>
    </dd>

    <dd class="tm">
      <b>BWidget EXAMPLE:</b>&nbsp; For an introduction to drag &amp; drop with
      BWidget see the online tutorial <a href=
      "http://wiki.tcl.tk/16126">BWidget example: Drag and Drop Demo</a> by
      Kevin Walzer.&nbsp; The <code><b>DropSite::*</b></code> commands used in
      the following example are described in the "DropSite" reference page
      included in the BWidget distribution.&nbsp; When using this drag &amp;
      drop framework, you will have to register not only the tablelist's body,
      but also its target indicator as drop sites, to make sure that the target
      mark won't get hidden by moving the mouse cursor over it with mouse
      button 1 down:

      <blockquote>
        <pre>
package require BWidget

foreach w [list [$tbl <a href="#bodypath">bodypath</a>] [$tbl <a href=
"#targetmarkpath">targetmarkpath</a>]] {
    DropSite::register $w -dropovercmd tblDropOverCmd -dropcmd tblDropCmd \
        -droptypes ...
}

proc tblDropOverCmd {dropTarget dragSrc event rootX rootY op dataType data} {
    <i># $event may be "enter", "motion", or "leave"</i>
    set tbl [<a href="tablelistBinding.html#getTablelistPath">tablelist::getTablelistPath</a> $dropTarget]
    if {[string equal $event "leave"]} {
        set newWidget [winfo containing -displayof $dropTarget $rootX $rootY]
        if {![string equal $newWidget [$tbl <a href="#targetmarkpath">targetmarkpath</a>]] &amp;&amp;
            ![string equal $newWidget [$tbl <a href="#bodypath">bodypath</a>]]} {
            $tbl <a href="#hidetargetmark">hidetargetmark</a>
            return 2 ;<i># refuse the drop and re-invoke the callback on motion events</i>
        }
    }
    
    global place row
    set y [expr {$rootY - [winfo rooty $tbl]}]
    foreach {place row} [$tbl <a href="#targetmarkpos">targetmarkpos</a> $y] {}

    if {<i>some_optional_excluding_condition</i>} {
        $tbl <a href="#hidetargetmark">hidetargetmark</a>
        DropSite::setcursor dot
        return 2 ;<i># refuse the drop and re-invoke the callback on motion events</i>
    } else {
        $tbl <a href="#showtargetmark">showtargetmark</a> $place $row
        DropSite::setcursor based_arrow_down
        return 3 ;<i># accept the drop and re-invoke the callback on motion events</i>
    }
}

proc tblDropCmd {dropTarget dragSrc rootX rootY op dataType data} {
    set tbl [<a href="tablelistBinding.html#getTablelistPath">tablelist::getTablelistPath</a> $dropTarget]
    <span>handleTblDrop</span> $tbl $data
    return ""
}
</pre>
      </blockquote>
    </dd>

    <dd class="tm">
      In both examples above, you can restrict the type of the supported drop
      target indicator by appending the argument
      <code><b>-horizontal</b></code> or <code><b>-vertical</b></code> to the
      <a href="#targetmarkpos">targetmarkpos</a> invocation.&nbsp; When passing
      the <code><b>-vertical</b></code> option, you will have to extend the
      <code><b>if</b></code> statement following that subcommand invocation as
      follows:

      <blockquote>
        <pre>
    if {$row &lt; 0 || <i>some_optional_excluding_condition</i>} {
</pre>
      </blockquote>
    </dd>

    <dd class="tm">
      Both examples above invoke the <code>handleTblDrop</code> procedure,
      implemented as follows:

      <blockquote>
        <pre>
proc handleTblDrop {tbl data} {
    $tbl <a href="#hidetargetmark">hidetargetmark</a>
    global place row

    if {[string equal $place "before"]}
        if {$row &lt; [$tbl <a href="#size">size</a>]} {
            <i># 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 <a href="#insert">insert</a> $row ...]")</i>
            set key [$tbl <a href="#insertchildren">insertchild</a> [$tbl <a href="#parentkey">parentkey</a> $row] \
                     [$tbl <a href="#childindex">childindex</a> $row] ...]
        } else {
            <i># Append a top-level item built from $data
            # (For a flat tablelist replace the following line with
            # "set key [$tbl <a href="#insert">insert</a> end ...]")</i>
            set key [$tbl <a href="#insertchildren">insertchild</a> root end ...]
        }
    } else { ;<i># "inside"</i>
        <i># Insert a child of the item indicated by $row, built from $data
        # Alternatively, update the item indicated by $row, using $data</i>
        set key [$tbl <a href="#insertchildren">insertchild</a> $row 0 ...]
        $tbl <a href="#expand">expand</a> $row -partly
    }

    . . .
}
</pre>
      </blockquote>
    </dd>

    <dt class="tm" id="virtual_events"><b>VIRTUAL EVENTS</b></dt>

    <dd>Tablelist defines a few virtual events for the purposes of
    notification, and makes use of the&nbsp; <code><b>event
    generate</b></code>&nbsp; command to send them to the tablelist widget in
    question (whose path name will be the value of the <code><b>%W</b></code>
    substitution in event scripts).&nbsp; When using Tk 8.5 or above, most of
    these virtual events are generated with their <code><b>-data</b></code>
    option set to an appropriate event-specific value.&nbsp; Binding scripts
    can access this user data as the value of the <code><b>%d</b></code>
    substitution.&nbsp; Unfortunately, the <code><b>-data</b></code> option
    to&nbsp; <code><b>event generate</b></code>&nbsp; was not supported by Tk
    versions earlier than 8.5.&nbsp; For these Tk versions, the&nbsp;
    <code><b>event generate</b></code>&nbsp; command will be invoked without
    the <code><b>-data</b></code> option.</dd>

    <dd class="tm">The virtual events generated by Tablelist are as
    follows:</dd>

    <dd class="tm">
      <table border="2" cellspacing="0" cellpadding="3">
        <tr bgcolor="#FFFFE0">
          <th align="left">Virtual Event</th>

          <th align="left">Description</th>

          <th align="left">User Data (for Tk 8.5 or Later)</th>
        </tr>

        <tr valign="top">
          <td><code><b>&lt;&lt;TablelistCellRestored&gt;&gt;</b></code></td>

          <td>Generated by the <code><b><a href=
          "#cancelediting">cancelediting</a></b></code> subcommand.</td>

          <td>A list consisting of the numerical row and column indices of the
          cell whose content is being edited.</td>
        </tr>

        <tr valign="top">
          <td><code><b>&lt;&lt;TablelistCellUpdated&gt;&gt;</b></code></td>

          <td>Generated by the <code><b><a href=
          "#finishediting">finishediting</a></b></code> subcommand.</td>

          <td>A list consisting of the numerical row and column indices of the
          cell whose content is being edited.</td>
        </tr>

        <tr valign="top">
          <td>
          <code><b>&lt;&lt;TablelistColHiddenStateChanged&gt;&gt;</b></code></td>

          <td>Generated whenever the hidden state of one or more columns is
          toggled by using the <code><b><a href=
          "#columnconfigure">columnconfigure</a></b></code>, <code><b><a href=
          "#configcolumnlist">configcolumnlist</a></b></code>,
          <code><b><a href="#configcolumns">configcolumns</a></b></code>, or
          <code><b><a href="#togglecolumnhide">togglecolumnhide</a></b></code>
          subcommand.</td>

          <td>A list consisting of the numerical indices of the columns whose
          hidden state changed.</td>
        </tr>

        <tr valign="top">
          <td><code><b>&lt;&lt;TablelistColumnMoved&gt;&gt;</b></code></td>

          <td>Generated by the default bindings whenever a column is moved
          interactively to a new position.</td>

          <td>A list of length 4, whose first two elements are identical to the
          two arguments passed to the <code><b><a href=
          "#movecolumn">movecolumn</a></b></code> subcommand invoked for moving
          the source column to the target position, and the last two elements
          are the corresponding column names, retrieved with the aid of
          the&nbsp; <code><b><a href="#columncget">columncget</a> ...
          -name</b></code>&nbsp; subcommand.</td>
        </tr>

        <tr valign="top">
          <td><code><b>&lt;&lt;TablelistColumnResized&gt;&gt;</b></code></td>

          <td>Generated by the default bindings whenever a column is resized
          interactively.</td>

          <td>The numerical index of the column that was resized.</td>
        </tr>

        <tr valign="top">
          <td><code><b>&lt;&lt;TablelistColumnSorted&gt;&gt;</b></code></td>

          <td>Generated by the <code><b><a href=
          "tablelistColSort.html#sortByColumn">tablelist::sortByColumn</a></b></code>
          command.</td>

          <td>A list consisting of the numerical column index and the sort
          order (<code><b>decreasing</b></code> or
          <code><b>increasing</b></code>).</td>
        </tr>

        <tr valign="top">
          <td><code><b>&lt;&lt;TablelistColumnsSorted&gt;&gt;</b></code></td>

          <td>Generated by the <code><b><a href=
          "tablelistColSort.html#addToSortColumns">tablelist::addToSortColumns</a></b></code>
          command.</td>

          <td>A list consisting of the two lists passed to the
          <code><b><a href="tablelistWidget.html#sortbycolumnlist">sortbycolumnlist</a></b></code>
          subcommand, invoked to perform the multi-column sorting.</td>
        </tr>

        <tr valign="top">
          <td>
          <code><b>&lt;&lt;TablelistRowHiddenStateChanged&gt;&gt;</b></code></td>

          <td>Generated whenever the hidden state of one or more rows is
          toggled by using the <code><b><a href=
          "#rowconfigure">rowconfigure</a></b></code>, <code><b><a href=
          "#configrowlist">configrowlist</a></b></code>, <code><b><a href=
          "#configrows">configrows</a></b></code>, or <code><b><a href=
          "#togglerowhide">togglerowhide</a></b></code> subcommand.</td>

          <td>A list consisting of the numerical indices of the rows whose
          hidden state changed.</td>
        </tr>

        <tr valign="top">
          <td><code><b>&lt;&lt;TablelistRowMoved&gt;&gt;</b></code></td>

          <td>Generated by the default bindings whenever a row is moved
          interactively to a new position.</td>

          <td>A list of length 3, whose elements are derived from the arguments
          passed to the second form of the <code><b><a href=
          "#move">move</a></b></code> subcommand invoked for moving the source
          row to the target position.&nbsp; The first list element will be the
          full key corresponding to the first argument, the second one will be
          <code><b>root</b></code> or the full key corresponding to the second
          argument, and the third list element will be identical to the third
          argument passed to the <code><b>move</b></code> subcommand.</td>
        </tr>

        <tr valign="top">
          <td><code><b>&lt;&lt;TablelistSelect&gt;&gt;</b></code>,
          <code><b>&lt;&lt;ListboxSelect&gt;&gt;</b></code></td>

          <td>Generated by the default bindings whenever the selection changes
          in the tablelist widget due to user interaction.</td>

          <td>Not used.</td>
        </tr>

        <tr valign="top">
          <td><code><b>&lt;&lt;TablelistSelectionLost&gt;&gt;</b></code></td>

          <td>Sent to the tablelist widget whenever it loses ownership of the
          PRIMARY selection.</td>

          <td>Not used.</td>
        </tr>
      </table>
    </dd>

    <dt class="tm" id="row_indices"><b>ROW INDICES</b></dt>

    <dd>Many of the widget commands for tablelist widgets take one or more row
    indices as arguments.&nbsp; A row index specifies a particular item of the
    tablelist, in any of the following ways:</dd>

    <dd class="tm">
      <table border="0" cellpadding="6" cellspacing="0">
        <tr valign="top">
          <td><code><i>number</i></code></td>

          <td>Specifies the item as a numerical index, where <code>0</code>
          corresponds to the first item in the tablelist.</td>
        </tr>

        <tr valign="top">
          <td><code><b>k</b><i>number</i></code></td>

          <td>Specifies the item by its full key, composed of the letter
          <code><b>k</b></code> and the sequence number associated with the
          item.&nbsp; You can use the <code><b><a href=
          "#getkeys">getkeys</a></b></code> widget command to get this sequence
          number, or the <code><b><a href=
          "#getfullkeys">getfullkeys</a></b></code> widget command to retrieve
          the full key.&nbsp; In addition, the <code><b><a href=
          "#insert">insert</a></b></code>, <code><b><a href=
          "#insertlist">insertlist</a></b></code>, <code><b><a href=
          "#insertchildren">insertchildren</a></b></code>, and
          <code><b><a href="#insertchildlist">insertchildlist</a></b></code>
          subcommands return the list of full keys associated with the items
          just inserted.</td>
        </tr>

        <tr valign="top">
          <td><code><b>active</b>&nbsp;&nbsp;&nbsp;</code></td>

          <td>Indicates the item containing the element that has the location
          cursor.&nbsp; Depending on the selection type, this item as a whole
          or just its element having the location cursor will be displayed
          according to the value of the <code><b><a href=
          "#activestyle">-activestyle</a></b></code> configuration option when
          the tablelist has the keyboard focus.&nbsp; This item is specified
          with the <code><b><a href="#activate">activate</a></b></code> widget
          command or as the row containing the element specified with the
          <code><b><a href="#activatecell">activatecell</a></b></code> widget
          command.</td>
        </tr>

        <tr valign="top">
          <td><code><b>anchor</b></code></td>

          <td>Indicates the anchor point for the row selection, which is set
          with the&nbsp; <code><b><a href="#selection">selection
          anchor</a></b></code>&nbsp; widget command, or the row containing the
          anchor point for the cell selection, which is set with the&nbsp;
          <code><b><a href="#cellselection">cellselection
          anchor</a></b></code>&nbsp; widget command.</td>
        </tr>

        <tr valign="top">
          <td><code><b>end</b></code></td>

          <td>Indicates the end of the tablelist.&nbsp; For most commands this
          refers to the last item in the tablelist, but for a few commands such
          as <code><b><a href="#index">index</a></b></code>, <code><b><a href=
          "#insert">insert</a></b></code>, <code><b><a href=
          "#insertlist">insertlist</a></b></code>, and&nbsp; <code><b><a href=
          "#showtargetmark">showtargetmark before</a></b></code>,&nbsp; as well
          as for the target of the <code><b><a href="#move">move</a></b></code>
          command it refers to the item just after the last one.</td>
        </tr>

        <tr valign="top">
          <td><code><b>last</b></code></td>

          <td>Indicates the last item of the tablelist.</td>
        </tr>

        <tr valign="top">
          <td><code><b>top</b></code></td>

          <td>Indicates the topmost item visible in the tablelist window.</td>
        </tr>

        <tr valign="top">
          <td><code><b>bottom</b></code></td>

          <td>Indicates the bottommost item visible in the tablelist
          window.</td>
        </tr>

        <tr valign="top">
          <td><code><b>@</b><i>x</i><b>,</b><i>y</i></code></td>

          <td>Indicates the item that covers the point in the tablelist window
          specified by <code><i>x</i></code> and <code><i>y</i></code> (in
          pixel coordinates).&nbsp; If no item covers that point, then the
          closest item to that point is used.&nbsp; The coordinates
          <code><i>x</i></code> and <code><i>y</i></code> are expected to be
          relative to the tablelist window itself (not its body
          component).</td>
        </tr>

        <tr valign="top">
          <td><code><i>name</i></code></td>

          <td>Specifies the row by the value of its <code><b><a href=
          "#row_name">-name</a></b></code> configuration option.&nbsp;
          <code><i>name</i></code> must be different from all the above row
          indices, and should be unique (if several rows have the same name
          then this value is considered to indicate the first matching
          row).</td>
        </tr>
      </table>
    </dd>

    <dd class="tm">In the widget command descriptions below, arguments named
    <code><i>index</i></code>, <code><i>first</i></code>,
    <code><i>last</i></code>, <code><i>sourceIndex</i></code>, and
    <code><i>targetIndex</i></code> always contain row indices in one of the
    above forms.</dd>

    <dt class="tm" id="node_indices"><b>NODE INDICES</b></dt>

    <dd>Many of the widget commands for tablelist widgets take a node index as
    argument.&nbsp; A node index is either the word <code><b>root</b></code>,
    denoting the invisible root node of a tablelist used as a tree widget, or a
    regular row index in one of the above forms, specifying a particular item
    of the tablelist.</dd>

    <dd class="tm">In the widget command descriptions below, arguments named
    <code><i>nodeIndex</i></code>, <code><i>parentNodeIndex</i></code>, and
    <code><i>targetParentNodeIndex</i></code> always contain node indices.</dd>

    <dt class="tm" id="col_indices"><b>COLUMN INDICES</b></dt>

    <dd>Many of the widget commands for tablelist widgets take one or more
    column indices as arguments.&nbsp; A column index specifies a particular
    column of the tablelist, in any of the following ways:</dd>

    <dd class="tm">
      <table border="0" cellpadding="6" cellspacing="0">
        <tr valign="top">
          <td><code><i>number</i></code></td>

          <td>Specifies the column as a numerical index, where <code>0</code>
          corresponds to the first column in the tablelist.</td>
        </tr>

        <tr valign="top">
          <td><code><b>active</b>&nbsp;&nbsp;&nbsp;</code></td>

          <td>Indicates the column containing the element that has the location
          cursor.&nbsp; If the selection type is <code><b>cell</b></code> then
          this element will be displayed according to the value of the
          <code><b><a href="#activestyle">-activestyle</a></b></code>
          configuration option when the tablelist has the keyboard focus.&nbsp;
          This element is specified with the <code><b><a href=
          "#activatecell">activatecell</a></b></code> widget command.</td>
        </tr>

        <tr valign="top">
          <td><code><b>anchor</b></code></td>

          <td>Indicates the column containing the anchor point for the cell
          selection, which is set with the&nbsp; <code><b><a href=
          "#cellselection">cellselection anchor</a></b></code>&nbsp; widget
          command.</td>
        </tr>

        <tr valign="top">
          <td><code><b>end</b></code></td>

          <td>Indicates the last column of the tablelist, except for the
          commands <code><b><a href=
          "#insertcolumns">insertcolumns</a></b></code> and <code><b><a href=
          "#insertcolumnlist">insertcolumnlist</a></b></code>, as well as for
          the target of the <code><b><a href=
          "#movecolumn">movecolumn</a></b></code> command, in which cases it
          refers to the column just after the last one.</td>
        </tr>

        <tr valign="top">
          <td><code><b>last</b></code></td>

          <td>Indicates the last column of the tablelist.</td>
        </tr>

        <tr valign="top">
          <td><code><b>left</b></code></td>

          <td>Indicates the leftmost column visible in the tablelist
          window.</td>
        </tr>

        <tr valign="top">
          <td><code><b>right</b></code></td>

          <td>Indicates the rightmost column visible in the tablelist
          window.</td>
        </tr>

        <tr valign="top">
          <td><code><b>@</b><i>x</i><b>,</b><i>y</i></code></td>

          <td>Indicates the column that covers the point in the tablelist
          window specified by <code><i>x</i></code> and <code><i>y</i></code>
          (in pixel coordinates).&nbsp; If no column covers that point, then
          the closest column to that point is used.&nbsp; The coordinates
          <code><i>x</i></code> and <code><i>y</i></code> are expected to be
          relative to the tablelist window itself (not its body
          component).</td>
        </tr>

        <tr valign="top">
          <td><code><i>name</i></code></td>

          <td>Specifies the column by the value of its <code><b><a href=
          "#col_name">-name</a></b></code> configuration option.&nbsp;
          <code><i>name</i></code> must be different from all the above column
          indices, and should be unique (if several columns have the same name
          then this value is considered to indicate the first matching
          column).</td>
        </tr>
      </table>
    </dd>

    <dd class="tm">In the widget command descriptions below, arguments named
    <code><i>columnIndex</i></code>, <code><i>firstColumn</i></code>,
    <code><i>lastColumn</i></code>, <code><i>sourceColumn</i></code>, and
    <code><i>targetColumn</i></code> always contain column indices in one of
    the above forms.</dd>

    <dt class="tm" id="cell_indices"><b>CELL INDICES</b></dt>

    <dd>Many of the widget commands for tablelist widgets take one or more cell
    indices as arguments.&nbsp; A cell index specifies a particular cell of the
    tablelist, in any of the following ways:</dd>

    <dd class="tm">
      <table border="0" cellpadding="6" cellspacing="0">
        <tr valign="top">
          <td><code><i>row</i><b>,</b><i>col</i></code></td>

          <td>Indicates the cell having the row index <code><i>row</i></code>
          and column index <code><i>col</i></code>.&nbsp;
          <code><i>row</i></code> may be a number, a full key (of the form
          <code><b>k</b><i>number</i></code>), <code><b>active</b></code>,
          <code><b>anchor</b></code>, <code><b>end</b></code> (where the latter
          indicates the last row in the tablelist), <code><b>last</b></code>,
          <code><b>top</b></code>, <code><b>bottom</b></code>, or a row
          name.&nbsp; <code><i>col</i></code> may be a number,
          <code><b>active</b></code>, <code><b>anchor</b></code>,
          <code><b>end</b></code>, <code><b>last</b></code>,
          <code><b>left</b></code>, <code><b>right</b></code>, or a column
          name.</td>
        </tr>

        <tr valign="top">
          <td><code><b>active</b>&nbsp;&nbsp;&nbsp;</code></td>

          <td>Indicates the element that has the location cursor.&nbsp; If the
          selection type is <code><b>cell</b></code> then this element will be
          displayed according to the value of the <code><b><a href=
          "#activestyle">-activestyle</a></b></code> configuration option when
          the tablelist has the keyboard focus.&nbsp; This element is specified
          with the <code><b><a href="#activatecell">activatecell</a></b></code>
          widget command.</td>
        </tr>

        <tr valign="top">
          <td><code><b>anchor</b></code></td>

          <td>Indicates the anchor point for the cell selection, which is set
          with the&nbsp; <code><b><a href="#cellselection">cellselection
          anchor</a></b></code>&nbsp; widget command.</td>
        </tr>

        <tr valign="top">
          <td><code><b>end</b></code></td>

          <td>Indicates the last cell in the last row of the tablelist.</td>
        </tr>

        <tr valign="top">
          <td><code><b>last</b></code></td>

          <td>Indicates the last cell in the last row of the tablelist (same as
          <code><b>end</b></code>).</td>
        </tr>

        <tr valign="top">
          <td><code><b>@</b><i>x</i><b>,</b><i>y</i></code></td>

          <td>Indicates the cell that covers the point in the tablelist window
          specified by <code><i>x</i></code> and <code><i>y</i></code> (in
          pixel coordinates).&nbsp; If no cell covers that point, then the
          closest cell to that point is used.&nbsp; The coordinates
          <code><i>x</i></code> and <code><i>y</i></code> are expected to be
          relative to the tablelist window itself (not its body
          component).</td>
        </tr>
      </table>
    </dd>

    <dd class="tm">In the widget command descriptions below, arguments named
    <code><i>cellIndex</i></code>, <code><i>firstCell</i></code>, and
    <code><i>lastCell</i></code> always contain cell indices in one of the
    above forms.</dd>

    <dt class="tm" id="widget_command"><b>WIDGET COMMAND</b></dt>

    <dd>
      The <code><b>tablelist::tablelist</b></code> command creates a new Tcl
      command whose name is <code><i>pathName</i></code>.&nbsp; This command
      may be used to invoke various operations on the widget.&nbsp; It has the
      following general form:

      <blockquote>
        <pre>
<i>pathName</i> <i>option</i> ?<i>arg</i> <i>arg</i> ...?
</pre>
      </blockquote>
    </dd>

    <dd><code><i>option</i></code> and the <code><i>arg</i></code>s determine
    the exact behavior of the command.&nbsp; The following commands are
    possible for tablelist widgets:</dd>

    <dd>
      <dl>
        <dt class="tm" id="activate"><code><i>pathName</i> <b>activate</b>
        <i>index</i></code></dt>

        <dd>Sets the active item to the one indicated by
        <code><i>index</i></code> if the tablelist's <code><b><a href=
        "#state">state</a></b></code> is not
        <code><b>disabled</b></code>.&nbsp; If <code><i>index</i></code> is
        outside the range of items in the tablelist or it refers to a
        non-<a href="#isviewable">viewable</a> item then the closest viewable
        item is activated.&nbsp; The active item is drawn as specified by the
        <code><b><a href="#activestyle">-activestyle</a></b></code>
        configuration option when the widget has the input focus and the
        selection type is <code><b>row</b></code>.&nbsp; Its index may be
        retrieved with the index <code><b>active</b></code>.&nbsp; Returns an
        empty string.</dd>

        <dt class="tm" id="activatecell"><code><i>pathName</i>
        <b>activatecell</b> <i>cellIndex</i></code></dt>

        <dd>Sets the active element to the one indicated by
        <code><i>cellIndex</i></code> if the tablelist's <code><b><a href=
        "#state">state</a></b></code> is not
        <code><b>disabled</b></code>.&nbsp; If <code><i>cellIndex</i></code> is
        outside the range of elements in the tablelist or it refers to a
        non-<a href="#isviewable">viewable</a> element, then the closest
        viewable element is activated.&nbsp; The active element is drawn as
        specified by the <code><b><a href=
        "#activestyle">-activestyle</a></b></code> configuration option when
        the widget has the input focus and the selection type is
        <code><b>cell</b></code>.&nbsp; Its index may be retrieved with the
        cell index <code><b>active</b></code>.&nbsp; Returns an empty
        string.</dd>

        <dt class="tm" id="applysorting"><code><i>pathName</i>
        <b>applysorting</b> <i>itemList</i></code></dt>

        <dd>Sorts the elements of <code><i>itemList</i></code> according to the
        parameters of the most recent <code><b><a href=
        "#sort">sort</a></b></code>, <code><b><a href=
        "#sortbycolumn">sortbycolumn</a></b></code>, or <code><b><a href=
        "#sortbycolumnlist">sortbycolumnlist</a></b></code> invocation and
        returns a new list in sorted order.&nbsp; The
        <code><i>itemList</i></code> argument is supposed to be a well-formed
        list of lists, where the length of each sublist is expected to be no
        less than the number of columns of the tablelist widget.&nbsp; If the
        items haven't been sorted at all, or the sort information was reset by
        invoking <code><b><a href=
        "#resetsortinfo">resetsortinfo</a></b></code>, then no sorting takes
        place and the return value will be identical to
        <code><i>itemList</i></code>.</dd>

        <dd class="tm"><b>REMARK:</b>&nbsp; This subcommand is usually invoked
        from within the command specified as the value of the <code><b><a href=
        "#expandcommand">-expandcommand</a></b></code> configuration option,
        for a tablelist row whose children have not yet been inserted into the
        widget.&nbsp; The most efficient way to insert the child items in the
        correct order is to add them to a list, sort this list via
        <code><b>applysorting</b></code>, and then insert the items of the
        sorted list by invoking the <code><b><a href=
        "#insertchildlist">insertchildlist</a></b></code> subcommand.</dd>

        <dt class="tm" id="attrib"><code><i>pathName</i> <b>attrib</b>
        ?<i>name</i>? ?<i>value</i> <i>name</i> <i>value</i> ...?</code></dt>

        <dd>Queries or modifies the attributes of the widget.&nbsp; If no
        <code><i>name</i></code> is specified, the command returns a list of
        pairs, each of which contains the name and the value of an attribute
        for <code><i>pathName</i></code>.&nbsp; If <code><i>name</i></code> is
        specified with no <code><i>value</i></code>, then the command returns
        the value of the one named attribute, or an empty string if no
        corresponding value exists (you can use the <code><b><a href=
        "#hasattrib">hasattrib</a></b></code> subcommand to distinguish this
        case from the one that the value of an <i>existing</i> attribute is an
        empty string).&nbsp; If one or more
        <code><i>name</i></code>-<code><i>value</i></code> pairs are specified,
        then the command sets the given widget attribute(s) to the given
        value(s); in this case the return value is an empty string.&nbsp;
        <code><i>name</i></code> may be an arbitrary string.</dd>

        <dt class="tm" id="bbox"><code><i>pathName</i> <b>bbox</b>
        <i>index</i></code></dt>

        <dd>Returns a list of four numbers describing the bounding box of the
        row given by <code><i>index</i></code>.&nbsp; The first two elements of
        the list give the x and y coordinates of the upper-left corner of the
        screen area covered by the row (specified in pixels relative to the
        widget) and the last two elements give the width and height of the
        area, in pixels.&nbsp; If no part of the row given by
        <code><i>index</i></code> is visible on the screen, or if
        <code><i>index</i></code> refers to a non-existent row, then the result
        is an empty string; if the row is partially visible, the result gives
        the full area of the row, including any parts that are not
        visible.</dd>

        <dt class="tm" id="bodypath"><code><i>pathName</i>
        <b>bodypath</b></code></dt>

        <dd>Returns the path name of the body component of the widget.</dd>

        <dt class="tm" id="bodytag"><code><i>pathName</i>
        <b>bodytag</b></code></dt>

        <dd>Returns the name of a binding tag whose name depends on the path
        name of the tablelist widget and which is associated with the
        tablelist's body, the separators, as well as the message and label
        widgets used for displaying multi-line elements and images,
        respectively.&nbsp; This binding tag precedes the tag <code><b><a href=
        "#body_bindings">TablelistBody</a></b></code> 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.&nbsp; The main advantage of using this tag instead of the path
        name of the tablelist's body is that it enables you to write event
        handling scripts that are valid not only for the tablelist's body but
        also for the separators, multi-line cells, and embedded images.</dd>

        <dt class="tm" id="canceledediting"><code><i>pathName</i>
        <b>canceledediting</b></code></dt>

        <dd>Returns the value <code>1</code> if the most recent interactive
        cell editing was canceled (by the user or programmatically, with the
        aid of the <code><b><a href=
        "#cancelediting">cancelediting</a></b></code> subcommand) and
        <code>0</code> otherwise.</dd>

        <dd class="tm"><b>REMARK:</b>&nbsp; By invoking this subcommand from
        within the Tcl command specified by the <code><b><a href=
        "#editendcommand">-editendcommand</a></b></code> configuration option,
        you can find out whether the editing session was canceled or terminated
        normally.&nbsp; Remember that this Tcl command will be invoked in both
        cases mentioned above if the <code><b><a href=
        "#forceeditendcommand">-forceeditendcommand</a></b></code> option was
        set to true.</dd>

        <dt class="tm" id="cancelediting"><code><i>pathName</i>
        <b>cancelediting</b></code></dt>

        <dd>This subcommand cancels the interactive editing of the contents of
        the cell whose index was passed to the <code><b><a href=
        "#editcell">editcell</a></b></code> subcommand, destroys the temporary
        widget embedded into the cell, and restores the original cell
        contents.&nbsp; This command enables you to cancel the interactive cell
        editing from within the Tcl command specified by the <code><b><a href=
        "#editstartcommand">-editstartcommand</a></b></code> configuration
        option if that pre-edit callback encounters an error when preparing the
        text to be inserted into the edit window.&nbsp; The command is also
        invoked implicitly by pressing the <code>Escape</code> key when a cell
        is being edited.&nbsp; The return value is an empty string.&nbsp;
        Immediately before returning this value, the command generates the
        virtual event
        <code><b>&lt;&lt;TablelistCellRestored&gt;&gt;</b></code>.&nbsp; For Tk
        versions 8.5 or higher, this virtual event is generated with its
        <code><b>-data</b></code> option set to a list consisting of the
        numerical row and column indices of the cell whose content is being
        edited.&nbsp; If no cell was being edited when the command was invoked
        then an empty string is returned without generating a virtual
        event.</dd>

        <dt class="tm" id="cellattrib"><code><i>pathName</i> <b>cellattrib</b>
        <i>cellIndex</i> ?<i>name</i>? ?<i>value</i> <i>name</i> <i>value</i>
        ...?</code></dt>

        <dd>Queries or modifies the attributes of the cell given by
        <code><i>cellIndex</i></code>.&nbsp; If no <code><i>name</i></code> is
        specified, the command returns a list of pairs, each of which contains
        the name and the value of an attribute for the cell.&nbsp; If
        <code><i>name</i></code> is specified with no
        <code><i>value</i></code>, then the command returns the value of the
        one named cell attribute, or an empty string if no corresponding value
        exists (you can use the <code><b><a href=
        "#hascellattrib">hascellattrib</a></b></code> subcommand to distinguish
        this case from the one that the value of an <i>existing</i> cell
        attribute is an empty string).&nbsp; If one or more
        <code><i>name</i></code>-<code><i>value</i></code> pairs are specified,
        then the command sets the given cell attribute(s) to the given
        value(s); in this case the return value is an empty string.&nbsp;
        <code><i>name</i></code> may be an arbitrary string.</dd>

        <dt class="tm" id="cellbbox"><code><i>pathName</i> <b>cellbbox</b>
        <i>cellIndex</i></code></dt>

        <dd>Returns a list of four numbers describing the bounding box of the
        cell given by <code><i>cellIndex</i></code>.&nbsp; The first two
        elements of the list give the x and y coordinates of the upper-left
        corner of the screen area covered by the cell (specified in pixels
        relative to the widget) and the last two elements give the width and
        height of the area, in pixels.&nbsp; If no part of the cell given by
        <code><i>cellIndex</i></code> is visible on the screen, or if
        <code><i>cellIndex</i></code> refers to a non-existent cell, then the
        result is an empty string; if the cell is partially visible, the result
        gives the full area of the cell, including any parts that are not
        visible.</dd>

        <dt class="tm" id="cellcget"><code><i>pathName</i> <b>cellcget</b>
        <i>cellIndex</i> <i>option</i></code></dt>

        <dd>Returns the current value of the cell configuration option given by
        <code><i>option</i></code> for the cell specified by
        <code><i>cellIndex</i></code>.&nbsp; <code><i>option</i></code> may
        have any of the values accepted by the <code><b><a href=
        "#cellconfigure">cellconfigure</a></b></code> command.</dd>

        <dt class="tm" id="cellconfigure"><code><i>pathName</i>
        <b>cellconfigure</b> <i>cellIndex</i> ?<i>option</i>? <i>value</i>
        <i>option</i> <i>value</i> ...?</code></dt>

        <dd>Queries or modifies the configuration options of the cell given by
        <code><i>cellIndex</i></code>.&nbsp; If no <code><i>option</i></code>
        is specified, the command returns a list describing all of the
        available options for the cell (see
        <code><b>Tk_ConfigureInfo</b></code> for information on the format of
        this list).&nbsp; If <code><i>option</i></code> is specified with no
        <code><i>value</i></code>, then the command returns a list describing
        the one named option (this list will be identical to the corresponding
        sublist of the value returned if no <code><i>option</i></code> is
        specified).&nbsp; If one or more
        <code><i>option</i></code>-<code><i>value</i></code> pairs are
        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.&nbsp; <code><i>option</i></code> may have any of the values
        described in the <a href="#cell_options">CELL CONFIGURATION OPTIONS</a>
        section.</dd>

        <dt class="tm" id="cellindex"><code><i>pathName</i> <b>cellindex</b>
        <i>cellIndex</i></code></dt>

        <dd>Returns the canonical cell index value that corresponds to
        <code><i>cellIndex</i></code>, in the form
        <code><i>row</i><b>,</b><i>col</i></code>, where
        <code><i>row</i></code> and <code><i>col</i></code> are integers.</dd>

        <dt class="tm" id="cellselection"><code><i>pathName</i>
        <b>cellselection</b> <i>option</i> <i>args</i></code></dt>

        <dd>This command is used to adjust the cell selection within a
        tablelist widget.&nbsp; It has several forms, depending on
        <code><i>option</i></code>:</dd>

        <dd>
          <dl>
            <dt class="tm"><code><i>pathName</i> <b>cellselection</b>
            <b>anchor</b> <i>cellIndex</i></code></dt>

            <dd>Sets the cell selection anchor to the element given by
            <code><i>cellIndex</i></code>.&nbsp; If
            <code><i>cellIndex</i></code> refers to a nonexistent or
            non-<a href="#isviewable">viewable</a> element, then the closest
            viewable element is used.&nbsp; The cell selection anchor is the
            end of the cell selection that is fixed while dragging out a cell
            selection with the mouse if the selection type is
            <code><b>cell</b></code>.&nbsp; The cell index
            <code><b>anchor</b></code> may be used to refer to the anchor
            element.</dd>

            <dt class="tm"><code><i>pathName</i> <b>cellselection</b>
            <b>clear</b> <i>firstCell</i> <i>lastCell</i></code><br>
            <code><i>pathName</i> <b>cellselection</b> <b>clear</b>
            <i>cellIndexList</i></code></dt>

            <dd>If any of the elements between <code><i>firstCell</i></code>
            and <code><i>lastCell</i></code> (inclusive) or corresponding to
            the cell indices specified by the list
            <code><i>cellIndexList</i></code> are selected, they are
            deselected.&nbsp; The selection state is not changed for elements
            outside the range given in the first form of the command or
            different from those specified by the cell index list given in its
            second form.</dd>

            <dt class="tm"><code><i>pathName</i> <b>cellselection</b>
            <b>includes</b> <i>cellIndex</i></code></dt>

            <dd>Returns <code>1</code> if the element indicated by
            <code><i>cellIndex</i></code> is currently selected, <code>0</code>
            if it isn't.</dd>

            <dt class="tm"><code><i>pathName</i> <b>cellselection</b>
            <b>set</b> <i>firstCell</i> <i>lastCell</i></code><br>
            <code><i>pathName</i> <b>cellselection</b> <b>set</b>
            <i>cellIndexList</i></code><br></dt>

            <dd class="tm">Selects all of the selectable elements in the range
            between <code><i>firstCell</i></code> and
            <code><i>lastCell</i></code>, inclusive, or corresponding to the
            indices specified by the list <code><i>cellIndexList</i></code>,
            without affecting the selection state of any other elements.&nbsp;
            An element is viewed as selectable if and only if the value of the
            <code><b><a href="#selectable">-selectable</a></b></code> option of
            the row containing it is true.</dd>
          </dl>
        </dd>

        <dd class="tm">If the tablelist's <code><b><a href=
        "#state">state</a></b></code> is <code><b>disabled</b></code> and
        <code><i>option</i></code> is different from
        <code><b>includes</b></code> then the command just returns an empty
        string, without performing any of the above actions.</dd>

        <dt class="tm" id="cget"><code><i>pathName</i> <b>cget</b>
        <i>option</i></code></dt>

        <dd>Returns the current value of the configuration option given by
        <code><i>option</i></code>, which may have any of the values accepted
        by the <code><b>tablelist::tablelist</b></code> command.</dd>

        <dt class="tm" id="childcount"><code><i>pathName</i> <b>childcount</b>
        <i>nodeIndex</i></code></dt>

        <dd>Returns the number of children of the tree node indicated by
        <code><i>nodeIndex</i></code>.&nbsp; If this argument is specified as
        <code><b>root</b></code> then the return value will be the number of
        top-level items of the tablelist widget.</dd>

        <dt class="tm" id="childindex"><code><i>pathName</i> <b>childindex</b>
        <i>index</i></code></dt>

        <dd>Returns the numerical index of the row given by
        <code><i>index</i></code> in the list of children of its parent
        node.</dd>

        <dt class="tm" id="childkeys"><code><i>pathName</i> <b>childkeys</b>
        <i>nodeIndex</i></code></dt>

        <dd>Returns the list of full keys of the children of the tree node
        indicated by <code><i>nodeIndex</i></code>.&nbsp; If this argument is
        specified as <code><b>root</b></code> then the return value will be the
        list of full keys of the top-level items contained in the tablelist
        widget.</dd>

        <dt class="tm" id="collapse"><code><i>pathName</i> <b>collapse</b>
        <i>index</i> ?<b>-fully</b>|<b>-partly</b>?</code></dt>

        <dd>This subcommand collapses the specified row of a tablelist used as
        a tree widget, i.e., elides all its descendants.&nbsp; The optional
        argument <code><b>-fully</b></code> (which is the default) indicates
        that the command will be performed recursively, i.e., all of the
        descendants of the node specified by <code><i>index</i></code> will be
        collapsed, so that a subsequent invocation of the non-recursive version
        of the <code><b><a href="#expand">expand(all)</a></b></code> subcommand
        will only display the row's children but no further descendants of
        it.&nbsp; The <code><b>-partly</b></code> 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 <code><b>expand(all)</b></code> subcommand exactly the same
        descendants will be displayed again that were visible prior to
        collapsing the row.</dd>

        <dd class="tm">Before hiding the descendants of a row, the command
        specified as the value of the <code><b><a href=
        "#collapsecommand">-collapsecommand</a></b></code> 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
        scope.</dd>

        <dd class="tm">For technical reasons (the use of the
        <code><b>-elide</b></code> text widget tag option for collapsing a
        row), this subcommand is not supported for Tk versions earlier than
        8.3.</dd>

        <dt class="tm" id="collapseall"><code><i>pathName</i>
        <b>collapseall</b> ?<b>-fully</b>|<b>-partly</b>?</code></dt>

        <dd>This subcommand collapses all top-level rows of a tablelist used as
        a tree widget, i.e., elides all their descendants.&nbsp; The optional
        argument <code><b>-fully</b></code> (which is the default) indicates
        that the command will be performed recursively, i.e., all of the
        descendants of the top-level nodes will be collapsed, so that a
        subsequent invocation of the non-recursive version of the
        <code><b><a href="#expandall">expandall</a></b></code> subcommand will
        only display ther children but no further descendants of them.&nbsp;
        The <code><b>-partly</b></code> option restricts the operation to just
        one hierarchy level, implying that by a subsequent invocation of the
        non-recursive version of the <code><b>expandall</b></code> subcommand
        exactly the same items will be displayed again that were visible prior
        to collapsing the top-level ones.</dd>

        <dd class="tm">Before hiding the descendants of a row, the command
        specified as the value of the <code><b><a href=
        "#collapsecommand">-collapsecommand</a></b></code> 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
        scope.</dd>

        <dd class="tm">For technical reasons (the use of the
        <code><b>-elide</b></code> text widget tag option for collapsing a
        row), this subcommand is not supported for Tk versions earlier than
        8.3.</dd>

        <dt class="tm" id="columnattrib"><code><i>pathName</i>
        <b>columnattrib</b> <i>columnIndex</i> ?<i>name</i>? ?<i>value</i>
        <i>name</i> <i>value</i> ...?</code></dt>

        <dd>Queries or modifies the attributes of the column given by
        <code><i>columnIndex</i></code>.&nbsp; If no <code><i>name</i></code>
        is specified, the command returns a list of pairs, each of which
        contains the name and the value of an attribute for the column.&nbsp;
        If <code><i>name</i></code> is specified with no
        <code><i>value</i></code>, then the command returns the value of the
        one named column attribute, or an empty string if no corresponding
        value exists (you can use the <code><b><a href=
        "#hascolumnattrib">hascolumnattrib</a></b></code> subcommand to
        distinguish this case from the one that the value of an <i>existing</i>
        column attribute is an empty string).&nbsp; If one or more
        <code><i>name</i></code>-<code><i>value</i></code> pairs are specified,
        then the command sets the given column attribute(s) to the given
        value(s); in this case the return value is an empty string.&nbsp;
        <code><i>name</i></code> may be an arbitrary string.</dd>

        <dt class="tm" id="columncget"><code><i>pathName</i> <b>columncget</b>
        <i>columnIndex</i> <i>option</i></code></dt>

        <dd>Returns the current value of the column configuration option given
        by <code><i>option</i></code> for the column specified by
        <code><i>columnIndex</i></code>.&nbsp; <code><i>option</i></code> may
        have any of the values accepted by the <code><b><a href=
        "#columnconfigure">columnconfigure</a></b></code> command.</dd>

        <dt class="tm" id="columnconfigure"><code><i>pathName</i>
        <b>columnconfigure</b> <i>columnIndex</i> ?<i>option</i>? ?<i>value</i>
        <i>option</i> <i>value</i> ...?</code></dt>

        <dd>Queries or modifies the configuration options of the column given
        by <code><i>columnIndex</i></code>.&nbsp; If no
        <code><i>option</i></code> is specified, the command returns a list
        describing all of the available options for the column (see
        <code><b>Tk_ConfigureInfo</b></code> for information on the format of
        this list).&nbsp; If <code><i>option</i></code> is specified with no
        <code><i>value</i></code>, then the command returns a list describing
        the one named option (this list will be identical to the corresponding
        sublist of the value returned if no <code><i>option</i></code> is
        specified).&nbsp; If one or more
        <code><i>option</i></code>-<code><i>value</i></code> pairs are
        specified, then the command modifies the given column option(s) to have
        the given value(s); in this case the return value is an empty
        string.&nbsp; <code><i>option</i></code> may have any of the values
        described in the <a href="#col_options">COLUMN CONFIGURATION
        OPTIONS</a> section.</dd>

        <dt class="tm" id="columncount"><code><i>pathName</i>
        <b>columncount</b></code></dt>

        <dd>Returns the number of columns in the tablelist widget.</dd>

        <dt class="tm" id="columnindex"><code><i>pathName</i>
        <b>columnindex</b> <i>columnIndex</i></code></dt>

        <dd>Returns the integer column index value that corresponds to
        <code><i>columnIndex</i></code>.</dd>

        <dt class="tm" id="columnwidth"><code><i>pathName</i>
        <b>columnwidth</b> <i>columnIndex</i>
        ?<b>-requested</b>|<b>-stretched</b>|<b>-total</b>?</code></dt>

        <dd>Returns the current width in pixels of the column specified by
        <code><i>columnIndex</i></code>.&nbsp; If the optional argument is
        <code><b>-requested</b></code> (which is the default) then the return
        value is the number of pixels corresponding to the column width
        specified by the <code><b><a href="#columns">-columns</a></b></code>
        widget or <code><b><a href="#col_width">-width</a></b></code> column
        configuration option (possibly overridden by interactive column
        resizing); if the column width was specified as <code>0</code> (and was
        not changed by interactive column resizing) then the return value is
        the actual number of pixels corresponding to the widest <a href=
        "#isviewable">viewable</a> element of the column, including its
        header.&nbsp; With the <code><b>-stretched</b></code> option, the
        command returns the column width obtained by increasing the value
        described above by the number of additional pixels that might have been
        added to the requested column width by a stretch operation (see the
        <code><b><a href="#stretch">-stretch</a></b></code> widget and
        <code><b><a href="#col_stretchable">-stretchable</a></b></code> column
        configuration options).&nbsp; Finally, if the optional argument is
        <code><b>-total</b></code> then the return value is the stretched
        column width increased by the number of pixels corresponding to the
        left and right margins within the column; this value equals the width
        of the header label if the tablelist widget is mapped.</dd>

        <dt class="tm" id="configcelllist"><code><i>pathName</i>
        <b>configcelllist</b> <i>cellConfigSpecList</i></code></dt>

        <dd>
          For each cell index, option, and value specified by the list
          <code><i>cellConfigSpecList</i></code>, the command modifies the
          given option of the given cell to have the given value.&nbsp; The
          argument <code><i>cellConfigSpecList</i></code> must be a list of the
          form

          <blockquote>
            <pre>
<i>cellIndex</i> <i>option</i> <i>value</i> <i>cellIndex</i> <i>option</i> <i>value</i> ...
</pre>
          </blockquote>
        </dd>

        <dd>where each <code><i>option</i></code> may have any of the values
        described in the <a href="#cell_options">CELL CONFIGURATION OPTIONS</a>
        section.&nbsp; The return value is an empty string.</dd>

        <dd class="tm">
          This command has the same effect as

          <blockquote>
            <pre>
eval [list <i>pathName</i> <a href=
"#configcells">configcells</a>] <i>cellConfigSpecList</i>
</pre>
          </blockquote>
        </dd>

        <dd>but it is more efficient and easier to use.</dd>

        <dt class="tm" id="configcells"><code><i>pathName</i>
        <b>configcells</b> ?<i>cellIndex</i> <i>option</i> <i>value</i>
        <i>cellIndex</i> <i>option</i> <i>value</i> ...?</code></dt>

        <dd>For each <code><i>cellIndex</i></code>, <code><i>option</i></code>,
        and <code><i>value</i></code>, the command modifies the given option of
        the given cell to have the given value.&nbsp; Each
        <code><i>option</i></code> may have any of the values described in the
        <a href="#cell_options">CELL CONFIGURATION OPTIONS</a> section.&nbsp;
        The return value is an empty string.</dd>

        <dt class="tm" id="configcolumnlist"><code><i>pathName</i>
        <b>configcolumnlist</b> <i>columnConfigSpecList</i></code></dt>

        <dd>
          For each column index, option, and value specified by the list
          <code><i>columnConfigSpecList</i></code>, the command modifies the
          given option of the given column to have the given value.&nbsp; The
          argument <code><i>columnConfigSpecList</i></code> must be a list of
          the form

          <blockquote>
            <pre>
<i>columnIndex</i> <i>option</i> <i>value</i> <i>columnIndex</i> <i>option</i> <i>value</i> ...
</pre>
          </blockquote>
        </dd>

        <dd>where each <code><i>option</i></code> may have any of the values
        described in the <a href="#col_options">COLUMN CONFIGURATION
        OPTIONS</a> section.&nbsp; The return value is an empty string.</dd>

        <dd class="tm">
          This command has the same effect as

          <blockquote>
            <pre>
eval [list <i>pathName</i> <a href=
"#configcolumns">configcolumns</a>] <i>columnConfigSpecList</i>
</pre>
          </blockquote>
        </dd>

        <dd>but it is more efficient and easier to use.</dd>

        <dt class="tm" id="configcolumns"><code><i>pathName</i>
        <b>configcolumns</b> ?<i>columnIndex</i> <i>option</i> <i>value</i>
        <i>columnIndex</i> <i>option</i> <i>value</i> ...?</code></dt>

        <dd>For each <code><i>columnIndex</i></code>,
        <code><i>option</i></code>, and <code><i>value</i></code>, the command
        modifies the given option of the given column to have the given
        value.&nbsp; Each <code><i>option</i></code> may have any of the values
        described in the <a href="#col_options">COLUMN CONFIGURATION
        OPTIONS</a> section.&nbsp; The return value is an empty string.</dd>

        <dt class="tm" id="configrowlist"><code><i>pathName</i>
        <b>configrowlist</b> <i>rowConfigSpecList</i></code></dt>

        <dd>
          For each row index, option, and value specified by the list
          <code><i>rowConfigSpecList</i></code>, the command modifies the given
          option of the given row to have the given value.&nbsp; The argument
          <code><i>rowConfigSpecList</i></code> must be a list of the form

          <blockquote>
            <pre>
<i>index</i> <i>option</i> <i>value</i> <i>index</i> <i>option</i> <i>value</i> ...
</pre>
          </blockquote>
        </dd>

        <dd>where each <code><i>option</i></code> may have any of the values
        described in the <a href="#row_options">ROW CONFIGURATION OPTIONS</a>
        section.&nbsp; The return value is an empty string.</dd>

        <dd class="tm">
          This command has the same effect as

          <blockquote>
            <pre>
eval [list <i>pathName</i> <a href=
"#configrows">configrows</a>] <i>rowConfigSpecList</i>
</pre>
          </blockquote>
        </dd>

        <dd>but it is more efficient and easier to use.</dd>

        <dt class="tm" id="configrows"><code><i>pathName</i> <b>configrows</b>
        ?<i>index</i> <i>option</i> <i>value</i> <i>index</i> <i>option</i>
        <i>value</i> ...?</code></dt>

        <dd>For each <code><i>index</i></code>, <code><i>option</i></code>, and
        <code><i>value</i></code>, the command modifies the given option of the
        given row to have the given value.&nbsp; Each
        <code><i>option</i></code> may have any of the values described in the
        <a href="#row_options">ROW CONFIGURATION OPTIONS</a> section.&nbsp; The
        return value is an empty string.</dd>

        <dt class="tm" id="configure"><code><i>pathName</i> <b>configure</b>
        ?<i>option</i>? ?<i>value</i> <i>option</i> <i>value</i>
        ...?</code></dt>

        <dd>Queries or modifies the configuration options of the widget.&nbsp;
        If no <code><i>option</i></code> is specified, the command returns a
        list describing all of the available options for
        <code><i>pathName</i></code> (see <code><b>Tk_ConfigureInfo</b></code>
        for information on the format of this list).&nbsp; If
        <code><i>option</i></code> is specified with no
        <code><i>value</i></code>, then the command returns a list describing
        the one named option (this list will be identical to the corresponding
        sublist of the value returned if no <code><i>option</i></code> is
        specified).&nbsp; If one or more
        <code><i>option</i></code>-<code><i>value</i></code> pairs are
        specified, then the command modifies the given widget option(s) to have
        the given value(s); in this case the return value is an empty
        string.&nbsp; <code><i>option</i></code> may have any of the values
        accepted by the <code><b>tablelist::tablelist</b></code> command.</dd>

        <dt class="tm" id="containing"><code><i>pathName</i> <b>containing</b>
        <i>y</i></code></dt>

        <dd>Given a y-coordinate within the tablelist window, this command
        returns the index of the tablelist item containing that
        y-coordinate.&nbsp; If no corresponding item is found then the return
        value is <code>-1</code>.&nbsp; The coordinate <code><i>y</i></code> is
        expected to be relative to the tablelist window itself (not its body
        component).</dd>

        <dt class="tm" id="containingcell"><code><i>pathName</i>
        <b>containingcell</b> <i>x</i> <i>y</i></code></dt>

        <dd>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.&nbsp; If no corresponding cell is found then
        the row or column component (or both) of the return value is
        <code>-1</code>.&nbsp; The coordinates <code><i>x</i></code> and
        <code><i>y</i></code> are expected to be relative to the tablelist
        window itself (not its body component).</dd>

        <dt class="tm" id="containingcolumn"><code><i>pathName</i>
        <b>containingcolumn</b> <i>x</i></code></dt>

        <dd>Given an x-coordinate within the tablelist window, this command
        returns the index of the tablelist column containing that
        x-coordinate.&nbsp; If no corresponding column is found then the return
        value is <code>-1</code>.&nbsp; The coordinate <code><i>x</i></code> is
        expected to be relative to the tablelist window itself (not its body
        component).</dd>

        <dt class="tm" id="cornerlabelpath"><code><i>pathName</i>
        <b>cornerlabelpath</b></code></dt>

        <dd>Returns the path name of the label widget contained in the corner
        frame (see the <code><b><a href="#cornerpath">cornerpath</a></b></code>
        subcommand.&nbsp; When using Tablelist_tile, the return value will be a
        ttk::label widget of the same style as the header labels.&nbsp; The
        global visual options set for the header labels are automatically
        applied to this (ttk::)label widget, too.</dd>

        <dt class="tm" id="cornerpath"><code><i>pathName</i>
        <b>cornerpath</b></code></dt>

        <dd>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.&nbsp; This frame is called the <b>corner frame</b>,
        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).&nbsp; The corner frame contains a label or
        ttk::label widget, depending on whether the package Tablelist or
        Tablelist_tile is being used (see the <code><b><a href=
        "#cornerlabelpath">cornerlabelpath</a></b></code> subcommand).&nbsp;
        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.</dd>

        <dd class="tm">
          <b>REMARK:</b>&nbsp; This subcommand enables you to manage the
          vertical scrollbar (if any) to appear below the tablelist widget's
          header, thus respecting the native look &amp; feel on Mac OS X
          Aqua.&nbsp; 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:

          <blockquote>
            <pre>
<i># Add some entries to the Tk option database</i>
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
}

. . .

<i># Create the tablelist and the scrollbars as
# children of a frame of class ScrollArea</i>
set frm [(ttk::)frame ... -class ScrollArea]
set tbl $frm.tbl
set vsb $frm.vsb
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]

. . .

<i># Manage the widgets within the frame</i>
grid $tbl -row 0 -rowspan 2 -column 0 -sticky news
if {[string compare $winSys "aqua"] == 0} {
    grid [$tbl <span>cornerpath</span>] -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
grid columnconfigure $frm 0 -weight 1

<i># Manage the frame</i>
pack $frm -expand yes -fill both
</pre>
          </blockquote>
        </dd>

        <dt id="curcellselection"><code><i>pathName</i>
        <b>curcellselection</b></code></dt>

        <dd>Returns a list containing the canonical indices (of the form
        <code><i>row</i>,<i>col</i></code>, where <code><i>row</i></code> and
        <code><i>col</i></code> are numbers) of all of the elements in the
        tablelist that are currently selected.&nbsp; If there are no such
        elements in the tablelist then an empty string is returned.</dd>

        <dt class="tm" id="curselection"><code><i>pathName</i>
        <b>curselection</b></code></dt>

        <dd>Returns a list containing the numerical indices of all of the items
        in the tablelist that contain at least one selected element.&nbsp; If
        there are no such items in the tablelist then an empty string is
        returned.</dd>

        <dt class="tm" id="delete"><code><i>pathName</i> <b>delete</b>
        <i>first</i> <i>last</i></code><br>
        <code><i>pathName</i> <b>delete</b> <i>indexList</i></code></dt>

        <dd>Deletes one or more items of the tablelist if its <code><b><a href=
        "#state">state</a></b></code> is not
        <code><b>disabled</b></code>.&nbsp; In the first form of the command,
        <code><i>first</i></code> and <code><i>last</i></code> are indices
        specifying the first and last items in the range to delete.&nbsp; The
        command's second form accepts a list <code><i>indexList</i></code> of
        indices specifying the items to be deleted.&nbsp; In both cases, all
        descendants of the specified items will be deleted, too.&nbsp; The
        return value is an empty string.</dd>

        <dt class="tm" id="deletecolumns"><code><i>pathName</i>
        <b>deletecolumns</b> <i>firstColumn</i> <i>lastColumn</i></code><br>
        <code><i>pathName</i> <b>deletecolumns</b>
        <i>columnIndexList</i></code></dt>

        <dd>Deletes one or more columns of the tablelist if its
        <code><b><a href="#state">state</a></b></code> is not
        <code><b>disabled</b></code>.&nbsp; In the first form of the command,
        <code><i>firstColumn</i></code> and <code><i>lastColumn</i></code> are
        indices specifying the first and last columns in the range to
        delete.&nbsp; The command's second form accepts a list
        <code><i>columnIndexList</i></code> of indices specifying the columns
        to be deleted.&nbsp; Returns an empty string.</dd>

        <dt class="tm" id="depth"><code><i>pathName</i> <b>depth</b>
        <i>nodeIndex</i></code></dt>

        <dd>Returns the number of steps from the tree node indicated by
        <code><i>nodeIndex</i></code> to the <code><b>root</b></code>
        node.&nbsp; The latter's depth is 0, that of the top-level rows is 1,
        and so on.</dd>

        <dt class="tm" id="descendantcount"><code><i>pathName</i>
        <b>descendantcount</b> <i>nodeIndex</i></code></dt>

        <dd>Returns the number of descendants of the tree node indicated by
        <code><i>nodeIndex</i></code>.&nbsp; If this argument is specified as
        <code><b>root</b></code> then the return value will be the number of
        items of the tablelist widget.</dd>

        <dt class="tm" id="editcell"><code><i>pathName</i> <b>editcell</b>
        <i>cellIndex</i></code></dt>

        <dd>Starts the interactive editing of the cell's contents if the
        tablelist's <code><b><a href="#state">state</a></b></code> is not
        <code><b>disabled</b></code> and the cell is <a href=
        "#isviewable">viewable</a> and editable.&nbsp; Returns an empty
        string.&nbsp; See the <a href="#cell_editing">INTERACTIVE CELL
        EDITING</a> section for details on editablity and on the editing
        process.</dd>

        <dt class="tm" id="editinfo"><code><i>pathName</i>
        <b>editinfo</b></code></dt>

        <dd>Returns a three-element list containing information about the
        tablelist cell whose content is being edited.&nbsp; The first element
        of the list is the full key (of the form
        <code><b>k</b><i>number</i></code>) associated with the item containing
        the tablelist element that is being edited.&nbsp; The second and third
        elements are the cell's row and column indices.&nbsp; If currently no
        cell is being edited then the return value is the list&nbsp; <code>{""
        -1 -1}</code>.</dd>

        <dt class="tm" id="editwinpath"><code><i>pathName</i>
        <b>editwinpath</b></code></dt>

        <dd>Returns the path name of the temporary embedded widget used for
        interactive cell editing, created by the <code><b><a href=
        "#editcell">editcell</a></b></code> subcommand.&nbsp; If no cell is
        currently being edited then the return value is an empty string.&nbsp;
        This subcommand enables you to access the edit window from within the
        commands specified by the <code><b><a href=
        "#editstartcommand">-editstartcommand</a></b></code> and
        <code><b><a href="#editendcommand">-editendcommand</a></b></code>
        configuration options.</dd>

        <dt class="tm" id="editwintag"><code><i>pathName</i>
        <b>editwintag</b></code></dt>

        <dd>Returns the name of a binding tag whose name depends on the path
        name of the tablelist widget and which is associated with some of the
        components of the temporary embedded widget used for interactive cell
        editing.&nbsp; These components depend on the edit window: the widget
        itself in case of a Tk or tile checkbutton or menubutton; the edit
        window's entry children in case of a mentry widget; the only entry or
        entry-like component of the edit window in all other cases (see also
        the <code><b><a href="#entrypath">entrypath</a></b></code>
        subcommand).&nbsp; This binding tag precedes the tag <code><b><a href=
        "#edit_bindings">TablelistEdit</a></b></code> in the list of binding
        tags of the edit window components mentioned above, and is designed to
        be used when defining individual binding scripts for controlling the
        interactive cell editing.</dd>

        <dd class="tm">
          For example, the following command will replace the standard behavior
          of the <code>Return</code> key during cell editing in the tablelist
          widget <code>.tbl</code> with that of the <code>Tab</code> key:

          <blockquote>
            <pre>
bind [.tbl <span>editwintag</span>] &lt;Return&gt; "[bind <a href=
"#edit_bindings">TablelistEdit</a> &lt;Tab&gt;]; break"
</pre>
          </blockquote>
        </dd>

        <dt id="entrypath"><code><i>pathName</i> <b>entrypath</b></code></dt>

        <dd>Returns the path name of the entry or entry-like component of the
        temporary embedded widget used for interactive cell editing, created by
        the <code><b><a href="#editcell">editcell</a></b></code>
        subcommand.&nbsp; If no cell is currently being edited or the editing
        is taking place with the aid of a Tk or tile checkbutton, Tk or tile
        menubutton, or mentry widget, then the return value is an empty string;
        otherwise it is the path name of a Tk or tile entry, text or ctext, Tk
        or tile spinbox, or BWidget Entry widget, which can be the edit window
        itself or one of its descendants.&nbsp; This subcommand enables you to
        access the entry or entry-like component of the temporary embedded
        widget from within the commands specified by the <code><b><a href=
        "#editstartcommand">-editstartcommand</a></b></code> and
        <code><b><a href="#editendcommand">-editendcommand</a></b></code>
        configuration options.</dd>

        <dt class="tm" id="expand"><code><i>pathName</i> <b>expand</b>
        <i>index</i> ?<b>-fully</b>|<b>-partly</b>?</code></dt>

        <dd>This subcommand expands the specified row of a tablelist used as a
        tree widget, i.e., makes all its children visible.&nbsp; The optional
        argument <code><b>-fully</b></code> (which is the default) indicates
        that the command will be performed recursively, i.e., all of the
        descendants of the node specified by <code><i>index</i></code> will be
        displayed.&nbsp; The <code><b>-partly</b></code> 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.</dd>

        <dd class="tm">Before displaying the children of a row, the command
        specified as the value of the <code><b><a href=
        "#expandcommand">-expandcommand</a></b></code> 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
        scope.&nbsp; This enables you to insert a tree node's children on
        demand, just before expanding it.</dd>

        <dd class="tm">For technical reasons (the use of the
        <code><b>-elide</b></code> text widget tag option for collapsing a
        row), this subcommand is not supported for Tk versions earlier than
        8.3.</dd>

        <dt class="tm" id="expandall"><code><i>pathName</i> <b>expandall</b>
        ?<b>-fully</b>|<b>-partly</b>?</code></dt>

        <dd>This subcommand expands all top-level rows of a tablelist used as a
        tree widget, i.e., makes all their children visible.&nbsp; The optional
        argument <code><b>-fully</b></code> (which is the default) indicates
        that the command will be performed recursively, i.e., all of the
        descendants of the top-level nodes will be displayed.&nbsp; The
        <code><b>-partly</b></code> option restricts the operation to just one
        hierarchy level, indicating that only the children of the top-level
        nodes will be displayed, without changing the expanded/collapsed state
        of the child nodes.</dd>

        <dd class="tm">Before displaying the children of a row, the command
        specified as the value of the <code><b><a href=
        "#expandcommand">-expandcommand</a></b></code> 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
        scope.&nbsp; This enables you to insert a tree node's children on
        demand, just before expanding it.</dd>

        <dd class="tm">For technical reasons (the use of the
        <code><b>-elide</b></code> text widget tag option for collapsing a
        row), this subcommand is not supported for Tk versions earlier than
        8.3.</dd>

        <dt class="tm" id="expandedkeys"><code><i>pathName</i>
        <b>expandedkeys</b></code></dt>

        <dd>Returns the list of full keys of the expanded items.</dd>

        <dt class="tm" id="fillcolumn"><code><i>pathName</i> <b>fillcolumn</b>
        <i>columnIndex</i> <i>text</i></code></dt>

        <dd>Sets all the elements of the specified column to the value
        <code><i>text</i></code>.</dd>

        <dt class="tm" id="findcolumnname"><code><i>pathName</i>
        <b>findcolumnname</b> <i>name</i></code></dt>

        <dd>Returns the index of the first column whose name (given by the
        <code><b><a href="#col_name">-name</a></b></code> column configuration
        option) equals <code><i>name</i></code>.&nbsp; If no column has the
        specified name then the return value is <code>-1</code>.</dd>

        <dt class="tm" id="findrowname"><code><i>pathName</i>
        <b>findrowname</b> <i>name</i> ?<b>-descend</b>? ?<b>-parent</b>
        <i>nodeIndex</i>?</code></dt>

        <dd>Returns the row index of the first child of the tree node indicated
        by <code><i>nodeIndex</i></code> whose name (given by the
        <code><b><a href="#row_name">-name</a></b></code> row configuration
        option) equals <code><i>name</i></code>.&nbsp; The
        <code><b>-descend</b></code> option extends the search to all
        descendants of the tree node given by the <code><b>-parent</b></code>
        option.&nbsp; The default is to restrict the search to the parent
        node's children only.&nbsp; The default parent is
        <code><b>root</b></code>.&nbsp; When searching for the given name, the
        items will be visited in the order of their row indices.&nbsp; If none
        of the relevant rows has the specified name then the return value is
        <code>-1</code>.</dd>

        <dt class="tm" id="finishediting"><code><i>pathName</i>
        <b>finishediting</b></code></dt>

        <dd>This subcommand attempts to terminate the interactive editing of
        the contents of the cell whose index was passed to the
        <code><b><a href="#editcell">editcell</a></b></code> subcommand by
        destroying the temporary widget embedded into the cell and updating the
        cell's contents.&nbsp; The exact steps involved are as follows:&nbsp;
        First, the widget's final text is compared to its original one.&nbsp;
        If they are equal then the edit window is destroyed and the cell's
        original contents are restored.&nbsp; If the two strings are different
        and the value of the <code><b><a href=
        "#editendcommand">-editendcommand</a></b></code> 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.&nbsp; However, if from
        within this script the <code><b><a href=
        "#rejectinput">rejectinput</a></b></code> subcommand was invoked then
        the cell's value is not changed and the embedded widget remains
        displayed in the cell; in this case the command returns the boolean
        value <code>0</code>.&nbsp; In all the other cases, the return value is
        <code>1</code>.&nbsp; Immediately before returning the value
        <code>1</code>, the command generates the virtual event
        <code><b>&lt;&lt;TablelistCellUpdated&gt;&gt;</b></code>.&nbsp; For Tk
        versions 8.5 or higher, this virtual event is generated with its
        <code><b>-data</b></code> option set to a list consisting of the
        numerical row and column indices of the cell whose content is being
        edited.&nbsp; If no cell was being edited when the command was invoked
        then the same value <code>1</code> is returned but no virtual event is
        generated.</dd>

        <dd class="tm">This subcommand is called <i>implicitly</i> by pressing
        <code>Return</code> or <code>KP_Enter</code> (together with
        <code>Control</code> if the edit window is a text or ctext widget) when
        editing a cell, or by clicking with the left mouse button anywhere in
        the tablelist's body, outside the cell just being edited, or moving
        into another editable cell by using keyboard navigation.&nbsp; If the
        editing was started with the left mouse button, the edit window is a Tk
        or tile checkbutton, and the value of the <code><b><a href=
        "#instanttoggle">-instanttoggle</a></b></code> option is true, then
        this subcommand will be invoked automatically, without any user
        interaction.</dd>

        <dd class="tm"><b>REMARK:</b>&nbsp; There are also situations where an
        <i>explicit</i> invocation of this subcommand is needed, in order to
        make sure that the cell just being edited gets updated with the text
        entered by the user.&nbsp; For example, if a tablelist widget is part
        of a dialog used for editing some data, then the command associated
        with the button designed to accept the data should call this
        subcommand, because otherwise, if the button is pressed during
        interactive cell editing then the text entered into the edit window
        will get lost.</dd>

        <dt class="tm" id="formatinfo"><code><i>pathName</i>
        <b>formatinfo</b></code></dt>

        <dd>This command is designed to be invoked from within a Tcl command
        specified as the value of the <code><b><a href=
        "#col_formatcommand">-formatcommand</a></b></code> column configuration
        option.&nbsp; It returns a three-element list containing information
        about the tablelist cell whose content is being formatted with the aid
        of that command.&nbsp; The first element of the list is the full key
        (of the form <code><b>k</b><i>number</i></code>) associated with the
        item containing the tablelist element that is being formatted.&nbsp;
        The second and third elements are the cell's row and column
        indices.</dd>

        <dd class="tm">
          <b>REMARK:</b>&nbsp; This subcommand is needed in cases where the
          result of the formatting should depend on the cell's row.&nbsp; To be
          able to use it, specify the value of the
          <code><b>-formatcommand</b></code> column configuration option
          as&nbsp; <code>[<b>list</b> <i>formatCommand</i>
          <i>pathName</i>]</code>,&nbsp; like in the following example:

          <blockquote>
            <pre>
.tbl <a href="#columnconfigure">columnconfigure</a> 1 <a href=
"#col_formatcommand">-formatcommand</a> [list formatValue .tbl]

proc formatValue {tbl val} {
    <i># Get information about the cell whose content is being formatted</i>
    foreach {key row col} [$tbl <span>formatinfo</span>] {}

    <i># Return a string depending on $val and $row (or $key)</i>
    . . .
}
</pre>
          </blockquote>
        </dd>

        <dt id="get"><code><i>pathName</i> <b>get</b> <i>first</i>
        <i>last</i></code><br>
        <code><i>pathName</i> <b>get</b> <i>indexList</i></code></dt>

        <dd>The first form of the command returns a list whose elements are all
        of the tablelist items (i.e., row contents) between
        <code><i>first</i></code> and <code><i>last</i></code>,
        inclusive.&nbsp; The value returned by the second form depends on the
        number of elements in the list <code><i>indexList</i></code>: if the
        latter contains exactly one index then the return value is the
        tablelist item indicated by that index (or an empty string if the index
        refers to a non-existent item); otherwise the command returns the list
        of all of the tablelist items corresponding to the indices specified by
        <code><i>indexList</i></code>.</dd>

        <dt class="tm" id="getcells"><code><i>pathName</i> <b>getcells</b>
        <i>firstCell</i> <i>lastCell</i></code><br>
        <code><i>pathName</i> <b>getcells</b> <i>cellIndexList</i></code></dt>

        <dd>The first form of the command returns a list whose elements are all
        of the tablelist elements (i.e., cell contents) between
        <code><i>firstCell</i></code> and <code><i>lastCell</i></code>,
        inclusive.&nbsp; The value returned by the second form depends on the
        number of elements in the list <code><i>cellIndexList</i></code>: if
        the latter contains exactly one cell index then the return value is the
        tablelist element indicated by that cell index; otherwise the command
        returns the list of all of the tablelist elements corresponding to the
        cell indices specified by <code><i>cellIndexList</i></code>.</dd>

        <dt class="tm" id="getcolumns"><code><i>pathName</i> <b>getcolumns</b>
        <i>firstColumn</i> <i>lastColumn</i></code><br>
        <code><i>pathName</i> <b>getcolumns</b>
        <i>columnIndexList</i></code></dt>

        <dd>The first form of the command returns a list whose elements are
        lists themselves, where each of the sublists corresponds to exactly one
        column between <code><i>firstColumn</i></code> and
        <code><i>lastColumn</i></code>, inclusive, and consists of all of the
        tablelist elements contained in that column.&nbsp; The value returned
        by the second form depends on the number of elements in the list
        <code><i>columnIndexList</i></code>: 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 <code><i>columnIndexList</i></code> and consists of all
        of the tablelist elements contained in that column.</dd>

        <dt class="tm" id="getformatted"><code><i>pathName</i>
        <b>getformatted</b> <i>first</i> <i>last</i></code><br>
        <code><i>pathName</i> <b>getformatted</b> <i>indexList</i></code></dt>

        <dd>The first form of the command returns a list whose elements are all
        of the <a href="#col_formatted">formatted</a> tablelist items (i.e.,
        formatted row contents) between <code><i>first</i></code> and
        <code><i>last</i></code>, inclusive.&nbsp; The value returned by the
        second form depends on the number of elements in the list
        <code><i>indexList</i></code>: 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);
        otherwise the command returns the list of all of the formatted
        tablelist items corresponding to the indices specified by
        <code><i>indexList</i></code>.</dd>

        <dt class="tm" id="getformattedcells"><code><i>pathName</i>
        <b>getformattedcells</b> <i>firstCell</i> <i>lastCell</i></code><br>
        <code><i>pathName</i> <b>getformattedcells</b>
        <i>cellIndexList</i></code></dt>

        <dd>The first form of the command returns a list whose elements are all
        of the <a href="#col_formatted">formatted</a> tablelist elements (i.e.,
        formatted cell contents) between <code><i>firstCell</i></code> and
        <code><i>lastCell</i></code>, inclusive.&nbsp; The value returned by
        the second form depends on the number of elements in the list
        <code><i>cellIndexList</i></code>: if the latter contains exactly one
        cell index then the return value is the formatted tablelist element
        indicated by that cell index; otherwise the command returns the list of
        all of the formatted tablelist elements corresponding to the cell
        indices specified by <code><i>cellIndexList</i></code>.</dd>

        <dt class="tm" id="getformattedcolumns"><code><i>pathName</i>
        <b>getformattedcolumns</b> <i>firstColumn</i>
        <i>lastColumn</i></code><br>
        <code><i>pathName</i> <b>getformattedcolumns</b>
        <i>columnIndexList</i></code></dt>

        <dd>The first form of the command returns a list whose elements are
        lists themselves, where each of the sublists corresponds to exactly one
        column between <code><i>firstColumn</i></code> and
        <code><i>lastColumn</i></code>, inclusive, and consists of all of the
        <a href="#col_formatted">formatted</a> tablelist elements contained in
        that column.&nbsp; The value returned by the second form depends on the
        number of elements in the list <code><i>columnIndexList</i></code>: 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
        <code><i>columnIndexList</i></code> and consists of all of the
        formatted tablelist elements contained in that column.</dd>

        <dt class="tm" id="getfullkeys"><code><i>pathName</i>
        <b>getfullkeys</b> <i>first</i> <i>last</i></code><br>
        <code><i>pathName</i> <b>getfullkeys</b> <i>indexList</i></code></dt>

        <dd>The first form of the command returns a list whose elements are all
        of the full keys associated with the tablelist items between
        <code><i>first</i></code> and <code><i>last</i></code>,
        inclusive.&nbsp; The value returned by the second form depends on the
        number of elements in the list <code><i>indexList</i></code>: if the
        latter contains exactly one index then the return value is the full key
        associated with the tablelist item indicated by that index (or an empty
        string if the index refers to a non-existent item); otherwise the
        command returns the list of all of the full keys associated with the
        tablelist items corresponding to the indices specified by
        <code><i>indexList</i></code>.</dd>

        <dd class="tm">Each item of a tablelist widget has a unique sequence
        number that remains unchanged until the item is deleted, thus acting as
        a key that uniquely identifies the item even if the latter's position
        (i.e., numerical row index) changes.&nbsp; This command provides
        read-only access to the full keys obtained by prepending the letter
        <code><b>k</b></code> to these internal item IDs.</dd>

        <dt class="tm" id="getkeys"><code><i>pathName</i> <b>getkeys</b>
        <i>first</i> <i>last</i></code><br>
        <code><i>pathName</i> <b>getkeys</b> <i>indexList</i></code></dt>

        <dd>The first form of the command returns a list whose elements are all
        of the sequence numbers associated with the tablelist items between
        <code><i>first</i></code> and <code><i>last</i></code>,
        inclusive.&nbsp; The value returned by the second form depends on the
        number of elements in the list <code><i>indexList</i></code>: if the
        latter contains exactly one index then the return value is the sequence
        number associated with the tablelist item indicated by that index (or
        an empty string if the index refers to a non-existent item); otherwise
        the command returns the list of all of the sequence numbers associated
        with the tablelist items corresponding to the indices specified by
        <code><i>indexList</i></code>.</dd>

        <dd class="tm">Each item of a tablelist widget has a unique sequence
        number that remains unchanged until the item is deleted, thus acting as
        a key that uniquely identifies the item even if the latter's position
        (i.e., numerical row index) changes.&nbsp; This command provides
        read-only access to these internal item IDs.</dd>

        <dt class="tm" id="hasattrib"><code><i>pathName</i> <b>hasattrib</b>
        <i>name</i></code></dt>

        <dd>Returns <code>1</code> if the attribute <code><i>name</i></code>
        exists and <code>0</code> otherwise.</dd>

        <dt class="tm" id="hascellattrib"><code><i>pathName</i>
        <b>hascellattrib</b> <i>cellIndex</i> <i>name</i></code></dt>

        <dd>Returns <code>1</code> if the attribute <code><i>name</i></code>
        for the cell given by <code><i>cellIndex</i></code> exists and
        <code>0</code> otherwise.</dd>

        <dt class="tm" id="hascolumnattrib"><code><i>pathName</i>
        <b>hascolumnattrib</b> <i>columnIndex</i> <i>name</i></code></dt>

        <dd>Returns <code>1</code> if the attribute <code><i>name</i></code>
        for the column given by <code><i>columnIndex</i></code> exists and
        <code>0</code> otherwise.</dd>

        <dt class="tm" id="hasrowattrib"><code><i>pathName</i>
        <b>hasrowattrib</b> <i>index</i> <i>name</i></code></dt>

        <dd>Returns <code>1</code> if the attribute <code><i>name</i></code>
        for the row given by <code><i>index</i></code> exists and
        <code>0</code> otherwise.</dd>

        <dt class="tm" id="hidetargetmark"><code><i>pathName</i>
        <b>hidetargetmark</b></code></dt>

        <dd>Hides the horizontal gap or vertical bar displayed by the
        <code><b><a href="#showtargetmark">showtargetmark</a></b></code>
        command.&nbsp; No error is generated if the target indicator is not
        visible at the time the command is invoked.</dd>

        <dd class="tm">This command is designed to be used during a drag &amp;
        drop operation for which the tablelist widget (or its body component)
        was registered as a drop target.&nbsp; See the <a href=
        "#drag_and_drop_support">DRAG &amp; DROP SUPPORT</a> section for
        details and examples.</dd>

        <dt class="tm" id="imagelabelpath"><code><i>pathName</i>
        <b>imagelabelpath</b> <i>cellIndex</i></code></dt>

        <dd>Returns the path name of the label widget containing the image
        embedded into the cell given by <code><i>cellIndex</i></code>, as
        specified with the <code><b><a href="#cell_image">-image</a></b></code>
        option of the <code><b><a href=
        "#cellconfigure">cellconfigure</a></b></code> subcommand.&nbsp; If no
        image is currently embedded into the cell then the return value is an
        empty string.</dd>

        <dd class="tm">
          <b>REMARK:</b>&nbsp; This subcommand comes in handy if you want to
          associate a binding script with the embedded images.&nbsp; The
          recommended way to achieve this is shown in the following example:

          <blockquote>
            <pre>
bind [.tbl <a href="#bodytag">bodytag</a>] &lt;Button-1&gt; {printClickedImage %W %x %y}<br>
proc printClickedImage {w x y} {
    foreach {tbl x y} [<a href=
"tablelistBinding.html#convEventFields">tablelist::convEventFields</a> $w $x $y] {}
    set cellIdx [$tbl <a href="#containingcell">containingcell</a> $x $y]
    scan $cellIdx "%d,%d" row col
    if {$row &gt;= 0 &amp;&amp; $col &gt;= 0 &amp;&amp;
        [string compare $w [$tbl <span>imagelabelpath</span> $cellIdx]] == 0} {
        puts "clicked the image of cell $cellIdx"
    }
}
</pre>
          </blockquote>
        </dd>

        <dt class="tm" id="index"><code><i>pathName</i> <b>index</b>
        <i>index</i></code></dt>

        <dd>Returns the integer row index value that corresponds to
        <code><i>index</i></code>.&nbsp; For compatibility with the Tk core
        listbox, if <code><i>index</i></code> is <code><b>end</b></code> then
        the return value is the number of items in the tablelist (not the index
        of the last item).&nbsp; To get the numerical index of the last item,
        you can pass the word <code><b>last</b></code> as
        <code><i>index</i></code> argument.</dd>

        <dt class="tm" id="insert"><code><i>pathName</i> <b>insert</b>
        <i>index</i> ?<i>item</i> <i>item</i> ...?</code></dt>

        <dd>Inserts zero or more new items in the widget's internal list just
        before the item given by <code><i>index</i></code> if the tablelist's
        <code><b><a href="#state">state</a></b></code> is not
        <code><b>disabled</b></code>.&nbsp; If <code><i>index</i></code> equals
        the number of items or is specified as <code><b>end</b></code> then the
        new items are added to the end of the widget's list.&nbsp; Tabulator
        characters are displayed as <code>\t</code> (i.e., a backslash followed
        by a <code>t</code>) but are inserted unchanged into the internal
        list.&nbsp; Newline characters will force line breaks, i.e., will give
        rise to multi-line elements (which are displayed in embedded message
        widgets, created on demand).&nbsp; The return value is the list of full
        keys associated with the items just inserted.</dd>

        <dd class="tm"><b>REMARK:</b>&nbsp; This subcommand is not suitable for
        inserting items into a tablelist designed for displaying a tree
        hierarchy.&nbsp; For such tablelist widgets use the <code><b><a href=
        "#insertchildren">insertchildren</a></b></code> or <code><b><a href=
        "#insertchildlist">insertchildlist</a></b></code> subcommand.</dd>

        <dt class="tm" id="insertchildlist"><code><i>pathName</i>
        <b>insertchildlist</b> <i>parentNodeIndex</i> <i>childIndex</i>
        <i>itemList</i></code></dt>

        <dd>Inserts the items of the list <code><i>itemList</i></code> in the
        widget's internal list of children of the node specified by
        <code><i>parentNodeIndex</i></code> just before the item given by
        <code><i>childIndex</i></code> if the tablelist's <code><b><a href=
        "#state">state</a></b></code> is not
        <code><b>disabled</b></code>.&nbsp; <code><i>childIndex</i></code> must
        be a number, <code><b>last</b></code> (specifying the parent's last
        child), or <code><b>end</b></code>; if it equals the number of children
        of the node given by <code><i>parentNodeIndex</i></code> or is
        specified as <code><b>end</b></code> then the new items are added to
        the end of the parent's list of children.&nbsp; Tabulator characters
        are displayed as <code>\t</code> (i.e., a backslash followed by a
        <code>t</code>) but are inserted unchanged into the internal
        list.&nbsp; Newline characters will force line breaks, i.e., will give
        rise to multi-line elements (which are displayed in embedded message
        widgets, created on demand).&nbsp; The return value is the list of full
        keys associated with the items just inserted.</dd>

        <dd class="tm">
          This command has the same effect as

          <blockquote>
            <pre>
eval [list <i>pathName</i> <a href=
"#insertchildren">insertchildren</a> <i>parentNodeIndex</i> <i>childIndex</i>] <i>itemList</i>
</pre>
          </blockquote>
        </dd>

        <dd>but it is more efficient and easier to use.</dd>

        <dd class="tm">For technical reasons (the use of the
        <code><b>-elide</b></code> text widget tag option for collapsing a
        row), this subcommand is not supported for Tk versions earlier than
        8.3.</dd>

        <dd class="tm"><b>REMARK:</b>&nbsp; You can achieve a quite significant
        speadup by using this subcommand to insert a whole list of items rather
        than using multiple invocations of <code><b><a href=
        "#insertchildren">insertchildren</a></b></code>.</dd>

        <dt class="tm" id="insertchildren"><code><i>pathName</i>
        <b>insertchildren</b> <i>parentNodeIndex</i> <i>childIndex</i>
        ?<i>item</i> <i>item</i> ...?</code></dt>

        <dd>Inserts zero or more new items in the widget's internal list of
        children of the node specified by <code><i>parentNodeIndex</i></code>
        just before the item given by <code><i>childIndex</i></code> if the
        tablelist's <code><b><a href="#state">state</a></b></code> is not
        <code><b>disabled</b></code>.&nbsp; <code><i>childIndex</i></code> must
        be a number, <code><b>last</b></code> (specifying the parent's last
        child), or <code><b>end</b></code>; if it equals the number of children
        of the node given by <code><i>parentNodeIndex</i></code> or is
        specified as <code><b>end</b></code> then the new items are added to
        the end of the parent's list of children.&nbsp; Tabulator characters
        are displayed as <code>\t</code> (i.e., a backslash followed by a
        <code>t</code>) but are inserted unchanged into the internal
        list.&nbsp; Newline characters will force line breaks, i.e., will give
        rise to multi-line elements (which are displayed in embedded message
        widgets, created on demand).&nbsp; The return value is the list of full
        keys associated with the items just inserted.</dd>

        <dd class="tm">For technical reasons (the use of the
        <code><b>-elide</b></code> text widget tag option for collapsing a
        row), this subcommand is not supported for Tk versions earlier than
        8.3.</dd>

        <dd class="tm"><b>REMARK:</b>&nbsp; It is explicitly allowed to
        abbreviate the name <code><b>insertchildren</b></code> as
        <code><b>insertchild</b></code>.&nbsp; This comes in handy when using
        this subcommand to insert just one child item.</dd>

        <dt class="tm" id="insertcolumnlist"><code><i>pathName</i>
        <b>insertcolumnlist</b> <i>columnIndex</i>
        <i>columnList</i></code></dt>

        <dd>Inserts the columns specified by the list
        <code><i>columnList</i></code> just before the column given by
        <code><i>columnIndex</i></code> if the tablelist's <code><b><a href=
        "#state">state</a></b></code> is not
        <code><b>disabled</b></code>.&nbsp; If <code><i>columnIndex</i></code>
        equals the number of columns or is specified as <code><b>end</b></code>
        then the new columns are added to the end of the column list.&nbsp; The
        argument <code><i>columnList</i></code> must be a list containing the
        width, title, and optional alignment specifications for the new
        columns, in the same form as in the case of the <code><b><a href=
        "#columns">-columns</a></b></code> configuration option.&nbsp; The
        return value is an empty string.&nbsp; The elements of the new columns
        are initially empty strings; the easiest way to change these values is
        to use the <code><b><a href="#fillcolumn">fillcolumn</a></b></code>
        subcommand or the <code><b><a href="#col_text">-text</a></b></code>
        column configuration option.</dd>

        <dd class="tm">
          This command has the same effect as

          <blockquote>
            <pre>
eval [list <i>pathName</i> <a href=
"#insertcolumns">insertcolumns</a> <i>columnIndex</i>] <i>columnList</i>
</pre>
          </blockquote>
        </dd>

        <dd>but it is more efficient and easier to use.</dd>

        <dt class="tm" id="insertcolumns"><code><i>pathName</i>
        <b>insertcolumns</b> <i>columnIndex</i> ?<i>width</i> <i>title</i>
        ?<i>alignment</i>? <i>width</i> <i>title</i> ?<i>alignment</i>?
        ...?</code></dt>

        <dd>Inserts zero or more new columns just before the column given by
        <code><i>columnIndex</i></code> if the tablelist's <code><b><a href=
        "#state">state</a></b></code> is not
        <code><b>disabled</b></code>.&nbsp; If <code><i>columnIndex</i></code>
        equals the number of columns or is specified as <code><b>end</b></code>
        then the new columns are added to the end of the column list.&nbsp; The
        arguments following the column index have the same meanings as in the
        case of the <code><b><a href="#columns">-columns</a></b></code>
        configuration option.&nbsp; The return value is an empty string.&nbsp;
        The elements of the new columns are initially empty strings; the
        easiest way to change these values is to use the <code><b><a href=
        "#fillcolumn">fillcolumn</a></b></code> subcommand or the
        <code><b><a href="#col_text">-text</a></b></code> column configuration
        option.</dd>

        <dt class="tm" id="insertlist"><code><i>pathName</i> <b>insertlist</b>
        <i>index</i> <i>itemList</i></code></dt>

        <dd>Inserts the items of the list <code><i>itemList</i></code> in the
        widget's internal list just before the item given by
        <code><i>index</i></code> if the tablelist's <code><b><a href=
        "#state">state</a></b></code> is not
        <code><b>disabled</b></code>.&nbsp; If <code><i>index</i></code> equals
        the number of items or is specified as <code><b>end</b></code> then the
        new items are added to the end of the widget's list.&nbsp; Tabulator
        characters are displayed as <code>\t</code> (i.e., a backslash followed
        by a <code>t</code>) but are inserted unchanged into the internal
        list.&nbsp; Newline characters will force line breaks, i.e., will give
        rise to multi-line elements (which are displayed in embedded message
        widgets, created on demand).&nbsp; The return value is the list of full
        keys associated with the items just inserted.</dd>

        <dd class="tm">
          This command has the same effect as

          <blockquote>
            <pre>
eval [list <i>pathName</i> <a href=
"#insert">insert</a> <i>index</i>] <i>itemList</i>
</pre>
          </blockquote>
        </dd>

        <dd>but it is more efficient and easier to use.</dd>

        <dd class="tm"><b>REMARK 1:</b>&nbsp; You can achieve a quite
        significant speadup by using this subcommand to insert a whole list of
        items rather than using multiple invocations of <code><b><a href=
        "#insert">insert</a></b></code>.</dd>

        <dd class="tm"><b>REMARK 2:</b>&nbsp; This subcommand is not suitable
        for inserting items into a tablelist designed for displaying a tree
        hierarchy.&nbsp; For such tablelist widgets use the <code><b><a href=
        "#insertchildlist">insertchildlist</a></b></code> or <code><b><a href=
        "#insertchildren">insertchildren</a></b></code> subcommand.</dd>

        <dt class="tm" id="iselemsnipped"><code><i>pathName</i>
        <b>iselemsnipped</b> <i>cellIndex</i> <i>fullTextName</i></code></dt>

        <dd>Returns the value <code>1</code> if the text displayed in the cell
        specified by <code><i>cellIndex</i></code> is snipped and
        <code>0</code> otherwise.&nbsp; In both cases, the full (unsnipped)
        cell text is stored in the variable having the name given by
        <code><i>fullTextName</i></code>; this full text can be the cell's
        contents or the string obtained from the latter by using the
        <code><b><a href="#col_formatcommand">-formatcommand</a></b></code>
        option of the cell's column.&nbsp; The most common invocation of this
        command occurs within the procedure specified as the value of the
        <code><b><a href="#tooltipaddcommand">-tooltipaddcommand</a></b></code>
        configuration option.</dd>

        <dt class="tm" id="isexpanded"><code><i>pathName</i> <b>isexpanded</b>
        <i>index</i></code></dt>

        <dd>Returns the value <code>1</code> if the row indicated by
        <code><i>index</i></code> is expanded and <code>0</code>
        otherwise.</dd>

        <dt class="tm" id="istitlesnipped"><code><i>pathName</i>
        <b>istitlesnipped</b> <i>columnIndex</i>
        <i>fullTextName</i></code></dt>

        <dd>Returns the value <code>1</code> if the text displayed in the
        header label specified by <code><i>columnIndex</i></code> is snipped
        and <code>0</code> otherwise.&nbsp; In both cases, the full (unsnipped)
        label text is stored in the variable having the name given by
        <code><i>fullTextName</i></code>.&nbsp; The most common invocation of
        this command occurs within the procedure specified as the value of the
        <code><b><a href="#tooltipaddcommand">-tooltipaddcommand</a></b></code>
        configuration option.</dd>

        <dt class="tm" id="isviewable"><code><i>pathName</i> <b>isviewable</b>
        <i>index</i></code></dt>

        <dd>Returns the value <code>1</code> if the row indicated by
        <code><i>index</i></code> is <b>viewable</b> and <code>0</code>
        otherwise.&nbsp; A tablelist row is called viewable if the value of its
        <code><b><a href="#row_hide">-hide</a></b></code> option is false and
        all its ancestors are (partly) expanded. &nbsp; Likewise, a tablelist
        cell is called viewable if its row is viewable and the value of its
        column's <code><b><a href="#col_hide">-hide</a></b></code> option is
        false.</dd>

        <dt class="tm" id="itemlistvar"><code><i>pathName</i>
        <b>itemlistvar</b></code></dt>

        <dd>
          Returns the name of a variable used by Tablelist to hold the widget's
          internal list.&nbsp; The recommended way to use this variable is to
          create a link to it with the aid of the <code><b>upvar</b></code>
          command, like in the following example:

          <blockquote>
            <pre>
upvar #0 [.tbl <span>itemlistvar</span>] itemList
</pre>
          </blockquote>
        </dd>

        <dd>In this example, the value of the variable <code>itemList</code>
        will be the internal list of the tablelist widget
        <code>.tbl</code>.&nbsp; 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.</dd>

        <dd class="tm"><b>REMARK:</b>&nbsp; The <code><b>itemlistvar</b></code>
        command provides an efficient way for accessing this internal list,
        instead of retrieving the items with the <code><b><a href=
        "#get">get</a></b></code> subcommand or using the <code><b><a href=
        "#listvariable">-listvariable</a></b></code> option (these methods
        consume significantly more memory).&nbsp; It can be useful in
        situations where the elements of a tablelist widget are to be accessed
        for creating text files, HTML output, XML data, database commands,
        etc.&nbsp; This should, however, be a strictly readonly access;
        otherwise the results will be unpredictable!</dd>

        <dt class="tm" id="labelpath"><code><i>pathName</i> <b>labelpath</b>
        <i>columnIndex</i></code></dt>

        <dd>Returns the path name of the header label corresponding to the
        column indicated by <code><i>columnIndex</i></code>.</dd>

        <dt class="tm" id="labels"><code><i>pathName</i>
        <b>labels</b></code></dt>

        <dd>Returns a list containing the path names of all header labels of
        the widget.</dd>

        <dt class="tm" id="labeltag"><code><i>pathName</i>
        <b>labeltag</b></code></dt>

        <dd>Returns the name of a binding tag whose name depends on the path
        name of the tablelist widget and which is associated with the header
        labels as well as with the additional widgets placed by Tablelist into
        the latters for displaying header images and sort arrows.&nbsp; This
        binding tag is designed to be used when defining non-default binding
        scripts for the header labels.&nbsp; From within such event handling
        scripts you can retrieve the column number and the tablelist widget's
        path name with the aid of the helper commands <code><b><a href=
        "tablelistBinding.html#getTablelistColumn">tablelist::getTablelistColumn</a></b></code>
        and <code><b><a href=
        "tablelistBinding.html#getTablelistPath">tablelist::getTablelistPath</a></b></code>.</dd>

        <dt class="tm" id="move"><code><i>pathName</i> <b>move</b>
        <i>sourceIndex</i> <i>targetIndex</i></code><br>
        <code><i>pathName</i> <b>move</b> <i>sourceIndex</i>
        <i>targetParentNodeIndex</i> <i>targetChildIndex</i></code></dt>

        <dd>The first form of the command moves the item indicated by
        <code><i>sourceIndex</i></code> just before the one given by
        <code><i>targetIndex</i></code> if the tablelist's <code><b><a href=
        "#state">state</a></b></code> is not
        <code><b>disabled</b></code>.&nbsp; If <code><i>targetIndex</i></code>
        equals the nunber of items or is specified as <code><b>end</b></code>
        then the source item is moved after the last one.&nbsp; The item
        specified by <code><i>targetIndex</i></code> must have the same parent
        as the one given by <code><i>sourceIndex</i></code>, or else it must be
        the item just below the last descendant of the source node's
        parent.</dd>

        <dd class="tm">The command's second form moves the item indicated by
        <code><i>sourceIndex</i></code> just before the node having the parent
        indicated by <code><i>targetParentNodeIndex</i></code> and the index
        <code><i>targetChildIndex</i></code> in the parent's list of children
        if the tablelist's <code><b><a href="#state">state</a></b></code> is
        not <code><b>disabled</b></code>.&nbsp;
        <code><i>targetChildIndex</i></code> must be a number,
        <code><b>last</b></code> (specifying the target parent's last child),
        or <code><b>end</b></code>; if it equals the number of children of the
        target parent node or is specified as <code><b>end</b></code> then the
        source item is moved after the target parent node's last child.</dd>

        <dd class="tm">Both forms of the command preserve the node hierarchy
        under the source item, by moving its descendants accordingly.&nbsp; The
        return value is an empty string.</dd>

        <dt class="tm" id="movecolumn"><code><i>pathName</i> <b>movecolumn</b>
        <i>sourceColumn</i> <i>targetColumn</i></code></dt>

        <dd>Moves the column indicated by <code><i>sourceColumn</i></code> just
        before the one given by <code><i>targetColumn</i></code> if the
        tablelist's <code><b><a href="#state">state</a></b></code> is not
        <code><b>disabled</b></code>.&nbsp; If <code><i>targetColumn</i></code>
        equals the number of columns or is specified as <code><b>end</b></code>
        then the source column is moved after the last one.&nbsp; Returns an
        empty string.</dd>

        <dt class="tm" id="nearest"><code><i>pathName</i> <b>nearest</b>
        <i>y</i></code></dt>

        <dd>Given a y-coordinate within the tablelist window, this command
        returns the index of the <a href="#isviewable">viewable</a> tablelist
        item nearest to that y-coordinate.&nbsp; The coordinate
        <code><i>y</i></code> is expected to be relative to the tablelist
        window itself (not its body component).</dd>

        <dt class="tm" id="nearestcell"><code><i>pathName</i>
        <b>nearestcell</b> <i>x</i> <i>y</i></code></dt>

        <dd>Given an x- and a y-coordinate within the tablelist window, this
        command returns the index of the <a href="#isviewable">viewable</a>
        tablelist cell nearest to the point having these coordinates.&nbsp; The
        coordinates <code><i>x</i></code> and <code><i>y</i></code> are
        expected to be relative to the tablelist window itself (not its body
        component).</dd>

        <dt class="tm" id="nearestcolumn"><code><i>pathName</i>
        <b>nearestcolumn</b> <i>x</i></code></dt>

        <dd>Given an x-coordinate within the tablelist window, this command
        returns the index of the non-hidden tablelist column nearest to that
        x-coordinate.&nbsp; The coordinate <code><i>x</i></code> is expected to
        be relative to the tablelist window itself (not its body
        component).</dd>

        <dt class="tm" id="noderow"><code><i>pathName</i> <b>noderow</b>
        <i>parentNodeIndex</i> <i>childIndex</i></code></dt>

        <dd>Returns the numerical row index of the node having the parent
        indicated by <code><i>parentNodeIndex</i></code> and the index
        <code><i>childIndex</i></code> in the parent's list of children.&nbsp;
        <code><i>childIndex</i></code> must be a number,
        <code><b>last</b></code> (specifying the parent's last child), or
        <code><b>end</b></code>; if it equals the number of children of the
        parent node or is specified as <code><b>end</b></code> then the return
        value will be the row index of the item following the parent node's
        last descendant.</dd>

        <dt class="tm" id="parentkey"><code><i>pathName</i> <b>parentkey</b>
        <i>nodeIndex</i></code></dt>

        <dd>Returns the full key of the parent of the tree node indicated by
        <code><i>nodeIndex</i></code>.&nbsp; If this argument is specified as
        <code><b>root</b></code> then the return value will be an empty
        string.&nbsp; If <code><i>nodeIndex</i></code> identifies a top-level
        item then the subcommand will return <code><b>root</b></code>.&nbsp;
        For all other items the return value will be a full key of the form
        <code><b>k</b><i>number</i></code>.</dd>

        <dt class="tm" id="refreshsorting"><code><i>pathName</i>
        <b>refreshsorting</b> ?<i>parentNodeIndex</i>?</code></dt>

        <dd>Sorts the children of the tablelist node specified by
        <code><i>parentNodeIndex</i></code> according to the parameters of the
        most recent <code><b><a href="#sort">sort</a></b></code>,
        <code><b><a href="#sortbycolumn">sortbycolumn</a></b></code>, or
        <code><b><a href="#sortbycolumnlist">sortbycolumnlist</a></b></code>
        invocation.&nbsp; If the items haven't been sorted at all, or the sort
        information was reset by invoking <code><b><a href=
        "#resetsortinfo">resetsortinfo</a></b></code>, then no sorting takes
        place.&nbsp; The optional argument <code><i>parentNodeIndex</i></code>
        defaults to <code><b>root</b></code>, meaning that all the items are to
        be sorted per default.&nbsp; The return value is an empty string.</dd>

        <dt class="tm" id="rejectinput"><code><i>pathName</i>
        <b>rejectinput</b></code></dt>

        <dd>If invoked from within the Tcl command specified by the
        <code><b><a href="#editendcommand">-editendcommand</a></b></code>
        configuration option, then this subcommand prevents the termination of
        the interactive editing of the contents of the cell whose index was
        passed to the <code><b><a href="#editcell">editcell</a></b></code>
        subcommand.&nbsp; It invokes the <code><b><a href=
        "#seecell">seecell</a></b></code> subcommand to make sure the
        respective cell becomes visible (in case it was scrolled out of view),
        and sets the focus to the temporary widget embedded into the
        cell.&nbsp; This command enables you to reject the widget's text during
        the final validation of the string intended to become the new cell
        contents.&nbsp; The return value is an empty string.</dd>

        <dt class="tm" id="resetsortinfo"><code><i>pathName</i>
        <b>resetsortinfo</b></code></dt>

        <dd>Resets the information about the sorting of the items.&nbsp;
        Subsequent invocations of <code><b><a href=
        "#sortcolumn">sortcolumn</a></b></code> and <code><b><a href=
        "#sortorder">sortorder</a></b></code> will return <code>-1</code> and
        an empty string, respectively.&nbsp; Similarly, subsequent invocations
        of <code><b><a href="#sortcolumnlist">sortcolumnlist</a></b></code> and
        <code><b><a href="#sortorderlist">sortorderlist</a></b></code> will
        return an empty string.&nbsp; This command also removes any existing
        up- or down-arrows displayed by an earlier invocation of
        <code><b><a href="#sortbycolumn">sortbycolumn</a></b></code> or
        <code><b><a href=
        "#sortbycolumnlist">sortbycolumnlist</a></b></code>.&nbsp; The return
        value is an empty string.</dd>

        <dt class="tm" id="rowattrib"><code><i>pathName</i> <b>rowattrib</b>
        <i>index</i> ?<i>name</i>? ?<i>value</i> <i>name</i> <i>value</i>
        ...?</code></dt>

        <dd>Queries or modifies the attributes of the row given by
        <code><i>index</i></code>.&nbsp; If no <code><i>name</i></code> is
        specified, the command returns a list of pairs, each of which contains
        the name and the value of an attribute for the row.&nbsp; If
        <code><i>name</i></code> is specified with no
        <code><i>value</i></code>, then the command returns the value of the
        one named row attribute, or an empty string if no corresponding value
        exists (you can use the <code><b><a href=
        "#hasrowattrib">hasrowattrib</a></b></code> subcommand to distinguish
        this case from the one that the value of an <i>existing</i> row
        attribute is an empty string).&nbsp; If one or more
        <code><i>name</i></code>-<code><i>value</i></code> pairs are specified,
        then the command sets the given row attribute(s) to the given value(s);
        in this case the return value is an empty string.&nbsp;
        <code><i>name</i></code> may be an arbitrary string.</dd>

        <dt class="tm" id="rowcget"><code><i>pathName</i> <b>rowcget</b>
        <i>index</i> <i>option</i></code></dt>

        <dd>Returns the current value of the row configuration option given by
        <code><i>option</i></code> for the row specified by
        <code><i>index</i></code>.&nbsp; <code><i>option</i></code> may have
        any of the values accepted by the <code><b><a href=
        "#rowconfigure">rowconfigure</a></b></code> command.</dd>

        <dt class="tm" id="rowconfigure"><code><i>pathName</i>
        <b>rowconfigure</b> <i>index</i> ?<i>option</i>? ?<i>value</i>
        <i>option</i> <i>value</i> ...?</code></dt>

        <dd>Queries or modifies the configuration options of the row given by
        <code><i>index</i></code>.&nbsp; If no <code><i>option</i></code> is
        specified, the command returns a list describing all of the available
        options for the row (see <code><b>Tk_ConfigureInfo</b></code> for
        information on the format of this list).&nbsp; If
        <code><i>option</i></code> is specified with no
        <code><i>value</i></code>, then the command returns a list describing
        the one named option (this list will be identical to the corresponding
        sublist of the value returned if no <code><i>option</i></code> is
        specified).&nbsp; If one or more
        <code><i>option</i></code>-<code><i>value</i></code> pairs are
        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.&nbsp; <code><i>option</i></code> may have any of the values
        described in the <a href="#row_options">ROW CONFIGURATION OPTIONS</a>
        section.</dd>

        <dt class="tm" id="scan"><code><i>pathName</i> <b>scan</b>
        <i>option</i> <i>args</i></code></dt>

        <dd>This command is used to implement scanning on tablelist
        widgets.&nbsp; It has two forms, depending on
        <code><i>option</i></code>:</dd>

        <dd>
          <dl>
            <dt class="tm"><code><i>pathName</i> <b>scan</b> <b>mark</b>
            <i>x</i> <i>y</i></code></dt>

            <dd>Records <code><i>x</i></code> and <code><i>y</i></code> and the
            current view in the tablelist window; used in conjunction with
            later&nbsp; <code><b>scan</b> <b>dragto</b></code>&nbsp;
            commands.&nbsp; Typically this command is associated with a mouse
            button press in the body component of the widget.&nbsp; It returns
            an empty string.&nbsp; The coordinates <code><i>x</i></code> and
            <code><i>y</i></code> are expected to be relative to the tablelist
            window itself (not its body component).</dd>

            <dt class="tm"><code><i>pathName</i> <b>scan</b> <b>dragto</b>
            <i>x</i> <i>y</i></code></dt>

            <dd>This command computes the difference between its
            <code><i>x</i></code> and <code><i>y</i></code> arguments to the
            last&nbsp; <code><b>scan</b> <b>mark</b></code>&nbsp; command for
            the widget.&nbsp; It then adjusts the view (the vertical one only
            in the body component) by 10 times the difference in
            coordinates.&nbsp; This command is typically associated with mouse
            motion events in the body component of the widget, to produce the
            effect of dragging the table at high speed through the
            window.&nbsp; The return value is an empty string.&nbsp; The
            coordinates <code><i>x</i></code> and <code><i>y</i></code> are
            expected to be relative to the tablelist window itself (not its
            body component).</dd>
          </dl>
        </dd>

        <dt class="tm" id="searchcolumn"><code><i>pathName</i>
        <b>searchcolumn</b> <i>columnIndex</i> <i>pattern</i>
        ?<i>options</i>?</code></dt>

        <dd>This subcommand searches the elements of the column given by
        <code><i>columnIndex</i></code> to see if one of them matches
        <code><i>pattern</i></code>.&nbsp; If a match is found, the row index
        of the first matching element is returned as result (unless the option
        <code><b>-all</b></code> is specified).&nbsp; If not, the return value
        is <code>-1</code>.&nbsp; One or more of the following options may be
        specified to control the search:</dd>

        <dd class="tm">
          <table border="0" cellpadding="6" cellspacing="0">
            <tr valign="top">
              <td><code><b>-all</b></code></td>

              <td>Changes the result to be the list of all matching row
              indices, which will be in numeric order (or in reverse numeric
              order when used with the <code><b>-backwards</b></code>
              option).</td>
            </tr>

            <tr valign="top">
              <td><code><b>-backwards</b></code></td>

              <td>The search will proceed backward through the given column's
              elements.</td>
            </tr>

            <tr valign="top">
              <td><code><b>-check</b> <i>command</i></code></td>

              <td>Specifies an additional condition to be fulfilled by the
              matching elements.&nbsp; If an element of the specified column
              matches the given pattern and <i>command</i> is a nonempty
              string, then the latter is automatically concatenated with the
              name of the tablelist widget, the element's row index, the
              numerical equivalent of <code><i>columnIndex</i></code>, as well
              as the element itself or its <a href=
              "#col_formatted">formatted</a> version (depending on the presence
              of the <code><b>-formatted</b></code> option), the resulting
              script is evaluated in the global scope, and the return value
              (which must be a boolean) will determine whether the element in
              question will still be viewed as matching or not.&nbsp; The
              default <i>command</i> is an empty string.&nbsp; This option
              enables you to pass arbitrary additional matching criteria to the
              searching process.</td>
            </tr>

            <tr valign="top">
              <td><code><b>-descend</b></code></td>

              <td>Search the elements of the specified column in all
              descendants of the tree node given by the
              <code><b>-parent</b></code> option.&nbsp; The elements will be
              visited in the order of their row indices (or in reverse order of
              their row indices when used with the
              <code><b>-backwards</b></code> option).&nbsp; The default is to
              restrict the search to the parent node's children only.</td>
            </tr>

            <tr valign="top">
              <td><code><b>-exact</b></code></td>

              <td>The matching element(s) must be identical to the literal
              string <code><i>pattern</i></code>.</td>
            </tr>

            <tr valign="top">
              <td><code><b>-formatted</b></code></td>

              <td>Examine the <a href="#col_formatted">formatted</a> versions
              of the elements rather than the internal cell values.</td>
            </tr>

            <tr valign="top">
              <td><code><b>-glob</b></code></td>

              <td>Treat <code><i>pattern</i></code> as a glob-style pattern and
              match it against the elements using the same rules as the&nbsp;
              <code><b>string match</b></code>&nbsp; command.</td>
            </tr>

            <tr valign="top">
              <td><code><b>-nocase</b></code></td>

              <td>Causes comparisons to be handled in a case-insensitive
              manner.&nbsp; Has no effect if combined with the
              <code><b>-numeric</b></code> option.</td>
            </tr>

            <tr valign="top">
              <td><code><b>-not</b></code></td>

              <td>This option negates the sense of the match, returning the row
              index of the first non-matching element (or, in the presence of
              the <code><b>-all</b></code> option, the list of row indices of
              all non-matching elements) of the given column.</td>
            </tr>

            <tr valign="top">
              <td><code><b>-numeric</b></code></td>

              <td>The elements are to be compared to
              <code><i>pattern</i></code> as integer or floating-point values,
              using the <code><b>==</b></code> comparison operator.&nbsp; This
              option is only meaningful when used with
              <code><b>-exact</b></code>.</td>
            </tr>

            <tr valign="top">
              <td nowrap><code><b>-parent</b>
              <i>nodeIndex</i>&nbsp;&nbsp;</code></td>

              <td>This option restricts the search to the children (or
              descendants, when used with <code><b>-descend</b></code>) of the
              tree node given by <code><i>nodeIndex</i></code>.&nbsp; The
              default parent is <code><b>root</b></code>.</td>
            </tr>

            <tr valign="top">
              <td><code><b>-regexp</b></code></td>

              <td>Treat <code><i>pattern</i></code> as a regular expression and
              match it against the elements using the rules described in the
              <code><b>re_syntax</b></code> reference page.</td>
            </tr>

            <tr valign="top">
              <td><code><b>-start</b> <i>index</i></code></td>

              <td>The elements of the specified column are to be searched
              (forwards or backwards) starting at the row given by
              <code><i>index</i></code>.&nbsp; This option makes it easy to
              provide incremental search.</td>
            </tr>
          </table>
        </dd>

        <dd class="tm">If all matching style options
        <code><b>-exact</b></code>, <code><b>-glob</b></code>, and
        <code><b>-regexp</b></code> are omitted then the matching style
        defaults to <code><b>-glob</b></code>.&nbsp; If more than one of them
        is specified, the last matching style given takes precedence.</dd>

        <dd class="tm">Before examining the children (or descendants, when used
        with the <code><b>-descend</b></code> option) of a row whose children
        have not been inserted yet, the command specified as the value of the
        <code><b><a href="#populatecommand">-populatecommand</a></b></code>
        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 scope.&nbsp; This enables you to insert the
        children on demand, just before searching them for the specified
        pattern.</dd>

        <dt class="tm" id="see"><code><i>pathName</i> <b>see</b>
        <i>index</i></code></dt>

        <dd>Adjusts the view in the tablelist so that the item given by
        <code><i>index</i></code> is visible.&nbsp; 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
        the edge; otherwise the tablelist scrolls to center the item.</dd>

        <dt class="tm" id="seecell"><code><i>pathName</i> <b>seecell</b>
        <i>cellIndex</i></code></dt>

        <dd>Adjusts the view in the tablelist so that the cell given by
        <code><i>cellIndex</i></code> is visible.&nbsp; 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
        the edge; otherwise the tablelist scrolls to center the cell.&nbsp; If
        the value of the <code><b><a href=
        "#titlecolumns">-titlecolumns</a></b></code> option is positive then
        the centering of the cell is only done vertically; the horizontal
        scrolling (which in this case is performed column-wise) will just bring
        the cell into view next to the title columns or at the right edge of
        the window.</dd>

        <dt class="tm">id="seecolumn"&gt;<code><i>pathName</i> <b>seecolumn</b>
        <i>columnIndex</i></code></dt>

        <dd>Adjusts the view in the tablelist so that the column given by
        <code><i>columnIndex</i></code> is visible.&nbsp; If the column is
        already visible then the command has no effect; if the column is near
        one edge of the window then the tablelist scrolls horizontally to bring
        the column into view at the edge; otherwise the tablelist scrolls
        horizontally to center the column.&nbsp; If the value of the
        <code><b><a href="#titlecolumns">-titlecolumns</a></b></code> option is
        positive then the horizontal scrolling (which in this case is performed
        column-wise) will just bring the column into view next to the title
        columns or at the right edge of the window.</dd>

        <dt class="tm" id="selection"><code><i>pathName</i> <b>selection</b>
        <i>option</i> <i>args</i></code></dt>

        <dd>This command is used to adjust the selection within a tablelist
        widget.&nbsp; It has several forms, depending on
        <code><i>option</i></code>:</dd>

        <dd>
          <dl>
            <dt class="tm"><code><i>pathName</i> <b>selection</b> <b>anchor</b>
            <i>index</i></code></dt>

            <dd>Sets the selection anchor to the item given by
            <code><i>index</i></code>.&nbsp; If <code><i>index</i></code>
            refers to a nonexistent or non-<a href="#isviewable">viewable</a>
            item, then the closest viewable item is used.&nbsp; The selection
            anchor is the end of the selection that is fixed while dragging out
            a selection with the mouse if the selection type is
            <code><b>row</b></code>.&nbsp; The index <code><b>anchor</b></code>
            may be used to refer to the anchor item.</dd>

            <dt class="tm"><code><i>pathName</i> <b>selection</b> <b>clear</b>
            <i>first</i> <i>last</i></code><br>
            <code><i>pathName</i> <b>selection</b> <b>clear</b>
            <i>indexList</i></code></dt>

            <dd>If any of the items between <code><i>first</i></code> and
            <code><i>last</i></code> (inclusive) or corresponding to the
            indices specified by the list <code><i>indexList</i></code> contain
            at least one selected cell, they are deselected.&nbsp; 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.</dd>

            <dt class="tm"><code><i>pathName</i> <b>selection</b>
            <b>includes</b> <i>index</i></code></dt>

            <dd>Returns <code>1</code> if the item indicated by
            <code><i>index</i></code> contains at least one selected cell,
            <code>0</code> if it doesn't.</dd>

            <dt class="tm"><code><i>pathName</i> <b>selection</b> <b>set</b>
            <i>first</i> <i>last</i></code><br>
            <code><i>pathName</i> <b>selection</b> <b>set</b>
            <i>indexList</i></code></dt>

            <dd>Selects all of the selectable items in the range between
            <code><i>first</i></code> and <code><i>last</i></code>, inclusive,
            or corresponding to the indices specified by the list
            <code><i>indexList</i></code>, without affecting the selection
            state of any other items.</dd>
          </dl>
        </dd>

        <dd class="tm">If the tablelist's <code><b><a href=
        "#state">state</a></b></code> is <code><b>disabled</b></code> and
        <code><i>option</i></code> is different from
        <code><b>includes</b></code> then the command just returns an empty
        string, without performing any of the above actions.</dd>

        <dt class="tm" id="separatorpath"><code><i>pathName</i>
        <b>separatorpath</b> ?<i>columnIndex</i>?</code></dt>

        <dd>If the optional argument is not specified, then this command
        returns the path name of the special separator displayed to mark the
        end of the title columns if the value of the <code><b><a href=
        "#titlecolumns">-titlecolumns</a></b></code> option is positive and an
        empty string otherwise.&nbsp; If the optional argument is present, then
        the command returns the path name of the separator attached to the
        right edge of the header label indicated by
        <code><i>columnIndex</i></code> if the value of the <code><b><a href=
        "#showseparators">-showseparators</a></b></code> configuration option
        is true and an empty string otherwise.</dd>

        <dt class="tm" id="separators"><code><i>pathName</i>
        <b>separators</b></code></dt>

        <dd>Returns a list containing the path names of all column
        separators.&nbsp; If the value of the <code><b><a href=
        "#titlecolumns">-titlecolumns</a></b></code> option is positive then
        the first element of the list will be the path name of the special
        separator displayed to mark the end of the title columns.&nbsp; Whether
        the path names of the other separators are included in the list,
        depends on the value of the <code><b><a href=
        "#showseparators">-showseparators</a></b></code> configuration
        option.</dd>

        <dt class="tm" id="showtargetmark"><code><i>pathName</i>
        <b>showtargetmark</b> <b>before</b>|<b>inside</b>
        <i>index</i></code></dt>

        <dd>Displays a drop target indicator having the form of a horizontal
        gap or vertical bar before or inside the row specified by
        <code><i>index</i></code>.&nbsp; If the subcommand's name is followed
        by <code><b>before</b></code> and <code><i>index</i></code> equals the
        number of items or is specified as <code><b>end</b></code> then the
        horizontal gap will be shown just <i>after</i> the tablelist's last
        row.&nbsp; If the subcommand is used with the
        <code><b>inside</b></code> option then the index
        <code><b>end</b></code> is interpreted as indicating the widget's last
        item.</dd>

        <dd class="tm">This command is designed to be used during a drag &amp;
        drop operation for which the tablelist widget (or its body component)
        was registered as a drop target.&nbsp; See the <a href=
        "#drag_and_drop_support">DRAG &amp; DROP SUPPORT</a> section for
        details and examples.</dd>

        <dt class="tm" id="size"><code><i>pathName</i> <b>size</b></code></dt>

        <dd>Returns the total number of items in the tablelist widget.</dd>

        <dt class="tm" id="sort"><code><i>pathName</i> <b>sort</b>
        ?<b>-increasing</b>|<b>-decreasing</b>?</code></dt>

        <dd>Sorts the items in increasing or decreasing order, as specified by
        the optional argument.&nbsp; The default is
        <code><b>-increasing</b></code>.&nbsp; Uses the value of the
        <code><b><a href="#sortcommand">-sortcommand</a></b></code> widget
        configuration option as comparison command.&nbsp;
        <code><b>sort</b></code> also removes any existing up- or down-arrows
        displayed by an earlier invocation of <code><b><a href=
        "#sortbycolumn">sortbycolumn</a></b></code> or <code><b><a href=
        "#sortbycolumnlist">sortbycolumnlist</a></b></code>.&nbsp; After
        sorting the items, the command conditionally adjusts the vertical view
        as follows: (a) if interactive cell editing is in progress then the
        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
        itself then the currently active item is brought into view.</dd>

        <dt class="tm" id="sortbycolumn"><code><i>pathName</i>
        <b>sortbycolumn</b> <i>columnIndex</i>
        ?<b>-increasing</b>|<b>-decreasing</b>?</code></dt>

        <dd>Sorts the items based on the elements of the column given by
        <code><i>columnIndex</i></code>, in increasing or decreasing order, as
        specified by the optional argument.&nbsp; The default is
        <code><b>-increasing</b></code>.&nbsp; The sorting process is
        controlled by the values of the <code><b><a href=
        "#col_sortmode">-sortmode</a></b></code> and <code><b><a href=
        "#col_sortcommand">-sortcommand</a></b></code> options for the given
        column.&nbsp; If both the value of the <code><b><a href=
        "#showarrow">-showarrow</a></b></code> configuration option and that of
        the <code><b><a href="#col_showarrow">-showarrow</a></b></code> option
        for the specified column are true then an up- or down-arrow indicating
        the sort order will be placed into the column's label.&nbsp; The shape
        of the arrow depends on the command's optional argument and on the
        value of the <code><b><a href=
        "#incrarrowtype">-incrarrowtype</a></b></code> configuration
        option.&nbsp; If the label's text is right-aligned then the arrow will
        be displayed on the left side of the label, otherwise on its right
        side.&nbsp; After sorting the items, the vertical view is adjusted in
        the same way as in the case of the <code><b><a href=
        "#sort">sort</a></b></code> subcommand.</dd>

        <dd class="tm">The actions described above are only performed if the
        specified column's <code><b><a href=
        "#col_showlinenumbers">-showlinenumbers</a></b></code> option hasn't
        been set to true.</dd>

        <dt class="tm" id="sortbycolumnlist"><code><i>pathName</i>
        <b>sortbycolumnlist</b> <i>columnIndexList</i>
        ?<i>sortOrderList</i>?</code></dt>

        <dd>Sorts the items based on the elements of the columns given by the
        <code><i>columnIndexList</i></code> argument, which must be a list of
        distinct column indices.&nbsp; Only those elements of this list are
        considered significant that identify columns whose <code><b><a href=
        "#col_showlinenumbers">-showlinenumbers</a></b></code> option hasn't
        been set to true.</dd>

        <dd class="tm">The items are first sorted based on the column specified
        by the last significant element of <code><i>columnIndexList</i></code>,
        then based on the one given by the last but one significant element,
        and so on.&nbsp; The order of each sort operation is taken from the
        optional argument <code><i>sortOrderList</i></code>, whose elements
        must be (abbreviations of) <code><b>increasing</b></code> or
        <code><b>decreasing</b></code>.&nbsp; If this argument was not
        specified or contains less elements than
        <code><i>columnIndexList</i></code> then the missing sort orders are
        assumed to be <code><b>increasing</b></code>.&nbsp; Each sorting
        process is controlled by the values of the <code><b><a href=
        "#col_sortmode">-sortmode</a></b></code> and <code><b><a href=
        "#col_sortcommand">-sortcommand</a></b></code> options for the
        respective column.&nbsp; If the column's index was specified among the
        first 9 significant elements of <code><i>columnIndexList</i></code> and
        both the value of the <code><b><a href=
        "#showarrow">-showarrow</a></b></code> configuration option and that of
        the <code><b><a href="#col_showarrow">-showarrow</a></b></code> option
        for that column are true then an up- or down-arrow indicating the sort
        order will be placed into the column's label.&nbsp; The shape of the
        arrow depends on the respective sort order and on the value of the
        <code><b><a href="#incrarrowtype">-incrarrowtype</a></b></code>
        configuration option.&nbsp; If the label's text is right-aligned then
        the arrow will be displayed on the left side of the label, otherwise on
        its right side.&nbsp; If more than one sort arrows are to be displayed
        then the first 9 sort ranks (<code>1</code> for the first significant
        element of <code><i>columnIndexList</i></code>, <code>2</code> for the
        second one, and so on) will also be shown to the right of the
        arrows.&nbsp; After sorting the items, the vertical view is adjusted in
        the same way as in the case of the <code><b><a href=
        "#sort">sort</a></b></code> subcommand.</dd>

        <dt class="tm" id="sortcolumn"><code><i>pathName</i>
        <b>sortcolumn</b></code></dt>

        <dd>Returns the numerical index of the column by which the items were
        last sorted with the aid of the <code><b><a href=
        "#sortbycolumn">sortbycolumn</a></b></code> or <code><b><a href=
        "#sortbycolumnlist">sortbycolumnlist</a></b></code> command, or
        <code>-1</code> if they were last sorted with the <code><b><a href=
        "#sort">sort</a></b></code> command or haven't been sorted at all, or
        the sort information was reset by invoking <code><b><a href=
        "#resetsortinfo">resetsortinfo</a></b></code>.&nbsp; If called from
        within the command specified as the value of the
        <code><b>-sortcommand</b></code> <a href="#sortcommand">widget</a> or
        <a href="#col_sortcommand">column</a> configuration option, then the
        return value of this subcommand refers to the sorting in progress
        rather than the most recent one.</dd>

        <dt class="tm" id="sortcolumnlist"><code><i>pathName</i>
        <b>sortcolumnlist</b></code></dt>

        <dd>Returns a list consisting of the numerical indices of the columns
        by which the items were last sorted with the aid of the
        <code><b><a href="#sortbycolumnlist">sortbycolumnlist</a></b></code> or
        <code><b><a href="#sortbycolumn">sortbycolumn</a></b></code> command
        (in the second case the list will contain exactly one element), or an
        empty string if they were last sorted with the <code><b><a href=
        "#sort">sort</a></b></code> command or haven't been sorted at all, or
        the sort information was reset by invoking <code><b><a href=
        "#resetsortinfo">resetsortinfo</a></b></code>.&nbsp; If called from
        within the command specified as the value of the
        <code><b>-sortcommand</b></code> <a href="#sortcommand">widget</a> or
        <a href="#col_sortcommand">column</a> configuration option, then the
        return value of this subcommand refers to the sorting in progress
        rather than the most recent one.</dd>

        <dt class="tm" id="sortorder"><code><i>pathName</i>
        <b>sortorder</b></code></dt>

        <dd>Returns the sort order (as <code><b>increasing</b></code> or
        <code><b>decreasing</b></code>) from the last sorting performed by the
        <code><b><a href="#sort">sort</a></b></code>, <code><b><a href=
        "#sortbycolumn">sortbycolumn</a></b></code>, or <code><b><a href=
        "#sortbycolumnlist">sortbycolumnlist</a></b></code> command, or an
        empty string if the items haven't been sorted at all, or the sort
        information was reset by invoking <code><b><a href=
        "#resetsortinfo">resetsortinfo</a></b></code>.&nbsp; If called from
        within the command specified as the value of the
        <code><b>-sortcommand</b></code> <a href="#sortcommand">widget</a> or
        <a href="#col_sortcommand">column</a> configuration option, then the
        return value of this subcommand refers to the sorting in progress
        rather than the most recent one.</dd>

        <dt class="tm" id="sortorderlist"><code><i>pathName</i>
        <b>sortorderlist</b></code></dt>

        <dd>Returns a list consisting of the sort orders (as
        <code><b>increasing</b></code> or <code><b>decreasing</b></code>) from
        the last invocation of the <code><b><a href=
        "#sortbycolumnlist">sortbycolumnlist</a></b></code> or
        <code><b><a href="#sortbycolumn">sortbycolumn</a></b></code> command
        (in the second case the list will contain exactly one element), or an
        empty string if the items were last sorted with the <code><b><a href=
        "#sort">sort</a></b></code> command or haven't been sorted at all, or
        the sort information was reset by invoking <code><b><a href=
        "#resetsortinfo">resetsortinfo</a></b></code>.&nbsp; If called from
        within the command specified as the value of the
        <code><b>-sortcommand</b></code> <a href="#sortcommand">widget</a> or
        <a href="#col_sortcommand">column</a> configuration option, then the
        return value of this subcommand refers to the sorting in progress
        rather than the most recent one.</dd>

        <dt class="tm" id="targetmarkpath"><code><i>pathName</i>
        <b>targetmarkpath</b></code></dt>

        <dd>Returns the path name of the drop target indicator (displayed as a
        horizontal gap or vertical bar) belonging to the tablelist's body.</dd>

        <dt class="tm" id="targetmarkpos"><code><i>pathName</i>
        <b>targetmarkpos</b> <i>y</i>
        ?<b>-any</b>|<b>-horizontal</b>|<b>-vertical</b>?</code></dt>

        <dd>Given a y-coordinate within the tablelist window, this command
        returns a two-element list containing the arguments to be passed to the
        <code><b><a href="#showtargetmark">showtargetmark</a></b></code>
        subcommand in order to display the drop target indicator corresponding
        to that y-coordinate.&nbsp; The first list element will be the string
        <code><b>before</b></code> or <code><b>inside</b></code>, and the
        second one a numerical row index.&nbsp; These list elements depend on
        the relative position of <code><i>y</i></code> within the containing
        row (if any), as well as on the optional second argument:&nbsp; The
        default option <code><b>-any</b></code> allows both
        <code><b>before</b></code> and <code><b>inside</b></code> as first
        element of the result list, while the options
        <code><b>-horizontal</b></code> and <code><b>-vertical</b></code>
        restrict the value of the first list element to
        <code><b>before</b></code> and <code><b>inside</b></code>,
        respectively.&nbsp; If the option <code><b>-vertical</b></code> was
        specified and no tablelist item contains the given y-position, then the
        return value is the list&nbsp; <code>{<b>inside</b> -1}</code>.&nbsp;
        The coordinate <code><i>y</i></code> is expected to be relative to the
        tablelist window itself (not its body component).</dd>

        <dd class="tm">This command is designed to be used during a drag &amp;
        drop operation for which the tablelist widget (or its body component)
        was registered as a drop target.&nbsp; See the <a href=
        "#drag_and_drop_support">DRAG &amp; DROP SUPPORT</a> section for
        details and examples.</dd>

        <dt class="tm" id="togglecolumnhide"><code><i>pathName</i>
        <b>togglecolumnhide</b> <i>firstColumn</i> <i>lastColumn</i></code><br>
        <code><i>pathName</i> <b>togglecolumnhide</b>
        <i>columnIndexList</i></code></dt>

        <dd>Toggles the value of the <code><b><a href=
        "#col_hide">-hide</a></b></code> option for one or more columns of the
        tablelist widget.&nbsp; In the first form of the command,
        <code><i>firstColumn</i></code> and <code><i>lastColumn</i></code> are
        indices specifying the first and last columns in the range whose
        visibility is to be toggled.&nbsp; The command's second form accepts a
        list <code><i>columnIndexList</i></code> of indices specifying the
        columns whose visibility is to be toggled.&nbsp; Returns an empty
        string.&nbsp; After toggling the hidden state of the specified columns,
        the <code><b>&lt;&lt;TablelistColHiddenStateChanged&gt;&gt;</b></code>
        virtual event is generated.&nbsp; For Tk versions 8.5 or higher, this
        virtual event is generated with its <code><b>-data</b></code> option
        set to a list consisting of the numerical column indices of the columns
        whose <code><b>-hide</b></code> option was toggled.&nbsp; The main
        advantage of using this command instead of invoking <code><b><a href=
        "#columnconfigure">columnconfigure</a></b></code> for each of the
        specified columns is that it causes only one redisplay of the widget's
        contents, thus being significantly faster.</dd>

        <dt class="tm" id="togglerowhide"><code><i>pathName</i>
        <b>togglerowhide</b> <i>first</i> <i>last</i></code><br>
        <code><i>pathName</i> <b>togglerowhide</b> <i>indexList</i></code></dt>

        <dd>Toggles the value of the <code><b><a href=
        "#row_hide">-hide</a></b></code> option for one or more rows of the
        tablelist widget.&nbsp; In the first form of the command,
        <code><i>first</i></code> and <code><i>last</i></code> are indices
        specifying the first and last rows in the range whose visibility is to
        be toggled.&nbsp; The command's second form accepts a list
        <code><i>indexList</i></code> of indices specifying the rows whose
        visibility is to be toggled.&nbsp; Returns an empty string.&nbsp; After
        toggling the hidden state of the specified rows, the
        <code><b>&lt;&lt;TablelistRowHiddenStateChanged&gt;&gt;</b></code>
        virtual event is generated.&nbsp; For Tk versions 8.5 or higher, this
        virtual event is generated with its <code><b>-data</b></code> option
        set to a list consisting of the numerical row indices of the rows whose
        <code><b>-hide</b></code> option was toggled.&nbsp; Just like the
        <code><b>-hide</b></code> row configuration option, this subcommand is
        not supported for Tk versions earlier than 8.3.</dd>

        <dd class="tm"><b>CAUTION:</b>&nbsp; Tk versions 8.3 - 8.4.12 had a bug
        that caused a segmentation fault if the whole content of a text widget
        was elided.&nbsp; This bug was also present in Tk 8.5.a1 -
        8.5.a3.&nbsp; When using one of these earlier Tk versions, this bug
        will produce a crash if all the rows of a tablelist widget are
        hidden.&nbsp; It is your responsibility to avoid such situations when
        using a Tk version having this bug!</dd>

        <dt class="tm" id="toplevelkey"><code><i>pathName</i>
        <b>toplevelkey</b> <i>index</i></code></dt>

        <dd>If the item identified by <code><i>index</i></code> is a top-level
        one then the subcommand returns the full key of that item.&nbsp;
        Otherwise the return value is the full key of the unique top-level item
        having the given item among its descendants.</dd>

        <dt class="tm" id="unsetattrib"><code><i>pathName</i>
        <b>unsetattrib</b> <i>name</i></code></dt>

        <dd>Unsets the attribute <code><i>name</i></code>.&nbsp; Returns an
        empty string.</dd>

        <dt class="tm" id="unsetcellattrib"><code><i>pathName</i>
        <b>unsetcellattrib</b> <i>cellIndex</i> <i>name</i></code></dt>

        <dd>Unsets the attribute <code><i>name</i></code> for the cell given by
        <code><i>cellIndex</i></code>.&nbsp; Returns an empty string.</dd>

        <dt class="tm" id="unsetcolumnattrib"><code><i>pathName</i>
        <b>unsetcolumnattrib</b> <i>columnIndex</i> <i>name</i></code></dt>

        <dd>Unsets the attribute <code><i>name</i></code> for the column given
        by <code><i>columnIndex</i></code>.&nbsp; Returns an empty string.</dd>

        <dt class="tm" id="unsetrowattrib"><code><i>pathName</i>
        <b>unsetrowattrib</b> <i>index</i> <i>name</i></code></dt>

        <dd>Unsets the attribute <code><i>name</i></code> for the row given by
        <code><i>index</i></code>.&nbsp; Returns an empty string.</dd>

        <dt class="tm" id="viewablerowcount"><code><i>pathName</i>
        <b>viewablerowcount</b> ?<i>first</i> <i>last</i>?</code></dt>

        <dd>Returns the number of <a href="#isviewable">viewable</a> rows in
        the index range given by <code><i>first</i></code> and
        <code><i>last</i></code>.&nbsp; If these optional indices are not
        specified then <code><i>first</i></code> defaults to <code>0</code> and
        <code><i>last</i></code> defaults to one less the total number of
        items, i.e., the index range comprises all rows.</dd>

        <dt class="tm" id="windowpath"><code><i>pathName</i> <b>windowpath</b>
        <i>cellIndex</i></code></dt>

        <dd>Returns the path name of the window contained in the cell given by
        <code><i>cellIndex</i></code>, created with the <code><b><a href=
        "#cell_window">-window</a></b></code> option of the <code><b><a href=
        "#cellconfigure">cellconfigure</a></b></code> subcommand.&nbsp; If no
        window is currently embedded into the cell then the return value is an
        empty string.</dd>

        <dt class="tm" id="xview"><code><i>pathName</i> <b>xview</b>
        <i>args</i></code></dt>

        <dd>This command is used to query and change the horizontal position of
        the information in the widget's window.&nbsp; It can take any of the
        following forms:</dd>

        <dd>
          <dl>
            <dt class="tm"><code><i>pathName</i> <b>xview</b></code></dt>

            <dd>Returns a list containing two elements.&nbsp; Each element is a
            real fraction between <code>0</code> and <code>1</code>; together
            they describe the horizontal span that is visible in the
            window.&nbsp; For example, if the first element is <code>.2</code>
            and the second element is <code>.6</code>, 20% of the tablelist's
            scrollable text is off-screen to the left, the middle 40% is
            visible in the window, and 40% of the scrollable text is off-screen
            to the right.&nbsp; These are the same values passed to scrollbars
            via the <code><b>-xscrollcommand</b></code> option.</dd>

            <dt class="tm"><code><i>pathName</i> <b>xview</b>
            <i>units</i></code></dt>

            <dd>If the value of the <code><b><a href=
            "#titlecolumns">-titlecolumns</a></b></code> option is positive
            then this command adjusts the view in the window so that the column
            whose offset from the end of the title column area equals
            <code><i>units</i></code> non-hidden columns is displayed next to
            the title columns.&nbsp; Otherwise the command adjusts the view in
            the window so that the character position given by
            <code><i>units</i></code> is displayed at the left edge of the
            window.&nbsp; Character positions are defined by the width of the
            character <code><b>0</b></code>.</dd>

            <dt class="tm"><code><i>pathName</i> <b>xview</b> <b>moveto</b>
            <i>fraction</i></code></dt>

            <dd>Adjusts the view in the window so that
            <code><i>fraction</i></code> of the total width of the scrollable
            tablelist text is off-screen to the left.&nbsp;
            <code><i>fraction</i></code> must be a fraction between
            <code>0</code> and <code>1</code>.</dd>

            <dt class="tm"><code><i>pathName</i> <b>xview</b> <b>scroll</b>
            <i>number</i> <i>what</i></code></dt>

            <dd>This command shifts the view in the window left or right
            according to <code><i>number</i></code> and
            <code><i>what</i></code>.&nbsp; <code><i>number</i></code> must be
            an integer.&nbsp; <code><i>what</i></code> must be either
            <code><b>units</b></code> or <code><b>pages</b></code> or an
            abbreviation of one of these.&nbsp; If <code><i>what</i></code> is
            <code><b>units</b></code>, the view adjusts left or right by
            <code><i>number</i></code> non-hidden columns or character units
            (the width of the <code><b>0</b></code> character) on the display,
            depending on the value of the <code><b><a href=
            "#titlecolumns">-titlecolumns</a></b></code> option; if
            <code><i>what</i></code> is <code><b>pages</b></code> then the view
            adjusts by <code><i>number</i></code> screenfuls.&nbsp; If
            <code><i>number</i></code> is negative then columns or characters
            farther to the left become visible; if it is positive then columns
            or characters farther to the right become visible.</dd>
          </dl>
        </dd>

        <dt class="tm" id="yview"><code><i>pathName</i> <b>yview</b>
        <i>args</i></code></dt>

        <dd>This command is used to query and change the vertical position of
        the text in the window of the widget's body component.&nbsp; It can
        take any of the following forms:</dd>

        <dd>
          <dl>
            <dt class="tm"><code><i>pathName</i> <b>yview</b></code></dt>

            <dd>Returns a list containing two elements, both of which are real
            fractions between <code>0</code> and <code>1</code>.&nbsp; The
            first element gives the position of the <a href=
            "#isviewable">viewable</a> tablelist item at the top of the window,
            relative to the tablelist as a whole (<code>0.5</code> means it is
            halfway through the tablelist, for example).&nbsp; The second
            element gives the position of the viewable tablelist item just
            after the last one in the window, relative to the tablelist as a
            whole.&nbsp; These are the same values passed to scrollbars via the
            <code><b>-yscrollcommand</b></code> option.</dd>

            <dt class="tm"><code><i>pathName</i> <b>yview</b>
            <i>units</i></code></dt>

            <dd>Adjusts the view in the window so that the item whose offset
            equals <code><i>units</i></code> <a href="#isviewable">viewable</a>
            rows is displayed at the top of the window.</dd>

            <dt class="tm"><code><i>pathName</i> <b>yview</b> <b>moveto</b>
            <i>fraction</i></code></dt>

            <dd>Adjusts the view in the window so that the <a href=
            "#isviewable">viewable</a> item given by
            <code><i>fraction</i></code> appears at the top of the
            window.&nbsp; <code><i>fraction</i></code> is a fraction between
            <code>0</code> and <code>1</code>; <code>0</code> indicates the
            first viewable item in the tablelist, <code>0.33</code> indicates
            the viewable item one-third the way through the tablelist, and so
            on.</dd>

            <dt class="tm"><code><i>pathName</i> <b>yview</b> <b>scroll</b>
            <i>number</i> <i>what</i></code></dt>

            <dd>This command shifts the view in the window up or down according
            to <code><i>number</i></code> and <code><i>what</i></code>.&nbsp;
            <code><i>number</i></code> must be an integer.&nbsp;
            <code><i>what</i></code> must be either <code><b>units</b></code>
            or <code><b>pages</b></code> or an abbreviation of one of
            these.&nbsp; If <code><i>what</i></code> is
            <code><b>units</b></code>, the view adjusts up or down by
            <code><i>number</i></code> <a href="#isviewable">viewable</a> rows;
            if it is <code><b>pages</b></code> then the view adjusts by
            <code><i>number</i></code> screenfuls.&nbsp; If
            <code><i>number</i></code> is negative then earlier items become
            visible; if it is positive then later items become visible.</dd>
          </dl>
        </dd>
      </dl>
    </dd>

    <dt class="tm" id="body_bindings"><b>DEFAULT AND INDIVIDUAL BINDINGS FOR
    THE TABLELIST BODY</b></dt>

    <dd>
      The body component of a tablelist is implemented as a text widget whose
      binding tag <code><b>Text</b></code> is replaced with a new binding tag
      called <code><b>TablelistBody</b></code>.&nbsp; The latter has all the
      events of the <code><b>Listbox</b></code> widget class, and several of
      its binding scripts are obtained from those of
      <code><b>Listbox</b></code> by replacing the event fields
      <code><b>%W</b></code>, <code><b>%x</b></code>, and
      <code><b>%y</b></code> with the path name of the tablelist widget and the
      x and y coordinates relative to the latter.&nbsp; These values are
      assigned to the help variables <code><b>tablelist::W</b></code>,
      <code><b>tablelist::x</b></code>, and <code><b>tablelist::y</b></code> by
      invoking the helper command <code><b><a href=
      "tablelistBinding.html#convEventFields">tablelist::convEventFields</a></b></code>
      as follows:

      <blockquote>
        <pre>
foreach {tablelist::W tablelist::x tablelist::y} \
    [<a href=
"tablelistBinding.html#convEventFields">tablelist::convEventFields</a> %W %x %y] {}
</pre>
      </blockquote>
    </dd>

    <dd>This conversion of the event fields is necessary because the Tcl
    command associated with a tablelist expects any coordinates relative to the
    widget itself, not its body component.&nbsp; It makes use of help variables
    from the <code><b>tablelist</b></code> namespace in order to avoid any
    conflicts with global variables.</dd>

    <dd class="tm">
      Several of the events have no <code><b>%x</b></code> and
      <code><b>%y</b></code> fields; in this case another helper command
      <code><b><a href=
      "tablelistBinding.html#getTablelistPath">tablelist::getTablelistPath</a></b></code>
      is used to set the help variable <code><b>tablelist::W</b></code> to the
      path name of the tablelist widget:

      <blockquote>
        <pre>
set tablelist::W [<a href=
"tablelistBinding.html#getTablelistPath">tablelist::getTablelistPath</a> %W]
</pre>
      </blockquote>
    </dd>

    <dd>The binding tag <code><b>TablelistBody</b></code> replaces the class
    name (<code><b>Frame</b></code> or <code><b>TSeparator</b></code>) of the
    separator widgets, too.&nbsp; It also replaces the binding tag
    <code><b>Message</b></code> of the message widgets used to display
    multi-line elements, as well as the binding tag <code><b>Label</b></code>
    of the label widgets used to display embedded images.&nbsp; This makes sure
    that the default handling of the mouse events on the column separators,
    multi-line cells, and embedded images is the same as in the rest of the
    tablelist's body.</dd>

    <dd class="tm">
      When defining individual bindings for tablelist widgets, the same
      conversion of the event fields is needed as for the default
      bindings.&nbsp; For example, the binding script below for the tablelist
      widget <code>.tbl</code> prints the index of the cell where mouse button
      1 was clicked:

      <blockquote>
        <pre>
bind [.tbl <a href="#bodytag">bodytag</a>] &lt;Button-1&gt; {
    foreach {tablelist::W tablelist::x tablelist::y} \
        [<a href=
"tablelistBinding.html#convEventFields">tablelist::convEventFields</a> %W %x %y] {}
    puts "clicked on cell [.tbl <a href="#containingcell">containingcell</a> $tablelist::x $tablelist::y]"
}
</pre>
      </blockquote>
    </dd>

    <dd>By associating the script with the binding tag returned by the
    <code><b><a href="#bodytag">bodytag</a></b></code> subcommand instead of
    just with the path name of the tablelist's body we make sure to have the
    same event handling for the separators, multi-line cells, and embedded
    images as for the rest of the tablelist's body.</dd>

    <dd class="tm">
      The following improved version of the binding script above uses a
      procedure and thus eliminates the need for prefixing the converted
      variables with <code>"tablelist::"</code>:

      <blockquote>
        <pre>
bind [.tbl <a href="#bodytag">bodytag</a>] &lt;Button-1&gt; {printClickedCell %W %x %y}<br>
proc printClickedCell {w x y} {
    foreach {tbl x y} [<a href=
"tablelistBinding.html#convEventFields">tablelist::convEventFields</a> $w $x $y] {}
    puts "clicked on cell [$tbl <a href="#containingcell">containingcell</a> $x $y]"
}
</pre>
      </blockquote>
    </dd>

    <dd>The bindings associated with the binding tag
    <code><b>TablelistBody</b></code>, created automatically by the
    <code><b>tablelist::tablelist</b></code> command, ensure that the body
    component of a tablelist has the same default behavior as a listbox
    widget.&nbsp; If the selection type is <code><b>row</b></code> (which is
    the default) then everything described in the "DEFAULT BINDINGS" section of
    the <b>listbox</b> manual entry applies to the body component of a
    tablelist, too.&nbsp; The only difference is that the word "element" in
    that manual page has to be replaced with "item" when applying the
    description to the body of a tablelist widget.</dd>

    <dd class="tm">If the selection type is <code><b>cell</b></code> then
    everything described in the "DEFAULT BINDINGS" section of the
    <b>listbox</b> manual entry applies to the body component of a tablelist,
    too, with the following extensions and changes:</dd>

    <dd>
      <ol>
        <li class="tm">If <code>Tab</code> or <code>Shift-Tab</code> is
        pressed, the location cursor (active element) moves to the
        next/previous element.&nbsp; If the selection mode is
        <code><b>browse</b></code> or <code><b>extended</b></code> then the new
        active element is also selected and all other elements are
        deselected.&nbsp; In <code><b>extended</b></code> mode the new active
        element becomes the selection anchor.&nbsp; Notice that these bindings
        replace the common inter-widget navigation via <code>Tab</code> and
        <code>Shift-Tab</code> with inter-cell navigation.&nbsp; Just like in
        the case of the text widget, <code>Control-Tab</code> and
        <code>Control-Shift-Tab</code> are intended to be used for
        widget-to-widget keyboard navigation.&nbsp; Unfortunately, this won't
        always work because some window managers intercept the latter key
        sequences and use them for their own purposes (like inter-workplace
        navigation).&nbsp; For this reason, Tablelist supports the additional
        key sequences <code>Meta-Tab</code> and <code>Meta-Shift-Tab</code> as
        replacements for <code>Control-Tab</code> and
        <code>Control-Shift-Tab</code>, respectively.</li>

        <li class="tm">If the <code>Left</code> or <code>Right</code> key is
        pressed, the location cursor (active element) moves to the
        previous/next element of the active row.&nbsp; If the selection mode is
        <code><b>browse</b></code> or <code><b>extended</b></code> then the new
        active element is also selected and all other elements are
        deselected.&nbsp; In <code><b>extended</b></code> mode the new active
        element becomes the selection anchor.</li>

        <li class="tm">In <code><b>extended</b></code> mode,
        <code>Shift-Left</code> and <code>Shift-Right</code> move the location
        cursor (active element) to the previous/next element of the active row
        and also extend the selection to that element in a fashion similar to
        dragging with mouse button 1.</li>

        <li class="tm">If the <code>Home</code> or <code>End</code> key is
        pressed, the location cursor (active element) moves to the first/last
        element of the active row, the new active element is selected, and all
        other elements are deselected.</li>

        <li class="tm">In <code><b>extended</b></code> mode,
        <code>Shift-Home</code> and <code>Shift-End</code> extend the selection
        to the first/last element of the active row.&nbsp; In
        <code><b>multiple</b></code> mode, <code>Shift-Home</code> and
        <code>Shift-End</code> move the location cursor to the first/last
        element of the active row.</li>

        <li class="tm">If the location cursor is in an editable cell then
        <code>Return</code> and <code>KP_Enter</code> start the interactive
        editing of the active element.</li>
      </ol>
    </dd>

    <dd class="tm">Just like in the case of the listbox widget, any changes to
    the selection will automatically generate the virtual event
    <code><b>&lt;&lt;ListboxSelect&gt;&gt;</b></code>.&nbsp; Instead of this
    event (which is supported for compatibility reasons), the virtual event
    <code><b>&lt;&lt;TablelistSelect&gt;&gt;</b></code> can be used to be made
    aware of any changes to tablelist selection.&nbsp; Both events will be
    generated independently of the selection type.</dd>

    <dd class="tm" id="local_drag_and_drop">
      <b>LOCAL DRAG &amp; DROP:</b>&nbsp; The following binding associated with
      the binding tag <code><b>TablelistBody</b></code> is only valid if the
      selection mode is <code><b>single</b></code> or
      <code><b>multiple</b></code>:

      <blockquote>
        <p>If mouse button 1 is clicked on an item and then dragged outside
        that item, and the value of the <code><b><a href=
        "#movablerows">-movablerows</a></b></code> configuration option is
        true, then the mouse cursor takes on the shape specified by the
        <code><b><a href="#movecursor">-movecursor</a></b></code> option,
        indicating that the item in question is being moved to another
        position.&nbsp; The new item position (if any) is visualized with the
        aid of a gap placed before the target row or a bar placed inside the
        latter (depending on the current mouse position), indicating whether
        the source item would be moved before this row or become a child of
        it.&nbsp; This <b>local drag &amp; drop</b> operation ends when mouse
        button 1 is released, and can be canceled by pressing the
        <code>Escape</code> key.&nbsp; In both cases, the mouse cursor is reset
        to its original value, specified by the <code><b>-cursor</b></code>
        configuration option.&nbsp; After releasing mouse button 1 in the
        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
        <code><b>&lt;&lt;TablelistRowMoved&gt;&gt;</b></code> is
        generated.&nbsp; For Tk versions 8.5 or higher, this virtual event is
        generated with its <code><b>-data</b></code> option set to a list of
        length 3, whose elements are derived from the arguments passed to the
        second form of the <code><b><a href="#move">move</a></b></code>
        subcommand invoked for moving the source row to its new position.&nbsp;
        The first list element will be the full key corresponding to the first
        argument, the second one will be <code><b>root</b></code> or the full
        key corresponding to the second argument, and the third list element
        will be identical to the third argument passed to the
        <code><b>move</b></code> subcommand.</p>

        <p>Notice that, depending on the current mouse position during the
        local drag &amp; drop, there can be a corresponding potential target
        row or not.&nbsp; For instance, a tree item cannot become a sibling of
        one of its descendants, and not all items might be allowed to have
        children or to become top-level ones (example: in a file manager,
        regular file items cannot be parents of other items and should not be
        allowed to become top-level ones).&nbsp; To decide whether the row
        corresponding to the y-coordinate of the current mouse position
        represents a valid potential target, the Tablelist code first checks
        whether moving the source item before that row or making it a child of
        the latter is allowed from the point of view of the general tree
        structure.&nbsp; If this is the case and the move operation would
        change the source item's parent (and the Tk version is at least 8.3),
        and the command specified as the value of the <code><b><a href=
        "#acceptchildcommand">-acceptchildcommand</a></b></code> 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.&nbsp; Likewise, if the command specified
        as the value of the <code><b><a href=
        "#acceptdropcommand">-acceptdropcommand</a></b></code> 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.</p>

        <p>Recall that if the selection mode is <code><b>multiple</b></code>
        then <i>pressing</i> mouse button 1 on a selected item or element
        normally deselects that item or element (depending on the selection
        type).&nbsp; However, if in addition the value of the <code><b><a href=
        "#movablerows">-movablerows</a></b></code> configuration option is true
        then the clicked row is a potential drag source for the local drag
        &amp; drop operation described above, and for this reason the clicked
        item or element will only be deselected when <i>releasing</i> mouse
        button 1 over the same item or element.</p>
      </blockquote>
    </dd>

    <dd class="tm" id="global_drag_and_drop"><b>DRAG SOURCE SUPPORT FOR GLOBAL
    DRAG &amp; DROP:</b>&nbsp; Besides the local drag &amp; drop, the default
    bindings also support the TkDND compiled extension and the drag &amp; drop
    framework included in BWidget, as well as custom drag &amp; drop
    implementations.&nbsp; A tablelist widget is viewed as a <b>drag source for
    mouse button 1</b> if its body component was registered as such via
    the&nbsp; <code><b>tkdnd::drag_source register</b></code>&nbsp; or the
    Widget <code><b>DragSite::register</b></code> command, or the tablelist's
    <code><b><a href="#customdragsource">-customdragsource</a></b></code>
    option was set to true.&nbsp; The default bindings provide drag source
    support as described below:</dd>

    <dd>
      <ol>
        <li class="tm">If the selection mode is <code><b>extended</b></code>
        then <i>pressing</i> mouse button 1 on a selected item or element
        normally deselects all the other items or elements (depending on the
        selection type).&nbsp; However, if the tablelist is a drag source for
        mouse button 1, then the other items or elements will only be
        deselected when <i>releasing</i> mouse button 1 over the clicked item
        or element.&nbsp; This is because the mouse click might be followed by
        a drag, intended for all currently selected items or elements.</li>

        <li class="tm">Similarly, if the selection mode is
        <code><b>multiple</b></code> then <i>pressing</i> mouse button 1 on a
        selected item or element normally deselects that item or element
        (depending on the selection type).&nbsp; However, if the tablelist is a
        drag source for mouse button 1, then the clicked item or element will
        only be deselected when <i>releasing</i> mouse button 1 over the same
        item or element.&nbsp; Again, this is because the mouse click might be
        followed by a drag, intended for all currently selected items or
        elements.</li>

        <li class="tm">Whenever the mouse leaves the tablelist window with
        button 1 down. the default bindings normally perform an automatic
        scrolling, just like in the case of the Tk listbox widget.&nbsp;
        However, if the tablelist is a drag source for mouse button 1, then the
        automatic scrolling will be suppressed, in order to avoid any conflicts
        with the drag operation.</li>
      </ol>
    </dd>

    <dd class="tm"><b>TREE WIDGET BINDINGS:</b>&nbsp; The following bindings
    associated with the binding tag <code><b>TablelistBody</b></code> apply to
    tablelists used as tree widgets:</dd>

    <dd>
      <ol>
        <li class="tm">Pressing mouse button 1 over an expand/collapse control
        toggles the expanded/collapsed state of the corresponding row.</li>

        <li class="tm">If the current active row contains an expand/collapse
        control in collapsed state then the <code>Right</code>,
        <code>plus</code>, and <code>KP_Add</code> keys expand the
        corresponding row by invoking the non-recursive version of the
        <code><b><a href="#expand">expand</a></b></code> subcommand.</li>

        <li class="tm">If the current active row contains an expand/collapse
        control in expanded state then the <code>Left</code>,
        <code>minus</code>, and <code>KP_Subtract</code> keys collapse the
        corresponding row by invoking the non-recursive version of the
        <code><b><a href="#collapse">collapse</a></b></code> subcommand.</li>
      </ol>
    </dd>

    <dt class="tm" id="label_bindings"><b>DEFAULT AND INDIVIDUAL BINDINGS FOR
    THE HEADER LABELS</b></dt>

    <dd>The <code><b>tablelist::tablelist</b></code> command automatically
    creates the following bindings for the header labels:</dd>

    <dd>
      <ol>
        <li class="tm">If the mouse pointer is on the right edge of a header
        label or within a few pixels of its right edge, and both the value of
        the <code><b><a href=
        "#resizablecolumns">-resizablecolumns</a></b></code> configuration
        option and that of the <code><b><a href=
        "#col_resizable">-resizable</a></b></code> option for the column
        corresponding to that label are true, then the mouse cursor takes on
        the shape specified by the <code><b><a href=
        "#resizecursor">-resizecursor</a></b></code> option.&nbsp; By clicking
        mouse button 1 in this area and moving the mouse while its button 1 is
        down, the column corresponding to that label will be resized by the
        amount of the cursor motion.&nbsp; The interactive column resizing ends
        when mouse button 1 is released, and can be canceled by pressing the
        <code>Escape</code> key.&nbsp; In both cases, the mouse cursor is reset
        to its original value, specified by the <code><b>-cursor</b></code>
        configuration option.&nbsp; When the column resize operation is
        finished, the virtual event
        <code><b>&lt;&lt;TablelistColumnResized&gt;&gt;</b></code> is
        generated, with its <code><b>-data</b></code> option set to the
        numerical column index for Tk versions 8.5 or higher.</li>

        <li class="tm">If mouse button 1 is pressed over a header label but
        outside the resize area described above and then dragged outside the
        label, and the value of the <code><b><a href=
        "#movablecolumns">-movablecolumns</a></b></code> configuration option
        is true, then the mouse cursor takes on the shape specified by the
        <code><b><a href="#movecolumncursor">-movecolumncursor</a></b></code>
        option, indicating that the column in question is being moved to
        another position, visualized with the aid of a gap placed before the
        label of the target column.&nbsp; This operation ends when mouse button
        1 is released, and can be canceled by pressing the <code>Escape</code>
        key when the mouse pointer is outside the label.&nbsp; In both cases,
        the mouse cursor is reset to its original value, specified by the
        <code><b>-cursor</b></code> configuration option.&nbsp; After releasing
        mouse button 1, the source column is moved before the one indicated by
        the gap mentioned above and the virtual event
        <code><b>&lt;&lt;TablelistColumnMoved&gt;&gt;</b></code> is
        generated.&nbsp; For Tk versions 8.5 or higher, this virtual event is
        generated with its <code><b>-data</b></code> option set to a list of
        length 4, whose first two elements are identical to the two numerical
        column indices passed to the <code><b><a href=
        "#movecolumn">movecolumn</a></b></code> subcommand invoked for moving
        the source column to its new position, and the last two elements are
        the corresponding column names, retrieved with the aid of the&nbsp;
        <code><b><a href="#columncget">columncget</a> ...
        -name</b></code>&nbsp; subcommand.</li>

        <li class="tm">If mouse button 1 is pressed over a header label but
        outside the resize area described above and later released over the
        same label, and the command specified by the <code><b><a href=
        "#labelcommand">-labelcommand</a></b></code> option is a nonempty
        string, then this command is 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.&nbsp; If another
        nonempty label command was specified at column level by using the
        <code><b><a href="#columnconfigure">columnconfigure</a></b></code>
        option of the Tcl command associated with the tablelist widget, then
        that column-specific command will be used instead of the global
        one.&nbsp; If mouse button 1 was pressed together with the
        <code>Shift</code> key then the widget- or column-specific command
        mentioned above will be replaced with the one specified by the
        <code><b><a href="#labelcommand2">-labelcommand2</a></b></code> option
        at widget or column level.</li>

        <li class="tm" id="button3">The Tablelist package defines the virtual
        event <code><b>&lt;&lt;Button3&gt;&gt;</b></code> as
        <code><b>&lt;Button-3&gt;</b></code> for all windowing systems and
        additionally as <code><b>&lt;Control-Button-1&gt;</b></code> for Mac OS
        Classic and Mac OS X Aqua.&nbsp; If this event occurs over a header
        label and both the value of the <code><b><a href=
        "#resizablecolumns">-resizablecolumns</a></b></code> configuration
        option and that of the <code><b><a href=
        "#col_resizable">-resizable</a></b></code> option for the column
        corresponding to that label are true, then the width of that column is
        set to zero, i.e., it is made just large enough to hold all the
        elements in the column, including the header (but no larger than the
        maximum width indicated by the <code><b><a href=
        "#col_maxwidth">-maxwidth</a></b></code> column configuration option),
        and the virtual event
        <code><b>&lt;&lt;TablelistColumnResized&gt;&gt;</b></code> is
        generated, with its <code><b>-data</b></code> option set to the
        numerical column index for Tk versions 8.5 or higher.&nbsp; The same
        action is triggered by double-clicking the resize area of a header
        label.</li>

        <li class="tm">The Tablelist package defines the virtual event
        <code><b>&lt;&lt;ShiftButton3&gt;&gt;</b></code> as
        <code><b>&lt;Shift-Button-3&gt;</b></code> for all windowing systems
        and additionally as <code><b>&lt;Shift-Control-Button-1&gt;</b></code>
        for Mac OS Classic and Mac OS X Aqua.&nbsp; If this event occurs over a
        header label and both the value of the <code><b><a href=
        "#resizablecolumns">-resizablecolumns</a></b></code> configuration
        option and that of the <code><b><a href=
        "#col_resizable">-resizable</a></b></code> option for the column
        corresponding to that label are true, then the width of that column is
        set to its last static width (if any) and the virtual event
        <code><b>&lt;&lt;TablelistColumnResized&gt;&gt;</b></code> is
        generated, with its <code><b>-data</b></code> option set to the
        numerical column index for Tk versions 8.5 or higher.&nbsp; The same
        action is triggered by double-clicking the resize area of a header
        label with the <code>Shift</code> key held down.</li>
      </ol>
    </dd>

    <dd class="tm">If the tablelist's <code><b><a href=
    "#state">state</a></b></code> is <code><b>disabled</b></code> then none of
    the above actions occur: the labels are completely insensitive.</dd>

    <dd class="tm">
      If you want to define non-default bindings for the header labels, it is
      recommended to associate them with the binding tag whose name is returned
      by the <code><b><a href="#labeltag">labeltag</a></b></code> subcommand
      and make use of the helper commands <code><b><a href=
      "tablelistBinding.html#getTablelistColumn">tablelist::getTablelistColumn</a></b></code>
      and <code><b><a href=
      "tablelistBinding.html#getTablelistPath">tablelist::getTablelistPath</a></b></code>.&nbsp;
      For example, to replace the default binding for
      <code><b>&lt;Button-3&gt;</b></code> with a script that performs a
      column-dependent action, you can proceed like in the code shown below:

      <blockquote>
        <pre>
bind [.tbl <a href="#labeltag">labeltag</a>] &lt;Button-3&gt; {
    puts "right-clicked on header label no. [<a href=
"tablelistBinding.html#getTablelistColumn">tablelist::getTablelistColumn</a> %W]"
    break
}
</pre>
      </blockquote>
    </dd>

    <dt id="edit_bindings"><b>DEFAULT BINDINGS FOR INTERACTIVE CELL
    EDITING</b></dt>

    <dd>The <code><b>tablelist::tablelist</b></code> 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 <code><b><a href=
    "#editselectedonly">-editselectedonly</a></b></code> option for details) or
    using keyboard navigation to move from one editable cell into
    another.&nbsp; If the selection type is <code><b>cell</b></code> and the
    location cursor is in an editable cell, then the interactive editing of the
    active element can also be started by pressing <code>Return</code> or
    <code>KP_Enter</code>.</dd>

    <dd class="tm">The affected components of the temporary embedded widget
    depend on the edit window: the widget itself in case of a Tk or tile
    checkbutton or menubutton; the edit window's entry children in case of a
    mentry widget; the only entry or entry-like component of the edit window in
    all other cases (see also the <code><b><a href=
    "#entrypath">entrypath</a></b></code> subcommand).&nbsp; The list of
    binding tags of these edit window components contains two addditional tags,
    inserted just before their path names: the binding tag whose name is
    returned by the <code><b><a href="#editwintag">editwintag</a></b></code>
    subcommand, followed by the tag <code><b>TablelistEdit</b></code>.&nbsp;
    The bindings described below are associated with the tag
    <code><b>TablelistEdit</b></code>, and can be overridden for individual
    tablelist widgets by making use of the binding tag given by the
    <code><b><a href="#editwintag">editwintag</a></b></code> subcommand.</dd>

    <dd>
      <ol>
        <li class="tm"><code>Control-i</code> inserts a tabulator character
        into the edit window's entry or entry-like components (if any), at the
        point of the insertion cursor.</li>

        <li class="tm"><code>Control-j</code> inserts a newline character into
        the edit window's entry or entry-like components (if any), at the point
        of the insertion cursor.</li>

        <li class="tm">If the edit window is a text or ctext widget then
        <code>Return</code> and <code>KP_Enter</code> insert a newline
        character at the point of the insertion cursor.&nbsp; Otherwise they
        terminate the editing and destroy the edit window.</li>

        <li class="tm"><code>Control-Return</code> and
        <code>Control-KP_Enter</code> terminate the editing and destroy the
        edit window.</li>

        <li class="tm"><code>Escape</code> aborts the editing and destroys the
        edit window.</li>

        <li class="tm">A click with the left mouse button anywhere in the
        tablelist's body, outside the cell just being edited, terminates the
        editing in the current cell and destroys the edit window or moves it
        into the cell that was just clicked into if the latter is
        editable.</li>

        <li class="tm">When editing a cell that is not the only editable cell
        of the tablelist widget, <code>Tab</code> and <code>Shift-Tab</code>
        terminate the editing in the current cell, move the edit window into
        the next/previous editable cell of the tablelist, select the contents
        of the edit window's first entry or entry-like component (if any), and
        set the insertion cursor to its end.&nbsp; If the new edit window is a
        text or ctext widget then its contents are left unselected.&nbsp;
        Notice that these bindings replace the common inter-widget navigation
        via <code>Tab</code> and <code>Shift-Tab</code> with inter-cell
        navigation.&nbsp; Just like in the case of the text widget,
        <code>Control-Tab</code> and <code>Control-Shift-Tab</code> are
        intended to be used for widget-to-widget keyboard navigation during
        interactive cell editing.&nbsp; Unfortunately, this won't always work
        because some window managers intercept the latter key sequences and use
        them for their own purposes (like inter-workplace navigation).&nbsp;
        For this reason, Tablelist supports the additional key sequences
        <code>Meta-Tab</code> and <code>Meta-Shift-Tab</code> as replacements
        for <code>Control-Tab</code> and <code>Control-Shift-Tab</code>,
        respectively.</li>

        <li class="tm">When editing a cell that is not the first/last editable
        cell within its row, <code>Alt-Left</code>/<code>Alt-Right</code>
        (<code>Command-Left</code>/<code>Command-Right</code> 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
        component (if any), and sets the insertion cursor to its end.&nbsp; If
        the new edit window is a text or ctext widget then its contents are
        left unselected.&nbsp; The key sequence
        <code>Meta-Left</code>/<code>Meta-Right</code> has the same effect as
        <code>Alt-Left</code>/<code>Alt-Right</code>.&nbsp; If
        <code><b>tk_strictMotif</b></code> is false and the edit window is not
        a text or ctext widget then <code>Meta-b</code> and <code>Meta-f</code>
        behave the same as <code>Alt-Left</code> and <code>Alt-Right</code>,
        respectively.&nbsp; If the edit window is a Tk or tile checkbutton or
        menubutton widget then <code>Left</code>/<code>Right</code> has the
        same effect as <code>Alt-Left</code>/<code>Alt-Right</code>.</li>

        <li class="tm">When editing a cell that is not the first/last editable
        cell within its column, <code>Alt-Up</code>/<code>Alt-Down</code>
        (<code>Command-Up</code>/<code>Command-Down</code> 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.&nbsp; If the new edit
        window is a text or ctext widget then its contents are left
        unselected.&nbsp; The key sequence
        <code>Meta-Up</code>/<code>Meta-Down</code> has the same effect as
        <code>Alt-Up</code>/<code>Alt-Down</code>.&nbsp; If
        <code><b>tk_strictMotif</b></code> is false and the edit window is not
        a text or ctext widget or an Iwidgets combobox, then
        <code>Control-p</code> and <code>Control-n</code> behave the same as
        <code>Alt-Up</code> and <code>Alt-Down</code>, respectively.&nbsp; If
        the edit window is a Tk or tile entry, Tk or tile checkbutton, Tk or
        tile menubutton, BWidget Entry, Iwidgets entryfield/spinner/spinint, or
        a mentry widget of type <code>"FixedPoint"</code>, then
        <code>Up</code>/<code>Down</code> has the same effect as
        <code>Alt-Up</code>/<code>Alt-Down</code>.</li>

        <li class="tm">When editing a cell that is not the first/last editable
        cell within its column, <code>Alt-Prior</code>/<code>Alt-Next</code>
        (<code>Command-Prior</code>/<code>Command-Next</code> 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
        any), and sets the insertion cursor to its end.&nbsp; If the new edit
        window is a text or ctext widget then its contents are left
        unselected.&nbsp; The key sequence
        <code>Meta-Prior</code>/<code>Meta-Next</code> has the same effect as
        <code>Alt-Prior</code>/<code>Alt-Next</code>.&nbsp; If the edit window
        is not a text or ctext widget, BWidget SpinBox, Oakley combobox, or a
        mentry widget of type <code>"Date"</code>, <code>"Time"</code>,
        <code>"DateTime"</code>, <code>"IPAddr"</code>, or
        <code>"IPv6Addr"</code>, then <code>Prior</code>/<code>Next</code> has
        the same effect as <code>Alt-Prior</code>/<code>Alt-Next</code>.</li>

        <li class="tm">When editing a cell that is not the only editable cell
        of the tablelist widget, <code>Alt-Home</code>/<code>Alt-End</code>
        (<code>Command-Home</code>/<code>Command-End</code> 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
        component (if any), and sets the insertion cursor to its end.&nbsp; If
        the new edit window is a text or ctext widget then its contents are
        left unselected.&nbsp; The key sequence
        <code>Meta-Home</code>/<code>Meta-End</code> has the same effect as
        <code>Alt-Home</code>/<code>Alt-End</code>.&nbsp; If
        <code><b>tk_strictMotif</b></code> is false and the edit window is not
        a text or ctext widget then <code>Meta-&lt;</code> and
        <code>Meta-&gt;</code> behave the same as <code>Alt-Home</code> and
        <code>Alt-End</code>, respectively.&nbsp; If the edit window is not a
        text or ctext widget then
        <code>Control-Home</code>/<code>Control-End</code> has the same effect
        as <code>Alt-Home</code>/<code>Alt-End</code>.</li>
      </ol>
    </dd>

    <dd class="tm">Before moving the edit window, the key sequences mentioned
    under 7 - 11 move the active item or element and change the (cell)selection
    and the (cell)selection anchor in the body of the tablelist widget.&nbsp;
    For example, if <code>Alt-Up</code>/<code>Alt-Down</code> or
    <code>Meta-Up</code>/<code>Meta-Down</code>
    (<code>Command-Up</code>/<code>Command-Down</code> on Mac OS Classic and
    Mac OS X Aqua) is pressed when editing a cell that is not the first/last
    editable cell within its column, then the active item or element (depending
    on the selection type) moves one line up/down.&nbsp; If the selection mode
    is <code><b>browse</b></code> or <code><b>extended</b></code> then the new
    active item or element is also selected and all other items or elements are
    deselected.&nbsp; In <code><b>extended</b></code> mode the new active item
    or element becomes the (cell)selection anchor.&nbsp; This is exactly the
    same behavior as the one exhibited by the <code>Up</code> and
    <code>Down</code> keys in the tablelist's body.</dd>

    <dd class="tm">If the tablelist's <code><b><a href=
    "#state">state</a></b></code> is <code><b>disabled</b></code> then none of
    the above actions occur.</dd>

    <dt class="tm" id="keywords"><b>KEYWORDS</b></dt>

    <dd>tablelist, multi-column, listbox, tree, widget</dd>
  </dl>

  <div align="center">
    <p><a href="#contents">Contents</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href=
    "index.html">Start page</a></p>
  </div>
</body>
</html>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<












































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/doc/tileWidgets.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/ubuntu.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/vistaAero.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/vistaClassic.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/win7Aero.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/win7Classic.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/winnative.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/winxpBlue.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/winxpOlive.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/doc/winxpSilver.png.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/pkgIndex.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#==============================================================================
# Tablelist and Tablelist_tile package index file.
#
# Copyright (c) 2000-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

#
# Regular packages:
#
package ifneeded tablelist         5.13 \
	[list source [file join $dir tablelist.tcl]]
package ifneeded tablelist_tile    5.13 \
	[list source [file join $dir tablelist_tile.tcl]]

#
# Aliases:
#
package ifneeded Tablelist         5.13 \
	[list package require -exact tablelist	    5.13]
package ifneeded Tablelist_tile    5.13 \
	[list package require -exact tablelist_tile 5.13]

#
# Code common to all packages:
#
package ifneeded tablelist::common 5.13 \
        "namespace eval ::tablelist { proc DIR {} {return [list $dir]} } ;\
	 source [list [file join $dir tablelistPublic.tcl]]"
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
























































Deleted scriptlibs/tablelist5.13/scripts/mwutil.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
#==============================================================================
# Contains utility procedures for mega-widgets.
#
# Structure of the module:
#   - Namespace initialization
#   - Public utility procedures
#
# Copyright (c) 2000-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

package require Tcl 8
package require Tk  8

#
# Namespace initialization
# ========================
#

namespace eval mwutil {
    #
    # Public variables:
    #
    variable version	2.8
    variable library	[file dirname [info script]]

    #
    # Public procedures:
    #
    namespace export	wrongNumArgs getAncestorByClass convEventFields \
			defineKeyNav processTraversal focusNext focusPrev \
			configureWidget fullConfigOpt fullOpt enumOpts \
			configureSubCmd attribSubCmd hasattribSubCmd \
			unsetattribSubCmd getScrollInfo

    #
    # Make modified versions of the procedures tk_focusNext and
    # tk_focusPrev, to be invoked in the processTraversal command
    #
    proc makeFocusProcs {} {
	#
	# Enforce the evaluation of the Tk library file "focus.tcl"
	#
	tk_focusNext .

	#
	# Build the procedures focusNext and focusPrev
	#
	foreach direction {Next Prev} {
	    set procBody [info body tk_focus$direction]
	    regsub -all {winfo children} $procBody {getChildren $class} procBody
	    proc focus$direction {w class} $procBody
	}
    }
    makeFocusProcs 

    #
    # Invoked in the procedures focusNext and focusPrev defined above:
    #
    proc getChildren {class w} {
	if {[string compare [winfo class $w] $class] == 0} {
	    return {}
	} else {
	    return [winfo children $w]
	}
    }
}

#
# Public utility procedures
# =========================
#

#------------------------------------------------------------------------------
# mwutil::wrongNumArgs
#
# Generates a "wrong # args" error message.
#------------------------------------------------------------------------------
proc mwutil::wrongNumArgs args {
    set optList {}
    foreach arg $args {
	lappend optList \"$arg\"
    }
    return -code error "wrong # args: should be [enumOpts $optList]"
}

#------------------------------------------------------------------------------
# mwutil::getAncestorByClass
#
# Gets the path name of the widget of the specified class from the path name w
# of one of its descendants.  It is assumed that all of the ancestors of w
# exist (but w itself needn't exist).
#------------------------------------------------------------------------------
proc mwutil::getAncestorByClass {w class} {
    regexp {^(\..+)\..+$} $w dummy win
    while {[string compare [winfo class $win] $class] != 0} {
	set win [winfo parent $win]
    }

    return $win
}

#------------------------------------------------------------------------------
# mwutil::convEventFields
#
# Gets the path name of the widget of the specified class and the x and y
# coordinates relative to the latter from the path name w of one of its
# descendants and from the x and y coordinates relative to the latter.
#------------------------------------------------------------------------------
proc mwutil::convEventFields {w x y class} {
    set win [getAncestorByClass $w $class]
    set _x  [expr {$x + [winfo rootx $w] - [winfo rootx $win]}]
    set _y  [expr {$y + [winfo rooty $w] - [winfo rooty $win]}]

    return [list $win $_x $_y]
}

#------------------------------------------------------------------------------
# mwutil::defineKeyNav
#
# For a given mega-widget class, the procedure defines the binding tag
# ${class}KeyNav as a partial replacement for "all", by substituting the
# scripts bound to the events <Tab>, <Shift-Tab>, and <<PrevWindow>> with new
# ones which propagate these events to the mega-widget of the given class
# containing the widget to which the event was reported.  (The event
# <Shift-Tab> was replaced with <<PrevWindow>> in Tk 8.3.0.)  This tag is
# designed to be inserted before "all" in the list of binding tags of a
# descendant of a mega-widget of the specified class.
#------------------------------------------------------------------------------
proc mwutil::defineKeyNav class {
    foreach event {<Tab> <Shift-Tab> <<PrevWindow>>} {
	bind ${class}KeyNav $event \
	     [list mwutil::processTraversal %W $class $event]
    }

    bind Entry   <<TraverseIn>> { %W selection range 0 end; %W icursor end }
    bind Spinbox <<TraverseIn>> { %W selection range 0 end; %W icursor end }
}

#------------------------------------------------------------------------------
# mwutil::processTraversal
#
# 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.
#------------------------------------------------------------------------------
proc mwutil::processTraversal {w class event} {
    set win [getAncestorByClass $w $class]

    if {[string compare $event "<Tab>"] == 0} {
	set target [focusNext $win $class]
    } else {
	set target [focusPrev $win $class]
    }

    if {[string compare $target $win] != 0} {
	set focus [focus]
	if {[string length $focus] != 0} {
	    event generate $focus <<TraverseOut>>
	}

	focus $target
	event generate $target <<TraverseIn>>
    }

    return -code break ""
}

#------------------------------------------------------------------------------
# mwutil::configureWidget
#
# Configures the widget win by processing the command-line arguments specified
# in optValPairs and, if the value of initialize is true, also those database
# options that don't match any command-line arguments.
#------------------------------------------------------------------------------
proc mwutil::configureWidget {win configSpecsName configCmd cgetCmd \
			      optValPairs initialize} {
    upvar $configSpecsName configSpecs

    #
    # Process the command-line arguments
    #
    set cmdLineOpts {}
    set savedVals {}
    set failed 0
    set count [llength $optValPairs]
    foreach {opt val} $optValPairs {
	if {[catch {fullConfigOpt $opt configSpecs} result] != 0} {
	    set failed 1
	    break
	}
	if {$count == 1} {
	    set result "value for \"$opt\" missing"
	    set failed 1
	    break
	}
	set opt $result
	lappend cmdLineOpts $opt
	lappend savedVals [eval $cgetCmd [list $win $opt]]
	if {[catch {eval $configCmd [list $win $opt $val]} result] != 0} {
	    set failed 1
	    break
	}
	incr count -2
    }

    if {$failed} {
	#
	# Restore the saved values
	#
	foreach opt $cmdLineOpts val $savedVals {
	    eval $configCmd [list $win $opt $val]
	}

	return -code error $result
    }

    if {$initialize} {
	#
	# Process those configuration options that were not
	# given as command-line arguments; use the corresponding
	# values from the option database if available
	#
	foreach opt [lsort [array names configSpecs]] {
	    if {[llength $configSpecs($opt)] == 1 ||
		[lsearch -exact $cmdLineOpts $opt] >= 0} {
		continue
	    }
	    set dbName [lindex $configSpecs($opt) 0]
	    set dbClass [lindex $configSpecs($opt) 1]
	    set dbValue [option get $win $dbName $dbClass]
	    if {[string length $dbValue] == 0} {
		set default [lindex $configSpecs($opt) 3]
		eval $configCmd [list $win $opt $default]
	    } else {
		if {[catch {
		    eval $configCmd [list $win $opt $dbValue]
		} result] != 0} {
		    return -code error $result
		}
	    }
	}
    }

    return ""
}

#------------------------------------------------------------------------------
# mwutil::fullConfigOpt
#
# Returns the full configuration option corresponding to the possibly
# abbreviated option opt.
#------------------------------------------------------------------------------
proc mwutil::fullConfigOpt {opt configSpecsName} {
    upvar $configSpecsName configSpecs

    if {[info exists configSpecs($opt)]} {
	if {[llength $configSpecs($opt)] == 1} {
	    return $configSpecs($opt)
	} else {
	    return $opt
	}
    }

    set optList [lsort [array names configSpecs]]
    set count 0
    foreach elem $optList {
	if {[string first $opt $elem] == 0} {
	    incr count
	    if {$count == 1} {
		set option $elem
	    } else {
		break
	    }
	}
    }

    if {$count == 1} {
	if {[llength $configSpecs($option)] == 1} {
	    return $configSpecs($option)
	} else {
	    return $option
	}
    } elseif {$count == 0} {
	### return -code error "unknown option \"$opt\""
	return -code error \
	       "bad option \"$opt\": must be [enumOpts $optList]"
    } else {
	### return -code error "unknown option \"$opt\""
	return -code error \
	       "ambiguous option \"$opt\": must be [enumOpts $optList]"
    }
}

#------------------------------------------------------------------------------
# mwutil::fullOpt
#
# Returns the full option corresponding to the possibly abbreviated option opt.
#------------------------------------------------------------------------------
proc mwutil::fullOpt {kind opt optList} {
    if {[lsearch -exact $optList $opt] >= 0} {
	return $opt
    }

    set count 0
    foreach elem $optList {
	if {[string first $opt $elem] == 0} {
	    incr count
	    if {$count == 1} {
		set option $elem
	    } else {
		break
	    }
	}
    }

    if {$count == 1} {
	return $option
    } elseif {$count == 0} {
	return -code error \
	       "bad $kind \"$opt\": must be [enumOpts $optList]"
    } else {
	return -code error \
	       "ambiguous $kind \"$opt\": must be [enumOpts $optList]"
    }
}

#------------------------------------------------------------------------------
# mwutil::enumOpts
#
# Returns a string consisting of the elements of the given list, separated by
# commas and spaces.
#------------------------------------------------------------------------------
proc mwutil::enumOpts optList {
    set optCount [llength $optList]
    set n 1
    foreach opt $optList {
	if {$n == 1} {
	    set str $opt
	} elseif {$n < $optCount} {
	    append str ", $opt"
	} else {
	    if {$optCount > 2} {
		append str ","
	    }
	    append str " or $opt"
	}

	incr n
    }

    return $str
}

#------------------------------------------------------------------------------
# mwutil::configureSubCmd
#
# This procedure is invoked to process configuration subcommands.
#------------------------------------------------------------------------------
proc mwutil::configureSubCmd {win configSpecsName configCmd cgetCmd argList} {
    upvar $configSpecsName configSpecs

    set argCount [llength $argList]
    if {$argCount > 1} {
	#
	# Set the specified configuration options to the given values
	#
	return [configureWidget $win configSpecs $configCmd $cgetCmd $argList 0]
    } elseif {$argCount == 1} {
	#
	# Return the description of the specified configuration option
	#
	set opt [fullConfigOpt [lindex $argList 0] configSpecs]
	set dbName [lindex $configSpecs($opt) 0]
	set dbClass [lindex $configSpecs($opt) 1]
	set default [lindex $configSpecs($opt) 3]
	return [list $opt $dbName $dbClass $default \
		[eval $cgetCmd [list $win $opt]]]
    } else {
	#
	# Return a list describing all available configuration options
	#
	foreach opt [lsort [array names configSpecs]] {
	    if {[llength $configSpecs($opt)] == 1} {
		set alias $configSpecs($opt)
		if {$::tk_version >= 8.1} {
		    lappend result [list $opt $alias]
		} else {
		    set dbName [lindex $configSpecs($alias) 0]
		    lappend result [list $opt $dbName]
		}
	    } else {
		set dbName [lindex $configSpecs($opt) 0]
		set dbClass [lindex $configSpecs($opt) 1]
		set default [lindex $configSpecs($opt) 3]
		lappend result [list $opt $dbName $dbClass $default \
				[eval $cgetCmd [list $win $opt]]]
	    }
	}
	return $result
    }
}

#------------------------------------------------------------------------------
# mwutil::attribSubCmd
#
# This procedure is invoked to process *attrib subcommands.
#------------------------------------------------------------------------------
proc mwutil::attribSubCmd {win prefix argList} {
    set classNs [string tolower [winfo class $win]]
    upvar ::${classNs}::ns${win}::attribs attribs

    set argCount [llength $argList]
    if {$argCount > 1} {
	#
	# Set the specified attributes to the given values
	#
	if {$argCount % 2 != 0} {
	    return -code error "value for \"[lindex $argList end]\" missing"
	}
	foreach {attr val} $argList {
	    set attribs($prefix-$attr) $val
	}
	return ""
    } elseif {$argCount == 1} {
	#
	# Return the value of the specified attribute
	#
	set attr [lindex $argList 0]
	set name $prefix-$attr
	if {[info exists attribs($name)]} {
	    return $attribs($name)
	} else {
	    return ""
	}
    } else {
	#
	# Return the current list of attribute names and values
	#
	set len [string length "$prefix-"]
	set result {}
	foreach name [lsort [array names attribs "$prefix-*"]] {
	    set attr [string range $name $len end]
	    lappend result [list $attr $attribs($name)]
	}
	return $result
    }
}

#------------------------------------------------------------------------------
# mwutil::hasattribSubCmd
#
# This procedure is invoked to process has*attrib subcommands.
#------------------------------------------------------------------------------
proc mwutil::hasattribSubCmd {win prefix attr} {
    set classNs [string tolower [winfo class $win]]
    upvar ::${classNs}::ns${win}::attribs attribs

    return [info exists attribs($prefix-$attr)]
}

#------------------------------------------------------------------------------
# mwutil::unsetattribSubCmd
#
# This procedure is invoked to process unset*attrib subcommands.
#------------------------------------------------------------------------------
proc mwutil::unsetattribSubCmd {win prefix attr} {
    set classNs [string tolower [winfo class $win]]
    upvar ::${classNs}::ns${win}::attribs attribs

    set name $prefix-$attr
    if {[info exists attribs($name)]} {
	unset attribs($name)
    }

    return ""
}

#------------------------------------------------------------------------------
# mwutil::getScrollInfo
#
# Parses a list of arguments of the form "moveto <fraction>" or "scroll
# <number> units|pages" and returns the corresponding list consisting of two or
# three properly formatted elements.
#------------------------------------------------------------------------------
proc mwutil::getScrollInfo argList {
    set argCount [llength $argList]
    set opt [lindex $argList 0]

    if {[string first $opt "moveto"] == 0} {
	if {$argCount != 2} {
	    wrongNumArgs "moveto fraction"
	}

	set fraction [format "%f" [lindex $argList 1]]
	return [list moveto $fraction]
    } elseif {[string first $opt "scroll"] == 0} {
	if {$argCount != 3} {
	    wrongNumArgs "scroll number units|pages"
	}

	set number [format "%d" [lindex $argList 1]]
	set what [lindex $argList 2]
	if {[string first $what "units"] == 0} {
	    return [list scroll $number units]
	} elseif {[string first $what "pages"] == 0} {
	    return [list scroll $number pages]
	} else {
	    return -code error "bad argument \"$what\": must be units or pages"
	}
    } else {
	return -code error "unknown option \"$opt\": must be moveto or scroll"
    }
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/scripts/pencil.cur.

cannot compute difference between binary files

Deleted scriptlibs/tablelist5.13/scripts/repair.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/usr/bin/env wish

#==============================================================================
# Creates new versions of the files "tablelistWidget.tcl", "tablelistBind.tcl",
# "tablelistConfig.tcl", "tablelistEdit.tcl", "tablelistMove.tcl",
# "tablelistSort.tcl", and "tablelistUtil.tcl" by defining the procedure
# "arrElemExists" and replacing all invocations of "[info exists
# <array>(<name>)]" with "[arrElemExists <array> <name>]".  This works around a
# bug in Tcl versions 8.2, 8.3.0 - 8.3.2, and 8.4a1 (fixed in Tcl 8.3.3 and
# 8.4a2), which causes excessive memory use when calling "info exists" on
# non-existent array elements.
#
# Copyright (c) 2001-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

set procDef {
    #
    # The following procedure returns 1 if arrName($name) exists and
    # 0 otherwise.  It is a (partial) replacement for [info exists
    # arrName($name)], which -- due to a bug in Tcl versions 8.2,
    # 8.3.0 - 8.3.2, and 8.4a1 (fixed in Tcl 8.3.3 and 8.4a2) --
    # causes excessive memory use if arrName($name) doesn't exist.
    # The first version of the procedure assumes that the second
    # argument doesn't contain glob-style special characters.
    #
    if {[regexp {^8\.(2\.[0-3]|3\.[0-2]|4a1)$} $tk_patchLevel]} {
	proc arrElemExists {arrName name} {
	    upvar $arrName arr
	    return [llength [array names arr $name]]
	}
    } else {
	proc arrElemExists {arrName name} {
	    upvar $arrName arr
	    return [info exists arr($name)]		;# this is much faster
	}
    }
}

file copy tablelistWidget.tcl tablelistWidget.tcl.BAK

set fi [open tablelistWidget.tcl.BAK r]
set fo [open tablelistWidget.tcl     w]

for {set n 1} {[gets $fi line] >= 0} {incr n} {
    if {$n == 19} {
	puts -nonewline $fo $line
	puts $fo $procDef
    } else {
	regsub -all {\[info exists (tablelist::[^\(]+)\(([^\]]+)\)\]} $line \
		    {[tablelist::arrElemExists \1 \2]} line
	regsub -all {\[info exists ([^\(]+)\(([^\]]+)\)\]} $line \
		    {[arrElemExists \1 \2]} line
	puts $fo $line
    }
}

close $fi
close $fo

puts "\nMade backup copy \"tablelistWidget.tcl.BAK\"."
puts "Created new version of the file \"tablelistWidget.tcl\"."

foreach file {tablelistBind.tcl tablelistConfig.tcl tablelistEdit.tcl
	      tablelistMove.tcl tablelistSort.tcl tablelistThemes.tcl
	      tablelistUtil.tcl} {
    file copy $file $file.BAK

    set fi [open $file.BAK r]
    set fo [open $file     w]

    while {[gets $fi line] >= 0} {
	regsub -all {\[info exists (tablelist::[^\(]+)\(([^\]]+)\)\]} $line \
		    {[tablelist::arrElemExists \1 \2]} line
	regsub -all {\[info exists ([^\(]+)\(([^\]]+)\)\]} $line \
		    {[arrElemExists \1 \2]} line
	puts $fo $line
    }

    close $fi
    close $fo

    puts "\nMade backup copy \"$file.BAK\"."
    puts "Created new version of the file \"$file\"."
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<








































































































































































Deleted scriptlibs/tablelist5.13/scripts/tablelistBind.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
#==============================================================================
# Contains public and private procedures used in tablelist bindings.
#
# Structure of the module:
#   - Public helper procedures
#   - Binding tag Tablelist
#   - Binding tag TablelistWindow
#   - Binding tag TablelistBody
#   - Binding tags TablelistLabel, TablelistSubLabel, and TablelistArrow
#
# Copyright (c) 2000-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

#
# Public helper procedures
# ========================
#

#------------------------------------------------------------------------------
# tablelist::getTablelistColumn
#
# Gets the column number from the path name w of a (sub)label or sort arrow of
# a tablelist widget.
#------------------------------------------------------------------------------
proc tablelist::getTablelistColumn w {
    if {[regexp {^(\..+)\.hdr\.t\.f\.l([0-9]+)(-[it]l)?$} $w dummy win col] ||
	[regexp {^(\..+)\.hdr\.t\.f\.c([0-9]+)$} $w dummy win col]} {
	return $col
    } else {
	return -1
    }
}

#------------------------------------------------------------------------------
# tablelist::getTablelistPath
#
# Gets the path name of the tablelist widget from the path name w of one of its
# descendants.  It is assumed that all of the ancestors of w exist (but w
# itself needn't exist).
#------------------------------------------------------------------------------
proc tablelist::getTablelistPath w {
    return [mwutil::getAncestorByClass $w Tablelist]
}

#------------------------------------------------------------------------------
# tablelist::convEventFields
#
# Gets the path name of the tablelist widget and the x and y coordinates
# relative to the latter from the path name w of one of its descendants and
# from the x and y coordinates relative to the latter.
#------------------------------------------------------------------------------
proc tablelist::convEventFields {w x y} {
    return [mwutil::convEventFields $w $x $y Tablelist]
}

#
# Binding tag Tablelist
# =====================
#

#------------------------------------------------------------------------------
# tablelist::addActiveTag
#
# This procedure is invoked when the tablelist widget win gains the keyboard
# focus.  It moves the "active" tag to the line or cell that displays the
# active item or element of the widget in its body text child.
#------------------------------------------------------------------------------
proc tablelist::addActiveTag win {
    upvar ::tablelist::ns${win}::data data
    set data(ownsFocus) 1

    #
    # Conditionally move the "active" tag to the line
    # or cell that displays the active item or element
    #
    if {![info exists data(dispId)]} {
	moveActiveTag $win
    }
}

#------------------------------------------------------------------------------
# tablelist::removeActiveTag
#
# This procedure is invoked when the tablelist widget win loses the keyboard
# focus.  It removes the "active" tag from the body text child of the widget.
#------------------------------------------------------------------------------
proc tablelist::removeActiveTag win {
    upvar ::tablelist::ns${win}::data data
    set data(ownsFocus) 0

    $data(body) tag remove active 1.0 end
}

#------------------------------------------------------------------------------
# tablelist::cleanup
#
# This procedure is invoked when the tablelist widget win is destroyed.  It
# executes some cleanup operations.
#------------------------------------------------------------------------------
proc tablelist::cleanup win {
    #
    # Cancel the execution of all delayed handleMotion, updateKeyToRowMap,
    # adjustSeps, makeStripes, showLineNumbers, stretchColumns, updateColors,
    # updateScrlColOffset, updateHScrlbar, updateVScrlbar, updateView,
    # synchronize, displayItems, moveTo, horizAutoScan, forceRedraw,
    # doCellConfig, 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} {
	if {[info exists data($id)]} {
	    after cancel $data($id)
	}
    }
    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]} {
	trace vdelete var wu $data(listVarTraceCmd)
    }

    #
    # Destroy any existing bindings for data(bodyTag),
    # 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 ""
    }

    #
    # Delete the bitmaps displaying the sort ranks
    # and the images used to display the sort arrows
    #
    for {set rank 1} {$rank < 10} {incr rank} {
	image delete sortRank$rank$win
    }
    for {set col 0} {$col < $data(colCount)} {incr col} {
	set w $data(hdrTxtFrCanv)$col
	foreach shape {triangleUp darkLineUp lightLineUp
		       triangleDn darkLineDn lightLineDn} {
	    catch {image delete $shape$w}
	}
    }

    destroy $data(corner)

    namespace delete ::tablelist::ns$win
    catch {rename ::$win ""}
}

#------------------------------------------------------------------------------
# tablelist::updateCanvases
#
# This procedure handles the events <Activate> and <Deactivate> by configuring
# the canvases displaying sort arrows.
#------------------------------------------------------------------------------
proc tablelist::updateCanvases win {
    upvar ::tablelist::ns${win}::data data
    foreach col $data(arrowColList) {
	configCanvas $win $col
	raiseArrow $win $col
    }
}

#------------------------------------------------------------------------------
# tablelist::updateConfigSpecs
#
# This procedure handles the virtual event <<ThemeChanged>> by updating the
# theme-specific default values of some tablelist configuration options.
#------------------------------------------------------------------------------
proc tablelist::updateConfigSpecs win {
    #
    # This might be an "after idle" callback; check whether the window exists
    #
    if {![array exists ::tablelist::ns${win}::data]} {
	return ""
    }

    set currentTheme [getCurrentTheme]
    upvar ::tablelist::ns${win}::data data
    if {[string compare $currentTheme $data(currentTheme)] == 0} {
	if {[string compare $currentTheme "tileqt"] == 0} {
	    set widgetStyle [tileqt_currentThemeName]
	    if {[info exists ::env(KDE_SESSION_VERSION)] &&
		[string length $::env(KDE_SESSION_VERSION)] != 0} {
		set colorScheme [getKdeConfigVal "General" "ColorScheme"]
	    } else {
		set colorScheme [getKdeConfigVal "KDE" "colorScheme"]
	    }
	    if {[string compare $widgetStyle $data(widgetStyle)] == 0 &&
		[string compare $colorScheme $data(colorScheme)] == 0} {
		return ""
	    }
	} else {
	    return ""
	}
    }

    #
    # 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)
	}
    }
    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 separators
    }
    updateCanvases $win

    #
    # Destroy and recreate the edit window if present
    #
    if {[set editCol $data(editCol)] >= 0} {
	set editRow $data(editRow)
	saveEditData $win
	destroy $data(bodyFr)
	doEditCell $win $editRow $editCol 1
    }

    #
    # Destroy and recreate the embedded windows
    #
    if {$data(winCount) != 0} {
	for {set row 0} {$row < $data(itemCount)} {incr row} {
	    for {set col 0} {$col < $data(colCount)} {incr col} {
		set key [lindex $data(keyList) $row]
		if {[info exists data($key,$col-window)]} {
		    set val $data($key,$col-window)
		    doCellConfig $row $col $win -window ""
		    doCellConfig $row $col $win -window $val
		}
	    }
	}
    }

    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)] &&
	    [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) ""
    }
}

#
# Binding tag TablelistWindow
# ===========================
#

#------------------------------------------------------------------------------
# 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.
#------------------------------------------------------------------------------
proc tablelist::cleanupWindow aux {
    regexp {^(.+)\.body\.frm_(k[0-9]+),([0-9]+)$} $aux dummy win key col
    upvar ::tablelist::ns${win}::data data
    if {[info exists data($key,$col-windowdestroy)]} {
	set row [keyToRow $win $key]
	uplevel #0 $data($key,$col-windowdestroy) [list $win $row $col $aux.w]
    }
}

#
# Binding tag TablelistBody
# =========================
#

#------------------------------------------------------------------------------
# tablelist::defineTablelistBody
#
# Defines the bindings for the binding tag TablelistBody.
#------------------------------------------------------------------------------
proc tablelist::defineTablelistBody {} {
    variable priv
    array set priv {
	x			""
	y			""
	afterId			""
	prevRow			""
	prevCol			""
	prevActExpCollCtrlCell	""
	selection		{}
	selClearPending		0
	selChangePending	0
	justClicked		0
	justReleased		0
	clickedInEditWin	0
	clickedExpCollCtrl	0
    }

    foreach event {<Enter> <Motion> <Leave>} {
	bind TablelistBody $event [format {
	    tablelist::handleMotionDelayed %%W %%x %%y %%X %%Y %s
	} $event]
    }
    bind TablelistBody <Button-1> {
	if {[winfo exists %W]} {
	    foreach {tablelist::W tablelist::x tablelist::y} \
		[tablelist::convEventFields %W %x %y] {}

	    set tablelist::priv(x) $tablelist::x
	    set tablelist::priv(y) $tablelist::y
	    set tablelist::priv(row) [$tablelist::W nearest       $tablelist::y]
	    set tablelist::priv(col) [$tablelist::W nearestcolumn $tablelist::x]
	    set tablelist::priv(justClicked) 1
	    after 300 [list set tablelist::priv(justClicked) 0]
	    set tablelist::priv(clickedInEditWin) 0
	    if {[$tablelist::W cget -setfocus] &&
		[string compare [$tablelist::W cget -state] "normal"] == 0} {
		focus [$tablelist::W bodypath]
	    }
	    if {[tablelist::wasExpCollCtrlClicked %W %x %y]} {
		set tablelist::priv(clickedExpCollCtrl) 1
		if {[string length [$tablelist::W editwinpath]] != 0} {
		    tablelist::doFinishEditing $tablelist::W
		}
	    } else {
		tablelist::condEditContainingCell $tablelist::W \
		    $tablelist::x $tablelist::y
		set tablelist::priv(row) \
		    [$tablelist::W nearest       $tablelist::y]
		set tablelist::priv(col) \
		    [$tablelist::W nearestcolumn $tablelist::x]
		tablelist::condBeginMove $tablelist::W $tablelist::priv(row)
		tablelist::beginSelect $tablelist::W \
		    $tablelist::priv(row) $tablelist::priv(col) 1
	    }
	}
    }
    bind TablelistBody <Double-Button-1> {
	if {[winfo exists %W]} {
	    foreach {tablelist::W tablelist::x tablelist::y} \
		[tablelist::convEventFields %W %x %y] {}

	    if {[$tablelist::W cget -editselectedonly]} {
		tablelist::condEditContainingCell $tablelist::W \
		    $tablelist::x $tablelist::y
	    }
	}
    }
    bind TablelistBody <B1-Motion> {
	if {$tablelist::priv(justClicked)} {
	    continue
	}

	foreach {tablelist::W tablelist::x tablelist::y} \
	    [tablelist::convEventFields %W %x %y] {}

	if {[string length $tablelist::priv(x)] == 0 ||
	    [string length $tablelist::priv(y)] == 0} {
	    set tablelist::priv(x) $tablelist::x
	    set tablelist::priv(y) $tablelist::y
	}
	set tablelist::priv(prevX) $tablelist::priv(x)
	set tablelist::priv(prevY) $tablelist::priv(y)
	set tablelist::priv(x) $tablelist::x
	set tablelist::priv(y) $tablelist::y
	tablelist::condAutoScan $tablelist::W
	if {!$tablelist::priv(clickedExpCollCtrl)} {
	    tablelist::motion $tablelist::W \
		[$tablelist::W nearest       $tablelist::y] \
		[$tablelist::W nearestcolumn $tablelist::x] 1
	    tablelist::condShowTarget $tablelist::W $tablelist::y
	}
    }
    bind TablelistBody <ButtonRelease-1> {
	if {[winfo exists %W]} {
	    foreach {tablelist::W tablelist::x tablelist::y} \
		[tablelist::convEventFields %W %x %y] {}

	    set tablelist::priv(x) ""
	    set tablelist::priv(y) ""
	    after cancel $tablelist::priv(afterId)
	    set tablelist::priv(afterId) ""
	    set tablelist::priv(justReleased) 1
	    after 100 [list set tablelist::priv(justReleased) 0]
	    set tablelist::priv(releasedInEditWin) 0
	    if {!$tablelist::priv(clickedExpCollCtrl)} {
		if {$tablelist::priv(justClicked)} {
		    tablelist::moveOrActivate $tablelist::W \
			$tablelist::priv(row) $tablelist::priv(col) 1
		} else {
		    tablelist::moveOrActivate $tablelist::W \
			[$tablelist::W nearest       $tablelist::y] \
			[$tablelist::W nearestcolumn $tablelist::x] \
			[expr {$tablelist::x >= 0 &&
			       $tablelist::x < [winfo width $tablelist::W] &&
			       $tablelist::y >= [winfo y $tablelist::W.body] &&
			       $tablelist::y < [winfo height $tablelist::W]}]
		}
	    }
	    set tablelist::priv(clickedExpCollCtrl) 0
	    after 100 [list tablelist::condEvalInvokeCmd $tablelist::W]
	}
    }
    bind TablelistBody <Shift-Button-1> {
	foreach {tablelist::W tablelist::x tablelist::y} \
	    [tablelist::convEventFields %W %x %y] {}

	tablelist::beginExtend $tablelist::W \
	    [$tablelist::W nearest       $tablelist::y] \
	    [$tablelist::W nearestcolumn $tablelist::x]
    }
    bind TablelistBody <Control-Button-1> {
	foreach {tablelist::W tablelist::x tablelist::y} \
	    [tablelist::convEventFields %W %x %y] {}

	tablelist::beginToggle $tablelist::W \
	    [$tablelist::W nearest       $tablelist::y] \
	    [$tablelist::W nearestcolumn $tablelist::x]
    }

    bind TablelistBody <Return> {
	tablelist::condEditActiveCell [tablelist::getTablelistPath %W]
    }
    bind TablelistBody <KP_Enter> {
	tablelist::condEditActiveCell [tablelist::getTablelistPath %W]
    }
    bind TablelistBody <Tab> {
	tablelist::nextPrevCell [tablelist::getTablelistPath %W] 1
    }
    bind TablelistBody <Shift-Tab> {
	tablelist::nextPrevCell [tablelist::getTablelistPath %W] -1
    }
    bind TablelistBody <<PrevWindow>> {
	tablelist::nextPrevCell [tablelist::getTablelistPath %W] -1
    }
    bind TablelistBody <plus> {
	tablelist::plusMinus [tablelist::getTablelistPath %W] plus
    }
    bind TablelistBody <minus> {
	tablelist::plusMinus [tablelist::getTablelistPath %W] minus
    }
    bind TablelistBody <KP_Add> {
	tablelist::plusMinus [tablelist::getTablelistPath %W] plus
    }
    bind TablelistBody <KP_Subtract> {
	tablelist::plusMinus [tablelist::getTablelistPath %W] minus
    }

    foreach {virtual event} {
	PrevLine <Up>		 NextLine <Down>
	PrevChar <Left>		 NextChar <Right>
	LineStart <Home>	 LineEnd <End>
	PrevWord <Control-Left>	 NextWord <Control-Right>

	SelectPrevLine <Shift-Up>     SelectNextLine <Shift-Down>
	SelectPrevChar <Shift-Left>   SelectNextChar <Shift-Right>
	SelectLineStart <Shift-Home>  SelectLineEnd <Shift-End>
	SelectAll <Control-slash>     SelectNone <Control-backslash>} {
	if {[llength [event info <<$virtual>>]] == 0} {
	    set eventArr($virtual) $event
	} else {
	    set eventArr($virtual) <<$virtual>>
	}
    }

    bind TablelistBody $eventArr(PrevLine) {
	tablelist::upDown [tablelist::getTablelistPath %W] -1
    }
    bind TablelistBody $eventArr(NextLine) {
	tablelist::upDown [tablelist::getTablelistPath %W] 1
    }
    bind TablelistBody $eventArr(PrevChar) {
	tablelist::leftRight [tablelist::getTablelistPath %W] -1
    }
    bind TablelistBody $eventArr(NextChar) {
	tablelist::leftRight [tablelist::getTablelistPath %W] 1
    }
    bind TablelistBody <Prior> {
	tablelist::priorNext [tablelist::getTablelistPath %W] -1
    }
    bind TablelistBody <Next> {
	tablelist::priorNext [tablelist::getTablelistPath %W] 1
    }
    bind TablelistBody $eventArr(LineStart) {
	tablelist::homeEnd [tablelist::getTablelistPath %W] Home
    }
    bind TablelistBody $eventArr(LineEnd) {
	tablelist::homeEnd [tablelist::getTablelistPath %W] End
    }
    bind TablelistBody <Control-Home> {
	tablelist::firstLast [tablelist::getTablelistPath %W] first
    }
    bind TablelistBody <Control-End> {
	tablelist::firstLast [tablelist::getTablelistPath %W] last
    }
    bind TablelistBody $eventArr(SelectPrevLine) {
	tablelist::extendUpDown [tablelist::getTablelistPath %W] -1
    }
    bind TablelistBody $eventArr(SelectNextLine) {
	tablelist::extendUpDown [tablelist::getTablelistPath %W] 1
    }
    bind TablelistBody $eventArr(SelectPrevChar) {
	tablelist::extendLeftRight [tablelist::getTablelistPath %W] -1
    }
    bind TablelistBody $eventArr(SelectNextChar) {
	tablelist::extendLeftRight [tablelist::getTablelistPath %W] 1
    }
    bind TablelistBody $eventArr(SelectLineStart) {
	tablelist::extendToHomeEnd [tablelist::getTablelistPath %W] Home
    }
    bind TablelistBody $eventArr(SelectLineEnd) {
	tablelist::extendToHomeEnd [tablelist::getTablelistPath %W] End
    }
    bind TablelistBody <Shift-Control-Home> {
	tablelist::extendToFirstLast [tablelist::getTablelistPath %W] first
    }
    bind TablelistBody <Shift-Control-End> {
	tablelist::extendToFirstLast [tablelist::getTablelistPath %W] last
    }
    bind TablelistBody <space> {
	set tablelist::W [tablelist::getTablelistPath %W]

	tablelist::beginSelect $tablelist::W \
	    [$tablelist::W index active] [$tablelist::W columnindex active]
    }
    bind TablelistBody <Select> {
	set tablelist::W [tablelist::getTablelistPath %W]

	tablelist::beginSelect $tablelist::W \
	    [$tablelist::W index active] [$tablelist::W columnindex active]
    }
    bind TablelistBody <Control-Shift-space> {
	set tablelist::W [tablelist::getTablelistPath %W]

	tablelist::beginExtend $tablelist::W \
	    [$tablelist::W index active] [$tablelist::W columnindex active]
    }
    bind TablelistBody <Shift-Select> {
	set tablelist::W [tablelist::getTablelistPath %W]

	tablelist::beginExtend $tablelist::W \
	    [$tablelist::W index active] [$tablelist::W columnindex active]
    }
    bind TablelistBody <Escape> {
	tablelist::cancelSelection [tablelist::getTablelistPath %W]
    }
    bind TablelistBody $eventArr(SelectAll) {
	tablelist::selectAll [tablelist::getTablelistPath %W]
    }
    bind TablelistBody $eventArr(SelectNone) {
	set tablelist::W [tablelist::getTablelistPath %W]

	if {[string compare [$tablelist::W cget -selectmode] "browse"] != 0} {
	    $tablelist::W selection clear 0 end
	    event generate $tablelist::W <<TablelistSelect>>
	}
    }
    foreach pattern {Tab Shift-Tab ISO_Left_Tab hpBackTab} {
	catch {
	    foreach modifier {Control Meta} {
		bind TablelistBody <$modifier-$pattern> [format {
		    mwutil::processTraversal %%W Tablelist <%s>
		} $pattern]
	    }
	}
    }

    variable winSys
    catch {
	if {[string compare $winSys "classic"] == 0 ||
	    [string compare $winSys "aqua"] == 0} {
	    bind TablelistBody <MouseWheel> {
		[tablelist::getTablelistPath %W] yview scroll [expr {-%D}] units
		break
	    }
	    bind TablelistBody <Shift-MouseWheel> {
		[tablelist::getTablelistPath %W] xview scroll [expr {-%D}] units
		break
	    }
	    bind TablelistBody <Option-MouseWheel> {
		[tablelist::getTablelistPath %W] yview scroll \
		    [expr {-10 * %D}] units
		break
	    }
	    bind TablelistBody <Shift-Option-MouseWheel> {
		[tablelist::getTablelistPath %W] xview scroll \
		    [expr {-10 * %D}] units
		break
	    }
	} else {
	    bind TablelistBody <MouseWheel> {
		[tablelist::getTablelistPath %W] yview scroll \
		    [expr {-(%D / 120) * 4}] units
		break
	    }
	    bind TablelistBody <Shift-MouseWheel> {
		[tablelist::getTablelistPath %W] xview scroll \
		    [expr {-(%D / 120) * 4}] units
		break
	    }
	}
    }

    if {[string compare $winSys "x11"] == 0} {
	bind TablelistBody <Button-4> {
	    if {!$tk_strictMotif} {
		[tablelist::getTablelistPath %W] yview scroll -5 units
		break
	    }
	}
	bind TablelistBody <Button-5> {
	    if {!$tk_strictMotif} {
		[tablelist::getTablelistPath %W] yview scroll 5 units
		break
	    }
	}
	bind TablelistBody <Shift-Button-4> {
	    if {!$tk_strictMotif} {
		[tablelist::getTablelistPath %W] xview scroll -5 units
		break
	    }
	}
	bind TablelistBody <Shift-Button-5> {
	    if {!$tk_strictMotif} {
		[tablelist::getTablelistPath %W] xview scroll 5 units
		break
	    }
	}
    }

    foreach event {<Control-Left> <<PrevWord>> <Control-Right> <<NextWord>>
		   <Control-Prior> <Control-Next> <<Copy>>
		   <Button-2> <B2-Motion>} {
	set script [strMap {
	    "%W" "$tablelist::W"  "%x" "$tablelist::x"  "%y" "$tablelist::y"
	} [bind Listbox $event]]

	if {[string length $script] != 0} {
	    bind TablelistBody $event [format {
		if {[winfo exists %%W]} {
		    foreach {tablelist::W tablelist::x tablelist::y} \
			[tablelist::convEventFields %%W %%x %%y] {}
		    %s
		}
	    } $script]
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::invokeMotionHandler
#
# Invokes the procedure handleMotionDelayed for the body of the tablelist
# widget win and the current pointer coordinates.
#------------------------------------------------------------------------------
proc tablelist::invokeMotionHandler win {
    upvar ::tablelist::ns${win}::data data
    set w $data(body)
    set X [winfo pointerx $w]
    set Y [winfo pointery $w]
    if {$X >= 0 && $Y >= 0} {	;# the mouse pointer is on the same screen as w
	set x [expr {$X - [winfo rootx $w]}]
	set y [expr {$Y - [winfo rooty $w]}]
    } else {
	set x -1
	set y -1
    }

    handleMotionDelayed $w $x $y $X $Y <Motion>
}

#------------------------------------------------------------------------------
# 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.
#------------------------------------------------------------------------------
proc tablelist::handleMotionDelayed {w x y X Y event} {
    set win [getTablelistPath $w]
    upvar ::tablelist::ns${win}::data data
    set data(motionData) [list $w $x $y $X $Y $event]
    if {![info exists data(motionId)]} {
	set data(motionId) [after 100 [list tablelist::handleMotion $win]]
    }

    if {[string compare $event "<Enter>"] == 0} {
	set data(justEntered) 1
    }
}

#------------------------------------------------------------------------------
# tablelist::handleMotion
#
# Invokes the procedures showOrHideTooltip, updateExpCollCtrl, and updateCursor.
#------------------------------------------------------------------------------
proc tablelist::handleMotion win {
    upvar ::tablelist::ns${win}::data data
    if {[info exists data(motionId)]} {
	after cancel $data(motionId)
	unset data(motionId)
    }

    set data(justEntered) 0

    foreach {w x y X Y event} $data(motionData) {}
    if {![winfo exists $w]} {
	invokeMotionHandler $win
	return ""
    }

    #
    # Get the containing cell from the coordinates relative to the tablelist
    #
    foreach {win _x _y} [convEventFields $w $x $y] {}
    set row [containingRow $win $_y]
    set col [containingCol $win $_x]

    showOrHideTooltip $win $row $col $X $Y
    updateExpCollCtrl $win $w $row $col $x

    #
    # Make sure updateCursor won't change the cursor of an embedded window
    #
    if {[string match "$data(body).frm_k*" $w] &&
	[string compare [winfo parent $w] $data(body)] == 0 &&
	[string compare $event "<Leave>"] != 0} {
	set row -1
	set col -1
    }

    updateCursor $win $row $col
}

#------------------------------------------------------------------------------
# tablelist::showOrHideTooltip
#
# If the pointer has crossed a cell boundary then the procedure removes the old
# tooltip and displays the one corresponding to the new cell.
#------------------------------------------------------------------------------
proc tablelist::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(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 <Leave>
    catch {uplevel #0 $data(-tooltipdelcommand) [list $win]}
    set data(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 $row $col]
	    event generate $win <Enter> -rootx $X -rooty $Y
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::updateExpCollCtrl
#
# Activates or deactivates the expand/collapse control under the mouse pointer.
#------------------------------------------------------------------------------
proc tablelist::updateExpCollCtrl {win w row col x} {
    upvar ::tablelist::ns${win}::data data
    set key [lindex $data(keyList) $row]
    set indentLabel $data(body).ind_$key,$col

    #
    # Check whether the x coordinate is inside the expand/collapse control
    #
    set inExpCollCtrl 0
    if {[winfo exists $indentLabel]} {
	if {[string compare $w $data(body)] == 0 &&
	    $x < [winfo x $indentLabel] &&
	    [string compare $data($key-parent) "root"] == 0} {
	    set imgName [$indentLabel cget -image]
	    if {[regexp {^tablelist_(.+)_(collapsed|expanded).*Img([0-9]+)$} \
			 $imgName dummy treeStyle mode depth]} {
		#
		# The mouse position is in the tablelist body, to the left
		# of an expand/collapse control of a top-level item:  Handle
		# this like a position inside the expand/collapse control
		#
		set inExpCollCtrl 1
	    }
	} elseif {[string compare $w $indentLabel] == 0} {
	    set imgName [$w cget -image]
	    if {[regexp {^tablelist_(.+)_(collapsed|expanded).*Img([0-9]+)$} \
			 $imgName dummy treeStyle mode depth]} {
		#
		# The mouse position is in an expand/collapse
		# image (which ends with the expand/collapse
		# control):  Check whether it is inside the control
		#
		set baseWidth [image width tablelist_${treeStyle}_collapsedImg]
		if {$x >= [winfo width $w] - $baseWidth - 5} {
		    set inExpCollCtrl 1
		}
	    }
	}
    }

    #
    # Conditionally deactivate the previously activated expand/collapse control
    #
    variable priv
    set prevCellIdx $priv(prevActExpCollCtrlCell)
    if {[string length $prevCellIdx] != 0 &&
	[info exists data($prevCellIdx-indent)] &&
	(!$inExpCollCtrl || [string compare $prevCellIdx $key,$col] != 0) &&
	[winfo exists $data(body).ind_$prevCellIdx]} {
	set data($prevCellIdx-indent) \
	    [strMap {"Act" ""} $data($prevCellIdx-indent)]
	$data(body).ind_$prevCellIdx configure -image $data($prevCellIdx-indent)
	set priv(prevActExpCollCtrlCell) ""
    }

    if {!$inExpCollCtrl || [string compare $prevCellIdx $key,$col] == 0} {
	return ""
    }

    #
    # Activate the expand/collapse control under the mouse pointer
    #
    variable ${treeStyle}_collapsedActImg
    if {[info exists ${treeStyle}_collapsedActImg]} {
	set data($key,$col-indent) [strMap {
	    "SelActImg" "SelActImg" "SelImg" "SelActImg"
	    "ActImg" "ActImg" "Img" "ActImg"
	} $data($key,$col-indent)]
	$indentLabel configure -image $data($key,$col-indent)
	set priv(prevActExpCollCtrlCell) $key,$col
    }
}

#------------------------------------------------------------------------------
# tablelist::updateCursor
#
# Updates the cursor of the body component of the tablelist widget win, over
# the specified cell containing the mouse pointer.
#------------------------------------------------------------------------------
proc tablelist::updateCursor {win row col} {
    upvar ::tablelist::ns${win}::data data
    if {$data(inEditWin)} {
	set cursor $data(-cursor)
    } elseif {$data(-showeditcursor)} {
	if {$data(-editselectedonly) &&
	    ![::$win cellselection includes $row,$col]} {
	    set editable 0
	} else {
	    set editable [expr {$row >= 0 && $col >= 0 &&
			  [isCellEditable $win $row $col]}]
	}

	if {$editable} {
	    if {$row == $data(editRow) && $col == $data(editCol)} {
		set cursor $data(-cursor)
	    } else {
		variable editCursor
		if {![info exists editCursor]} {
		    makeEditCursor 
		}
		set cursor $editCursor
	    }
	} else {
	    set cursor $data(-cursor)
	}

	#
	# Special handling for cell editing with the aid of BWidget
	# ComboBox. Oakley combobox, or Tk menubutton widgets
	#
	if {$data(editRow) >= 0 && $data(editCol) >= 0} {
	    foreach c [winfo children $data(bodyFrEd)] {
		set class [winfo class $c]
		if {([string compare $class "Toplevel"] == 0 ||
		     [string compare $class "Menu"] == 0) &&
		     [winfo ismapped $c]} {
		    set cursor $data(-cursor)
		    break
		}
	    }
	}
    } else {
	set cursor $data(-cursor)
    }

    if {[string compare [$data(body) cget -cursor] $cursor] != 0} {
	$data(body) configure -cursor $cursor
    }
}

#------------------------------------------------------------------------------
# tablelist::makeEditCursor
#
# Creates the platform-specific edit cursor.
#------------------------------------------------------------------------------
proc tablelist::makeEditCursor {} {
    variable editCursor
    variable winSys

    if {[string compare $winSys "win32"] == 0} {
	variable library
	set cursorName "pencil.cur"
	set cursorFile [file join $library scripts $cursorName]
	if {$::tcl_version >= 8.4} {
	    set cursorFile [file normalize $cursorFile]
	}
	set editCursor [list @$cursorFile]

	#
	# Make sure it will work for starpacks, too
	#
	variable helpLabel
	if {[catch {$helpLabel configure -cursor $editCursor}] != 0} {
	    set tempDir $::env(TEMP)
	    file copy -force $cursorFile $tempDir
	    set editCursor [list @[file join $tempDir $cursorName]]
	}
    } else {
	set editCursor pencil
    }
}

#------------------------------------------------------------------------------
# tablelist::wasExpCollCtrlClicked
#
# This procedure is invoked when mouse button 1 is pressed in the body of a
# tablelist widget or in one of its separators.  It checks whether the mouse
# click occurred inside an expand/collapse control.
#------------------------------------------------------------------------------
proc tablelist::wasExpCollCtrlClicked {w x y} {
    foreach {win _x _y} [convEventFields $w $x $y] {}
    set row [containingRow $win $_y]
    set col [containingCol $win $_x]
    upvar ::tablelist::ns${win}::data data
    set key [lindex $data(keyList) $row]
    set indentLabel $data(body).ind_$key,$col
    if {![winfo exists $indentLabel]} {
	return 0
    }

    #
    # Check whether the x coordinate is inside the expand/collapse control
    #
    set inExpCollCtrl 0
    if {[string compare $w $data(body)] == 0 && $x < [winfo x $indentLabel] &&
	[string compare $data($key-parent) "root"] == 0} {
	set imgName [$indentLabel cget -image]
	if {[regexp {^tablelist_(.+)_(collapsed|expanded).*Img([0-9]+)$} \
		     $imgName dummy treeStyle mode depth]} {
	    #
	    # The mouse position is in the tablelist body, to the left
	    # of an expand/collapse control of a top-level item:  Handle
	    # this like a position inside the expand/collapse control
	    #
	    set inExpCollCtrl 1
	}
    } elseif {[string compare $w $indentLabel] == 0} {
	set imgName [$w cget -image]
	if {[regexp {^tablelist_(.+)_(collapsed|expanded).*Img([0-9]+)$} \
		     $imgName dummy treeStyle mode depth]} {
	    #
	    # The mouse position is in an expand/collapse
	    # image (which ends with the expand/collapse
	    # control):  Check whether it is inside the control
	    #
	    set baseWidth [image width tablelist_${treeStyle}_collapsedImg]
	    if {$x >= [winfo width $w] - $baseWidth - 5} {
		set inExpCollCtrl 1
	    }
	}
    }

    if {!$inExpCollCtrl} {
	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
    #
    if {[string compare $mode "collapsed"] == 0} {
	::$win expand $row -partly
    } else {
	::$win collapse $row -partly
    }

    #
    # Restore the saved vertical position
    #
    $data(body) yview $topRow
    updateViewWhenIdle $win

    return 1
}

#------------------------------------------------------------------------------
# tablelist::condEditContainingCell
#
# This procedure is invoked when mouse button 1 is pressed in the body of a
# tablelist widget win or in one of its separators.  If the mouse click
# occurred inside an editable cell and the latter is not already being edited,
# then the procedure starts the interactive editing in that cell.  Otherwise it
# finishes a possibly active cell editing.
#------------------------------------------------------------------------------
proc tablelist::condEditContainingCell {win x y} {
    #
    # Get the containing cell from the coordinates relative to the parent
    #
    set row [containingRow $win $y]
    set col [containingCol $win $x]

    upvar ::tablelist::ns${win}::data data
    if {$data(justEntered) || ($data(-editselectedonly) &&
	![::$win cellselection includes $row,$col])} {
	set editable 0
    } else {
	set editable [expr {$row >= 0 && $col >= 0 &&
		      [isCellEditable $win $row $col]}]
    }

    #
    # The following check is sometimes needed on OS X if
    # editing with the aid of a menubutton is in progress
    #
    variable editCursor
    if {($row != $data(editRow) || $col != $data(editCol)) &&
	$data(-showeditcursor) && [info exists editCursor] &&
	[string compare [$data(body) cget -cursor] $editCursor] != 0} {
	set editable 0
    }

    if {$editable} {
	#
	# Get the coordinates relative to the
	# tablelist body and invoke doEditCell
	#
	set w $data(body)
	incr x -[winfo x $w]
	incr y -[winfo y $w]
	scan [$w index @$x,$y] "%d.%d" line charPos
	doEditCell $win $row $col 0 "" $charPos
    } elseif {$data(editRow) >= 0} {
	#
	# Finish the current editing
	#
	doFinishEditing $win
    }
}

#------------------------------------------------------------------------------
# tablelist::condBeginMove
#
# This procedure is typically invoked on button-1 presses in the body of a
# tablelist widget or in one of its separators.  It begins the process of
# moving the nearest row if the rows are movable and the selection mode is not
# browse or extended.
#------------------------------------------------------------------------------
proc tablelist::condBeginMove {win row} {
    upvar ::tablelist::ns${win}::data data
    if {$data(isDisabled) || !$data(-movablerows) || $data(itemCount) == 0 ||
	[string compare $data(-selectmode) "browse"] == 0 ||
	[string compare $data(-selectmode) "extended"] == 0} {
	return ""
    }

    set data(sourceRow) $row
    set sourceKey [lindex $data(keyList) $row]
    set data(sourceEndRow) [nodeRow $win $sourceKey end]
    set data(sourceDescCount) [descCount $win $sourceKey]

    set data(sourceParentKey) $data($sourceKey-parent)
    set data(sourceParentRow) [keyToRow $win $data(sourceParentKey)]
    set data(sourceParentEndRow) [nodeRow $win $data(sourceParentKey) end]

    set topWin [winfo toplevel $win]
    set data(topEscBinding) [bind $topWin <Escape>]
    bind $topWin <Escape> [list tablelist::cancelMove [strMap {"%" "%%"} $win]]
}

#------------------------------------------------------------------------------
# tablelist::beginSelect
#
# This procedure is typically invoked on button-1 presses in the body of a
# tablelist widget or in one of its separators.  It begins the process of
# making a selection in the widget.  Its exact behavior depends on the
# selection mode currently in effect for the widget.
#------------------------------------------------------------------------------
proc tablelist::beginSelect {win row col {checkIfDragSrc 0}} {
    variable priv
    set priv(selClearPending) 0
    set priv(selChangePending) 0

    upvar ::tablelist::ns${win}::data data
    switch $data(-selecttype) {
	row {
	    if {[string compare $data(-selectmode) "multiple"] == 0} {
		if {[::$win selection includes $row]} {
		    if {$checkIfDragSrc && [isDragSrc $win]} {
			set priv(selClearPending) 1
		    } else {
			::$win selection clear $row
		    }
		} else {
		    ::$win selection set $row
		}
	    } else {
		if {[::$win selection includes $row] &&
		    $checkIfDragSrc && [isDragSrc $win]} {
		    set priv(selChangePending) 1
		} else {
		    ::$win selection clear 0 end
		    ::$win selection set $row
		}
		::$win selection anchor $row
		set priv(selection) {}
	    }

	    set priv(prevRow) $row
	}

	cell {
	    if {[string compare $data(-selectmode) "multiple"] == 0} {
		if {[::$win cellselection includes $row,$col]} {
		    if {$checkIfDragSrc && [isDragSrc $win]} {
			set priv(selClearPending) 1
		    } else {
			::$win cellselection clear $row,$col
		    }
		} else {
		    ::$win cellselection set $row,$col
		}
	    } else {
		if {[::$win cellselection includes $row,$col] &&
		    $checkIfDragSrc && [isDragSrc $win]} {
		    set priv(selChangePending) 1
		} else {
		    ::$win cellselection clear 0,0 end
		    ::$win cellselection set $row,$col
		}
		::$win cellselection anchor $row,$col
		set priv(selection) {}
	    }

	    set priv(prevRow) $row
	    set priv(prevCol) $col
	}
    }

    event generate $win <<TablelistSelect>>
}

#------------------------------------------------------------------------------
# tablelist::condAutoScan
#
# This procedure is invoked when the mouse leaves or enters the scrollable part
# of a tablelist widget's body text child while button 1 is down.  It either
# invokes the autoScan procedure or cancels its executon as an "after" command.
#------------------------------------------------------------------------------
proc tablelist::condAutoScan win {
    variable priv
    set w [::$win bodypath]
    set wX [winfo x $w]
    set wY [winfo y $w]
    set wWidth  [winfo width  $w]
    set wHeight [winfo height $w]
    set x [expr {$priv(x) - $wX}]
    set y [expr {$priv(y) - $wY}]
    set prevX [expr {$priv(prevX) - $wX}]
    set prevY [expr {$priv(prevY) - $wY}]
    set minX [minScrollableX $win]

    if {($y >= $wHeight && $prevY < $wHeight) ||
	($y < 0 && $prevY >= 0) ||
	($x >= $wWidth && $prevX < $wWidth) ||
	($x < $minX && $prevX >= $minX)} {
	if {[string length $priv(afterId)] == 0} {
	    autoScan $win
	}
    } elseif {($y < $wHeight && $prevY >= $wHeight) ||
	      ($y >= 0 && $prevY < 0) ||
	      ($x < $wWidth && $prevX >= $wWidth) ||
	      ($x >= $minX && $prevX < $minX)} {
	after cancel $priv(afterId)
	set priv(afterId) ""
    }
}

#------------------------------------------------------------------------------
# tablelist::autoScan
#
# This procedure is invoked when the mouse leaves the scrollable part of a
# tablelist widget's body text child while button 1 is down.  It scrolls the
# child up, down, left, or right, depending on where the mouse left the
# scrollable part of the tablelist's body, and reschedules itself as an "after"
# command so that the child continues to scroll until the mouse moves back into
# the window or the mouse button is released.
#------------------------------------------------------------------------------
proc tablelist::autoScan win {
    if {![array exists ::tablelist::ns${win}::data] || [isDragSrc $win] ||
	[string length [::$win editwinpath]] != 0} {
	return ""
    }

    upvar ::tablelist::ns${win}::data data
    if {!$data(-autoscan)} {
	return ""
    }

    variable priv
    set w [::$win bodypath]
    set x [expr {$priv(x) - [winfo x $w]}]
    set y [expr {$priv(y) - [winfo y $w]}]
    set minX [minScrollableX $win]

    if {$y >= [winfo height $w]} {
	::$win yview scroll 1 units
	set ms 50
    } elseif {$y < 0} {
	::$win yview scroll -1 units
	set ms 50
    } elseif {$x >= [winfo width $w]} {
	if {$data(-titlecolumns) == 0} {
	    ::$win xview scroll 2 units
	    set ms 50
	} else {
	    ::$win xview scroll 1 units
	    set ms 250
	}
    } elseif {$x < $minX} {
	if {$data(-titlecolumns) == 0} {
	    ::$win xview scroll -2 units
	    set ms 50
	} else {
	    ::$win xview scroll -1 units
	    set ms 250
	}
    } else {
	return ""
    }

    motion $win [::$win nearest $priv(y)] [::$win nearestcolumn $priv(x)] 1
    set priv(afterId) [after $ms [list tablelist::autoScan $win]]
}

#------------------------------------------------------------------------------
# tablelist::minScrollableX
#
# Returns the least x coordinate within the scrollable part of the body of the
# tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::minScrollableX win {
    upvar ::tablelist::ns${win}::data data
    if {$data(-titlecolumns) == 0} {
	return 0
    } else {
	set sep [::$win separatorpath]
	if {[winfo viewable $sep]} {
	    return [expr {[winfo x $sep] - [winfo x [::$win bodypath]] + 1}]
	} else {
	    return 0
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::motion
#
# This procedure is called to process mouse motion events in the body of a
# tablelist widget or in one of its separators. while button 1 is down.  It may
# move or extend the selection, depending on the widget's selection mode.
#------------------------------------------------------------------------------
proc tablelist::motion {win row col {checkIfDragSrc 0}} {
    if {$checkIfDragSrc && [isDragSrc $win]} {
	return ""
    }

    upvar ::tablelist::ns${win}::data data
    variable priv
    switch $data(-selecttype) {
	row {
	    set prRow $priv(prevRow)
	    if {$row == $prRow} {
		return ""
	    }

	    switch -- $data(-selectmode) {
		browse {
		    ::$win selection clear 0 end
		    ::$win selection set $row
		    set priv(prevRow) $row
		    event generate $win <<TablelistSelect>>
		}
		extended {
		    if {[string length $prRow] == 0} {
			set prRow $row
			::$win selection set $row
		    }

		    if {[::$win selection includes anchor]} {
			::$win selection clear $prRow $row
			::$win selection set anchor $row
		    } else {
			::$win selection clear $prRow $row
			::$win selection clear anchor $row
		    }

		    set ancRow $data(anchorRow)
		    foreach r $priv(selection) {
			if {($r >= $prRow && $r < $row && $r < $ancRow) ||
			    ($r <= $prRow && $r > $row && $r > $ancRow)} {
			    ::$win selection set $r
			}
		    }

		    set priv(prevRow) $row
		    event generate $win <<TablelistSelect>>
		}
	    }
	}

	cell {
	    set prRow $priv(prevRow)
	    set prCol $priv(prevCol)
	    if {$row == $prRow && $col == $prCol} {
		return ""
	    }

	    switch -- $data(-selectmode) {
		browse {
		    ::$win cellselection clear 0,0 end
		    ::$win cellselection set $row,$col
		    set priv(prevRow) $row
		    set priv(prevCol) $col
		    event generate $win <<TablelistSelect>>
		}
		extended {
		    if {[string length $prRow] == 0 ||
			[string length $prCol] == 0} {
			set prRow $row
			set prcol $col
			::$win cellselection set $row,$col
		    }

		    set ancRow $data(anchorRow)
		    set ancCol $data(anchorCol)
		    if {[::$win cellselection includes anchor]} {
			::$win cellselection clear $prRow,$prCol $row,$ancCol
			::$win cellselection clear $prRow,$prCol $ancRow,$col
			::$win cellselection set anchor $row,$col
		    } else {
			::$win cellselection clear $prRow,$prCol $row,$ancCol
			::$win cellselection clear $prRow,$prCol $ancRow,$col
			::$win cellselection clear anchor $row,$col
		    }

		    foreach {rMin1 cMin1 rMax1 cMax1} \
			[normalizedRect $prRow $prCol $row $ancCol] {}
		    foreach {rMin2 cMin2 rMax2 cMax2} \
			[normalizedRect $prRow $prCol $ancRow $col] {}
		    foreach {rMin3 cMin3 rMax3 cMax3} \
			[normalizedRect $ancRow $ancCol $row $col] {}
		    foreach cellIdx $priv(selection) {
			scan $cellIdx "%d,%d" r c
			if {([cellInRect $r $c $rMin1 $cMin1 $rMax1 $cMax1] ||
			     [cellInRect $r $c $rMin2 $cMin2 $rMax2 $cMax2]) &&
			    ![cellInRect $r $c $rMin3 $cMin3 $rMax3 $cMax3]} {
			    ::$win cellselection set $r,$c
			}
		    }

		    set priv(prevRow) $row
		    set priv(prevCol) $col
		    event generate $win <<TablelistSelect>>
		}
	    }
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::condShowTarget
#
# This procedure is called to process mouse motion events in the body of a
# tablelist widget or in one of its separators. while button 1 is down.  It
# visualizes the would-be target position of the clicked row if a move
# operation is in progress.
#------------------------------------------------------------------------------
proc tablelist::condShowTarget {win y} {
    upvar ::tablelist::ns${win}::data data
    if {![info exists data(sourceRow)]} {
	return ""
    }

    set indentImg [doCellCget $data(sourceRow) $data(treeCol) $win -indent]
    set w $data(body)
    incr y -[winfo y $w]
    set textIdx [$w index @0,$y]
    set dlineinfo [$w dlineinfo $textIdx]
    set lineY [lindex $dlineinfo 1]
    set lineHeight [lindex $dlineinfo 3]
    set row [expr {int($textIdx) - 1}]

    if {$::tk_version < 8.3 || [string length $indentImg] == 0} {
	if {$y < $lineY + $lineHeight/2} {
	    set data(targetRow) $row
	    set gapY $lineY
	} else {
	    set y [expr {$lineY + $lineHeight}]
	    set textIdx [$w index @0,$y]
	    set row2 [expr {int($textIdx) - 1}]
	    if {$row2 == $row} {
		set row2 $data(itemCount)
	    }
	    set data(targetRow) $row2
	    set gapY $y
	}
	set data(targetChildIdx) -1
    } else {
	if {$y < $lineY + $lineHeight/4} {
	    set data(targetRow) $row
	    set data(targetChildIdx) -1
	    set gapY $lineY
	} elseif {$y < $lineY + $lineHeight*3/4} {
	    set data(targetRow) $row
	    set data(targetChildIdx) 0
	    set gapY [expr {$lineY + $lineHeight/2}]
	} else {
	    set y [expr {$lineY + $lineHeight}]
	    set textIdx [$w index @0,$y]
	    set row2 [expr {int($textIdx) - 1}]
	    if {$row2 == $row} {
		set row2 $data(itemCount)
	    }
	    set data(targetRow) $row2
	    set data(targetChildIdx) -1
	    set gapY $y
	}
    }

    #
    # Get the key and node index of the potential target parent
    #
    if {$data(targetRow) > $data(lastRow)} {
	if {$data(targetRow) > $data(sourceParentEndRow)} {
	    set targetParentKey root
	    set targetParentNodeIdx root
	} else {
	    set targetParentKey $data(sourceParentKey)
	    set targetParentNodeIdx $data(sourceParentRow)
	}
    } elseif {$data(targetChildIdx) == 0} {
	set targetParentKey [lindex $data(keyList) $data(targetRow)]
	set targetParentNodeIdx $data(targetRow)
    } else {
	set targetParentKey [::$win parentkey $data(targetRow)]
	set targetParentNodeIdx [keyToRow $win $targetParentKey]
	if {$targetParentNodeIdx < 0} {
	    set targetParentNodeIdx root
	}
    }

    if {($data(targetRow) == $data(sourceRow)) ||

	($data(targetRow) == $data(sourceParentRow) &&
	 $data(targetChildIdx) == 0) ||

	($data(targetRow) == $data(sourceEndRow) &&
	 $data(targetChildIdx) < 0) ||

	($data(targetRow) > $data(sourceRow) &&
	 $data(targetRow) <= $data(sourceRow) + $data(sourceDescCount)) ||

	([string compare $data(sourceParentKey) $targetParentKey] != 0 &&
	 ($::tk_version < 8.3 ||
	  ([string length $data(-acceptchildcommand)] != 0 &&
	   ![uplevel #0 $data(-acceptchildcommand) \
	     [list $win $targetParentNodeIdx $data(sourceRow)]]))) ||

	($data(targetChildIdx) < 0 &&
	 [string length $data(-acceptdropcommand)] != 0 &&
	 ![uplevel #0 $data(-acceptdropcommand) \
	   [list $win $data(targetRow) $data(sourceRow)]])} {

	unset data(targetRow)
	unset data(targetChildIdx)
	$w configure -cursor $data(-cursor)
	place forget $data(rowGap)
    } else {
	$w configure -cursor $data(-movecursor)
	if {$data(targetChildIdx) == 0} {
	    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)]
	}
	raise $data(rowGap)
    }
}

#------------------------------------------------------------------------------
# tablelist::moveOrActivate
#
# This procedure is invoked whenever mouse button 1 is released in the body of
# a tablelist widget or in one of its separators.  It either moves the
# previously clicked row before or after the one containing the mouse cursor,
# or activates the given nearest item or element (depending on the widget's
# selection type).
#------------------------------------------------------------------------------
proc tablelist::moveOrActivate {win row col inside} {
    variable priv
    upvar ::tablelist::ns${win}::data data
    if {$priv(selClearPending) && $inside} {
	switch $data(-selecttype) {
	    row {
		if {$row == $priv(prevRow)} {
		    ::$win selection clear $priv(prevRow)
		}
	    }
	    cell {
		if {$row == $priv(prevRow) && $col == $priv(prevCol)} {
		    ::$win cellselection clear $priv(prevRow),$priv(prevCol)
		}
	    }
	}

	event generate $win <<TablelistSelect>>
	set priv(selClearPending) 0
    } elseif {$priv(selChangePending) && $inside} {
	switch $data(-selecttype) {
	    row {
		if {$row == $priv(prevRow)} {
		    ::$win selection clear 0 end
		    ::$win selection set $priv(prevRow)
		}
	    }
	    cell {
		if {$row == $priv(prevRow) && $col == $priv(prevCol)} {
		    ::$win cellselection clear 0,0 end
		    ::$win cellselection set $priv(prevRow),$priv(prevCol)
		}
	    }
	}

	event generate $win <<TablelistSelect>>
	set priv(selChangePending) 0
    }

    #
    # Return if both <Button-1> and <ButtonRelease-1> occurred in the
    # temporary embedded widget used for interactive cell editing
    #
    if {$priv(clickedInEditWin) && $priv(releasedInEditWin)} {
	return ""
    }

    if {[info exists data(sourceRow)]} {
	set sourceRow $data(sourceRow)
	unset data(sourceRow)
	unset data(sourceEndRow)
	unset data(sourceDescCount)
	unset data(sourceParentKey)
	unset data(sourceParentRow)
	unset data(sourceParentEndRow)
	bind [winfo toplevel $win] <Escape> $data(topEscBinding)
	$data(body) configure -cursor $data(-cursor)
	place forget $data(rowGap)

	if {[info exists data(targetRow)]} {
	    set sourceKey [lindex $data(keyList) $sourceRow]
	    set targetRow $data(targetRow)
	    unset data(targetRow)

	    if {$targetRow > $data(lastRow)} {
		if {[catch {::$win move $sourceRow $targetRow}] == 0} {
		    set targetParentNodeIdx [::$win parentkey $sourceRow]
		} else {
		    ::$win move $sourceRow root end
		    set targetParentNodeIdx root
		}

		set targetChildIdx [::$win childcount $targetParentNodeIdx]
	    } else {
		set targetChildIdx $data(targetChildIdx)
		unset data(targetChildIdx)

		if {$targetChildIdx == 0} {
		    set targetParentNodeIdx [lindex $data(keyList) $targetRow]
		    ::$win expand $targetParentNodeIdx -partly
		    ::$win move $sourceKey $targetParentNodeIdx $targetChildIdx
		} else {
		    set targetParentNodeIdx [::$win parentkey $targetRow]
		    set targetChildIdx [::$win childindex $targetRow]
		    ::$win move $sourceRow $targetParentNodeIdx $targetChildIdx
		}
	    }

	    set userData [list $sourceKey $targetParentNodeIdx $targetChildIdx]
	    genVirtualEvent $win <<TablelistRowMoved>> $userData

	    switch $data(-selecttype) {
		row  { ::$win activate $sourceKey }
		cell { ::$win activatecell $sourceKey,$col }
	    }

	    return ""
	}
    }

    switch $data(-selecttype) {
	row  { ::$win activate $row }
	cell { ::$win activatecell $row,$col }
    }
}

#------------------------------------------------------------------------------
# tablelist::condEvalInvokeCmd
#
# This procedure is invoked when mouse button 1 is released in the body of a
# tablelist widget win or in one of its separators.  If interactive cell
# editing is in progress in a column whose associated edit window has an invoke
# command that hasn't yet been called in the current edit session, then the
# procedure evaluates that command.
#------------------------------------------------------------------------------
proc tablelist::condEvalInvokeCmd win {
    #
    # This is an "after 100" callback; check whether the window exists
    #
    if {![array exists ::tablelist::ns${win}::data]} {
	return ""
    }

    upvar ::tablelist::ns${win}::data data
    if {$data(editCol) < 0} {
	return ""
    }

    variable editWin
    set name [getEditWindow $win $data(editRow) $data(editCol)]
    if {[string length $editWin($name-invokeCmd)] == 0 || $data(invoked)} {
	return ""
    }

    #
    # Return if both <Button-1> and <ButtonRelease-1> occurred in the
    # temporary embedded widget used for interactive cell editing
    #
    variable priv
    if {$priv(clickedInEditWin) && $priv(releasedInEditWin)} {
	return ""
    }

    #
    # Check whether the edit window is a checkbutton,
    # and return if it is an editable combobox widget
    #
    set isCheckbtn 0
    set w $data(bodyFrEd)
    switch [winfo class $w] {
	Checkbutton -
	TCheckbutton {
	    set isCheckbtn 1
	}
	TCombobox {
	    if {[string compare [$w cget -state] "normal"] == 0} {
		return ""
	    }
	}
	ComboBox -
	Combobox {
	    if {[$w cget -editable]} {
		return ""
	    }
	}
    }

    #
    # Evaluate the edit window's invoke command
    #
    update
    if {![winfo exists $w]} {				;# because of update
	return ""
    }
    eval [strMap {"%W" "$w"} $editWin($name-invokeCmd)]
    set data(invoked) 1

    #
    # If the edit window is a checkbutton and the value of the
    # -instanttoggle option is true then finish the editing
    #
    if {$isCheckbtn && $data(-instanttoggle)} {
	doFinishEditing $win
    }
}

#------------------------------------------------------------------------------
# tablelist::cancelMove
#
# This procedure is invoked to process <Escape> events in the top-level window
# containing the tablelist widget win during a row move operation.  It cancels
# the action in progress.
#------------------------------------------------------------------------------
proc tablelist::cancelMove win {
    upvar ::tablelist::ns${win}::data data
    if {![info exists data(sourceRow)]} {
	return ""
    }

    unset data(sourceRow)
    unset data(sourceEndRow)
    unset data(sourceDescCount)
    unset data(sourceParentKey)
    unset data(sourceParentRow)
    unset data(sourceParentEndRow)
    catch {unset data(targetRow)}
    catch {unset data(targetChildIdx)}
    bind [winfo toplevel $win] <Escape> $data(topEscBinding)
    $data(body) configure -cursor $data(-cursor)
    place forget $data(rowGap)
}

#------------------------------------------------------------------------------
# tablelist::beginExtend
#
# This procedure is typically invoked on shift-button-1 presses in the body of
# a tablelist widget or in one of its separators.  It begins the process of
# extending a selection in the widget.  Its exact behavior depends on the
# selection mode currently in effect for the widget.
#------------------------------------------------------------------------------
proc tablelist::beginExtend {win row col} {
    if {[string compare [::$win cget -selectmode] "extended"] != 0} {
	return ""
    }

    if {[::$win selection includes anchor]} {
	motion $win $row $col
    } else {
	beginSelect $win $row $col
    }
}

#------------------------------------------------------------------------------
# tablelist::beginToggle
#
# This procedure is typically invoked on control-button-1 presses in the body
# of a tablelist widget or in one of its separators.  It begins the process of
# toggling a selection in the widget.  Its exact behavior depends on the
# selection mode currently in effect for the widget.
#------------------------------------------------------------------------------
proc tablelist::beginToggle {win row col} {
    upvar ::tablelist::ns${win}::data data
    if {[string compare $data(-selectmode) "extended"] != 0} {
	return ""
    }

    variable priv
    switch $data(-selecttype) {
	row {
	    set priv(selection) [::$win curselection]
	    set priv(prevRow) $row
	    ::$win selection anchor $row
	    if {[::$win selection includes $row]} {
		::$win selection clear $row
	    } else {
		::$win selection set $row
	    }
	}

	cell {
	    set priv(selection) [::$win curcellselection]
	    set priv(prevRow) $row
	    set priv(prevCol) $col
	    ::$win cellselection anchor $row,$col
	    if {[::$win cellselection includes $row,$col]} {
		::$win cellselection clear $row,$col
	    } else {
		::$win cellselection set $row,$col
	    }
	}
    }

    event generate $win <<TablelistSelect>>
}

#------------------------------------------------------------------------------
# tablelist::condEditActiveCell
#
# This procedure is invoked whenever Return or KP_Enter is pressed in the body
# of a tablelist widget.  If the selection type is cell and the active cell is
# editable then the procedure starts the interactive editing in that cell.
#------------------------------------------------------------------------------
proc tablelist::condEditActiveCell win {
    upvar ::tablelist::ns${win}::data data
    if {[string compare $data(-selecttype) "cell"] != 0 ||
	[firstViewableRow $win] < 0 || [firstViewableCol $win] < 0} {
	return ""
    }

    set row $data(activeRow)
    set col $data(activeCol)
    if {[isCellEditable $win $row $col]} {
	doEditCell $win $row $col 0
    }
}

#------------------------------------------------------------------------------
# tablelist::plusMinus
#
# Partially expands or collapses the active row if possible.
#------------------------------------------------------------------------------
proc tablelist::plusMinus {win keysym} {
    upvar ::tablelist::ns${win}::data data
    set row $data(activeRow)
    set col $data(treeCol)
    set key [lindex $data(keyList) $row]
    set op ""

    if {[info exists data($key,$col-indent)]} {
	set indentLabel $data(body).ind_$key,$col
	set imgName [$indentLabel cget -image]
	if {[regexp {^tablelist_(.+)_(collapsed|expanded).*Img([0-9]+)$} \
		     $imgName dummy treeStyle mode depth]} {
	    if {[string compare $keysym "plus"] == 0 &&
		[string compare $mode "collapsed"] == 0} {
		set op "expand"
	    } elseif {[string compare $keysym "minus"] == 0 &&
		      [string compare $mode "expanded"] == 0} {
		set op "collapse"
	    }
	}
    }

    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
    }
}

#------------------------------------------------------------------------------
# tablelist::nextPrevCell
#
# Does nothing unless the selection type is cell; in this case it moves the
# location cursor (active element) to the next or previous element, and changes
# the selection if we are in browse or extended selection mode.
#------------------------------------------------------------------------------
proc tablelist::nextPrevCell {win amount} {
    upvar ::tablelist::ns${win}::data data
    switch $data(-selecttype) {
	row {
	    # Nothing
	}

	cell {
	    if {$data(editRow) >= 0} {
		return -code break ""
	    }

	    set row $data(activeRow)
	    set col $data(activeCol)
	    set oldRow $row
	    set oldCol $col

	    while 1 {
		incr col $amount
		if {$col < 0} {
		    incr row $amount
		    if {$row < 0} {
			set row $data(lastRow)
		    }
		    set col $data(lastCol)
		} elseif {$col > $data(lastCol)} {
		    incr row $amount
		    if {$row > $data(lastRow)} {
			set row 0
		    }
		    set col 0
		}

		if {$row == $oldRow && $col == $oldCol} {
		    return -code break ""
		} elseif {[isRowViewable $win $row] && !$data($col-hide)} {
		    condChangeSelection $win $row $col
		    return -code break ""
		}
	    }
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::upDown
#
# Moves the location cursor (active item or element) up or down by one line,
# and changes the selection if we are in browse or extended selection mode.
#------------------------------------------------------------------------------
proc tablelist::upDown {win amount} {
    upvar ::tablelist::ns${win}::data data
    if {$data(editRow) >= 0} {
	return ""
    }

    switch $data(-selecttype) {
	row {
	    set row $data(activeRow)
	    set col -1
	}

	cell {
	    set row $data(activeRow)
	    set col $data(activeCol)
	}
    }

    while 1 {
	incr row $amount
	if {$row < 0 || $row > $data(lastRow)} {
	    return ""
	} elseif {[isRowViewable $win $row]} {
	    condChangeSelection $win $row $col
	    return ""
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::leftRight
#
# Partially expands or collapses the active row if possible.  Otherwise, if the
# tablelist widget's selection type is "row" then this procedure scrolls the
# widget's view left or right by the width of the character "0".  Otherwise it
# moves the location cursor (active element) left or right by one column, and
# changes the selection if we are in browse or extended selection mode.
#------------------------------------------------------------------------------
proc tablelist::leftRight {win amount} {
    upvar ::tablelist::ns${win}::data data
    set row $data(activeRow)
    set col $data(treeCol)
    set key [lindex $data(keyList) $row]
    set op ""

    if {[info exists data($key,$col-indent)]} {
	set indentLabel $data(body).ind_$key,$col
	set imgName [$indentLabel cget -image]
	if {[regexp {^tablelist_(.+)_(collapsed|expanded).*Img([0-9]+)$} \
		     $imgName dummy treeStyle mode depth]} {
	    if {$amount > 0 && [string compare $mode "collapsed"] == 0} {
		set op "expand"
	    } elseif {$amount < 0 && [string compare $mode "expanded"] == 0} {
		set op "collapse"
	    }
	}
    }

    if {[string length $op] == 0} {
	switch $data(-selecttype) {
	    row {
		::$win xview scroll $amount units
	    }

	    cell {
		if {$data(editRow) >= 0} {
		    return ""
		}

		set col $data(activeCol)
		while 1 {
		    incr col $amount
		    if {$col < 0 || $col > $data(lastCol)} {
			return ""
		    } elseif {!$data($col-hide)} {
			condChangeSelection $win $row $col
			return ""
		    }
		}
	    }
	}
    } 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
    }
}

#------------------------------------------------------------------------------
# tablelist::priorNext
#
# Scrolls the tablelist view up or down by one page.
#------------------------------------------------------------------------------
proc tablelist::priorNext {win amount} {
    upvar ::tablelist::ns${win}::data data
    if {$data(editRow) >= 0} {
	return ""
    }

    ::$win yview scroll $amount pages
    ::$win activate @0,0
    update idletasks
}

#------------------------------------------------------------------------------
# tablelist::homeEnd
#
# If selecttype is row then the procedure scrolls the tablelist widget
# horizontally to its left or right edge.  Otherwise it sets the location
# cursor (active element) to the first/last element of the active row, selects
# that element, and deselects everything else in the widget.
#------------------------------------------------------------------------------
proc tablelist::homeEnd {win keysym} {
    upvar ::tablelist::ns${win}::data data
    switch $data(-selecttype) {
	row {
	    switch $keysym {
		Home { ::$win xview moveto 0 }
		End  { ::$win xview moveto 1 }
	    }
	}

	cell {
	    set row $data(activeRow)
	    switch $keysym {
		Home { set col [firstViewableCol $win] }
		End  { set col [ lastViewableCol $win] }
	    }
	    changeSelection $win $row $col
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::firstLast
#
# Sets the location cursor (active item or element) to the first/last item or
# element in the tablelist widget, selects that item or element, and deselects
# everything else in the widget.
#------------------------------------------------------------------------------
proc tablelist::firstLast {win target} {
    switch $target {
	first {
	    set row [firstViewableRow $win]
	    set col [firstViewableCol $win]
	}

	last {
	    set row [lastViewableRow $win]
	    set col [lastViewableCol $win]
	}
    }

    changeSelection $win $row $col
}

#------------------------------------------------------------------------------
# tablelist::extendUpDown
#
# Does nothing unless we are in extended selection mode; in this case it moves
# the location cursor (active item or element) up or down by one line, and
# extends the selection to that point.
#------------------------------------------------------------------------------
proc tablelist::extendUpDown {win amount} {
    upvar ::tablelist::ns${win}::data data
    if {[string compare $data(-selectmode) "extended"] != 0} {
	return ""
    }

    switch $data(-selecttype) {
	row {
	    set row $data(activeRow)
	    while 1 {
		incr row $amount
		if {$row < 0 || $row > $data(lastRow)} {
		    return ""
		} elseif {[isRowViewable $win $row]} {
		    ::$win activate $row
		    ::$win see active
		    motion $win $data(activeRow) -1
		    return ""
		}
	    }
	}

	cell {
	    set row $data(activeRow)
	    set col $data(activeCol)
	    while 1 {
		incr row $amount
		if {$row < 0 || $row > $data(lastRow)} {
		    return ""
		} elseif {[isRowViewable $win $row]} {
		    ::$win activatecell $row,$col
		    ::$win seecell active
		    motion $win $data(activeRow) $data(activeCol)
		    return ""
		}
	    }
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::extendLeftRight
#
# Does nothing unless we are in extended selection mode and the selection type
# is cell; in this case it moves the location cursor (active element) left or
# right by one column, and extends the selection to that point.
#------------------------------------------------------------------------------
proc tablelist::extendLeftRight {win amount} {
    upvar ::tablelist::ns${win}::data data
    if {[string compare $data(-selectmode) "extended"] != 0} {
	return ""
    }

    switch $data(-selecttype) {
	row {
	    # Nothing
	}

	cell {
	    set row $data(activeRow)
	    set col $data(activeCol)
	    while 1 {
		incr col $amount
		if {$col < 0 || $col > $data(lastCol)} {
		    return ""
		} elseif {!$data($col-hide)} {
		    ::$win activatecell $row,$col
		    ::$win seecell active
		    motion $win $data(activeRow) $data(activeCol)
		    return ""
		}
	    }
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::extendToHomeEnd
#
# Does nothing unless the selection mode is multiple or extended and the
# selection type is cell; in this case it moves the location cursor (active
# element) to the first/last element of the active row, and, if we are in
# extended mode, it extends the selection to that point.
#------------------------------------------------------------------------------
proc tablelist::extendToHomeEnd {win keysym} {
    upvar ::tablelist::ns${win}::data data
    switch $data(-selecttype) {
	row {
	    # Nothing
	}

	cell {
	    set row $data(activeRow)
	    switch $keysym {
		Home { set col [firstViewableCol $win] }
		End  { set col [ lastViewableCol $win] }
	    }

	    switch -- $data(-selectmode) {
		multiple {
		    ::$win activatecell $row,$col
		    ::$win seecell $row,$col
		}
		extended {
		    ::$win activatecell $row,$col
		    ::$win seecell $row,$col
		    if {[::$win selection includes anchor]} {
			motion $win $row $col
		    }
		}
	    }
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::extendToFirstLast
#
# Does nothing unless the selection mode is multiple or extended; in this case
# it moves the location cursor (active item or element) to the first/last item
# or element in the tablelist widget, and, if we are in extended mode, it
# extends the selection to that point.
#------------------------------------------------------------------------------
proc tablelist::extendToFirstLast {win target} {
    switch $target {
	first {
	    set row [firstViewableRow $win]
	    set col [firstViewableCol $win]
	}

	last {
	    set row [lastViewableRow $win]
	    set col [lastViewableCol $win]
	}
    }

    upvar ::tablelist::ns${win}::data data
    switch $data(-selecttype) {
	row {
	    switch -- $data(-selectmode) {
		multiple {
		    ::$win activate $row
		    ::$win see $row
		}
		extended {
		    ::$win activate $row
		    ::$win see $row
		    if {[::$win selection includes anchor]} {
			motion $win $row -1
		    }
		}
	    }
	}

	cell {
	    switch -- $data(-selectmode) {
		multiple {
		    ::$win activatecell $row,$col
		    ::$win seecell $row,$col
		}
		extended {
		    ::$win activatecell $row,$col
		    ::$win seecell $row,$col
		    if {[::$win selection includes anchor]} {
			motion $win $row $col
		    }
		}
	    }
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::cancelSelection
#
# This procedure is invoked to cancel an extended selection in progress.  If
# there is an extended selection in progress, it restores all of the elements
# to their previous selection state.
#------------------------------------------------------------------------------
proc tablelist::cancelSelection win {
    upvar ::tablelist::ns${win}::data data
    if {[string compare $data(-selectmode) "extended"] != 0} {
	return ""
    }

    variable priv
    switch $data(-selecttype) {
	row {
	    if {[string length $priv(prevRow)] == 0} {
		return ""
	    }

	    ::$win selection clear 0 end
	    foreach row $priv(selection) {
		::$win selection set $row
	    }
	    event generate $win <<TablelistSelect>>
	}

	cell {
	    if {[string length $priv(prevRow)] == 0 ||
		[string length $priv(prevCol)] == 0} {
		return ""
	    }

	    ::$win selection clear 0 end
	    foreach cellIdx $priv(selection) {
		::$win cellselection set $cellIdx
	    }
	    event generate $win <<TablelistSelect>>
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::selectAll
#
# This procedure is invoked to handle the "select all" operation.  For single
# and browse mode, it just selects the active item or element.  Otherwise it
# selects everything in the widget.
#------------------------------------------------------------------------------
proc tablelist::selectAll win {
    upvar ::tablelist::ns${win}::data data
    switch $data(-selecttype) {
	row {
	    if {[string compare $data(-selectmode) "single"] == 0 ||
		[string compare $data(-selectmode) "browse"] == 0} {
		::$win selection clear 0 end
		::$win selection set active
	    } else {
		::$win selection set 0 end
	    }
	}

	cell {
	    if {[string compare $data(-selectmode) "single"] == 0 ||
		[string compare $data(-selectmode) "browse"] == 0} {
		::$win cellselection clear 0,0 end
		::$win cellselection set active
	    } else {
		::$win cellselection set 0,0 end
	    }
	}
    }

    event generate $win <<TablelistSelect>>
}

#------------------------------------------------------------------------------
# tablelist::isDragSrc
#
# Checks whether the body component of the tablelist widget win is a BWidget or
# TkDND drag source for mouse button 1.
#------------------------------------------------------------------------------
proc tablelist::isDragSrc win {
    upvar ::tablelist::ns${win}::data data
    set bindTags [bindtags $data(body)]
    return [expr {[info exists data(sourceRow)] || $data(-customdragsource) ||
		  [lsearch -exact $bindTags "BwDrag1"] >= 0 ||
		  [lsearch -exact $bindTags "TkDND_Drag1"] >= 0
    }]
}

#------------------------------------------------------------------------------
# tablelist::normalizedRect
#
# Returns a list of the form {minRow minCol maxRow maxCol}, built from the
# given arguments.
#------------------------------------------------------------------------------
proc tablelist::normalizedRect {row1 col1 row2 col2} {
    if {$row1 <= $row2} {
	set minRow $row1
	set maxRow $row2
    } else {
	set minRow $row2
	set maxRow $row1
    }

    if {$col1 <= $col2} {
	set minCol $col1
	set maxCol $col2
    } else {
	set minCol $col2
	set maxCol $col1
    }

    return [list $minRow $minCol $maxRow $maxCol]
}

#------------------------------------------------------------------------------
# tablelist::cellInRect
#
# Checks whether the cell row,col is contained in the given rectangular range.
#------------------------------------------------------------------------------
proc tablelist::cellInRect {row col minRow minCol maxRow maxCol} {
    return [expr {$row >= $minRow && $row <= $maxRow &&
		  $col >= $minCol && $col <= $maxCol}]
}

#------------------------------------------------------------------------------
# tablelist::firstViewableRow
#
# Returns the index of the first viewable row of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::firstViewableRow win {
    upvar ::tablelist::ns${win}::data data
    for {set row 0} {$row < $data(itemCount)} {incr row} {
	if {[isRowViewable $win $row]} {
	    return $row
	}
    }

    return -1
}

#------------------------------------------------------------------------------
# tablelist::lastViewableRow
#
# Returns the index of the last viewable row of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::lastViewableRow win {
    upvar ::tablelist::ns${win}::data data
    for {set row $data(lastRow)} {$row >= 0} {incr row -1} {
	if {[isRowViewable $win $row]} {
	    return $row
	}
    }

    return -1
}

#------------------------------------------------------------------------------
# tablelist::firstViewableCol
#
# Returns the index of the first non-hidden column of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::firstViewableCol win {
    upvar ::tablelist::ns${win}::data data
    for {set col 0} {$col < $data(colCount)} {incr col} {
	if {!$data($col-hide)} {
	    return $col
	}
    }

    return -1
}

#------------------------------------------------------------------------------
# tablelist::lastViewableCol
#
# Returns the index of the last non-hidden column of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::lastViewableCol win {
    upvar ::tablelist::ns${win}::data data
    for {set col $data(lastCol)} {$col >= 0} {incr col -1} {
	if {!$data($col-hide)} {
	    return $col
	}
    }

    return -1
}

#------------------------------------------------------------------------------
# tablelist::condChangeSelection
#
# Activates the given item or element, and selects it exclusively if we are in
# browse or extended selection mode.
#------------------------------------------------------------------------------
proc tablelist::condChangeSelection {win row col} {
    upvar ::tablelist::ns${win}::data data
    switch $data(-selecttype) {
	row {
	    ::$win activate $row
	    ::$win see active

	    switch -- $data(-selectmode) {
		browse {
		    ::$win selection clear 0 end
		    ::$win selection set active
		    event generate $win <<TablelistSelect>>
		}
		extended {
		    ::$win selection clear 0 end
		    ::$win selection set active
		    ::$win selection anchor active
		    variable priv
		    set priv(selection) {}
		    set priv(prevRow) $data(activeRow)
		    event generate $win <<TablelistSelect>>
		}
	    }
	}

	cell {
	    ::$win activatecell $row,$col
	    ::$win seecell active

	    switch -- $data(-selectmode) {
		browse {
		    ::$win cellselection clear 0,0 end
		    ::$win cellselection set active
		    event generate $win <<TablelistSelect>>
		}
		extended {
		    ::$win cellselection clear 0,0 end
		    ::$win cellselection set active
		    ::$win cellselection anchor active
		    variable priv
		    set priv(selection) {}
		    set priv(prevRow) $data(activeRow)
		    set priv(prevCol) $data(activeCol)
		    event generate $win <<TablelistSelect>>
		}
	    }
	}
    }

    update idletasks
}

#------------------------------------------------------------------------------
# tablelist::changeSelection
#
# Activates the given item or element and selects it exclusively.
#------------------------------------------------------------------------------
proc tablelist::changeSelection {win row col} {
    upvar ::tablelist::ns${win}::data data
    switch $data(-selecttype) {
	row {
	    ::$win activate $row
	    ::$win see active

	    ::$win selection clear 0 end
	    ::$win selection set active
	}

	cell {
	    ::$win activatecell $row,$col
	    ::$win seecell active

	    ::$win cellselection clear 0,0 end
	    ::$win cellselection set active
	}
    }

    event generate $win <<TablelistSelect>>
}

#
# Binding tags TablelistLabel, TablelistSubLabel, and TablelistArrow
# ==================================================================
#

#------------------------------------------------------------------------------
# tablelist::defineTablelistSubLabel
#
# Defines the binding tag TablelistSubLabel (for sublabels of tablelist labels)
# to have the same events as TablelistLabel and the binding scripts obtained
# from those of TablelistLabel by replacing the widget %W with the containing
# label as well as the %x and %y fields with the corresponding coordinates
# relative to that label.
#------------------------------------------------------------------------------
proc tablelist::defineTablelistSubLabel {} {
    foreach event [bind TablelistLabel] {
	set script [strMap {
	    "%W" "$tablelist::W"  "%x" "$tablelist::x"  "%y" "$tablelist::y"
	} [bind TablelistLabel $event]]

	bind TablelistSubLabel $event [format {
	    set tablelist::W \
		[string range %%W 0 [expr {[string length %%W] - 4}]]
	    set tablelist::x \
		[expr {%%x + [winfo x %%W] - [winfo x $tablelist::W]}]
	    set tablelist::y \
		[expr {%%y + [winfo y %%W] - [winfo y $tablelist::W]}]
	    %s
	} $script]
    }
}

#------------------------------------------------------------------------------
# tablelist::defineTablelistArrow
#
# Defines the binding tag TablelistArrow (for sort arrows) to have the same
# events as TablelistLabel and the binding scripts obtained from those of
# TablelistLabel by replacing the widget %W with the containing label as well
# as the %x and %y fields with the corresponding coordinates relative to that
# label.
#------------------------------------------------------------------------------
proc tablelist::defineTablelistArrow {} {
    foreach event [bind TablelistLabel] {
	set script [strMap {
	    "%W" "$tablelist::W"  "%x" "$tablelist::x"  "%y" "$tablelist::y"
	} [bind TablelistLabel $event]]

	bind TablelistArrow $event [format {
	    set tablelist::W \
		[winfo parent %%W].l[string range [winfo name %%W] 1 end]
	    set tablelist::x \
		[expr {%%x + [winfo x %%W] - [winfo x $tablelist::W]}]
	    set tablelist::y \
		[expr {%%y + [winfo y %%W] - [winfo y $tablelist::W]}]
	    %s
	} $script]
    }
}

#------------------------------------------------------------------------------
# tablelist::labelEnter
#
# This procedure is invoked when the mouse pointer enters the header label w of
# a tablelist widget, or is moving within that label.  It updates the cursor,
# displays the tooltip, and activates or deactivates the label, depending on
# whether the pointer is on its right border or not.
#------------------------------------------------------------------------------
proc tablelist::labelEnter {w X Y x} {
    if {![parseLabelPath $w win col]} {
	return ""
    }

    upvar ::tablelist::ns${win}::data data
    configLabel $w -cursor $data(-cursor)

    if {[string length $data(-tooltipaddcommand)] != 0 &&
	[string length $data(-tooltipdelcommand)] != 0 &&
	$col != $data(prevCol)} {
	#
	# Display the tooltip corresponding to this label
	#
	set data(prevCol) $col
	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 -1 $col]
	    event generate $win <Leave>
	    event generate $win <Enter> -rootx $X -rooty $Y
	}
    }

    if {$data(isDisabled)} {
	return ""
    }

    if {[inResizeArea $w $x col] &&
	$data(-resizablecolumns) && $data($col-resizable)} {
	configLabel $w -cursor $data(-resizecursor)
	configLabel $w -active 0
    } else {
	configLabel $w -active 1
    }
}

#------------------------------------------------------------------------------
# tablelist::labelLeave
#
# This procedure is invoked when the mouse pointer leaves the header label w of
# a tablelist widget.  It removes the tooltip and deactivates the label.
#------------------------------------------------------------------------------
proc tablelist::labelLeave {w X x y} {
    if {![parseLabelPath $w win col]} {
	return ""
    }

    #
    # The following code is needed because the event
    # can also occur in a widget placed into the label
    #
    upvar ::tablelist::ns${win}::data data
    set hdrX [winfo rootx $data(hdr)]
    if {$X >= $hdrX && $X < $hdrX + [winfo width $data(hdr)] &&
	$x >= 1 && $x < [winfo width $w] - 1 &&
	$y >= 0 && $y < [winfo height $w]} {
	return ""
    }

    if {[string length $data(-tooltipaddcommand)] != 0 &&
	[string length $data(-tooltipdelcommand)] != 0} {
	#
	# Remove the tooltip, if any
	#
	event generate $win <Leave>
	catch {uplevel #0 $data(-tooltipdelcommand) [list $win]}
	set data(prevCol) -1
    }

    if {$data(isDisabled)} {
	return ""
    }

    configLabel $w -active 0
}

#------------------------------------------------------------------------------
# tablelist::labelB1Down
#
# This procedure is invoked when mouse button 1 is pressed in the header label
# w of a tablelist widget.  If the pointer is on the right border of the label
# then the procedure records its x-coordinate relative to the label, the width
# of the column, and some other data needed later.  Otherwise it saves the
# label's relief so it can be restored later, and changes the relief to sunken.
#------------------------------------------------------------------------------
proc tablelist::labelB1Down {w x shiftPressed} {
    if {![parseLabelPath $w win col]} {
	return ""
    }

    upvar ::tablelist::ns${win}::data data
    if {$data(isDisabled) ||
	[info exists data(colBeingResized)]} {	;# resize operation in progress
	return ""
    }

    set data(labelClicked) 1
    set data(X) [expr {[winfo rootx $w] + $x}]
    set data(shiftPressed) $shiftPressed

    if {[inResizeArea $w $x col] &&
	$data(-resizablecolumns) && $data($col-resizable)} {
	set data(colBeingResized) $col
	set data(colResized) 0

	set w $data(body)
	set topTextIdx [$w index @0,0]
	set btmTextIdx [$w index @0,[expr {[winfo height $w] - 1}]]
	$w tag add visibleLines "$topTextIdx linestart" "$btmTextIdx lineend"
	set data(topRow) [expr {int($topTextIdx) - 1}]
	set data(btmRow) [expr {int($btmTextIdx) - 1}]

	set w $data(hdrTxtFrLbl)$col
	set labelWidth [winfo width $w]
	set data(oldStretchedColWidth) [expr {$labelWidth - 2*$data(charWidth)}]
	set data(oldColDelta) $data($col-delta)
	set data(configColWidth) [lindex $data(-columns) [expr {3*$col}]]

	if {[lsearch -exact $data(arrowColList) $col] >= 0} {
	    set canvasWidth $data(arrowWidth)
	    if {[llength $data(arrowColList)] > 1} {
		incr canvasWidth 6
	    }
	    set data(minColWidth) $canvasWidth
	} elseif {$data($col-wrap)} {
	    set data(minColWidth) $data(charWidth)
	} else {
	    set data(minColWidth) 0
	}
	incr data(minColWidth)

	set data(focus) [focus -displayof $win]
	set topWin [winfo toplevel $win]
	focus $topWin
	set data(topEscBinding) [bind $topWin <Escape>]
	bind $topWin <Escape> \
	     [list tablelist::escape [strMap {"%" "%%"} $win] $col]
    } else {
	set data(inClickedLabel) 1
	set data(relief) [$w cget -relief]

	if {[info exists data($col-labelcommand)] ||
	    [string length $data(-labelcommand)] != 0} {
	    set data(changeRelief) 1
	    configLabel $w -relief sunken -pressed 1
	} else {
	    set data(changeRelief) 0
	}

	if {$data(-movablecolumns)} {
	    set data(focus) [focus -displayof $win]
	    set topWin [winfo toplevel $win]
	    focus $topWin
	    set data(topEscBinding) [bind $topWin <Escape>]
	    bind $topWin <Escape> \
		 [list tablelist::escape [strMap {"%" "%%"} $win] $col]
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::labelB1Motion
#
# This procedure is invoked to process mouse motion events in the header label
# w of a tablelist widget while button 1 is down.  If this event occured during
# a column resize operation then the procedure computes the difference between
# the pointer's new x-coordinate relative to that label and the one recorded by
# the last invocation of labelB1Down, and adjusts the width of the
# corresponding column accordingly.  Otherwise a horizontal scrolling is
# performed if needed, and the would-be target position of the clicked label is
# visualized if the columns are movable.
#------------------------------------------------------------------------------
proc tablelist::labelB1Motion {w X x y} {
    if {![parseLabelPath $w win col]} {
	return ""
    }

    upvar ::tablelist::ns${win}::data data
    if {!$data(labelClicked)} {
	return ""
    }

    if {[info exists data(colBeingResized)]} {	;# resize operation in progress
	set width [expr {$data(oldStretchedColWidth) + $X - $data(X)}]
	if {$width >= $data(minColWidth)} {
	    set col $data(colBeingResized)
	    set data(colResized) 1
	    set idx [expr {3*$col}]
	    set data(-columns) [lreplace $data(-columns) $idx $idx -$width]
	    set idx [expr {2*$col}]
	    set data(colList) [lreplace $data(colList) $idx $idx $width]
	    set data($col-lastStaticWidth) $width
	    set data($col-delta) 0
	    redisplayCol $win $col $data(topRow) $data(btmRow)

	    #
	    # Handle the case that the bottom row has become
	    # greater (due to the redisplayCol invocation)
	    #
	    set b $data(body)
	    set btmTextIdx [$b index @0,$data(btmY)]
	    set btmRow [expr {int($btmTextIdx) - 1}]
	    if {$btmRow > $data(lastRow)} {		;# text widget bug
		set btmRow $data(lastRow)
	    }
	    while {$btmRow > $data(btmRow)} {
		$b tag add visibleLines [expr {double($data(btmRow) + 2)}] \
					"$btmTextIdx lineend"
		incr data(btmRow)
		redisplayCol $win $col $data(btmRow) $btmRow
		set data(btmRow) $btmRow

		set btmTextIdx [$b index @0,$data(btmY)]
		set btmRow [expr {int($btmTextIdx) - 1}]
		if {$btmRow > $data(lastRow)} {		;# text widget bug
		    set btmRow $data(lastRow)
		}
	    }

	    #
	    # Handle the case that the top row has become
	    # less (due to the redisplayCol invocation)
	    #
	    set topTextIdx [$b index @0,0]
	    set topRow [expr {int($topTextIdx) - 1}]
	    while {$topRow < $data(topRow)} {
		$b tag add visibleLines "$topTextIdx linestart" \
					"[expr {double($data(topRow))}] lineend"
		incr data(topRow) -1
		redisplayCol $win $col $topRow $data(topRow)
		set data(topRow) $topRow

		set topTextIdx [$b index @0,0]
		set topRow [expr {int($topTextIdx) - 1}]
	    }

	    adjustColumns $win {} 0
	    adjustElidedText $win
	    redisplayVisibleItems $win
	    updateColors $win
	    updateVScrlbarWhenIdle $win
	}
    } else {
	#
	# Scroll the window horizontally if needed
	#
	set hdrX [winfo rootx $data(hdr)]
	if {$data(-titlecolumns) == 0 || ![winfo viewable $data(sep)]} {
	    set leftX $hdrX
	} else {
	    set leftX [expr {[winfo rootx $data(sep)] + 1}]
	}
	set rightX [expr {$hdrX + [winfo width $data(hdr)]}]
	set scroll 0
	if {($X >= $rightX && $data(X) < $rightX) ||
	    ($X < $leftX && $data(X) >= $leftX)} {
	    set scroll 1
	} elseif {($X < $rightX && $data(X) >= $rightX) ||
		  ($X >= $leftX && $data(X) < $leftX)} {
	    after cancel $data(afterId)
	    set data(afterId) ""
	}
	set data(X) $X
	if {$scroll} {
	    horizAutoScan $win
	}

	if {$x >= 1 && $x < [winfo width $w] - 1 &&
	    $y >= 0 && $y < [winfo height $w]} {
	    #
	    # The following code is needed because the event
	    # can also occur in a widget placed into the label
	    #
	    set data(inClickedLabel) 1
	    configLabel $w -cursor $data(-cursor)
	    $data(hdrTxtFrCanv)$col configure -cursor $data(-cursor)
	    if {$data(changeRelief)} {
		configLabel $w -relief sunken -pressed 1
	    }

	    place forget $data(colGap)
	} else {
	    #
	    # The following code is needed because the event
	    # can also occur in a widget placed into the label
	    #
	    set data(inClickedLabel) 0
	    configLabel $w -relief $data(relief) -pressed 0

	    if {$data(-movablecolumns)} {
		#
		# Get the target column index
		#
		set contW [winfo containing -displayof $w $X [winfo rooty $w]]
		if {[parseLabelPath $contW dummy targetCol]} {
		    set master $contW
		    if {$X < [winfo rootx $contW] + [winfo width $contW]/2} {
			set relx 0.0
		    } else {
			incr targetCol
			set relx 1.0
		    }
		} elseif {[string compare $contW $data(colGap)] == 0} {
		    set targetCol $data(targetCol)
		    set master $data(master)
		    set relx $data(relx)
		} elseif {$X >= $rightX || $X >= [winfo rootx $w]} {
		    for {set targetCol $data(lastCol)} {$targetCol >= 0} \
			{incr targetCol -1} {
			if {!$data($targetCol-hide)} {
			    break
			}
		    }
		    incr targetCol
		    set master $data(hdrTxtFr)
		    set relx 1.0
		} else {
		    for {set targetCol 0} {$targetCol < $data(colCount)} \
			{incr targetCol} {
			if {!$data($targetCol-hide)} {
			    break
			}
		    }
		    set master $data(hdrTxtFr)
		    set relx 0.0
		}

		#
		# Visualize the would-be target position
		# of the clicked label if appropriate
		#
		if {$targetCol == $col || $targetCol == $col + 1 ||
		    ($data(-protecttitlecolumns) &&
		     (($col >= $data(-titlecolumns) &&
		       $targetCol < $data(-titlecolumns)) ||
		      ($col < $data(-titlecolumns) &&
		       $targetCol > $data(-titlecolumns))))} {
		    catch {unset data(targetCol)}
		    configLabel $w -cursor $data(-cursor)
		    $data(hdrTxtFrCanv)$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(-movecolumncursor)
		    place $data(colGap) -in $master -anchor n \
					-bordermode outside \
					-relheight 1.0 -relx $relx
		}
	    }
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::labelB1Enter
#
# This procedure is invoked when the mouse pointer enters the header label w of
# a tablelist widget while mouse button 1 is down.  If the label was not
# previously clicked then nothing happens.  Otherwise, if this event occured
# during a column resize operation then the procedure updates the mouse cursor
# accordingly.  Otherwise it changes the label's relief to sunken.
#------------------------------------------------------------------------------
proc tablelist::labelB1Enter w {
    if {![parseLabelPath $w win col]} {
	return ""
    }

    upvar ::tablelist::ns${win}::data data
    if {!$data(labelClicked)} {
	return ""
    }

    configLabel $w -cursor $data(-cursor)

    if {[info exists data(colBeingResized)]} {	;# resize operation in progress
	configLabel $w -cursor $data(-resizecursor)
    } else {
	set data(inClickedLabel) 1
	if {$data(changeRelief)} {
	    configLabel $w -relief sunken -pressed 1
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::labelB1Leave
#
# This procedure is invoked when the mouse pointer leaves the header label w of
# a tablelist widget while mouse button 1 is down.  If the label was not
# previously clicked then nothing happens.  Otherwise, if no column resize
# operation is in progress then the procedure restores the label's relief, and,
# if the columns are movable, then it changes the mouse cursor, too.
#------------------------------------------------------------------------------
proc tablelist::labelB1Leave {w x y} {
    if {![parseLabelPath $w win col]} {
	return ""
    }

    upvar ::tablelist::ns${win}::data data
    if {!$data(labelClicked) ||
	[info exists data(colBeingResized)]} {	;# resize operation in progress
	return ""
    }

    #
    # The following code is needed because the event
    # can also occur in a widget placed into the label
    #
    if {$x >= 1 && $x < [winfo width $w] - 1 &&
	$y >= 0 && $y < [winfo height $w]} {
	return ""
    }

    set data(inClickedLabel) 0
    configLabel $w -relief $data(relief) -pressed 0
}

#------------------------------------------------------------------------------
# tablelist::labelB1Up
#
# This procedure is invoked when mouse button 1 is released, if it was
# previously clicked in a label of the tablelist widget win.  If this event
# occured during a column resize operation then the procedure redisplays the
# column and stretches the stretchable columns.  Otherwise, if the mouse button
# was released in the previously clicked label then the procedure restores the
# label's relief and invokes the command specified by the -labelcommand or
# -labelcommand2 configuration option, passing to it the widget name and the
# column number as arguments.  Otherwise the column of the previously clicked
# label is moved before the column containing the mouse cursor or to its right,
# if the columns are movable.
#------------------------------------------------------------------------------
proc tablelist::labelB1Up {w X} {
    if {![parseLabelPath $w win col]} {
	return ""
    }

    upvar ::tablelist::ns${win}::data data
    if {!$data(labelClicked)} {
	return ""
    }

    if {[info exists data(colBeingResized)]} {	;# resize operation in progress
	configLabel $w -cursor $data(-cursor)
	if {[winfo exists $data(focus)]} {
	    focus $data(focus)
	}
	bind [winfo toplevel $win] <Escape> $data(topEscBinding)
	set col $data(colBeingResized)
	if {$data(colResized)} {
	    if {$data(-width) <= 0} {
		$data(hdr) configure -width $data(hdrPixels)
		$data(lb) configure -width \
			  [expr {$data(hdrPixels) / $data(charWidth)}]
	    } elseif {[info exists data(stretchableCols)] &&
		      [lsearch -exact $data(stretchableCols) $col] >= 0} {
		set oldColWidth \
		    [expr {$data(oldStretchedColWidth) - $data(oldColDelta)}]
		set stretchedColWidth \
		    [expr {$data(oldStretchedColWidth) + $X - $data(X)}]
		if {$oldColWidth < $data(stretchablePixels) &&
		    $stretchedColWidth >= $data(minColWidth) &&
		    $stretchedColWidth < $oldColWidth + $data(delta)} {
		    #
		    # Compute the new column width,
		    # using the following equations:
		    #
		    # $colWidth = $stretchedColWidth - $colDelta
		    # $colDelta / $colWidth =
		    #    ($data(delta) - $colWidth + $oldColWidth) /
		    #    ($data(stretchablePixels) + $colWidth - $oldColWidth)
		    #
		    set colWidth [expr {
			$stretchedColWidth *
			($data(stretchablePixels) - $oldColWidth) /
			($data(stretchablePixels) + $data(delta) -
			 $stretchedColWidth)
		    }]
		    if {$colWidth < 1} {
			set colWidth 1
		    }
		    set idx [expr {3*$col}]
		    set data(-columns) \
			[lreplace $data(-columns) $idx $idx -$colWidth]
		    set idx [expr {2*$col}]
		    set data(colList) \
			[lreplace $data(colList) $idx $idx $colWidth]
		    set data($col-delta) [expr {$stretchedColWidth - $colWidth}]
		}
	    }
	}
	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
	    adjustColumns $win {} 0
	    stretchColumns $win $col
	    updateColors $win

	    genVirtualEvent $win <<TablelistColumnResized>> $col
	}
    } else {
	if {[info exists data(X)]} {
	    unset data(X)
	    after cancel $data(afterId)
	    set data(afterId) ""
	}
    	if {$data(-movablecolumns)} {
	    if {[winfo exists $data(focus)]} {
		focus $data(focus)
	    }
	    bind [winfo toplevel $win] <Escape> $data(topEscBinding)
	    place forget $data(colGap)
	}

	if {$data(inClickedLabel)} {
	    configLabel $w -relief $data(relief) -pressed 0
	    if {$data(shiftPressed)} {
		if {[info exists data($col-labelcommand2)]} {
		    uplevel #0 $data($col-labelcommand2) [list $win $col]
		} elseif {[string length $data(-labelcommand2)] != 0} {
		    uplevel #0 $data(-labelcommand2) [list $win $col]
		}
	    } else {
		if {[info exists data($col-labelcommand)]} {
		    uplevel #0 $data($col-labelcommand) [list $win $col]
		} elseif {[string length $data(-labelcommand)] != 0} {
		    uplevel #0 $data(-labelcommand) [list $win $col]
		}
	    }
	} elseif {$data(-movablecolumns)} {
	    $data(hdrTxtFrCanv)$col configure -cursor $data(-cursor)
	    if {[info exists data(targetCol)]} {
		set sourceColName [doColCget $col $win -name]
		set targetColName [doColCget $data(targetCol) $win -name]

		moveCol $win $col $data(targetCol)

		set userData \
		    [list $col $data(targetCol) $sourceColName $targetColName]
		genVirtualEvent $win <<TablelistColumnMoved>> $userData

		unset data(targetCol)
	    }
	}
    }

    set data(labelClicked) 0
}

#------------------------------------------------------------------------------
# tablelist::labelB3Down
#
# This procedure is invoked when mouse button 3 is pressed in the header label
# w of a tablelist widget.  If the Shift key was down when this event occured
# then the procedure restores the last static width of the given column;
# otherwise it configures the width of the given column to be just large enough
# to hold all the elements (including the label).
#------------------------------------------------------------------------------
proc tablelist::labelB3Down {w shiftPressed} {
    if {![parseLabelPath $w win col]} {
	return ""
    }

    upvar ::tablelist::ns${win}::data data
    if {!$data(isDisabled) &&
	$data(-resizablecolumns) && $data($col-resizable)} {
	if {$shiftPressed} {
	    doColConfig $col $win -width -$data($col-lastStaticWidth)
	} else {
	    doColConfig $col $win -width 0
	}

	genVirtualEvent $win <<TablelistColumnResized>> $col
    }
}

#------------------------------------------------------------------------------
# tablelist::labelDblB1
#
# This procedure is invoked when the header label w of a tablelist widget is
# double-clicked.  If the pointer is on the right border of the label then the
# procedure performs the same action as labelB3Down.
#------------------------------------------------------------------------------
proc tablelist::labelDblB1 {w x shiftPressed} {
    if {![parseLabelPath $w win col]} {
	return ""
    }

    upvar ::tablelist::ns${win}::data data
    if {!$data(isDisabled) && [inResizeArea $w $x col] &&
	$data(-resizablecolumns) && $data($col-resizable)} {
	if {$shiftPressed} {
	    doColConfig $col $win -width -$data($col-lastStaticWidth)
	} else {
	    doColConfig $col $win -width 0
	}

	genVirtualEvent $win <<TablelistColumnResized>> $col
    }
}

#------------------------------------------------------------------------------
# tablelist::escape
#
# This procedure is invoked to process <Escape> events in the top-level window
# containing the tablelist widget win during a column resize or move operation.
# The procedure cancels the action in progress and, in case of column resizing,
# it restores the initial width of the respective column.
#------------------------------------------------------------------------------
proc tablelist::escape {win col} {
    upvar ::tablelist::ns${win}::data data
    set w $data(hdrTxtFrLbl)$col
    if {[info exists data(colBeingResized)]} {	;# resize operation in progress
	configLabel $w -cursor $data(-cursor)
	update idletasks
	if {![array exists ::tablelist::ns${win}::data]} {
	    return ""
	}
	if {[winfo exists $data(focus)]} {
	    focus $data(focus)
	}
	bind [winfo toplevel $win] <Escape> $data(topEscBinding)
	set data(labelClicked) 0
	set col $data(colBeingResized)
	set idx [expr {3*$col}]
	setupColumns $win [lreplace $data(-columns) $idx $idx \
				    $data(configColWidth)] 0
	redisplayCol $win $col $data(topRow) $data(btmRow)
	unset data(colBeingResized)
	$data(body) tag remove visibleLines 1.0 end
	$data(body) tag configure visibleLines -tabs {}
	adjustColumns $win {} 1
	updateColors $win
    } elseif {!$data(inClickedLabel)} {
	configLabel $w -cursor $data(-cursor)
	$data(hdrTxtFrCanv)$col configure -cursor $data(-cursor)
	if {[winfo exists $data(focus)]} {
	    focus $data(focus)
	}
	bind [winfo toplevel $win] <Escape> $data(topEscBinding)
	place forget $data(colGap)
	catch {unset data(targetCol)}
	if {[info exists data(X)]} {
	    unset data(X)
	    after cancel $data(afterId)
	    set data(afterId) ""
	}
	set data(labelClicked) 0
    }
}

#------------------------------------------------------------------------------
# tablelist::horizAutoScan
#
# This procedure is invoked when the mouse leaves the scrollable part of a
# tablelist widget's header frame.  It scrolls the header and reschedules
# itself as an after command so that the header continues to scroll until the
# mouse moves back into the window or the mouse button is released.
#------------------------------------------------------------------------------
proc tablelist::horizAutoScan win {
    if {![array exists ::tablelist::ns${win}::data]} {
	return ""
    }

    upvar ::tablelist::ns${win}::data data
    if {![info exists data(X)]} {
	return ""
    }

    set X $data(X)
    set hdrX [winfo rootx $data(hdr)]
    if {$data(-titlecolumns) == 0 || ![winfo viewable $data(sep)]} {
	set leftX $hdrX
    } else {
	set leftX [expr {[winfo rootx $data(sep)] + 1}]
    }
    set rightX [expr {$hdrX + [winfo width $data(hdr)]}]
    if {$data(-titlecolumns) == 0} {
	set units 2
	set ms 50
    } else {
	set units 1
	set ms 250
    }

    if {$X >= $rightX} {
	::$win xview scroll $units units
    } elseif {$X < $leftX} {
	::$win xview scroll -$units units
    } else {
	return ""
    }

    set data(afterId) [after $ms [list tablelist::horizAutoScan $win]]
}

#------------------------------------------------------------------------------
# tablelist::inResizeArea
#
# Checks whether the given x coordinate relative to the header label w of a
# tablelist widget is in the resize area of that label or of the one to its
# left.
#------------------------------------------------------------------------------
proc tablelist::inResizeArea {w x colName} {
    if {![parseLabelPath $w dummy _col]} {
	return 0
    }


    upvar $colName col
    if {$x >= [winfo width $w] - 5} {
	set col $_col
	return 1
    } elseif {$x < 5} {
	set X [expr {[winfo rootx $w] - 3}]
	set contW [winfo containing -displayof $w $X [winfo rooty $w]]
	return [parseLabelPath $contW dummy col]
    } else {
	return 0
    }
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<










































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/scripts/tablelistConfig.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
#==============================================================================
# Contains private configuration procedures for tablelist widgets.
#
# Copyright (c) 2000-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

#------------------------------------------------------------------------------
# tablelist::extendConfigSpecs
#
# Extends the elements of the array configSpecs.
#------------------------------------------------------------------------------
proc tablelist::extendConfigSpecs {} {
    variable usingTile
    variable helpLabel
    variable configSpecs
    variable winSys

    #
    # Extend some elements of the array configSpecs
    #
    lappend configSpecs(-acceptchildcommand)	{}
    lappend configSpecs(-acceptdropcommand)	{}
    lappend configSpecs(-activestyle)		frame
    lappend configSpecs(-autoscan)		1
    lappend configSpecs(-collapsecommand)	{}
    lappend configSpecs(-columns)		{}
    lappend configSpecs(-columntitles)		{}
    lappend configSpecs(-customdragsource)	0
    lappend configSpecs(-editendcommand)	{}
    lappend configSpecs(-editselectedonly)	0
    lappend configSpecs(-editstartcommand)	{}
    lappend configSpecs(-expandcommand)		{}
    lappend configSpecs(-forceeditendcommand)	0
    lappend configSpecs(-fullseparators)	0
    lappend configSpecs(-incrarrowtype)		up
    lappend configSpecs(-instanttoggle)		0
    lappend configSpecs(-labelcommand)		{}
    lappend configSpecs(-labelcommand2)		{}
    lappend configSpecs(-labelrelief)		raised
    lappend configSpecs(-listvariable)		{}
    lappend configSpecs(-movablecolumns)	0
    lappend configSpecs(-movablerows)		0
    lappend configSpecs(-populatecommand)	{}
    lappend configSpecs(-protecttitlecolumns)	0
    lappend configSpecs(-resizablecolumns)	1
    lappend configSpecs(-selecttype)		row
    lappend configSpecs(-setfocus)		1
    lappend configSpecs(-showarrow)		1
    lappend configSpecs(-showeditcursor)	1
    lappend configSpecs(-showhorizseparator)	1
    lappend configSpecs(-showlabels)		1
    lappend configSpecs(-showseparators)	0
    lappend configSpecs(-snipstring)		...
    lappend configSpecs(-sortcommand)		{}
    lappend configSpecs(-spacing)		0
    lappend configSpecs(-stretch)		{}
    lappend configSpecs(-stripebackground)	{}
    lappend configSpecs(-stripeforeground)	{}
    lappend configSpecs(-stripeheight)		1
    lappend configSpecs(-targetcolor)		black
    lappend configSpecs(-tight)			0
    lappend configSpecs(-titlecolumns)		0
    lappend configSpecs(-tooltipaddcommand)	{}
    lappend configSpecs(-tooltipdelcommand)	{}
    lappend configSpecs(-treecolumn)		0

    #
    # Append the default values of the configuration options
    # of a temporary, invisible listbox widget to the values
    # of the corresponding elements of the array configSpecs
    #
    set helpListbox .__helpListbox
    for {set n 2} {[winfo exists $helpListbox]} {incr n} {
	set helpListbox .__helpListbox$n
    }
    listbox $helpListbox
    foreach configSet [$helpListbox configure] {
	if {[llength $configSet] != 2} {
	    set opt [lindex $configSet 0]
	    if {[info exists configSpecs($opt)]} {
		lappend configSpecs($opt) [lindex $configSet 3]
	    }
	}
    }
    destroy $helpListbox

    set helpLabel .__helpLabel
    for {set n 0} {[winfo exists $helpLabel]} {incr n} {
	set helpLabel .__helpLabel$n
    }

    if {$usingTile} {
	foreach opt {-highlightbackground -highlightcolor -highlightthickness
		     -labelactivebackground -labelactiveforeground
		     -labelbackground -labelbg -labeldisabledforeground
		     -labelheight} {
	    unset configSpecs($opt)
	}

	#
	# Append theme-specific values to some elements of the
	# array configSpecs and initialize some tree resources
	#
	if {[string compare [getCurrentTheme] "tileqt"] == 0} {
	    tileqt_kdeStyleChangeNotification 
	}
	setThemeDefaults
	variable themeDefaults
	set treeStyle $themeDefaults(-treestyle)
	${treeStyle}TreeImgs 
	variable maxIndentDepths
	set maxIndentDepths($treeStyle) 0

	ttk::label $helpLabel -takefocus 0

	#
	# Define the header label layout
	#
	style theme settings "default" {
	    style layout TablelistHeader.TLabel {
		Treeheading.cell
		Treeheading.border -children {
		    Label.padding -children {
			Label.label
		    }
		}
	    }
	}
	if {[string length [package provide ttk::theme::aqua]] != 0 ||
	    [string length [package provide tile::theme::aqua]] != 0} {
	    style theme settings "aqua" {
		if {[info exists tile::patchlevel] &&
		    [string compare $tile::patchlevel "0.6.4"] < 0} {
		    style layout TablelistHeader.TLabel {
			Treeheading.cell
			Label.padding -children {
			    Label.label -side top
			    Separator.hseparator -side bottom
			}
		    }
		} else {
		    style layout TablelistHeader.TLabel {
			Treeheading.cell
			Label.padding -children {
			    Label.label -side top
			}
		    }
		}
		style map TablelistHeader.TLabel -foreground [list \
		    {disabled background} #a3a3a3 disabled #a3a3a3 \
		    background black]
	    }
	}
    } else {
	if {$::tk_version < 8.3} {
	    unset configSpecs(-acceptchildcommand)
	    unset configSpecs(-collapsecommand)
	    unset configSpecs(-expandcommand)
	    unset configSpecs(-populatecommand)
	    unset configSpecs(-titlecolumns)
	    unset configSpecs(-treecolumn)
	    unset configSpecs(-treestyle)
	}

	#
	# Append the default values of some configuration options
	# of an invisible label widget to the values of the
	# corresponding -label* elements of the array configSpecs
	#
	tk::label $helpLabel -takefocus 0
	foreach optTail {font height} {
	    set configSet [$helpLabel configure -$optTail]
	    lappend configSpecs(-label$optTail) [lindex $configSet 3]
	}
	if {[catch {$helpLabel configure -activebackground} configSet1] == 0 &&
	    [catch {$helpLabel configure -activeforeground} configSet2] == 0} {
	    lappend configSpecs(-labelactivebackground) [lindex $configSet1 3]
	    lappend configSpecs(-labelactiveforeground) [lindex $configSet2 3]
	} else {
	    unset configSpecs(-labelactivebackground)
	    unset configSpecs(-labelactiveforeground)
	}
	if {[catch {$helpLabel configure -disabledforeground} configSet] == 0} {
	    lappend configSpecs(-labeldisabledforeground) [lindex $configSet 3]
	} else {
	    unset configSpecs(-labeldisabledforeground)
	}
	if {[string compare $winSys "win32"] == 0 &&
	    $::tcl_platform(osVersion) < 5.1} {
	    lappend configSpecs(-labelpady) 0
	} else {
	    set configSet [$helpLabel configure -pady]
	    lappend configSpecs(-labelpady) [lindex $configSet 3]
	}

	#
	# Steal the default values of some configuration
	# options from a temporary, invisible button widget
	#
	set helpButton .__helpButton
	for {set n 0} {[winfo exists $helpButton]} {incr n} {
	    set helpButton .__helpButton$n
	}
	button $helpButton
	foreach opt {-disabledforeground -state} {
	    if {[llength $configSpecs($opt)] == 3} {
		set configSet [$helpButton configure $opt]
		lappend configSpecs($opt) [lindex $configSet 3]
	    }
	}
	foreach optTail {background foreground} {
	    set configSet [$helpButton configure -$optTail]
	    lappend configSpecs(-label$optTail) [lindex $configSet 3]
	}
	if {[string compare $winSys "classic"] == 0 ||
	    [string compare $winSys "aqua"] == 0} {
	    lappend configSpecs(-labelborderwidth) 1
	} else {
	    set configSet [$helpButton configure -borderwidth]
	    lappend configSpecs(-labelborderwidth) [lindex $configSet 3]
	}
	destroy $helpButton

	#
	# Set the default values of the -arrowcolor,
	# -arrowdisabledcolor, -arrowstyle, and -treestyle options
	#
	switch $winSys {
	    x11 {
		set arrowColor		{}
		set arrowDisabledColor	{}
		set arrowStyle		sunken10x9
		set treeStyle		gtk
	    }

	    win32 {
		if {$::tcl_platform(osVersion) < 5.1} {		;# Win native
		    set arrowColor		{}
		    set arrowDisabledColor	{}
		    set arrowStyle		sunken8x7
		    set treeStyle		winnative

		} elseif {$::tcl_platform(osVersion) == 5.1} {	;# Win XP
		    switch [winfo rgb . SystemHighlight] {
			"12593 27242 50629" {			;# Win XP Blue
			    set arrowColor	#aca899
			    set arrowStyle	flat9x5
			    set treeStyle	winxpBlue
			}
			"37779 41120 28784" {			;# Win XP Olive
			    set arrowColor	#aca899
			    set arrowStyle	flat9x5
			    set treeStyle	winxpOlive
			}
			"45746 46260 49087" {			;# Win XP Silver
			    set arrowColor	#aca899
			    set arrowStyle	flat9x5
			    set treeStyle	winxpSilver
			}
			default {				;# Win Classic
			    set arrowColor	SystemButtonShadow
			    set arrowStyle	flat7x4
			    set treeStyle	winnative
			}
		    }
		    set arrowDisabledColor	SystemDisabledText

		} elseif {$::tcl_platform(osVersion) == 6.0} {	;# Win Vista
		    switch [winfo rgb . SystemHighlight] {
			"13107 39321 65535" {			;# Vista Aero
			    set arrowColor	#569bc0
			    set arrowStyle	flat7x4
			    set treeStyle	vistaAero
			}
			default {				;# Win Classic
			    set arrowColor	SystemButtonShadow
			    set arrowStyle	flat7x4
			    set treeStyle	vistaClassic
			}
		    }
		    set arrowDisabledColor	SystemDisabledText

		} else {					;# Win 7
		    switch [winfo rgb . SystemHighlight] {
			"13107 39321 65535" {			;# Win 7 Aero
			    set arrowColor	#569bc0
			    set arrowStyle	flat7x4
			    set treeStyle	win7Aero
			}
			default {				;# Win Classic
			    set arrowColor	SystemButtonShadow
			    set arrowStyle	flat7x4
			    set treeStyle	win7Classic
			}
		    }
		    set arrowDisabledColor	SystemDisabledText
		}
	    }

	    classic -
	    aqua {
		scan $::tcl_platform(osVersion) "%d" majorOSVersion
		if {$majorOSVersion >= 14} {		;# OS X 10.10 or higher
		    set arrowColor	#404040
		    set arrowStyle	flatAngle7x4
		} else {
		    set arrowColor	#717171
		    variable pngSupported
		    if {$pngSupported} {
			set arrowStyle	photo7x7
		    } else {
			set arrowStyle	flat7x7
		    }
		}
		set arrowDisabledColor	#a3a3a3
		set treeStyle		aqua
	    }
	}
	lappend configSpecs(-arrowcolor)		$arrowColor
	lappend configSpecs(-arrowdisabledcolor)	$arrowDisabledColor
	lappend configSpecs(-arrowstyle)		$arrowStyle
	if {$::tk_version >= 8.3} {
	    lappend configSpecs(-treestyle)		$treeStyle
	    ${treeStyle}TreeImgs 
	    variable maxIndentDepths
	    set maxIndentDepths($treeStyle) 0
	}
    }

    #
    # Set the default values of the -movecolumncursor,
    # -movecursor, and -resizecursor options
    #
    switch $winSys {
	x11 -
	win32 {
	    set movecolumnCursor	icon
	    set moveCursor		hand2
	    set resizeCursor		sb_h_double_arrow
	}

	classic -
	aqua {
	    set movecolumnCursor	closedhand
	    set moveCursor		pointinghand
	    if {[catch {$helpLabel configure -cursor resizeleftright}] == 0} {
		set resizeCursor	resizeleftright
	    } else {
		set resizeCursor	sb_h_double_arrow
	    }
	}
    }
    lappend configSpecs(-movecolumncursor)	$movecolumnCursor
    lappend configSpecs(-movecursor)		$moveCursor
    lappend configSpecs(-resizecursor)		$resizeCursor
}

#------------------------------------------------------------------------------
# tablelist::doConfig
#
# Applies the value val of the configuration option opt to the tablelist widget
# win.
#------------------------------------------------------------------------------
proc tablelist::doConfig {win opt val} {
    variable usingTile
    variable helpLabel
    variable configSpecs
    upvar ::tablelist::ns${win}::data data

    #
    # Apply the value to the widget(s) corresponding to the given option
    #
    switch [lindex $configSpecs($opt) 2] {
	c {
	    #
	    # Apply the value to all children and save the
	    # properly formatted value of val in data($opt)
	    #
	    foreach w [winfo children $win] {
		if {[regexp {^(body|hdr|h?sep[0-9]*)$} [winfo name $w]]} {
		    $w configure $opt $val
		}
	    }
	    $data(hdrTxt) configure $opt $val
	    $data(hdrFrLbl) configure $opt $val
	    $data(cornerLbl) configure $opt $val
	    foreach w [winfo children $data(hdrTxtFr)] {
		$w configure $opt $val
	    }
	    set data($opt) [$data(hdrFrLbl) cget $opt]
	}

	b {
	    #
	    # Apply the value to the body text widget and save
	    # the properly formatted value of val in data($opt)
	    #
	    set w $data(body)
	    $w configure $opt $val
	    set data($opt) [$w cget $opt]

	    switch -- $opt {
		-background {
		    #
		    # Apply the value to the frame (because of the shadow
		    # colors of its 3-D border), to the separators,
		    # to the header frame, and to the "disabled" tag
		    #
		    if {$usingTile} {
			styleConfig Frame$win.TFrame $opt $val
			styleConfig Seps$win.TSeparator $opt $val
		    } else {
			$win configure $opt $val
			foreach c [winfo children $win] {
			    if {[regexp {^(sep[0-9]+|hsep)$} [winfo name $c]]} {
				$c configure $opt $val
			    }
			}
		    }
		    $data(hdr) configure $opt $val
		    $w tag configure disabled $opt $val
		    updateColorsWhenIdle $win
		}
		-font {
		    #
		    # Apply the value to the listbox child, rebuild the lists
		    # of the column fonts and tag names, configure the edit
		    # window if present, set up and adjust the columns, and
		    # make sure the items will be redisplayed at idle time
		    #
		    $data(lb) configure $opt $val
		    set data(charWidth) [font measure $val -displayof $win 0]
		    makeColFontAndTagLists $win
		    if {$data(editRow) >= 0} {
			setEditWinFont $win
		    }
		    for {set col 0} {$col < $data(colCount)} {incr col} {
			if {$data($col-maxwidth) > 0} {
			    set data($col-maxPixels) \
				[charsToPixels $win $val $data($col-maxwidth)]
			}
		    }
		    setupColumns $win $data(-columns) 0
		    adjustColumns $win allCols 1
		    redisplayWhenIdle $win
		    updateViewWhenIdle $win
		}
		-foreground {
		    #
		    # Set the background color of the main separator
		    # (if any) to the specified value, and apply
		    # this value to the "disabled" tag if needed
		    #
		    if {$usingTile} {
			styleConfig Sep$win.TSeparator -background $val
		    } else {
			if {[winfo exists $data(sep)]} {
			    $data(sep) configure -background $val
			}
		    }
		    if {[string length $data(-disabledforeground)] == 0} {
			$w tag configure disabled $opt $val
		    }
		    updateColorsWhenIdle $win
		}
	    }
	}

	l {
	    #
	    # Apply the value to all not individually configured labels
	    # and save the properly formatted value of val in data($opt)
	    #
	    set optTail [string range $opt 6 end]	;# remove the -label
	    configLabel $data(hdrFrLbl) -$optTail $val
	    configLabel $data(cornerLbl) -$optTail $val
	    for {set col 0} {$col < $data(colCount)} {incr col} {
		set w $data(hdrTxtFrLbl)$col
		if {![info exists data($col$opt)]} {
		    configLabel $w -$optTail $val
		}
	    }
	    if {$usingTile && [string compare $opt "-labelpady"] == 0} {
		set data($opt) $val
	    } else {
		set data($opt) [$data(hdrFrLbl) cget -$optTail]
	    }

	    switch -- $opt {
		-labelbackground -
		-labelforeground {
		    #
		    # Apply the value to $data(hdrTxt) and conditionally
		    # 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
			}
		    }
		}
		-labelborderwidth {
		    #
		    # Adjust the columns (including
		    # the height of the header frame)
		    #
		    adjustColumns $win allLabels 1

		    set borderWidth [winfo pixels $win $data($opt)]
		    if {$borderWidth < 0} {
			set borderWidth 0
		    }
		    place configure $data(cornerLbl) -x -$borderWidth \
			-width [expr {2*$borderWidth}]
		}
		-labeldisabledforeground {
		    #
		    # Conditionally apply the value to the
		    # canvases displaying up- or down-arrows
		    #
		    foreach col $data(arrowColList) {
			if {![info exists data($col$opt)]} {
			    configCanvas $win $col
			}
		    }
		}
		-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 {
		    #
		    # Adjust the height of the header frame
		    #
		    adjustHeaderHeight $win
		}
	    }
	}

	f {
	    #
	    # Apply the value to the frame and save the
	    # properly formatted value of val in data($opt)
	    #
	    $win configure $opt $val
	    set data($opt) [$win cget $opt]
	}

	w {
	    switch -- $opt {
		-acceptchildcommand -
		-acceptdropcommand -
		-collapsecommand -
		-editendcommand -
		-editstartcommand -
		-expandcommand -
		-labelcommand -
		-labelcommand2 -
		-populatecommand -
		-selectmode -
		-sortcommand -
		-tooltipaddcommand -
		-tooltipdelcommand -
		-yscrollcommand {
		    set data($opt) $val
		}
		-activestyle {
		    #
		    # Configure the "active" tag and save the
		    # properly formatted value of val in data($opt)
		    #
		    variable activeStyles
		    set val [mwutil::fullOpt "active style" $val $activeStyles]
		    set w $data(body)
		    switch $val {
			frame {
			    $w tag configure active \
				   -borderwidth 1 -relief solid -underline ""
			}
			none {
			    $w tag configure active \
				   -borderwidth "" -relief "" -underline ""
			}
			underline {
			    $w tag configure active \
				   -borderwidth "" -relief "" -underline 1
			}
		    }
		    set data($opt) $val
		}
		-arrowcolor -
		-arrowdisabledcolor {
		    #
		    # Save the properly formatted value of val in data($opt)
		    # and set the color of the normal or disabled arrows
		    #
		    if {[string length $val] == 0} {
			set data($opt) ""
		    } else {
			$helpLabel configure -foreground $val
			set data($opt) [$helpLabel cget -foreground]
		    }
		    if {([string compare $opt "-arrowcolor"] == 0 &&
			 !$data(isDisabled)) ||
			([string compare $opt "-arrowdisabledcolor"] == 0 &&
			 $data(isDisabled))} {
			foreach w [info commands $data(hdrTxtFrCanv)*] {
			    fillArrows $w $val $data(-arrowstyle)
			}
		    }
		}
		-arrowstyle {
		    #
		    # Save the properly formatted value of val in data($opt)
		    # and draw the corresponding arrows in the canvas widgets
		    #
		    variable arrowStyles
		    set data($opt) \
			[mwutil::fullOpt "arrow style" $val $arrowStyles]
		    regexp {^(flat|flatAngle|sunken|photo)([0-9]+)x([0-9]+)$} \
			   $data($opt) dummy relief width height
		    set data(arrowWidth) $width
		    set data(arrowHeight) $height
		    foreach w [info commands $data(hdrTxtFrCanv)*] {
			createArrows $w $width $height $relief
			if {$data(isDisabled)} {
			    fillArrows $w $data(-arrowdisabledcolor) $data($opt)
			} else {
			    fillArrows $w $data(-arrowcolor) $data($opt)
			}
		    }
		    if {[llength $data(arrowColList)] > 0} {
			foreach col $data(arrowColList) {
			    raiseArrow $win $col
			    lappend whichWidths l$col
			}
			adjustColumns $win $whichWidths 1
		    }
		}
		-autoscan -
		-customdragsource -
		-forceeditendcommand -
		-instanttoggle -
		-movablecolumns -
		-movablerows -
		-protecttitlecolumns -
		-resizablecolumns -
		-setfocus {
		    #
		    # Save the boolean value specified by val in data($opt)
		    #
		    set data($opt) [expr {$val ? 1 : 0}]
		}
		-columns {
		    #
		    # Set up and adjust the columns, rebuild
		    # the lists of the column fonts and tag
		    # names, and redisplay the items
		    #
		    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
		    updateViewWhenIdle $win
		}
		-columntitles {
		    set titleCount [llength $val]
		    set colCount $data(colCount)
		    if {$titleCount <= $colCount} {
			#
			# Update the first titleCount column
			# titles and adjust the columns
			#
			set whichWidths {}
			for {set col 0} {$col < $titleCount} {incr col} {
			    set idx [expr {3*$col + 1}]
			    set data(-columns) [lreplace $data(-columns) \
						$idx $idx [lindex $val $col]]
			    lappend whichWidths l$col
			}
			adjustColumns $win $whichWidths 1
		    } else {
			#
			# Update the titles of the current columns,
			# extend the column list, and do nearly the
			# same as in the case of the -columns option
			#
			set columns {}
			set col 0
			foreach {width title alignment} $data(-columns) {
			    lappend columns $width [lindex $val $col] $alignment
			    incr col
			}
			for {} {$col < $titleCount} {incr col} {
			    lappend columns 0 [lindex $val $col] left
			}
			set selCells [curCellSelection $win]
			setupColumns $win $columns 1
			adjustColumns $win allCols 1
			makeColFontAndTagLists $win
			redisplay $win 0 $selCells
			updateViewWhenIdle $win

			#
			# If this option is being set at widget creation time
			# then append "-columns" to the list of command line
			# options processed by the caller proc, to make sure
			# that the columns-related information produced by the
			# setupColumns call above won't be overridden by the
			# default -columns {} option that would otherwise
			# be processed as a non-explicitly specified option
			#
			set callerProc [lindex [info level -1] 0]
			if {[string compare $callerProc \
			     "mwutil::configureWidget"] == 0} {
			    uplevel 1 lappend cmdLineOpts "-columns"
			}
		    }
		}
		-disabledforeground {
		    #
		    # Configure the "disabled" tag in the body text widget 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 \
				-foreground $data(-foreground)
			set data($opt) ""
		    } else {
			$w tag configure disabled -fgstipple "" \
				-foreground $val
			set data($opt) [$w tag cget disabled -foreground]
		    }
		    if {$data(isDisabled)} {
			updateColorsWhenIdle $win
		    }
		}
		-editselectedonly {
		    #
		    # Save the boolean value specified by val in data($opt)
		    # and invoke the motion handler if necessary
		    #
		    set data($opt) [expr {$val ? 1 : 0}]
		    if {$data(-showeditcursor)} {
			invokeMotionHandler $win
		    }
		}
		-exportselection {
		    #
		    # Save the boolean value specified by val in
		    # data($opt).  In addition, if the selection is
		    # exported and there are any selected rows in the
		    # widget then make win the new owner of the PRIMARY
		    # selection and register a callback to be invoked
		    # when it loses ownership of the PRIMARY selection
		    #
		    set data($opt) [expr {$val ? 1 : 0}]
		    if {$val &&
			[llength [$data(body) tag nextrange select 1.0]] != 0} {
			selection own -command \
				[list ::tablelist::lostSelection $win] $win
		    }
		}
		-fullseparators -
		-showhorizseparator {
		    #
		    # Save the boolean value specified by val
		    # in data($opt) and adjust the separators
		    #
		    set data($opt) [expr {$val ? 1 : 0}]
		    adjustSepsWhenIdle $win
		}
		-height {
		    #
		    # Adjust the heights of the body text widget
		    # and of the listbox child, and save the
		    # properly formatted value of val in data($opt)
		    #
		    set val [format "%d" $val]	;# integer check with error msg
		    if {$val <= 0} {
			set viewableRowCount [expr \
			    {$data(itemCount) - $data(nonViewableRowCount)}]
			$data(body) configure $opt $viewableRowCount
			$data(lb) configure $opt $viewableRowCount
		    } else {
			$data(body) configure $opt $val
			$data(lb) configure $opt $val
		    }
		    set data($opt) $val
		}
		-incrarrowtype {
		    #
		    # Save the properly formatted value of val in
		    # data($opt) and raise the corresponding arrows
		    # if the currently mapped canvas widgets
		    #
		    variable arrowTypes
		    set data($opt) \
			[mwutil::fullOpt "arrow type" $val $arrowTypes]
		    foreach col $data(arrowColList) {
			raiseArrow $win $col
		    }
		}
		-listvariable {
		    #
		    # Associate val as list variable with the
		    # given widget and save it in data($opt)
		    #
		    makeListVar $win $val
		    set data($opt) $val
		    if {[string length $val] == 0} {
			set data(hasListVar) 0
		    } else {
			set data(hasListVar) 1
		    }
		}
		-movecolumncursor -
		-movecursor -
		-resizecursor {
		    #
		    # Save the properly formatted value of val in data($opt)
		    #
		    $helpLabel configure -cursor $val
		    set data($opt) [$helpLabel cget -cursor]
		}
		-selectbackground -
		-selectforeground {
		    #
		    # Configure the "select" tag in the body text widget
		    # and save the properly formatted value of val in
		    # data($opt).  Don't use the built-in "sel" tag
		    # because on Windows the selection in a text widget only
		    # becomes visible when the window gets the input focus.
		    #
		    set w $data(body)
		    set optTail [string range $opt 7 end] ;# remove the -select
		    $w tag configure select -$optTail $val
		    set data($opt) [$w tag cget select -$optTail]
		    if {!$data(isDisabled)} {
			updateColorsWhenIdle $win
		    }
		}
		-selecttype {
		    #
		    # Save the properly formatted value of val in data($opt)
		    #
		    variable selectTypes
		    set val [mwutil::fullOpt "selection type" $val $selectTypes]
		    set data($opt) $val
		}
		-selectborderwidth {
		    #
		    # Configure the "select" tag in the body text widget
		    # and save the properly formatted value of val in
		    # data($opt).  Don't use the built-in "sel" tag
		    # because on Windows the selection in a text widget only
		    # becomes visible when the window gets the input focus.
		    # In addition, adjust the line spacing accordingly and
		    # apply the value to the listbox child, too.
		    #
		    set w $data(body)
		    set optTail [string range $opt 7 end] ;# remove the -select
		    $w tag configure select -$optTail $val
		    set data($opt) [$w tag cget select -$optTail]
		    set pixVal [winfo pixels $w $val]
		    if {$pixVal < 0} {
			set pixVal 0
		    }
		    set spacing [winfo pixels $w $data(-spacing)]
		    if {$spacing < 0} {
			set spacing 0
		    }
		    $w configure -spacing1 [expr {$spacing + $pixVal}] \
			-spacing3 [expr {$spacing + $pixVal + !$data(-tight)}]
		    $data(lb) configure $opt $val
		    redisplayWhenIdle $win
		    updateViewWhenIdle $win
		}
		-setgrid {
		    #
		    # Apply the value to the listbox child and save
		    # the properly formatted value of val in data($opt)
		    #
		    $data(lb) configure $opt $val
		    set data($opt) [$data(lb) cget $opt]
		}
		-showarrow {
		    #
		    # Save the boolean value specified by val in
		    # data($opt) and manage or unmanage the
		    # canvases displaying up- or down-arrows
		    #
		    set data($opt) [expr {$val ? 1 : 0}]
		    makeSortAndArrowColLists $win
		    adjustColumns $win allLabels 1
		}
		-showeditcursor {
		    #
		    # Save the boolean value specified by val in
		    # data($opt) and invoke the motion handler
		    #
		    set data($opt) [expr {$val ? 1 : 0}]
		    invokeMotionHandler $win
		}
		-showlabels {
		    #
		    # Save the boolean value specified by val in data($opt)
		    # and adjust the height of the header frame
		    #
		    set data($opt) [expr {$val ? 1 : 0}]
		    adjustHeaderHeight $win
		}
		-showseparators {
		    #
		    # Save the boolean value specified by val in data($opt),
		    # and create or destroy the separators if needed
		    #
		    set oldVal $data($opt)
		    set data($opt) [expr {$val ? 1 : 0}]
		    if {!$oldVal && $data($opt)} {
			createSeps $win
		    } elseif {$oldVal && !$data($opt)} {
			foreach w [winfo children $win] {
			    if {[regexp {^(sep[0-9]+|hsep)$} [winfo name $w]]} {
				destroy $w
			    }
			}
		    }
		}
		-snipstring {
		    #
		    # Save val in data($opt), adjust the columns, and make
		    # sure the items will be redisplayed at idle time
		    #
		    set data($opt) $val
		    adjustColumns $win {} 0
		    redisplayWhenIdle $win
		    updateViewWhenIdle $win
		}
		-spacing {
		    #
		    # Adjust the line spacing and save val in data($opt)
		    #
		    set w $data(body)
		    set pixVal [winfo pixels $w $val]
		    if {$pixVal < 0} {
			set pixVal 0
		    }
		    set selectBd [winfo pixels $w $data(-selectborderwidth)]
		    if {$selectBd < 0} {
			set selectBd 0
		    }
		    $w configure -spacing1 [expr {$pixVal + $selectBd}] \
			-spacing3 [expr {$pixVal + $selectBd + !$data(-tight)}]
		    set data($opt) $val
		    redisplayWhenIdle $win
		    updateViewWhenIdle $win
		}
		-state {
		    #
		    # Apply the value to all labels and their sublabels
		    # (if any), as well as to the edit window (if present),
		    # add/remove the "disabled" tag to/from the contents
		    # of the body text widget, configure the borderwidth
		    # of the "active" and "select" tags, save the
		    # properly formatted value of val in data($opt),
		    # and raise the corresponding arrow in the canvas
		    #
		    variable states
		    set val [mwutil::fullOpt "state" $val $states]
		    catch {
			configLabel $data(hdrFrLbl) $opt $val
			configLabel $data(cornerLbl) $opt $val
			for {set col 0} {$col < $data(colCount)} {incr col} {
			    configLabel $data(hdrTxtFrLbl)$col $opt $val
			}
		    }
		    if {$data(editRow) >= 0} {
			catch {$data(bodyFrEd) configure $opt $val}
		    }
		    set w $data(body)
		    switch $val {
			disabled {
			    $w tag add disabled 1.0 end
			    $w tag configure select -relief flat
			    set data(isDisabled) 1
			}
			normal {
			    $w tag remove disabled 1.0 end
			    $w tag configure select -relief raised
			    set data(isDisabled) 0
			}
		    }
		    set data($opt) $val
		    foreach col $data(arrowColList) {
			configCanvas $win $col
			raiseArrow $win $col
		    }
		    updateColorsWhenIdle $win
		}
		-stretch {
		    #
		    # Save the properly formatted value of val in
		    # data($opt) and stretch the stretchable columns
		    #
		    if {[string first $val "all"] == 0} {
			set data($opt) all
		    } else {
			set data($opt) $val
			sortStretchableColList $win
		    }
		    set data(forceAdjust) 1
		    stretchColumnsWhenIdle $win
		}
		-stripebackground -
		-stripeforeground {
		    #
		    # Configure the "stripe" tag in the body text
		    # widget, save the properly formatted value of val
		    # in data($opt), and draw the stripes if necessary
		    #
		    set w $data(body)
		    set optTail [string range $opt 7 end] ;# remove the -stripe
		    $w tag configure stripe -$optTail $val
		    set data($opt) [$w tag cget stripe -$optTail]
		    makeStripesWhenIdle $win
		}
		-stripeheight {
		    #
		    # Save the properly formatted value of val in
		    # data($opt) and draw the stripes if necessary
		    #
		    set val [format "%d" $val]	;# integer check with error msg
		    set data($opt) $val
		    makeStripesWhenIdle $win
		}
		-targetcolor {
		    #
		    # Set the color of the row and column gaps, and save
		    # the properly formatted value of val in data($opt)
		    #
		    $data(rowGap) configure -background $val
		    $data(colGap) configure -background $val
		    set data($opt) [$data(rowGap) cget -background]
		}
		-tight {
		    #
		    # Save the boolean value specified by val
		    # in data($opt) and adjust the line spacing
		    #
		    set data($opt) [expr {$val ? 1 : 0}]
		    set w $data(body)
		    set spacing1 [$w cget -spacing1]
		    $w configure -spacing3 [expr {$spacing1 + !$data($opt)}]
		    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
		    #
		    set oldVal $data($opt)
		    set val [format "%d" $val]	;# integer check with error msg
		    if {$val < 0} {
			set val 0
		    }
		    xviewSubCmd $win 0
		    set w $data(sep)
		    if {$val == 0} {
			$data(hdrTxt) configure -xscrollcommand \
				      $data(-xscrollcommand)
			if {$oldVal > 0} {
			    destroy $w
			}
		    } else {
			$data(hdrTxt) configure -xscrollcommand ""
			if {$oldVal == 0} {
			    if {$usingTile} {
				ttk::separator $w -style Sep$win.TSeparator \
						   -cursor $data(-cursor) \
						   -orient vertical -takefocus 0
			    } else {
				tk::frame $w -background $data(-foreground) \
					     -borderwidth 1 -container 0 \
					     -cursor $data(-cursor) \
					     -highlightthickness 0 \
					     -relief sunken -takefocus 0 \
					     -width 2
			    }
			    bindtags $w [lreplace [bindtags $w] 1 1 \
					 $data(bodyTag) TablelistBody]
			}
			adjustSepsWhenIdle $win
		    }
		    set data($opt) $val
		    xviewSubCmd $win 0
		    updateHScrlbarWhenIdle $win
		}
		-treecolumn {
		    #
		    # Save the properly formatted value of val in
		    # data($opt), its adjusted value in data(treeCol),
		    # and move the tree images into the new tree column
		    #
		    set oldTreeCol $data(treeCol)
		    set newTreeCol [colIndex $win $val 0]
		    set data($opt) $newTreeCol
		    adjustColIndex $win newTreeCol
		    set data(treeCol) $newTreeCol
		    if {$data(colCount) != 0} {
			set data($opt) $newTreeCol
		    }
		    if {$newTreeCol != $oldTreeCol} {
			for {set row 0} {$row < $data(itemCount)} {incr row} {
			    doCellConfig $row $newTreeCol $win -indent \
				[doCellCget $row $oldTreeCol $win -indent]
			    doCellConfig $row $oldTreeCol $win -indent ""
			}
		    }
		}
		-treestyle {
		    #
		    # Update the tree images and save the properly
		    # formatted value of val in data($opt)
		    #
		    variable treeStyles
		    set newStyle [mwutil::fullOpt "tree style" $val $treeStyles]
		    set oldStyle $data($opt)
		    set treeCol $data(treeCol)
		    if {[string compare $newStyle $oldStyle] != 0} {
			${newStyle}TreeImgs 
			variable maxIndentDepths
			if {![info exists maxIndentDepths($newStyle)]} {
			    set maxIndentDepths($newStyle) 0
			}
			if {$data(colCount) != 0} {
			    for {set row 0} {$row < $data(itemCount)} \
				{incr row} {
				set oldImg \
				    [doCellCget $row $treeCol $win -indent]
				set newImg [strMap \
				    [list $oldStyle $newStyle "Sel" ""] $oldImg]
				if {[regexp {^.+Img([0-9]+)$} $newImg \
				     dummy depth]} {
				    if {$depth > $maxIndentDepths($newStyle)} {
					createTreeImgs $newStyle $depth
					set maxIndentDepths($newStyle) $depth
				    }
				    doCellConfig $row $treeCol $win \
						 -indent $newImg
				}
			    }
			}
		    }
		    set data($opt) $newStyle
		    switch -glob $newStyle {
			baghira -
			klearlooks -
			oxygen? -
			phase -
			plastik -
			vista* -
			winnative -
			winxp*		{ set data(protectIndents) 1 }
			default		{ set data(protectIndents) 0 }
		    }
		    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
		    }
		}
		-width {
		    #
		    # Adjust the widths of the body text widget,
		    # header frame, and listbox child, and save the
		    # properly formatted value of val in data($opt)
		    #
		    set val [format "%d" $val]	;# integer check with error msg
		    $data(body) configure $opt $val
		    if {$val <= 0} {
			$data(hdr) configure $opt $data(hdrPixels)
			$data(lb) configure $opt \
				  [expr {$data(hdrPixels) / $data(charWidth)}]
		    } else {
			$data(hdr) configure $opt 0
			$data(lb) configure $opt $val
		    }
		    set data($opt) $val
		}
		-xscrollcommand {
		    #
		    # Save val in data($opt), and apply it to the header text
		    # widget if (and only if) no title columns are being used
		    #
		    set data($opt) $val
		    if {$data(-titlecolumns) == 0} {
			$data(hdrTxt) configure $opt $val
		    } else {
			$data(hdrTxt) configure $opt ""
		    }
		}
	    }
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::doCget
#
# Returns the value of the configuration option opt for the tablelist widget
# win.
#------------------------------------------------------------------------------
proc tablelist::doCget {win opt} {
    upvar ::tablelist::ns${win}::data data
    if {[string compare $opt "-columntitles"] == 0} {
	set colTitles {}
	foreach {width title alignment} $data(-columns) {
	    lappend colTitles $title
	}
	return $colTitles
    } else {
	return $data($opt)
    }
}

#------------------------------------------------------------------------------
# tablelist::doColConfig
#
# Applies the value val of the column configuration option opt to the col'th
# column of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::doColConfig {col win opt val} {
    variable canElide
    upvar ::tablelist::ns${win}::data data

    switch -- $opt {
	-align {
	    #
	    # Set up and adjust the columns, and make sure the
	    # given column will be redisplayed at idle time
	    #
	    set idx [expr {3*$col + 2}]
	    setupColumns $win [lreplace $data(-columns) $idx $idx $val] 0
	    adjustColumns $win {} 0
	    redisplayColWhenIdle $win $col
	}

	-background -
	-foreground {
	    set w $data(body)
	    set name $col$opt

	    if {[string length $val] == 0} {
		if {[info exists data($name)]} {
		    unset data($name)
		}
	    } else {
		#
		# Configure the tag col$opt-$val in the body text widget
		#
		set tag col$opt-$val
		$w tag configure $tag $opt $val
		$w tag lower $tag

		#
		# Save val in data($name)
		#
		set data($name) $val
	    }

	    if {!$data(isDisabled)} {
		updateColorsWhenIdle $win
	    }
	}

	-changesnipside -
	-wrap {
	    #
	    # Save the boolean value specified by val in data($col$opt) and
	    # make sure the given column will be redisplayed at idle time
	    #
	    set data($col$opt) [expr {$val ? 1 : 0}]
	    if {[lindex $data(-columns) [expr {3*$col}]] != 0} {
		redisplayColWhenIdle $win $col
		updateViewWhenIdle $win
	    }
	}

	-changetitlesnipside {
	    #
	    # Save the boolean value specified by val in
	    # data($col$opt) and adjust the col'th label
	    #
	    set data($col$opt) [expr {$val ? 1 : 0}]
	    set pixels [lindex $data(colList) [expr {2*$col}]]
	    if {$pixels == 0} {			;# convention: dynamic width
		if {$data($col-maxPixels) > 0} {
		    if {$data($col-reqPixels) > $data($col-maxPixels)} {
			set pixels $data($col-maxPixels)
		    }
		}
	    }
	    if {$pixels != 0} {	
		incr pixels $data($col-delta)
	    }
	    set alignment [lindex $data(colList) [expr {2*$col + 1}]]
	    adjustLabel $win $col $pixels $alignment
	}

	-editable {
	    #
	    # Save the boolean value specified by val in data($col$opt)
	    # and invoke the motion handler if necessary
	    #
	    set data($col$opt) [expr {$val ? 1 : 0}]
	    if {$data(-showeditcursor)} {
		invokeMotionHandler $win
	    }
	}

	-editwindow {
	    variable editWin
	    if {[info exists editWin($val-creationCmd)]} {
		set data($col$opt) $val
	    } else {
		return -code error "name \"$val\" is not registered\
				    for interactive cell editing"
	    }
	}

	-font {
	    set w $data(body)
	    set name $col$opt

	    if {[info exists data($name)] &&
		(!$data($col-hide) || $canElide)} {
		#
		# Remove the tag col$opt-$data($name)
		# from the elements of the given column
		#
		set tag col$opt-$data($name)
		for {set line 1} {$line <= $data(itemCount)} {incr line} {
		    findTabs $win $line $col $col tabIdx1 tabIdx2
		    $w tag remove $tag $tabIdx1 $tabIdx2+1c
		}
	    }

	    if {[string length $val] == 0} {
		if {[info exists data($name)]} {
		    unset data($name)
		}
	    } else {
		#
		# Configure the tag col$opt-$val in the body text widget
		#
		set tag col$opt-$val
		$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
		    }
		}

		#
		# Save val in data($name)
		#
		set data($name) $val
	    }

	    #
	    # Rebuild the lists of the column fonts and tag names
	    #
	    makeColFontAndTagLists $win

	    #
	    # Adjust the columns, and make sure the specified
	    # column will be redisplayed at idle time
	    #
	    adjustColumns $win $col 1
	    redisplayColWhenIdle $win $col
	    updateViewWhenIdle $win

	    if {$col == $data(editCol)} {
		#
		# Configure the edit window
		#
		setEditWinFont $win
	    }
	}

	-formatcommand {
	    if {[string length $val] == 0} {
		if {[info exists data($col$opt)]} {
		    unset data($col$opt)
		}
		set fmtCmdFlag 0
	    } else {
		set data($col$opt) $val
		set fmtCmdFlag 1
	    }

	    #
	    # Update the corresponding element of the list data(fmtCmdFlagList)
	    #
	    set data(fmtCmdFlagList) \
		[lreplace $data(fmtCmdFlagList) $col $col $fmtCmdFlag]
	    set data(hasFmtCmds) \
		[expr {[lsearch -exact $data(fmtCmdFlagList) 1] >= 0}]

	    #
	    # Adjust the columns and make sure the specified
	    # column will be redisplayed at idle time
	    #
	    adjustColumns $win $col 1
	    redisplayColWhenIdle $win $col
	    updateViewWhenIdle $win
	}

	-hide {
	    #
	    # Save the boolean value specified by val in data($col$opt),
	    # adjust the columns, and redisplay the items
	    #
	    set oldVal $data($col$opt)
	    set newVal [expr {$val ? 1 : 0}]
	    if {$newVal != $oldVal} {
		if {!$canElide} {
		    set selCells [curCellSelection $win]
		}
		set data($col$opt) $newVal
		if {$newVal} {				;# hiding the column
		    incr data(hiddenColCount)
		    adjustColIndex $win data(anchorCol) 1
		    adjustColIndex $win data(activeCol) 1
		    if {$col == $data(editCol)} {
			doCancelEditing $win
		    }
		} else {
		    incr data(hiddenColCount) -1
		}
		makeColFontAndTagLists $win
		adjustColumns $win $col 1
		if {!$canElide} {
		    redisplay $win 0 $selCells
		    if {!$newVal &&
			[string compare $data(-selecttype) "row"] == 0} {
			foreach row [curSelection $win] {
			    rowSelection $win set $row $row
			}
		    }
		}
		updateViewWhenIdle $win

		genVirtualEvent $win <<TablelistColHiddenStateChanged>> $col
	    }
	}

	-labelalign {
	    if {[string length $val] == 0} {
		#
		# Unset data($col$opt)
		#
		set alignment [lindex $data(colList) [expr {2*$col + 1}]]
		if {[info exists data($col$opt)]} {
		    unset data($col$opt)
		}
	    } else {
		#
		# Save the properly formatted value of val in data($col$opt)
		#
		variable alignments
		set val [mwutil::fullOpt "label alignment" $val $alignments]
		set alignment $val
		set data($col$opt) $val
	    }

	    #
	    # Adjust the col'th label
	    #
	    set pixels [lindex $data(colList) [expr {2*$col}]]
	    if {$pixels == 0} {			;# convention: dynamic width
		if {$data($col-maxPixels) > 0} {
		    if {$data($col-reqPixels) > $data($col-maxPixels)} {
			set pixels $data($col-maxPixels)
		    }
		}
	    }
	    if {$pixels != 0} {	
		incr pixels $data($col-delta)
	    }
	    adjustLabel $win $col $pixels $alignment
	}

	-labelbackground -
	-labelforeground {
	    set w $data(hdrTxtFrLbl)$col
	    set optTail [string range $opt 6 end]	;# remove the -label
	    if {[string length $val] == 0} {
		#
		# Apply the value of the corresponding widget
		# configuration option to the col'th label and
		# its sublabels (if any), and unset data($col$opt)
		#
		configLabel $w -$optTail $data($opt)
		if {[info exists data($col$opt)]} {
		    unset data($col$opt)
		}
	    } else {
		#
		# Apply the given value to the col'th label and
		# its sublabels (if any), and save the properly
		# formatted value of val in data($col$opt)
		#
		configLabel $w -$optTail $val
		variable helpLabel
		$helpLabel configure -$optTail $val
		set data($col$opt) [$helpLabel cget -$optTail]
	    }

	    if {[lsearch -exact $data(arrowColList) $col] >= 0} {
		configCanvas $win $col
	    }
	}

	-labelborderwidth {
	    set w $data(hdrTxtFrLbl)$col
	    set optTail [string range $opt 6 end]	;# remove the -label
	    if {[string length $val] == 0} {
		#
		# Apply the value of the corresponding widget configuration
		# option to the col'th label and unset data($col$opt)
		#
		configLabel $w -$optTail $data($opt)
		if {[info exists data($col$opt)]} {
		    unset data($col$opt)
		}
	    } else {
		#
		# Apply the given value to the col'th label and save the
		# properly formatted value of val in data($col$opt)
		#
		configLabel $w -$optTail $val
		set data($col$opt) [$w cget -$optTail]
	    }

	    #
	    # Adjust the columns (including the height of the header frame)
	    #
	    adjustColumns $win l$col 1
	}

	-labelcommand -
	-labelcommand2 -
	-name -
	-sortcommand {
	    if {[string length $val] == 0} {
		if {[info exists data($col$opt)]} {
		    unset data($col$opt)
		}
	    } else {
		set data($col$opt) $val
	    }
	}

	-labelfont {
	    set w $data(hdrTxtFrLbl)$col
	    set optTail [string range $opt 6 end]	;# remove the -label
	    if {[string length $val] == 0} {
		#
		# Apply the value of the corresponding widget
		# configuration option to the col'th label and
		# its sublabels (if any), and unset data($col$opt)
		#
		configLabel $w -$optTail $data($opt)
		if {[info exists data($col$opt)]} {
		    unset data($col$opt)
		}
	    } else {
		#
		# Apply the given value to the col'th label and
		# its sublabels (if any), and save the properly
		# formatted value of val in data($col$opt)
		#
		configLabel $w -$optTail $val
		set data($col$opt) [$w cget -$optTail]
	    }

	    #
	    # Adjust the columns (including the height of the header frame)
	    #
	    adjustColumns $win l$col 1
	}

	-labelheight -
	-labelpady {
	    set w $data(hdrTxtFrLbl)$col
	    set optTail [string range $opt 6 end]	;# remove the -label
	    if {[string length $val] == 0} {
		#
		# Apply the value of the corresponding widget configuration
		# option to the col'th label and unset data($col$opt)
		#
		configLabel $w -$optTail $data($opt)
		if {[info exists data($col$opt)]} {
		    unset data($col$opt)
		}
	    } else {
		#
		# Apply the given value to the col'th label and save the
		# properly formatted value of val in data($col$opt)
		#
		configLabel $w -$optTail $val
		variable usingTile
		if {$usingTile} {
		    set data($col$opt) $val
		} else {
		    set data($col$opt) [$w cget -$optTail]
		}
	    }

	    #
	    # Adjust the height of the header frame
	    #
	    adjustHeaderHeight $win
	}

	-labelimage {
	    set w $data(hdrTxtFrLbl)$col
	    if {[string length $val] == 0} {
		foreach l [getSublabels $w] {
		    destroy $l
		}
		if {[info exists data($col$opt)]} {
		    unset data($col$opt)
		}
	    } else {
		if {![winfo exists $w-il]} {
		    variable configSpecs
		    variable configOpts
		    foreach l [list $w-il $w-tl] {	;# image and text labels
			#
			# Create the label $l
			#
			tk::label $l -borderwidth 0 -height 0 \
				     -highlightthickness 0 -padx 0 \
				     -pady 0 -takefocus 0 -width 0

			#
			# Apply to it the current configuration options
			#
			foreach opt2 $configOpts {
			    if {[string compare \
				 [lindex $configSpecs($opt2) 2] "c"] == 0} {
				$l configure $opt2 $data($opt2)
			    }
			}
			if {[string compare [winfo class $w] "TLabel"] == 0} {
			    variable themeDefaults
			    $l configure -background \
					 $themeDefaults(-labelbackground)
			} else {
			    $l configure -background [$w cget -background]
			    $l configure -foreground [$w cget -foreground]
			}
			$l configure -font [$w cget -font]
			foreach opt2 {-activebackground -activeforeground
				      -disabledforeground -state} {
			    catch {$l configure $opt2 [$w cget $opt2]}
			}

			#
			# Replace the binding tag Label with $w,
			# $data(labelTag), and TablelistSubLabel in
			# the list of binding tags of the label $l
			#
			bindtags $l [lreplace [bindtags $l] 1 1 \
				     $w $data(labelTag) TablelistSubLabel]
		    }
		}

		#
		# Display the specified image in the label
		# $w-il and save val in data($col$opt)
		#
		$w-il configure -image $val
		set data($col$opt) $val
	    }

	    #
	    # Adjust the columns (including the height of the header frame)
	    #
	    adjustColumns $win l$col 1
	}

	-labelrelief {
	    set w $data(hdrTxtFrLbl)$col
	    set optTail [string range $opt 6 end]	;# remove the -label
	    if {[string length $val] == 0} {
		#
		# Apply the value of the corresponding widget configuration
		# option to the col'th label and unset data($col$opt)
		#
		configLabel $w -$optTail $data($opt)
		if {[info exists data($col$opt)]} {
		    unset data($col$opt)
		}
	    } else {
		#
		# Apply the given value to the col'th label and save the
		# properly formatted value of val in data($col$opt)
		#
		configLabel $w -$optTail $val
		set data($col$opt) [$w cget -$optTail]
	    }
	}

	-maxwidth {
	    #
	    # Save the properly formatted value of val in
	    # data($col$opt), adjust the columns, and make sure
	    # the specified column will be redisplayed at idle time
	    #
	    set val [format "%d" $val]	;# integer check with error message
	    set data($col$opt) $val
	    if {$val > 0} {		;# convention: max. width in characters
		set pixels [charsToPixels $win $data(-font) $val]
	    } elseif {$val < 0} {	;# convention: max. width in pixels
		set pixels [expr {(-1)*$val}]
	    } else {			;# convention: no max. width
		set pixels 0
	    }
	    set data($col-maxPixels) $pixels
	    adjustColumns $win $col 1
	    redisplayColWhenIdle $win $col
	    updateViewWhenIdle $win
	}

	-resizable {
	    #
	    # Save the boolean value specified by val in data($col$opt)
	    #
	    set data($col$opt) [expr {$val ? 1 : 0}]
	}

	-selectbackground -
	-selectforeground {
	    set w $data(body)
	    set name $col$opt

	    if {[string length $val] == 0} {
		if {[info exists data($name)]} {
		    unset data($name)
		}
	    } else {
		#
		# Configure the tag col$opt-$val in the body text widget
		#
		set tag col$opt-$val
		set optTail [string range $opt 7 end]	;# remove the -select
		$w tag configure $tag -$optTail $val
		$w tag raise $tag select

		#
		# Save val in data($name)
		#
		set data($name) $val
	    }

	    if {!$data(isDisabled)} {
		updateColorsWhenIdle $win
	    }
	}

	-showarrow {
	    #
	    # Save the boolean value specified by val in data($col$opt) and
	    # manage or unmanage the canvas displaying an up- or down-arrow
	    #
	    set data($col$opt) [expr {$val ? 1 : 0}]
	    makeSortAndArrowColLists $win
	    adjustColumns $win l$col 1
	}

	-showlinenumbers {
	    #
	    # Save the boolean value specified by val in
	    # data($col$opt), and make sure the line numbers
	    # will be redisplayed at idle time if needed
	    #
	    set val [expr {$val ? 1 : 0}]
	    if {!$data($col$opt) && $val} {
		showLineNumbersWhenIdle $win
	    }
	    set data($col$opt) $val
	}

	-sortmode {
	    #
	    # Save the properly formatted value of val in data($col$opt)
	    #
	    variable sortModes
	    set data($col$opt) [mwutil::fullOpt "sort mode" $val $sortModes]
	}

	-stretchable {
	    set flag [expr {$val ? 1 : 0}]
	    if {$flag} {
		if {[string compare $data(-stretch) "all"] != 0 &&
		    [lsearch -exact $data(-stretch) $col] < 0} {
		    #
		    # col was not found in data(-stretch): add it to the list
		    #
		    lappend data(-stretch) $col
		    sortStretchableColList $win
		    set data(forceAdjust) 1
		    stretchColumnsWhenIdle $win
		}
	    } elseif {[string compare $data(-stretch) "all"] == 0} {
		#
		# Replace the value "all" of data(-stretch) with
		# the list of all column indices different from col
		#
		set data(-stretch) {}
		for {set n 0} {$n < $data(colCount)} {incr n} {
		    if {$n != $col} {
			lappend data(-stretch) $n
		    }
		}
		set data(forceAdjust) 1
		stretchColumnsWhenIdle $win
	    } else {
		#
		# If col is contained in data(-stretch)
		# then remove it from the list
		#
		if {[set n [lsearch -exact $data(-stretch) $col]] >= 0} {
		    set data(-stretch) [lreplace $data(-stretch) $n $n]
		    set data(forceAdjust) 1
		    stretchColumnsWhenIdle $win
		}

		#
		# If col indicates the last column and data(-stretch)
		# contains "end" then remove "end" from the list
		#
		if {$col == $data(lastCol) &&
		    [string compare [lindex $data(-stretch) end] "end"] == 0} {
		    set data(-stretch) [lreplace $data(-stretch) end end]
		    set data(forceAdjust) 1
		    stretchColumnsWhenIdle $win
		}
	    }
	}

	-stripebackground -
	-stripeforeground {
	    set w $data(body)
	    set name $col$opt

	    if {[string length $val] == 0} {
		if {[info exists data($name)]} {
		    unset data($name)
		}
	    } else {
		#
		# Configure the tag col$opt-$val in the body text widget
		#
		set tag col$opt-$val
		set optTail [string range $opt 7 end]	;# remove the -stripe
		$w tag configure $tag -$optTail $val
		$w tag raise $tag stripe

		#
		# Save val in data($name)
		#
		set data($name) $val
	    }

	    if {!$data(isDisabled)} {
		updateColorsWhenIdle $win
	    }
	}

	-text {
	    if {$data(isDisabled) || $data($col-showlinenumbers)} {
		return ""
	    }

	    #
	    # Replace the column's contents in the internal list
	    #
	    set newItemList {}
	    set row 0
	    foreach item $data(itemList) text [lrange $val 0 $data(lastRow)] {
		set item [lreplace $item $col $col $text]
		lappend newItemList $item
	    }
	    set data(itemList) $newItemList

	    #
	    # Update the list variable if present
	    #
	    condUpdateListVar $win

	    #
	    # Adjust the columns and make sure the specified
	    # column will be redisplayed at idle time
	    #
	    adjustColumns $win $col 1
	    redisplayColWhenIdle $win $col
	    updateViewWhenIdle $win
	}

	-title {
	    #
	    # Save the given value in the corresponding
	    # element of data(-columns) and adjust the columns
	    #
	    set idx [expr {3*$col + 1}]
	    set data(-columns) [lreplace $data(-columns) $idx $idx $val]
	    adjustColumns $win l$col 1
	}

	-valign {
	    #
	    # Save the properly formatted value of val in data($col$opt) and
	    # make sure the given column will be redisplayed at idle time
	    #
	    variable valignments
	    set val [mwutil::fullOpt "vertical alignment" $val $valignments]
	    if {[string compare $val $data($col$opt)] != 0} {
		set data($col$opt) $val
		redisplayColWhenIdle $win $col
	    }
	}

	-width {
	    #
	    # Set up and adjust the columns, and make sure the
	    # given column will be redisplayed at idle time
	    #
	    set idx [expr {3*$col}]
	    if {$val != [lindex $data(-columns) $idx]} {
		setupColumns $win [lreplace $data(-columns) $idx $idx $val] 0
		redisplayColWhenIdle $win $col	;# here before adjustColumns!
		adjustColumns $win $col 1
		updateViewWhenIdle $win
	    }
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::doColCget
#
# Returns the value of the column configuration option opt for the col'th
# column of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::doColCget {col win opt} {
    upvar ::tablelist::ns${win}::data data

    switch -- $opt {
	-align {
	    return [lindex $data(-columns) [expr {3*$col + 2}]]
	}

	-stretchable {
	    return [expr {
		[string compare $data(-stretch) "all"] == 0 ||
		[lsearch -exact $data(-stretch) $col] >= 0 ||
		($col == $data(lastCol) && \
		 [string compare [lindex $data(-stretch) end] "end"] == 0)
	    }]
	}

	-text {
	    set result {}
	    foreach item $data(itemList) {
		lappend result [lindex $item $col]
	    }
	    return $result
	}

	-title {
	    return [lindex $data(-columns) [expr {3*$col + 1}]]
	}

	-width {
	    return [lindex $data(-columns) [expr {3*$col}]]
	}

	default {
	    if {[info exists data($col$opt)]} {
		return $data($col$opt)
	    } else {
		return ""
	    }
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::doRowConfig
#
# Applies the value val of the row configuration option opt to the row'th row
# of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::doRowConfig {row win opt val} {
    variable canElide
    variable elide
    variable snipSides
    upvar ::tablelist::ns${win}::data data

    set w $data(body)

    switch -- $opt {
	-background -
	-foreground {
	    set key [lindex $data(keyList) $row]
	    set name $key$opt

	    if {[string length $val] == 0} {
		if {[info exists data($name)]} {
		    unset data($name)
		}
	    } else {
		#
		# Configure the tag row$opt-$val in the body text widget
		#
		set tag row$opt-$val
		$w tag configure $tag $opt $val
		$w tag lower $tag active

		#
		# Save val in data($name)
		#
		set data($name) $val
	    }

	    if {!$data(isDisabled)} {
		updateColorsWhenIdle $win
	    }
	}

	-elide {
	    set val [expr {$val ? 1 : 0}]
	    set item [lindex $data(itemList) $row]
	    set key [lindex $item end]
	    set name $key$opt
	    set line [expr {$row + 1}]
	    set viewChanged 0

	    if {$val} {					;# eliding the row
		if {![info exists data($name)]} {
		    set data($name) 1
		    $w tag add elidedRow $line.0 $line.end+1c

		    if {![info exists data($key-hide)]} {
			incr data(nonViewableRowCount)
			set viewChanged 1

			if {$row == $data(editRow)} {
			    doCancelEditing $win
			}
		    }
		}
	    } else {					;# uneliding the row
		if {[info exists data($name)]} {
		    unset data($name)
		    $w tag remove elidedRow $line.0 $line.end+1c

		    if {![info exists data($key-hide)]} {
			incr data(nonViewableRowCount) -1
			set viewChanged 1
		    }
		}
	    }

	    if {$viewChanged} {
		#
		# Adjust the heights of the body text widget
		# and of the listbox child, if necessary
		#
		if {$data(-height) <= 0} {
		    set viewableRowCount \
			[expr {$data(itemCount) - $data(nonViewableRowCount)}]
		    $w configure -height $viewableRowCount
		    $data(lb) configure -height $viewableRowCount
		}

		#
		# Build the list of those dynamic-width columns
		# whose widths are affected by (un)eliding the row
		#
		set colWidthsChanged 0
		set colIdxList {}
		set displayedItem [lrange $item 0 $data(lastCol)]
		if {$data(hasFmtCmds)} {
		    set displayedItem [formatItem $win $key $row $displayedItem]
		}
		if {[string match "*\t*" $displayedItem]} {
		    set displayedItem [mapTabs $displayedItem]
		}
		set col 0
		foreach text $displayedItem {pixels alignment} $data(colList) {
		    if {($data($col-hide) && !$canElide) || $pixels != 0} {
			incr col
			continue
		    }

		    getAuxData $win $key $col auxType auxWidth
		    getIndentData $win $key $col indentWidth
		    set cellFont [getCellFont $win $key $col]
		    set elemWidth [getElemWidth $win $text $auxWidth \
				   $indentWidth $cellFont]
		    if {$val} {				;# eliding the row
			if {$elemWidth == $data($col-elemWidth) &&
			    [incr data($col-widestCount) -1] == 0} {
			    set colWidthsChanged 1
			    lappend colIdxList $col
			}
		    } else {				;# uneliding the row
			if {$elemWidth == $data($col-elemWidth)} {
			    incr data($col-widestCount)
			} elseif {$elemWidth > $data($col-elemWidth)} {
			    set data($col-elemWidth) $elemWidth
			    set data($col-widestCount) 1
			    if {$elemWidth > $data($col-reqPixels)} {
				set data($col-reqPixels) $elemWidth
				set colWidthsChanged 1
			    }
			}
		    }

		    incr col
		}

		#
		# Invalidate the list of row indices indicating the
		# viewable rows and adjust the columns if necessary
		#
		set data(viewableRowList) {-1}
		if {$colWidthsChanged} {
		    adjustColumns $win $colIdxList 1
		}
	    }
	}

	-font {
	    #
	    # Save the current cell fonts in a temporary array
	    #
	    set item [lindex $data(itemList) $row]
	    set key [lindex $item end]
	    for {set col 0} {$col < $data(colCount)} {incr col} {
		set oldCellFonts($col) [getCellFont $win $key $col]
	    }

	    set name $key$opt
	    if {[info exists data($name)]} {
		#
		# Remove the tag row$opt-$data($name) from the given row
		#
		set line [expr {$row + 1}]
		$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
		}
	    } else {
		#
		# Configure the tag row$opt-$val in the body
		# 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 add $tag $line.0 $line.end

		#
		# Save val in data($name)
		#
		if {![info exists data($name)]} {
		    incr data(rowTagRefCount)
		}
		set data($name) $val
	    }

	    set displayedItem [lrange $item 0 $data(lastCol)]
	    if {$data(hasFmtCmds)} {
		set displayedItem [formatItem $win $key $row $displayedItem]
	    }
	    if {[string match "*\t*" $displayedItem]} {
		set displayedItem [mapTabs $displayedItem]
	    }
	    set colWidthsChanged 0
	    set colIdxList {}
	    set line [expr {$row + 1}]
	    set textIdx1 $line.1
	    set col 0
	    foreach text $displayedItem {pixels alignment} $data(colList) {
		if {$data($col-hide) && !$canElide} {
		    incr col
		    continue
		}

		#
		# Adjust the cell text and the image or window width
		#
		set multiline [string match "*\n*" $text]
		set cellFont [getCellFont $win $key $col]
		set workPixels $pixels
		if {$pixels == 0} {		;# convention: dynamic width
		    set textSav $text
		    getAuxData $win $key $col auxType auxWidthSav
		    getIndentData $win $key $col indentWidthSav

		    if {$data($col-maxPixels) > 0} {
			if {$data($col-reqPixels) > $data($col-maxPixels)} {
			    set workPixels $data($col-maxPixels)
			}
		    }
		}
		set aux [getAuxData $win $key $col auxType auxWidth $workPixels]
		set indent [getIndentData $win $key $col indentWidth]
		set maxTextWidth $workPixels
		if {$workPixels != 0} {
		    incr workPixels $data($col-delta)
		    set maxTextWidth \
			[getMaxTextWidth $workPixels $auxWidth $indentWidth]

		    if {$data($col-wrap) && !$multiline} {
			if {[font measure $cellFont -displayof $win $text] >
			    $maxTextWidth} {
			    set multiline 1
			}
		    }
		}
		set snipSide $snipSides($alignment,$data($col-changesnipside))
		if {$multiline} {
		    set list [split $text "\n"]
		    if {$data($col-wrap)} {
			set snipSide ""
		    }
		    adjustMlElem $win list auxWidth indentWidth $cellFont \
				 $workPixels $snipSide $data(-snipstring)
		    set msgScript [list ::tablelist::displayText $win $key \
				   $col [join $list "\n"] $cellFont \
				   $maxTextWidth $alignment]
		} else {
		    adjustElem $win text auxWidth indentWidth $cellFont \
			       $workPixels $snipSide $data(-snipstring)
		}

		if {$row == $data(editRow) && $col == $data(editCol)} {
		    #
		    # Configure the edit window
		    #
		    setEditWinFont $win
		} else {
		    #
		    # Update the text widget's contents between the two tabs
		    #
		    set textIdx2 [$w search $elide "\t" $textIdx1 $line.end]
		    if {$multiline} {
			updateMlCell $w $textIdx1 $textIdx2 $msgScript $aux \
				     $auxType $auxWidth $indent $indentWidth \
				     $alignment [getVAlignment $win $key $col]
		    } else {
			updateCell $w $textIdx1 $textIdx2 $text $aux \
				   $auxType $auxWidth $indent $indentWidth \
				   $alignment [getVAlignment $win $key $col]
		    }
		}

		if {$pixels == 0 && ![info exists data($key-elide)] &&
		    ![info exists data($key-hide)]} {
		    #
		    # Check whether the width of the current column has changed
		    #
		    set text $textSav
		    set auxWidth $auxWidthSav
		    set indentWidth $indentWidthSav
		    set newElemWidth [getElemWidth $win $text $auxWidth \
				      $indentWidth $cellFont]
		    if {$newElemWidth > $data($col-elemWidth)} {
			set data($col-elemWidth) $newElemWidth
			set data($col-widestCount) 1
			if {$newElemWidth > $data($col-reqPixels)} {
			    set data($col-reqPixels) $newElemWidth
			    set colWidthsChanged 1
			}
		    } else {
			set oldElemWidth [getElemWidth $win $text $auxWidth \
					  $indentWidth $oldCellFonts($col)]
			if {$oldElemWidth < $data($col-elemWidth) &&
			    $newElemWidth == $data($col-elemWidth)} {
			    incr data($col-widestCount)
			} elseif {$oldElemWidth == $data($col-elemWidth) &&
				  $newElemWidth < $oldElemWidth &&
				  [incr data($col-widestCount) -1] == 0} {
			    set colWidthsChanged 1
			    lappend colIdxList $col
			}
		    }
		}

		set textIdx1 [$w search $elide "\t" $textIdx1 $line.end]+2c
		incr col
	    }

	    #
	    # Adjust the columns if necessary and schedule
	    # some operations for execution at idle time
	    #
	    if {$colWidthsChanged} {
		adjustColumns $win $colIdxList 1
	    }
	    updateViewWhenIdle $win
	}

	-hide {
	    set val [expr {$val ? 1 : 0}]
	    set item [lindex $data(itemList) $row]
	    set key [lindex $item end]
	    set name $key$opt
	    set line [expr {$row + 1}]
	    set viewChanged 0
	    set callerProc [lindex [info level -1] 0]

	    if {$val} {					;# hiding the row
		if {![info exists data($name)]} {
		    set data($name) 1
		    $w tag add hiddenRow $line.0 $line.end+1c

		    if {![info exists data($key-elide)]} {
			incr data(nonViewableRowCount)
			set viewChanged 1

			#
			# Elide the descendants of this item
			#
			set fromRow [expr {$row + 1}]
			set toRow [nodeRow $win $key end]
			for {set _row $fromRow} {$_row < $toRow} {incr _row} {
			    doRowConfig $_row $win -elide 1
			}

			if {[string match "*configureWidget" $callerProc]} {
			    adjustRowIndex $win data(anchorRow) 1

			    set activeRow $data(activeRow)
			    adjustRowIndex $win activeRow 1
			    set data(activeRow) $activeRow
			}

			if {$row == $data(editRow)} {
			    doCancelEditing $win
			}
		    }
		}
	    } else {					;# unhiding the row
		if {[info exists data($name)]} {
		    unset data($name)
		    $w tag remove hiddenRow $line.0 $line.end+1c

		    if {![info exists data($key-elide)]} {
			incr data(nonViewableRowCount) -1
			set viewChanged 1

			if {[info exists data($key,$data(treeCol)-indent)] &&
			    [string match "*expanded*" \
			     $data($key,$data(treeCol)-indent)]} {
			    expandSubCmd $win [list $row -partly]
			}
		    }
		}
	    }

	    if {$viewChanged} {
		#
		# Adjust the heights of the body text widget
		# and of the listbox child, if necessary
		#
		if {$data(-height) <= 0} {
		    set viewableRowCount \
			[expr {$data(itemCount) - $data(nonViewableRowCount)}]
		    $w configure -height $viewableRowCount
		    $data(lb) configure -height $viewableRowCount
		}

		#
		# Build the list of those dynamic-width columns
		# whose widths are affected by (un)hiding the row
		#
		set colWidthsChanged 0
		set colIdxList {}
		set displayedItem [lrange $item 0 $data(lastCol)]
		if {$data(hasFmtCmds)} {
		    set displayedItem [formatItem $win $key $row $displayedItem]
		}
		if {[string match "*\t*" $displayedItem]} {
		    set displayedItem [mapTabs $displayedItem]
		}
		set col 0
		foreach text $displayedItem {pixels alignment} $data(colList) {
		    if {($data($col-hide) && !$canElide) || $pixels != 0} {
			incr col
			continue
		    }

		    getAuxData $win $key $col auxType auxWidth
		    getIndentData $win $key $col indentWidth
		    set cellFont [getCellFont $win $key $col]
		    set elemWidth [getElemWidth $win $text $auxWidth \
				   $indentWidth $cellFont]
		    if {$val} {				;# hiding the row
			if {$elemWidth == $data($col-elemWidth) &&
			    [incr data($col-widestCount) -1] == 0} {
			    set colWidthsChanged 1
			    lappend colIdxList $col
			}
		    } else {				;# unhiding the row
			if {$elemWidth == $data($col-elemWidth)} {
			    incr data($col-widestCount)
			} elseif {$elemWidth > $data($col-elemWidth)} {
			    set data($col-elemWidth) $elemWidth
			    set data($col-widestCount) 1
			    if {$elemWidth > $data($col-reqPixels)} {
				set data($col-reqPixels) $elemWidth
				set colWidthsChanged 1
			    }
			}
		    }

		    incr col
		}

		#
		# Invalidate the list of row indices indicating the
		# viewable rows and adjust the columns if necessary
		#
		set data(viewableRowList) {-1}
		if {$colWidthsChanged} {
		    adjustColumns $win $colIdxList 1
		}

		#
		# Schedule some operations for execution at idle time
		# and generate a virtual event only if the caller proc
		# is configureWidget, in order to make sure that only
		# one event per caller proc invocation will be generated
		#
		if {[string match "*configureWidget" $callerProc]} {
		    makeStripesWhenIdle $win
		    showLineNumbersWhenIdle $win
		    updateViewWhenIdle $win

		    genVirtualEvent $win <<TablelistRowHiddenStateChanged>> $row
		}
	    }
	}

	-name {
	    set key [lindex $data(keyList) $row]
	    if {[string length $val] == 0} {
		if {[info exists data($key$opt)]} {
		    unset data($key$opt)
		}
	    } else {
		set data($key$opt) $val
	    }
	}

	-selectable {
	    set val [expr {$val ? 1 : 0}]
	    set key [lindex $data(keyList) $row]

	    if {$val} {
		if {[info exists data($key$opt)]} {
		    unset data($key$opt)
		}
	    } else {
		#
		# Set data($key$opt) to 0 and deselect the row
		#
		set data($key$opt) 0
		rowSelection $win clear $row $row
	    }
	}

	-selectbackground -
	-selectforeground {
	    set key [lindex $data(keyList) $row]
	    set name $key$opt

	    if {[string length $val] == 0} {
		if {[info exists data($name)]} {
		    unset data($name)
		}
	    } else {
		#
		# Configure the tag row$opt-$val in the body text widget
		#
		set tag row$opt-$val
		set optTail [string range $opt 7 end]	;# remove the -select
		$w tag configure $tag -$optTail $val
		$w tag lower $tag active

		#
		# Save val in data($name)
		#
		set data($name) [$w tag cget $tag -$optTail]
	    }

	    if {!$data(isDisabled)} {
		updateColorsWhenIdle $win
	    }
	}

	-text {
	    if {$data(isDisabled)} {
		return ""
	    }

	    set colWidthsChanged 0
	    set colIdxList {}
	    set oldItem [lindex $data(itemList) $row]
	    set key [lindex $oldItem end]
	    set newItem [adjustItem $val $data(colCount)]
	    if {$data(hasFmtCmds)} {
		set displayedItem [formatItem $win $key $row $newItem]
	    } else {
		set displayedItem $newItem
	    }
	    if {[string match "*\t*" $displayedItem]} {
		set displayedItem [mapTabs $displayedItem]
	    }
	    set line [expr {$row + 1}]
	    set textIdx1 $line.1
	    set col 0
	    foreach text $displayedItem {pixels alignment} $data(colList) {
		if {$data($col-hide) && !$canElide} {
		    incr col
		    continue
		}

		#
		# Adjust the cell text and the image or window width
		#
		set multiline [string match "*\n*" $text]
		set cellFont [getCellFont $win $key $col]
		set workPixels $pixels
		if {$pixels == 0} {		;# convention: dynamic width
		    set textSav $text
		    getAuxData $win $key $col auxType auxWidthSav
		    getIndentData $win $key $col indentWidthSav

		    if {$data($col-maxPixels) > 0} {
			if {$data($col-reqPixels) > $data($col-maxPixels)} {
			    set workPixels $data($col-maxPixels)
			}
		    }
		}
		set aux [getAuxData $win $key $col auxType auxWidth $workPixels]
		set indent [getIndentData $win $key $col indentWidth]
		set maxTextWidth $workPixels
		if {$workPixels != 0} {
		    incr workPixels $data($col-delta)
		    set maxTextWidth \
			[getMaxTextWidth $workPixels $auxWidth $indentWidth]

		    if {$data($col-wrap) && !$multiline} {
			if {[font measure $cellFont -displayof $win $text] >
			    $maxTextWidth} {
			    set multiline 1
			}
		    }
		}
		set snipSide $snipSides($alignment,$data($col-changesnipside))
		if {$multiline} {
		    set list [split $text "\n"]
		    if {$data($col-wrap)} {
			set snipSide ""
		    }
		    adjustMlElem $win list auxWidth indentWidth $cellFont \
				 $workPixels $snipSide $data(-snipstring)
		    set msgScript [list ::tablelist::displayText $win $key \
				   $col [join $list "\n"] $cellFont \
				   $maxTextWidth $alignment]
		} else {
		    adjustElem $win text auxWidth indentWidth $cellFont \
			       $workPixels $snipSide $data(-snipstring)
		}

		if {$row != $data(editRow) || $col != $data(editCol)} {
		    #
		    # Update the text widget's contents between the two tabs
		    #
		    set textIdx2 [$w search $elide "\t" $textIdx1 $line.end]
		    if {$multiline} {
			updateMlCell $w $textIdx1 $textIdx2 $msgScript $aux \
				     $auxType $auxWidth $indent $indentWidth \
				     $alignment [getVAlignment $win $key $col]
		    } else {
			updateCell $w $textIdx1 $textIdx2 $text $aux \
				   $auxType $auxWidth $indent $indentWidth \
				   $alignment [getVAlignment $win $key $col]
		    }
		}

		if {$pixels == 0 && ![info exists data($key-elide)] &&
		    ![info exists data($key-hide)]} {
		    #
		    # Check whether the width of the current column has changed
		    #
		    set text $textSav
		    set auxWidth $auxWidthSav
		    set indentWidth $indentWidthSav
		    set newElemWidth [getElemWidth $win $text $auxWidth \
				      $indentWidth $cellFont]
		    if {$newElemWidth > $data($col-elemWidth)} {
			set data($col-elemWidth) $newElemWidth
			set data($col-widestCount) 1
			if {$newElemWidth > $data($col-reqPixels)} {
			    set data($col-reqPixels) $newElemWidth
			    set colWidthsChanged 1
			}
		    } else {
			set oldText [lindex $oldItem $col]
			if {[lindex $data(fmtCmdFlagList) $col]} {
			    set oldText \
				[formatElem $win $key $row $col $oldText]
			}
			if {[string match "*\t*" $oldText]} {
			    set oldText [mapTabs $oldText]
			}
			set oldElemWidth [getElemWidth $win $oldText $auxWidth \
					  $indentWidth $cellFont]
			if {$oldElemWidth < $data($col-elemWidth) &&
			    $newElemWidth == $data($col-elemWidth)} {
			    incr data($col-widestCount)
			} elseif {$oldElemWidth == $data($col-elemWidth) &&
				  $newElemWidth < $oldElemWidth &&
				  [incr data($col-widestCount) -1] == 0} {
			    set colWidthsChanged 1
			    lappend colIdxList $col
			}
		    }
		}

		set textIdx1 [$w search $elide "\t" $textIdx1 $line.end]+2c
		incr col
	    }

	    #
	    # Replace the row contents in the list variable if present
	    #
	    if {$data(hasListVar)} {
		upvar #0 $data(-listvariable) var
		trace vdelete var wu $data(listVarTraceCmd)
		set var [lreplace $var $row $row $newItem]
		trace variable var wu $data(listVarTraceCmd)
	    }

	    #
	    # Replace the row contents in the internal list
	    #
	    lappend newItem $key
	    set data(itemList) [lreplace $data(itemList) $row $row $newItem]

	    #
	    # Adjust the columns if necessary and schedule
	    # some operations for execution at idle time
	    #
	    if {$colWidthsChanged} {
		adjustColumns $win $colIdxList 1
	    }
	    showLineNumbersWhenIdle $win
	    updateViewWhenIdle $win
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::doRowCget
#
# Returns the value of the row configuration option opt for the row'th row of
# the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::doRowCget {row win opt} {
    upvar ::tablelist::ns${win}::data data
    set item [lindex $data(itemList) $row]

    switch -- $opt {
	-text {
	    return [lrange $item 0 $data(lastCol)]
	}

	-elide -
	-hide {
	    set key [lindex $item end]
	    if {[info exists data($key$opt)]} {
		return $data($key$opt)
	    } else {
		return 0
	    }
	}

	-selectable {
	    set key [lindex $item end]
	    if {[info exists data($key$opt)]} {
		return $data($key$opt)
	    } else {
		return 1
	    }
	}

	default {
	    set key [lindex $item end]
	    if {[info exists data($key$opt)]} {
		return $data($key$opt)
	    } else {
		return ""
	    }
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::doCellConfig
#
# Applies the value val of the cell configuration option opt to the cell
# row,col of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::doCellConfig {row col win opt val} {
    variable canElide
    variable snipSides
    upvar ::tablelist::ns${win}::data data

    set w $data(body)

    switch -- $opt {
	-background -
	-foreground {
	    set key [lindex $data(keyList) $row]
	    set name $key,$col$opt

	    if {[string length $val] == 0} {
		if {[info exists data($name)]} {
		    unset data($name)
		}
	    } else {
		#
		# Configure the tag cell$opt-$val in the body text widget
		#
		set tag cell$opt-$val
		$w tag configure $tag $opt $val
		$w tag lower $tag disabled

		#
		# Save val in data($name)
		#
		set data($name) $val
	    }

	    if {!$data(isDisabled)} {
		updateColorsWhenIdle $win
	    }
	}

	-editable {
	    #
	    # Save the boolean value specified by val in data($key,$col$opt)
	    # and invoke the motion handler if necessary
	    #
	    set key [lindex $data(keyList) $row]
	    set data($key,$col$opt) [expr {$val ? 1 : 0}]
	    if {$data(-showeditcursor)} {
		invokeMotionHandler $win
	    }
	}

	-editwindow {
	    variable editWin
	    if {[info exists editWin($val-creationCmd)]} {
		set key [lindex $data(keyList) $row]
		set data($key,$col$opt) $val
	    } else {
		return -code error "name \"$val\" is not registered\
				    for interactive cell editing"
	    }
	}

	-font {
	    #
	    # Save the current cell font
	    #
	    set item [lindex $data(itemList) $row]
	    set key [lindex $item end]
	    set name $key,$col$opt
	    set oldCellFont [getCellFont $win $key $col]

	    if {[info exists data($name)] &&
		(!$data($col-hide) || $canElide)} {
		#
		# 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
	    }

	    if {[string length $val] == 0} {
		if {[info exists data($name)]} {
		    unset data($name)
		    incr data(cellTagRefCount) -1
		}
	    } else {
		#
		# Configure the tag cell$opt-$val in the body text widget
		#
		set tag cell$opt-$val
		$w tag configure $tag $opt $val
		$w tag lower $tag disabled

		if {!$data($col-hide) || $canElide} {
		    #
		    # Apply the tag to the given cell
		    #
		    findTabs $win [expr {$row + 1}] $col $col tabIdx1 tabIdx2
		    $w tag add $tag $tabIdx1 $tabIdx2+1c
		}

		#
		# Save val in data($name)
		#
		if {![info exists data($name)]} {
		    incr data(cellTagRefCount)
		}
		set data($name) $val
	    }

	    #
	    # Adjust the cell text and the image or window width
	    #
	    set text [lindex $item $col]
	    if {[lindex $data(fmtCmdFlagList) $col]} {
		set text [formatElem $win $key $row $col $text]
	    }
	    if {[string match "*\t*" $text]} {
		set text [mapTabs $text]
	    }
	    set multiline [string match "*\n*" $text]
	    set cellFont [getCellFont $win $key $col]
	    set pixels [lindex $data(colList) [expr {2*$col}]]
	    set workPixels $pixels
	    if {$pixels == 0} {			;# convention: dynamic width
		set textSav $text
		getAuxData $win $key $col auxType auxWidthSav
		getIndentData $win $key $col indentWidthSav

		if {$data($col-maxPixels) > 0} {
		    if {$data($col-reqPixels) > $data($col-maxPixels)} {
			set workPixels $data($col-maxPixels)
		    }
		}
	    }
	    set aux [getAuxData $win $key $col auxType auxWidth $workPixels]
	    set indent [getIndentData $win $key $col indentWidth]
	    set maxTextWidth $workPixels
	    if {$workPixels != 0} {
		incr workPixels $data($col-delta)
		set maxTextWidth \
		    [getMaxTextWidth $workPixels $auxWidth $indentWidth]

		if {$data($col-wrap) && !$multiline} {
		    if {[font measure $cellFont -displayof $win $text] >
			$maxTextWidth} {
			set multiline 1
		    }
		}
	    }
	    set alignment [lindex $data(colList) [expr {2*$col + 1}]]
	    set snipSide $snipSides($alignment,$data($col-changesnipside))
	    if {$multiline} {
		set list [split $text "\n"]
		if {$data($col-wrap)} {
		    set snipSide ""
		}
		adjustMlElem $win list auxWidth indentWidth $cellFont \
			     $workPixels $snipSide $data(-snipstring)
		set msgScript [list ::tablelist::displayText $win $key \
			       $col [join $list "\n"] $cellFont \
			       $maxTextWidth $alignment]
	    } else {
		adjustElem $win text auxWidth indentWidth $cellFont \
			   $workPixels $snipSide $data(-snipstring)
	    }

	    if {!$data($col-hide)} {
		if {$row == $data(editRow) && $col == $data(editCol)} {
		    #
		    # Configure the edit window
		    #
		    setEditWinFont $win
		} else {
		    #
		    # Update the text widget's contents between the two tabs
		    #
		    findTabs $win [expr {$row + 1}] $col $col tabIdx1 tabIdx2
		    if {$multiline} {
			updateMlCell $w $tabIdx1+1c $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]
		    }
		}
	    }

	    #
	    # Adjust the columns if necessary
	    #
	    if {$pixels == 0 && ![info exists data($key-elide)] &&
		![info exists data($key-hide)]} {
		set text $textSav
		set auxWidth $auxWidthSav
		set indentWidth $indentWidthSav
		set newElemWidth [getElemWidth $win $text $auxWidth \
				  $indentWidth $cellFont]
		if {$newElemWidth > $data($col-elemWidth)} {
		    set data($col-elemWidth) $newElemWidth
		    set data($col-widestCount) 1
		    if {$newElemWidth > $data($col-reqPixels)} {
			set data($col-reqPixels) $newElemWidth
			adjustColumns $win {} 1
		    }
		} else {
		    set oldElemWidth [getElemWidth $win $text $auxWidth \
				      $indentWidth $oldCellFont]
		    if {$oldElemWidth < $data($col-elemWidth) &&
			$newElemWidth == $data($col-elemWidth)} {
			incr data($col-widestCount)
		    } elseif {$oldElemWidth == $data($col-elemWidth) &&
			      $newElemWidth < $oldElemWidth &&
			      [incr data($col-widestCount) -1] == 0} {
			adjustColumns $win $col 1
		    }
		}
	    }

	    updateViewWhenIdle $win
	}

	-image {
	    if {$data(isDisabled)} {
		return ""
	    }

	    #
	    # Save the old image or window width
	    #
	    set item [lindex $data(itemList) $row]
	    set key [lindex $item end]
	    set name $key,$col$opt
	    getAuxData $win $key $col oldAuxType oldAuxWidth

	    #
	    # Delete data($name) or save the specified value in it
	    #
	    set imgLabel $w.img_$key,$col
	    if {[string length $val] == 0} {
		if {[info exists data($name)]} {
		    unset data($name)
		    incr data(imgCount) -1
		    destroy $imgLabel
		}
	    } else {
		if {![info exists data($name)]} {
		    incr data(imgCount)
		}
		if {[winfo exists $imgLabel] &&
		    [string compare $val $data($name)] != 0} {
		    destroy $imgLabel
		}
		set data($name) $val
	    }

	    #
	    # Adjust the cell text and the image or window width
	    #
	    set pixels [lindex $data(colList) [expr {2*$col}]]
	    set workPixels $pixels
	    set text [lindex $item $col]
	    if {[lindex $data(fmtCmdFlagList) $col]} {
		set text [formatElem $win $key $row $col $text]
	    }
	    if {[string match "*\t*" $text]} {
		set text [mapTabs $text]
	    }
	    set oldText $text
	    set multiline [string match "*\n*" $text]
	    set cellFont [getCellFont $win $key $col]
	    if {$pixels == 0} {			;# convention: dynamic width
		set textSav $text
		getAuxData $win $key $col auxType auxWidthSav
		getIndentData $win $key $col indentWidthSav

		if {$data($col-maxPixels) > 0} {
		    if {$data($col-reqPixels) > $data($col-maxPixels)} {
			set workPixels $data($col-maxPixels)
		    }
		}
	    }
	    set aux [getAuxData $win $key $col auxType auxWidth $workPixels]
	    set indent [getIndentData $win $key $col indentWidth]
	    set maxTextWidth $workPixels
	    if {$workPixels != 0} {
		incr workPixels $data($col-delta)
		set maxTextWidth \
		    [getMaxTextWidth $workPixels $auxWidth $indentWidth]

		if {$data($col-wrap) && !$multiline} {
		    if {[font measure $cellFont -displayof $win $text] >
			$maxTextWidth} {
			set multiline 1
		    }
		}
	    }
	    set alignment [lindex $data(colList) [expr {2*$col + 1}]]
	    set snipSide $snipSides($alignment,$data($col-changesnipside))
	    if {$multiline} {
		set list [split $text "\n"]
		if {$data($col-wrap)} {
		    set snipSide ""
		}
		adjustMlElem $win list auxWidth indentWidth $cellFont \
			     $workPixels $snipSide $data(-snipstring)
		set msgScript [list ::tablelist::displayText $win $key \
			       $col [join $list "\n"] $cellFont \
			       $maxTextWidth $alignment]
	    } else {
		adjustElem $win text auxWidth indentWidth $cellFont \
			   $workPixels $snipSide $data(-snipstring)
	    }

	    if {(!$data($col-hide) || $canElide) &&
		!($row == $data(editRow) && $col == $data(editCol))} {
		#
		# Delete the old cell contents between the two tabs,
		# and insert the text and the auxiliary object
		#
		findTabs $win [expr {$row + 1}] $col $col tabIdx1 tabIdx2
		if {$multiline} {
		    updateMlCell $w $tabIdx1+1c $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]
		}
	    }

	    #
	    # Adjust the columns if necessary
	    #
	    if {$pixels == 0 && ![info exists data($key-elide)] &&
		![info exists data($key-hide)]} {
		set text $textSav
		set auxWidth $auxWidthSav
		set indentWidth $indentWidthSav
		set newElemWidth [getElemWidth $win $text $auxWidth \
				  $indentWidth $cellFont]
		if {$newElemWidth > $data($col-elemWidth)} {
		    set data($col-elemWidth) $newElemWidth
		    set data($col-widestCount) 1
		    if {$newElemWidth > $data($col-reqPixels)} {
			set data($col-reqPixels) $newElemWidth
			adjustColumns $win {} 1
		    }
		} else {
		    set oldElemWidth [getElemWidth $win $oldText $oldAuxWidth \
				      $indentWidth $cellFont]
		    if {$oldElemWidth < $data($col-elemWidth) &&
			$newElemWidth == $data($col-elemWidth)} {
			incr data($col-widestCount)
		    } elseif {$oldElemWidth == $data($col-elemWidth) &&
			      $newElemWidth < $oldElemWidth &&
			      [incr data($col-widestCount) -1] == 0} {
			adjustColumns $win $col 1
		    }
		}
	    }

	    updateViewWhenIdle $win
	}

	-indent {
	    if {$data(isDisabled)} {
		return ""
	    }

	    #
	    # Save the old indentation width
	    #
	    set item [lindex $data(itemList) $row]
	    set key [lindex $item end]
	    set name $key,$col$opt
	    getIndentData $win $key $col oldIndentWidth

	    #
	    # Delete data($name) or save the specified value in it
	    #
	    set indentLabel $w.ind_$key,$col
	    if {[string length $val] == 0} {
		if {[info exists data($name)]} {
		    unset data($name)
		    incr data(indentCount) -1
		    destroy $indentLabel
		}
	    } else {
		if {![info exists data($name)]} {
		    incr data(indentCount)
		}
		if {[winfo exists $indentLabel] &&
		    [string compare $val $data($name)] != 0} {
		    destroy $indentLabel
		}
		set data($name) $val
	    }

	    #
	    # Adjust the cell text and the image or window width
	    #
	    set pixels [lindex $data(colList) [expr {2*$col}]]
	    set workPixels $pixels
	    set text [lindex $item $col]
	    if {[lindex $data(fmtCmdFlagList) $col]} {
		set text [formatElem $win $key $row $col $text]
	    }
	    if {[string match "*\t*" $text]} {
		set text [mapTabs $text]
	    }
	    set oldText $text
	    set multiline [string match "*\n*" $text]
	    set cellFont [getCellFont $win $key $col]
	    if {$pixels == 0} {			;# convention: dynamic width
		set textSav $text
		getAuxData $win $key $col auxType auxWidthSav
		getIndentData $win $key $col indentWidthSav

		if {$data($col-maxPixels) > 0} {
		    if {$data($col-reqPixels) > $data($col-maxPixels)} {
			set workPixels $data($col-maxPixels)
		    }
		}
	    }
	    set aux [getAuxData $win $key $col auxType auxWidth $workPixels]
	    set indent [getIndentData $win $key $col indentWidth]
	    set maxTextWidth $workPixels
	    if {$workPixels != 0} {
		incr workPixels $data($col-delta)
		set maxTextWidth \
		    [getMaxTextWidth $workPixels $auxWidth $indentWidth]

		if {$data($col-wrap) && !$multiline} {
		    if {[font measure $cellFont -displayof $win $text] >
			$maxTextWidth} {
			set multiline 1
		    }
		}
	    }
	    set alignment [lindex $data(colList) [expr {2*$col + 1}]]
	    set snipSide $snipSides($alignment,$data($col-changesnipside))
	    if {$multiline} {
		set list [split $text "\n"]
		if {$data($col-wrap)} {
		    set snipSide ""
		}
		adjustMlElem $win list auxWidth indentWidth $cellFont \
			     $workPixels $snipSide $data(-snipstring)
		set msgScript [list ::tablelist::displayText $win $key \
			       $col [join $list "\n"] $cellFont \
			       $maxTextWidth $alignment]
	    } else {
		adjustElem $win text auxWidth indentWidth $cellFont \
			   $workPixels $snipSide $data(-snipstring)
	    }

	    if {(!$data($col-hide) || $canElide) &&
		!($row == $data(editRow) && $col == $data(editCol))} {
		#
		# Delete the old cell contents between the two tabs,
		# and insert the text and the auxiliary object
		#
		findTabs $win [expr {$row + 1}] $col $col tabIdx1 tabIdx2
		if {$multiline} {
		    updateMlCell $w $tabIdx1+1c $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]
		}
	    }

	    #
	    # Adjust the columns if necessary
	    #
	    if {$pixels == 0 && ![info exists data($key-elide)] &&
		![info exists data($key-hide)]} {
		set text $textSav
		set auxWidth $auxWidthSav
		set indentWidth $indentWidthSav
		set newElemWidth [getElemWidth $win $text $auxWidth \
				  $indentWidth $cellFont]
		if {$newElemWidth > $data($col-elemWidth)} {
		    set data($col-elemWidth) $newElemWidth
		    set data($col-widestCount) 1
		    if {$newElemWidth > $data($col-reqPixels)} {
			set data($col-reqPixels) $newElemWidth
			adjustColumns $win {} 1
		    }
		} else {
		    set oldElemWidth [getElemWidth $win $oldText $auxWidth \
				      $oldIndentWidth $cellFont]
		    if {$oldElemWidth < $data($col-elemWidth) &&
			$newElemWidth == $data($col-elemWidth)} {
			incr data($col-widestCount)
		    } elseif {$oldElemWidth == $data($col-elemWidth) &&
			      $newElemWidth < $oldElemWidth &&
			      [incr data($col-widestCount) -1] == 0} {
			adjustColumns $win $col 1
		    }
		}
	    }

	    updateViewWhenIdle $win
	}

	-selectbackground -
	-selectforeground {
	    set key [lindex $data(keyList) $row]
	    set name $key,$col$opt

	    if {[string length $val] == 0} {
		if {[info exists data($name)]} {
		    unset data($name)
		}
	    } else {
		#
		# Configure the tag cell$opt-$val in the body text widget
		#
		set tag cell$opt-$val
		set optTail [string range $opt 7 end]	;# remove the -select
		$w tag configure $tag -$optTail $val
		$w tag lower $tag disabled

		#
		# Save val in data($name)
		#
		set data($name) $val
	    }

	    if {!$data(isDisabled)} {
		updateColorsWhenIdle $win
	    }
	}

	-stretchwindow {
	    #
	    # Save the boolean value specified by val in data($key,$col$opt)
	    #
	    set item [lindex $data(itemList) $row]
	    set key [lindex $item end]
	    set name $key,$col$opt
	    if {$val} {
		set data($name) 1
	    } elseif {[info exists data($name)]} {
		unset data($name)
	    }

	    if {($data($col-hide) && !$canElide) ||
		($row == $data(editRow) && $col == $data(editCol))} {
		return ""
	    }

	    set pixels [lindex $data(colList) [expr {2*$col}]]
	    set text [lindex $item $col]
	    if {[lindex $data(fmtCmdFlagList) $col]} {
		set text [formatElem $win $key $row $col $text]
	    }
	    if {[string match "*\t*" $text]} {
		set text [mapTabs $text]
	    }
	    set multiline [string match "*\n*" $text]
	    set cellFont [getCellFont $win $key $col]
	    if {$pixels == 0} {			;# convention: dynamic width
		if {$data($col-maxPixels) > 0} {
		    if {$data($col-reqPixels) > $data($col-maxPixels)} {
			set pixels $data($col-maxPixels)
		    }
		}
	    }
	    set aux [getAuxData $win $key $col auxType auxWidth $pixels]
	    set indent [getIndentData $win $key $col indentWidth]
	    set maxTextWidth $pixels
	    if {$pixels != 0} {
		incr pixels $data($col-delta)
		set maxTextWidth \
		    [getMaxTextWidth $pixels $auxWidth $indentWidth]

		if {$data($col-wrap) && !$multiline} {
		    if {[font measure $cellFont -displayof $win $text] >
			$maxTextWidth} {
			set multiline 1
		    }
		}
	    }
	    if {$auxType < 2} {			;# no window
		return ""
	    }

	    #
	    # Adjust the cell text and the window width
	    #
	    set alignment [lindex $data(colList) [expr {2*$col + 1}]]
	    set snipSide $snipSides($alignment,$data($col-changesnipside))
	    if {$multiline} {
		set list [split $text "\n"]
		if {$data($col-wrap)} {
		    set snipSide ""
		}
		adjustMlElem $win list auxWidth indentWidth $cellFont \
			     $pixels $snipSide $data(-snipstring)
		set msgScript [list ::tablelist::displayText $win $key $row \
			       [join $list "\n"] $cellFont \
			       $maxTextWidth $alignment]
	    } else {
		adjustElem $win text auxWidth indentWidth $cellFont \
			   $pixels $snipSide $data(-snipstring)
	    }

	    #
	    # Update the text widget's contents between the two tabs
	    #
	    findTabs $win [expr {$row + 1}] $col $col tabIdx1 tabIdx2
	    if {$multiline} {
		updateMlCell $w $tabIdx1+1c $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]
	    }
	}

	-text {
	    if {$data(isDisabled)} {
		return ""
	    }

	    set pixels [lindex $data(colList) [expr {2*$col}]]
	    set workPixels $pixels
	    set text $val
	    set oldItem [lindex $data(itemList) $row]
	    set key [lindex $oldItem end]
	    set fmtCmdFlag [lindex $data(fmtCmdFlagList) $col]
	    if {$fmtCmdFlag} {
		set text [formatElem $win $key $row $col $text]
	    }
	    if {[string match "*\t*" $text]} {
		set text [mapTabs $text]
	    }
	    set textSav $text
	    set multiline [string match "*\n*" $text]
	    set cellFont [getCellFont $win $key $col]
	    if {$pixels == 0} {			;# convention: dynamic width
		getAuxData $win $key $col auxType auxWidthSav
		getIndentData $win $key $col indentWidthSav

		if {$data($col-maxPixels) > 0} {
		    if {$data($col-reqPixels) > $data($col-maxPixels)} {
			set workPixels $data($col-maxPixels)
		    }
		}
	    }
	    set aux [getAuxData $win $key $col auxType auxWidth $workPixels]
	    set indent [getIndentData $win $key $col indentWidth]
	    set maxTextWidth $workPixels
	    if {$workPixels != 0} {
		incr workPixels $data($col-delta)
		set maxTextWidth \
		    [getMaxTextWidth $workPixels $auxWidth $indentWidth]

		if {$data($col-wrap) && !$multiline} {
		    if {[font measure $cellFont -displayof $win $text] >
			$maxTextWidth} {
			set multiline 1
		    }
		}
	    }
	    set alignment [lindex $data(colList) [expr {2*$col + 1}]]

	    #
	    # Adjust the cell text and the image or window width
	    #
	    set snipSide $snipSides($alignment,$data($col-changesnipside))
	    if {$multiline} {
		set list [split $text "\n"]
		if {$data($col-wrap)} {
		    set snipSide ""
		}
		adjustMlElem $win list auxWidth indentWidth $cellFont \
			     $workPixels $snipSide $data(-snipstring)
		set msgScript [list ::tablelist::displayText $win $key \
			       $col [join $list "\n"] $cellFont \
			       $maxTextWidth $alignment]
	    } else {
		adjustElem $win text auxWidth indentWidth $cellFont \
			   $workPixels $snipSide $data(-snipstring)
	    }

	    if {(!$data($col-hide) || $canElide) &&
		!($row == $data(editRow) && $col == $data(editCol))} {
		#
		# Update the text widget's contents between the two tabs
		#
		findTabs $win [expr {$row + 1}] $col $col tabIdx1 tabIdx2
		if {$multiline} {
		    updateMlCell $w $tabIdx1+1c $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]
		}
	    }

	    #
	    # Replace the cell contents in the internal list
	    #
	    set newItem [lreplace $oldItem $col $col $val]
	    set data(itemList) [lreplace $data(itemList) $row $row $newItem]

	    #
	    # Replace the cell contents in the list variable if present
	    #
	    if {$data(hasListVar)} {
		upvar #0 $data(-listvariable) var
		trace vdelete var wu $data(listVarTraceCmd)
		set var [lreplace $var $row $row \
			 [lrange $newItem 0 $data(lastCol)]]
		trace variable var wu $data(listVarTraceCmd)
	    }

	    #
	    # Adjust the columns if necessary
	    #
	    if {$pixels == 0 && ![info exists data($key-elide)] &&
		![info exists data($key-hide)]} {
		set text $textSav
		set auxWidth $auxWidthSav
		set indentWidth $indentWidthSav
		set newElemWidth [getElemWidth $win $text $auxWidth \
				  $indentWidth $cellFont]
		if {$newElemWidth > $data($col-elemWidth)} {
		    set data($col-elemWidth) $newElemWidth
		    set data($col-widestCount) 1
		    if {$newElemWidth > $data($col-reqPixels)} {
			set data($col-reqPixels) $newElemWidth
			adjustColumns $win {} 1
		    }
		} else {
		    set oldText [lindex $oldItem $col]
		    if {$fmtCmdFlag} {
			set oldText [formatElem $win $key $row $col $oldText]
		    }
		    if {[string match "*\t*" $oldText]} {
			set oldText [mapTabs $oldText]
		    }
		    set oldElemWidth [getElemWidth $win $oldText $auxWidth \
				      $indentWidth $cellFont]
		    if {$oldElemWidth < $data($col-elemWidth) &&
			$newElemWidth == $data($col-elemWidth)} {
			incr data($col-widestCount)
		    } elseif {$oldElemWidth == $data($col-elemWidth) &&
			      $newElemWidth < $oldElemWidth &&
			      [incr data($col-widestCount) -1] == 0} {
			adjustColumns $win $col 1
		    }
		}
	    }

	    showLineNumbersWhenIdle $win
	    updateViewWhenIdle $win
	}

	-valign {
	    #
	    # Save the properly formatted value of val in
	    # data($key,$col$opt) and redisplay the cell
	    #
	    variable valignments
	    set val [mwutil::fullOpt "vertical alignment" $val $valignments]
	    set key [lindex $data(keyList) $row]
	    set data($key,$col$opt) $val
	    redisplayCol $win $col $row $row
	}

	-window {
	    if {$data(isDisabled)} {
		return ""
	    }

	    #
	    # Save the old image or window width
	    #
	    set item [lindex $data(itemList) $row]
	    set key [lindex $item end]
	    set name $key,$col$opt
	    getAuxData $win $key $col oldAuxType oldAuxWidth
	    getIndentData $win $key $col oldIndentWidth

	    #
	    # Delete data($name) or save the specified value in it
	    #
	    set aux $w.frm_$key,$col
	    if {[string length $val] == 0} {
		if {[info exists data($name)]} {
		    unset data($name)
		    unset data($key,$col-reqWidth)
		    unset data($key,$col-reqHeight)

		    #
		    # If the cell index is contained in the list
		    # data(cellsToReconfig) then remove it from the list
		    #
		    set n [lsearch -exact $data(cellsToReconfig) $row,$col]
		    if {$n >= 0} {
			set data(cellsToReconfig) \
			    [lreplace $data(cellsToReconfig) $n $n]
		    }
		    incr data(winCount) -1
		    destroy $aux
		}
	    } else {
		if {![info exists data($name)]} {
		    incr data(winCount)
		}
		if {[info exists data($name)] &&
		    [string compare $val $data($name)] != 0} {
		    destroy $aux
		}
		if {![winfo exists $aux]} {
		    #
		    # Create the frame and evaluate the specified script
		    # that creates a child widget within the frame
		    #
		    tk::frame $aux -borderwidth 0 -class TablelistWindow \
				   -container 0 -highlightthickness 0 \
				   -relief flat -takefocus 0
		    catch {$aux configure -padx 0 -pady 0}
		    bindtags $aux [linsert [bindtags $aux] 1 \
				   $data(bodyTag) TablelistBody]
		    uplevel #0 $val [list $win $row $col $aux.w]
		}
		set data($name) $val
		set data($key,$col-reqWidth) [winfo reqwidth $aux.w]
		set data($key,$col-reqHeight) [winfo reqheight $aux.w]
		$aux configure -height $data($key,$col-reqHeight)

		#
		# Add the cell index to the list data(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
		    if {![info exists data(reconfigId)]} {
			set data(reconfigId) \
			    [after idle [list tablelist::reconfigWindows $win]]
		    }
		}
	    }

	    #
	    # Adjust the cell text and the image or window width
	    #
	    set pixels [lindex $data(colList) [expr {2*$col}]]
	    set workPixels $pixels
	    set text [lindex $item $col]
	    if {[lindex $data(fmtCmdFlagList) $col]} {
		set text [formatElem $win $key $row $col $text]
	    }
	    if {[string match "*\t*" $text]} {
		set text [mapTabs $text]
	    }
	    set oldText $text
	    set multiline [string match "*\n*" $text]
	    set cellFont [getCellFont $win $key $col]
	    if {$pixels == 0} {			;# convention: dynamic width
		set textSav $text
		getAuxData $win $key $col auxType auxWidthSav
		getIndentData $win $key $col indentWidthSav

		if {$data($col-maxPixels) > 0} {
		    if {$data($col-reqPixels) > $data($col-maxPixels)} {
			set workPixels $data($col-maxPixels)
		    }
		}
	    }
	    set aux [getAuxData $win $key $col auxType auxWidth $workPixels]
	    set indent [getIndentData $win $key $col indentWidth]
	    set maxTextWidth $workPixels
	    if {$workPixels != 0} {
		incr workPixels $data($col-delta)
		set maxTextWidth \
		    [getMaxTextWidth $workPixels $auxWidth $indentWidth]

		if {$data($col-wrap) && !$multiline} {
		    if {[font measure $cellFont -displayof $win $text] >
			$maxTextWidth} {
			set multiline 1
		    }
		}
	    }
	    set alignment [lindex $data(colList) [expr {2*$col + 1}]]
	    set snipSide $snipSides($alignment,$data($col-changesnipside))
	    if {$multiline} {
		set list [split $text "\n"]
		if {$data($col-wrap)} {
		    set snipSide ""
		}
		adjustMlElem $win list auxWidth indentWidth $cellFont \
			     $workPixels $snipSide $data(-snipstring)
		set msgScript [list ::tablelist::displayText $win $key \
			       $col [join $list "\n"] $cellFont \
			       $maxTextWidth $alignment]
	    } else {
		adjustElem $win text auxWidth indentWidth $cellFont \
			   $workPixels $snipSide $data(-snipstring)
	    }

	    if {(!$data($col-hide) || $canElide) &&
		!($row == $data(editRow) && $col == $data(editCol))} {
		#
		# Delete the old cell contents between the two tabs,
		# and insert the text and the auxiliary object
		#
		findTabs $win [expr {$row + 1}] $col $col tabIdx1 tabIdx2
		if {$multiline} {
		    updateMlCell $w $tabIdx1+1c $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]
		}
	    }

	    #
	    # Adjust the columns if necessary
	    #
	    if {$pixels == 0 && ![info exists data($key-elide)] &&
		![info exists data($key-hide)]} {
		set text $textSav
		set auxWidth $auxWidthSav
		set indentWidth $indentWidthSav
		set newElemWidth [getElemWidth $win $text $auxWidth \
				  $indentWidth $cellFont]
		if {$newElemWidth > $data($col-elemWidth)} {
		    set data($col-elemWidth) $newElemWidth
		    set data($col-widestCount) 1
		    if {$newElemWidth > $data($col-reqPixels)} {
			set data($col-reqPixels) $newElemWidth
			adjustColumns $win {} 1
		    }
		} else {
		    set oldElemWidth [getElemWidth $win $oldText $oldAuxWidth \
				      $oldIndentWidth $cellFont]
		    if {$oldElemWidth < $data($col-elemWidth) &&
			$newElemWidth == $data($col-elemWidth)} {
			incr data($col-widestCount)
		    } elseif {$oldElemWidth == $data($col-elemWidth) &&
			      $newElemWidth < $oldElemWidth &&
			      [incr data($col-widestCount) -1] == 0} {
			adjustColumns $win $col 1
		    }
		}
	    }

	    updateViewWhenIdle $win
	}

	-windowdestroy -
	-windowupdate {
	    set key [lindex $data(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
	    }
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::doCellCget
#
# Returns the value of the cell configuration option opt for the cell row,col
# of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::doCellCget {row col win opt} {
    switch -- $opt {
	-editable {
	    return [isCellEditable $win $row $col]
	}

	-editwindow {
	    return [getEditWindow $win $row $col]
	}

	-stretchwindow {
	    upvar ::tablelist::ns${win}::data data
	    set key [lindex $data(keyList) $row]
	    if {[info exists data($key,$col$opt)]} {
		return $data($key,$col$opt)
	    } else {
		return 0
	    }
	}

	-text {
	    upvar ::tablelist::ns${win}::data data
	    return [lindex [lindex $data(itemList) $row] $col]
	}

	-valign {
	    upvar ::tablelist::ns${win}::data data
	    set key [lindex $data(keyList) $row]
	    return [getVAlignment $win $key $col]
	}

	default {
	    upvar ::tablelist::ns${win}::data data
	    set key [lindex $data(keyList) $row]
	    if {[info exists data($key,$col$opt)]} {
		return $data($key,$col$opt)
	    } else {
		return ""
	    }
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::makeListVar
#
# Arranges for the global variable specified by varName to become the list
# variable associated with the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::makeListVar {win varName} {
    upvar ::tablelist::ns${win}::data data
    if {[string length $varName] == 0} {
	#
	# If there is an old list variable associated with the
	# widget then remove the trace set on this variable
	#
	if {$data(hasListVar)} {
	    synchronize $win
	    upvar #0 $data(-listvariable) var
	    trace vdelete var wu $data(listVarTraceCmd)
	}
	return ""
    }

    #
    # The list variable may be an array element but must not be an array
    #
    if {![regexp {^(.*)\((.*)\)$} $varName dummy name1 name2]} {
	if {[array exists $varName]} {
	    return -code error "variable \"$varName\" is array"
	}
	set name1 $varName
	set name2 ""
    }

    #
    # If there is an old list variable associated with the
    # widget then remove the trace set on this variable
    #
    if {$data(hasListVar)} {
	synchronize $win
	upvar #0 $data(-listvariable) var
	trace vdelete var wu $data(listVarTraceCmd)
    }

    upvar #0 $varName var
    if {[info exists var]} {
	#
	# Invoke the trace procedure associated with the new list variable
	#
	listVarTrace $win $name1 $name2 w
    } else {
	#
	# Set $varName according to the value of data(itemList)
	#
	set var {}
	foreach item $data(itemList) {
	    lappend var [lrange $item 0 $data(lastCol)]
	}
    }

    #
    # Set a trace on the new list variable
    #
    trace variable var wu $data(listVarTraceCmd)
}

#------------------------------------------------------------------------------
# tablelist::isRowViewable
#
# Checks whether the given row of the tablelist widget win is viewable.
#------------------------------------------------------------------------------
proc tablelist::isRowViewable {win row} {
    upvar ::tablelist::ns${win}::data data
    set key [lindex $data(keyList) $row]
    return [expr {![info exists data($key-elide)] &&
		  ![info exists data($key-hide)]}]
}

#------------------------------------------------------------------------------
# tablelist::getCellFont
#
# Returns the font to be used in the tablelist cell specified by win, key, and
# col.
#------------------------------------------------------------------------------
proc tablelist::getCellFont {win key col} {
    upvar ::tablelist::ns${win}::data data
    if {[info exists data($key,$col-font)]} {
	return $data($key,$col-font)
    } elseif {[info exists data($key-font)]} {
	return $data($key-font)
    } else {
	return [lindex $data(colFontList) $col]
    }
}

#------------------------------------------------------------------------------
# tablelist::reconfigWindows
#
# Invoked as an after idle callback, this procedure forces any geometry manager
# calculations to be completed and then applies the -window option a second
# time to those cells whose embedded windows' requested widths or heights were
# still unknown.
#------------------------------------------------------------------------------
proc tablelist::reconfigWindows win {
    #
    # Force any geometry manager calculations to be completed first
    #
    update idletasks
    if {![array exists ::tablelist::ns${win}::data]} {
	return ""
    }

    #
    # Reconfigure the cells specified in the list data(cellsToReconfig)
    #
    upvar ::tablelist::ns${win}::data data
    foreach cellIdx $data(cellsToReconfig) {
	foreach {row col} [split $cellIdx ","] {}
	set key [lindex $data(keyList) $row]
	if {[info exists data($key,$col-window)]} {
	    doCellConfig $row $col $win -window $data($key,$col-window)
	}
    }

    unset data(reconfigId)
    set data(cellsToReconfig) {}
}

#------------------------------------------------------------------------------
# tablelist::isCellEditable
#
# Checks whether the given cell of the tablelist widget win is editable.
#------------------------------------------------------------------------------
proc tablelist::isCellEditable {win row col} {
    upvar ::tablelist::ns${win}::data data
    set key [lindex $data(keyList) $row]
    if {[info exists data($key,$col-editable)]} {
	return $data($key,$col-editable)
    } else {
	return $data($col-editable)
    }
}

#------------------------------------------------------------------------------
# tablelist::getEditWindow
#
# Returns the value of the -editwindow option at cell or column level for the
# given cell of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::getEditWindow {win row col} {
    upvar ::tablelist::ns${win}::data data
    set key [lindex $data(keyList) $row]
    if {[info exists data($key,$col-editwindow)]} {
	return $data($key,$col-editwindow)
    } elseif {[info exists data($col-editwindow)]} {
	return $data($col-editwindow)
    } else {
	return "entry"
    }
}

#------------------------------------------------------------------------------
# tablelist::getVAlignment
#
# Returns the value of the -valign option at cell or column level for the given
# cell of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::getVAlignment {win key col} {
    upvar ::tablelist::ns${win}::data data
    if {[info exists data($key,$col-valign)]} {
	return $data($key,$col-valign)
    } else {
	return $data($col-valign)
    }
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/scripts/tablelistEdit.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
#==============================================================================
# Contains the implementation of interactive cell editing in tablelist widgets.
#
# Structure of the module:
#   - Namespace initialization
#   - Public procedures related to interactive cell editing
#   - Private procedures implementing the interactive cell editing
#   - Private procedures used in bindings related to interactive cell editing
#
# Copyright (c) 2003-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

#
# Namespace initialization
# ========================
#

namespace eval tablelist {
    #
    # Register the Tk core widgets entry, text, checkbutton,
    # menubutton, and spinbox for interactive cell editing
    #
    proc addTkCoreWidgets {} {
	set name entry
	array set ::tablelist::editWin [list \
	    $name-creationCmd	"$name %W -width 0" \
	    $name-putValueCmd	"%W delete 0 end; %W insert 0 %T" \
	    $name-getValueCmd	"%W get" \
	    $name-putTextCmd	"%W delete 0 end; %W insert 0 %T" \
	    $name-getTextCmd	"%W get" \
	    $name-putListCmd	"" \
	    $name-getListCmd	"" \
	    $name-selectCmd	"" \
	    $name-invokeCmd	"" \
	    $name-fontOpt	-font \
	    $name-useFormat	1 \
	    $name-useReqWidth	0 \
	    $name-usePadX	0 \
	    $name-isEntryLike	1 \
	    $name-focusWin	%W \
	    $name-reservedKeys	{Left Right} \
	]

	set name text
	array set ::tablelist::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-putTextCmd	"%W delete 1.0 end; %W insert 1.0 %T" \
	    $name-getTextCmd	"%W get 1.0 end-1c" \
	    $name-putListCmd	"" \
	    $name-getListCmd	"" \
	    $name-selectCmd	"" \
	    $name-invokeCmd	"" \
	    $name-fontOpt	-font \
	    $name-useFormat	1 \
	    $name-useReqWidth	0 \
	    $name-usePadX	0 \
	    $name-isEntryLike	1 \
	    $name-focusWin	%W \
	    $name-reservedKeys	{Left Right Up Down Prior Next
				 Control-Home Control-End Meta-b Meta-f
				 Control-p Control-n Meta-less Meta-greater} \
	]

	set name checkbutton
	array set ::tablelist::editWin [list \
	    $name-creationCmd	"createCheckbutton %W" \
	    $name-putValueCmd	{set [%W cget -variable] %T} \
	    $name-getValueCmd	{set [%W cget -variable]} \
	    $name-putTextCmd	{set [%W cget -variable] %T} \
	    $name-getTextCmd	{set [%W cget -variable]} \
	    $name-putListCmd	"" \
	    $name-getListCmd	"" \
	    $name-selectCmd	"" \
	    $name-invokeCmd	"%W invoke" \
	    $name-fontOpt	"" \
	    $name-useFormat	0 \
	    $name-useReqWidth	1 \
	    $name-usePadX	0 \
	    $name-isEntryLike	0 \
	    $name-focusWin	%W \
	    $name-reservedKeys	{} \
	]

	set name menubutton
	array set ::tablelist::editWin [list \
	    $name-creationCmd	"createMenubutton %W" \
	    $name-putValueCmd	{set [%W cget -textvariable] %T} \
	    $name-getValueCmd	"%W cget -text" \
	    $name-putTextCmd	{set [%W cget -textvariable] %T} \
	    $name-getTextCmd	"%W cget -text" \
	    $name-putListCmd	"" \
	    $name-getListCmd	"" \
	    $name-selectCmd	"" \
	    $name-invokeCmd	"event generate %W <space>" \
	    $name-fontOpt	-font \
	    $name-useFormat	1 \
	    $name-useReqWidth	0 \
	    $name-usePadX	1 \
	    $name-isEntryLike	0 \
	    $name-focusWin	%W \
	    $name-reservedKeys	{} \
	]

	if {$::tk_version < 8.4} {
	    return ""
	}

	set name spinbox
	array set ::tablelist::editWin [list \
	    $name-creationCmd	"$name %W -width 0" \
	    $name-putValueCmd	"%W delete 0 end; %W insert 0 %T" \
	    $name-getValueCmd	"%W get" \
	    $name-putTextCmd	"%W delete 0 end; %W insert 0 %T" \
	    $name-getTextCmd	"%W get" \
	    $name-putListCmd	"" \
	    $name-getListCmd	"" \
	    $name-selectCmd	"" \
	    $name-invokeCmd	"" \
	    $name-fontOpt	-font \
	    $name-useFormat	1 \
	    $name-useReqWidth	0 \
	    $name-usePadX	1 \
	    $name-isEntryLike	1 \
	    $name-focusWin	%W \
	    $name-reservedKeys	{Left Right Up Down} \
	]
    }
    addTkCoreWidgets 

    #
    # Register the tile widgets ttk::entry, ttk::spinbox,
    # ttk::combobox, and ttk::checkbutton for interactive cell editing
    #
    proc addTileWidgets {} {
	set name ttk::entry
	array set ::tablelist::editWin [list \
	    $name-creationCmd	"createTileEntry %W" \
	    $name-putValueCmd	"%W delete 0 end; %W insert 0 %T" \
	    $name-getValueCmd	"%W get" \
	    $name-putTextCmd	"%W delete 0 end; %W insert 0 %T" \
	    $name-getTextCmd	"%W get" \
	    $name-putListCmd	"" \
	    $name-getListCmd	"" \
	    $name-selectCmd	"" \
	    $name-invokeCmd	"" \
	    $name-fontOpt	-font \
	    $name-useFormat	1 \
	    $name-useReqWidth	0 \
	    $name-usePadX	0 \
	    $name-isEntryLike	1 \
	    $name-focusWin	%W \
	    $name-reservedKeys	{Left Right} \
	]

	set name ttk::spinbox
	array set ::tablelist::editWin [list \
	    $name-creationCmd	"createTileSpinbox %W" \
	    $name-putValueCmd	"%W delete 0 end; %W insert 0 %T" \
	    $name-getValueCmd	"%W get" \
	    $name-putTextCmd	"%W delete 0 end; %W insert 0 %T" \
	    $name-getTextCmd	"%W get" \
	    $name-putListCmd	"" \
	    $name-getListCmd	"" \
	    $name-selectCmd	"" \
	    $name-invokeCmd	"" \
	    $name-fontOpt	-font \
	    $name-useFormat	1 \
	    $name-useReqWidth	0 \
	    $name-usePadX	1 \
	    $name-isEntryLike	1 \
	    $name-focusWin	%W \
	    $name-reservedKeys	{Left Right Up Down} \
	]

	set name ttk::combobox
	array set ::tablelist::editWin [list \
	    $name-creationCmd	"createTileCombobox %W" \
	    $name-putValueCmd	"%W set %T" \
	    $name-getValueCmd	"%W get" \
	    $name-putTextCmd	"%W set %T" \
	    $name-getTextCmd	"%W get" \
	    $name-putListCmd	"" \
	    $name-getListCmd	"" \
	    $name-selectCmd	"" \
	    $name-invokeCmd	"event generate %W <Button-1>" \
	    $name-fontOpt	-font \
	    $name-useFormat	1 \
	    $name-useReqWidth	0 \
	    $name-usePadX	1 \
	    $name-isEntryLike	1 \
	    $name-focusWin	%W \
	    $name-reservedKeys	{Left Right Up Down} \
	]

	set name ttk::checkbutton
	array set ::tablelist::editWin [list \
	    $name-creationCmd	"createTileCheckbutton %W" \
	    $name-putValueCmd	{set [%W cget -variable] %T} \
	    $name-getValueCmd	{set [%W cget -variable]} \
	    $name-putTextCmd	{set [%W cget -variable] %T} \
	    $name-getTextCmd	{set [%W cget -variable]} \
	    $name-putListCmd	"" \
	    $name-getListCmd	"" \
	    $name-selectCmd	"" \
	    $name-invokeCmd	{%W instate !pressed {%W invoke}} \
	    $name-fontOpt	"" \
	    $name-useFormat	0 \
	    $name-useReqWidth	1 \
	    $name-usePadX	0 \
	    $name-isEntryLike	0 \
	    $name-focusWin	%W \
	    $name-reservedKeys	{} \
	]

	set name ttk::menubutton
	array set ::tablelist::editWin [list \
	    $name-creationCmd	"createTileMenubutton %W" \
	    $name-putValueCmd	{set [%W cget -textvariable] %T} \
	    $name-getValueCmd	"%W cget -text" \
	    $name-putTextCmd	{set [%W cget -textvariable] %T} \
	    $name-getTextCmd	"%W cget -text" \
	    $name-putListCmd	"" \
	    $name-getListCmd	"" \
	    $name-selectCmd	"" \
	    $name-invokeCmd	"event generate %W <space>" \
	    $name-fontOpt	"" \
	    $name-useFormat	1 \
	    $name-useReqWidth	0 \
	    $name-usePadX	1 \
	    $name-isEntryLike	0 \
	    $name-focusWin	%W \
	    $name-reservedKeys	{} \
	]
    }
    if {$::tk_version >= 8.4 && [llength [package versions tile]] > 0} {
	addTileWidgets 
    }
}

#
# Public procedures related to interactive cell editing
# =====================================================
#

#------------------------------------------------------------------------------
# tablelist::addBWidgetEntry
#
# Registers the Entry widget from the BWidget package for interactive cell
# editing.
#------------------------------------------------------------------------------
proc tablelist::addBWidgetEntry {{name Entry}} {
    checkEditWinName $name

    array set ::tablelist::editWin [list \
	$name-creationCmd	"Entry %W -width 0" \
	$name-putValueCmd	"%W delete 0 end; %W insert 0 %T" \
	$name-getValueCmd	"%W get" \
	$name-putTextCmd	"%W delete 0 end; %W insert 0 %T" \
	$name-getTextCmd	"%W get" \
	$name-putListCmd	"" \
	$name-getListCmd	"" \
	$name-selectCmd		"" \
	$name-invokeCmd		"" \
	$name-fontOpt		-font \
	$name-useFormat		1 \
	$name-useReqWidth	0 \
	$name-usePadX		0 \
	$name-isEntryLike	1 \
	$name-focusWin		%W \
	$name-reservedKeys	{Left Right} \
    ]

    return $name
}

#------------------------------------------------------------------------------
# tablelist::addBWidgetSpinBox
#
# Registers the SpinBox widget from the BWidget package for interactive cell
# editing.
#------------------------------------------------------------------------------
proc tablelist::addBWidgetSpinBox {{name SpinBox}} {
    checkEditWinName $name

    array set ::tablelist::editWin [list \
	$name-creationCmd	"SpinBox %W -editable 1 -width 0" \
	$name-putValueCmd	"%W configure -text %T" \
	$name-getValueCmd	"%W cget -text" \
	$name-putTextCmd	"%W configure -text %T" \
	$name-getTextCmd	"%W cget -text" \
	$name-putListCmd	"" \
	$name-getListCmd	"" \
	$name-selectCmd		"" \
	$name-invokeCmd		"" \
	$name-fontOpt		-font \
	$name-useFormat		1 \
	$name-useReqWidth	0 \
	$name-usePadX		1 \
	$name-isEntryLike	1 \
	$name-focusWin		%W.e \
	$name-reservedKeys	{Left Right Up Down Prior Next} \
    ]

    return $name
}

#------------------------------------------------------------------------------
# tablelist::addBWidgetComboBox
#
# Registers the ComboBox widget from the BWidget package for interactive cell
# editing.
#------------------------------------------------------------------------------
proc tablelist::addBWidgetComboBox {{name ComboBox}} {
    checkEditWinName $name

    array set ::tablelist::editWin [list \
	$name-creationCmd	"createBWidgetComboBox %W" \
	$name-putValueCmd	"%W configure -text %T" \
	$name-getValueCmd	"%W cget -text" \
	$name-putTextCmd	"%W configure -text %T" \
	$name-getTextCmd	"%W cget -text" \
	$name-putListCmd	"" \
	$name-getListCmd	"" \
	$name-selectCmd		"" \
	$name-invokeCmd		"%W.a invoke" \
	$name-fontOpt		-font \
	$name-useFormat		1 \
	$name-useReqWidth	0 \
	$name-usePadX		1 \
	$name-isEntryLike	1 \
	$name-focusWin		%W.e \
	$name-reservedKeys	{Left Right Up Down} \
    ]

    return $name
}

#------------------------------------------------------------------------------
# tablelist::addIncrEntryfield
#
# Registers the entryfield widget from the Iwidgets package for interactive
# cell editing.
#------------------------------------------------------------------------------
proc tablelist::addIncrEntryfield {{name entryfield}} {
    checkEditWinName $name

    array set ::tablelist::editWin [list \
	$name-creationCmd	"iwidgets::entryfield %W -width 0" \
	$name-putValueCmd	"%W clear; %W insert 0 %T" \
	$name-getValueCmd	"%W get" \
	$name-putTextCmd	"%W clear; %W insert 0 %T" \
	$name-getTextCmd	"%W get" \
	$name-putListCmd	"" \
	$name-getListCmd	"" \
	$name-selectCmd		"" \
	$name-invokeCmd		"" \
	$name-fontOpt		-textfont \
	$name-useFormat		1 \
	$name-useReqWidth	0 \
	$name-usePadX		0 \
	$name-isEntryLike	1 \
	$name-focusWin		{[%W component entry]} \
	$name-reservedKeys	{Left Right} \
    ]

    return $name
}

#------------------------------------------------------------------------------
# tablelist::addIncrDateTimeWidget
#
# Registers the datefield, dateentry, timefield, or timeentry widget from the
# Iwidgets package, with or without the -clicks option for its get subcommand,
# for interactive cell editing.
#------------------------------------------------------------------------------
proc tablelist::addIncrDateTimeWidget {widgetType args} {
    if {![regexp {^(datefield|dateentry|timefield|timeentry)$} $widgetType]} {
	return -code error \
	       "bad widget type \"$widgetType\": must be\
		datefield, dateentry, timefield, or timeentry"
    }

    switch [llength $args] {
	0 {
	    set useClicks 0
	    set name $widgetType
	}

	1 {
	    set arg [lindex $args 0]
	    if {[string compare $arg "-seconds"] == 0} {
		set useClicks 1
		set name $widgetType
	    } else {
		set useClicks 0
		set name $arg
	    }
	}

	2 {
	    set arg0 [lindex $args 0]
	    if {[string compare $arg0 "-seconds"] != 0} {
		return -code error "bad option \"$arg0\": must be -seconds"
	    }

	    set useClicks 1
	    set name [lindex $args 1]
	}

	default {
	    mwutil::wrongNumArgs "addIncrDateTimeWidget\
		    datefield|dateentry|timefield|timeentry ?-seconds? ?name?"
	}
    }
    checkEditWinName $name

    array set ::tablelist::editWin [list \
	$name-creationCmd	"iwidgets::$widgetType %W" \
	$name-putValueCmd	"%W show %T" \
	$name-getValueCmd	"%W get" \
	$name-putTextCmd	"%W show %T" \
	$name-getTextCmd	"%W get" \
	$name-putListCmd	"" \
	$name-getListCmd	"" \
	$name-selectCmd		"" \
	$name-invokeCmd		"" \
	$name-fontOpt		-textfont \
	$name-useReqWidth	1 \
	$name-usePadX		[string match "*entry" $widgetType] \
	$name-useFormat		1 \
	$name-isEntryLike	1 \
	$name-reservedKeys	{Left Right Up Down} \
    ]
    if {$useClicks} {
	lappend ::tablelist::editWin($name-getValueCmd) -clicks
	set ::tablelist::editWin($name-useFormat) 0
    }
    if {[string match "date*" $widgetType]} {
	set ::tablelist::editWin($name-focusWin) {[%W component date]}
    } else {
	set ::tablelist::editWin($name-focusWin) {[%W component time]}
    }

    return $name
}

#------------------------------------------------------------------------------
# tablelist::addIncrSpinner
#
# Registers the spinner widget from the Iwidgets package for interactive cell
# editing.
#------------------------------------------------------------------------------
proc tablelist::addIncrSpinner {{name spinner}} {
    checkEditWinName $name

    array set ::tablelist::editWin [list \
	$name-creationCmd	"iwidgets::spinner %W -width 0" \
	$name-putValueCmd	"%W clear; %W insert 0 %T" \
	$name-getValueCmd	"%W get" \
	$name-putTextCmd	"%W clear; %W insert 0 %T" \
	$name-getTextCmd	"%W get" \
	$name-putListCmd	"" \
	$name-getListCmd	"" \
	$name-selectCmd		"" \
	$name-invokeCmd		"" \
	$name-fontOpt		-textfont \
	$name-useFormat		1 \
	$name-useReqWidth	0 \
	$name-usePadX		1 \
	$name-isEntryLike	1 \
	$name-focusWin		{[%W component entry]} \
	$name-reservedKeys	{Left Right} \
    ]

    return $name
}

#------------------------------------------------------------------------------
# tablelist::addIncrSpinint
#
# Registers the spinint widget from the Iwidgets package for interactive cell
# editing.
#------------------------------------------------------------------------------
proc tablelist::addIncrSpinint {{name spinint}} {
    checkEditWinName $name

    array set ::tablelist::editWin [list \
	$name-creationCmd	"iwidgets::spinint %W -width 0" \
	$name-putValueCmd	"%W clear; %W insert 0 %T" \
	$name-getValueCmd	"%W get" \
	$name-putTextCmd	"%W clear; %W insert 0 %T" \
	$name-getTextCmd	"%W get" \
	$name-putListCmd	"" \
	$name-getListCmd	"" \
	$name-selectCmd		"" \
	$name-invokeCmd		"" \
	$name-fontOpt		-textfont \
	$name-useFormat		1 \
	$name-useReqWidth	0 \
	$name-usePadX		1 \
	$name-isEntryLike	1 \
	$name-focusWin		{[%W component entry]} \
	$name-reservedKeys	{Left Right} \
    ]

    return $name
}

#------------------------------------------------------------------------------
# tablelist::addIncrCombobox
#
# Registers the combobox widget from the Iwidgets package for interactive cell
# editing.
#------------------------------------------------------------------------------
proc tablelist::addIncrCombobox {{name combobox}} {
    checkEditWinName $name

    array set ::tablelist::editWin [list \
	$name-creationCmd	"createIncrCombobox %W" \
	$name-putValueCmd	"%W clear entry; %W insert entry 0 %T" \
	$name-getValueCmd	"%W get" \
	$name-putTextCmd	"%W clear entry; %W insert entry 0 %T" \
	$name-getTextCmd	"%W get" \
	$name-putListCmd	{eval [list %W insert list end] %L} \
	$name-getListCmd	"%W component list get 0 end" \
	$name-selectCmd		"%W selection set %I" \
	$name-invokeCmd		"%W invoke" \
	$name-fontOpt		-textfont \
	$name-useFormat		1 \
	$name-useReqWidth	0 \
	$name-usePadX		1 \
	$name-isEntryLike	1 \
	$name-focusWin		{[%W component entry]} \
	$name-reservedKeys	{Left Right Up Down Control-p Control-n} \
    ]

    return $name
}

#------------------------------------------------------------------------------
# tablelist::addCtext
#
# Registers the ctext widget for interactive cell editing.
#------------------------------------------------------------------------------
proc tablelist::addCtext {{name ctext}} {
    checkEditWinName $name

    array set ::tablelist::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-putTextCmd	"%W delete 1.0 end; %W insert 1.0 %T" \
	$name-getTextCmd	"%W get 1.0 end-1c" \
	$name-putListCmd	"" \
	$name-getListCmd	"" \
	$name-selectCmd		"" \
	$name-invokeCmd		"" \
	$name-fontOpt		-font \
	$name-useFormat		1 \
	$name-useReqWidth	0 \
	$name-usePadX		0 \
	$name-isEntryLike	1 \
	$name-focusWin		%W.t \
	$name-reservedKeys	{Left Right Up Down Prior Next
				 Control-Home Control-End Meta-b Meta-f
				 Control-p Control-n Meta-less Meta-greater} \
    ]

    return $name
}

#------------------------------------------------------------------------------
# tablelist::addOakleyCombobox
#
# Registers Bryan Oakley's combobox widget for interactive cell editing.
#------------------------------------------------------------------------------
proc tablelist::addOakleyCombobox {{name combobox}} {
    checkEditWinName $name

    array set ::tablelist::editWin [list \
	$name-creationCmd	"createOakleyCombobox %W" \
	$name-putValueCmd	"%W delete 0 end; %W insert 0 %T" \
	$name-getValueCmd	"%W get" \
	$name-putTextCmd	"%W delete 0 end; %W insert 0 %T" \
	$name-getTextCmd	"%W get" \
	$name-putListCmd	{eval [list %W list insert end] %L} \
	$name-getListCmd	"%W list get 0 end" \
	$name-selectCmd		"%W select %I" \
	$name-invokeCmd		"%W open" \
	$name-fontOpt		-font \
	$name-useFormat		1 \
	$name-useReqWidth	0 \
	$name-usePadX		1 \
	$name-isEntryLike	1 \
	$name-focusWin		%W.entry \
	$name-reservedKeys	{Left Right Up Down Prior Next} \
    ]

    #
    # Patch the ::combobox::UpdateVisualAttributes procedure to make sure it
    # won't change the background and trough colors of the vertical scrollbar
    #
    catch {combobox::combobox}	;# enforces the evaluation of "combobox.tcl"
    if {[catch {rename ::combobox::UpdateVisualAttributes \
		::combobox::_UpdateVisualAttributes}] == 0} {
	proc ::combobox::UpdateVisualAttributes w {
	    set vsbBackground [$w.top.vsb cget -background]
	    set vsbTroughColor [$w.top.vsb cget -troughcolor]

	    ::combobox::_UpdateVisualAttributes $w

	    $w.top.vsb configure -background $vsbBackground
	    $w.top.vsb configure -troughcolor $vsbTroughColor
	}
    }

    return $name
}

#------------------------------------------------------------------------------
# tablelist::addDateMentry
#
# Registers the widget created by the mentry::dateMentry command from the
# Mentry package, with a given format and separator and with or without the
# "-gmt 1" option for the mentry::putClockVal and mentry::getClockVal commands,
# for interactive cell editing.
#------------------------------------------------------------------------------
proc tablelist::addDateMentry {fmt sep args} {
    #
    # Parse the fmt argument
    #
    if {![regexp {^([dmyY])([dmyY])([dmyY])$} $fmt dummy \
		 fields(0) fields(1) fields(2)]} {
	return -code error \
	       "bad format \"$fmt\": must be a string of length 3,\
		consisting of the letters d, m, and y or Y"
    }

    #
    # Check whether all the three date components are represented in fmt
    #
    for {set n 0} {$n < 3} {incr n} {
	set lfields($n) [string tolower $fields($n)]
    }
    if {[string compare $lfields(0) $lfields(1)] == 0 ||
	[string compare $lfields(0) $lfields(2)] == 0 ||
	[string compare $lfields(1) $lfields(2)] == 0} {
	return -code error \
	       "bad format \"$fmt\": must have unique components for the\
		day, month, and year"
    }

    #
    # Parse the remaining arguments (if any)
    #
    switch [llength $args] {
	0 {
	    set useGMT 0
	    set name dateMentry
	}

	1 {
	    set arg [lindex $args 0]
	    if {[string compare $arg "-gmt"] == 0} {
		set useGMT 1
		set name dateMentry
	    } else {
		set useGMT 0
		set name $arg
	    }
	}

	2 {
	    set arg0 [lindex $args 0]
	    if {[string compare $arg0 "-gmt"] != 0} {
		return -code error "bad option \"$arg0\": must be -gmt"
	    }

	    set useGMT 1
	    set name [lindex $args 1]
	}

	default {
	    mwutil::wrongNumArgs "addDateMentry format separator ?-gmt? ?name?"
	}
    }
    checkEditWinName $name

    array set ::tablelist::editWin [list \
	$name-creationCmd	[list mentry::dateMentry %W $fmt $sep] \
	$name-putValueCmd	"mentry::putClockVal %T %W -gmt $useGMT" \
	$name-getValueCmd	"mentry::getClockVal %W -gmt $useGMT" \
	$name-putTextCmd	"" \
	$name-getTextCmd	"%W getstring" \
	$name-putListCmd	{eval [list %W put 0] %L} \
	$name-getListCmd	"%W getlist" \
	$name-selectCmd		"" \
	$name-invokeCmd		"" \
	$name-fontOpt		-font \
	$name-useFormat		0 \
	$name-useReqWidth	1 \
	$name-usePadX		1 \
	$name-isEntryLike	1 \
	$name-focusWin		"" \
	$name-reservedKeys	{Left Right Up Down Prior Next} \
    ]

    return $name
}

#------------------------------------------------------------------------------
# tablelist::addTimeMentry
#
# Registers the widget created by the mentry::timeMentry command from the
# Mentry package, with a given format and separator and with or without the
# "-gmt 1" option for the mentry::putClockVal and mentry::getClockVal commands,
# for interactive cell editing.
#------------------------------------------------------------------------------
proc tablelist::addTimeMentry {fmt sep args} {
    #
    # Parse the fmt argument
    #
    if {![regexp {^(H|I)(M)(S?)$} $fmt dummy fields(0) fields(1) fields(2)]} {
	return -code error \
	       "bad format \"$fmt\": must be a string of length 2 or 3\
		starting with H or I, followed by M and optionally by S"
    }

    #
    # Parse the remaining arguments (if any)
    #
    switch [llength $args] {
	0 {
	    set useGMT 0
	    set name timeMentry
	}

	1 {
	    set arg [lindex $args 0]
	    if {[string compare $arg "-gmt"] == 0} {
		set useGMT 1
		set name timeMentry
	    } else {
		set useGMT 0
		set name $arg
	    }
	}

	2 {
	    set arg0 [lindex $args 0]
	    if {[string compare $arg0 "-gmt"] != 0} {
		return -code error "bad option \"$arg0\": must be -gmt"
	    }

	    set useGMT 1
	    set name [lindex $args 1]
	}

	default {
	    mwutil::wrongNumArgs "addTimeMentry format separator ?-gmt? ?name?"
	}
    }
    checkEditWinName $name

    array set ::tablelist::editWin [list \
	$name-creationCmd	[list mentry::timeMentry %W $fmt $sep] \
	$name-putValueCmd	"mentry::putClockVal %T %W -gmt $useGMT" \
	$name-getValueCmd	"mentry::getClockVal %W -gmt $useGMT" \
	$name-putTextCmd	"" \
	$name-getTextCmd	"%W getstring" \
	$name-putListCmd	{eval [list %W put 0] %L} \
	$name-getListCmd	"%W getlist" \
	$name-selectCmd		"" \
	$name-invokeCmd		"" \
	$name-fontOpt		-font \
	$name-useFormat		0 \
	$name-useReqWidth	1 \
	$name-usePadX		1 \
	$name-isEntryLike	1 \
	$name-focusWin		"" \
	$name-reservedKeys	{Left Right Up Down Prior Next} \
    ]

    return $name
}

#------------------------------------------------------------------------------
# tablelist::addDateTimeMentry
#
# Registers the widget created by the mentry::dateTimeMentry command from the
# Mentry package, with a given format and given separators and with or without
# the "-gmt 1" option for the mentry::putClockVal and mentry::getClockVal
# commands, for interactive cell editing.
#------------------------------------------------------------------------------
proc tablelist::addDateTimeMentry {fmt dateSep timeSep args} {
    #
    # Parse the fmt argument
    #
    if {![regexp {^([dmyY])([dmyY])([dmyY])(H|I)(M)(S?)$} $fmt dummy \
		 fields(0) fields(1) fields(2) fields(3) fields(4) fields(5)]} {
	return -code error \
	       "bad format \"$fmt\": must be a string of length 5 or 6,\
		with the first 3 characters consisting of the letters d, m,\
		and y or Y, followed by H or I, then M, and optionally by S"
    }

    #
    # Check whether all the three date components are represented in fmt
    #
    for {set n 0} {$n < 3} {incr n} {
	set lfields($n) [string tolower $fields($n)]
    }
    if {[string compare $lfields(0) $lfields(1)] == 0 ||
	[string compare $lfields(0) $lfields(2)] == 0 ||
	[string compare $lfields(1) $lfields(2)] == 0} {
	return -code error \
	       "bad format \"$fmt\": must have unique components for the\
		day, month, and year"
    }

    #
    # Parse the remaining arguments (if any)
    #
    switch [llength $args] {
	0 {
	    set useGMT 0
	    set name dateTimeMentry
	}

	1 {
	    set arg [lindex $args 0]
	    if {[string compare $arg "-gmt"] == 0} {
		set useGMT 1
		set name dateTimeMentry
	    } else {
		set useGMT 0
		set name $arg
	    }
	}

	2 {
	    set arg0 [lindex $args 0]
	    if {[string compare $arg0 "-gmt"] != 0} {
		return -code error "bad option \"$arg0\": must be -gmt"
	    }

	    set useGMT 1
	    set name [lindex $args 1]
	}

	default {
	    mwutil::wrongNumArgs "addDateTimeMentry format dateSeparator\
				  timeSeparator ?-gmt? ?name?"
	}
    }
    checkEditWinName $name

    array set ::tablelist::editWin [list \
	$name-creationCmd	[list mentry::dateTimeMentry %W $fmt \
				      $dateSep $timeSep] \
	$name-putValueCmd	"mentry::putClockVal %T %W -gmt $useGMT" \
	$name-getValueCmd	"mentry::getClockVal %W -gmt $useGMT" \
	$name-putTextCmd	"" \
	$name-getTextCmd	"%W getstring" \
	$name-putListCmd	{eval [list %W put 0] %L} \
	$name-getListCmd	"%W getlist" \
	$name-selectCmd		"" \
	$name-invokeCmd		"" \
	$name-fontOpt		-font \
	$name-useFormat		0 \
	$name-useReqWidth	1 \
	$name-usePadX		1 \
	$name-isEntryLike	1 \
	$name-focusWin		"" \
	$name-reservedKeys	{Left Right Up Down Prior Next} \
    ]

    return $name
}

#------------------------------------------------------------------------------
# tablelist::addFixedPointMentry
#
# Registers the widget created by the mentry::fixedPointMentry command from the
# Mentry package, with a given number of characters before and a given number
# of digits after the decimal point, with or without the -comma option, for
# interactive cell editing.
#------------------------------------------------------------------------------
proc tablelist::addFixedPointMentry {cnt1 cnt2 args} {
    #
    # Check the arguments cnt1 and cnt2
    #
    if {![isInteger $cnt1] || $cnt1 <= 0} {
	return -code error "expected positive integer but got \"$cnt1\""
    }
    if {![isInteger $cnt2] || $cnt2 <= 0} {
	return -code error "expected positive integer but got \"$cnt2\""
    }

    #
    # Parse the remaining arguments (if any)
    #
    switch [llength $args] {
	0 {
	    set useComma 0
	    set name fixedPointMentry_$cnt1.$cnt2
	}

	1 {
	    set arg [lindex $args 0]
	    if {[string compare $arg "-comma"] == 0} {
		set useComma 1
		set name fixedPointMentry_$cnt1,$cnt2
	    } else {
		set useComma 0
		set name $arg
	    }
	}

	2 {
	    set arg0 [lindex $args 0]
	    if {[string compare $arg0 "-comma"] != 0} {
		return -code error "bad option \"$arg0\": must be -comma"
	    }

	    set useComma 1
	    set name [lindex $args 1]
	}

	default {
	    mwutil::wrongNumArgs "addFixedPointMentry count1 count2\
				  ?-comma? ?name?"
	}
    }
    checkEditWinName $name

    array set ::tablelist::editWin [list \
	$name-creationCmd	[list mentry::fixedPointMentry %W $cnt1 $cnt2] \
	$name-putValueCmd	"mentry::putReal %T %W" \
	$name-getValueCmd	"mentry::getReal %W" \
	$name-putTextCmd	"" \
	$name-getTextCmd	"%W getstring" \
	$name-putListCmd	{eval [list %W put 0] %L} \
	$name-getListCmd	"%W getlist" \
	$name-selectCmd		"" \
	$name-invokeCmd		"" \
	$name-fontOpt		-font \
	$name-useFormat		0 \
	$name-useReqWidth	1 \
	$name-usePadX		1 \
	$name-isEntryLike	1 \
	$name-focusWin		"" \
	$name-reservedKeys	{Left Right} \
    ]
    if {$useComma} {
	lappend ::tablelist::editWin($name-creationCmd) -comma
    }

    return $name
}

#------------------------------------------------------------------------------
# tablelist::addIPAddrMentry
#
# Registers the widget created by the mentry::ipAddrMentry command from the
# Mentry package for interactive cell editing.
#------------------------------------------------------------------------------
proc tablelist::addIPAddrMentry {{name ipAddrMentry}} {
    checkEditWinName $name

    array set ::tablelist::editWin [list \
	$name-creationCmd	"mentry::ipAddrMentry %W" \
	$name-putValueCmd	"mentry::putIPAddr %T %W" \
	$name-getValueCmd	"mentry::getIPAddr %W" \
	$name-putTextCmd	"" \
	$name-getTextCmd	"%W getstring" \
	$name-putListCmd	{eval [list %W put 0] %L} \
	$name-getListCmd	"%W getlist" \
	$name-selectCmd		"" \
	$name-invokeCmd		"" \
	$name-fontOpt		-font \
	$name-useFormat		0 \
	$name-useReqWidth	1 \
	$name-usePadX		1 \
	$name-isEntryLike	1 \
	$name-focusWin		"" \
	$name-reservedKeys	{Left Right Up Down Prior Next} \
    ]

    return $name
}

#------------------------------------------------------------------------------
# tablelist::addIPv6AddrMentry
#
# Registers the widget created by the mentry::ipv6AddrMentry command from the
# Mentry package for interactive cell editing.
#------------------------------------------------------------------------------
proc tablelist::addIPv6AddrMentry {{name ipv6AddrMentry}} {
    checkEditWinName $name

    array set ::tablelist::editWin [list \
	$name-creationCmd	"mentry::ipv6AddrMentry %W" \
	$name-putValueCmd	"mentry::putIPv6Addr %T %W" \
	$name-getValueCmd	"mentry::getIPv6Addr %W" \
	$name-putTextCmd	"" \
	$name-getTextCmd	"%W getstring" \
	$name-putListCmd	{eval [list %W put 0] %L} \
	$name-getListCmd	"%W getlist" \
	$name-selectCmd		"" \
	$name-invokeCmd		"" \
	$name-fontOpt		-font \
	$name-useFormat		0 \
	$name-useReqWidth	1 \
	$name-usePadX		1 \
	$name-isEntryLike	1 \
	$name-focusWin		"" \
	$name-reservedKeys	{Left Right Up Down Prior Next} \
    ]

    return $name
}

#
# Private procedures implementing the interactive cell editing
# ============================================================
#

#------------------------------------------------------------------------------
# tablelist::checkEditWinName
#
# Generates an error if the given edit window name is one of "entry", "text",
# "spinbox", "checkbutton", "menubutton", "ttk::entry", "ttk::spinbox",
# "ttk::combobox", "ttk::checkbutton", or "ttk::menubutton".
#------------------------------------------------------------------------------
proc tablelist::checkEditWinName name {
    if {[regexp {^(entry|text|spinbox|checkbutton|menubutton)$} $name]} {
	return -code error \
	       "edit window name \"$name\" is reserved for Tk $name widgets"
    }

    if {[regexp {^ttk::(entry|spinbox|combobox|checkbutton|menubutton)$} \
	 $name]} {
	return -code error \
	       "edit window name \"$name\" is reserved for tile $name widgets"
    }
}

#------------------------------------------------------------------------------
# tablelist::createCheckbutton
#
# Creates a checkbutton widget with 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
	    place $w -x -1 -y -1
	}

	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
	}
    }

    foreach {opt val} $args {
	switch -- $opt {
	    -state  { $w configure $opt $val }
	    default {}
	}
    }

    set win [getTablelistPath $w]
    $w configure -variable ::tablelist::ns${win}::data(editText)
}

#------------------------------------------------------------------------------
# tablelist::createMenubutton
#
# Creates a menubutton widget with the given path name for interactive cell
# editing in a tablelist widget.
#------------------------------------------------------------------------------
proc tablelist::createMenubutton {w args} {
    set win [getTablelistPath $w]
    menubutton $w -anchor w -indicatoron 1 -justify left -padx 2 -pady 2 \
	-relief raised -textvariable ::tablelist::ns${win}::data(editText)

    foreach {opt val} $args {
	$w configure $opt $val
    }

    variable winSys
    upvar ::tablelist::ns${win}::data data
    if {[string compare $winSys "aqua"] == 0} {
	catch {
	    set data(useCustomMDEFSav) $::tk::mac::useCustomMDEF
	    set ::tk::mac::useCustomMDEF 1
	}
    }

    set menu $w.menu
    menu $menu -tearoff 0 -postcommand [list tablelist::postMenuCmd $w]
    foreach event {<Map> <Unmap>} {
	bind $menu $event {
	    tablelist::invokeMotionHandler [tablelist::getTablelistPath %W]
	}
    }
    if {[string compare $winSys "x11"] == 0} {
	$menu configure -background $data(-background) \
			-foreground $data(-foreground) \
			-activebackground $data(-selectbackground) \
			-activeforeground $data(-selectforeground) \
			-activeborderwidth $data(-selectborderwidth)
    }

    $w configure -menu $menu
}

#------------------------------------------------------------------------------
# tablelist::postMenuCmd
#
# Activates the radiobutton entry of the menu associated with the menubutton
# widget having the given path name whose -value option was set to the
# menubutton's text.
#------------------------------------------------------------------------------
proc tablelist::postMenuCmd w {
    set menu [$w cget -menu]
    variable winSys
    if {[string compare $winSys "x11"] == 0} {
	set last [$menu index last]
	if {[string compare $last "none"] != 0} {
	    set text [$w cget -text]
	    for {set idx 0} {$idx <= $last} {incr idx} {
		if {[string compare [$menu type $idx] "radiobutton"] == 0 &&
		    [string compare [$menu entrycget $idx -value] $text] == 0} {
		    $menu activate $idx
		}
	    }
	}
    } else {
	if {[catch {set ::tk::Priv(postedMb) ""}] != 0} {
	    set ::tkPriv(postedMb) ""
	}

	if {[string compare [winfo class $w] "TMenubutton"] == 0} {
	    if {[catch {set ::tk::Priv(popup) $menu}] != 0} {
		set ::tkPriv(popup) $menu
	    }
	}

	if {[string compare $winSys "aqua"] == 0} {
	    set win [getTablelistPath $w]
	    upvar ::tablelist::ns${win}::data data
	    if {[string compare [$data(body) cget -cursor] $data(-cursor)]
		!= 0} {
		$data(body) configure -cursor $data(-cursor)
	    }
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::createTileEntry
#
# Creates a tile entry widget with the given path name for interactive cell
# editing in a tablelist widget.
#------------------------------------------------------------------------------
proc tablelist::createTileEntry {w args} {
    if {$::tk_version < 8.5 || [regexp {^8\.5a[1-5]$} $::tk_patchLevel]} {
	package require tile 0.6
    }
    createTileAliases 

    #
    # The style of the tile entry widget should have -borderwidth
    # 2 and -padding 1.  For those themes that don't honor the
    # -borderwidth 2 setting, set the padding to another value.
    #
    set win [getTablelistPath $w]
    switch [getCurrentTheme] {
	aqua {
	    set padding {0 0 0 -1}
	}

	tileqt {
	    set padding 3
	}

	xpnative {
	    switch [winfo rgb . SystemHighlight] {
		"12593 27242 50629" -
		"37779 41120 28784" -
		"45746 46260 49087" -
		"13107 39321 65535"	{ set padding 2 }
		default			{ set padding 1 }
	    }
	}

	default {
	    set padding 1
	}
    }
    styleConfig Tablelist.TEntry -borderwidth 2 -highlightthickness 0 \
				 -padding $padding

    ttk::entry $w -style Tablelist.TEntry

    foreach {opt val} $args {
	$w configure $opt $val
    }
}

#------------------------------------------------------------------------------
# tablelist::createTileSpinbox
#
# Creates a tile spinbox widget with the given path name for interactive cell
# editing in a tablelist widget.
#------------------------------------------------------------------------------
proc tablelist::createTileSpinbox {w args} {
    if {$::tk_version < 8.5 || [regexp {^8\.5a[1-5]$} $::tk_patchLevel]} {
	package require tile 0.8.3
    }
    createTileAliases 

    #
    # The style of the tile entry widget should have -borderwidth
    # 2 and -padding 1.  For those themes that don't honor the
    # -borderwidth 2 setting, set the padding to another value.
    #
    set win [getTablelistPath $w]
    switch [getCurrentTheme] {
	aqua {
	    set padding {0 0 0 -1}
	}

	tileqt {
	    set padding 3
	}

	vista {
	    switch [winfo rgb . SystemHighlight] {
		"13107 39321 65535"	{ set padding 0 }
		default			{ set padding 1 }
	    }
	}

	xpnative {
	    switch [winfo rgb . SystemHighlight] {
		"12593 27242 50629" -
		"37779 41120 28784" -
		"45746 46260 49087" -
		"13107 39321 65535"	{ set padding 2 }
		default			{ set padding 1 }
	    }
	}

	default {
	    set padding 1
	}
    }
    styleConfig Tablelist.TSpinbox -borderwidth 2 -highlightthickness 0 \
				   -padding $padding

    ttk::spinbox $w -style Tablelist.TSpinbox

    foreach {opt val} $args {
	$w configure $opt $val
    }
}

#------------------------------------------------------------------------------
# tablelist::createTileCombobox
#
# Creates a tile combobox widget with the given path name for interactive cell
# editing in a tablelist widget.
#------------------------------------------------------------------------------
proc tablelist::createTileCombobox {w args} {
    if {$::tk_version < 8.5 || [regexp {^8\.5a[1-5]$} $::tk_patchLevel]} {
	package require tile 0.6
    }
    createTileAliases 

    set win [getTablelistPath $w]
    if {[string compare [getCurrentTheme] "aqua"] == 0} {
	styleConfig Tablelist.TCombobox -borderwidth 2 -padding {0 0 0 -1}
    } else {
	styleConfig Tablelist.TCombobox -borderwidth 2 -padding 1
    }

    ttk::combobox $w -style Tablelist.TCombobox

    foreach {opt val} $args {
	$w configure $opt $val
    }
}

#------------------------------------------------------------------------------
# tablelist::createTileCheckbutton
#
# Creates a tile checkbutton widget with 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)

    foreach {opt val} $args {
	switch -- $opt {
	    -state  { $w configure $opt $val }
	    default {}
	}
    }

    #
    # 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 {
	    [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
	}

	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
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::createTileMenubutton
#
# Creates a tile menubutton widget with 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]} {
	package require tile 0.6
    }
    createTileAliases 

    styleConfig Tablelist.TMenubutton -anchor w -justify left -padding 1 \
				      -relief raised

    set win [getTablelistPath $w]
    ttk::menubutton $w -style Tablelist.TMenubutton \
		       -textvariable ::tablelist::ns${win}::data(editText)

    foreach {opt val} $args {
	switch -- $opt {
	    -state  { $w configure $opt $val }
	    default {}
	}
    }

    variable winSys
    upvar ::tablelist::ns${win}::data data
    if {[string compare $winSys "aqua"] == 0} {
	catch {
	    set data(useCustomMDEFSav) $::tk::mac::useCustomMDEF
	    set ::tk::mac::useCustomMDEF 1
	}
    }

    set menu $w.menu
    menu $menu -tearoff 0 -postcommand [list tablelist::postMenuCmd $w]
    if {[string compare $winSys "x11"] == 0} {
	$menu configure -background $data(-background) \
			-foreground $data(-foreground) \
			-activebackground $data(-selectbackground) \
			-activeforeground $data(-selectforeground) \
			-activeborderwidth $data(-selectborderwidth)
    }

    $w configure -menu $menu
}

#------------------------------------------------------------------------------
# tablelist::createBWidgetComboBox
#
# Creates a BWidget ComboBox widget with 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
    ComboBox::_create_popup $w

    foreach event {<Map> <Unmap>} {
	bind $w.shell.listb $event {
	    tablelist::invokeMotionHandler [tablelist::getTablelistPath %W]
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::createIncrCombobox
#
# Creates an [incr Widgets] combobox with the given path name for interactive
# cell editing in a tablelist widget.
#------------------------------------------------------------------------------
proc tablelist::createIncrCombobox {w args} {
    eval [list iwidgets::combobox $w -dropdown 1 -editable 1 -width 0] $args

    foreach event {<Map> <Unmap>} {
	bind [$w component list] $event {+
	    tablelist::invokeMotionHandler [tablelist::getTablelistPath %W]
	}
    }

    #
    # Make sure that the entry component will receive the input focus
    # whenever the list component (a scrolledlistbox widget) gets unmapped
    #
    bind [$w component list] <Unmap> +[list focus [$w component entry]]
}

#------------------------------------------------------------------------------
# tablelist::createOakleyCombobox
#
# Creates an Oakley combobox widget with 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

    foreach event {<Map> <Unmap>} {
	bind $w.top.list $event {
	    tablelist::invokeMotionHandler [tablelist::getTablelistPath %W]
	}
    }

    #
    # Repack the widget's components, to make sure that the
    # button will remain visible when shrinking the combobox.
    # This patch is needed for combobox versions earlier than 2.3.
    #
    pack forget $w.entry $w.button
    pack $w.button -side right -fill y    -expand 0
    pack $w.entry  -side left  -fill both -expand 1
}

#------------------------------------------------------------------------------
# tablelist::doEditCell
#
# Processes the tablelist editcell subcommand.  cmd may be an empty string,
# "condChangeSelection", or "changeSelection".  charPos stands for the
# character position component of the index in the body text widget of the
# character underneath the mouse cursor if this command was invoked by clicking
# mouse button 1 in the body of the tablelist widget.
#------------------------------------------------------------------------------
proc tablelist::doEditCell {win row col restore {cmd ""} {charPos -1}} {
    upvar ::tablelist::ns${win}::data data
    if {$data(isDisabled) || ![isRowViewable $win $row] || $data($col-hide) ||
	![isCellEditable $win $row $col]} {
	return ""
    }
    if {$data(editRow) == $row && $data(editCol) == $col} {
	return ""
    }
    if {$data(editRow) >= 0 && ![doFinishEditing $win]} {
	return ""
    }
    set item [lindex $data(itemList) $row]
    set key [lindex $item end]
    getIndentData $win $key $col indentWidth
    set pixels [colWidth $win $col -stretched]
    if {$indentWidth >= $pixels} {
	return ""
    }

    #
    # Create a frame to be embedded into the tablelist's body, together with
    # a child of column/cell-specific type; replace the binding tag Frame with
    # $data(editwinTag) and TablelistEdit in the frame's list of binding tags
    #
    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)
    tk::frame $f -borderwidth 0 -container 0 -height $frameHeight \
		 -highlightthickness 0 -relief flat -takefocus 0
    catch {$f configure -padx 0 -pady 0}
    bindtags $f [lreplace [bindtags $f] 1 1 $data(editwinTag) TablelistEdit]
    set name [getEditWindow $win $row $col]
    variable editWin
    set creationCmd [strMap {"%W" "$w"} $editWin($name-creationCmd)]
    append creationCmd { $editWin($name-fontOpt) [getCellFont $win $key $col]} \
		       { -state normal}
    set w $data(bodyFrEd)
    if {[catch {eval $creationCmd} result] != 0} {
	destroy $f
	return -code error $result
    }
    catch {$w configure -highlightthickness 0}
    clearTakefocusOpt $w
    set class [winfo class $w]
    set isCheckbtn [string match "*Checkbutton" $class]
    set isMenubtn [string match "*Menubutton" $class]
    set isText [expr {[string compare $class "Text"] == 0 ||
		      [string compare $class "Ctext"] == 0}]
    set isMentry [expr {[string compare $class "Mentry"] == 0}]
    if {!$isCheckbtn && !$isMenubtn} {
	catch {$w configure -relief ridge}
	catch {$w configure -borderwidth 2}
    }
    if {$isText && $data($col-wrap) && $::tk_version >= 8.5} {
	$w configure -wrap word
    }
    set alignment [lindex $data(colList) [expr {2*$col + 1}]]
    if {!$isText && !$isMentry} {
	catch {$w configure -justify $alignment}
    }

    #
    # Define some bindings for the above frame
    #
    bind $f <Enter> {
	set tablelist::W [tablelist::getTablelistPath %W]
	set tablelist::ns${tablelist::W}::data(inEditWin) 1
	tablelist::invokeMotionHandler $tablelist::W
    }
    bind $f <Leave> {
	set tablelist::W [tablelist::getTablelistPath %W]
	set tablelist::ns${tablelist::W}::data(inEditWin) 0
	set tablelist::ns${tablelist::W}::data(prevCell) -1,-1
	tablelist::invokeMotionHandler $tablelist::W
    }
    bind $f <Destroy> {
	set tablelist::W [tablelist::getTablelistPath %W]
	array set tablelist::ns${tablelist::W}::data \
	      {editKey ""  editRow -1  editCol -1  inEditWin 0  prevCell -1,-1}
	if {[catch {tk::CancelRepeat}] != 0} {
	    tkCancelRepeat 
	}
	if {[catch {ttk::CancelRepeat}] != 0} {
	    catch {tile::CancelRepeat}
	}
	tablelist::invokeMotionHandler $tablelist::W
    }

    #
    # Replace the cell's contents 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)
    getIndentData $win $data(editKey) $data(editCol) indentWidth
    if {$indentWidth == 0} {
	set textIdx [$b index $tabIdx1+1c]
    } else {
	$b mark set editIndentMark [$b index $tabIdx1+1c]
	set textIdx [$b index $tabIdx1+2c]
    }
    if {$isCheckbtn} {
	set editIdx $textIdx
	$b delete $editIdx $tabIdx2
    } else {
	getAuxData $win $data(editKey) $data(editCol) auxType auxWidth
	if {$auxType == 0 || $auxType > 1} {			;# no image
	    set editIdx $textIdx
	    $b delete $editIdx $tabIdx2
	} elseif {[string compare $alignment "right"] == 0} {
	    $b mark set editAuxMark $tabIdx2-1c
	    set editIdx $textIdx
	    $b delete $editIdx $tabIdx2-1c
	} else {
	    $b mark set editAuxMark $textIdx
	    set editIdx [$b index $textIdx+1c]
	    $b delete $editIdx $tabIdx2
	}
    }
    $b window create $editIdx -padx -3 -pady -3 -window $f
    $b mark set editMark $editIdx

    #
    # Insert the binding tags $data(editwinTag) and TablelistEdit
    # into the list of binding tags of some components
    # of w, just before the respective path names
    #
    if {$isMentry} {
	set compList [$w entries]
    } else {
	set comp [subst [strMap {"%W" "$w"} $editWin($name-focusWin)]]
	set compList [list $comp]
	set data(editFocus) $comp
    }
    foreach comp $compList {
	set bindTags [bindtags $comp]
	set idx [lsearch -exact $bindTags $comp]
	bindtags $comp [linsert $bindTags $idx $data(editwinTag) TablelistEdit]
    }

    #
    # Restore or initialize some of the edit window's data
    #
    if {$restore} {
	restoreEditData $win
    } else {
	#
	# Put the cell's contents to the edit window
	#
	set data(canceled) 0
	set data(invoked) 0
	set text [lindex $item $col]
	if {$editWin($name-useFormat) && [lindex $data(fmtCmdFlagList) $col]} {
	    set text [formatElem $win $key $row $col $text]
	}
	catch {
	    eval [strMap {"%W" "$w"  "%T" "$text"} $editWin($name-putValueCmd)]
	}

	#
	# Save the edit window's text
	#
	set data(origEditText) \
	    [eval [strMap {"%W" "$w"} $editWin($name-getTextCmd)]]

	if {[string length $data(-editstartcommand)] != 0} {
	    set text [uplevel #0 $data(-editstartcommand) \
		      [list $win $row $col $text]]

	    variable winSys
	    if {[string compare $winSys "aqua"] == 0} {
		catch {set ::tk::mac::useCustomMDEF $data(useCustomMDEFSav)}
	    }

	    if {$data(canceled)} {
		return ""
	    }

	    catch {
		eval [strMap {"%W" "$w"  "%T" "$text"} \
		      $editWin($name-putValueCmd)]
	    }

	    if {$isMenubtn} {
		set menu [$w cget -menu]
		set last [$menu index last]
		if {[string compare $last "none"] != 0} {
		    set varName [$w cget -textvariable]
		    for {set idx 0} {$idx <= $last} {incr idx} {
			if {[string compare [$menu type $idx] "radiobutton"]
			    == 0} {
			    $menu entryconfigure $idx -variable $varName
			}
		    }
		}
	    }
	}

	#
	# Save the edit window's text again
	#
	set data(origEditText) \
	    [eval [strMap {"%W" "$w"} $editWin($name-getTextCmd)]]
	set data(rejected) 0

	if {[string length $editWin($name-getListCmd)] != 0 &&
	    [string length $editWin($name-selectCmd)] != 0} {
	    #
	    # Select the edit window's item corresponding to text
	    #
	    set itemList [eval [strMap {"%W" "$w"} $editWin($name-getListCmd)]]
	    if {[set idx [lsearch -exact $itemList $text]] >= 0} {
		eval [strMap {"%W" "$w"  "%I" "$idx"} $editWin($name-selectCmd)]
	    }
	}

	#
	# Evaluate the optional command passed as argument
	#
	if {[string length $cmd] != 0} {
	    eval [list $cmd $win $row $col]
	}

	#
	# Set the focus and the insertion cursor
	#
	if {$charPos >= 0} {
	    if {$isText || !$editWin($name-isEntryLike)} {
		focus $w
	    } else {
		set hasAuxObject [expr {
		    [info exists data($key,$col-image)] ||
		    [info exists data($key,$col-window)]}]
		if {[string compare $alignment "right"] == 0} {
		    scan $tabIdx2 "%d.%d" line tabCharIdx2
		    if {$isMentry} {
			set len [string length [$w getstring]]
		    } else {
			set len [$comp index end]
		    }
		    set number [expr {$len - $tabCharIdx2 + $charPos}]
		    if {$hasAuxObject} {
			incr number 2
		    }
		} else {
		    scan $tabIdx1 "%d.%d" line tabCharIdx1
		    set number [expr {$charPos - $tabCharIdx1 - 1}]
		    if {$hasAuxObject} {
			incr number -2
		    }
		}
		if {$isMentry} {
		    setMentryCursor $w $number
		} else {
		    focus $comp
		    $comp icursor $number
		}
	    }
	} else {
	    if {$isText || $isMentry || !$editWin($name-isEntryLike)} {
		focus $w
	    } else {
		focus $comp
		$comp icursor end
		$comp selection range 0 end
	    }
	}
    }

    #
    # Adjust the frame's height
    #
    if {$isText} {
	if {[string compare [$w cget -wrap] "none"] == 0 ||
	    $::tk_version < 8.5} {
	    set numLines [expr {int([$w index end-1c])}]
	    $w configure -height $numLines
	    update idletasks				;# needed for ctext
	    if {![array exists ::tablelist::ns${win}::data]} {
		return ""
	    }
	    $f configure -height [winfo reqheight $w]
	} else {
	    bind $w <Configure> {
		%W configure -height [%W count -displaylines 1.0 end]
		[winfo parent %W] configure -height [winfo reqheight %W]
	    }
	}
	if {[info exists ::wcb::version]} {
	    wcb::cbappend $w after insert tablelist::adjustTextHeight
	    wcb::cbappend $w after delete tablelist::adjustTextHeight
	}
    } elseif {!$isCheckbtn} {
	update idletasks
	if {![array exists ::tablelist::ns${win}::data]} {
	    return ""
	}
	$f configure -height [winfo reqheight $w]
    }

    #
    # Adjust the frame's width and paddings
    #
    if {!$isCheckbtn} {
	place $w -relwidth 1.0 -relheight 1.0
	adjustEditWindow $win $pixels
	update idletasks
	if {![array exists ::tablelist::ns${win}::data]} {
	    return ""
	}
    }

    updateViewWhenIdle $win
    return ""
}

#------------------------------------------------------------------------------
# tablelist::doCancelEditing
#
# Processes the tablelist cancelediting subcommand.  Aborts the interactive
# cell editing and restores the cell's contents after destroying the edit
# window.
#------------------------------------------------------------------------------
proc tablelist::doCancelEditing win {
    upvar ::tablelist::ns${win}::data data
    if {[set row $data(editRow)] < 0} {
	return ""
    }
    set col $data(editCol)

    #
    # Invoke the command specified by the -editendcommand option if needed
    #
    set data(canceled) 1
    if {$data(-forceeditendcommand) &&
	[string length $data(-editendcommand)] != 0} {
	uplevel #0 $data(-editendcommand) \
		[list $win $row $col $data(origEditText)]
    }

    if {[winfo exists $data(bodyFr)]} {
	destroy $data(bodyFr)
	set item [lindex $data(itemList) $row]
	set key [lindex $item end]
	foreach opt {-window -image} {
	    if {[info exists data($key,$col$opt)]} {
		doCellConfig $row $col $win $opt $data($key,$col$opt)
		break
	    }
	}
	doCellConfig $row $col $win -text [lindex $item $col]
    }

    focus $data(body)

    set userData [list $row $col]
    genVirtualEvent $win <<TablelistCellRestored>> $userData

    updateViewWhenIdle $win
    return ""
}

#------------------------------------------------------------------------------
# tablelist::doFinishEditing
#
# Processes the tablelist finishediting subcommand.  Invokes the command
# specified by the -editendcommand option if needed, and updates the element
# just edited after destroying the edit window if the latter's content was not
# rejected.  Returns 1 on normal termination and 0 otherwise.
#------------------------------------------------------------------------------
proc tablelist::doFinishEditing win {
    upvar ::tablelist::ns${win}::data data
    if {[set row $data(editRow)] < 0} {
	return 1
    }
    set col $data(editCol)

    #
    # Get the edit window's text, and invoke the command
    # specified by the -editendcommand option if needed
    #
    set w $data(bodyFrEd)
    set name [getEditWindow $win $row $col]
    variable editWin
    set text [eval [strMap {"%W" "$w"} $editWin($name-getTextCmd)]]
    set item [lindex $data(itemList) $row]
    if {!$data(-forceeditendcommand) &&
	[string compare $text $data(origEditText)] == 0} {
	set text [lindex $item $col]
    } else {
	if {[catch {
	    eval [strMap {"%W" "$w"} $editWin($name-getValueCmd)]
	} text] != 0} {
	    set data(rejected) 1
	}
	if {[string length $data(-editendcommand)] != 0} {
	    set text \
		[uplevel #0 $data(-editendcommand) [list $win $row $col $text]]
	}
    }

    #
    # Check whether the input was rejected (by the above "set data(rejected) 1"
    # statement or within the command specified by the -editendcommand option)
    #
    if {$data(rejected)} {
	if {[winfo exists $data(bodyFr)]} {
	    seeCell $win $row $col
	    if {[string compare [winfo class $w] "Mentry"] != 0} {
		focus $data(editFocus)
	    }
	} else {
	    focus $data(body)
	}

	set data(rejected) 0
	set result 0
    } else {
	if {[winfo exists $data(bodyFr)]} {
	    destroy $data(bodyFr)
	    set key [lindex $item end]
	    foreach opt {-window -image} {
		if {[info exists data($key,$col$opt)]} {
		    doCellConfig $row $col $win $opt $data($key,$col$opt)
		    break
		}
	    }
	    doCellConfig $row $col $win -text $text
	    set result 1
	} else {
	    set result 0
	}

	focus $data(body)

	set userData [list $row $col]
	genVirtualEvent $win <<TablelistCellUpdated>> $userData
    }

    updateViewWhenIdle $win
    return $result
}

#------------------------------------------------------------------------------
# tablelist::clearTakefocusOpt
#
# Sets the -takefocus option of all members of the widget hierarchy starting
# with w to 0.
#------------------------------------------------------------------------------
proc tablelist::clearTakefocusOpt w {
    catch {$w configure -takefocus 0}
    foreach c [winfo children $w] {
	clearTakefocusOpt $c
    }
}

#------------------------------------------------------------------------------
# tablelist::adjustTextHeight
#
# This procedure is an after-insert and after-delete callback asociated with a
# (c)text widget used for interactive cell editing.  It sets the height of the
# edit window to the number of lines currently contained in it.
#------------------------------------------------------------------------------
proc tablelist::adjustTextHeight {w args} {
    if {$::tk_version >= 8.5} {
	#
	# Count the display lines (taking into account the line wraps)
	#
	set numLines [$w count -displaylines 1.0 end]
    } else {
	#
	# We can only count the logical lines (irrespective of wrapping)
	#
	set numLines [expr {int([$w index end-1c])}]
    }
    $w configure -height $numLines

    set path [wcb::pathname $w]
    [winfo parent $path] configure -height [winfo reqheight $path]
}

#------------------------------------------------------------------------------
# tablelist::setMentryCursor
#
# Sets the focus to the entry child of the mentry widget w that contains the
# global character position specified by number, and sets the insertion cursor
# in that entry to the relative character position corresponding to number.  If
# that entry is not enabled then the procedure sets the focus to the last
# enabled entry child preceding the found one and sets the insertion cursor to
# its end.
#------------------------------------------------------------------------------
proc tablelist::setMentryCursor {w number} {
    #
    # Find the entry child containing the given character
    # position; if the latter is contained in a label child
    # then take the entry immediately preceding that label
    #
    set entryIdx -1
    set childIdx 0
    set childCount [llength [$w cget -body]]
    foreach c [winfo children $w] {
	set class [winfo class $c]
	switch $class {
	    Entry {
		set str [$c get]
		set entry $c
		incr entryIdx
	    }
	    Frame {
		set str [$c.e get]
		set entry $c.e
		incr entryIdx
	    }
	    Label { set str [$c cget -text] }
	}
	set len [string length $str]

	if {$number < $len} {
	    break
	} elseif {$childIdx < $childCount - 1} {
	    incr number -$len
	}

	incr childIdx
    }

    #
    # If the entry's state is normal then set the focus to this entry and
    # the insertion cursor to the relative character position corresponding
    # to number; otherwise set the focus to the last enabled entry child
    # preceding the found one and set the insertion cursor to its end
    #
    switch $class {
	Entry -
	Frame { set relIdx $number }
	Label { set relIdx end }
    }
    if {[string compare [$entry cget -state] "normal"] == 0} {
	focus $entry
	$entry icursor $relIdx
    } else {
	for {incr entryIdx -1} {$entryIdx >= 0} {incr entryIdx -1} {
	    set entry [$w entrypath $entryIdx]
	    if {[string compare [$entry cget -state] "normal"] == 0} {
		focus $entry
		$entry icursor end
		return ""
	    }
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::adjustEditWindow
#
# Adjusts the width and the horizontal padding of the frame containing the edit
# window associated with the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::adjustEditWindow {win pixels} {
    #
    # Adjust the width of the auxiliary object (if any)
    #
    upvar ::tablelist::ns${win}::data data
    set indent [getIndentData $win $data(editKey) $data(editCol) indentWidth]
    set aux [getAuxData $win $data(editKey) $data(editCol) auxType auxWidth]
    if {$indentWidth >= $pixels} {
	set indentWidth $pixels
	set pixels 0
	set auxWidth 0
    } else {
	incr pixels -$indentWidth
	if {$auxType == 1} {					;# image
	    if {$auxWidth + 5 <= $pixels} {
		incr auxWidth 3
		incr pixels -[expr {$auxWidth + 2}]
	    } elseif {$auxWidth <= $pixels} {
		set pixels 0
	    } else {
		set auxWidth $pixels
		set pixels 0
	    }
	}
    }

    if {$indentWidth != 0} {
	insertOrUpdateIndent $data(body) editIndentMark $indent $indentWidth
    }
    if {$auxType == 1} {					;# image
	setImgLabelWidth $data(body) editAuxMark $auxWidth
    }

    #
    # Compute an appropriate width and horizontal
    # padding for the frame containing the edit window
    #
    set name [getEditWindow $win $data(editRow) $data(editCol)]
    variable editWin
    if {$editWin($name-useReqWidth) &&
	[set reqWidth [winfo reqwidth $data(bodyFrEd)]] <=
	$pixels + 2*$data(charWidth)} {
	set width $reqWidth
	set padX [expr {$reqWidth <= $pixels ? -3 : ($pixels - $reqWidth) / 2}]
    } else {
	if {$editWin($name-usePadX)} {
	    set amount $data(charWidth)
	} else {
	    switch -- $name {
		text { set amount 4 }
		ttk::entry {
		    if {[string compare [getCurrentTheme] "aqua"] == 0} {
			set amount 5
		    } else {
			set amount 3
		    }
		}
		default { set amount 3 }
	    }
	}
	set width [expr {$pixels + 2*$amount}]
	set padX -$amount
    }

    $data(bodyFr) configure -width $width
    $data(body) window configure editMark -padx $padX
}

#------------------------------------------------------------------------------
# tablelist::setEditWinFont
#
# Sets the font of the edit window associated with the tablelist widget win to
# that of the cell currently being edited.
#------------------------------------------------------------------------------
proc tablelist::setEditWinFont win {
    upvar ::tablelist::ns${win}::data data
    set name [getEditWindow $win $data(editRow) $data(editCol)]
    variable editWin
    if {[string length $editWin($name-fontOpt)] == 0} {
	return ""
    }

    set key [lindex $data(keyList) $data(editRow)]
    set cellFont [getCellFont $win $key $data(editCol)]
    $data(bodyFrEd) configure $editWin($name-fontOpt) $cellFont

    $data(bodyFr) configure -height [winfo reqheight $data(bodyFrEd)]
}

#------------------------------------------------------------------------------
# tablelist::saveEditData
#
# Saves some data of the edit window associated with the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::saveEditData win {
    upvar ::tablelist::ns${win}::data data
    set w $data(bodyFrEd)
    set entry $data(editFocus)
    set class [winfo class $w]
    set isText [expr {[string compare $class "Text"] == 0 ||
		      [string compare $class "Ctext"] == 0}]
    set isMentry [expr {[string compare $class "Mentry"] == 0}]

    #
    # Miscellaneous data
    #
    set name [getEditWindow $win $data(editRow) $data(editCol)]
    variable editWin
    set data(editText) [eval [strMap {"%W" "$w"} $editWin($name-getTextCmd)]]
    if {[string length $editWin($name-getListCmd)] != 0} {
	set data(editList) \
	    [eval [strMap {"%W" "$w"} $editWin($name-getListCmd)]]
    }
    if {$isText} {
	set data(editPos) [$w index insert]
	set data(textSelRanges) [$w tag ranges sel]
    } elseif {$editWin($name-isEntryLike)} {
	set data(editPos) [$entry index insert]
	if {[set data(entryHadSel) [$entry selection present]]} {
	    set data(entrySelFrom) [$entry index sel.first]
	    set data(entrySelTo)   [$entry index sel.last]
	}
    }
    set data(editHadFocus) \
	[expr {[string compare [focus -lastfor $entry] $entry] == 0}]

    #
    # Configuration options and widget callbacks
    #
    saveEditConfigOpts $w
    if {[info exists ::wcb::version] &&
	$editWin($name-isEntryLike) && !$isMentry} {
	set wcbOptList {insert delete motion}
	if {$isText} {
	    lappend wcbOptList selset selclear
	    if {$::wcb::version >= 3.2} {
		lappend wcbOptList replace
	    }
	}
	foreach when {before after} {
	    foreach opt $wcbOptList {
		set data(entryCb-$when-$opt) \
		    [::wcb::callback $entry $when $opt]
	    }
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::saveEditConfigOpts
#
# Saves the non-default values of the configuration options of the edit window
# w associated with a tablelist widget, as well as those of its descendants.
#------------------------------------------------------------------------------
proc tablelist::saveEditConfigOpts w {
    regexp {^(.+)\.body\.f\.(e.*)$} $w dummy win tail
    upvar ::tablelist::ns${win}::data data

    foreach configSet [$w configure] {
	if {[llength $configSet] != 2} {
	    set default [lindex $configSet 3]
	    set current [lindex $configSet 4]
	    if {[string compare $default $current] != 0} {
		set opt [lindex $configSet 0]
		set data($tail$opt) $current
	    }
	}
    }

    foreach c [winfo children $w] {
	saveEditConfigOpts $c
    }

    if {[string match "*Menubutton" [winfo class $w]]} {
	set menu [$w cget -menu]
	set last [$menu index last]
	set types {}

	if {[string compare $last "none"] != 0} {
	    for {set idx 0} {$idx <= $last} {incr idx} {
		lappend types [$menu type $idx]
		foreach configSet [$menu entryconfigure $idx] {
		    set default [lindex $configSet 3]
		    set current [lindex $configSet 4]
		    if {[string compare $default $current] != 0} {
			set opt [lindex $configSet 0]
			set data($menu,$idx$opt) $current
		    }
		}
	    }
	}

	set data($menu:types) $types
    }
}

#------------------------------------------------------------------------------
# tablelist::restoreEditData
#
# Restores some data of the edit window associated with the tablelist widget
# win.
#------------------------------------------------------------------------------
proc tablelist::restoreEditData win {
    upvar ::tablelist::ns${win}::data data
    set w $data(bodyFrEd)
    set entry $data(editFocus)
    set class [winfo class $w]
    set isText [expr {[string compare $class "Text"] == 0 ||
		      [string compare $class "Ctext"] == 0}]
    set isMentry [expr {[string compare $class "Mentry"] == 0}]
    set isIncrDateTimeWidget [regexp {^(Date.+|Time.+)$} $class]

    #
    # Miscellaneous data
    #
    set name [getEditWindow $win $data(editRow) $data(editCol)]
    variable editWin
    if {[string length $editWin($name-putTextCmd)] != 0} {
	eval [strMap {"%W" "$w"  "%T" "$data(editText)"} \
	      $editWin($name-putTextCmd)]
    }
    if {[string length $editWin($name-putListCmd)] != 0 &&
	[string length $data(editList)] != 0} {
	eval [strMap {"%W" "$w"  "%L" "$data(editList)"} \
	      $editWin($name-putListCmd)]
    }
    if {[string length $editWin($name-selectCmd)] != 0 &&
	[set idx [lsearch -exact $data(editList) $data(editText)]] >= 0} {
	eval [strMap {"%W" "$w"  "%I" "$idx"} $editWin($name-selectCmd)]
    }
    if {$isText} {
	$w mark set insert $data(editPos)
	if {[llength $data(textSelRanges)] != 0} {
	    eval [list $w tag add sel] $data(textSelRanges)
	}
    } elseif {$editWin($name-isEntryLike)} {
	$entry icursor $data(editPos)
	if {$data(entryHadSel)} {
	    $entry selection range $data(entrySelFrom) $data(entrySelTo)
	}
    }
    if {$data(editHadFocus)} {
	focus $entry
    }

    #
    # Configuration options and widget callbacks
    #
    restoreEditConfigOpts $w
    if {[info exists ::wcb::version] &&
	$editWin($name-isEntryLike) && !$isMentry} {
	set wcbOptList {insert delete motion}
	if {$isText} {
	    lappend wcbOptList selset selclear
	    if {$::wcb::version >= 3.2} {
		lappend wcbOptList replace
	    }
	}
	foreach when {before after} {
	    foreach opt $wcbOptList {
		eval [list ::wcb::callback $entry $when $opt] \
		     $data(entryCb-$when-$opt)
	    }
	}
    }

    #
    # If the edit window is a datefield, dateentry, timefield, or timeentry
    # widget then restore its text here, because otherwise it would be
    # overridden when the above invocation of restoreEditConfigOpts sets
    # the widget's -format option.  Note that this is a special case; in
    # general we must restore the text BEFORE the configuration options.
    #
    if {$isIncrDateTimeWidget} {
	eval [strMap {"%W" "$w"  "%T" "$data(editText)"} \
	      $editWin($name-putTextCmd)]
    }
}

#------------------------------------------------------------------------------
# tablelist::restoreEditConfigOpts
#
# Restores the non-default values of the configuration options of the edit
# window w associated with a tablelist widget, as well as those of its
# descendants.
#------------------------------------------------------------------------------
proc tablelist::restoreEditConfigOpts w {
    regexp {^(.+)\.body\.f\.(e.*)$} $w dummy win tail
    upvar ::tablelist::ns${win}::data data
    set isMentry [expr {[string compare [winfo class $w] "Mentry"] == 0}]

    foreach name [array names data $tail-*] {
	set opt [string range $name [string last "-" $name] end]
	if {!$isMentry || [string compare $opt "-body"] != 0} {
	    $w configure $opt $data($name)
	}
	unset data($name)
    }

    foreach c [winfo children $w] {
	restoreEditConfigOpts $c
    }

    if {[string match "*Menubutton" [winfo class $w]]} {
	set menu [$w cget -menu]
	foreach type $data($menu:types) {
	    $menu add $type
	}
	unset data($menu:types)

	foreach name [array names data $menu,*] {
	    regexp {^.+,(.+)(-.+)$} $name dummy idx opt
	    $menu entryconfigure $idx $opt $data($name)
	    unset data($name)
	}
    }
}

#
# Private procedures used in bindings related to interactive cell editing
# =======================================================================
#

#------------------------------------------------------------------------------
# tablelist::defineTablelistEdit
#
# Defines the bindings for the binding tag TablelistEdit.
#------------------------------------------------------------------------------
proc tablelist::defineTablelistEdit {} {
    #
    # Get the supported modifier keys in the set {Alt, Meta, Command} on
    # the current windowing system ("x11", "win32", "classic", or "aqua")
    #
    variable winSys
    switch $winSys {
	x11	{ set modList {Alt Meta} }
	win32	{ set modList {Alt} }
	classic -
	aqua	{ set modList {Command} }
    }

    #
    # Define some bindings for the binding tag TablelistEdit
    #
    bind TablelistEdit <Button-1> {
	#
	# Very short left-clicks on the tablelist's body are sometimes
	# unexpectedly propagated to the edit window just created - make
	# sure they won't be handled by the latter's default bindings
	#
	if {$tablelist::priv(justReleased)} {
	    break
	}

	set tablelist::priv(clickedInEditWin) 1
	focus %W
    }
    bind TablelistEdit <ButtonRelease-1> {
	if {%X >= 0} {				;# i.e., no generated event
	    foreach {tablelist::W tablelist::x tablelist::y} \
		[tablelist::convEventFields %W %x %y] {}

	    set tablelist::priv(x) ""
	    set tablelist::priv(y) ""
	    after cancel $tablelist::priv(afterId)
	    set tablelist::priv(afterId) ""
	    set tablelist::priv(justReleased) 1
	    after 100 [list set tablelist::priv(justReleased) 0]
	    set tablelist::priv(releasedInEditWin) 1
	    if {!$tablelist::priv(clickedInEditWin)} {
		if {$tablelist::priv(justClicked)} {
		    tablelist::moveOrActivate $tablelist::W \
			$tablelist::priv(row) $tablelist::priv(col) 1
		} else {
		    tablelist::moveOrActivate $tablelist::W \
			[$tablelist::W nearest       $tablelist::y] \
			[$tablelist::W nearestcolumn $tablelist::x] \
			[expr {$tablelist::x >= 0 &&
			       $tablelist::x < [winfo width $tablelist::W] &&
			       $tablelist::y >= [winfo y $tablelist::W.body] &&
			       $tablelist::y < [winfo height $tablelist::W]}]
		}
	    }
	    after 100 [list tablelist::condEvalInvokeCmd $tablelist::W]
	}
    }
    bind TablelistEdit <Control-i>    { tablelist::insertChar %W "\t" }
    bind TablelistEdit <Control-j>    { tablelist::insertChar %W "\n" }
    bind TablelistEdit <Escape>       { tablelist::cancelEditing %W }
    foreach key {Return KP_Enter} {
	bind TablelistEdit <$key> {
	    if {[string compare [winfo class %W] "Text"] == 0 ||
		[string compare [winfo class %W] "Ctext"] == 0} {
		tablelist::insertChar %W "\n"
	    } else {
		tablelist::finishEditing %W
	    }
	}
	bind TablelistEdit <Control-$key> {
	    tablelist::finishEditing %W
	}
    }
    bind TablelistEdit <Tab>	      { tablelist::goToNextPrevCell %W  1 }
    bind TablelistEdit <Shift-Tab>    { tablelist::goToNextPrevCell %W -1 }
    bind TablelistEdit <<PrevWindow>> { tablelist::goToNextPrevCell %W -1 }
    foreach modifier $modList {
	bind TablelistEdit <$modifier-Left> {
	    tablelist::goLeftRight %W -1
	}
	bind TablelistEdit <$modifier-Right> {
	    tablelist::goLeftRight %W 1
	}
	bind TablelistEdit <$modifier-Up> {
	    tablelist::goUpDown %W -1
	}
	bind TablelistEdit <$modifier-Down> {
	    tablelist::goUpDown %W 1
	}
	bind TablelistEdit <$modifier-Prior> {
	    tablelist::goToPriorNextPage %W -1
	}
	bind TablelistEdit <$modifier-Next> {
	    tablelist::goToPriorNextPage %W 1
	}
	bind TablelistEdit <$modifier-Home> {
	    tablelist::goToNextPrevCell %W 1 0 -1
	}
	bind TablelistEdit <$modifier-End> {
	    tablelist::goToNextPrevCell %W -1 0 0
	}
    }
    foreach direction {Left Right} amount {-1 1} {
	bind TablelistEdit <$direction> [format {
	    if {![tablelist::isKeyReserved %%W %%K]} {
		tablelist::goLeftRight %%W %d
	    }
	} $amount]
    }
    foreach direction {Up Down} amount {-1 1} {
	bind TablelistEdit <$direction> [format {
	    if {![tablelist::isKeyReserved %%W %%K]} {
		tablelist::goUpDown %%W %d
	    }
	} $amount]
    }
    foreach page {Prior Next} amount {-1 1} {
	bind TablelistEdit <$page> [format {
	    if {![tablelist::isKeyReserved %%W %%K]} {
		tablelist::goToPriorNextPage %%W %d
	    }
	} $amount]
    }
    bind TablelistEdit <Control-Home> {
	if {![tablelist::isKeyReserved %W Control-Home]} {
	    tablelist::goToNextPrevCell %W 1 0 -1
	}
    }
    bind TablelistEdit <Control-End> {
	if {![tablelist::isKeyReserved %W Control-End]} {
	    tablelist::goToNextPrevCell %W -1 0 0
	}
    }
    foreach pattern {Tab Shift-Tab ISO_Left_Tab hpBackTab} {
	catch {
	    foreach modifier {Control Meta} {
		bind TablelistEdit <$modifier-$pattern> [format {
		    mwutil::processTraversal %%W Tablelist <%s>
		} $pattern]
	    }
	}
    }
    bind TablelistEdit <FocusIn> {
	set tablelist::W [tablelist::getTablelistPath %W]
	set tablelist::ns${tablelist::W}::data(editFocus) %W
    }

    #
    # Define some emacs-like key bindings for the binding tag TablelistEdit
    #
    foreach pattern {Meta-b Meta-f} amount {-1 1} {
	bind TablelistEdit <$pattern> [format {
	    if {!$tk_strictMotif && ![tablelist::isKeyReserved %%W %s]} {
		tablelist::goLeftRight %%W %d
	    }
	} $pattern $amount]
    }
    foreach pattern {Control-p Control-n} amount {-1 1} {
	bind TablelistEdit <$pattern> [format {
	    if {!$tk_strictMotif && ![tablelist::isKeyReserved %%W %s]} {
		tablelist::goUpDown %%W %d
	    }
	} $pattern $amount]
    }
    bind TablelistEdit <Meta-less> {
	if {!$tk_strictMotif &&
	    ![tablelist::isKeyReserved %W Meta-less]} {
	    tablelist::goToNextPrevCell %W 1 0 -1
	}
    }
    bind TablelistEdit <Meta-greater> {
	if {!$tk_strictMotif &&
	    ![tablelist::isKeyReserved %W Meta-greater]} {
	    tablelist::goToNextPrevCell %W -1 0 0
	}
    }

    #
    # Define some bindings for the binding tag TablelistEdit that
    # propagate the mousewheel events to the tablelist's body
    #
    catch {
	bind TablelistEdit <MouseWheel> {
	    if {![tablelist::hasMouseWheelBindings %W] &&
		![tablelist::isComboTopMapped %W]} {
		tablelist::genMouseWheelEvent \
		    [[tablelist::getTablelistPath %W] bodypath] %D
	    }
	}
	bind TablelistEdit <Option-MouseWheel> {
	    if {![tablelist::hasMouseWheelBindings %W] &&
		![tablelist::isComboTopMapped %W]} {
		tablelist::genOptionMouseWheelEvent \
		    [[tablelist::getTablelistPath %W] bodypath] %D
	    }
	}
    }
    foreach detail {4 5} {
	bind TablelistEdit <Button-$detail> [format {
	    if {![tablelist::hasMouseWheelBindings %%W] &&
		![tablelist::isComboTopMapped %%W]} {
		event generate \
		    [[tablelist::getTablelistPath %%W] bodypath] <Button-%s>
	    }
	} $detail]
    }
}

#------------------------------------------------------------------------------
# tablelist::insertChar
#
# Inserts the string str ("\t" or "\n") into the entry-like widget w at the
# point of the insertion cursor.
#------------------------------------------------------------------------------
proc tablelist::insertChar {w str} {
    set class [winfo class $w]
    if {[string compare $class "Text"] == 0 ||
	[string compare $class "Ctext"] == 0} {
	if {[string compare $str "\n"] == 0} {
	    eval [strMap {"%W" "$w"} [bind Text <Return>]]
	} else {
	    eval [strMap {"%W" "$w"} [bind Text <Control-i>]]
	}
	return -code break ""
    } elseif {[regexp {^(T?Entry|TCombobox|T?Spinbox)$} $class]} {
	if {[string match "T*" $class]} {
	    if {[string length [info procs "::ttk::entry::Insert"]] != 0} {
		ttk::entry::Insert $w $str
	    } else {
		tile::entry::Insert $w $str
	    }
	} elseif {[string length [info procs "::tk::EntryInsert"]] != 0} {
	    tk::EntryInsert $w $str
	} else {
	    tkEntryInsert $w $str
	}
	return -code break ""
    }
}

#------------------------------------------------------------------------------
# tablelist::cancelEditing
#
# Invokes the doCancelEditing procedure.
#------------------------------------------------------------------------------
proc tablelist::cancelEditing w {
    if {[isComboTopMapped $w]} {
	return ""
    }

    set win [getTablelistPath $w]
    upvar ::tablelist::ns${win}::data data
    if {[info exists data(sourceRow)]} {	;# move operation in progress
	return ""
    }

    doCancelEditing $win
    return -code break ""
}

#------------------------------------------------------------------------------
# tablelist::finishEditing
#
# Invokes the doFinishEditing procedure.
#------------------------------------------------------------------------------
proc tablelist::finishEditing w {
    if {[isComboTopMapped $w]} {
	return ""
    }

    doFinishEditing [getTablelistPath $w]
    return -code break ""
}

#------------------------------------------------------------------------------
# tablelist::goToNextPrevCell
#
# Moves the edit window into the next or previous editable cell different from
# the one indicated by the given row and column, if there is such a cell.
#------------------------------------------------------------------------------
proc tablelist::goToNextPrevCell {w amount args} {
    if {[isComboTopMapped $w]} {
	return ""
    }

    variable winSys
    if {[string compare $winSys "aqua"] == 0 &&
	([string length $::tk::Priv(postedMb)] != 0 ||
	 [string length $::tk::Priv(popup)] != 0)} {
	return ""
    }

    set win [getTablelistPath $w]
    upvar ::tablelist::ns${win}::data data

    if {[llength $args] == 0} {
	set row $data(editRow)
	set col $data(editCol)
	set cmd condChangeSelection
    } else {
	foreach {row col} $args {}
	set cmd changeSelection
    }

    if {![doFinishEditing $win]} {
	return ""
    }

    set oldRow $row
    set oldCol $col

    while 1 {
	incr col $amount
	if {$col < 0} {
	    incr row $amount
	    if {$row < 0} {
		set row $data(lastRow)
	    }
	    set col $data(lastCol)
	} elseif {$col > $data(lastCol)} {
	    incr row $amount
	    if {$row > $data(lastRow)} {
		set row 0
	    }
	    set col 0
	}

	if {$row == $oldRow && $col == $oldCol} {
	    return -code break ""
	} elseif {[isRowViewable $win $row] && !$data($col-hide) &&
		  [isCellEditable $win $row $col]} {
	    doEditCell $win $row $col 0 $cmd
	    return -code break ""
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::goLeftRight
#
# Moves the edit window into the previous or next editable cell of the current
# row if the cell being edited is not the first/last editable one within that
# row.
#------------------------------------------------------------------------------
proc tablelist::goLeftRight {w amount} {
    if {[isComboTopMapped $w]} {
	return ""
    }

    set win [getTablelistPath $w]
    upvar ::tablelist::ns${win}::data data

    set row $data(editRow)
    set col $data(editCol)

    if {![doFinishEditing $win]} {
	return ""
    }

    while 1 {
	incr col $amount
	if {$col < 0 || $col > $data(lastCol)} {
	    return -code break ""
	} elseif {!$data($col-hide) && [isCellEditable $win $row $col]} {
	    doEditCell $win $row $col 0 condChangeSelection
	    return -code break ""
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::goUpDown
#
# Invokes the goToPrevNextLine procedure.
#------------------------------------------------------------------------------
proc tablelist::goUpDown {w amount} {
    if {[isComboTopMapped $w]} {
	return ""
    }

    set win [getTablelistPath $w]
    upvar ::tablelist::ns${win}::data data

    goToPrevNextLine $w $amount $data(editRow) $data(editCol) \
	condChangeSelection
    return -code break ""
}

#------------------------------------------------------------------------------
# tablelist::goToPrevNextLine
#
# Moves the edit window into the last or first editable cell that is located in
# the specified column and has a row index less/greater than the given one, if
# there is such a cell.
#------------------------------------------------------------------------------
proc tablelist::goToPrevNextLine {w amount row col cmd} {
    set win [getTablelistPath $w]
    upvar ::tablelist::ns${win}::data data

    if {![doFinishEditing $win]} {
	return ""
    }

    while 1 {
	incr row $amount
	if {$row < 0 || $row > $data(lastRow)} {
	    return 0
	} elseif {[isRowViewable $win $row] &&
		  [isCellEditable $win $row $col]} {
	    doEditCell $win $row $col 0 $cmd
	    return 1
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::goToPriorNextPage
#
# Moves the edit window up or down by one page within the current column if the
# cell being edited is not the first/last editable one within that column.
#------------------------------------------------------------------------------
proc tablelist::goToPriorNextPage {w amount} {
    if {[isComboTopMapped $w]} {
	return ""
    }

    set win [getTablelistPath $w]
    upvar ::tablelist::ns${win}::data data

    #
    # Check whether there is any viewable editable cell
    # above/below the current one, in the same column
    #
    set row $data(editRow)
    set col $data(editCol)
    while 1 {
	incr row $amount
	if {$row < 0 || $row > $data(lastRow)} {
	    return -code break ""
	} elseif {[isRowViewable $win $row] &&
		  [isCellEditable $win $row $col]} {
	    break
	}
    }

    #
    # Scroll up/down the view by one page and get the corresponding row index
    #
    set row $data(editRow)
    seeRow $win $row
    set bbox [bboxSubCmd $win $row]
    yviewSubCmd $win [list scroll $amount pages]
    set newRow [rowIndex $win @0,[lindex $bbox 1] 0]

    if {$amount < 0} {
	if {$newRow < $row} {
	    if {![goToPrevNextLine $w -1 [expr {$newRow + 1}] $col \
		  changeSelection]} {
		goToPrevNextLine $w 1 $newRow $col changeSelection
	    }
	} else {
	    goToPrevNextLine $w 1 -1 $col changeSelection
	}
    } else {
	if {$newRow > $row} {
	    if {![goToPrevNextLine $w 1 [expr {$newRow - 1}] $col \
		  changeSelection]} {
		goToPrevNextLine $w -1 $newRow $col changeSelection
	    }
	} else {
	    goToPrevNextLine $w -1 $data(itemCount) $col changeSelection
	}
    }

    return -code break ""
}

#------------------------------------------------------------------------------
# tablelist::genMouseWheelEvent
#
# Generates a <MouseWheel> event with the given delta on the widget w.
#------------------------------------------------------------------------------
proc tablelist::genMouseWheelEvent {w delta} {
    set focus [focus -displayof $w]
    focus $w
    event generate $w <MouseWheel> -delta $delta
    focus $focus
}

#------------------------------------------------------------------------------
# tablelist::genOptionMouseWheelEvent
#
# Generates an <Option-MouseWheel> event with the given delta on the widget w.
#------------------------------------------------------------------------------
proc tablelist::genOptionMouseWheelEvent {w delta} {
    set focus [focus -displayof $w]
    focus $w
    event generate $w <Option-MouseWheel> -delta $delta
    focus $focus
}

#------------------------------------------------------------------------------
# tablelist::isKeyReserved
#
# Checks whether the given keysym is used in the standard binding scripts
# associated with the widget w, which is assumed to be the edit window or one
# of its descendants.
#------------------------------------------------------------------------------
proc tablelist::isKeyReserved {w keySym} {
    set win [getTablelistPath $w]
    upvar ::tablelist::ns${win}::data data

    set name [getEditWindow $win $data(editRow) $data(editCol)]
    variable editWin
    return [expr {[lsearch -exact $editWin($name-reservedKeys) $keySym] >= 0}]
}

#------------------------------------------------------------------------------
# tablelist::hasMouseWheelBindings
#
# Checks whether the given widget, which is assumed to be the edit window or
# one of its descendants, has mouse wheel bindings.
#------------------------------------------------------------------------------
proc tablelist::hasMouseWheelBindings w {
    if {[string compare [winfo class $w] "TCombobox"] == 0} {
	return 1
    } else {
	set bindTags [bindtags $w]
	return [expr {([lsearch -exact $bindTags "MentryDateTime"] >= 0 ||
		       [lsearch -exact $bindTags "MentryMeridian"] >= 0 ||
		       [lsearch -exact $bindTags "MentryIPAddr"] >= 0 ||
		       [lsearch -exact $bindTags "MentryIPv6Addr"] >= 0) &&
		      ($mentry::version >= 3.2)}]
    }
}

#------------------------------------------------------------------------------
# tablelist::isComboTopMapped
#
# Checks whether the given widget is a component of an Oakley combobox having
# its toplevel child mapped.  This is needed in our binding scripts to make
# sure that the interactive cell editing won't be terminated prematurely,
# because Bryan Oakley's combobox keeps the focus on its entry child even if
# its toplevel component is mapped.
#------------------------------------------------------------------------------
proc tablelist::isComboTopMapped w {
    set par [winfo parent $w]
    if {[string compare [winfo class $par] "Combobox"] == 0 &&
	[winfo exists $par.top] && [winfo ismapped $par.top]} {
	return 1
    } else {
	return 0
    }
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/scripts/tablelistImages.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
#==============================================================================
# Contains procedures that create various bitmap and photo images.  The
# argument w specifies a canvas displaying a sort arrow, while the argument win
# stands for a tablelist widget.
#
# Copyright (c) 2006-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

#------------------------------------------------------------------------------
# tablelist::flat5x3Arrows
#------------------------------------------------------------------------------
proc tablelist::flat5x3Arrows w {
    image create bitmap triangleUp$w -data "
#define triangleUp5x3_width 5
#define triangleUp5x3_height 3
static unsigned char triangleUp5x3_bits[] = {
   0x04, 0x0e, 0x1f};
"
    image create bitmap triangleDn$w -data "
#define triangleDn5x3_width 5
#define triangleDn5x3_height 3
static unsigned char triangleDn5x3_bits[] = {
   0x1f, 0x0e, 0x04};
"
}

#------------------------------------------------------------------------------
# tablelist::flat5x4Arrows
#------------------------------------------------------------------------------
proc tablelist::flat5x4Arrows w {
    image create bitmap triangleUp$w -data "
#define triangleUp5x4_width 5
#define triangleUp5x4_height 4
static unsigned char triangleUp5x4_bits[] = {
   0x04, 0x0e, 0x1f, 0x1f};
"
    image create bitmap triangleDn$w -data "
#define triangleDn5x4_width 5
#define triangleDn5x4_height 4
static unsigned char triangleDn5x4_bits[] = {
   0x1f, 0x1f, 0x0e, 0x04};
"
}

#------------------------------------------------------------------------------
# tablelist::flat6x4Arrows
#------------------------------------------------------------------------------
proc tablelist::flat6x4Arrows w {
    image create bitmap triangleUp$w -data "
#define triangleUp6x4_width 6
#define triangleUp6x4_height 4
static unsigned char triangleUp6x4_bits[] = {
   0x0c, 0x1e, 0x3f, 0x3f};
"
    image create bitmap triangleDn$w -data "
#define triangleDn6x4_width 6
#define triangleDn6x4_height 4
static unsigned char triangleDn7x4_bits[] = {
   0x3f, 0x3f, 0x1e, 0x0c};
"
}

#------------------------------------------------------------------------------
# tablelist::flat7x4Arrows
#------------------------------------------------------------------------------
proc tablelist::flat7x4Arrows w {
    image create bitmap triangleUp$w -data "
#define triangleUp7x4_width 7
#define triangleUp7x4_height 4
static unsigned char triangleUp7x4_bits[] = {
   0x08, 0x1c, 0x3e, 0x7f};
"
    image create bitmap triangleDn$w -data "
#define triangleDn7x4_width 7
#define triangleDn7x4_height 4
static unsigned char triangleDn7x4_bits[] = {
   0x7f, 0x3e, 0x1c, 0x08};
"
}

#------------------------------------------------------------------------------
# tablelist::flat7x5Arrows
#------------------------------------------------------------------------------
proc tablelist::flat7x5Arrows w {
    image create bitmap triangleUp$w -data "
#define triangleUp7x5_width 7
#define triangleUp7x5_height 5
static unsigned char triangleUp7x5_bits[] = {
   0x08, 0x1c, 0x3e, 0x7f, 0x7f};
"
    image create bitmap triangleDn$w -data "
#define triangleDn7x5_width 7
#define triangleDn7x5_height 5
static unsigned char triangleDn7x5_bits[] = {
   0x7f, 0x7f, 0x3e, 0x1c, 0x08};
"
}

#------------------------------------------------------------------------------
# tablelist::flat7x7Arrows
#------------------------------------------------------------------------------
proc tablelist::flat7x7Arrows w {
    image create bitmap triangleUp$w -data "
#define triangleUp7x7_width 7
#define triangleUp7x7_height 7
static unsigned char triangleUp7x7_bits[] = {
   0x08, 0x1c, 0x1c, 0x3e, 0x3e, 0x7f, 0x7f};
"
    image create bitmap triangleDn$w -data "
#define triangleDn7x7_width 7
#define triangleDn7x7_height 7
static unsigned char triangleDn7x7_bits[] = {
   0x7f, 0x7f, 0x3e, 0x3e, 0x1c, 0x1c, 0x08};
"
}

#------------------------------------------------------------------------------
# tablelist::flat8x5Arrows
#------------------------------------------------------------------------------
proc tablelist::flat8x5Arrows w {
    image create bitmap triangleUp$w -data "
#define triangleUp8x5_width 8
#define triangleUp8x5_height 5
static unsigned char triangleUp8x5_bits[] = {
   0x18, 0x3c, 0x7e, 0xff, 0xff};
"
    image create bitmap triangleDn$w -data "
#define triangleDn8x5_width 8
#define triangleDn8x5_height 5
static unsigned char triangleDn8x5_bits[] = {
   0xff, 0xff, 0x7e, 0x3c, 0x18};
"
}

#------------------------------------------------------------------------------
# tablelist::flat9x5Arrows
#------------------------------------------------------------------------------
proc tablelist::flat9x5Arrows w {
    image create bitmap triangleUp$w -data "
#define triangleUp9x5_width 9
#define triangleUp9x5_height 5
static unsigned char triangleUp9x5_bits[] = {
   0x10, 0x00, 0x38, 0x00, 0x7c, 0x00, 0xfe, 0x00, 0xff, 0x01};
"
    image create bitmap triangleDn$w -data "
#define triangleDn9x5_width 9
#define triangleDn9x5_height 5
static unsigned char triangleDn9x5_bits[] = {
   0xff, 0x01, 0xfe, 0x00, 0x7c, 0x00, 0x38, 0x00, 0x10, 0x00};
"
}

#------------------------------------------------------------------------------
# tablelist::flat9x6Arrows
#------------------------------------------------------------------------------
proc tablelist::flat9x6Arrows w {
    image create bitmap triangleUp$w -data "
#define triangleUp9x6_width 9
#define triangleUp9x6_height 6
static unsigned char triangleUp9x6_bits[] = {
   0x10, 0x00, 0x38, 0x00, 0x7c, 0x00, 0xfe, 0x00, 0xff, 0x01, 0xff, 0x01};
"
    image create bitmap triangleDn$w -data "
#define triangleDn9x6_width 9
#define triangleDn9x6_height 6
static unsigned char triangleDn9x6_bits[] = {
   0xff, 0x01, 0xff, 0x01, 0xfe, 0x00, 0x7c, 0x00, 0x38, 0x00, 0x10, 0x00};
"
}

#------------------------------------------------------------------------------
# tablelist::flatAngle7x4Arrows
#------------------------------------------------------------------------------
proc tablelist::flatAngle7x4Arrows w {
    image create bitmap triangleUp$w -data "
#define triangleUp7x4_width 7
#define triangleUp7x4_height 4
static unsigned char triangleUp7x4_bits[] = {
   0x08, 0x1c, 0x36, 0x63};
"
    image create bitmap triangleDn$w -data "
#define triangleDn7x4_width 7
#define triangleDn7x4_height 4
static unsigned char triangleDn7x4_bits[] = {
   0x63, 0x36, 0x1c, 0x08};
"
}

#------------------------------------------------------------------------------
# tablelist::flatAngle7x5Arrows
#------------------------------------------------------------------------------
proc tablelist::flatAngle7x5Arrows w {
    image create bitmap triangleUp$w -data "
#define triangleUp7x5_width 7
#define triangleUp7x5_height 5
static unsigned char triangleUp7x5_bits[] = {
   0x08, 0x1c, 0x3e, 0x77, 0x63};
"
    image create bitmap triangleDn$w -data "
#define triangleDn7x5_width 7
#define triangleDn7x5_height 5
static unsigned char triangleDn7x5_bits[] = {
   0x63, 0x77, 0x3e, 0x1c, 0x08};
"
}

#------------------------------------------------------------------------------
# tablelist::flatAngle9x5Arrows
#------------------------------------------------------------------------------
proc tablelist::flatAngle9x5Arrows w {
    image create bitmap triangleUp$w -data "
#define triangleUp9x5_width 9
#define triangleUp9x5_height 5
static unsigned char triangleUp9x5_bits[] = {
   0x10, 0x00, 0x38, 0x00, 0x6c, 0x00, 0xc6, 0x00, 0x83, 0x01};
"
    image create bitmap triangleDn$w -data "
#define triangleDn9x5_width 9
#define triangleDn9x5_height 5
static unsigned char triangleDn9x5_bits[] = {
   0x83, 0x01, 0xc6, 0x00, 0x6c, 0x00, 0x38, 0x00, 0x10, 0x00};
"
}

#------------------------------------------------------------------------------
# tablelist::flatAngle9x6Arrows
#------------------------------------------------------------------------------
proc tablelist::flatAngle9x6Arrows w {
    image create bitmap triangleUp$w -data "
#define triangleUp9x6_width 9
#define triangleUp9x6_height 6
static unsigned char triangleUp9x6_bits[] = {
   0x10, 0x00, 0x38, 0x00, 0x7c, 0x00, 0xee, 0x00, 0xc7, 0x01, 0x83, 0x01};
"
    image create bitmap triangleDn$w -data "
#define triangleDn9x6_width 9
#define triangleDn9x6_height 6
static unsigned char triangleDn9x6_bits[] = {
   0x83, 0x01, 0xc7, 0x01, 0xee, 0x00, 0x7c, 0x00, 0x38, 0x00, 0x10, 0x00};
"
}

#------------------------------------------------------------------------------
# tablelist::flatAngle9x7Arrows
#------------------------------------------------------------------------------
proc tablelist::flatAngle9x7Arrows w {
    image create bitmap triangleUp$w -data "
#define triangleUp9x7_width 9
#define triangleUp9x7_height 7
static unsigned char triangleUp9x7_bits[] = {
   0x10, 0x00, 0x38, 0x00, 0x7c, 0x00, 0xfe, 0x00, 0xef, 0x01, 0xc7, 0x01,
   0x83, 0x01};
"
    image create bitmap triangleDn$w -data "
#define triangleDn9x7_width 9
#define triangleDn9x7_height 7
static unsigned char triangleDn9x7_bits[] = {
   0x83, 0x01, 0xc7, 0x01, 0xef, 0x01, 0xfe, 0x00, 0x7c, 0x00, 0x38, 0x00,
   0x10, 0x00};
"
}

#------------------------------------------------------------------------------
# tablelist::flatAngle10x6Arrows
#------------------------------------------------------------------------------
proc tablelist::flatAngle10x6Arrows w {
    image create bitmap triangleUp$w -data "
#define triangleUp10x6_width 10
#define triangleUp10x6_height 6
static unsigned char triangleUp10x6_bits[] = {
   0x30, 0x00, 0x78, 0x00, 0xfc, 0x00, 0xce, 0x01, 0x87, 0x03, 0x03, 0x03};
"
    image create bitmap triangleDn$w -data "
#define triangleDn10x6_width 10
#define triangleDn10x6_height 6
static unsigned char triangleDn10x6_bits[] = {
   0x03, 0x03, 0x87, 0x03, 0xce, 0x01, 0xfc, 0x00, 0x78, 0x00, 0x30, 0x00};
"
}

#------------------------------------------------------------------------------
# tablelist::flatAngle10x7Arrows
#------------------------------------------------------------------------------
proc tablelist::flatAngle10x7Arrows w {
    image create bitmap triangleUp$w -data "
#define triangleUp10x7_width 10
#define triangleUp10x7_height 7
static unsigned char triangleUp10x7_bits[] = {
   0x30, 0x00, 0x78, 0x00, 0xfc, 0x00, 0xfe, 0x01, 0xcf, 0x03, 0x87, 0x03,
   0x03, 0x03};
"
    image create bitmap triangleDn$w -data "
#define triangleDn10x7_width 10
#define triangleDn10x7_height 7
static unsigned char triangleDn10x6_bits[] = {
   0x03, 0x03, 0x87, 0x03, 0xcf, 0x03, 0xfe, 0x01, 0xfc, 0x00, 0x78, 0x00,
   0x30, 0x00};
"
}

#------------------------------------------------------------------------------
# tablelist::photo7x7Arrows
#------------------------------------------------------------------------------
proc tablelist::photo7x7Arrows w {
    foreach dir {Up Dn} {
	image create photo triangle$dir$w
    }

    triangleUp$w put "
iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAA7DAAAOwwHHb6hk
AAAAGnRFWHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuNS4xMDD0cqEAAABCSURBVBhXXY4BCgAgCAP9
T//R9/Ryc+ZEHCyb40CB3D1n6OAZuQOKi9klPhUsjNJ6VwUp+tOLopOGNkXncToWw6IPjiowJNyp
gu8AAAAASUVORK5CYII=
"
    triangleDn$w put "
iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAABGdBTUEAALGPC/xhBQAAAAlwSFlz
AAAOwwAADsMBx2+oZAAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAAP0lE
QVQYV22LgQ0AIAjD9g//yD1ejoBoFpRkISsUPsMzPwkOIcARmJlvKMGIJq9jt+Uem51Wscfe1hkq
8VAdWKBfMCRjQcZZAAAAAElFTkSuQmCC
"
}

#------------------------------------------------------------------------------
# tablelist::sunken8x7Arrows
#------------------------------------------------------------------------------
proc tablelist::sunken8x7Arrows w {
    image create bitmap triangleUp$w -data "
#define triangleUp8x7_width 8
#define triangleUp8x7_height 7
static unsigned char triangleUp8x7_bits[] = {
   0x18, 0x3c, 0x3c, 0x7e, 0x7e, 0xff, 0xff};
"
    image create bitmap darkLineUp$w -data "
#define darkLineUp8x7_width 8
#define darkLineUp8x7_height 7
static unsigned char darkLineUp8x7_bits[] = {
   0x08, 0x0c, 0x04, 0x06, 0x02, 0x03, 0x00};
"
    image create bitmap lightLineUp$w -data "
#define lightLineUp8x7_width 8
#define lightLineUp8x7_height 7
static unsigned char lightLineUp8x7_bits[] = {
   0x10, 0x30, 0x20, 0x60, 0x40, 0xc0, 0xff};
"
    image create bitmap triangleDn$w -data "
#define triangleDn8x7_width 8
#define triangleDn8x7_height 7
static unsigned char triangleDn8x7_bits[] = {
   0xff, 0xff, 0x7e, 0x7e, 0x3c, 0x3c, 0x18};
"
    image create bitmap darkLineDn$w -data "
#define darkLineDn8x7_width 8
#define darkLineDn8x7_height 7
static unsigned char darkLineDn8x7_bits[] = {
   0xff, 0x03, 0x02, 0x06, 0x04, 0x0c, 0x08};
"
    image create bitmap lightLineDn$w -data "
#define lightLineDn8x7_width 8
#define lightLineDn8x7_height 7
static unsigned char lightLineDn8x7_bits[] = {
   0x00, 0xc0, 0x40, 0x60, 0x20, 0x30, 0x10};
"
}

#------------------------------------------------------------------------------
# tablelist::sunken10x9Arrows
#------------------------------------------------------------------------------
proc tablelist::sunken10x9Arrows w {
    image create bitmap triangleUp$w -data "
#define triangleUp10x9_width 10
#define triangleUp10x9_height 9
static unsigned char triangleUp10x9_bits[] = {
   0x30, 0x00, 0x78, 0x00, 0x78, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0xfe, 0x01,
   0xfe, 0x01, 0xff, 0x03, 0xff, 0x03};
"
    image create bitmap darkLineUp$w -data "
#define darkLineUp10x9_width 10
#define darkLineUp10x9_height 9
static unsigned char darkLineUp10x9_bits[] = {
   0x10, 0x00, 0x18, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x06, 0x00,
   0x02, 0x00, 0x03, 0x00, 0x00, 0x00};
"
    image create bitmap lightLineUp$w -data "
#define lightLineUp10x9_width 10
#define lightLineUp10x9_height 9
static unsigned char lightLineUp10x9_bits[] = {
   0x20, 0x00, 0x60, 0x00, 0x40, 0x00, 0xc0, 0x00, 0x80, 0x00, 0x80, 0x01,
   0x00, 0x01, 0x00, 0x03, 0xff, 0x03};
"
    image create bitmap triangleDn$w -data "
#define triangleDn10x9_width 10
#define triangleDn10x9_height 9
static unsigned char triangleDn10x9_bits[] = {
   0xff, 0x03, 0xff, 0x03, 0xfe, 0x01, 0xfe, 0x01, 0xfc, 0x00, 0xfc, 0x00,
   0x78, 0x00, 0x78, 0x00, 0x30, 0x00};
"
    image create bitmap darkLineDn$w -data "
#define darkLineDn10x9_width 10
#define darkLineDn10x9_height 9
static unsigned char darkLineDn10x9_bits[] = {
   0xff, 0x03, 0x03, 0x00, 0x02, 0x00, 0x06, 0x00, 0x04, 0x00, 0x0c, 0x00,
   0x08, 0x00, 0x18, 0x00, 0x10, 0x00};
"
    image create bitmap lightLineDn$w -data "
#define lightLineDn10x9_width 10
#define lightLineDn10x9_height 9
static unsigned char lightLineDn10x9_bits[] = {
   0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x80, 0x01, 0x80, 0x00, 0xc0, 0x00,
   0x40, 0x00, 0x60, 0x00, 0x20, 0x00};
"
}

#------------------------------------------------------------------------------
# tablelist::sunken12x11Arrows
#------------------------------------------------------------------------------
proc tablelist::sunken12x11Arrows w {
    image create bitmap triangleUp$w -data "
#define triangleUp12x11_width 12
#define triangleUp12x11_height 11
static unsigned char triangleUp12x11_bits[] = {
   0x60, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf8, 0x01, 0xf8, 0x01, 0xfc, 0x03,
   0xfc, 0x03, 0xfe, 0x07, 0xfe, 0x07, 0xff, 0x0f, 0xff, 0x0f};
"
    image create bitmap darkLineUp$w -data "
#define darkLineUp12x11_width 12
#define darkLineUp12x11_height 11
static unsigned char darkLineUp12x11_bits[] = {
   0x20, 0x00, 0x30, 0x00, 0x10, 0x00, 0x18, 0x00, 0x08, 0x00, 0x0c, 0x00,
   0x04, 0x00, 0x06, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00};
"
    image create bitmap lightLineUp$w -data "
#define lightLineUp12x11_width 12
#define lightLineUp12x11_height 11
static unsigned char lightLineUp12x11_bits[] = {
   0x40, 0x00, 0xc0, 0x00, 0x80, 0x00, 0x80, 0x01, 0x00, 0x01, 0x00, 0x03,
   0x00, 0x02, 0x00, 0x06, 0x00, 0x04, 0x00, 0x0c, 0xff, 0x0f};
"
    image create bitmap triangleDn$w -data "
#define triangleDn12x11_width 12
#define triangleDn12x11_height 11
static unsigned char triangleDn12x11_bits[] = {
   0xff, 0x0f, 0xff, 0x0f, 0xfe, 0x07, 0xfe, 0x07, 0xfc, 0x03, 0xfc, 0x03,
   0xf8, 0x01, 0xf8, 0x01, 0xf0, 0x00, 0xf0, 0x00, 0x60, 0x00};
"
    image create bitmap darkLineDn$w -data "
#define darkLineDn12x11_width 12
#define darkLineDn12x11_height 11
static unsigned char darkLineDn12x11_bits[] = {
   0xff, 0x0f, 0x03, 0x00, 0x02, 0x00, 0x06, 0x00, 0x04, 0x00, 0x0c, 0x00,
   0x08, 0x00, 0x18, 0x00, 0x10, 0x00, 0x30, 0x00, 0x20, 0x00};
"
    image create bitmap lightLineDn$w -data "
#define lightLineDn12x11_width 12
#define lightLineDn12x11_height 11
static unsigned char lightLineDn12x11_bits[] = {
   0x00, 0x00, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x06, 0x00, 0x02, 0x00, 0x03,
   0x00, 0x01, 0x80, 0x01, 0x80, 0x00, 0xc0, 0x00, 0x40, 0x00};
"
}

#------------------------------------------------------------------------------
# tablelist::createSortRankImgs
#------------------------------------------------------------------------------
proc tablelist::createSortRankImgs win {
    image create bitmap sortRank1$win -data "
#define sortRank1_width 4
#define sortRank1_height 6
static unsigned char sortRank1_bits[] = {
   0x04, 0x06, 0x04, 0x04, 0x04, 0x04};
"
    image create bitmap sortRank2$win -data "
#define sortRank2_width 4
#define sortRank2_height 6
static unsigned char sortRank2_bits[] = {
   0x06, 0x09, 0x08, 0x04, 0x02, 0x0f};
"
    image create bitmap sortRank3$win -data "
#define sortRank3_width 4
#define sortRank3_height 6
static unsigned char sortRank3_bits[] = {
   0x0f, 0x08, 0x06, 0x08, 0x09, 0x06};
"
    image create bitmap sortRank4$win -data "
#define sortRank4_width 4
#define sortRank4_height 6
static unsigned char sortRank4_bits[] = {
   0x04, 0x06, 0x05, 0x0f, 0x04, 0x04};
"
    image create bitmap sortRank5$win -data "
#define sortRank5_width 4
#define sortRank5_height 6
static unsigned char sortRank5_bits[] = {
   0x0f, 0x01, 0x07, 0x08, 0x09, 0x06};
"
    image create bitmap sortRank6$win -data "
#define sortRank6_width 4
#define sortRank6_height 6
static unsigned char sortRank6_bits[] = {
   0x06, 0x01, 0x07, 0x09, 0x09, 0x06};
"
    image create bitmap sortRank7$win -data "
#define sortRank7_width 4
#define sortRank7_height 6
static unsigned char sortRank7_bits[] = {
   0x0f, 0x08, 0x04, 0x04, 0x02, 0x02};
"
    image create bitmap sortRank8$win -data "
#define sortRank8_width 4
#define sortRank8_height 6
static unsigned char sortRank8_bits[] = {
   0x06, 0x09, 0x06, 0x09, 0x09, 0x06};
"
    image create bitmap sortRank9$win -data "
#define sortRank9_width 4
#define sortRank9_height 6
static unsigned char sortRank9_bits[] = {
   0x06, 0x09, 0x09, 0x0e, 0x08, 0x06};
"
}

#------------------------------------------------------------------------------
# tablelist::createCheckbuttonImgs
#------------------------------------------------------------------------------
proc tablelist::createCheckbuttonImgs {} {
    variable checkedImg [image create bitmap tablelist_checkedImg -data "
#define checked_width 9
#define checked_height 9
static unsigned char checked_bits[] = {
   0x00, 0x00, 0x80, 0x00, 0xc0, 0x00, 0xe2, 0x00, 0x76, 0x00, 0x3e, 0x00,
   0x1c, 0x00, 0x08, 0x00, 0x00, 0x00};
"]

    variable uncheckedImg [image create bitmap tablelist_uncheckedImg -data "
#define unchecked_width 9
#define unchecked_height 9
static unsigned char unchecked_bits[] = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
"]
}

#------------------------------------------------------------------------------
# tablelist::adwaitaTreeImgs
#------------------------------------------------------------------------------
proc tablelist::adwaitaTreeImgs {} {
    foreach mode {collapsed expanded collapsedSel expandedSel
		  collapsedAct expandedAct collapsedSelAct expandedSelAct} {
	variable adwaita_${mode}Img \
		 [image create photo tablelist_adwaita_${mode}Img]
    }

    variable pngSupported
    if {$pngSupported} {
	tablelist_adwaita_collapsedImg put "
iVBORw0KGgoAAAANSUhEUgAAAA0AAAAOCAYAAAD0f5bSAAAABGdBTUEAALGPC/xhBQAAAAlwSFlz
AAAOwQAADsEBuJFr7QAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAAVUlE
QVQoU2P4//8/yRirICGMymFgCELm48KoHAaGCiAORxbDhlE5EE3FhDSiciCaCGpE5SA0wTQmIcvD
1aFwKNREsvPICgiSg5z0yCUWYxXEj/8zAACoLdL8k+To/wAAAABJRU5ErkJggg==
"
	tablelist_adwaita_expandedImg put "
iVBORw0KGgoAAAANSUhEUgAAAA0AAAAOCAYAAAD0f5bSAAAABGdBTUEAALGPC/xhBQAAAAlwSFlz
AAAOwQAADsEBuJFr7QAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAAWklE
QVQoU5WLQQ7AIAgEufQbfrIXf0+LWhLrxG1J5sDAmLv/BqUCpQKlAqUiptzUD5SMRhnhOY5vwmeQ
0SZcgvY7LXOIQftbRA8jwiBgaXaQf0CpQKlAucftAn9twSV64sz7AAAAAElFTkSuQmCC
"
	tablelist_adwaita_collapsedSelImg put "
iVBORw0KGgoAAAANSUhEUgAAAA0AAAAOCAYAAAD0f5bSAAAABGdBTUEAALGPC/xhBQAAAAlwSFlz
AAAOwQAADsEBuJFr7QAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAAUElE
QVQoU2P4//8/yRirICGMLhCLxseK0QU6gTgFTQwDowuANLUAMV6N6AIgTQQ1ogvANME0FgExuhrq
aiLZeWQFBMlBTlbkEoWxCuLH/xkA08cuiUfbFjwAAAAASUVORK5CYII=
"
	tablelist_adwaita_expandedSelImg put "
iVBORw0KGgoAAAANSUhEUgAAAA0AAAAOCAYAAAD0f5bSAAAABGdBTUEAALGPC/xhBQAAAAlwSFlz
AAAOwQAADsEBuJFr7QAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAAWElE
QVQoU5XLMQ6AMBADwTS8hK/S8OrDLjiBsoqhGERW51FVv2FMMCYYE4yJP7ucH/iuR/fwEDp274H1
j9BwGtjrIc8hDmwK4kOPcGAYZYPWMCYYE4xrNS6APy6jKYbrTgAAAABJRU5ErkJggg==
"
	tablelist_adwaita_collapsedActImg put "
iVBORw0KGgoAAAANSUhEUgAAAA0AAAAOCAYAAAD0f5bSAAAABGdBTUEAALGPC/xhBQAAAAlwSFlz
AAAOwAAADsABataJCQAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAAV0lE
QVQoU2P4//8/yRirICGMymFg6EHm48KoHAaGs0A8BVkMG0blQDQdIaQRlQPRRFAjKgehCYSPAvFy
ZHm4OhQOhZpIdh5ZAUFykJMeucRirIL48X8GANuH2/YmUibsAAAAAElFTkSuQmCC
"
	tablelist_adwaita_expandedActImg put "
iVBORw0KGgoAAAANSUhEUgAAAA0AAAAOCAYAAAD0f5bSAAAABGdBTUEAALGPC/xhBQAAAAlwSFlz
AAAOwAAADsABataJCQAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAAW0lE
QVQoU5WLMQ7AMAjEWPue/H/smDfRkqRIaaxci+QBg83df4NSgVKBUoFSEVNu6gdKRqOM8BzHN+Ez
yGgTLkH7nZY5xKD9LaKHEWEQsDQ7yD+gVKBUoNzjdgEnwso211sfFwAAAABJRU5ErkJggg==
"
	tablelist_adwaita_collapsedSelActImg put "
iVBORw0KGgoAAAANSUhEUgAAAA0AAAAOCAYAAAD0f5bSAAAABGdBTUEAALGPC/xhBQAAAAlwSFlz
AAAOvwAADr8BOAVTJAAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAAUUlE
QVQoU2P4//8/yRirICGMLrAOjY8VowuAwE4gRhdHwegCIPAZiPFqRBeAAbwa0QWQwTcgvgjE6Gqo
q4lk55EVECQHOVmRSxTGKogf/2cAACEfOvsNAw2AAAAAAElFTkSuQmCC
"
	tablelist_adwaita_expandedSelActImg put "
iVBORw0KGgoAAAANSUhEUgAAAA0AAAAOCAYAAAD0f5bSAAAABGdBTUEAALGPC/xhBQAAAAlwSFlz
AAAOwAAADsABataJCQAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAAWElE
QVQoU5XLwQ2AMBADwRSQnui/Ib6H/eBElBWGSIPCKh5V9RvGBGOCMcGY+HPIl+N3PbqHp9Bx74H1
RWi4DWz5kecQB7YF8UMfHBhGmdAaxgRjgvFdjQtoujswws5A0wAAAABJRU5ErkJggg==
"
    } else {
	tablelist_adwaita_collapsedImg put "
R0lGODlhDQAOAPcAAAAAAIeHh4yMjJ2dnaioqK2trQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAANAA4A
AAgxAP8JHEiwoMGD/wogJBiAwEKBAQQ4XBgg4sSDFSMOQJhRwEaMFilKfNjwYUKTKFEGBAA7
"
	tablelist_adwaita_expandedImg put "
R0lGODlhDQAOAPcAAAAAAIeHh4yMjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAANAA4A
AAgpAP8JHEiwoMGDCBMqXBigoUOHBQU8DCDgoMSGFRFKzJgwwMKPIEMmDAgAOw==
"
	tablelist_adwaita_collapsedSelImg put "
R0lGODlhDQAOAPcAAAAAAMzMzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAANAA4A
AAgrAP8JHEiwoMGD/wIgJBhA4cKEDR82jIhwIkWDFh1inLiQY0eNFR+KHCkwIAA7
"
	tablelist_adwaita_expandedSelImg put "
R0lGODlhDQAOAPcAAAAAAMzMzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAANAA4A
AAgiAP8JHEiwoMGDCBMqXBigoUOHBR9CNCgx4USLCzNq3JgwIAA7
"
	tablelist_adwaita_collapsedActImg put "
R0lGODlhDQAOAPcAAAAAADIyMjo6Ojs7O1hYWGtra3NzcwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAANAA4A
AAgxAP8JHEiwoMGD/wwgJBigwEKBAQY4XBgg4sSDFQMIIIAw48aOFilKfNjwYUKTKFEGBAA7
"
	tablelist_adwaita_expandedActImg put "
R0lGODlhDQAOAPcAAAAAADIyMjo6OgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAANAA4A
AAgpAP8JHEiwoMGDCBMqXBigoUOHBQU8DCDgoMSGFRFKzJgwwMKPIEMmDAgAOw==
"
	tablelist_adwaita_collapsedSelActImg put "
R0lGODlhDQAOAPcAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAANAA4A
AAgrAP8JHEiwoMGD/wIgJBhA4cKEDR82jIhwIkWDFh1inLiQY0eNFR+KHCkwIAA7
"
	tablelist_adwaita_expandedSelActImg put "
R0lGODlhDQAOAPcAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAANAA4A
AAgiAP8JHEiwoMGDCBMqXBigoUOHBR9CNCgx4USLCzNq3JgwIAA7
"
    }
}

#------------------------------------------------------------------------------
# tablelist::ambianceTreeImgs
#------------------------------------------------------------------------------
proc tablelist::ambianceTreeImgs {} {
    foreach mode {collapsed expanded} {
	variable ambiance_${mode}Img \
		 [image create photo tablelist_ambiance_${mode}Img]
    }

    tablelist_ambiance_collapsedImg put "
R0lGODlhEwAPAPcAAAAAADw7N9/Wxd/Wxt/WyODYyeLZyuHazeTdz+Pd0eTd0uXf0+Xf1efg1OXg
1ujh0+jg1Onj1+nj2Ork2O3m3Ozm3e7p4e/q4e7s5u/s6PHs5PHs5fHs5vHu6fPw6vTw6vTw6/bz
7vbz7/b07vb07/b08Pb08fj28/n49Pr59fr59vv5+Pv6+Pr6+vz6+fz7+v39/QAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAATAA8A
AAjAAP/9OyCgoEGDBwQqFFigQwsYECPCaJGhwMKBGVawcOHihUeOLFZgSKhQgIkTKFCkSKFiZcoT
JQQsFBBCBIkSJkwEyFmCxAgSMkt+8NDBAwgQAY568PDhQ1CBAjhI5aBhQ4ANG6ZyePpPwIULFgKI
HRvg6wWuAipUoKC2QoC2bdFOiCChroQAdiNMmID2AYS/fwMAhtDgAVoFCBIrXoxgAdcDDAxInkzZ
gAOSCgskIDCgs+cBBBJYvDjwoGnMCgMCADs=
"
    tablelist_ambiance_expandedImg put "
R0lGODlhEwAPAPcAAAAAADw7N9/Wxd/Wxt/WyODYyeLZyuHazeTdz+Pd0eTd0uXf0+Xf1efg1OXg
1ujh0+jg1Onj1+nj2Ork2O3m3Ozm3e7p4e/q4e7s5u/s6PHs5PHs5fHs5vHu6fPw6vTw6vTw6/bz
7vbz7/b07vb07/b08Pb08fj18fj28/n49Pr59fr59vv5+Pv6+Pr6+vz6+fz7+v39/QAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAATAA8A
AAi5AP/9OyCgoEGDBwQqFFigg4sYECPGcJGhwMKBGVi0ePEChkeOLVhgSKhQgAkUKVKoULFiZUoU
JQQsFBBCBIkSJkycyFmCxAgSMkt+8NDBA4ijRz14+PAhqEABHKJy0LCBw4aqUp3+E3DhgoUAYMMG
6HpBq4AKFSigXcu2gtkJESTInSs3woQJZh9A2Mu3b4MHZhUgGEy4MIIFWg8wMMC4sWMDDkgqLJCA
wIDLmAcQSGDx4sCDoCUrDAgAOw==
"
}

#------------------------------------------------------------------------------
# tablelist::aquaTreeImgs
#------------------------------------------------------------------------------
proc tablelist::aquaTreeImgs {} {
    foreach mode {collapsed expanded collapsedSel expandedSel} {
	variable aqua_${mode}Img \
		 [image create photo tablelist_aqua_${mode}Img]
    }

    variable pngSupported
    variable winSys
    scan $::tcl_platform(osVersion) "%d" majorOSVersion
    if {[string compare $winSys "aqua"] == 0 && $majorOSVersion > 10} {
	set osVerPost10 1
    } else {
	set osVerPost10 0
    }

    if {$pngSupported} {
	if {$osVerPost10} {
	    tablelist_aqua_collapsedImg put "
iVBORw0KGgoAAAANSUhEUgAAABUAAAAOCAYAAADABlfOAAAABGdBTUEAALGPC/xhBQAAAAlwSFlz
AAAOwgAADsIBFShKgAAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAAaklE
QVQ4T2MYBSjg////DMXFxQ+B2A/GR6bJBkAD/0PxViBWAhmICxMNkAwF4Z9AXIXNQBAmGqAZCsNX
gdie2obCcAC6wUQZjsUgEMZwKUkAzTCMMCULIBmIEvtkAZhmoEHUT6eDEDAwAACJ1s4t5kg57QAA
AABJRU5ErkJggg==
"
	    tablelist_aqua_expandedImg put "
iVBORw0KGgoAAAANSUhEUgAAABUAAAAOCAYAAADABlfOAAAABGdBTUEAALGPC/xhBQAAAAlwSFlz
AAAOwgAADsIBFShKgAAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAAgElE
QVQ4T82Quw3AIAxEmYVF2ABlFzr2YhQGYIxU5E5yJIsiiQkFTzrxke8VdlvQe5ebgbfSPtKUUkP6
Q5qMfgelOEjGRBm1gWIZRHeKjNjgzlD2yKlkDN9+aqdExFkJmTwlZEkHoirCqv/N6DJkQaRB//8G
woPnMiFZJtLYpc5dCuytTkpAX+QAAAAASUVORK5CYII=
"
	} else {
	    tablelist_aqua_collapsedImg put "
iVBORw0KGgoAAAANSUhEUgAAABUAAAAOCAYAAADABlfOAAAABGdBTUEAALGPC/xhBQAAAAlwSFlz
AAAOwgAADsIBFShKgAAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAAVUlE
QVQ4T2MYBRigra3tIRD7QbnUAUAD/0PxViBWggpTBpAMBeGfQFwFlSIfoBkKw1eB2B6qhHSAZhg6
DoAqIw1gMQiEqepSqocpVWOf+ul0EAIGBgD3QGlokXBrxgAAAABJRU5ErkJggg==
"
	    tablelist_aqua_expandedImg put "
iVBORw0KGgoAAAANSUhEUgAAABUAAAAOCAYAAADABlfOAAAABGdBTUEAALGPC/xhBQAAAAlwSFlz
AAAOwgAADsIBFShKgAAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAAbklE
QVQ4T2MYBbQHbW1tD4H4Px78EKqUeADU5IdmCDr2gyolDQA1bkUzCIa3QpWQDoCalYD4J5JhIAzi
K/3//58BhMkCQAOqkAwE4SqoFGUAaNBVqIFXoUKUA6Bh9lBD7aFC1AFAAwOgzGEHGBgA7s9vYvwQ
9+MAAAAASUVORK5CYII=
"
	}

	tablelist_aqua_collapsedSelImg put "
iVBORw0KGgoAAAANSUhEUgAAABUAAAAOCAYAAADABlfOAAAABGdBTUEAALGPC/xhBQAAAAlwSFlz
AAAOwwAADsMBx2+oZAAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAAVElE
QVQ4T2MYBRjg////N4HYEcqlDgAaCANLgFgCKkwZgJgHB5+AOAsqRT6AmIUBTgOxKVQJ6QBiBk7g
DFVGGoBqRgdUdSnVw5SqsU/9dDoIAQMDAK4npwmnhxytAAAAAElFTkSuQmCC
"
	tablelist_aqua_expandedSelImg put "
iVBORw0KGgoAAAANSUhEUgAAABUAAAAOCAYAAADABlfOAAAABGdBTUEAALGPC/xhBQAAAAlwSFlz
AAAOwwAADsMBx2+oZAAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAAbElE
QVQ4T2MYBbQH////vwnE+MBNqFLiAVCTI0QvTuAIVUoaAGpcAtGPAZZAlZAOgJolgPgT2BgEAPEl
oErIA0ADssBGIUAWVIoyADToNMS8/6ehQpQDoGGmEDP/m0KFqAOABjpDmcMOMDAAAJg2pwkFRUVJ
AAAAAElFTkSuQmCC
"
    } else {
	if {$osVerPost10} {
	    tablelist_aqua_collapsedImg put "
R0lGODlhFQAOAPcAAAAAAHNzc3Z2doODg4qKipubmwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAVAA4A
AAg5AP8JHEiwoMGDCBMqXChwAEOEAQIUeFgwYgABFAdajEgg40aLFD92DBkRY8Z/ESee/OdwpcuX
AgMCADs=
"
	    tablelist_aqua_expandedImg put "
R0lGODlhFQAOAPcAAAAAAHNzc3Z2doODg4qKipubmwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAVAA4A
AAg2AP8JHEiwoMGDCBMqXMhQ4YAAECMGGNBQYsSG/wpYLIDxn4CIAjoKvCjyH4EABEqOVMmypcqA
ADs=
"
	} else {
	    tablelist_aqua_collapsedImg put "
R0lGODlhFQAOAPcAAAAAAIaGhoiIiJSUlJmZmampqQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAVAA4A
AAg5AP8JHEiwoMGDCBMqXChwAEOEAQIUeFgwYgABFAdajEgg40aLFD92DBkRY8Z/ESee/OdwpcuX
AgMCADs=

"
	    tablelist_aqua_expandedImg put "
R0lGODlhFQAOAPcAAAAAAIaGhoiIiJSUlJmZmampqQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAVAA4A
AAg2AP8JHEiwoMGDCBMqXMhQ4YAAECMGGNBQYsSG/wpYLIDxn4CIAjoKvCjyH4EABEqOVMmypcqA
ADs=
"
	}

	tablelist_aqua_collapsedSelImg put "
R0lGODlhFQAOAPcAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAVAA4A
AAgyAP8JHEiwoMGDCBMqXCgwAEOEASI+LBhR4sSGFS0+zFhxIkeHHjte/CdyJMiRKFMSDAgAOw==
"
	tablelist_aqua_expandedSelImg put "
R0lGODlhFQAOAPcAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAVAA4A
AAgvAP8JHEiwoMGDCBMqXMhQYYCHECE2jChxIsUADQVSzDiwIsd/Hj9i/EiypEmCAQEAOw==
"
    }
}

#------------------------------------------------------------------------------
# tablelist::baghiraTreeImgs
#------------------------------------------------------------------------------
proc tablelist::baghiraTreeImgs {} {
    foreach mode {collapsed expanded} {
	variable baghira_${mode}Img \
		 [image create photo tablelist_baghira_${mode}Img]
    }

    tablelist_baghira_collapsedImg put "
R0lGODlhEAAOAPcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAQAA4A
AAgoAP8JHEiwoMGDCBMqXCgQAMOBABw+jChxIcWKCSlOxKiQ48OPIBkGBAA7
"
    tablelist_baghira_expandedImg put "
R0lGODlhEAAOAPcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAQAA4A
AAgkAP8JHEiwoMGDCBMqXMiw4UEAECMCUChx4sKIDi063Mixo8KAADs=
"
}

#------------------------------------------------------------------------------
# tablelist::dustTreeImgs
#------------------------------------------------------------------------------
proc tablelist::dustTreeImgs {} {
    foreach mode {collapsed expanded} {
	variable dust_${mode}Img \
		 [image create photo tablelist_dust_${mode}Img]
    }

    tablelist_dust_collapsedImg put "
R0lGODlhEwAPAPcAAAAAADIyMrConLGpncC6scC7ssG8s8K8tMK9tdDMxtDMx9LOyNrVztvVz9vW
ztvWz9vX0NzW0N3Y0d/a0uDd1uHe1+Lf2OPg2uTh2+Xj3efk3+jl4Ojm4enm4unn4+nn5Orn5evo
5Ovo5evq5ezp5e3q5u3q5+7s6O/t6e7t6vDu6/Hv7PHv7fLw7PLw7vT08vf39fj39fn49vn49wAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAATAA8A
AAjCAP8RGCCgoEGDAwj8W7jQwIIXMGLImEFRRgwYLxQcYPhvAIsSJ1CoWNFihQoUJ0a4GMBRAIsO
IUiUMEGzBIkQHVgIaJkCQwYNGzgE4LBBQwYMKXYyFGCCQgULFy4EiGqhAgUTShcKECGhq4QJASZ4
lSAi6z8BHRhECMC2bYAHDzqYRQv3gYMHARrUjTvXw168fz30/ft2r+CWISIoXsw4QgizAzxAaMwY
ggeWDA8oACGis2fPHxIg4CiQ4MGDAwqQDggAOw==
"
    tablelist_dust_expandedImg put "
R0lGODlhEwAPAPcAAAAAADIyMrConLGpncS+tcS/tsbBuMfBucfCucfCutfTzdjUztnUz9vWztvW
z9vX0NzW0N3Y0d/a0t/a0+Dd1uHe1+Lf2OPg2uTh2+Xj3efk3+jl4Ojm4enm4unn4+vo5Ovo5evp
5uvq5ezp5e3q5u3q5+7s6O/t6e7t6vDu6/Hv7PLv7fLw7PHw7fLx7vX08vf39fj39fn49vn49wAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAATAA8A
AAi9AP8RGCCgoEGDAwj8W7jQwIIXMGLImEFRRgwYLxQgYPhvQAsSJk6kUMFCRYoTJkS4GMBRwIoO
H0aQKEGTxIgPHVYIaIkCQwYNGzgI3aAhAwYUOxkKKEGhgoULFzBAtVCBQomkCwWAiMA1goQJErpG
AIH1n4AOCyAEWMs2gAMHHcqefeugwVsGdOHK9ZC371sPe/32BdzyA4TDiBND+FB2wIcHihM/+MCS
4QEGIUBo3sx5QQKOAgkePDigAOiAADs=
"
}

#------------------------------------------------------------------------------
# tablelist::dustSandTreeImgs
#------------------------------------------------------------------------------
proc tablelist::dustSandTreeImgs {} {
    foreach mode {collapsed expanded} {
	variable dustSand_${mode}Img \
		 [image create photo tablelist_dustSand_${mode}Img]
    }

    tablelist_dustSand_collapsedImg put "
R0lGODlhEwAPAPcAAAAAADIyMpuWjJyXjrSxqbWxqre0rbi1rrm2r8K+tsO+t8TAuMXBusbCu8nF
vcnGvsrHv8vHwMnGwcrIwczIwMzIwc3Jw87LxMzKxc/MxdDMxdDMx9HOx9HOyNLPydPPytPQydPQ
y9TRy9TRzNXTzNXSzdfTztbUzNbUzdfVz9nV0NjW0NnW0drY097c2eDe2eXi3uXj3+jm4+nn5Oro
5QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAATAA8A
AAjCAP8RGCCgoEGDAwj8W7jQwAQYMmTMmEFjYsQYEg4w/DfgRYkSJlSsYLFChYkSI14M2CjAxYYO
H0SMmCniQ4cNLgSwbFHBwoUMGgJoyHDBQoUWOhkKSOHgAYQIFAJQiADhgYMUSRcKCMGgK4MGARp4
ZRAi6z8BHBIoCMC2bQAFCjiYRQsXboIAauvKZcmhLty3fvcq7eB3beEOcz0sWMy48QIPZgeUcEyZ
xEqGBzCgAMG5c+cTGBBs/FeA4MGDAwqMDggAOw==
"
    tablelist_dustSand_expandedImg put "
R0lGODlhEwAPAPcAAAAAADIyMpuWjJyXjrSxqbWxqre0rbi1rrm2r8K+tsO+t8TAuMXBusbCu8bC
vMnFvcnGvsrHv8vHwMnGwcrIwczIwMzIwc3Jw87LxMzKxc/Mxc/MxtDMxdDMx9HOx9HOyNLPydPP
ytPQydPQy9TRy9TRzNXTzNXSzdfTztbUzNbUzdfVz9nV0NjW0NnW0drY097c2eDe2eXi3uXj3+jm
4+nn5Oro5QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAATAA8A
AAi/AP8RGCCgoEGDAwj8W7jQAAUZNGjUqGFjYsQZEw4w/DcgxokTKFi0cNGCBYoTJWIM2CgARocP
IUiUmEkixIcOMASwfGHhAgYNHDZw0IDhgoUXOhkKWPEAQgQJFSxUkBABwoMVSRcKGMGgK4MGDhp4
ZTAi6z8BHhIoCMC2bQAFCjyYRQsXboK7dePO9ZC3L1y5LD/47fthLogFiBMrXgDC7IATiyObWMnw
QAYVIjJr1pwiA4KN/woQPHhwQAHQAQEAOw==
"
}

#------------------------------------------------------------------------------
# tablelist::gtkTreeImgs
#------------------------------------------------------------------------------
proc tablelist::gtkTreeImgs {} {
    foreach mode {collapsed expanded collapsedAct expandedAct} {
	variable gtk_${mode}Img \
		 [image create photo tablelist_gtk_${mode}Img]
    }

    variable pngSupported
    if {$pngSupported} {
	tablelist_gtk_collapsedImg put "
iVBORw0KGgoAAAANSUhEUgAAABIAAAAOCAYAAAAi2ky3AAAABGdBTUEAALGPC/xhBQAAABl0RVh0
U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMtfuaUMAAABTSURBVDhPtdLBDQAgCANA376YgTmcj8UY
TG2iiV9t7QAX0lLKxzSJbWZ9QjwGyN15DFBm8hgghMY2RGMnBCwi+hqgXq0pv0jSEY2gA+kfST77
FRmz+lZUJ0vkXgAAAABJRU5ErkJggg==
"
	tablelist_gtk_expandedImg put "
iVBORw0KGgoAAAANSUhEUgAAABIAAAAOCAYAAAAi2ky3AAAABGdBTUEAALGPC/xhBQAAABl0RVh0
U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMtfuaUMAAABRSURBVDhPY2AYBXQNARsBAYH/xGKgy2zw
uc5GSUnp/+HDh/9jAyBxkDwhQ2AWYDWMVEOwGkauISiGtbW1keQdXOEGjgBiw4RQ0uAipGBwywMA
wOZWVA37acsAAAAASUVORK5CYII=
"
	tablelist_gtk_collapsedActImg put "
iVBORw0KGgoAAAANSUhEUgAAABIAAAAOCAYAAAAi2ky3AAAAAXNSR0IArs4c6QAAAARnQU1BAACx
jwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABl0RVh0
U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuND6NzHYAAABLSURBVDhPY2CgIbChitkCAgL/gQZRbhjI
IAkJCcoNAxlEFcNgBlFsGLJBFBmGbhCMD4wALpJikyYuoij2qBprFLkEFpBUS9nkZg8AkLUuN8tq
YDwAAAAASUVORK5CYII=
"
	tablelist_gtk_expandedActImg put "
iVBORw0KGgoAAAANSUhEUgAAABIAAAAOCAYAAAAi2ky3AAAAAXNSR0IArs4c6QAAAARnQU1BAACx
jwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABl0RVh0
U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuND6NzHYAAABCSURBVDhPY2AYBXQNgUwBAYH/xGKgyzLx
uY4owwgZArMAr2HEGoLXMFINwTBMSUnpP7mGoBhGqSEww0TomnaobhkAI24v01R6oWMAAAAASUVO
RK5CYII=
"
    } else {
	tablelist_gtk_collapsedImg put "
R0lGODlhEgAOAPcAAAAAABAQECIiIoaGhsPDw////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAASAA4A
AAg5AP8JHEiwoMGDCAkGSIgwgACGBgMQeAhxYIACEysKvIiRIkSOBQYs/Figo8aLGU+mPOnxpMaX
BAMCADs=
"
	tablelist_gtk_expandedImg put "
R0lGODlhEgAOAPcAAAAAABAQECIiIoaGhsPDw////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAASAA4A
AAg1AP8JHEiwoMGDCBMqXMiwYYCHECMGQCiAQIGLFwkIUFgRo0aGHT82FDBgY0OBE0+qXMlSYEAA
Ow==
"
	tablelist_gtk_collapsedActImg put "
R0lGODlhEgAOAPcAAAAAABAQEBgYGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAASAA4A
AAg0AP8JHEiwoMGDCAkGSIgwgACGBgM4hKhQ4kOK/yRaxKhRI8WOFyFqDClyIsaMJD+eXCkwIAA7
"
	tablelist_gtk_expandedActImg put "
R0lGODlhEgAOAPcAAAAAABAQECIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAASAA4A
AAgsAP8JHEiwoMGDCBMqXMiwYYCHECMGQCgxosKKExdKbPjvoQCOAjOCHEkSZEAAOw==
"
    }
}

#------------------------------------------------------------------------------
# tablelist::klearlooksTreeImgs
#------------------------------------------------------------------------------
proc tablelist::klearlooksTreeImgs {} {
    foreach mode {collapsed expanded} {
	variable klearlooks_${mode}Img \
		 [image create photo tablelist_klearlooks_${mode}Img]
    }

    tablelist_klearlooks_collapsedImg put "
R0lGODlhEAAOAPcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAQAA4A
AAgoAP8JHEiwoMGDCBMqXPgPAACGAh0+hCgRYkOHDCsu1LhxosWPIBkGBAA7
"
    tablelist_klearlooks_expandedImg put "
R0lGODlhEAAOAPcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAQAA4A
AAgoAP8JHEiwoMGDCBMqXMiQIAAAAx8mfAiRokKKEhdabAixocePID8GBAA7
"
}

#------------------------------------------------------------------------------
# tablelist::mateTreeImgs
#------------------------------------------------------------------------------
proc tablelist::mateTreeImgs {} {
    foreach mode {collapsed expanded collapsedAct expandedAct} {
	variable mate_${mode}Img \
		 [image create photo tablelist_mate_${mode}Img]
    }

    variable pngSupported
    if {$pngSupported} {
	tablelist_mate_collapsedImg put "
iVBORw0KGgoAAAANSUhEUgAAAA0AAAAOCAYAAAD0f5bSAAAAAXNSR0IArs4c6QAAAARnQU1BAACx
jwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41
LjEwMPRyoQAAAI5JREFUKFOVzsENQEAQBdApQAEaUIAyFKARVxGJCsRBAdwUgLg4KGx9VnYmMmvj
8JKf2f+TJWPMb+oxRD2GcCCK5MMXDkQLZPLRhwPRATP0kMjSGwc7qmF4cgHqlznYYgkNtLDDCrEc
3F0XeNTBBiOksuy6LtjRBNcgl6U3DnZUyUcfDp6vaNRjiHr8ZugEGr3O4KKrCEAAAAAASUVORK5C
YII=
"
	tablelist_mate_expandedImg put "
iVBORw0KGgoAAAANSUhEUgAAAA0AAAAOCAYAAAD0f5bSAAAAAXNSR0IArs4c6QAAAARnQU1BAACx
jwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41
LjEwMPRyoQAAAI1JREFUKFOV0L0NwjAQhuEbgAG8AAMwgJdhDbr0UFKkygIoKZEiKgYzb5zEnMkp
J4rHsr/7KSwppb+ZoccMPWbomQ+RiPeO42ZoGbyjw0V54KwHcm+5iARMW29o0KLHQQ/k3urBVgy4
4oWo66WverAV0/YnRl3TtsH3U8JvbWWHIicrX5mhxww9ZrgvyQcolMcXU9O+JgAAAABJRU5ErkJg
gg==
"
	tablelist_mate_collapsedActImg put "
iVBORw0KGgoAAAANSUhEUgAAAA0AAAAOCAYAAAD0f5bSAAAAAXNSR0IArs4c6QAAAARnQU1BAACx
jwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41
LjEwMPRyoQAAAI1JREFUKFOVkMENgzAMRf8WTNEpmIFZOgGDcKsqem3FBSE6ERO4P8SKLWSIenjK
i/MtW4GI/E1YrBEWa5gAjX+4wgRYyd0/nmECbNo4kdaHjpgAXzKSWX0g4comOfggL/LWe5p88w17
tog1fUgKp4mdD5dskdy06Nn70BGTHH6S6tebnKwSERZrhMVrBD8rI88WMxe4BQAAAABJRU5ErkJg
gg==
"
	tablelist_mate_expandedActImg put "
iVBORw0KGgoAAAANSUhEUgAAAA0AAAAOCAYAAAD0f5bSAAAAAXNSR0IArs4c6QAAAARnQU1BAACx
jwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41
LjEwMPRyoQAAAH9JREFUKFOVkNENgDAIBZnFSbqHU7hDp3EDExNTHQyh0kotKfHjVI73+BAQ8Tem
9DClhyk9ngdAJK4Bc1eSYiJOYlNwYdWFnK0fAEFCB7ETfITnSRdythnoqgS5yO+o9zXXDHRVwkzS
O00v3p8SvruCLQEWyxdM6WFKD1OOQbgBANvLoUTXnyUAAAAASUVORK5CYII=
"
    } else {
	tablelist_mate_collapsedImg put "
R0lGODlhDQAOAPcAAAAAADw8PEBAQEVFRUdHR0hISElJSVVVVVxcXF1dXWlpaW1tbW9vb319fYCA
gIKCgoSEhI2Njba2tgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAANAA4A
AAg0AP8JHEiwoMGDCBMmLCBB4b8ABhQoDOAgQYAICANAaMBAAIGDGhcMQJDxwICJDxyqXKkyIAA7
"
	tablelist_mate_expandedImg put "
R0lGODlhDQAOAPcAAAAAADw8PEJCQkREREdHR09PT1BQUFJSUl9fX2VlZWlpaXFxcXJycn19fYSE
hJ2dnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAANAA4A
AAgzAP8JHEiwoMGDCBMmDMCwYQCDChA4mHjgwcEACxokMJCwAAMBCg0QGKDw38OSKFOqRBgQADs=
"
	tablelist_mate_collapsedActImg put "
R0lGODlhDQAOAPcAAAAAADw8PD09PT8/P0FBQUZGRkhISElJSVJSUlNTU1VVVVdXV15eXoiIiAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAANAA4A
AAgzAP8JHEiwoMGDCBMmFNBA4b8AAgooDJCAQAAGCAMsQHAA4kGNBgQQyDggwEQFDlOqTBkQADs=
"
	tablelist_mate_expandedActImg put "
R0lGODlhDQAOAPcAAAAAADw8PD09PT4+PkBAQENDQ0ZGRlVVVQAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAANAA4A
AAgxAP8JHEiwoMGDCBMmDMCwYQCDAwQYmBjgwMEABAoMeIgQI8eOAQYo/PdxpMmTKA0GBAA7
"
    }
}

#------------------------------------------------------------------------------
# tablelist::mintTreeImgs
#------------------------------------------------------------------------------
proc tablelist::mintTreeImgs {} {
    foreach mode {collapsed expanded collapsedSel expandedSel} {
	variable mint_${mode}Img \
		 [image create photo tablelist_mint_${mode}Img]
    }

    variable pngSupported
    if {$pngSupported} {
	tablelist_mint_collapsedImg put "
iVBORw0KGgoAAAANSUhEUgAAAA0AAAAOCAYAAAD0f5bSAAAABGdBTUEAALGPC/xhBQAAAAlwSFlz
AAAOvwAADr8BOAVTJAAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAAV0lE
QVQoU2P4//8/yRirICGMymFgmI3Mx4VROQwM94B4MbIYNozKgWi6SkgjKgeiiaBGVA5CEwhfB+Lt
yPJwdSgcCjWR7DyyAoLkICc9conFWAXx4/8MALGp3eTNJauCAAAAAElFTkSuQmCC
"
	tablelist_mint_expandedImg put "
iVBORw0KGgoAAAANSUhEUgAAAA0AAAAOCAYAAAD0f5bSAAAABGdBTUEAALGPC/xhBQAAAAlwSFlz
AAAOvwAADr8BOAVTJAAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAAW0lE
QVQoU5WL0Q2AMAgFmcGBuv8EfnYVlLaS1F76lOQ+ODhz99+gVKBUoFSgVMSUm/qBktEoIzzH8U34
DDLahEvQfqdlDjFof4voYUQYBCzNDvIPKBUoFSj3uF1KHMxW02hYDgAAAABJRU5ErkJggg==
"
	tablelist_mint_collapsedSelImg put "
iVBORw0KGgoAAAANSUhEUgAAAA0AAAAOCAYAAAD0f5bSAAAABGdBTUEAALGPC/xhBQAAAAlwSFlz
AAAOvgAADr4B6kKxwAAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAAUUlE
QVQoU2P4//8/yRirICGMLjAPjY8Vowu8AOLlaGIYGF0ApOk+EOPViC4A0kRQI7oATBNM4z4gRldD
XU0kO4+sgCA5yMmKXKIwVkH8+D8DAIioOIlmRAZbAAAAAElFTkSuQmCC
"
	tablelist_mint_expandedSelImg put "
iVBORw0KGgoAAAANSUhEUgAAAA0AAAAOCAYAAAD0f5bSAAAABGdBTUEAALGPC/xhBQAAAAlwSFlz
AAAOvwAADr8BOAVTJAAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAAWklE
QVQoU5XLsQ2AMBBD0TTsxP6L0LLFYRecQPmKoXiIfJ1HVf2GMcGYYEwwJv7scn7gux7dw0Po2L0H
1j9Cw2lgr4c8hziwKYgPPcKBYZQNWsOYYEwwrtW4AJnXOKReFQYYAAAAAElFTkSuQmCC
"
    } else {
	tablelist_mint_collapsedImg put "
R0lGODlhDQAOAPcAAAAAACEhISgoKCoqKkhISFxcXGRkZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAANAA4A
AAgxAP8JHEiwoMGD/wwgJBigwEKBAQY4XBgg4sSDFQMIIIAw48aOFilKfNjwYUKTKFEGBAA7
"
	tablelist_mint_expandedImg put "
R0lGODlhDQAOAPcAAAAAACEhISkpKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAANAA4A
AAgpAP8JHEiwoMGDCBMqXBigoUOHBQU8DCDgoMSGFRFKzJgwwMKPIEMmDAgAOw==
"
	tablelist_mint_collapsedSelImg put "
R0lGODlhDQAOAPcAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAANAA4A
AAgrAP8JHEiwoMGD/wIgJBhA4cKEDR82jIhwIkWDFh1inLiQY0eNFR+KHCkwIAA7
"
	tablelist_mint_expandedSelImg put "
R0lGODlhDQAOAPcAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAANAA4A
AAgiAP8JHEiwoMGDCBMqXBigoUOHBR9CNCgx4USLCzNq3JgwIAA7
"
    }
}

#------------------------------------------------------------------------------
# tablelist::newWaveTreeImgs
#------------------------------------------------------------------------------
proc tablelist::newWaveTreeImgs {} {
    foreach mode {collapsed expanded collapsedAct expandedAct} {
	variable newWave_${mode}Img \
		 [image create photo tablelist_newWave_${mode}Img]
    }

    variable pngSupported
    if {$pngSupported} {
	tablelist_newWave_collapsedImg put "
iVBORw0KGgoAAAANSUhEUgAAABIAAAAOCAYAAAAi2ky3AAAAAXNSR0IArs4c6QAAAARnQU1BAACx
jwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABl0RVh0
U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuNUmK/OAAAADDSURBVDhPY2AYtMDHx4cPiGf4+vqKUuRI
oCECHh4eH9zd3e8D2YVAzEqWgSCDnJ2db7GxseWbmZlt8vb2vggU8yLZMJBBLi4uV4EaI0BYVFQ0
y9HR8RBQfCsQaxBtIMggNze3i0ANbshYQ0MjH+jdy0D5fpAaggaCFAE1nAEqNEHGOjo6KcCwA3mT
eIM8PT1PAA1RAmFVVVVroAs3k+U1Ly+vw7KyspJAAzqABpwjO7CBGh8DMcgbFEU/dRIkwdiglwIA
fVBDhQiKWqEAAAAASUVORK5CYII=
"
	tablelist_newWave_expandedImg put "
iVBORw0KGgoAAAANSUhEUgAAABIAAAAOCAYAAAAi2ky3AAAAAXNSR0IArs4c6QAAAARnQU1BAACx
jwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABl0RVh0
U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuNUmK/OAAAACySURBVDhPY2AY3sDHx4cPiAUIYD6CoQA0
YIaHh8cHJyenu9gwSA6khqBBvr6+okDF99jY2PKBirOQMUgMJAdSQ9AgkAKgjYUWFhargcwIZAwS
A8kRZQjUIFZvb+8LEhIS0UC+GwiD2CAxoEGsRBsENczLxcVlB5BtCsIgNtAQL5IMgSkGatxqYmIS
BsIgNlmGQF2lAfTOKRAGGqRBtkFQw/qBhvRTZAjUIHDipNggcgwAAMDwRMOkXl9fAAAAAElFTkSu
QmCC
"
	tablelist_newWave_collapsedActImg put "
iVBORw0KGgoAAAANSUhEUgAAABIAAAAOCAYAAAAi2ky3AAAAAXNSR0IArs4c6QAAAARnQU1BAACx
jwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABl0RVh0
U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuNUmK/OAAAADOSURBVDhPY2AYtMDExITP2Nh4BhCLUuRI
oEECdqbGf+xNjd8ADSsE8lnJMhBkkI+F8Y9ZHoZP0u2MPlqYGF8HGuhFsmFggyyNvy/yNXoAwlO8
jB6H2xh/ARq2DYg1iDYQZJCvlfG3pYHGd5Fxp5fxEw9L489Aw/qBWICggWCDrI2/rgg1uYmMu3xM
HgEN+kSSQX7WJl/XRJpdA+E5Iaa3Iu1NPpLlNT8bky+rYswv57iZvrAwNb5GdmDbmxv/crQweUVp
9FMnQRKMDXopAACu/llcB/jCVQAAAABJRU5ErkJggg==
"
	tablelist_newWave_expandedActImg put "
iVBORw0KGgoAAAANSUhEUgAAABIAAAAOCAYAAAAi2ky3AAAAAXNSR0IArs4c6QAAAARnQU1BAACx
jwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABl0RVh0
U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuNUmK/OAAAAC7SURBVDhPY2AY3sDExIQPiAUIYD6CoWBs
bDzD1tT4j7e50U9sGCQHUkOMQaL2psZvZrgaPJvjhopBYiA5oEGiBA0CKQAqLEy3N/qw0MfoITIG
iYHkiDIEpAgYPqwWJsbXpvsaP1gaaHwXhEFskBhIjmiDoK7yirAz+bgq3PQGCIPYQNd4kWQITDFQ
47a+QNO7IGwCZJNlCNRVGp7WJh9AGGioBtkGQQ3rBxrST5EhUIMEgAYJUGwQOQYAAONtWMaau7wh
AAAAAElFTkSuQmCC
"
    } else {
	tablelist_newWave_collapsedImg put "
R0lGODlhEgAOAPcAAAAAAFJSUl5eXl9fX2JiYmZmZmdnZ2lpaWtra2xsbG5ubnBwcHJycnR0dH19
fX9/f5KSkpSUlJqampycnJ2dnaGhoaenp6ysrLm5ucvLy8zMzN3d3ejo6AAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAASAA4A
AAhNAP8JHEiwoMGDCAdGSIgwgACGBgVAYIAA4kACFixQUPDAogEMIDFUKCCBIYIMKDNcOFAy4YIN
GzQ46AixAYcJCiwKHJBAp0KfQIMWDAgAOw==
"
	tablelist_newWave_expandedImg put "
R0lGODlhEgAOAPcAAAAAAFJSUltbW19fX2xsbHBwcHh4eHl5eX9/f5KSkpSUlJWVlZqamqenp6ys
rLm5ubq6usrKygAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAASAA4A
AAhKAP8JHEiwoMGDCBMqXHhQQQABECMGUJBwQIIFGBckGLDwQIOPDQ4wJODgwQMHBBj+MxAhggGV
/xBAgIAA5r8CBWz+Y8BAp0+YAQEAOw==
"
	tablelist_newWave_collapsedActImg put "
R0lGODlhEgAOAPcAAAAAAEA3NUI6N1A9OFE/OVNAOlNCO1BCPFFDPVRCO1VEPF5EO2JJP29IPU1E
QlBIRFdTU1dVU3lWR21tbZVdSJ9dSJdgS6RbRq1iSqpsUrFoTrRuUrlzVrh4WYWFhYyMjAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAASAA4A
AAhNAP8JHEiwoMGDCAd6SIgwgAOGBgdcaAAB4kACGDBUWDDBYgENIDVQOPCBoYENKDdYQFAyYQIO
HDIw6AhRQQcJESwKFPBAp0KfQIMWDAgAOw==
"
	tablelist_newWave_expandedActImg put "
R0lGODlhEgAOAPcAAAAAAD83NU87NlNGP2FIP29KPk1EQldUU21tbZ1oT6JXRKVYRKNiS6xhSrFo
TrdwU4WFhYyMjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAASAA4A
AAhKAP8JHEiwoMGDCBMqXHgQQgABECMGgJDQgIIFGBcoMLCwQIOPDQowPMDAgQMGBxj+I/DgAQGV
/xAkSIAA5r8BA2z+ixBBp0+YAQEAOw==
"
    }
}

#------------------------------------------------------------------------------
# tablelist::oxygen1TreeImgs
#------------------------------------------------------------------------------
proc tablelist::oxygen1TreeImgs {} {
    foreach mode {collapsed expanded} {
	variable oxygen1_${mode}Img \
		 [image create photo tablelist_oxygen1_${mode}Img]
    }

    tablelist_oxygen1_collapsedImg put "
R0lGODlhEAAOAPcAAAAAABQTEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAQAA4A
AAgjAP8JHEiwoMGDCBMqXMjQYICGAh8yDECRYkOJFyFq3MixYUAAOw==
"
    tablelist_oxygen1_expandedImg put "
R0lGODlhEAAOAPcAAAAAABQTEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAQAA4A
AAgeAP8JHEiwoMGDCBMqXMiwocOEASJGfEixosWLGAMCADs=
"
}

#------------------------------------------------------------------------------
# tablelist::oxygen2TreeImgs
#------------------------------------------------------------------------------
proc tablelist::oxygen2TreeImgs {} {
    foreach mode {collapsed expanded collapsedAct expandedAct} {
	variable oxygen2_${mode}Img \
		 [image create photo tablelist_oxygen2_${mode}Img]
    }

    variable pngSupported
    if {$pngSupported} {
	tablelist_oxygen2_collapsedImg put "
iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAYAAAAmL5yKAAAABGdBTUEAALGPC/xhBQAAABl0RVh0
U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuODc7gF0AAABOSURBVDhPY2AYBegh4AIU8KMkWDyBmh8C
cTUlhpgANV8B4gVAzE2uQdZAjc+BuJQcA6yAmq4B8Swg5iDVAG+ghkfk2gyyzBGIQQE5kgAA2mMJ
YLECIngAAAAASUVORK5CYII=
"
	tablelist_oxygen2_expandedImg put "
iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAYAAAAmL5yKAAAAAXNSR0IArs4c6QAAAARnQU1BAACx
jwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABl0RVh0
U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuODc7gF0AAABRSURBVDhPY2AYBVQNAUegad5oJnoC+S7E
2gJS/AiIraAaTID0QyD2I9YAkLpSIL4GxNZAfAWIq0nRDFM7C8h4DsQLyNEM0sMBdQk3uQaMNH0A
PvwJYFasmD4AAAAASUVORK5CYII=
"
	tablelist_oxygen2_collapsedActImg put "
iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAYAAAAmL5yKAAAABGdBTUEAALGPC/xhBQAAABl0RVh0
U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuODc7gF0AAABbSURBVDhPY2AYBSghkHDhvwsQ+5EdLEDN
nkD8EIirKTHEBGjAFSBeAMTcZBkE1GgNxM+BuJRkA4CarID4GhDPAmIOkgwAavAG4kdk2QyyCajR
ERSQJNk69BUDAI0BNzsiLc7tAAAAAElFTkSuQmCC
"
	tablelist_oxygen2_expandedActImg put "
iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAYAAAAmL5yKAAAAAXNSR0IArs4c6QAAAARnQU1BAACx
jwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABl0RVh0
U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuODc7gF0AAABcSURBVDhPY2AYBdQLgYQL/x2B2BvZRCDf
E4hdiLIFqvgRkLYCaQDSJkD8EIj9iDIAqqkUqOEaEFsD8RUgriZaM0whUNMsIH4OxAtI1gx1BQdQ
M8gl3GQZMAI1AQCLtzc7P7D1iQAAAABJRU5ErkJggg==
"
    } else {
	tablelist_oxygen2_collapsedImg put "
R0lGODlhEAAOAPcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAQAA4A
AAgoAP8JHEiwoMGDCBMqXPgPAACGAh0+hCgRYkOHDCsu1LhxosWPIBkGBAA7
"
	tablelist_oxygen2_expandedImg put "
R0lGODlhEAAOAPcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAQAA4A
AAgoAP8JHEiwoMGDCBMqXMiQIAAAAx8mfAiRokKKEhdabAixocePID8GBAA7
"
	tablelist_oxygen2_collapsedActImg put "
R0lGODlhEAAOAPcAAAAAAGDQ/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAQAA4A
AAgoAP8JHEiwoMGDCBMqXPgvQACGAh0+hCgRYkOHDCsu1LhxosWPIBkGBAA7
"
	tablelist_oxygen2_expandedActImg put "
R0lGODlhEAAOAPcAAAAAAGDQ/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAQAA4A
AAgoAP8JHEiwoMGDCBMqXMiQYIAAAx8mfAiRokKKEhdabAixocePID8GBAA7
"
    }
}

#------------------------------------------------------------------------------
# tablelist::phaseTreeImgs
#------------------------------------------------------------------------------
proc tablelist::phaseTreeImgs {} {
    foreach mode {collapsed expanded} {
	variable phase_${mode}Img \
		 [image create photo tablelist_phase_${mode}Img]
    }

    tablelist_phase_collapsedImg put "
R0lGODlhEAAOAPcAAAAAAMfHxwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAQAA4A
AAgsAP8JHEiwoMGDCBMaDKCwYACGDQU+hNhwIsWEFi8etBhxYsR/Dz+CFEmSZEAAOw==
"
    tablelist_phase_expandedImg put "
R0lGODlhEAAOAPcAAAAAAMfHxwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAQAA4A
AAgkAP8JHEiwoMGDCBMqXMhwYICHECEijCgxIUWGFTE23MixY8eAADs=
"
}

#------------------------------------------------------------------------------
# tablelist::plastikTreeImgs
#------------------------------------------------------------------------------
proc tablelist::plastikTreeImgs {} {
    foreach mode {collapsed expanded} {
	variable plastik_${mode}Img \
		 [image create photo tablelist_plastik_${mode}Img]
    }

    tablelist_plastik_collapsedImg put "
R0lGODlhDwAOAPcAAAAAAHZ2drW1tf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAPAA4A
AAhEAP8JHEiwoMGDCBP+ExCgYUMBBxkOmDgxAMSCASgCoBjAYMaJGyt6HACgZMkBHTFq5DgSJMuC
EimivAjT4UOFOHMSDAgAOw==
"
    tablelist_plastik_expandedImg put "
R0lGODlhDwAOAPcAAAAAAHZ2drW1tf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAPAA4A
AAhCAP8JHEiwoMGDCBP+ExCgYUMBBxkOmDgxAMSCAShqDGAwo8aKHQcAGDlyAEeMH0GiTHmSoMSN
FwsydGhRoc2bBAMCADs=
"
}

#------------------------------------------------------------------------------
# tablelist::plastiqueTreeImgs
#------------------------------------------------------------------------------
proc tablelist::plastiqueTreeImgs {} {
    foreach mode {collapsed expanded} {
	variable plastique_${mode}Img \
		 [image create photo tablelist_plastique_${mode}Img]
    }

    tablelist_plastique_collapsedImg put "
R0lGODlhEAAOAPcAAAAAAHp4eH59fa+trfHx8fPz8/X19ff39/n5+fv7+/39/QAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAQAA4A
AAhaAP8JHEiwoMGDCBMOHCCgoUMBAw4KUECxogIBEhNoDKAxAUaDAhCIDCASwceCAg4EWLnywEmC
AgzIDCDTwMuBAgroDKCzwE2BAggIHUrg5z+GDxtGVMi0acGAADs=
"
    tablelist_plastique_expandedImg put "
R0lGODlhEAAOAPcAAAAAAHp4eH59fa+trfHx8fPz8/X19ff39/n5+fv7+/39/QAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAQAA4A
AAhWAP8JHEiwoMGDCBMOHCCgoUMBAw4KUECxogIBEhNo3JgAo0EBCEKKROCxoIADAVKmPFCSoAAD
MGMaaDlQQIGbOAvQFCiAgM+fBHb+Y/iwYUSFSJMWDAgAOw==
"
}

#------------------------------------------------------------------------------
# tablelist::radianceTreeImgs
#------------------------------------------------------------------------------
proc tablelist::radianceTreeImgs {} {
    foreach mode {collapsed expanded} {
	variable radiance_${mode}Img \
		 [image create photo tablelist_radiance_${mode}Img]
    }

    tablelist_radiance_collapsedImg put "
R0lGODlhEwAPAPcAAAAAAEBAQOTe1eTe1uTf1+bh2ejj2ujk3erl3uvn4Ozo4u3p4+7q5O/r5u/s
5+/t6PDt6PPw7PLw7fXz8Pb08ff18vb18/f28vj28fj28vj28/j39Pj39fj49fn49/n5+Pr6+Pv7
+fz8+fz8+vz8+/39/P39/f7+/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAATAA8A
AAi3AP/9OyCgoEGDBwQqFFgAwwgTJyJGNDGCQoGFAy2QIFGio8cSGy0kVCgABIgQIkaoVCkihEkB
CwV4mPmhZoCaH2Z6gEmSA4cNGzh0CNDhp08OPAUK0KAhgwYKFQJUqHCBqYak/wRQoDAhgNevAbZS
wCpAQgQJaCUESJuWLIQHcOEGiAsXAtkFePMGyIuXAdkECAILHoxAAdYDDQwoXszYgIORCgsoIDCg
suUBBBRcxDjwoGfICgMCADs=
"
    tablelist_radiance_expandedImg put "
R0lGODlhEwAPAPcAAAAAAEBAQOTe1eTe1uTf1+bh2ejj2ujk3erl3uvn4Ozo4u3p4+7q5O/r5u/s
5+/t6PDt6PPw7PLw7fXz8Pb08ff18vb18/f28vj28fj28vj28/j39Pj39fj49fn49/n5+Pr6+Pv7
+fz8+fz8+vz8+/39/P39/f7+/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAATAA8A
AAiwAP/9OyCgoEGDBwQqFFgAwwgTJyJGNDGCQoGFAy2QIFGio8cSGy0kVCgABIgQIkaoVCkihEkB
CwV4mPmhps0PMz3AJMmBw4YNHDoI9dmTw06BAjRoyKCBQoULFZ4q1XD0nwAKFCYE2Mo1AFYKVQVI
iCChrNmzEsJCeMC2rdsHEMIumEu37lwGYRMg2Mu3LwIFVQ80MEC4sGEDDkYqLKCAwIDHkAcQUHAR
48CDmBUrDAgAOw==
"
}

#------------------------------------------------------------------------------
# tablelist::ubuntuTreeImgs
#------------------------------------------------------------------------------
proc tablelist::ubuntuTreeImgs {} {
    foreach mode {collapsed expanded collapsedSel expandedSel} {
	variable ubuntu_${mode}Img \
		 [image create photo tablelist_ubuntu_${mode}Img]
    }

    variable pngSupported
    if {$pngSupported} {
	tablelist_ubuntu_collapsedImg put "
iVBORw0KGgoAAAANSUhEUgAAAAsAAAAOCAYAAAD5YeaVAAAABGdBTUEAALGPC/xhBQAAAAlwSFlz
AAAOwwAADsMBx2+oZAAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAAeUlE
QVQoU5XRTQ5AMBAF4HcJCXEp4lIssLXFQmLlhuONn+gIVYtv8TovbdNCRII9Lr6xAYjdfGcDMFPm
rrlsABYaqaXUnW1zE/ZySR3pKYWZm3CVVUMD6SnJV1lVNB0iX1l37qkm787nnXMzN2EvB7/Gr3cO
/0E/wQq/q1nj7KhNMQAAAABJRU5ErkJggg==
"
	tablelist_ubuntu_expandedImg put "
iVBORw0KGgoAAAANSUhEUgAAAAsAAAAOCAYAAAD5YeaVAAAABGdBTUEAALGPC/xhBQAAAAlwSFlz
AAAOwwAADsMBx2+oZAAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAAi0lE
QVQoU43QQQ5AMBAF0LmDFXEN1xDO0YuwwdYWiaSJlQPWn6IpnQrJi/T3N1PIGPObGMaIYYwYxvCT
gob9wwb5faKEBRrBDLXteSMGGMEv8npwHa+cwQo9cJHfWilVBOXrAF9nghZ4fPXY9xc2IOqAJ7jx
bi8Izr/DH5sHe+/AhkSJmEthjBjKDB0QEltZUh1wpAAAAABJRU5ErkJggg==
"
	tablelist_ubuntu_collapsedSelImg put "
iVBORw0KGgoAAAANSUhEUgAAAAsAAAAOCAYAAAD5YeaVAAAABGdBTUEAALGPC/xhBQAAAAlwSFlz
AAAOwwAADsMBx2+oZAAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAAh0lE
QVQoU43QMQrDMAyF4VykkCFbT9H7ZAm5X+gQKKV7IBcIgUzp2EX9Ba6xFDfY8A16FpJxJSLFsuE/
Pri62vDBG73LIh98sOCFwxZTQM8dM3aYLWmj0slD8IBueaLBafPPhhWXs+YRRZMn6Js7xPu0UaW/
UYcsMgV0WuuyyAc3VxvZME+qL4Ax7PyHSW8ZAAAAAElFTkSuQmCC
"
	tablelist_ubuntu_expandedSelImg put "
iVBORw0KGgoAAAANSUhEUgAAAAsAAAAOCAYAAAD5YeaVAAAABGdBTUEAALGPC/xhBQAAAAlwSFlz
AAAOwwAADsMBx2+oZAAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAAhUlE
QVQoU43OMQqAMBAEwDzB1kKw8GMi+DfBQgQ/YC9YiGDvP85dMeGCF7EYw21Osk5EfjPDFDNMMcMU
fkrY4fxwQOX/amCB3sC8hajGBDN0Cmfm945eLmCDEbjIk/VY87VMNfg6PFkv3OtFbwC+EJ73ouGR
wwqsFd1Fg5IZWXLZZIY2cRe5CulmXcWbqAAAAABJRU5ErkJggg==
"
    } else {
	tablelist_ubuntu_collapsedImg put "
R0lGODlhCwAOAPcAAAAAAExMTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAALAA4A
AAgpAP8JHEiwoMGDCAMgFBigYcKGCg1ChFhwIsWBFiNivFjR4UGNC0MeDAgAOw==
"
	tablelist_ubuntu_expandedImg put "
R0lGODlhCwAOAPcAAAAAAExMTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAALAA4A
AAgkAP8JHEiwoMGDCBMGWMiQ4cCGDh9CDFAQ4sGIBjFmTMixI8KAADs=
"
	tablelist_ubuntu_collapsedSelImg put "
R0lGODlhCwAOAPcAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAALAA4A
AAgpAP8JHEiwoMGDCAMgFBigYcKGCg1ChFhwIsWBFiNivFjR4UGNC0MeDAgAOw==
"
	tablelist_ubuntu_expandedSelImg put "
R0lGODlhCwAOAPcAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAALAA4A
AAgkAP8JHEiwoMGDCBMGWMiQ4cCGDh9CDFAQ4sGIBjFmTMixI8KAADs=
"
    }
}

#------------------------------------------------------------------------------
# tablelist::vistaAeroTreeImgs
#------------------------------------------------------------------------------
proc tablelist::vistaAeroTreeImgs {{treeStyle "vistaAero"}} {
    foreach mode {collapsed expanded collapsedAct expandedAct} {
	variable ${treeStyle}_${mode}Img \
		 [image create photo tablelist_${treeStyle}_${mode}Img]
    }

    variable pngSupported
    if {$pngSupported} {
	tablelist_${treeStyle}_collapsedImg put "
iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOCAYAAAAWo42rAAAABGdBTUEAALGPC/xhBQAAABl0RVh0
U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMtfuaUMAAABXSURBVChTY2AYcGAOdIEAMa6IAiqKAGIF
QoqjXr169R+oKAGIlfEpjvrz58//ly9fghRnArEILsVghSD87NkzkOJqIBbFpph4E4l2I7G+Jjoc
CQUf8fIA2yAo8LH45OMAAAAASUVORK5CYII=
"
	tablelist_${treeStyle}_expandedImg put "
iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOCAYAAAAWo42rAAAABGdBTUEAALGPC/xhBQAAABl0RVh0
U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMtfuaUMAAAA4SURBVChTY2AYmsAV6OxyQk4HKboJxTjV
ghVFRkb+x6cQrgifQhRF+BSCHA5zF4wm6BlCnh0IeQCHFRknat3YpwAAAABJRU5ErkJggg==
"
	tablelist_${treeStyle}_collapsedActImg put "
iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOCAYAAAAWo42rAAAABGdBTUEAALGPC/xhBQAAABl0RVh0
U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuND6NzHYAAABZSURBVChTY2AYWCBz5Ls5ELsQdAVQUR0Q
1wBxAF7FIIXrnv38D6TXAnEQTsUghWfe/vq/FqK4E4jdsSqGKQQp3vTiF0jxdKyKSTKRaDcS62vi
wpFgQJOiAABE8FkFIoNbxwAAAABJRU5ErkJggg==
"
	tablelist_${treeStyle}_expandedActImg put "
iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOCAYAAAAWo42rAAAABGdBTUEAALGPC/xhBQAAABl0RVh0
U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuND6NzHYAAAA5SURBVChTY2AYgkDmyHdXIC7H63SooptA
+iZOhTBFTfd//8epEFkRToXoivApLAdZhYbxe2aQRhIAqTxF2Z07dnMAAAAASUVORK5CYII=
"
    } else {
	tablelist_${treeStyle}_collapsedImg put "
R0lGODlhCgAOAPcAAAAAAISEhJaWlp+fn6Wlpaenp+bm5unp6erq6vz8/AAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAKAA4A
AAgtAP8JHEiwoMGDAwkg/EegAEICCAYcJJDggACDFBMYCFCQokWMESc6nLiw5MKAADs=
"
	tablelist_${treeStyle}_expandedImg put "
R0lGODlhCgAOAPcAAAAAACYmJllZWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAKAA4A
AAgmAP8JHEiwoMGDCBMGQBhgocEAAhwShBixIMWKAxtqlJiwo0ePAQEAOw==
"
	tablelist_${treeStyle}_collapsedActImg put "
R0lGODlhCgAOAPcAAAAAABzE9y3I963m+a/n+rLn+rLo+szt+s/u+gAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAKAA4A
AAgwAP8JHEiwoMGDAwMg/BdAAMIAAxwaDHAg4sQDCAwoJBgAAQGJHAuA5DiS48KTCwMCADs=
"
	tablelist_${treeStyle}_expandedActImg put "
R0lGODlhCgAOAPcAAAAAABzE94Lf+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAKAA4A
AAgmAP8JHEiwoMGDCBMGQBhgocEAAhwShBixIMWKAxtqlJiwo0ePAQEAOw==
"
    }
}

#------------------------------------------------------------------------------
# tablelist::vistaClassicTreeImgs
#------------------------------------------------------------------------------
proc tablelist::vistaClassicTreeImgs {{treeStyle "vistaClassic"}} {
    foreach mode {collapsed expanded} {
	variable ${treeStyle}_${mode}Img \
		 [image create photo tablelist_${treeStyle}_${mode}Img]
    }

    tablelist_${treeStyle}_collapsedImg put "
R0lGODlhDAAOAPcAAAAAAICAgP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAMAA4A
AAg9AP8JHEiwoMGDCAMoXLhwYAABECMKCOAwIoCIFAU+hHgRYsZ/DwGIFDmxIkeMJgV0LKlRIkqN
DBkinEkzIAA7
"
    tablelist_${treeStyle}_expandedImg put "
R0lGODlhDAAOAPcAAAAAAICAgP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAMAA4A
AAg4AP8JHEiwoMGDCAMoXLhwYAABECMKCOBQYkSKAh9anFgRgEePHDNuDPlPo0WMJUeiZMgSocuX
AQEAOw==
"
}

#------------------------------------------------------------------------------
# tablelist::winnativeTreeImgs
#------------------------------------------------------------------------------
proc tablelist::winnativeTreeImgs {} {
    foreach mode {collapsed expanded} {
	variable winnative_${mode}Img \
		 [image create photo tablelist_winnative_${mode}Img]
    }

    tablelist_winnative_collapsedImg put "
R0lGODlhDwAOAPcAAAAAAICAgP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAPAA4A
AAg/AP8JHEiwoMGDCBMGWMiQocEAAiJKFBDgoUQAEisWhBgRY0SNBCECGDmSosWOGU8K8Ghy48SU
Gxs2TEizpsGAADs=
"
    tablelist_winnative_expandedImg put "
R0lGODlhDwAOAPcAAAAAAICAgP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAPAA4A
AAg7AP8JHEiwoMGDCBMGWMiQocEAAiJKFBDg4USJFQtCvEjRIoCPHztq5CiS4MaLGU2STDmwocuE
MGMaDAgAOw==
"
}

#------------------------------------------------------------------------------
# tablelist::win7AeroTreeImgs
#------------------------------------------------------------------------------
proc tablelist::win7AeroTreeImgs {} {
    vistaAeroTreeImgs "win7Aero"
}

#------------------------------------------------------------------------------
# tablelist::win7ClassicTreeImgs
#------------------------------------------------------------------------------
proc tablelist::win7ClassicTreeImgs {} {
    vistaClassicTreeImgs "win7Classic"
}

#------------------------------------------------------------------------------
# tablelist::winxpBlueTreeImgs
#------------------------------------------------------------------------------
proc tablelist::winxpBlueTreeImgs {} {
    foreach mode {collapsed expanded} {
	variable winxpBlue_${mode}Img \
		 [image create photo tablelist_winxpBlue_${mode}Img]
    }

    tablelist_winxpBlue_collapsedImg put "
R0lGODlhDwAOAPcAAAAAAHiYtbDC08C3psG4p8K4qMO6qsa+rs/Iu9LMv9LMwNbRxtjTydvWzNzY
z9/b0uPg2eTh2eXh2urp4+3t5/Hw6/Dw7PLy7vX18ff28/b29Pf39fz8+vz8+////wAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAPAA4A
AAhjAP8JHEiwoMGDCBMKCMCwYQABBgN4mEjRQ4CIHTIC6MAhw8WCATZs0ABAQwUJHwkGwACgZcsH
KQcGuGCBAoAJEBrEFBggggMGABYoQLDzX4AEBwoQIDDAQNGFDhlCTEi1asGAADs=
"
    tablelist_winxpBlue_expandedImg put "
R0lGODlhDwAOAPcAAAAAAHiYtbDC08C3psG4p8K4qMO6qsa+rs/Iu9LMv9LMwNbRxtfSx9jTydvW
zNzYz9/b0uPg2eTh2eXh2urp4+zr5u3t5/Hw6/Dw7PLy7vX18ff28/b29Pf39fz8+vz8+////wAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAPAA4A
AAhhAP8JHEiwoMGDCBMKCMCwYQABBgOAmEgRRICIHzJm9LDhYsEAHTpwGHlhgkeCATQAWLkSwsmB
ATJgsFCBQgQHLwUGkPCgAYMFChDk/BcgwYECBAgMMDB0oUOGEBNKnVowIAA7
"
}

#------------------------------------------------------------------------------
# tablelist::winxpOliveTreeImgs
#------------------------------------------------------------------------------
proc tablelist::winxpOliveTreeImgs {} {
    foreach mode {collapsed expanded} {
	variable winxpOlive_${mode}Img \
		 [image create photo tablelist_winxpOlive_${mode}Img]
    }

    tablelist_winxpOlive_collapsedImg put "
R0lGODlhDwAOAPcAAAAAAI6ZfcC3psG4p8K4qMO6qsa+rs/Iu9LMv9LMwNbRxtjTydvWzNzYz9/b
0uPg2eTh2eXh2urp4+3t5/Hw6/Dw7PLy7vX18ff28/b29Pf39fz8+vz8+////wAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAPAA4A
AAhgAP8JHEiwoMGDCBP+C8CwYYCDATpInNjhYcEAHDIC4LABg0WCATRoyAAgA4UIHwcGuACgZUsH
KQUGsFBhAgAJDxjEXAihwQIAChIc2BkAgQECAwYIKLBzoUOGCqNKJRgQADs=
"
    tablelist_winxpOlive_expandedImg put "
R0lGODlhDwAOAPcAAAAAAI6ZfcC3psG4p8K4qMO6qsa+rs/Iu9LMv9LMwNbRxtfSx9jTydvWzNzY
z9/b0uPg2eTh2eXh2urp4+zr5u3t5/Hw6/Dw7PLy7vX18ff28/b29Pf39fz8+vz8+////wAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAPAA4A
AAheAP8JHEiwoMGDCBP+C8CwYYCDAT5InPjhYcEAHjJm7KDBIsEAHDhsGGlBgseBATIAWLnywUmB
ATBcqEBhAoQGLxdGcMBggYIEB3IGQGCAwIABAgrkXOiQocKnUAkGBAA7
"
}

#------------------------------------------------------------------------------
# tablelist::winxpSilverTreeImgs
#------------------------------------------------------------------------------
proc tablelist::winxpSilverTreeImgs {} {
    foreach mode {collapsed expanded} {
	variable winxpSilver_${mode}Img \
		 [image create photo tablelist_winxpSilver_${mode}Img]
    }

    tablelist_winxpSilver_collapsedImg put "
R0lGODlhDwAOAPcAAAAAAJSVosTO2MXP2cbO2svT3NPZ4tXb5Nnf5trg593i6d/l6uDm6+bq7ufr
7+zv8+/y9PLz9vT39/b3+ff4+vn6+v39/f///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAPAA4A
AAheAP8JHEiwoMGDCBP+C8CwYYCDAS5InHjhYcEAFjICyEjBIsEAFSpQAEAhggOPAwNMAMCSJQOU
AgNIiAABwIMGCmAubLAgAQAEBwzoDHCgwICjAgjoXOiQocKnUAkGBAA7
"
    tablelist_winxpSilver_expandedImg put "
R0lGODlhDwAOAPcAAAAAAJSVosTO2MXP2cbO2svT3NPZ4tXb5Nnf5trg593i6d/l6uDm6+bq7ufr
7+zv8+/x8+/y9PLz9vT39/b3+ff4+vn6+v39/f///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAPAA4A
AAhcAP8JHEiwoMGDCBP+C8CwYYCDATBInIjhYcEAFzJqrGCRYAALFiqIlOCg48AAFACoVMnApMAA
EyREgPCggQKXCxssSJAAwQEDOAMcKDCgqAACOBc6ZKiwqVOCAQEAOw==
"
}

#------------------------------------------------------------------------------
# tablelist::createTreeImgs
#------------------------------------------------------------------------------
proc tablelist::createTreeImgs {treeStyle depth} {
    set baseWidth  [image width  tablelist_${treeStyle}_collapsedImg]
    set baseHeight [image height tablelist_${treeStyle}_collapsedImg]

    #
    # Get the width of the images to create for the specified depth and
    # the destination x coordinate for copying the base images into them
    #
    set width [expr {$depth * $baseWidth}]
    set x [expr {($depth - 1) * $baseWidth}]
    if {[regexp \
	 {^(baghira|klearlooks|oxygen.?|phase|plasti.+|winnative|winxp.+)$} \
	 $treeStyle]} {
	set delta [expr {($depth - 1) * 4}]
	incr width $delta
	incr x $delta
    } elseif {[regexp {^(mate|ubuntu|vistaClassic|win7Classic)$} $treeStyle]} {
	set delta [expr {($depth - 1) * 2}]
	incr width -$delta
	incr x -$delta
    }

    foreach mode {indented collapsed expanded} {
	image create photo tablelist_${treeStyle}_${mode}Img$depth \
	    -width $width -height $baseHeight
    }

    foreach mode {collapsed expanded} {
	tablelist_${treeStyle}_${mode}Img$depth copy \
	    tablelist_${treeStyle}_${mode}Img -to $x 0

	foreach modif {Sel Act SelAct} {
	    variable ${treeStyle}_${mode}${modif}Img
	    if {[info exists ${treeStyle}_${mode}${modif}Img]} {
		image create photo \
		    tablelist_${treeStyle}_${mode}${modif}Img$depth \
		    -width $width -height $baseHeight
		tablelist_${treeStyle}_${mode}${modif}Img$depth copy \
		    tablelist_${treeStyle}_${mode}${modif}Img -to $x 0
	    }
	}
    }
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/scripts/tablelistMove.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
#==============================================================================
# Contains the implementation of the tablelist move and movecolumn subcommands.
#
# Copyright (c) 2003-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

#------------------------------------------------------------------------------
# tablelist::moveRow
#
# Processes the 1st form of the tablelist move subcommand.
#------------------------------------------------------------------------------
proc tablelist::moveRow {win source target} {
    upvar ::tablelist::ns${win}::data data
    if {$data(isDisabled) || $data(itemCount) == 0} {
	return ""
    }

    #
    # Adjust the indices to fit within the existing items and check them
    #
    if {$source > $data(lastRow)} {
	set source $data(lastRow)
    } elseif {$source < 0} {
	set source 0
    }
    if {$target > $data(itemCount)} {
	set target $data(itemCount)
    } elseif {$target < 0} {
	set target 0
    }

    set sourceItem [lindex $data(itemList) $source]
    set sourceKey [lindex $sourceItem end]
    if {$target == [nodeRow $win $sourceKey end]} {
	return ""
    }

    if {$target == $source} {
	return -code error \
	       "cannot move item with index \"$source\" before itself"
    }

    set parentKey $data($sourceKey-parent)
    set parentEndRow [nodeRow $win $parentKey end]
    if {($target <= [keyToRow $win $parentKey] || $target > $parentEndRow)} {
	return -code error \
	       "cannot move item with index \"$source\" outside its parent"
    }

    if {$target == $parentEndRow} {
	set targetChildIdx end
    } else {
	set targetKey [lindex $data(keyList) $target]
	if {[string compare $data($targetKey-parent) $parentKey] != 0} {
	    return -code error \
		   "cannot move item with index \"$source\" outside its parent"
	}

	set targetChildIdx \
	    [lsearch -exact $data($parentKey-children) $targetKey]
    }

    return [moveNode $win $source $parentKey $targetChildIdx]
}

#------------------------------------------------------------------------------
# tablelist::moveNode
#
# Processes the 2nd form of the tablelist move subcommand.
#------------------------------------------------------------------------------
proc tablelist::moveNode {win source targetParentKey targetChildIdx \
			 {withDescendants 1}} {
    upvar ::tablelist::ns${win}::data data
    if {$data(isDisabled) || $data(itemCount) == 0} {
	return ""
    }

    #
    # Adjust the indices to fit within the existing items and check them
    #
    if {$source > $data(lastRow)} {
	set source $data(lastRow)
    } elseif {$source < 0} {
	set source 0
    }
    set target [nodeRow $win $targetParentKey $targetChildIdx]
    if {$target < 0} {
	set target 0
    }

    set sourceItem [lindex $data(itemList) $source]
    set sourceKey [lindex $sourceItem end]
    if {$target == [nodeRow $win $sourceKey end] && $withDescendants} {
	return ""
    }

    set sourceParentKey $data($sourceKey-parent)
    if {[string compare $targetParentKey $sourceParentKey] == 0 &&
	$target == $source && $withDescendants} {
	return -code error \
	       "cannot move item with index \"$source\" before itself"
    }

    set sourceDescCount [descCount $win $sourceKey]
    if {$target > $source && $target <= $source + $sourceDescCount &&
	$withDescendants} {
	return -code error \
	       "cannot move item with index \"$source\"\
		before one of its descendants"
    }

    set w $data(body)
    if {$data(anchorRow) != $source} {
	$w mark set anchorRowMark [expr {double($data(anchorRow) + 1)}]
    }
    if {$data(activeRow) != $source} {
	$w mark set activeRowMark [expr {double($data(activeRow) + 1)}]
    }

    #
    # Save some data of the edit window if present
    #
    if {[set editCol $data(editCol)] >= 0} {
	set editRow $data(editRow)
	set editKey $data(editKey)
	saveEditData $win
    }

    #
    # 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 [expr {double($line)}]
    variable canElide
    variable elide
    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+1c $line.end]
	if {[lsearch -exact [$w tag names $textIdx] select] >= 0} {
	    lappend selectedCols $col
	}

	set textIdx $textIdx+1c
    }
    $w delete [expr {double($source + 1)}] [expr {double($source + 2)}]

    #
    # Insert the source item before the target one
    #
    set target1 $target
    if {$source < $target} {
	incr target1 -1
    }
    set targetLine [expr {$target1 + 1}]
    $w insert $targetLine.0 "\n"
    set snipStr $data(-snipstring)
    set dispItem [lrange $sourceItem 0 $data(lastCol)]
    if {$data(hasFmtCmds)} {
	set dispItem [formatItem $win $sourceKey $source $dispItem]
    }
    if {[string match "*\t*" $dispItem]} {
	set dispItem [mapTabs $dispItem]
    }
    set col 0
    foreach text $dispItem colTags $data(colTagsList) \
	    {pixels alignment} $data(colList) {
	if {$data($col-hide) && !$canElide} {
	    incr col
	    continue
	}

	#
	# Build the list of tags to be applied to the cell
	#
	set cellFont [getCellFont $win $sourceKey $col]
	set cellTags $colTags
	if {[info exists data($sourceKey,$col-font)]} {
	    lappend cellTags cell-font-$data($sourceKey,$col-font)
	}

	#
	# Append the text and the labels or window (if
	# any) to the target line of the body text widget
	#
	appendComplexElem $win $sourceKey $source $col $text $pixels \
			  $alignment $snipStr $cellFont $cellTags $targetLine

	incr col
    }
    if {[info exists data($sourceKey-font)]} {
	$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
    }
    if {[info exists data($sourceKey-hide)]} {
	$w tag add hiddenRow $targetLine.0 $targetLine.end+1c
    }

    set treeCol $data(treeCol)
    set treeStyle $data(-treestyle)
    set indentImg [doCellCget $source $treeCol $win -indent]

    #
    # Update the item list and the key -> row mapping
    #
    set data(itemList) [lreplace $data(itemList) $source $source]
    set data(keyList) [lreplace $data(keyList) $source $source]
    if {$target == $data(itemCount)} {
	lappend data(itemList) $sourceItem	;# this works much faster
	lappend data(keyList) $sourceKey	;# this works much faster
    } else {
	set data(itemList) [linsert $data(itemList) $target1 $sourceItem]
	set data(keyList) [linsert $data(keyList) $target1 $sourceKey]
    }
    if {$source < $target} {
	for {set row $source} {$row < $targetLine} {incr row} {
	    set key [lindex $data(keyList) $row]
	    set data($key-row) $row
	}
    } else {
	for {set row $target} {$row <= $source} {incr row} {
	    set key [lindex $data(keyList) $row]
	    set data($key-row) $row
	}
    }

    #
    # Elide the moved item if the target parent is collapsed or non-viewable
    #
    set depth [depth $win $targetParentKey]
    if {([info exists data($targetParentKey,$treeCol-indent)] && \
	 [string compare $data($targetParentKey,$treeCol-indent) \
	  tablelist_${treeStyle}_collapsedImg$depth] == 0) ||
	[info exists data($targetParentKey-elide)] ||
	[info exists data($targetParentKey-hide)]} {
	doRowConfig $target1 $win -elide 1
    }

    if {$withDescendants} {
	#
	# Update the tree information
	#
	set targetBuddyCount [llength $data($targetParentKey-children)]
	set sourceChildIdx \
	    [lsearch -exact $data($sourceParentKey-children) $sourceKey]
	set data($sourceParentKey-children) \
	    [lreplace $data($sourceParentKey-children) \
	     $sourceChildIdx $sourceChildIdx]
	if {[string first $targetChildIdx "end"] == 0} {
	    set targetChildIdx $targetBuddyCount
	}
	if {$targetChildIdx >= $targetBuddyCount} {
	    lappend data($targetParentKey-children) $sourceKey
	} else {
	    if {[string compare $sourceParentKey $targetParentKey] == 0 &&
		$sourceChildIdx < $targetChildIdx} {
		incr targetChildIdx -1
	    }
	    set data($targetParentKey-children) \
		[linsert $data($targetParentKey-children) \
		 $targetChildIdx $sourceKey]
	}
	set data($sourceKey-parent) $targetParentKey

	#
	# If the list of children of the source's parent has become empty
	# then set the parent's indentation image to the indented one
	#
	if {[llength $data($sourceParentKey-children)] == 0 &&
	    [info exists data($sourceParentKey,$treeCol-indent)]} {
	    collapseSubCmd $win [list $sourceParentKey -partly]
	    set data($sourceParentKey,$treeCol-indent) [strMap \
		{"collapsed" "indented" "expanded" "indented"
		 "Act" "" "Sel" ""} $data($sourceParentKey,$treeCol-indent)]
	    if {[winfo exists $w.ind_$sourceParentKey,$treeCol]} {
		$w.ind_$sourceParentKey,$treeCol configure -image \
		    $data($sourceParentKey,$treeCol-indent)
	    }
	}

	#
	# Mark the target parent item as expanded if it was just indented
	#
	if {[info exists data($targetParentKey,$treeCol-indent)] &&
	    [string compare $data($targetParentKey,$treeCol-indent) \
	     tablelist_${treeStyle}_indentedImg$depth] == 0} {
	    set data($targetParentKey,$treeCol-indent) \
		tablelist_${treeStyle}_expandedImg$depth
	    if {[winfo exists $data(body).ind_$targetParentKey,$treeCol]} {
		$data(body).ind_$targetParentKey,$treeCol configure -image \
		    $data($targetParentKey,$treeCol-indent)
	    }
	}

	#
	# Update the indentation of the moved item
	#
	if {[regexp {^(.+Img)([0-9]+)$} $indentImg dummy base sourceDepth]} {
	    incr depth
	    variable maxIndentDepths
	    if {$depth > $maxIndentDepths($treeStyle)} {
		createTreeImgs $treeStyle $depth
		set maxIndentDepths($treeStyle) $depth
	    }
	    doCellConfig $target1 $treeCol $win -indent $base$depth
	}
    }

    #
    # Update the list variable if present
    #
    if {$data(hasListVar)} {
	upvar #0 $data(-listvariable) var
	trace vdelete var wu $data(listVarTraceCmd)
	set var [lreplace $var $source $source]
	set pureSourceItem [lrange $sourceItem 0 $data(lastCol)]
	if {$target == $data(itemCount)} {
	    lappend var $pureSourceItem		;# this works much faster
	} else {
	    set var [linsert $var $target1 $pureSourceItem]
	}
	trace variable var wu $data(listVarTraceCmd)
    }

    #
    # Update anchorRow and activeRow
    #
    if {$data(anchorRow) == $source} {
	set data(anchorRow) $target1
	adjustRowIndex $win data(anchorRow) 1
    } else {
	set anchorTextIdx [$w index anchorRowMark]
	set data(anchorRow) [expr {int($anchorTextIdx) - 1}]
    }
    if {$data(activeRow) == $source} {
	set activeRow $target1
	adjustRowIndex $win activeRow 1
	set data(activeRow) $activeRow
    } else {
	set activeTextIdx [$w index activeRowMark]
	set data(activeRow) [expr {int($activeTextIdx) - 1}]
    }

    #
    # Invalidate the list of row indices indicating the viewable rows
    #
    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
    #
    if {$editCol >= 0} {
	if {$editRow == $source} {
	    doEditCell $win $target1 $editCol 1
	} else {
	    set data(editRow) [keyToRow $win $editKey]
	}
    }

    if {$withDescendants} {
	#
	# Save the source node's list of children and temporarily empty it
	#
	set sourceChildList $data($sourceKey-children)
	set data($sourceKey-children) {}

	#
	# Move the source item's descendants
	#
	if {$source < $target} {
	    set lastDescRow [expr {$source + $sourceDescCount - 1}]
	    set increment -1
	} else {
	    set lastDescRow [expr {$source + $sourceDescCount}]
	    set increment 0
	}
	for {set n 0; set descRow $lastDescRow} {$n < $sourceDescCount} \
	    {incr n; incr descRow $increment} {
	    set indentImg [doCellCget $descRow $treeCol $win -indent]
	    if {[regexp {^(.+Img)([0-9]+)$} $indentImg dummy base descDepth]} {
		incr descDepth [expr {$depth - $sourceDepth}]
		if {$descDepth > $maxIndentDepths($treeStyle)} {
		    for {set d $descDepth} {$d > $maxIndentDepths($treeStyle)} \
			{incr d -1} {
			createTreeImgs $treeStyle $d
		    }
		    set maxIndentDepths($treeStyle) $descDepth
		}
		set descKey [lindex $data(keyList) $descRow]
		set data($descKey,$treeCol-indent) $base$descDepth
	    }

	    moveNode $win $descRow $sourceKey end 0
	}

	#
	# Restore the source node's list of children
	#
	set data($sourceKey-children) $sourceChildList

	#
	# Adjust the columns, restore the stripes in the body text widget,
	# redisplay the line numbers (if any), and update the view
	#
	adjustColumns $win $treeCol 1
	adjustElidedText $win
	redisplayVisibleItems $win
	makeStripes $win
	showLineNumbersWhenIdle $win
	updateColorsWhenIdle $win
	adjustSepsWhenIdle $win
	updateVScrlbarWhenIdle $win
    }

    #
    # (Un)hide the newline character that ends the
    # last line if the line itself is (not) hidden
    #
    foreach tag {elidedRow hiddenRow} {
	if {[lsearch -exact [$w tag names end-1l] $tag] >= 0} {
	    $w tag add $tag end-1c
	} else {
	    $w tag remove $tag end-1c
	}
    }

    return ""
}

#------------------------------------------------------------------------------
# tablelist::moveCol
#
# Processes the tablelist movecolumn subcommand.
#------------------------------------------------------------------------------
proc tablelist::moveCol {win source target} {
    upvar ::tablelist::ns${win}::data data \
	  ::tablelist::ns${win}::attribs attribs
    if {$data(isDisabled)} {
	return ""
    }

    #
    # Check the indices
    #
    if {$target == $source} {
	return -code error \
	       "cannot move column with index \"$source\" before itself"
    } elseif {$target == $source + 1} {
	return ""
    }

    if {[winfo viewable $win]} {
	purgeWidgets $win
	update idletasks
	if {![array exists ::tablelist::ns${win}::data]} {
	    return ""
	}
    }

    #
    # Update the column list
    #
    set source3 [expr {3*$source}]
    set source3Plus2 [expr {$source3 + 2}]
    set target1 $target
    if {$source < $target} {
	incr target1 -1
    }
    set target3 [expr {3*$target1}]
    set sourceRange [lrange $data(-columns) $source3 $source3Plus2]
    set data(-columns) [lreplace $data(-columns) $source3 $source3Plus2]
    set data(-columns) [eval linsert {$data(-columns)} $target3 $sourceRange]

    #
    # Save some elements of data and attribs corresponding to source
    #
    array set tmpData [array get data $source-*]
    array set tmpData [array get data k*,$source-*]
    foreach specialCol {activeCol anchorCol editCol -treecolumn treeCol} {
	set tmpData($specialCol) $data($specialCol)
    }
    array set tmpAttribs [array get attribs $source-*]
    array set tmpAttribs [array get attribs k*,$source-*]
    set selCells [curCellSelection $win]
    set tmpRows [extractColFromCellList $selCells $source]

    #
    # Remove source from the list of stretchable columns
    # if it was explicitly specified as stretchable
    #
    if {[string compare $data(-stretch) "all"] != 0} {
	set sourceIsStretchable 0
	set stretchableCols {}
	foreach elem $data(-stretch) {
	    if {[string first $elem "end"] != 0 && $elem == $source} {
		set sourceIsStretchable 1
	    } else {
		lappend stretchableCols $elem
	    }
	}
	set data(-stretch) $stretchableCols
    }

    #
    # Build two lists of column numbers, needed
    # for shifting some elements of the data array
    #
    if {$source < $target} {
	for {set n $source} {$n < $target1} {incr n} {
	    lappend oldCols [expr {$n + 1}]
	    lappend newCols $n
	}
    } else {
	for {set n $source} {$n > $target} {incr n -1} {
	    lappend oldCols [expr {$n - 1}]
	    lappend newCols $n
	}
    }

    #
    # Remove the trace from the array element data(activeCol) because otherwise
    # the procedure moveColData won't work if the selection type is cell
    #
    trace vdelete data(activeCol) w [list tablelist::activeTrace $win]

    #
    # Move the elements of data and attribs 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]
    }

    #
    # Move the elements of data and attribs 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
    }

    #
    # If the column given by source was explicitly specified as
    # stretchable then add target1 to the list of stretchable columns
    #
    if {[string compare $data(-stretch) "all"] != 0 && $sourceIsStretchable} {
	lappend data(-stretch) $target1
	sortStretchableColList $win
    }

    #
    # Update the item list
    #
    set newItemList {}
    foreach item $data(itemList) {
	set sourceText [lindex $item $source]
	set item [lreplace $item $source $source]
	set item [linsert $item $target1 $sourceText]
	lappend newItemList $item
    }
    set data(itemList) $newItemList

    #
    # Update the list variable if present
    #
    condUpdateListVar $win

    #
    # Set up and adjust the columns, and rebuild
    # the lists of the column fonts and tag names
    #
    setupColumns $win $data(-columns) 0
    makeColFontAndTagLists $win
    makeSortAndArrowColLists $win
    adjustColumns $win {} 0

    #
    # Redisplay the items
    #
    redisplay $win 0 $selCells
    updateColorsWhenIdle $win

    #
    # Reconfigure the relevant column labels
    #
    foreach col [lappend newCols $target1] {
	reconfigColLabels $win imgs $col
    }

    #
    # Restore the trace set on the array element data(activeCol)
    # and enforce the execution of the activeTrace command
    #
    trace variable data(activeCol) w [list tablelist::activeTrace $win]
    set data(activeCol) $data(activeCol)

    return ""
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/scripts/tablelistSort.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
#==============================================================================
# Contains the implementation of the tablelist::sortByColumn and
# tablelist::addToSortColumns commands, as well as of the tablelist sort,
# sortbycolumn, and sortbycolumnlist subcommands.
#
# Structure of the module:
#   - Public procedures related to sorting
#   - Private procedures implementing the sorting
#
# Copyright (c) 2000-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

#
# Public procedures related to sorting
# ====================================
#

#------------------------------------------------------------------------------
# tablelist::sortByColumn
#
# Sorts the contents of the tablelist widget win by its col'th column.  Returns
# the sort order (increasing or decreasing).
#------------------------------------------------------------------------------
proc tablelist::sortByColumn {win col} {
    #
    # Check the arguments
    #
    if {![winfo exists $win]} {
	return -code error "bad window path name \"$win\""
    }
    if {[string compare [winfo class $win] "Tablelist"] != 0} {
	return -code error "window \"$win\" is not a tablelist widget"
    }
    if {[catch {::$win columnindex $col} result] != 0} {
	return -code error $result
    }
    if {$result < 0 || $result >= [::$win columncount]} {
	return -code error "column index \"$col\" out of range"
    }
    set col $result
    if {[::$win columncget $col -showlinenumbers]} {
	return ""
    }

    #
    # Determine the sort order
    #
    if {[set idx [lsearch -exact [::$win sortcolumnlist] $col]] >= 0 &&
	[string compare [lindex [::$win sortorderlist] $idx] "increasing"]
	== 0} {
	set sortOrder decreasing
    } else {
	set sortOrder increasing
    }

    #
    # Sort the widget's contents based on the given column
    #
    if {[catch {::$win sortbycolumn $col -$sortOrder} result] == 0} {
	set userData [list $col $sortOrder]
	genVirtualEvent $win <<TablelistColumnSorted>> $userData

	return $sortOrder
    } else {
	return -code error $result
    }
}

#------------------------------------------------------------------------------
# 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
# list.  Returns the specified column's sort order (increasing or decreasing).
#------------------------------------------------------------------------------
proc tablelist::addToSortColumns {win col} {
    #
    # Check the arguments
    #
    if {![winfo exists $win]} {
	return -code error "bad window path name \"$win\""
    }
    if {[string compare [winfo class $win] "Tablelist"] != 0} {
	return -code error "window \"$win\" is not a tablelist widget"
    }
    if {[catch {::$win columnindex $col} result] != 0} {
	return -code error $result
    }
    if {$result < 0 || $result >= [::$win columncount]} {
	return -code error "column index \"$col\" out of range"
    }
    set col $result
    if {[::$win columncget $col -showlinenumbers]} {
	return ""
    }

    #
    # Update the lists of sort columns and orders
    #
    set sortColList [::$win sortcolumnlist]
    set sortOrderList [::$win sortorderlist]
    if {[set idx [lsearch -exact $sortColList $col]] >= 0} {
	if {[string compare [lindex $sortOrderList $idx] "increasing"] == 0} {
	    set sortOrder decreasing
	} else {
	    set sortOrder increasing
	}
	set sortOrderList [lreplace $sortOrderList $idx $idx $sortOrder]
    } else {
	lappend sortColList $col
	lappend sortOrderList increasing
	set sortOrder increasing
    }

    #
    # Sort the widget's contents according to the
    # modified lists of sort columns and orders
    #
    if {[catch {::$win sortbycolumnlist $sortColList $sortOrderList} result]
	== 0} {
	set userData [list $sortColList $sortOrderList]
	genVirtualEvent $win <<TablelistColumnsSorted>> $userData

	return $sortOrder
    } else {
	return -code error $result
    }
}

#
# Private procedures implementing the sorting
# ===========================================
#

#------------------------------------------------------------------------------
# tablelist::sortItems
#
# Processes the tablelist sort, sortbycolumn, and sortbycolumnlist subcommands.
#------------------------------------------------------------------------------
proc tablelist::sortItems {win parentKey sortColList sortOrderList} {
    variable canElide
    variable snipSides
    upvar ::tablelist::ns${win}::data data

    set sortAllItems [expr {[string compare $parentKey "root"] == 0}]
    if {[winfo viewable $win] && $sortAllItems} {
	purgeWidgets $win
	update idletasks
	if {![array exists ::tablelist::ns${win}::data]} {
	    return ""
	}
    }

    #
    # Make sure sortOrderList has the same length as sortColList
    #
    set sortColCount [llength $sortColList]
    set sortOrderCount [llength $sortOrderList]
    if {$sortOrderCount < $sortColCount} {
	for {set n $sortOrderCount} {$n < $sortColCount} {incr n} {
	    lappend sortOrderList increasing
	}
    } else {
	set sortOrderList [lrange $sortOrderList 0 [expr {$sortColCount - 1}]]
    }

    #
    # Save the keys corresponding to anchorRow and activeRow,
    # as well as the indices of the selected cells
    #
    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
    #
    if {[set editCol $data(editCol)] >= 0} {
	set editKey $data(editKey)
	saveEditData $win
    }

    #
    # Update the sort info and sort the item list
    #
    set descItemList {}
    if {[llength $sortColList] == 1 && [lindex $sortColList 0] == -1} {
	if {[string length $data(-sortcommand)] == 0} {
	    return -code error "value of the -sortcommand option is empty"
	}

	set order [lindex $sortOrderList 0]

	if {$sortAllItems} {
	    #
	    # Update the sort info
	    #
	    for {set col 0} {$col < $data(colCount)} {incr col} {
		set data($col-sortRank) 0
		set data($col-sortOrder) ""
	    }
	    set data(sortColList) {}
	    set data(arrowColList) {}
	    set data(sortOrder) $order
	}

	#
	# Sort the child item list
	#
	sortChildren $win $parentKey [list lsort -$order -command \
	    $data(-sortcommand)] descItemList
    } else {					;# sorting by a column (list)
	#
	# Check the specified column indices
	#
	set sortColCount2 $sortColCount
	foreach col $sortColList {
	    if {$data($col-showlinenumbers)} {
		incr sortColCount2 -1
	    }
	}
	if {$sortColCount2 == 0} {
	    return ""
	}

	if {$sortAllItems} {
	    #
	    # Update the sort info
	    #
	    for {set col 0} {$col < $data(colCount)} {incr col} {
		set data($col-sortRank) 0
		set data($col-sortOrder) ""
	    }
	    set rank 1
	    foreach col $sortColList order $sortOrderList {
		if {$data($col-showlinenumbers)} {
		    continue
		}

		set data($col-sortRank) $rank
		set data($col-sortOrder) $order
		incr rank
	    }
	    makeSortAndArrowColLists $win
	}

	#
	# Sort the child item list based on the specified columns
	#
	for {set idx [expr {$sortColCount - 1}]} {$idx >= 0} {incr idx -1} {
	    set col [lindex $sortColList $idx]
	    if {$data($col-showlinenumbers)} {
		continue
	    }

	    set descItemList {}
	    set order [lindex $sortOrderList $idx]
	    if {[string compare $data($col-sortmode) "command"] == 0} {
		if {![info exists data($col-sortcommand)]} {
		    return -code error "value of the -sortcommand option for\
					column $col is missing or empty"
		}

		sortChildren $win $parentKey [list lsort -$order -index $col \
		    -command $data($col-sortcommand)] descItemList
	    } elseif {[string compare $data($col-sortmode) "asciinocase"]
		== 0} {
		if {$::tcl_version >= 8.5} {
		    sortChildren $win $parentKey [list lsort -$order \
			-index $col -ascii -nocase] descItemList
		} else {
		    sortChildren $win $parentKey [list lsort -$order \
			-index $col -command compareNoCase] descItemList
		}
	    } else {
		sortChildren $win $parentKey [list lsort -$order -index $col \
		    -$data($col-sortmode)] descItemList
	    }
	}
    }

    if {$sortAllItems} {
	#
	# Cancel the execution of all delayed
	# redisplay and redisplayCol commands
	#
	foreach name [array names data *redispId] {
	    after cancel $data($name)
	    unset data($name)
	}

	set canvasWidth $data(arrowWidth)
	if {[llength $data(arrowColList)] > 1} {
	    incr canvasWidth 6
	}
	foreach col $data(arrowColList) {
	    #
	    # Make sure the arrow will fit into the column
	    #
	    set idx [expr {2*$col}]
	    set pixels [lindex $data(colList) $idx]
	    if {$pixels == 0 && $data($col-maxPixels) > 0 &&
		$data($col-reqPixels) > $data($col-maxPixels) &&
		$data($col-maxPixels) < $canvasWidth} {
		set data($col-maxPixels) $canvasWidth
		set data($col-maxwidth) -$canvasWidth
	    }
	    if {$pixels != 0 && $pixels < $canvasWidth} {
		set data(colList) \
		    [lreplace $data(colList) $idx $idx $canvasWidth]
		set idx [expr {3*$col}]
		set data(-columns) \
		    [lreplace $data(-columns) $idx $idx -$canvasWidth]
	    }
	}

	#
	# Adjust the columns; this will also place the
	# canvas widgets into the corresponding labels
	#
	adjustColumns $win allLabels 1
    }

    if {[llength $descItemList] == 0} {
	return ""
    }

    set parentRow [keyToRow $win $parentKey]
    set firstDescRow [expr {$parentRow + 1}]
    set lastDescRow [expr {$parentRow + [descCount $win $parentKey]}]
    set firstDescLine [expr {$firstDescRow + 1}]
    set lastDescLine [expr {$lastDescRow + 1}]

    #
    # Update the line numbers (if any)
    #
    for {set col 0} {$col < $data(colCount)} {incr col} {
	if {!$data($col-showlinenumbers)} {
	    continue
	}

	set newDescItemList {}
	set line $firstDescLine
	foreach item $descItemList {
	    set item [lreplace $item $col $col $line]
	    lappend newDescItemList $item
	    set key [lindex $item end]
	    if {![info exists data($key-hide)]} {
		incr line
	    }
	}
	set descItemList $newDescItemList
    }

    set data(itemList) [eval [list lreplace $data(itemList) \
	$firstDescRow $lastDescRow] $descItemList]

    #
    # Replace the contents of the list variable if present
    #
    condUpdateListVar $win

    #
    # Delete the items from the body text widget and insert the sorted ones.
    # Interestingly, for a large number of items it is much more efficient
    # 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
    for {set line $firstDescLine} {$line <= $lastDescLine} {incr line} {
	$w delete $line.0 $line.end
    }
    set snipStr $data(-snipstring)
    set rowTagRefCount $data(rowTagRefCount)
    set cellTagRefCount $data(cellTagRefCount)
    set isSimple [expr {$data(imgCount) == 0 && $data(winCount) == 0 &&
			$data(indentCount) == 0}]
    set padY [expr {[$w cget -spacing1] == 0}]
    set descKeyList {}
    for {set row $firstDescRow; set line $firstDescLine} \
	{$row <= $lastDescRow} {set row $line; incr line} {
	set item [lindex $data(itemList) $row]
	set key [lindex $item end]
	lappend descKeyList $key
	set data($key-row) $row
	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]
	}

	#
	# Clip the elements if necessary and
	# insert them with the corresponding tags
	#
	if {$rowTagRefCount == 0} {
	    set hasRowFont 0
	} else {
	    set hasRowFont [info exists data($key-font)]
	}
	set col 0
	if {$isSimple} {
	    set insertArgs {}
	    set multilineData {}
	    foreach text $dispItem \
		    colFont $data(colFontList) \
		    colTags $data(colTagsList) \
		    {pixels alignment} $data(colList) {
		if {$data($col-hide) && !$canElide} {
		    incr col
		    continue
		}

		#
		# 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 {$cellTagRefCount != 0} {
		    if {[info exists data($key,$col-font)]} {
			set cellFont $data($key,$col-font)
			lappend cellTags cell-font-$data($key,$col-font)
		    }
		}

		#
		# Clip the element if necessary
		#
		set multiline [string match "*\n*" $text]
		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)

		    if {$data($col-wrap) && !$multiline} {
			if {[font measure $cellFont -displayof $win $text] >
			    $pixels} {
			    set multiline 1
			}
		    }

		    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]
		    }
		}

		lappend insertArgs "\t\t" $cellTags
		if {$multiline} {
		    lappend multilineData $col $text $cellFont $pixels \
					  $alignment
		}

		incr col
	    }

	    #
	    # Insert the item into the body 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 $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
	    }

	} else {
	    foreach text $dispItem \
		    colFont $data(colFontList) \
		    colTags $data(colTagsList) \
		    {pixels alignment} $data(colList) {
		if {$data($col-hide) && !$canElide} {
		    incr col
		    continue
		}

		#
		# 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 {$cellTagRefCount != 0} {
		    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 body text widget
		#
		appendComplexElem $win $key $row $col $text $pixels \
				  $alignment $snipStr $cellFont $cellTags $line

		incr col
	    }
	}

	if {$rowTagRefCount != 0} {
	    if {[info exists data($key-font)]} {
		$w tag add row-font-$data($key-font) $line.0 $line.end
	    }
	}

	if {[info exists data($key-elide)]} {
	    $w tag add elidedRow $line.0 $line.end+1c
	}
	if {[info exists data($key-hide)]} {
	    $w tag add hiddenRow $line.0 $line.end+1c
	}
    }

    set data(keyList) [eval [list lreplace $data(keyList) \
	$firstDescRow $lastDescRow] $descKeyList]

    if {$sortAllItems} {
	#
	# Validate the key -> row mapping
	#
	set data(keyToRowMapValid) 1
	if {[info exists data(mapId)]} {
	    after cancel $data(mapId)
	    unset data(mapId)
	}
    }

    #
    # Invalidate the list of row indices indicating the viewable rows
    #
    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
    #
    if {$data(isDisabled)} {
	$w tag add disabled 1.0 end
	$w tag configure select -borderwidth 0
    }

    #
    # Update anchorRow and activeRow
    #
    foreach type {anchor active} {
	upvar 0 ${type}Key key2
	if {[string length $key2] != 0} {
	    set data(${type}Row) [keyToRow $win $key2]
	}
    }

    #
    # Bring the "most important" row into view if appropriate
    #
    if {$editCol >= 0} {
	set editRow [keyToRow $win $editKey]
	if {$editRow >= $firstDescRow && $editRow <= $lastDescRow} {
	    doEditCell $win $editRow $editCol 1
	}
    } else {
	set selRows [curSelection $win]
	if {[llength $selRows] == 1} {
	    set selRow [lindex $selRows 0]
	    set selKey [lindex $data(keyList) $selRow]
	    if {$selRow >= $firstDescRow && $selRow <= $lastDescRow &&
		![info exists data($selKey-elide)]} {
		seeRow $win $selRow
	    }
	} elseif {[string compare [focus -lastfor $w] $w] == 0} {
	    set activeKey [lindex $data(keyList) $data(activeRow)]
	    if {$data(activeRow) >= $firstDescRow &&
		$data(activeRow) <= $lastDescRow &&
		![info exists data($activeKey-elide)]} {
		seeRow $win $data(activeRow)
	    }
	}
    }

    #
    # Adjust the elided text and restore the stripes in the body text widget
    #
    adjustElidedText $win
    redisplayVisibleItems $win
    makeStripes $win
    updateColorsWhenIdle $win
    adjustSepsWhenIdle $win
    updateVScrlbarWhenIdle $win

    #
    # Work around a Tk bug on Mac OS X Aqua
    #
    variable winSys
    if {[string compare $winSys "aqua"] == 0} {
	foreach col $data(arrowColList) {
	    set canvas [list $data(hdrTxtFrCanv)$col]
	    after idle [list lower $canvas]
	    after idle [list raise $canvas]
	}
    }

    return ""
}

#------------------------------------------------------------------------------
# tablelist::sortChildren
#
# Sorts the children of a given parent within the tablelist widget win,
# recursively.
#------------------------------------------------------------------------------
proc tablelist::sortChildren {win parentKey sortCmd itemListName} {
    upvar $itemListName itemList ::tablelist::ns${win}::data data

    set childKeyList $data($parentKey-children)
    if {[llength $childKeyList] == 0} {
	return ""
    }

    #
    # Build and sort the list of child items
    #
    set childItemList {}
    foreach childKey $childKeyList {
	lappend childItemList [lindex $data(itemList) [keyToRow $win $childKey]]
    }
    set childItemList [eval $sortCmd [list $childItemList]]

    #
    # Update the lists and invoke the procedure recursively for the children
    #
    set data($parentKey-children) {}
    foreach item $childItemList {
	lappend itemList $item
	set childKey [lindex $item end]
	lappend data($parentKey-children) $childKey

	sortChildren $win $childKey $sortCmd itemList
    }
}

#------------------------------------------------------------------------------
# tablelist::sortList
#
# Sorts the specified list by the current sort columns of the tablelist widget
# win, using their current sort orders.
#------------------------------------------------------------------------------
proc tablelist::sortList {win list} {
    upvar ::tablelist::ns${win}::data data
    set sortColList $data(sortColList)
    set sortOrderList {}
    foreach col $sortColList {
	lappend sortOrderList $data($col-sortOrder)
    }

    if {[llength $sortColList] == 1 && [lindex $sortColList 0] == -1} {
	if {[string length $data(-sortcommand)] == 0} {
	    return -code error "value of the -sortcommand option is empty"
	}

	#
	# Sort the list
	#
	set order [lindex $sortOrderList 0]
	return [lsort -$order -command $data(-sortcommand) $list]
    } else {
	#
	# Sort the list based on the specified columns
	#
	set sortColCount [llength $sortColList]
	for {set idx [expr {$sortColCount - 1}]} {$idx >= 0} {incr idx -1} {
	    set col [lindex $sortColList $idx]
	    set order [lindex $sortOrderList $idx]

	    if {[string compare $data($col-sortmode) "command"] == 0} {
		if {![info exists data($col-sortcommand)]} {
		    return -code error "value of the -sortcommand option for\
					column $col is missing or empty"
		}

		set list [lsort -$order -index $col -command \
			  $data($col-sortcommand) $list]
	    } elseif {[string compare $data($col-sortmode) "asciinocase"]
		== 0} {
		if {$::tcl_version >= 8.5} {
		    set list [lsort -$order -index $col -ascii -nocase $list]
		} else {
		    set list [lsort -$order -index $col -command \
			      compareNoCase $list]
		}
	    } else {
		set list [lsort -$order -index $col -$data($col-sortmode) $list]
	    }
	}

	return $list
    }
}

#------------------------------------------------------------------------------
# tablelist::compareNoCase
#
# Compares the given strings in a case-insensitive manner.
#------------------------------------------------------------------------------
proc tablelist::compareNoCase {str1 str2} {
    return [string compare [string tolower $str1] [string tolower $str2]]
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/scripts/tablelistThemes.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
#==============================================================================
# Contains procedures that populate the array themeDefaults with theme-specific
# default values of some tablelist configuration options.
#
# Structure of the module:
#   - Public procedures related to tile themes
#   - Private procedures related to tile themes
#   - Private procedures performing RGB <-> HSV conversions
#   - Private procedures related to global KDE configuration options
#
# Copyright (c) 2005-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

#
# Public procedures related to tile themes
# ========================================
#

#------------------------------------------------------------------------------
# tablelist::getCurrentTheme
#
# Returns the current tile theme.
#------------------------------------------------------------------------------
proc tablelist::getCurrentTheme {} {
    if {[info exists ttk::currentTheme]} {
	return $ttk::currentTheme
    } else {
	return $tile::currentTheme
    }
}

#------------------------------------------------------------------------------
# tablelist::setThemeDefaults
#
# Populates the array themeDefaults with theme-specific default values of some
# tablelist configuration options and updates the array configSpecs.
#------------------------------------------------------------------------------
proc tablelist::setThemeDefaults {} {
    variable themeDefaults
    if {[catch {[getCurrentTheme]Theme}] != 0} {
	#
	# Fall back to the "default" theme (which is the root of all
	# themes) and then override the options set by the current one
	#
	defaultTheme 
	array set themeDefaults [style configure .]
    }

    if {[string length $themeDefaults(-arrowcolor)] == 0} {
	set themeDefaults(-arrowdisabledcolor) ""
    } else {
	set themeDefaults(-arrowdisabledcolor) $themeDefaults(-labeldisabledFg)
    }

    variable configSpecs
    foreach opt {-background -foreground -disabledforeground -stripebackground
		 -selectbackground -selectforeground -selectborderwidth -font
		 -labelforeground -labelfont -labelborderwidth -labelpady
		 -arrowcolor -arrowdisabledcolor -arrowstyle -treestyle} {
	if {[llength $configSpecs($opt)] < 4} {
	    lappend configSpecs($opt) $themeDefaults($opt)
	} else {
	    lset configSpecs($opt) 3 $themeDefaults($opt)
	}
    }
}

#
# Private procedures related to tile themes
# =========================================
#

#------------------------------------------------------------------------------
# tablelist::altTheme
#------------------------------------------------------------------------------
proc tablelist::altTheme {} {
    variable themeDefaults
    array set themeDefaults [list \
	-background		white \
	-foreground		black \
	-disabledforeground	#a3a3a3 \
	-stripebackground	"" \
	-selectbackground	#4a6984 \
	-selectforeground	#ffffff \
	-selectborderwidth	0 \
	-font			TkTextFont \
	-labelbackground	#d9d9d9 \
	-labeldeactivatedBg	#d9d9d9 \
	-labeldisabledBg	#d9d9d9 \
	-labelactiveBg		#ececec \
	-labelpressedBg		#ececec \
	-labelforeground	black \
	-labeldisabledFg	#a3a3a3 \
	-labelactiveFg		black \
	-labelpressedFg		black \
	-labelfont		TkDefaultFont \
	-labelborderwidth	2 \
	-labelpady		1 \
	-arrowcolor		"" \
	-arrowstyle		sunken10x9 \
	-treestyle		winnative \
    ]
}

#------------------------------------------------------------------------------
# tablelist::aquaTheme
#------------------------------------------------------------------------------
proc tablelist::aquaTheme {} {
    scan $::tcl_platform(osVersion) "%d" majorOSVersion
    if {$majorOSVersion >= 14} {			;# OS X 10.10 or higher
	set labelBg		#f4f4f4
	set labeldeactivatedBg	#ffffff
	set labeldisabledBg	#ffffff
	set labelpressedBg	#e4e4e4
	set arrowColor		#404040
    } elseif {$majorOSVersion >= 11} {			;# OS X 10.7 or higher
	set labelBg		#efefef
	set labeldeactivatedBg	#efefef
	set labeldisabledBg	#efefef
	set labelpressedBg	#cbcbcb
	set arrowColor		#777777
    } else {
	set labelBg		#e9e8e8
	set labeldeactivatedBg	#e9e8e8
	set labeldisabledBg	#e9e8e8
	set labelpressedBg	#d2d2d2
	set arrowColor		#717171
    }

    switch [winfo rgb . systemMenuActive] {
	"13621 29041 52685" -
	"32256 44288 55552" {				;# Blue Cocoa/Carbon
	    if {$majorOSVersion >= 14} {		;# OS X 10.10 or higher
		set stripeBg			#f2f2f2
		set labelselectedBg		#f4f4f4
		set labelselectedpressedBg	#e4e4e4
	    } elseif {$majorOSVersion >= 11} {		;# OS X 10.7 or higher
		set stripeBg			#f0f4f9
		set labelselectedBg		#80b8f0
		set labelselectedpressedBg	#417ddc
	    } else {
		set stripeBg			#edf3fe
		set labelselectedBg		#7ab2e9
		set labelselectedpressedBg	#679ed5
	    }
	}

	"24415 27499 31354" -
	"39680 43776 48384" {				;# Graphite Cocoa/Carbon
	    if {$majorOSVersion >= 14} {		;# OS X 10.10 or higher
		set stripeBg			#f2f2f2
		set labelselectedBg		#f4f4f4
		set labelselectedpressedBg	#e4e4e4
	    } elseif {$majorOSVersion >= 11} {		;# OS X 10.7 or higher
		set stripeBg			#f4f5f7
		set labelselectedBg		#9ba7b5
		set labelselectedpressedBg	#636e88
	    } else {
		set stripeBg			#f0f0f0
		set labelselectedBg		#b6c2cd
		set labelselectedpressedBg	#a7b3be
	    }
	}
    }

    #
    # Get an approximation of alternateSelectedControlColor
    #
    switch [winfo rgb . systemHighlight] {
	"65535 48058 47288"	{ set selectBg #fc2125 }
	"65535 57311 46003"	{ set selectBg #fd8208 }
	"65535 61423 45231"	{ set selectBg #fec309 }
	"49343 63222 44460"	{ set selectBg #56d72b }
	"45746 55246 65535"	{ set selectBg #0950d0 }
	"63478 54484 65535"	{ set selectBg #bf57da }
	"65535 49087 53969"	{ set selectBg #7b0055 }
	"60909 57053 51914"	{ set selectBg #90714c }
	"55512 55512 56539"	{ set selectBg #5c5c60 }

	"51143 53456 56281"	{ set selectBg #738499 }
	"50887 50887 50887"	{ set selectBg #7f7f7f }
	"46516 54741 65535"	{ set selectBg #3875d7 }
	"64506 60908 29556"	{ set selectBg #ffc11f }
	"65535 45487 35978"	{ set selectBg #f34648 }
	"65535 53968 33154"	{ set selectBg #ff8a22 }
	"50114 63994 37263"	{ set selectBg #66c547 }
	"59879 47290 65535"	{ set selectBg #8c4eb8 }

	default {
	    set rgb [winfo rgb . systemHighlight]
	    foreach {h s v} [eval rgb2hsv $rgb] {}

	    set s [expr {$s*4.0/3.0}]
	    if {$s > 1.0} {
		set s 1.0
	    }

	    set v [expr {$v*3.0/4.0}]
	    if {$v > 1.0} {
		set v 1.0
	    }

	    set rgb [hsv2rgb $h $s $v]
	    set selectBg [eval format "#%04x%04x%04x" $rgb]
	}
    }

    variable themeDefaults
    array set themeDefaults [list \
	-background		white \
	-foreground		black \
	-disabledforeground	#a3a3a3 \
	-stripebackground	$stripeBg \
	-selectbackground	$selectBg \
	-selectforeground	white \
	-selectborderwidth	0 \
	-font			{"Lucida Grande" 12} \
	-labelbackground	$labelBg \
	-labeldeactivatedBg	$labeldeactivatedBg \
	-labeldisabledBg	$labeldisabledBg \
	-labelactiveBg		$labelBg \
	-labelpressedBg		$labelpressedBg \
	-labelselectedBg	$labelselectedBg \
	-labelselectedpressedBg	$labelselectedpressedBg \
	-labelforeground	black \
	-labeldisabledFg	#a3a3a3 \
	-labelactiveFg		black \
	-labelpressedFg		black \
	-labelselectedFg	black \
	-labelselectedpressedFg	black \
	-labelfont		{"Lucida Grande" 11} \
	-labelborderwidth	1 \
	-labelpady		1 \
	-arrowcolor		$arrowColor \
	-treestyle		aqua \
    ]

    variable pngSupported
    if {$majorOSVersion >= 14} {			;# OS X 10.10 or higher
	set themeDefaults(-arrowstyle) flatAngle7x4
    } elseif {$pngSupported} {
	set themeDefaults(-arrowstyle) photo7x7
    } else {
	set themeDefaults(-arrowstyle) flat7x7
    }
}

#------------------------------------------------------------------------------
# tablelist::AquativoTheme
#------------------------------------------------------------------------------
proc tablelist::AquativoTheme {} {
    variable themeDefaults
    array set themeDefaults [list \
	-background		white \
	-foreground		black \
	-disabledforeground	black \
	-stripebackground	"" \
	-selectbackground	#000000 \
	-selectforeground	#ffffff \
	-selectborderwidth	0 \
	-font			TkTextFont \
	-labelbackground	#fafafa \
	-labeldeactivatedBg	#fafafa \
	-labeldisabledBg	#fafafa \
	-labelactiveBg		#fafafa \
	-labelpressedBg		#fafafa \
	-labelforeground	black \
	-labeldisabledFg	black \
	-labelactiveFg		black \
	-labelpressedFg		black \
	-labelfont		TkDefaultFont \
	-labelborderwidth	2 \
	-labelpady		1 \
	-arrowcolor		#717171 \
	-arrowstyle		flat8x5 \
	-treestyle		aqua \
    ]
}

#------------------------------------------------------------------------------
# tablelist::blueTheme
#------------------------------------------------------------------------------
proc tablelist::blueTheme {} {
    variable themeDefaults
    array set themeDefaults [list \
	-background		#e6f3ff \
	-foreground		black \
	-disabledforeground	#666666 \
	-stripebackground	"" \
	-selectbackground	#ffff33 \
	-selectforeground	#000000 \
	-selectborderwidth	1 \
	-font			TkTextFont \
	-labelbackground	#6699cc \
	-labeldeactivatedBg	#6699cc \
	-labeldisabledBg	#6699cc \
	-labelactiveBg		#6699cc \
	-labelpressedBg		#6699cc \
	-labelforeground	black \
	-labeldisabledFg	#666666 \
	-labelactiveFg		black \
	-labelpressedFg		black \
	-labelfont		TkDefaultFont \
	-labelborderwidth	2 \
	-labelpady		1 \
	-arrowcolor		#2d2d66 \
	-arrowstyle		flat9x5 \
	-treestyle		gtk \
    ]
}

#------------------------------------------------------------------------------
# tablelist::clamTheme
#------------------------------------------------------------------------------
proc tablelist::clamTheme {} {
    variable themeDefaults
    array set themeDefaults [list \
	-background		white \
	-foreground		black \
	-disabledforeground	#999999 \
	-stripebackground	"" \
	-selectbackground	#4a6984 \
	-selectforeground	#ffffff \
	-selectborderwidth	0 \
	-font			TkTextFont \
	-labelbackground	#dcdad5 \
	-labeldeactivatedBg	#dcdad5 \
	-labeldisabledBg	#dcdad5 \
	-labelactiveBg		#eeebe7 \
	-labelpressedBg		#eeebe7 \
	-labelforeground	black \
	-labeldisabledFg	#999999 \
	-labelactiveFg		black \
	-labelpressedFg		black \
	-labelfont		TkDefaultFont \
	-labelborderwidth	2 \
	-labelpady		1 \
	-arrowcolor		"" \
	-arrowstyle		sunken10x9 \
	-treestyle		gtk \
    ]
}

#------------------------------------------------------------------------------
# tablelist::classicTheme
#------------------------------------------------------------------------------
proc tablelist::classicTheme {} {
    variable themeDefaults
    array set themeDefaults [list \
	-background		white \
	-foreground		black \
	-disabledforeground	#a3a3a3 \
	-stripebackground	"" \
	-selectbackground	#c3c3c3 \
	-selectforeground	#000000 \
	-selectborderwidth	1 \
	-font			TkTextFont \
	-labelbackground	#d9d9d9 \
	-labeldeactivatedBg	#d9d9d9 \
	-labeldisabledBg	#d9d9d9 \
	-labelactiveBg		#ececec \
	-labelpressedBg		#ececec \
	-labelforeground	black \
	-labeldisabledFg	#a3a3a3 \
	-labelactiveFg		black \
	-labelpressedFg		black \
	-labelfont		TkDefaultFont \
	-labelborderwidth	2 \
	-labelpady		1 \
	-arrowcolor		"" \
	-arrowstyle		sunken10x9 \
	-treestyle		gtk \
    ]

    if {[info exists tile::version] &&
	[string compare $tile::version 0.8] < 0} {
	set themeDefaults(-font)	TkClassicDefaultFont
	set themeDefaults(-labelfont)	TkClassicDefaultFont
    }
}

#------------------------------------------------------------------------------
# tablelist::defaultTheme
#------------------------------------------------------------------------------
proc tablelist::defaultTheme {} {
    variable themeDefaults
    array set themeDefaults [list \
	-background		white \
	-foreground		black \
	-disabledforeground	#a3a3a3 \
	-stripebackground	"" \
	-selectbackground	#4a6984 \
	-selectforeground	#ffffff \
	-selectborderwidth	1 \
	-font			TkTextFont \
	-labelbackground	#d9d9d9 \
	-labeldeactivatedBg	#d9d9d9 \
	-labeldisabledBg	#d9d9d9 \
	-labelactiveBg		#ececec \
	-labelpressedBg		#ececec \
	-labelforeground	black \
	-labeldisabledFg	#a3a3a3 \
	-labelactiveFg		black \
	-labelpressedFg		black \
	-labelfont		TkDefaultFont \
	-labelborderwidth	1 \
	-labelpady		1 \
	-arrowcolor		"" \
	-arrowstyle		sunken10x9 \
	-treestyle		gtk \
    ]
}

#------------------------------------------------------------------------------
# tablelist::keramikTheme
#------------------------------------------------------------------------------
proc tablelist::keramikTheme {} {
    variable themeDefaults
    array set themeDefaults [list \
	-background		white \
	-foreground		black \
	-disabledforeground	#aaaaaa \
	-stripebackground	"" \
	-selectbackground	#0a5f89 \
	-selectforeground	#ffffff \
	-selectborderwidth	0 \
	-font			TkTextFont \
	-labelbackground	#e2e4e7 \
	-labeldeactivatedBg	#e2e4e7 \
	-labeldisabledBg	#e2e4e7 \
	-labelactiveBg		#e2e4e7 \
	-labelpressedBg		#c6c8cc \
	-labelforeground	black \
	-labeldisabledFg	#aaaaaa \
	-labelactiveFg		black \
	-labelpressedFg		black \
	-labelfont		TkDefaultFont \
	-labelborderwidth	2 \
	-labelpady		1 \
	-arrowcolor		black \
	-arrowstyle		flat8x5 \
	-treestyle		winnative \
    ]
}

#------------------------------------------------------------------------------
# tablelist::keramik_altTheme
#------------------------------------------------------------------------------
proc tablelist::keramik_altTheme {} {
    variable themeDefaults
    array set themeDefaults [list \
	-background		white \
	-foreground		black \
	-disabledforeground	#aaaaaa \
	-stripebackground	"" \
	-selectbackground	#0a5f89 \
	-selectforeground	#ffffff \
	-selectborderwidth	0 \
	-font			TkTextFont \
	-labelbackground	#e2e4e7 \
	-labeldeactivatedBg	#e2e4e7 \
	-labeldisabledBg	#e2e4e7 \
	-labelactiveBg		#e2e4e7 \
	-labelpressedBg		#c6c8cc \
	-labelforeground	black \
	-labeldisabledFg	#aaaaaa \
	-labelactiveFg		black \
	-labelpressedFg		black \
	-labelfont		TkDefaultFont \
	-labelborderwidth	2 \
	-labelpady		1 \
	-arrowcolor		black \
	-arrowstyle		flat8x5 \
	-treestyle		winnative \
    ]
}

#------------------------------------------------------------------------------
# tablelist::krocTheme
#------------------------------------------------------------------------------
proc tablelist::krocTheme {} {
    variable themeDefaults
    array set themeDefaults [list \
	-background		white \
	-foreground		black \
	-disabledforeground	#b2b2b2 \
	-stripebackground	"" \
	-selectbackground	#000000 \
	-selectforeground	#ffffff \
	-selectborderwidth	1 \
	-font			TkTextFont \
	-labelbackground	#fcb64f \
	-labeldeactivatedBg	#fcb64f \
	-labeldisabledBg	#fcb64f \
	-labelactiveBg		#694418 \
	-labelpressedBg		#694418 \
	-labelforeground	black \
	-labeldisabledFg	#b2b2b2 \
	-labelactiveFg		#ffe7cb \
	-labelpressedFg		#ffe7cb \
	-labelfont		TkDefaultFont \
	-labelborderwidth	2 \
	-labelpady		1 \
	-arrowcolor		"" \
	-arrowstyle		sunken10x9 \
	-treestyle		gtk \
    ]
}

#------------------------------------------------------------------------------
# tablelist::plastikTheme
#------------------------------------------------------------------------------
proc tablelist::plastikTheme {} {
    variable themeDefaults
    array set themeDefaults [list \
	-background		white \
	-foreground		black \
	-disabledforeground	#aaaaaa \
	-stripebackground	"" \
	-selectbackground	#657a9e \
	-selectforeground	#ffffff \
	-selectborderwidth	0 \
	-font			TkTextFont \
	-labelbackground	#dcdde3 \
	-labeldeactivatedBg	#dcdde3 \
	-labeldisabledBg	#dcdde3 \
	-labelactiveBg		#dcdde3 \
	-labelpressedBg		#b9bcc0 \
	-labelforeground	black \
	-labeldisabledFg	#aaaaaa \
	-labelactiveFg		black \
	-labelpressedFg		black \
	-labelfont		TkDefaultFont \
	-labelborderwidth	2 \
	-labelpady		1 \
	-arrowcolor		black \
	-arrowstyle		flat7x4 \
	-treestyle		plastik \
    ]
}

#------------------------------------------------------------------------------
# tablelist::srivTheme
#------------------------------------------------------------------------------
proc tablelist::srivTheme {} {
    variable themeDefaults
    array set themeDefaults [list \
	-background		#e6f3ff \
	-foreground		black \
	-disabledforeground	#666666 \
	-stripebackground	"" \
	-selectbackground	#ffff33 \
	-selectforeground	#000000 \
	-selectborderwidth	1 \
	-font			TkTextFont \
	-labelbackground	#a0a0a0 \
	-labeldeactivatedBg	#a0a0a0 \
	-labeldisabledBg	#a0a0a0 \
	-labelactiveBg		#a0a0a0 \
	-labelpressedBg		#a0a0a0 \
	-labelforeground	black \
	-labeldisabledFg	#666666 \
	-labelactiveFg		black \
	-labelpressedFg		black \
	-labelfont		TkDefaultFont \
	-labelborderwidth	2 \
	-labelpady		1 \
	-arrowcolor		"" \
	-arrowstyle		sunken10x9 \
	-treestyle		gtk \
    ]
}

#------------------------------------------------------------------------------
# tablelist::srivlgTheme
#------------------------------------------------------------------------------
proc tablelist::srivlgTheme {} {
    variable themeDefaults
    array set themeDefaults [list \
	-background		#e6f3ff \
	-foreground		black \
	-disabledforeground	#666666 \
	-stripebackground	"" \
	-selectbackground	#ffff33 \
	-selectforeground	#000000 \
	-selectborderwidth	1 \
	-font			TkTextFont \
	-labelbackground	#6699cc \
	-labeldeactivatedBg	#6699cc \
	-labeldisabledBg	#6699cc \
	-labelactiveBg		#6699cc \
	-labelpressedBg		#6699cc \
	-labelforeground	black \
	-labeldisabledFg	#666666 \
	-labelactiveFg		black \
	-labelpressedFg		black \
	-labelfont		TkDefaultFont \
	-labelborderwidth	2 \
	-labelpady		1 \
	-arrowcolor		"" \
	-arrowstyle		sunken10x9 \
	-treestyle		gtk \
    ]
}

#------------------------------------------------------------------------------
# tablelist::stepTheme
#------------------------------------------------------------------------------
proc tablelist::stepTheme {} {
    variable themeDefaults
    array set themeDefaults [list \
	-background		white \
	-foreground		black \
	-disabledforeground	#808080 \
	-stripebackground	"" \
	-selectbackground	#fdcd00 \
	-selectforeground	#ffffff \
	-selectborderwidth	0 \
	-font			TkTextFont \
	-labelbackground	#a0a0a0 \
	-labeldeactivatedBg	#a0a0a0 \
	-labeldisabledBg	#a0a0a0 \
	-labelactiveBg		#aeb2c3 \
	-labelpressedBg		#aeb2c3 \
	-labelforeground	black \
	-labeldisabledFg	#808080 \
	-labelactiveFg		black \
	-labelpressedFg		black \
	-labelfont		TkDefaultFont \
	-labelborderwidth	2 \
	-labelpady		1 \
	-arrowcolor		"" \
	-arrowstyle		sunken10x9 \
	-treestyle		gtk \
    ]
}

#------------------------------------------------------------------------------
# tablelist::tileqtTheme
#
# Tested with the following Qt styles:
#
#   Acqua              KDE Classic                Motif Plus     RISC OS
#   B3/KDE             KDE_XP                     MS Windows 9x  SGI
#   Baghira            Keramik                    Oxygen         System-Series
#   CDE                Light Style, 2nd revision  Phase          System++
#   Cleanlooks         Light Style, 3rd revision  Plastik        ThinKeramik
#   GTK+ Style         Lipstik                    Plastique
#   HighColor Classic  Marble                     Platinum
#   HighContrast       Motif                      QtCurve
#
# Supported KDE 1/2/3 color schemes:
#
#   Aqua Blue                     Ice (FreddyK)     Point Reyes Green
#   Aqua Graphite                 KDE 1             Pumpkin
#   Atlas Green                   KDE 2             Redmond 2000
#   BeOS                          Keramik           Redmond 95
#   Blue Slate                    Keramik Emerald   Redmond XP
#   CDE                           Keramik White     Solaris
#   Dark Blue                     Lipstik Noble     Storm
#   Desert Red                    Lipstik Standard  SuSE, old & new
#   Digital CDE                   Lipstik White     SUSE-kdm
#   EveX                          Media Peach       System
#   High Contrast Black Text      Next              Thin Keramik, old & new
#   High Contrast Yellow on Blue  Pale Gray         Thin Keramik II
#   High Contrast White Text      Plastik
#
# Supported KDE 4 color schemes:
#
#   Honeycomb       Oxygen (= Standard)  Steel       Zion (Reversed)
#   Norway          Oxygen Cold          Wonton Soup
#   Obsidian Coast  Oxygen-Molecule 3.0  Zion
#------------------------------------------------------------------------------
proc tablelist::tileqtTheme {} {
    set bg		[tileqt_currentThemeColour -background]
    set fg		[tileqt_currentThemeColour -foreground]
    set tableBg		[tileqt_currentThemeColour -base]
    set tableFg		[tileqt_currentThemeColour -text]
    set tableDisFg	[tileqt_currentThemeColour -disabled -text]
    set selectBg	[tileqt_currentThemeColour -highlight]
    set selectFg	[tileqt_currentThemeColour -highlightedText]
    set labelBg		[tileqt_currentThemeColour -button]
    set labelFg		[tileqt_currentThemeColour -buttonText]
    set labelDisFg	[tileqt_currentThemeColour -disabled -buttonText]
    set style		[string tolower [tileqt_currentThemeName]]
    set pressedBg	$labelBg

    #
    # For most Qt styles the label colors depend on the color scheme:
    #
    switch "$bg $labelBg" {
	"#fafafa #6188d7" {	;# color scheme "Aqua Blue"
	    switch -- $style {  
		"light, 3rd revision"		      { set pressedBg #ffffff }
		"platinum"			      { set pressedBg #d0d0d0 }
		"baghira"	{ set labelBg #f5f5f5;  set pressedBg #9ec2fa }
		"highcolor"	{ set labelBg #628ada;  set pressedBg #6188d7 }
		"keramik"	{ set labelBg #8fabe4;  set pressedBg #7390cc }
		"phase"		{ set labelBg #6188d7;  set pressedBg #d0d0d0 }
		"plastik"	{ set labelBg #666bd6;  set pressedBg #5c7ec2 }
		"qtcurve"	{ set labelBg #f4f4f4;  set pressedBg #d0d0d0 }
		"thinkeramik"	{ set labelBg #f4f4f4;  set pressedBg #dedede }
	    }
	}

	"#ffffff #89919b" {	;# color scheme "Aqua Graphite"
	    switch -- $style {  
		"light, 3rd revision"		      { set pressedBg #ffffff }
		"platinum"			      { set pressedBg #d4d4d4 }
		"baghira"	{ set labelBg #f5f5f5;  set pressedBg #c3c7cd }
		"highcolor"	{ set labelBg #8b949e;  set pressedBg #89919b }
		"keramik"	{ set labelBg #acb1b8;  set pressedBg #91979e }
		"phase"		{ set labelBg #89919b;  set pressedBg #d4d4d4 }
		"plastik"	{ set labelBg #8c949d;  set pressedBg #7f868e }
		"qtcurve"	{ set labelBg #f6f6f6;  set pressedBg #d4d4d4 }
		"thinkeramik"	{ set labelBg #f4f4f4;  set pressedBg #e2e2e2 }
	    }
	}

	"#afb49f #afb49f" {	;# color scheme "Atlas Green"
	    switch -- $style {  
		"light, 3rd revision"		      { set pressedBg #c1c6af }
		"platinum"			      { set pressedBg #929684 }
		"baghira"	{ set labelBg #e5e8dc;  set pressedBg #dadcd0 }
		"highcolor"	{ set labelBg #b2b6a1;  set pressedBg #afb49f }
		"keramik"	{ set labelBg #c7cabb;  set pressedBg #adb1a1 }
		"phase"		{ set labelBg #a7b49f;  set pressedBg #929684 }
		"plastik"	{ set labelBg #acb19c;  set pressedBg #959987 }
		"qtcurve"	{ set labelBg #adb19e;  set pressedBg #939881 }
		"thinkeramik"	{ set labelBg #c1c4b6;  set pressedBg #a5a999 }
	    }
	}

	"#d9d9d9 #d9d9d9" {	;# color scheme "BeOS"
	    switch -- $style {  
		"light, 3rd revision"		      { set pressedBg #eeeeee }
		"platinum"			      { set pressedBg #b4b4b4 }
		"baghira"	{ set labelBg #f2f2f2;  set pressedBg #e9e9e9 }
		"highcolor"	{ set labelBg #dcdcdc;  set pressedBg #d9d9d9 }
		"keramik"	{ set labelBg #e5e5e5;  set pressedBg #cdcdcd }
		"phase"		{ set labelBg #dadada;  set pressedBg #b4b4b4 }
		"plastik"	{ set labelBg #d6d6d6;  set pressedBg #b6b6b6 }
		"qtcurve"	{ set labelBg #d6d6d6;  set pressedBg #b5b5b5 }
		"thinkeramik"	{ set labelBg #dddddd;  set pressedBg #c5c5c5 }
	    }
	}

	"#9db9c8 #9db9c8" {	;# color scheme "Blue Slate"
	    switch -- $style {  
		"light, 3rd revision"		      { set pressedBg #adcbdc }
		"platinum"			      { set pressedBg #8299a6 }
		"baghira"	{ set labelBg #ddeff6;  set pressedBg #d0e1ea }
		"highcolor"	{ set labelBg #9fbbcb;  set pressedBg #9db9c8 }
		"keramik"	{ set labelBg #baced9;  set pressedBg #a0b5c1 }
		"phase"		{ set labelBg #9db9c9;  set pressedBg #8299a6 }
		"plastik"	{ set labelBg #99b6c5;  set pressedBg #869fab }
		"qtcurve"	{ set labelBg #9bb7c6;  set pressedBg #7c9cad }
		"thinkeramik"	{ set labelBg #b5c8d2;  set pressedBg #98adb8 }
	    }
	}

	"#999999 #999999" {	;# color scheme "CDE"
	    switch -- $style {  
		"light, 3rd revision"		      { set pressedBg #a8a8a8 }
		"platinum"			      { set pressedBg #7f7f7f }
		"baghira"	{ set labelBg #d5d5d5;  set pressedBg #cccccc }
		"highcolor"	{ set labelBg #9b9b9b;  set pressedBg #999999 }
		"keramik"	{ set labelBg #b7b7b7;  set pressedBg #9d9d9d }
		"phase"		{ set labelBg #999999;  set pressedBg #7f7f7f }
		"plastik"	{ set labelBg #979797;  set pressedBg #808080 }
		"qtcurve"	{ set labelBg #979797;  set pressedBg #7f7f7f }
		"thinkeramik"	{ set labelBg #b3b3b3;  set pressedBg #959595 }
	    }
	}

	"#426794 #426794" {	;# color scheme "Dark Blue"
	    switch -- $style {  
		"light, 3rd revision"		      { set pressedBg #4871a2 }
		"platinum"			      { set pressedBg #37567b }
		"baghira"	{ set labelBg #8aafdc;  set pressedBg #82a3cc }
		"highcolor"	{ set labelBg #436895;  set pressedBg #426794 }
		"keramik"	{ set labelBg #7994b4;  set pressedBg #5b7799 }
		"phase"		{ set labelBg #426795;  set pressedBg #37567b }
		"plastik"	{ set labelBg #406592;  set pressedBg #36547a }
		"qtcurve"	{ set labelBg #416692;  set pressedBg #3c5676 }
		"thinkeramik"	{ set labelBg #7991af;  set pressedBg #546f91 }
	    }
	}

	"#d6cdbb #d6cdbb" {	;# color scheme "Desert Red"
	    switch -- $style {  
		"light, 3rd revision"		      { set pressedBg #ebe1ce }
		"platinum"			      { set pressedBg #b2ab9c }
		"baghira"	{ set labelBg #f7f4ec;  set pressedBg #edeae0 }
		"highcolor"	{ set labelBg #d9d0be;  set pressedBg #d6cdbb }
		"keramik"	{ set labelBg #e3dcd0;  set pressedBg #cbc5b7 }
		"phase"		{ set labelBg #d6cdbb;  set pressedBg #b2ab9c }
		"plastik"	{ set labelBg #d3cbb8;  set pressedBg #bab3a3 }
		"qtcurve"	{ set labelBg #d4cbb8;  set pressedBg #b8ac94 }
		"thinkeramik"	{ set labelBg #dbd5ca;  set pressedBg #c2bbae }
	    }
	}

	"#4b7b82 #4b7b82" {	;# color scheme "Digital CDE"
	    switch -- $style {  
		"light, 3rd revision"		      { set pressedBg #52878f }
		"platinum"			      { set pressedBg #3e666c }
		"baghira"	{ set labelBg #97c3c9;  set pressedBg #8eb6bc }
		"highcolor"	{ set labelBg #4b7d84;  set pressedBg #4b7b82 }
		"keramik"	{ set labelBg #80a2a7;  set pressedBg #62868c }
		"phase"		{ set labelBg #4b7b82;  set pressedBg #3e666c }
		"plastik"	{ set labelBg #49787f;  set pressedBg #3d666c }
		"qtcurve"	{ set labelBg #4a7980;  set pressedBg #416468 }
		"thinkeramik"	{ set labelBg #7f97a3;  set pressedBg #5a7e83 }
	    }
	}

	"#e6dedc #e4e4e4" {	;# color scheme "EveX"
	    switch -- $style {  
		"light, 3rd revision"		      { set pressedBg #fdf4f2 }
		"platinum"			      { set pressedBg #bfb8b7 }
		"baghira"	{ set labelBg #f6f5f5;  set pressedBg #ededed }
		"highcolor"	{ set labelBg #e7e7e7;  set pressedBg #e4e4e4 }
		"keramik"	{ set labelBg #ededed;  set pressedBg #d6d6d6 }
		"phase"		{ set labelBg #e7e0dd;  set pressedBg #bfb8b7 }
		"plastik"	{ set labelBg #e2e2e2;  set pressedBg #c0bfbf }
		"qtcurve"	{ set labelBg #e4dcd9;  set pressedBg #c5b7b4 }
		"thinkeramik"	{ set labelBg #e6e1df;  set pressedBg #c7c9c7 }
	    }
	}

	"#ffffff #ffffff" {	;# color scheme "High Contrast Black Text"
	    switch -- $style {  
		"light, 3rd revision"		      { set pressedBg #ffffff }
		"platinum"			      { set pressedBg #d4d4d4 }
		"baghira"	{ set labelBg #f5f5f5;  set pressedBg #f2f2f2 }
		"highcolor"	{ set labelBg #f5f5f5;  set pressedBg #ffffff }
		"keramik"	{ set labelBg #fbfbfb;  set pressedBg #e8e8e8 }
		"phase"		{ set labelBg #f7f7f7;  set pressedBg #d4d4d4 }
		"plastik"	{ set labelBg #f8f8f8;  set pressedBg #d8d8d8 }
		"qtcurve"	{ set labelBg #f6f6f6;  set pressedBg #d6d6d6 }
		"thinkeramik"	{ set labelBg #f4f4f4;  set pressedBg #e2e2e2 }
	    }
	}

	"#0000ff #0000ff" {	;# color scheme "High Contrast Yellow on Blue"
	    switch -- $style {  
		"light, 3rd revision"		      { set pressedBg #1919ff }
		"platinum"			      { set pressedBg #0000d4 }
		"baghira"	{ set labelBg #4848ff;  set pressedBg #4646ff }
		"highcolor"	{ set labelBg #0e0ef5;  set pressedBg #0000ff }
		"keramik"	{ set labelBg #4949fb;  set pressedBg #2929e8 }
		"phase"		{ set labelBg #0909f7;  set pressedBg #0000d4 }
		"plastik"	{ set labelBg #0505f8;  set pressedBg #0000d8 }
		"qtcurve"	{ set labelBg #0909f2;  set pressedBg #0f0fc5 }
		"thinkeramik"	{ set labelBg #5151f4;  set pressedBg #2222e2 }
	    }
	}

	"#000000 #000000" {	;# color scheme "High Contrast White Text"
	    switch -- $style {  
		"light, 3rd revision"		      { set pressedBg #000000 }
		"platinum"			      { set pressedBg #000000 }
		"baghira"	{ set labelBg #818181;  set pressedBg #7f7f7f }
		"highcolor"	{ set labelBg #000000;  set pressedBg #000000 }
		"keramik"	{ set labelBg #494949;  set pressedBg #292929 }
		"phase"		{ set labelBg #000000;  set pressedBg #000000 }
		"plastik"	{ set labelBg #000000;  set pressedBg #000000 }
		"qtcurve"	{ set labelBg #000000;  set pressedBg #000000 }
		"thinkeramik"	{ set labelBg #4d4d4d;  set pressedBg #222222 }
	    }
	}

	"#f6f6ff #e4eeff" {	;# color scheme "Ice (FreddyK)"
	    switch -- $style {
		"light, 3rd revision"		      { set pressedBg #ffffff }
		"platinum"			      { set pressedBg #cdcdd4 }
		"baghira"	{ set labelBg #f6f6f6;  set pressedBg #f2f4f6 }
		"highcolor"	{ set labelBg #e8edf5;  set pressedBg #e4eeff }
		"keramik"	{ set labelBg #edf3fb;  set pressedBg #d6dde8 }
		"phase"		{ set labelBg #f3f3f7;  set pressedBg #cdcdd4 }
		"plastik"	{ set labelBg #e3eaf8;  set pressedBg #c0c9d8 }
		"qtcurve"	{ set labelBg #ebebfc;  set pressedBg #b3b3f0 }
		"thinkeramik"	{ set labelBg #f1f1f4;  set pressedBg #dbdbe2 }
	    }
	}

	"#c0c0c0 #c0c0c0" {	;# color schemes "KDE 1" and "Storm"
	    switch -- $style {
		"light, 3rd revision"		      { set pressedBg #d3d3d3 }
		"platinum"			      { set pressedBg #a0a0a0 }
		"baghira"	{ set labelBg #e9e9e9;  set pressedBg #dedede }
		"highcolor"	{ set labelBg #c2c2c2;  set pressedBg #c0c0c0 }
		"keramik"	{ set labelBg #d3d3d3;  set pressedBg #bababa }
		"phase"		{ set labelBg #c1c1c1;  set pressedBg #a0a0a0 }
		"plastik"	{ set labelBg #bebebe;  set pressedBg #a2a2a2 }
		"qtcurve"	{ set labelBg #bebebe;  set pressedBg #a0a0a0 }
		"thinkeramik"	{ set labelBg #cccccc;  set pressedBg #b2b2b2 }
	    }
	}

	"#dcdcdc #e4e4e4" {	;# color scheme "KDE 2"
	    switch -- $style {
		"light, 3rd revision"		      { set pressedBg #d3d3d3 }
		"platinum"			      { set pressedBg #b7b7b7 }
		"baghira"	{ set labelBg #f3f3f3;  set pressedBg #ededed }
		"highcolor"	{ set labelBg #e7e7e7;  set pressedBg #e4e4e4 }
		"keramik"	{ set labelBg #ededed;  set pressedBg #d6d6d6 }
		"phase"		{ set labelBg #dddddd;  set pressedBg #b7b7b7 }
		"plastik"	{ set labelBg #e2e2e2;  set pressedBg #c0c0c0 }
		"qtcurve"	{ set labelBg #d9d9d9;  set pressedBg #b8b8b8 }
		"thinkeramik"	{ set labelBg #dfdfdf;  set pressedBg #c7c7c7 }
	    }
	}

	"#eae9e8 #e6f0f9" {	;# color scheme "Keramik"
	    switch -- $style {
		"light, 3rd revision"		      { set pressedBg #ffffff }
		"platinum"			      { set pressedBg #c3c2c1 }
		"baghira"	{ set labelBg #f4f4f4;  set pressedBg #f1f3f5 }
		"highcolor"	{ set labelBg #eaeef2;  set pressedBg #e6f0f9 }
		"keramik"	{ set labelBg #eef4f8;  set pressedBg #d7dfe5 }
		"phase"		{ set labelBg #ebeae9;  set pressedBg #c3c2c1 }
		"plastik"	{ set labelBg #e3ecf3;  set pressedBg #c0c9d2 }
		"qtcurve"	{ set labelBg #e8e6e6;  set pressedBg #c5c3c1 }
		"thinkeramik"	{ set labelBg #e8e8e7;  set pressedBg #d2d1d0 }
	    }
	}

	"#eeeee6 #eeeade" {	;# color scheme "Keramik Emerald"
	    switch -- $style {
		"light, 3rd revision"		      { set pressedBg #fffffc }
		"platinum"			      { set pressedBg #c6c6bf }
		"baghira"	{ set labelBg #f6f6f6;  set pressedBg #f3f2ee }
		"highcolor"	{ set labelBg #eeeae1;  set pressedBg #eeeade }
		"keramik"	{ set labelBg #f3f1e8;  set pressedBg #dddad1 }
		"phase"		{ set labelBg #efefef;  set pressedBg #c6c6bf }
		"plastik"	{ set labelBg #ebe7dc;  set pressedBg #c9c6bc }
		"qtcurve"	{ set labelBg #ecece3;  set pressedBg #cdcdbb }
		"thinkeramik"	{ set labelBg #ebebe5;  set pressedBg #d5d5cf }
	    }
	}

	"#e9e9e9 #f6f6f6" {	;# color scheme "Keramik White"
	    switch -- $style {
		"light, 3rd revision"		      { set pressedBg #ffffff }
		"platinum"			      { set pressedBg #c2c2c2 }
		"baghira"	{ set labelBg #f4f4f4;  set pressedBg #f1f1f1 }
		"highcolor"	{ set labelBg #f1f1f1;  set pressedBg #f6f6f6 }
		"keramik"	{ set labelBg #f7f7f7;  set pressedBg #e3e3e3 }
		"phase"		{ set labelBg #eaeaea;  set pressedBg #c2c2c2 }
		"plastik"	{ set labelBg #f1f1f1;  set pressedBg #cfcfcf }
		"qtcurve"	{ set labelBg #e6e6e6;  set pressedBg #c3c3c3 }
		"thinkeramik"	{ set labelBg #e8e8e8;  set pressedBg #d1d1d1 }
	    }
	}

	"#ebe9e9 #f6f4f4" {	;# color scheme "Lipstik Noble"
	    switch -- $style {
		"light, 3rd revision"		      { set pressedBg #ffffff }
		"platinum"			      { set pressedBg #c3c1c1 }
		"baghira"	{ set labelBg #f4f4f4;  set pressedBg #f1f1f1 }
		"highcolor"	{ set labelBg #f1f0f0;  set pressedBg #f6f4f4 }
		"keramik"	{ set labelBg #f7f6f6;  set pressedBg #e3e1e1 }
		"phase"		{ set labelBg #f5f4f4;  set pressedBg #c3c1c1 }
		"plastik"	{ set labelBg #f2f2f2;  set pressedBg #d3d2d2 }
		"qtcurve"	{ set labelBg #e9e6e6;  set pressedBg #c5c1c1 }
		"thinkeramik"	{ set labelBg #e9e8e8;  set pressedBg #d3d1d1 }
	    }
	}

	"#eeeee6 #eeeade" {	;# color scheme "Lipstik Standard"
	    switch -- $style {
		"light, 3rd revision"		      { set pressedBg #fffffc }
		"platinum"			      { set pressedBg #c6c6bf }
		"baghira"	{ set labelBg #f6f6f6;  set pressedBg #f3f2ee }
		"highcolor"	{ set labelBg #eeeae1;  set pressedBg #eeeade }
		"keramik"	{ set labelBg #f3f1e8;  set pressedBg #dddad1 }
		"phase"		{ set labelBg #eeeade;  set pressedBg #c6c6bf }
		"plastik"	{ set labelBg #ebe7dc;  set pressedBg #ccc9c0 }
		"qtcurve"	{ set labelBg #ecece3;  set pressedBg #ccccba }
		"thinkeramik"	{ set labelBg #ebebe5;  set pressedBg #d5d5cf }
	    }
	}

	"#eeeff2 #f7faff" {	;# color scheme "Lipstik White"
	    switch -- $style {
		"light, 3rd revision"		      { set pressedBg #ffffff }
		"platinum"			      { set pressedBg #c6c7c9 }
		"baghira"	{ set labelBg #f5f5f5;  set pressedBg #f2f2f3 }
		"highcolor"	{ set labelBg #f1f2f5;  set pressedBg #f1faff }
		"keramik"	{ set labelBg #f8f9fb;  set pressedBg #e3e5e8 }
		"phase"		{ set labelBg #f4f5f7;  set pressedBg #c6c7c9 }
		"plastik"	{ set labelBg #f3f4f7;  set pressedBg #d0d3d8 }
		"qtcurve"	{ set labelBg #ebecf0;  set pressedBg #c4c7ce }
		"thinkeramik"	{ set labelBg #ebecee;  set pressedBg #d5d6d8 }
	    }
	}

	"#f4ddb2 #f4ddb2" {	;# color scheme "Media Peach"
	    switch -- $style {
		"light, 3rd revision"		      { set pressedBg #ffebc7 }
		"platinum"			      { set pressedBg #cbb894 }
		"baghira"	{ set labelBg #fcfced;  set pressedBg #faf6df }
		"highcolor"	{ set labelBg #f0dbb6;  set pressedBg #f4ddb2 }
		"keramik"	{ set labelBg #f6e8c9;  set pressedBg #e1d0b0 }
		"phase"		{ set labelBg #f4ddb2;  set pressedBg #cbb894 }
		"plastik"	{ set labelBg #ffdbaf;  set pressedBg #d5c19c }
		"qtcurve"	{ set labelBg #f2dbaf;  set pressedBg #e0bd7f }
		"thinkeramik"	{ set labelBg #efe0c3;  set pressedBg #d9c8a7 }
	    }
	}

	"#a8a8a8 #a8a8a8" {	;# color scheme "Next"
	    switch -- $style {
		"light, 3rd revision"		      { set pressedBg #b8b8b8 }
		"platinum"			      { set pressedBg #8c8c8c }
		"baghira"	{ set labelBg #dedede;  set pressedBg #d3d3d3 }
		"highcolor"	{ set labelBg #aaaaaa;  set pressedBg #a8a8a8 }
		"keramik"	{ set labelBg #c2c2c2;  set pressedBg #a8a8a8 }
		"phase"		{ set labelBg #a9a9a9;  set pressedBg #8c8c8c }
		"plastik"	{ set labelBg #a5a5a5;  set pressedBg #898989 }
		"qtcurve"	{ set labelBg #a6a6a6;  set pressedBg #8d8d8d }
		"thinkeramik"	{ set labelBg #bdbdbd;  set pressedBg #a0a0a0 }
	    }
	}

	"#d6d6d6 #d6d6d6" {	;# color scheme "Pale Gray"
	    switch -- $style {
		"light, 3rd revision"		      { set pressedBg #ebebeb }
		"platinum"			      { set pressedBg #b2b2b2 }
		"baghira"	{ set labelBg #f2f2f2;  set pressedBg #e8e8e8 }
		"highcolor"	{ set labelBg #d9d9d9;  set pressedBg #d6d6d6 }
		"keramik"	{ set labelBg #e3e3e3;  set pressedBg #cbcbcb }
		"phase"		{ set labelBg #d6d6d6;  set pressedBg #b2b2b2 }
		"plastik"	{ set labelBg #d3d3d3;  set pressedBg #bababa }
		"qtcurve"	{ set labelBg #d4d4d4;  set pressedBg #b1b1b1 }
		"thinkeramik"	{ set labelBg #dbdbdb;  set pressedBg #c2c2c2 }
	    }
	}

	"#efefef #dddfe4" {	;# color scheme "Plastik"
	    switch -- $style {
		"light, 3rd revision"		      { set pressedBg #ffffff }
		"platinum"			      { set pressedBg #c7c7c7 }
		"baghira"	{ set labelBg #f5f5f5;  set pressedBg #ececee }
		"highcolor"	{ set labelBg #e0e1e7;  set pressedBg #dddfe4 }
		"keramik"	{ set labelBg #e8e9ed;  set pressedBg #d0d2d6 }
		"phase"		{ set labelBg #dee0e5;  set pressedBg #c7c7c7 }
		"plastik"	{ set labelBg #dbdde2;  set pressedBg #babcc0 }
		"qtcurve"	{ set labelBg #ececec;  set pressedBg #c9c9c9 }
		"thinkeramik"	{ set labelBg #ececec;  set pressedBg #d6d6d6 }
	    }
	}

	"#d3c5be #aba09a" {	;# color scheme "Point Reyes Green"
	    switch -- $style {
		"light, 3rd revision"		      { set pressedBg #e8d9d1 }
		"platinum"			      { set pressedBg #afa49e }
		"baghira"	{ set labelBg #f5efed;  set pressedBg #d7d0cd }
		"highcolor"	{ set labelBg #ada29d;  set pressedBg #aba09a }
		"keramik"	{ set labelBg #c4bcb8;  set pressedBg #aba29e }
		"phase"		{ set labelBg #d3c5be;  set pressedBg #afa49e }
		"plastik"	{ set labelBg #ab9f99;  set pressedBg #9b908a }
		"qtcurve"	{ set labelBg #d1c3bc;  set pressedBg #b3a197 }
		"thinkeramik"	{ set labelBg #d9d0cc;  set pressedBg #c0b6b1 }
	    }
	}

	"#eed8ae #eed8ae" {	;# color scheme "Pumpkin"
	    switch -- $style {
		"light, 3rd revision"		      { set pressedBg #ffe0c0 }
		"platinum"			      { set pressedBg #c6b390 }
		"baghira"	{ set labelBg #fcfbea;  set pressedBg #f9f4dd }
		"highcolor"	{ set labelBg #eed8b1;  set pressedBg #eed8ae }
		"keramik"	{ set labelBg #f3e4c6;  set pressedBg #ddcdad }
		"phase"		{ set labelBg #eed8ae;  set pressedBg #c6b390 }
		"plastik"	{ set labelBg #ebd5ac;  set pressedBg #cfbc96 }
		"qtcurve"	{ set labelBg #ebd6ab;  set pressedBg #d7b980 }
		"thinkeramik"	{ set labelBg #ebdcc0;  set pressedBg #d5c4a4 }
	    }
	}

	"#d4d0c8 #d4d0c8" {	;# color scheme "Redmond 2000"
	    switch -- $style {
		"light, 3rd revision"		      { set pressedBg #e9e5dc }
		"platinum"			      { set pressedBg #b0ada6 }
		"baghira"	{ set labelBg #f3f2ef;  set pressedBg #eae8e4 }
		"highcolor"	{ set labelBg #d7d3cb;  set pressedBg #d4d0c8 }
		"keramik"	{ set labelBg #e1ded9;  set pressedBg #cac7c1 }
		"phase"		{ set labelBg #d5d1c9;  set pressedBg #b0ada6 }
		"plastik"	{ set labelBg #d2cdc5;  set pressedBg #b2afa7 }
		"qtcurve"	{ set labelBg #d2cdc6;  set pressedBg #b4afa4 }
		"thinkeramik"	{ set labelBg #dad7d2;  set pressedBg #c1beb8 }
	    }
	}

	"#c3c3c3 #c3c3c3" {	;# color scheme "Redmond 95"
	    switch -- $style {
		"light, 3rd revision"		      { set pressedBg #d6d6d6 }
		"platinum"			      { set pressedBg #a2a2a2 }
		"baghira"	{ set labelBg #eaeaea;  set pressedBg #dfdfdf }
		"highcolor"	{ set labelBg #c5c5c5;  set pressedBg #c3c3c3 }
		"keramik"	{ set labelBg #d5d5d5;  set pressedBg #bdbdbd }
		"phase"		{ set labelBg #c4c4c4;  set pressedBg #a2a2a2 }
		"plastik"	{ set labelBg #c1c1c1;  set pressedBg #a3a3a3 }
		"qtcurve"	{ set labelBg #c1c1c1;  set pressedBg #a3a3a3 }
		"thinkeramik"	{ set labelBg #cecece;  set pressedBg #b5b5b5 }
	    }
	}

	"#eeeee6 #eeeade" {	;# color scheme "Redmond XP"
	    switch -- $style {
		"light, 3rd revision"		      { set pressedBg #fffffc }
		"platinum"			      { set pressedBg #c6c6bf }
		"baghira"	{ set labelBg #f6f6f6;  set pressedBg #f3f2ee }
		"highcolor"	{ set labelBg #eeeae1;  set pressedBg #eeeade }
		"keramik"	{ set labelBg #f3f1e8;  set pressedBg #dddad1 }
		"phase"		{ set labelBg #efefe7;  set pressedBg #c6c6bf }
		"plastik"	{ set labelBg #ebe7dc;  set pressedBg #c9c6bc }
		"qtcurve"	{ set labelBg #ecece3;  set pressedBg #cdcdbb }
		"thinkeramik"	{ set labelBg #ebebe5;  set pressedBg #d5d5cf }
	    }
	}

	"#aeb2c3 #aeb2c3" {	;# color scheme "Solaris"
	    switch -- $style {
		"light, 3rd revision"		      { set pressedBg #bfc3d6 }
		"platinum"			      { set pressedBg #9194a2 }
		"baghira"	{ set labelBg #e4e7ef;  set pressedBg #d9dbe4 }
		"highcolor"	{ set labelBg #b0b4c5;  set pressedBg #aeb2c3 }
		"keramik"	{ set labelBg #c6c9d5;  set pressedBg #adb0bd }
		"phase"		{ set labelBg #aeb2c3;  set pressedBg #9194a2 }
		"plastik"	{ set labelBg #abafc0;  set pressedBg #969aa9 }
		"qtcurve"	{ set labelBg #acb0c1;  set pressedBg #8d91a5 }
		"thinkeramik"	{ set labelBg #c0c3ce;  set pressedBg #a5a7b5 }
	    }
	}

	"#eeeaee #e6f0f9" {	;# color scheme "SuSE" old
	    switch -- $style {
		"light, 3rd revision"		      { set pressedBg #ffffff }
		"platinum"			      { set pressedBg #c6c3c6 }
		"baghira"	{ set labelBg #f5f5f5;  set pressedBg #f1f3f5 }
		"highcolor"	{ set labelBg #eaeef2;  set pressedBg #e6f0f9 }
		"keramik"	{ set labelBg #eef4f8;  set pressedBg #d7dfe5 }
		"phase"		{ set labelBg #efecef;  set pressedBg #c6c3c6 }
		"plastik"	{ set labelBg #e3ecf3;  set pressedBg #c0c9d2 }
		"qtcurve"	{ set labelBg #ebe7eb;  set pressedBg #cac1ca }
		"thinkeramik"	{ set labelBg #ebe8eb;  set pressedBg #d5d2d5 }
	    }
	}

	"#eeeeee #f4f4f4" {	;# color scheme "SuSE" new
	    switch -- $style {
		"light, 3rd revision"		      { set pressedBg #ffffff }
		"platinum"			      { set pressedBg #c6c6c6 }
		"baghira"	{ set labelBg #f5f5f5;  set pressedBg #f1f1f1 }
		"highcolor"	{ set labelBg #f0f0f0;  set pressedBg #f4f4f4 }
		"keramik"	{ set labelBg #f6f6f6;  set pressedBg #e1e1e1 }
		"phase"		{ set labelBg #efefef;  set pressedBg #c6c6c6 }
		"plastik"	{ set labelBg #f0f0f0;  set pressedBg #cdcdcd }
		"qtcurve"	{ set labelBg #ebebeb;  set pressedBg #c7c7c7 }
		"thinkeramik"	{ set labelBg #ebebeb;  set pressedBg #d5d5d5 }
	    }
	}

	"#eaeaea #eaeaea" {	;# color scheme "SUSE-kdm"
	    switch -- $style {
		"light, 3rd revision"		      { set pressedBg #ffffff }
		"platinum"			      { set pressedBg #c3c3c3 }
		"baghira"	{ set labelBg #f4f4f4;  set pressedBg #efefef }
		"highcolor"	{ set labelBg #ececec;  set pressedBg #eaeaea }
		"keramik"	{ set labelBg #f1f1f1;  set pressedBg #dadada }
		"phase"		{ set labelBg #ebebeb;  set pressedBg #c3c3c3 }
		"plastik"	{ set labelBg #e7e7e7;  set pressedBg #c6c6c6 }
		"qtcurve"	{ set labelBg #e7e7e7;  set pressedBg #c4c4c4 }
		"thinkeramik"	{ set labelBg #e8e8e8;  set pressedBg #d2d2d2 }
	    }
	}

	"#d3d3d3 #d3d3d3" {	;# color scheme "System"
	    switch -- $style {
		"light, 3rd revision"		      { set pressedBg #e8e8e8 }
		"platinum"			      { set pressedBg #afafaf }
		"baghira"	{ set labelBg #f0f0f0;  set pressedBg #e6e6e6 }
		"highcolor"	{ set labelBg #d6d6d6;  set pressedBg #d3d3d3 }
		"keramik"	{ set labelBg #e1e1e1;  set pressedBg #c9c9c9 }
		"phase"		{ set labelBg #d2d2d2;  set pressedBg #afafaf }
		"plastik"	{ set labelBg #d0d0d0;  set pressedBg #b9b9b9 }
		"qtcurve"	{ set labelBg #d1d1d1;  set pressedBg #aeaeae }
		"thinkeramik"	{ set labelBg #d9d9d9;  set pressedBg #c0c0c0 }
	    }
	}

	"#e6e6de #f0f0ef" {	;# color scheme "Thin Keramik" old
	    switch -- $style {
		"light, 3rd revision"		      { set pressedBg #fdfdf4 }
		"platinum"			      { set pressedBg #bfbfb8 }
		"baghira"	{ set labelBg #f6f6f5;  set pressedBg #f0f0f0 }
		"highcolor"	{ set labelBg #eeeeee;  set pressedBg #f0f0ef }
		"keramik"	{ set labelBg #f4f4f4;  set pressedBg #dfdfde }
		"phase"		{ set labelBg #e7e7df;  set pressedBg #bfbfb8 }
		"plastik"	{ set labelBg #ededeb;  set pressedBg #cbcbc9 }
		"qtcurve"	{ set labelBg #e3e3db;  set pressedBg #c4c4b6 }
		"thinkeramik"	{ set labelBg #e6e6e1;  set pressedBg #cfcfc9 }
	    }
	}

	"#edede1 #f6f6e9" {	;# color scheme "Thin Keramik" new
	    switch -- $style {
		"light, 3rd revision"		      { set pressedBg #fffff7 }
		"platinum"			      { set pressedBg #c5c5bb }
		"baghira"	{ set labelBg #f6f6f5;  set pressedBg #f3f3f1 }
		"highcolor"	{ set labelBg #f1f1ec;  set pressedBg #f6f6e9 }
		"keramik"	{ set labelBg #f7f7f0;  set pressedBg #e3e3da }
		"phase"		{ set labelBg #edede1;  set pressedBg #c5c5bb }
		"plastik"	{ set labelBg #f4f4e6;  set pressedBg #ddddd0 }
		"qtcurve"	{ set labelBg #ebebde;  set pressedBg #cbcbb3 }
		"thinkeramik"	{ set labelBg #eaeae3;  set pressedBg #d4d4cb }
	    }
	}

	"#f6f5e8 #eeeade" {	;# color scheme "Thin Keramik II"
	    switch -- $style {
		"light, 3rd revision"		      { set pressedBg #ffffff }
		"platinum"			      { set pressedBg #cdccc1 }
		"baghira"	{ set labelBg #f7f7f7;  set pressedBg #f3f2ee }
		"highcolor"	{ set labelBg #eeeae1;  set pressedBg #eeeade }
		"keramik"	{ set labelBg #f3f1e8;  set pressedBg #dddad1 }
		"phase"		{ set labelBg #f3f2e9;  set pressedBg #cdccc1 }
		"plastik"	{ set labelBg #ebe7dc;  set pressedBg #c9c6bc }
		"qtcurve"	{ set labelBg #f4f2e5;  set pressedBg #dbd8b6 }
		"thinkeramik"	{ set labelBg #f1f1e8;  set pressedBg #dbdad0 }
	    }
	}

	"#d4d7d0 #babdb7" {	;# color scheme "Honeycomb"
	    switch -- $style {
		"cde" -
		"motif"				      { set pressedBg #b1b4ae }
		"plastique"	{ set labelBg #b8bbb5;  set pressedBg #c1c4be }
	    }
	}

	"#ebe2d2 #f7f2e8" {	;# color scheme "Norway"
	    switch -- $style {
		"cde" -
		"motif"				      { set pressedBg #c8bba3 }
		"plastique"	{ set labelBg #f4f0e6;  set pressedBg #d6cfbf }
	    }
	}

	"#302f2f #403f3e" {	;# color scheme "Obsidian Coast"
	    switch -- $style {
		"cde" -
		"motif"				      { set pressedBg #2a2929 }
		"plastique"	{ set labelBg #3f3e3d;  set pressedBg #2b2a2a }
	    }
	}

	"#d6d2d0 #dfdcd9" {	;# color schemes "Oxygen" and "Standard"
	    switch -- $style {
		"cde" -
		"motif"				      { set pressedBg #b6aeaa }
		"plastique"	{ set labelBg #dddad7;  set pressedBg #c3bfbe }
	    }
	}

	"#e0dfde #e8e7e6" {	;# c. s. "Oxygen Cold" and "Oxygen-Molecule 3.0"
	    switch -- $style {
		"cde" -
		"motif"				      { set pressedBg #bbb9b8 }
		"plastique"	{ set labelBg #e6e5e4;  set pressedBg #cdcccb }
	    }
	}

	"#e0dfd8 #e8e7df" {	;# color scheme "Steel"
	    switch -- $style {
		"cde" -
		"motif"				      { set pressedBg #babab4 }
		"plastique"	{ set labelBg #e6e5dd;  set pressedBg #cdccc5 }
	    }
	}

	"#494e58 #525863" {	;# color scheme "Wonton Soup"
	    switch -- $style {
		"cde" -
		"motif"				      { set pressedBg #3f444c }
		"plastique"	{ set labelBg #515762;  set pressedBg #424650 }
	    }
	}

	"#fcfcfc #ffffff" {	;# color scheme "Zion"
	    switch -- $style {
		"cde" -
		"motif"				      { set pressedBg #dedede }
		"plastique"	{ set labelBg #f9f9f9;  set pressedBg #e5e5e5 }
	    }
	}

	"#101010 #000000" {	;# color scheme "Zion (Reversed)"
	    switch -- $style {
		"cde" -
		"motif"				      { set pressedBg #5e5e5e }
		"plastique"	{ set labelBg #000000;  set pressedBg #0e0e0e }
	    }
	}
    }

    #
    # For some Qt styles the label colors are independent of the color scheme:
    #
    switch -- $style {
	"acqua" {
	    set labelBg #e7e7e7;  set labelFg #000000;  set pressedBg #8fbeec
	}

	"gtk+" {
	    set labelBg #e8e7e6;			set pressedBg $labelBg
	}

	"kde_xp" {
	    set labelBg #ebeadb;  set labelFg #000000;  set pressedBg #faf8f3
	}

	"lipstik" -
	"oxygen" {
	    set labelBg $bg;				set pressedBg $labelBg
	}

	"marble" {
	    set labelBg #cccccc;  set labelFg $fg;      set pressedBg $labelBg
	}

	"riscos" {
	    set labelBg #dddddd;  set labelFg #000000;  set pressedBg $labelBg
	}

	"system" -
	"systemalt" {
	    set labelBg #cbcbcb;  set labelFg #000000;  set pressedBg $labelBg
	}
    }

    #
    # The stripe background color is specified
    # by a global KDE configuration option:
    #
    if {[info exists ::env(KDE_SESSION_VERSION)] &&
	$::env(KDE_SESSION_VERSION) ne ""} {
	set val [getKdeConfigVal "Colors:View" "BackgroundAlternate"]
    } else {
	set val [getKdeConfigVal "General" "alternateBackground"]
    }
    if {$val eq "" || [string index $val 0] eq "#"} {
	set stripeBg $val
    } elseif {[scan $val "%d,%d,%d" r g b] == 3} {
	set stripeBg [format "#%02x%02x%02x" $r $g $b]
    } else {
	set stripeBg ""
    }

    #
    # The arrow color and style depend mainly on the current Qt style:
    #
    switch -- $style {
	"highcontrast" -
	"light, 2nd revision" -
	"light, 3rd revision" -
	"lipstik" -
	"phase" -
	"plastik"	{ set arrowColor $labelFg; set arrowStyle flat7x4 }

	"baghira"	{ set arrowColor $labelFg; set arrowStyle flat7x7 }

	"cleanlooks" -
	"gtk+" -
	"oxygen"	{ set arrowColor $labelFg; set arrowStyle flatAngle9x6 }

	"phase"		{ set arrowColor $labelFg; set arrowStyle flat6x4 }

	"qtcurve"	{ set arrowColor $labelFg; set arrowStyle flatAngle7x5 }

	"keramik" -
	"thinkeramik"	{ set arrowColor $labelFg; set arrowStyle flat8x5 }

	default		{ set arrowColor "";	   set arrowStyle sunken12x11 }
    }

    #
    # The tree style depends on the current Qt style:
    #
    switch -- $style {
	"baghira" -
	"cde" -
	"motif"		{ set treeStyle baghira }
	"gtk+"		{ set treeStyle gtk }
	"oxygen"	{ set treeStyle oxygen2 }
	"phase"		{ set treeStyle phase }
	"plastik"	{ set treeStyle plastik }
	"plastique"	{ set treeStyle plastique }
	"qtcurve"	{ set treeStyle klearlooks }
	default		{ set treeStyle winnative }
    }

    variable themeDefaults
    array set themeDefaults [list \
	-background		$tableBg \
	-foreground		$tableFg \
	-disabledforeground	$tableDisFg \
	-stripebackground	$stripeBg \
	-selectbackground	$selectBg \
	-selectforeground	$selectFg \
	-selectborderwidth	0 \
	-font			TkTextFont \
	-labelbackground	$labelBg \
	-labeldeactivatedBg	$labelBg \
	-labeldisabledBg	$labelBg \
	-labelactiveBg		$labelBg \
	-labelpressedBg		$pressedBg \
	-labelforeground	$labelFg \
	-labeldisabledFg	$labelDisFg \
	-labelactiveFg		$labelFg \
	-labelpressedFg		$labelFg \
	-labelfont		TkDefaultFont \
	-labelborderwidth	4 \
	-labelpady		0 \
	-arrowcolor		$arrowColor \
	-arrowstyle		$arrowStyle \
	-treestyle		$treeStyle \
    ]
}

#------------------------------------------------------------------------------
# tablelist::vistaTheme
#------------------------------------------------------------------------------
proc tablelist::vistaTheme {} {
    variable themeDefaults
    array set themeDefaults [list \
	-background		SystemWindow \
	-foreground		SystemWindowText \
	-disabledforeground	SystemDisabledText \
	-stripebackground	"" \
	-selectborderwidth	0 \
	-font			TkTextFont \
	-labelforeground	SystemButtonText \
	-labeldisabledFg	SystemDisabledText \
	-labelactiveFg		SystemButtonText \
	-labelpressedFg		SystemButtonText \
	-labelfont		TkDefaultFont \
    ]

    switch [winfo rgb . SystemHighlight] {
	"13107 39321 65535" {					;# Aero
	    set selectFg	SystemWindowText
	    set labelBg		#f8f9fa
	    set activeBg	#c3eeff
	    set pressedBg	#95d8f7
	    set labelBd		4
	    set labelPadY	4
	    set arrowColor	#569bc0
	    set arrowStyle	flat7x4

	    if {$::tcl_platform(osVersion) == 6.0} {		;# Win Vista
		set selectBg	#d8effb
		set treeStyle	vistaAero
	    } else {						;# Win 7
		set selectBg	#cee2fc
		set treeStyle	win7Aero
	    }
	}

	default {						;# Win Classic
	    set selectBg	SystemHighlight
	    set selectFg	SystemHighlightText
	    set labelBg		SystemButtonFace
	    set activeBg	SystemButtonFace
	    set pressedBg	SystemButtonFace
	    set labelBd		2
	    set labelPadY	0
	    set arrowColor	SystemButtonShadow
	    set arrowStyle	flat7x4

	    if {$::tcl_platform(osVersion) == 6.0} {		;# Win Vista
		set treeStyle	vistaClassic
	    } else {						;# Win 7
		set treeStyle	win7Classic
	    }
	}
    }

    array set themeDefaults [list \
	-selectbackground	$selectBg \
	-selectforeground	$selectFg \
	-labelbackground	$labelBg \
	-labeldeactivatedBg	$labelBg \
	-labeldisabledBg	$labelBg \
	-labelactiveBg		$activeBg \
	-labelpressedBg		$pressedBg \
	-labelborderwidth	$labelBd \
	-labelpady		$labelPadY \
	-arrowcolor		$arrowColor \
	-arrowstyle		$arrowStyle \
	-treestyle		$treeStyle \
    ]
}

#------------------------------------------------------------------------------
# tablelist::winnativeTheme
#------------------------------------------------------------------------------
proc tablelist::winnativeTheme {} {
    variable themeDefaults
    array set themeDefaults [list \
	-background		SystemWindow \
	-foreground		SystemWindowText \
	-disabledforeground	SystemDisabledText \
	-stripebackground	"" \
	-selectbackground	SystemHighlight \
	-selectforeground	SystemHighlightText \
	-selectborderwidth	0 \
	-font			TkTextFont \
	-labelbackground	SystemButtonFace \
	-labeldeactivatedBg	SystemButtonFace \
	-labeldisabledBg	SystemButtonFace \
	-labelactiveBg		SystemButtonFace \
	-labelpressedBg		SystemButtonFace \
	-labelforeground	SystemButtonText \
	-labeldisabledFg	SystemDisabledText \
	-labelactiveFg		SystemButtonText \
	-labelpressedFg		SystemButtonText \
	-labelfont		TkDefaultFont \
	-labelborderwidth	2 \
	-labelpady		0 \
	-arrowcolor		"" \
	-arrowstyle		sunken8x7 \
	-treestyle		winnative \
    ]
}

#------------------------------------------------------------------------------
# tablelist::winxpblueTheme
#------------------------------------------------------------------------------
proc tablelist::winxpblueTheme {} {
    variable themeDefaults
    array set themeDefaults [list \
	-background		white \
	-foreground		black \
	-disabledforeground	#565248 \
	-stripebackground	"" \
	-selectbackground	#4a6984 \
	-selectforeground	#ffffff \
	-selectborderwidth	0 \
	-font			TkTextFont \
	-labelbackground	#ece9d8 \
	-labeldeactivatedBg	#ece9d8 \
	-labeldisabledBg	#e3e1dd \
	-labelactiveBg		#c1d2ee \
	-labelpressedBg		#bab5ab \
	-labelforeground	black \
	-labeldisabledFg	#565248 \
	-labelactiveFg		black \
	-labelpressedFg		black \
	-labelfont		TkDefaultFont \
	-labelborderwidth	2 \
	-labelpady		1 \
	-arrowcolor		#4d6185 \
	-arrowstyle		flat7x4 \
	-treestyle		winxpBlue \
    ]
}

#------------------------------------------------------------------------------
# tablelist::xpnativeTheme
#------------------------------------------------------------------------------
proc tablelist::xpnativeTheme {} {
    variable xpStyle
    variable themeDefaults
    array set themeDefaults [list \
	-background		SystemWindow \
	-foreground		SystemWindowText \
	-disabledforeground	SystemDisabledText \
	-stripebackground	"" \
	-selectborderwidth	0 \
	-font			TkTextFont \
	-labelforeground	SystemButtonText \
	-labeldisabledFg	SystemDisabledText \
	-labelactiveFg		SystemButtonText \
	-labelpressedFg		SystemButtonText \
	-labelfont		TkDefaultFont \
    ]

    switch [winfo rgb . SystemHighlight] {
	"12593 27242 50629" {					;# Win XP Blue
	    set xpStyle		1
	    set selectBg	SystemHighlight
	    set selectFg	SystemHighlightText
	    set labelBg		#ebeadb
	    set activeBg	#faf8f3
	    set pressedBg	#dedfd8
	    set labelBd		4
	    set labelPadY	4
	    set arrowColor	#aca899
	    set arrowStyle	flat9x5
	    set treeStyle	winxpBlue

	    if {[info exists tile::version] &&
		[string compare $tile::version 0.7] < 0} {
		set labelBd 0
	    }
	}

	"37779 41120 28784" {					;# Win XP Olive
	    set xpStyle		1
	    set selectBg	SystemHighlight
	    set selectFg	SystemHighlightText
	    set labelBg		#ebeadb
	    set activeBg	#faf8f3
	    set pressedBg	#dedfd8
	    set labelBd		4
	    set labelPadY	4
	    set arrowColor	#aca899
	    set arrowStyle	flat9x5
	    set treeStyle	winxpOlive

	    if {[info exists tile::version] &&
		[string compare $tile::version 0.7] < 0} {
		set labelBd 0
	    }
	}

	"45746 46260 49087" {					;# Win XP Silver
	    set xpStyle		1
	    set selectBg	SystemHighlight
	    set selectFg	SystemHighlightText
	    set labelBg		#f9fafd
	    set activeBg	#fefefe
	    set pressedBg	#ececf3
	    set labelBd		4
	    set labelPadY	4
	    set arrowColor	#aca899
	    set arrowStyle	flat9x5
	    set treeStyle	winxpSilver

	    if {[info exists tile::version] &&
		[string compare $tile::version 0.7] < 0} {
		set labelBd 0
	    }
	}

	"13107 39321 65535" {					;# Aero
	    set selectFg	SystemWindowText
	    set xpStyle		0
	    set labelBg		#f8f9fa
	    set activeBg	#c3eeff
	    set pressedBg	#95d8f7
	    set labelBd		4
	    set labelPadY	4
	    set arrowColor	#569bc0
	    set arrowStyle	flat7x4

	    if {$::tcl_platform(osVersion) == 6.0} {		;# Win Vista
		set selectBg	#d8effb
		set treeStyle	vistaAero
	    } else {						;# Win 7
		set selectBg	#cee2fc
		set treeStyle	win7Aero
	    }
	}

	default {						;# Win Classic
	    set selectBg	SystemHighlight
	    set selectFg	SystemHighlightText
	    set xpStyle		0
	    set labelBg		SystemButtonFace
	    set activeBg	SystemButtonFace
	    set pressedBg	SystemButtonFace
	    set labelBd		2
	    set labelPadY	0
	    set arrowColor	SystemButtonShadow
	    set arrowStyle	flat7x4

	    if {$::tcl_platform(osVersion) == 6.0} {		;# Win Vista
		set treeStyle	vistaClassic
	    } else {						;# Win 7
		set treeStyle	win7Classic
	    }
	}
    }

    array set themeDefaults [list \
	-selectbackground	$selectBg \
	-selectforeground	$selectFg \
	-labelbackground	$labelBg \
	-labeldeactivatedBg	$labelBg \
	-labeldisabledBg	$labelBg \
	-labelactiveBg		$activeBg \
	-labelpressedBg		$pressedBg \
	-labelborderwidth	$labelBd \
	-labelpady		$labelPadY \
	-arrowcolor		$arrowColor \
	-arrowstyle		$arrowStyle \
	-treestyle		$treeStyle \
    ]
}

#
# Private procedures performing RGB <-> HSV conversions
# =====================================================
#

#------------------------------------------------------------------------------
# tablelist::rgb2hsv
#
# Converts the specified RGB value to HSV.  The arguments are assumed to be
# integers in the interval [0, 65535].  The return value is a list of the form
# {h s v}, where h in [0.0, 360.0) and s, v in [0.0, 1.0].
#------------------------------------------------------------------------------
proc tablelist::rgb2hsv {r g b} {
    set r [expr {$r/65535.0}]
    set g [expr {$g/65535.0}]
    set b [expr {$b/65535.0}]

    #
    # Compute the value component
    #
    set sortedLst [lsort -real [list $r $g $b]]
    set v [lindex $sortedLst end]
    set dist [expr {$v - [lindex $sortedLst 0]}]

    #
    # Compute the saturation component
    #
    if {$v == 0.0} {
	set s 0.0
    } else {
	set s [expr {$dist/$v}]
    }

    #
    # Compute the hue component
    #
    if {$s == 0.0} {
	set h 0.0
    } else {
	set rc [expr {($v - $r)/$dist}]
	set gc [expr {($v - $g)/$dist}]
	set bc [expr {($v - $b)/$dist}]

	if {$v == $r} {
	    set h [expr {$bc - $gc}]
	} elseif {$v == $g} {
	    set h [expr {2 + $rc - $bc}]
	} else {
	    set h [expr {4 + $gc - $rc}]
	}
	set h [expr {$h*60}]
	if {$h < 0.0} {
	    set h [expr {$h + 360.0}]
	} elseif {$h >= 360.0} {
	    set h 0.0
	}
    }

    return [list $h $s $v]
}

#------------------------------------------------------------------------------
# tablelist::hsv2rgb
#
# Converts the specified HSV value to RGB.  The arguments are assumed to fulfil
# the conditions: h in [0.0, 360.0) and s, v in [0.0, 1.0].  The return value
# is a list of the form {r g b}, where r, g, and b are integers in the interval
# [0, 65535].
#------------------------------------------------------------------------------
proc tablelist::hsv2rgb {h s v} {
    set h [expr {$h/60.0}]
    set f [expr {$h - floor($h)}]

    set p1 [expr {round(65535.0*$v*(1 - $s))}]
    set p2 [expr {round(65535.0*$v*(1 - $s*$f))}]
    set p3 [expr {round(65535.0*$v*(1 - $s*(1 - $f)))}]

    set v  [expr {round(65535.0*$v)}]

    switch [expr {int($h)}] {
	0 { return [list $v  $p3 $p1] }
	1 { return [list $p2 $v  $p1] }
	2 { return [list $p1 $v  $p3] }
	3 { return [list $p1 $p2 $v ] }
	4 { return [list $p3 $p1 $v ] }
	5 { return [list $v  $p1 $p2] }
    }
}

#
# Private procedures related to global KDE configuration options
# ==============================================================
#

#------------------------------------------------------------------------------
# tablelist::getKdeConfigVal
#
# Returns the value of the global KDE configuration option identified by the
# given group (section) and key.
#------------------------------------------------------------------------------
proc tablelist::getKdeConfigVal {group key} {
    variable kdeDirList

    if {![info exists kdeDirList]} {
	makeKdeDirList 
    }

    #
    # Search for the entry corresponding to the given group and key in
    # the file "share/config/kdeglobals" within the KDE directories
    #
    foreach dir $kdeDirList {
	set fileName [file join $dir "share/config/kdeglobals"]
	if {[set val [readKdeConfigVal $fileName $group $key]] ne ""} {
	    return $val
	}
    }
    return ""
}

#------------------------------------------------------------------------------
# tablelist::makeKdeDirList
#
# Builds the list of the directories to be considered when searching for global
# KDE configuration options.
#------------------------------------------------------------------------------
proc tablelist::makeKdeDirList {} {
    variable kdeDirList {}

    if {[info exists ::env(KDE_SESSION_VERSION)]} {
	set ver $::env(KDE_SESSION_VERSION)
    } else {
	set ver ""
    }

    if {[info exists ::env(USER)] && $::env(USER) eq "root"} {
	set name "KDEROOTHOME"
    } else {
	set name "KDEHOME"
    }
    if {[info exists ::env($name)] && $::env($name) ne ""} {
	set localKdeDir [file normalize $::env($name)]
    } elseif {[info exists ::env(HOME)] && $::env(HOME) ne ""} {
	set localKdeDir [file normalize [file join $::env(HOME) ".kde$ver"]]
    }
    if {[info exists localKdeDir] && $localKdeDir ne "-"} {
	lappend kdeDirList $localKdeDir
    }

    if {[info exists ::env(KDEDIRS)] && $::env(KDEDIRS) ne ""} {
	foreach dir [split $::env(KDEDIRS) ":"] {
	    if {$dir ne ""} {
		lappend kdeDirList $dir
	    }
	}
    } elseif {[info exists ::env(KDEDIR)] && $::env(KDEDIR) ne ""} {
	lappend kdeDirList $::env(KDEDIR)
    }

    set prefix [exec kde$ver-config --expandvars --prefix]
    lappend kdeDirList $prefix

    set execPrefix [exec kde$ver-config --expandvars --exec-prefix]
    if {$execPrefix ne $prefix} {
	lappend kdeDirList $execPrefix
    }
}

#------------------------------------------------------------------------------
# tablelist::readKdeConfigVal
#
# Reads the value of the global KDE configuration option identified by the
# given group (section) and key from the specified file.  Note that the
# procedure performs a case-sensitive search and only works as expected for
# "simple" group and key names.
#------------------------------------------------------------------------------
proc tablelist::readKdeConfigVal {fileName group key} {
    if {[catch {open $fileName r} chan] != 0} {
	return ""
    }

    #
    # Search for the specified group
    #
    set groupFound 0
    while {[gets $chan line] >= 0} {
	set line [string trim $line]
	if {$line eq "\[$group\]"} {
	    set groupFound 1
	    break
	}
    }
    if {!$groupFound} {
	close $chan
	return ""
    }

    #
    # Search for the specified key within the group
    #
    set pattern "^$key\\s*=\\s*(.+)$"
    set keyFound 0
    while {[gets $chan line] >= 0} {
	set line [string trim $line]
	if {[string index $line 0] eq "\["} {
	    break
	}

	if {[regexp $pattern $line dummy val]} {
	    set keyFound 1
	    break
	}
    }

    close $chan
    return [expr {$keyFound ? $val : ""}]
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/scripts/tablelistUtil.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
#==============================================================================
# Contains private utility procedures for tablelist widgets.
#
# Structure of the module:
#   - Namespace initialization
#   - Private utility procedures
#
# Copyright (c) 2000-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

#
# Namespace initialization
# ========================
#

namespace eval tablelist {
    #
    # alignment -> anchor mapping
    #
    variable anchors
    array set anchors {
	left	w
	right	e
	center	center
    }

    #
    # <alignment, changeSnipSide> -> snipSide mapping
    #
    variable snipSides
    array set snipSides {
	left,0		r
	left,1		l
	right,0		l
	right,1		r
	center,0	r
	center,1	l
    }

    #
    # <incrArrowType, sortOrder> -> direction mapping
    #
    variable directions
    array set directions {
	up,increasing	Up
	up,decreasing	Dn
	down,increasing	Dn
	down,decreasing	Up
    }
}

#
# Private utility procedures
# ==========================
#

#------------------------------------------------------------------------------
# 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
# 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::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(itemCount)
	} else {
	    set index $data(lastRow)
	}
    } elseif {[string first $idx "last"] == 0} {
	set index $data(lastRow)
    } elseif {[string first $idx "top"] == 0} {
	displayItems $win
	set textIdx [$data(body) index @0,0]
	set index [expr {int($textIdx) - 1}]
    } elseif {[string first $idx "bottom"] == 0} {
	displayItems $win
	set textIdx [$data(body) index @0,$data(btmY)]
	set index [expr {int($textIdx) - 1}]
	if {$index > $data(lastRow)} {			;# text widget bug
	    set index $data(lastRow)
	}
    } elseif {[string first $idx "active"] == 0 && [string length $idx] >= 2} {
	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} {
	displayItems $win
	incr x -[winfo x $data(body)]
	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
	    set index $data(lastRow)
	}
    } elseif {[scan $idx "k%d" num] == 1} {
	set index [keyToRow $win k$num]
    } else {
	set idxIsEmpty [expr {[string length $idx] == 0}]
	for {set row 0} {$row < $data(itemCount)} {incr row} {
	    set key [lindex $data(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(itemCount)} {
	    return -code error \
		   "bad row index \"$idx\": must be active, anchor, end, last,\
		    top, bottom, @x,y, a number, a full key, or a name"
	}
    }

    if {$checkRange && ($index < 0 || $index > $data(lastRow))} {
	return -code error "row index \"$idx\" out of range"
    } else {
	return $index
    }
}

#------------------------------------------------------------------------------
# tablelist::colIndex
#
# Checks the column index idx and returns either its numerical value or an
# error.  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::colIndex {win idx checkRange {decrX 1}} {
    upvar ::tablelist::ns${win}::data data

    if {[isInteger $idx]} {
	set index [expr {int($idx)}]
    } elseif {[string first $idx "end"] == 0 ||
	      [string first $idx "last"] == 0} {
	set index $data(lastCol)
    } elseif {[string first $idx "left"] == 0} {
	return [colIndex $win @0,0 $checkRange 0]
    } elseif {[string first $idx "right"] == 0} {
	return [colIndex $win @$data(rightX),0 $checkRange 0]
    } elseif {[string first $idx "active"] == 0 && [string length $idx] >= 2} {
	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} {
	synchronize $win
	displayItems $win
	if {$decrX} {
	    incr x -[winfo x $data(body)]
	    if {$x > $data(rightX)} {
		set x $data(rightX)
	    } elseif {$x < 0} {
		set x 0
	    }
	}
	set x [expr {$x + [winfo rootx $data(body)]}]

	set lastVisibleCol -1
	for {set col 0} {$col < $data(colCount)} {incr col} {
	    if {$data($col-hide) || $data($col-elide)} {
		continue
	    }

	    set lastVisibleCol $col
	    set w $data(hdrTxtFrLbl)$col
	    set wX [winfo rootx $w]
	    if {$x >= $wX && $x < $wX + [winfo width $w]} {
		return $col
	    }
	}
	set index $lastVisibleCol
    } else {
	set idxIsEmpty [expr {[string length $idx] == 0}]
	for {set col 0} {$col < $data(colCount)} {incr col} {
	    set hasName [info exists data($col-name)]
	    if {($hasName && [string compare $idx $data($col-name)] == 0) ||
		(!$hasName && $idxIsEmpty)} {
		set index $col
		break
	    }
	}
	if {$col == $data(colCount)} {
	    return -code error \
		   "bad column index \"$idx\": must be active, anchor,\
		    end, last, left, right, @x,y, a number, or a name"
	}
    }

    if {$checkRange && ($index < 0 || $index > $data(lastCol))} {
	return -code error "column index \"$idx\" out of range"
    } else {
	return $index
    }
}

#------------------------------------------------------------------------------
# tablelist::cellIndex
#
# Checks the 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::cellIndex {win idx checkRange} {
    upvar ::tablelist::ns${win}::data data

    set lst [split $idx ","]
    if {[llength $lst] == 2 &&
	[catch {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 [rowIndex $win $idx 0]
	set col [colIndex $win $idx 0]
    } elseif {[string first $idx "active"] == 0 && [string length $idx] >= 2} {
	set row $data(activeRow)
	set col $data(activeCol)
    } elseif {[string first $idx "anchor"] == 0 && [string length $idx] >= 2} {
	set row $data(anchorRow)
	set col $data(anchorCol)
    } elseif {[string compare [string index $idx 0] "@"] == 0 &&
	      [catch {rowIndex $win $idx 0} row] == 0 &&
	      [catch {colIndex $win $idx 0} col] == 0} {
	# nothing
    } else {
	return -code error \
	       "bad cell index \"$idx\": must be active, anchor, end, last,\
	        @x,y, or row,col, where row must be active, anchor, end, last,\
		top, bottom, a number, a full 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(lastRow) ||
	$col < 0 || $col > $data(lastCol))} {
	return -code error "cell index \"$idx\" out of range"
    } else {
	return [list $row $col]
    }
}

#------------------------------------------------------------------------------
# tablelist::adjustRowIndex
#
# Sets the row index specified by $rowName to the index of the nearest
# (viewable) row.
#------------------------------------------------------------------------------
proc tablelist::adjustRowIndex {win rowName {forceViewable 0}} {
    upvar ::tablelist::ns${win}::data data $rowName row

    #
    # Don't operate on row directly, because $rowName might
    # be data(activeRow), in which case any temporary changes
    # made on row would trigger the activeTrace procedure
    #
    set _row $row
    if {$_row > $data(lastRow)} {
	set _row $data(lastRow)
    }
    if {$_row < 0} {
	set _row 0
    }

    if {$forceViewable} {
	set _rowSav $_row
	for {} {$_row < $data(itemCount)} {incr _row} {
	    set key [lindex $data(keyList) $_row]
	    if {![info exists data($key-elide)] &&
		![info exists data($key-hide)]} {
		set row $_row
		return ""
	    }
	}
	for {set _row [expr {$_rowSav - 1}]} {$_row >= 0} {incr _row -1} {
	    set key [lindex $data(keyList) $_row]
	    if {![info exists data($key-elide)] &&
		![info exists data($key-hide)]} {
		set row $_row
		return ""
	    }
	}
	set row 0
    } else {
	set row $_row
    }
}

#------------------------------------------------------------------------------
# tablelist::adjustColIndex
#
# Sets the column index specified by $colName to the index of the nearest
# (viewable) column.
#------------------------------------------------------------------------------
proc tablelist::adjustColIndex {win colName {forceViewable 0}} {
    upvar ::tablelist::ns${win}::data data $colName col

    #
    # Don't operate on col directly, because $colName might
    # be data(activeCol), in which case any temporary changes
    # made on col would trigger the activeTrace procedure
    #
    set _col $col
    if {$_col > $data(lastCol)} {
	set _col $data(lastCol)
    }
    if {$_col < 0} {
	set _col 0
    }

    if {$forceViewable} {
	set _colSav $_col
	for {} {$_col < $data(colCount)} {incr _col} {
	    if {!$data($_col-hide)} {
		set col $_col
		return ""
	    }
	}
	for {set _col [expr {$_colSav - 1}]} {$_col >= 0} {incr _col -1} {
	    if {!$data($_col-hide)} {
		set col $_col
		return ""
	    }
	}
	set _col 0
    } else {
	set col $_col
    }
}

#------------------------------------------------------------------------------
# tablelist::nodeIndexToKey
#
# Checks the node index idx and returns either the corresponding full key or
# "root", or an error.
#------------------------------------------------------------------------------
proc tablelist::nodeIndexToKey {win idx} {
    if {[string first $idx "root"] == 0} {
	return "root"
    } elseif {[catch {rowIndex $win $idx 0} row] == 0} {
	upvar ::tablelist::ns${win}::data data
	if {$row < 0 || $row > $data(lastRow)} {
	    return -code error "node index \"$idx\" out of range"
	} else {
	    return [lindex $data(keyList) $row]
	}
    } else {
	return -code error \
	       "bad node index \"$idx\": must be root, active, anchor, end,\
		last, top, bottom, @x,y, a number, a full key, or a name"
    }
}

#------------------------------------------------------------------------------
# tablelist::depth
#
# Returns the number of steps from the node with the given full key to the root
# node of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::depth {win key} {
    upvar ::tablelist::ns${win}::data data

    set depth 0
    while {[string compare $key "root"] != 0} {
	incr depth
	set key $data($key-parent)
    }

    return $depth
}

#------------------------------------------------------------------------------
# tablelist::topLevelKey
#
# Returns the full key of the top-level item of the tablelist widget win having
# the item with the given key as descendant.
#------------------------------------------------------------------------------
proc tablelist::topLevelKey {win key} {
    upvar ::tablelist::ns${win}::data data

    set parentKey $data($key-parent)
    while {[string compare $parentKey "root"] != 0} {
	set key $data($key-parent)
	set parentKey $data($key-parent)
    }

    return $key
}

#------------------------------------------------------------------------------
# tablelist::descCount
#
# Returns the number of descendants of the node with the given full key of the
# tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::descCount {win key} {
    upvar ::tablelist::ns${win}::data data

    if {[string compare $key "root"] == 0} {
	return $data(itemCount)
    } else {
	set count [llength $data($key-children)]
	foreach child $data($key-children) {
	    incr count [descCount $win $child]
	}
	return $count
    }
}

#------------------------------------------------------------------------------
# tablelist::nodeRow
#
# Returns the row of the child item identified by childIdx of the node given by
# parentKey within the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::nodeRow {win parentKey childIdx} {
    upvar ::tablelist::ns${win}::data data

    if {[isInteger $childIdx]} {
	if {$childIdx < [llength $data($parentKey-children)]} {
	    set childKey [lindex $data($parentKey-children) $childIdx]
	    return [keyToRow $win $childKey]
	} else {
	    return [expr {[keyToRow $win $parentKey] +
			  [descCount $win $parentKey] + 1}]
	}
    } elseif {[string first $childIdx "end"] == 0} {
	return [expr {[keyToRow $win $parentKey] +
		      [descCount $win $parentKey] + 1}]
    } elseif {[string first $childIdx "last"] == 0} {
	set childKey [lindex $data($parentKey-children) end]
	return [keyToRow $win $childKey]
    } else {
	return -code error \
	       "bad child index \"$childIdx\": must be end, last, or a number"
    }
}

#------------------------------------------------------------------------------
# tablelist::keyToRow
#
# Returns the row corresponding to the given full key within the tablelist
# widget win.
#------------------------------------------------------------------------------
proc tablelist::keyToRow {win key} {
    upvar ::tablelist::ns${win}::data data
    if {[string compare $key "root"] == 0} {
	return -1
    } elseif {$data(keyToRowMapValid) && [info exists data($key-row)]} {
	return $data($key-row)
    } else {
	if {$::tcl_version >= 8.4} {
	    #
	    # Speed up the search by starting at the last found position
	    #
	    set row [lsearch -exact -start $data(searchStartIdx) \
		     $data(keyList) $key]
	    if {$row < 0 && $data(searchStartIdx) != 0} {
		set row [lsearch -exact $data(keyList) $key]
	    }
	    if {$row >= 0} {
		set data(searchStartIdx) $row
	    }

	    return $row
	} else {
	    return [lsearch -exact $data(keyList) $key]
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::updateKeyToRowMap
#
# Updates the key -> row map associated with the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::updateKeyToRowMap win {
    upvar ::tablelist::ns${win}::data data
    if {[info exists data(mapId)]} {
	after cancel $data(mapId)
	unset data(mapId)
    }

    set row 0
    foreach key $data(keyList) {
	set data($key-row) $row
	incr row
    }

    set data(keyToRowMapValid) 1
}

#------------------------------------------------------------------------------
# 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
# both columns are non-hidden (but there may be hidden ones between them).
#------------------------------------------------------------------------------
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
	    }
	}
    }
    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
	    }
	}
    }
    set idx2 [$w search $elide "\t" $idx $endIdx]
    if {[string length $idx2] == 0} {
	return 0
    }

    return 1
}

#------------------------------------------------------------------------------
# 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.
#------------------------------------------------------------------------------
proc tablelist::sortStretchableColList win {
    upvar ::tablelist::ns${win}::data data
    if {[llength $data(-stretch)] == 0 ||
	[string compare $data(-stretch) "all"] == 0} {
	return ""
    }

    set containsEnd 0
    foreach elem $data(-stretch) {
	if {[string first $elem "end"] == 0 ||
	    [string first $elem "last"] == 0} {
	    set containsEnd 1
	} else {
	    set tmp([colIndex $win $elem 0]) ""
	}
    }

    set data(-stretch) [lsort -integer [array names tmp]]
    if {$containsEnd} {
	lappend data(-stretch) end
    }
}

#------------------------------------------------------------------------------
# tablelist::deleteColData
#
# Cleans up the data associated with the col'th column of the tablelist widget
# win.
#------------------------------------------------------------------------------
proc tablelist::deleteColData {win col} {
    upvar ::tablelist::ns${win}::data data
    if {$data(editCol) == $col} {
	set data(editCol) -1
	set data(editRow) -1
    }

    #
    # Remove the elements with 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)
    }

    #
    # Remove the elements with names of the form k*,$col-*
    #
    foreach name [array names data k*,$col-*] {
	unset data($name)
	if {[string match "k*,$col-font" $name]} {
	    incr data(cellTagRefCount) -1
	} elseif {[string match "k*,$col-image" $name]} {
	    incr data(imgCount) -1
	} elseif {[string match "k*,$col-window" $name]} {
	    incr data(winCount) -1
	} elseif {[string match "k*,$col-indent" $name]} {
	    incr data(indentCount) -1
	}
    }

    #
    # Remove col from the list of stretchable columns if explicitly specified
    #
    if {[string compare $data(-stretch) "all"] != 0} {
	set stretchableCols {}
	foreach elem $data(-stretch) {
	    if {$elem != $col} {
		lappend stretchableCols $elem
	    }
	}
	set data(-stretch) $stretchableCols
    }
}

#------------------------------------------------------------------------------
# tablelist::deleteColAttribs
#
# Cleans up the attributes associated with the col'th column of the tablelist
# widget win.
#------------------------------------------------------------------------------
proc tablelist::deleteColAttribs {win col} {
    upvar ::tablelist::ns${win}::attribs attribs

    #
    # Remove the elements with names of the form $col-*
    #
    foreach name [array names attribs $col-*] {
	unset attribs($name)
    }

    #
    # Remove the elements with names of the form k*,$col-*
    #
    foreach name [array names attribs k*,$col-*] {
	unset attribs($name)
    }
}

#------------------------------------------------------------------------------
# tablelist::moveColData
#
# Moves the elements of oldArrName corresponding to oldCol to those of
# newArrName corresponding to newCol.
#------------------------------------------------------------------------------
proc tablelist::moveColData {oldArrName newArrName imgArrName oldCol newCol} {
    upvar $oldArrName oldArr $newArrName newArr $imgArrName imgArr

    foreach specialCol {editCol -treecolumn treeCol} {
	if {$oldArr($specialCol) == $oldCol} {
	    set newArr($specialCol) $newCol
	}
    }

    set callerProc [lindex [info level -1] 0]
    if {[string compare $callerProc "moveCol"] == 0} {
	foreach specialCol {activeCol anchorCol} {
	    if {$oldArr($specialCol) == $oldCol} {
		set newArr($specialCol) $newCol
	    }
	}
    }

    if {$newCol < $newArr(colCount)} {
	foreach l [getSublabels $newArr(hdrTxtFrLbl)$newCol] {
	    destroy $l
	}
	set newArr(fmtCmdFlagList) \
	    [lreplace $newArr(fmtCmdFlagList) $newCol $newCol 0]
    }

    #
    # Move the elements of oldArr with names of the form $oldCol-*
    # to those of newArr with names of the form $newCol-*
    #
    foreach newName [array names newArr $newCol-*] {
	unset newArr($newName)
    }
    foreach oldName [array names oldArr $oldCol-*] {
	regsub "$oldCol-" $oldName "$newCol-" newName
	set newArr($newName) $oldArr($oldName)
	unset oldArr($oldName)

	set tail [lindex [split $newName "-"] 1]
	switch $tail {
	    formatcommand {
		if {$newCol < $newArr(colCount)} {
		    set newArr(fmtCmdFlagList) \
			[lreplace $newArr(fmtCmdFlagList) $newCol $newCol 1]
		}
	    }
	    labelimage {
		set imgArr($newCol-$tail) $newArr($newName)
		unset newArr($newName)
	    }
	}
    }

    #
    # Move the elements of oldArr with names of the form k*,$oldCol-*
    # to those of newArr with names of the form k*,$newCol-*
    #
    foreach newName [array names newArr k*,$newCol-*] {
	unset newArr($newName)
    }
    foreach oldName [array names oldArr k*,$oldCol-*] {
	regsub -- ",$oldCol-" $oldName ",$newCol-" newName
	set newArr($newName) $oldArr($oldName)
	unset oldArr($oldName)
    }

    #
    # Replace oldCol with newCol in the list of
    # stretchable columns if explicitly specified
    #
    if {[info exists oldArr(-stretch)] &&
	[string compare $oldArr(-stretch) "all"] != 0} {
	set stretchableCols {}
	foreach elem $oldArr(-stretch) {
	    if {$elem == $oldCol} {
		lappend stretchableCols $newCol
	    } else {
		lappend stretchableCols $elem
	    }
	}
	set newArr(-stretch) $stretchableCols
    }
}

#------------------------------------------------------------------------------
# tablelist::moveColAttribs
#
# Moves the elements of oldArrName corresponding to oldCol to those of
# newArrName corresponding to newCol.
#------------------------------------------------------------------------------
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-*
    #
    foreach newName [array names newArr $newCol-*] {
	unset newArr($newName)
    }
    foreach oldName [array names oldArr $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-*
    #
    foreach newName [array names newArr k*,$newCol-*] {
	unset newArr($newName)
    }
    foreach oldName [array names oldArr k*,$oldCol-*] {
	regsub -- ",$oldCol-" $oldName ",$newCol-" newName
	set newArr($newName) $oldArr($oldName)
	unset oldArr($oldName)
    }
}

#------------------------------------------------------------------------------
# tablelist::deleteColFromCellList
#
# 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.
#------------------------------------------------------------------------------
proc tablelist::extractColFromCellList {cellList col} {
    set rowList {}
    foreach cellIdx $cellList {
	scan $cellIdx "%d,%d" cellRow cellCol
	if {$cellCol == $col} {
	    lappend rowList $cellRow
	}
    }

    return $rowList
}

#------------------------------------------------------------------------------
# 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
	}
    }

    return $newCellList
}

#------------------------------------------------------------------------------
# tablelist::condUpdateListVar
#
# Updates the list variable of the tablelist widget win if present.
#------------------------------------------------------------------------------
proc tablelist::condUpdateListVar win {
    upvar ::tablelist::ns${win}::data data
    if {$data(hasListVar)} {
	upvar #0 $data(-listvariable) var
	trace vdelete var wu $data(listVarTraceCmd)
	set var {}
	foreach item $data(itemList) {
	    lappend var [lrange $item 0 $data(lastCol)]
	}
	trace variable var wu $data(listVarTraceCmd)
    }
}

#------------------------------------------------------------------------------
# tablelist::reconfigColLabels
#
# Reconfigures the labels of the col'th column of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::reconfigColLabels {win imgArrName col} {
    upvar ::tablelist::ns${win}::data data $imgArrName imgArr

    set optList {-labelalign -labelborderwidth -labelfont
		 -labelforeground -labelpady -labelrelief}
    variable usingTile
    if {!$usingTile} {
	lappend optList -labelbackground -labelheight
    }

    foreach opt $optList {
	if {[info exists data($col$opt)]} {
	    doColConfig $col $win $opt $data($col$opt)
	} else {
	    doColConfig $col $win $opt ""
	}
    }

    if {[info exists imgArr($col-labelimage)]} {
	doColConfig $col $win -labelimage $imgArr($col-labelimage)
    }
}

#------------------------------------------------------------------------------
# tablelist::charsToPixels
#
# Returns the width in pixels of the string consisting of a given number of "0"
# 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]
}

#------------------------------------------------------------------------------
# tablelist::strRange
#
# Gets the largest initial (for snipSide = r) or final (for snipSide = l) range
# of characters from str whose width, when displayed in the given font, is no
# greater than pixels decremented by the width of snipStr.  Returns a string
# obtained from this substring by appending (for snipSide = r) or prepending
# (for snipSide = l) (part of) snipStr to it.
#------------------------------------------------------------------------------
proc tablelist::strRange {win str font pixels snipSide snipStr} {
    if {$pixels < 0} {
	return ""
    }

    if {[string length $snipSide] == 0} {
	return $str
    }


    set width [font measure $font -displayof $win $str]
    if {$width <= $pixels} {
	return $str
    }

    set snipWidth [font measure $font -displayof $win $snipStr]
    if {$pixels <= $snipWidth} {
	set str $snipStr
	set snipStr ""
    } else {
	incr pixels -$snipWidth
    }

    if {[string compare $snipSide "r"] == 0} {
	set idx [expr {[string length $str]*$pixels/$width - 1}]
	set subStr [string range $str 0 $idx]
	set width [font measure $font -displayof $win $subStr]
	if {$width < $pixels} {
	    while 1 {
		incr idx
		set subStr [string range $str 0 $idx]
		set width [font measure $font -displayof $win $subStr]
		if {$width > $pixels} {
		    incr idx -1
		    set subStr [string range $str 0 $idx]
		    return $subStr$snipStr
		} elseif {$width == $pixels} {
		    return $subStr$snipStr
		}
	    }
	} elseif {$width == $pixels} {
	    return $subStr$snipStr
	} else {
	    while 1 {
		incr idx -1
		set subStr [string range $str 0 $idx]
		set width [font measure $font -displayof $win $subStr]
		if {$width <= $pixels} {
		    return $subStr$snipStr
		}
	    }
	}

    } else {
	set idx [expr {[string length $str]*($width - $pixels)/$width}]
	set subStr [string range $str $idx end]
	set width [font measure $font -displayof $win $subStr]
	if {$width < $pixels} {
	    while 1 {
		incr idx -1
		set subStr [string range $str $idx end]
		set width [font measure $font -displayof $win $subStr]
		if {$width > $pixels} {
		    incr idx
		    set subStr [string range $str $idx end]
		    return $snipStr$subStr
		} elseif {$width == $pixels} {
		    return $snipStr$subStr
		}
	    }
	} elseif {$width == $pixels} {
	    return $snipStr$subStr
	} else {
	    while 1 {
		incr idx
		set subStr [string range $str $idx end]
		set width [font measure $font -displayof $win $subStr]
		if {$width <= $pixels} {
		    return $snipStr$subStr
		}
	    }
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::adjustItem
#
# Returns the list obtained by adjusting the list specified by item to the
# length expLen.
#------------------------------------------------------------------------------
proc tablelist::adjustItem {item expLen} {
    set len [llength $item]
    if {$len == $expLen} {
	return $item
    } elseif {$len > $expLen} {
	return [lrange $item 0 [expr {$expLen - 1}]]
    } else {
	for {set n $len} {$n < $expLen} {incr n} {
	    lappend item ""
	}
	return $item
    }
}

#------------------------------------------------------------------------------
# tablelist::formatElem
#
# Returns the string obtained by formatting the last argument.
#------------------------------------------------------------------------------
proc tablelist::formatElem {win key row col text} {
    upvar ::tablelist::ns${win}::data data
    array set data [list fmtKey $key fmtRow $row fmtCol $col]

    return [uplevel #0 $data($col-formatcommand) [list $text]]
}

#------------------------------------------------------------------------------
# tablelist::formatItem
#
# Returns the list obtained by formatting the elements of the last argument.
#------------------------------------------------------------------------------
proc tablelist::formatItem {win key row item} {
    upvar ::tablelist::ns${win}::data data
    array set data [list fmtKey $key fmtRow $row]
    set formattedItem {}
    set col 0
    foreach text $item fmtCmdFlag $data(fmtCmdFlagList) {
	if {$fmtCmdFlag} {
	    set data(fmtCol) $col
	    set text [uplevel #0 $data($col-formatcommand) [list $text]]
	}
	lappend formattedItem $text
	incr col
    }

    return $formattedItem
}

#------------------------------------------------------------------------------
# tablelist::hasChars
#
# Checks whether at least one element of the given list is a nonempty string.
#------------------------------------------------------------------------------
proc tablelist::hasChars list {
    foreach str $list {
	if {[string length $str] != 0} {
	    return 1
	}
    }

    return 0
}

#------------------------------------------------------------------------------
# tablelist::getListWidth
#
# Returns the max. number of pixels that the elements of the given list would
# use in the specified font when displayed in the window win.
#------------------------------------------------------------------------------
proc tablelist::getListWidth {win list font} {
    set width 0
    foreach str $list {
	set strWidth [font measure $font -displayof $win $str]
	if {$strWidth > $width} {
	    set width $strWidth
	}
    }

    return $width
}

#------------------------------------------------------------------------------
# tablelist::joinList
#
# 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.
#------------------------------------------------------------------------------
proc tablelist::joinList {win list font pixels snipSide snipStr} {
    set list2 {}
    foreach str $list {
	lappend list2 [strRange $win $str $font $pixels $snipSide $snipStr]
    }

    return [join $list2 "\n"]
}

#------------------------------------------------------------------------------
# tablelist::displayIndent
#
# Displays an indentation image in a label widget to be embedded into the
# 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]} {
	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
	bindtags $w [lreplace [bindtags $w] 1 1 $data(bodyTag) TablelistBody]
    }

    updateColorsWhenIdle $win
    return $w
}

#------------------------------------------------------------------------------
# tablelist::displayImage
#
# Displays an image in a label widget to be embedded into the specified cell of
# 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
    if {![winfo exists $w]} {
	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]
    }

    updateColorsWhenIdle $win
    return $w
}

#------------------------------------------------------------------------------
# tablelist::displayText
#
# Displays the given text in a message widget to be embedded into the specified
# cell of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::displayText {win key col text font pixels alignment} {
    upvar ::tablelist::ns${win}::data data
    set w $data(body).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
	#
	message $w -borderwidth 0 -highlightthickness 0 -padx 0 -pady 0 \
		   -relief flat -takefocus 0
	bindtags $w [lreplace [bindtags $w] 1 1 $data(bodyTag) TablelistBody]
    }

    variable anchors
    set width $pixels
    if {$pixels == 0} {
	set width 1000000
    }
    $w configure -anchor $anchors($alignment) -font $font \
		 -justify $alignment -text $text -width $width

    updateColorsWhenIdle $win
    return $w
}

#------------------------------------------------------------------------------
# tablelist::getAuxData
#
# Gets the name, type, and width of the image or window associated with the
# specified cell of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::getAuxData {win key col auxTypeName auxWidthName {pixels 0}} {
    upvar ::tablelist::ns${win}::data data \
	  $auxTypeName auxType $auxWidthName auxWidth

    if {[info exists data($key,$col-window)]} {
	if {$pixels != 0 && [info exists data($key,$col-stretchwindow)]} {
	    set auxType 3				;# dynamic-width window
	    set auxWidth [expr {$pixels + $data($col-delta)}]
	} else {
	    set auxType 2				;# static-width window
	    set auxWidth $data($key,$col-reqWidth)
	}
	return $data(body).frm_$key,$col
    } elseif {[info exists data($key,$col-image)]} {
	set auxType 1					;# image
	set auxWidth [image width $data($key,$col-image)]
	return [list ::tablelist::displayImage $win $key $col w 0]
    } else {
	set auxType 0					;# none
	set auxWidth 0
	return ""
    }
}

#------------------------------------------------------------------------------
# tablelist::getIndentData
#
# Gets the creation script and width of the label displaying the indentation
# image associated with the specified cell of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::getIndentData {win key col indentWidthName} {
    upvar ::tablelist::ns${win}::data data $indentWidthName indentWidth

    if {[info exists data($key,$col-indent)]} {
	set indentWidth [image width $data($key,$col-indent)]
	return [list ::tablelist::displayIndent $win $key $col 0]
    } else {
	set indentWidth 0
	return ""
    }
}

#------------------------------------------------------------------------------
# tablelist::getMaxTextWidth
#
# Returns the number of pixels available for displaying the text of a static-
# width tablelist cell.
#------------------------------------------------------------------------------
proc tablelist::getMaxTextWidth {pixels auxWidth indentWidth} {
    if {$indentWidth != 0} {
	incr pixels -$indentWidth
	if {$pixels <= 0} {
	    set pixels 1
	}
    }

    if {$auxWidth == 0} {
	return $pixels
    } else {
	set lessPixels [expr {$pixels - $auxWidth - 5}]
	if {$lessPixels > 0} {
	    return $lessPixels
	} else {
	    return 1
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::adjustElem
#
# Prepares the text specified by $textName and the auxiliary object width
# specified by $auxWidthName for insertion into a cell of the tablelist widget
# win.
#------------------------------------------------------------------------------
proc tablelist::adjustElem {win textName auxWidthName indentWidthName font
			    pixels snipSide snipStr} {
    upvar $textName text $auxWidthName auxWidth $indentWidthName indentWidth

    if {$pixels == 0} {				;# convention: dynamic width
	if {$auxWidth != 0 && [string length $text] != 0} {
	    incr auxWidth 3
	}
    } elseif {$indentWidth >= $pixels} {
	set indentWidth $pixels
	set text ""				;# can't display the text
	set auxWidth 0				;# can't display the aux. object
    } else {
	incr pixels -$indentWidth
	if {$auxWidth == 0} {			;# no image or window
	    set text [strRange $win $text $font $pixels $snipSide $snipStr]
	} elseif {[string length $text] == 0} {	;# aux. object w/o text
	    if {$auxWidth > $pixels} {
		set auxWidth $pixels
	    }
	} else {				;# both aux. object and text
	    if {$auxWidth + 5 <= $pixels} {
		incr auxWidth 3
		incr pixels -[expr {$auxWidth + 2}]
		set text [strRange $win $text $font $pixels $snipSide $snipStr]
	    } elseif {$auxWidth <= $pixels} {
		set text ""			;# can't display the text
	    } else {
		set auxWidth $pixels
		set text ""			;# can't display the text
	    }
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::adjustMlElem
#
# Prepares the list specified by $listName and the auxiliary object width
# specified by $auxWidthName for insertion into a multiline cell of the
# tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::adjustMlElem {win listName auxWidthName indentWidthName font
			      pixels snipSide snipStr} {
    upvar $listName list $auxWidthName auxWidth $indentWidthName indentWidth

    set list2 {}
    if {$pixels == 0} {				;# convention: dynamic width
	if {$auxWidth != 0 && [hasChars $list]} {
	    incr auxWidth 3
	}
    } elseif {$indentWidth >= $pixels} {
	set indentWidth $pixels
	foreach str $list {
	    lappend list2 ""
	}
	set list $list2				;# can't display the text
	set auxWidth 0				;# can't display the aux. object
    } else {
	incr pixels -$indentWidth
	if {$auxWidth == 0} {			;# no image or window
	    foreach str $list {
		lappend list2 \
		    [strRange $win $str $font $pixels $snipSide $snipStr]
	    }
	    set list $list2
	} elseif {![hasChars $list]} {		;# aux. object w/o text
	    if {$auxWidth > $pixels} {
		set auxWidth $pixels
	    }
	} else {				;# both aux. object and text
	    if {$auxWidth + 5 <= $pixels} {
		incr auxWidth 3
		incr pixels -[expr {$auxWidth + 2}]
		foreach str $list {
		    lappend list2 \
			[strRange $win $str $font $pixels $snipSide $snipStr]
		}
		set list $list2
	    } elseif {$auxWidth <= $pixels} {
		foreach str $list {
		    lappend list2 ""
		}
		set list $list2			;# can't display the text
	    } else {
		set auxWidth $pixels
		foreach str $list {
		    lappend list2 ""
		}
		set list $list2			;# can't display the text
	    }
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::getElemWidth
#
# Returns the number of pixels that the given text together with the aux.
# object (image or window) of the specified width would use when displayed in a
# cell of a dynamic-width column of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::getElemWidth {win text auxWidth indentWidth cellFont} {
    if {[string match "*\n*" $text]} {
	set list [split $text "\n"]
	if {$auxWidth != 0 && [hasChars $list]} {
	    incr auxWidth 5
	}
	return [expr {[getListWidth $win $list $cellFont] +
		      $auxWidth + $indentWidth}]
    } else {
	if {$auxWidth != 0 && [string length $text] != 0} {
	    incr auxWidth 5
	}
	return [expr {[font measure $cellFont -displayof $win $text] +
		      $auxWidth + $indentWidth}]
    }
}

#------------------------------------------------------------------------------
# tablelist::insertOrUpdateIndent
#
# Sets the width of the indentation label embedded into the text widget w at
# the given index to the specified value, after inserting the label if needed.
# Returns 1 if the label had to be inserted and 0 otherwise.
#------------------------------------------------------------------------------
proc tablelist::insertOrUpdateIndent {w index indent indentWidth} {
    if {[catch {$w window cget $index -create} script] == 0 &&
	[string match "::tablelist::displayIndent *" $script]} {
	if {$indentWidth != [lindex $script end]} {
	    set padY [expr {[$w cget -spacing1] == 0}]
	    set script [lreplace $script end end $indentWidth]
	    $w window configure $index -pady $padY -create $script

	    set path [lindex [$w dump -window $index] 1]
	    if {[string length $path] != 0} {
		$path configure -width $indentWidth
	    }
	}
	return 0
    } else {
	set padY [expr {[$w cget -spacing1] == 0}]
	set indent [lreplace $indent end end $indentWidth]
	$w window create $index -pady $padY -create $indent
	$w tag add elidedWin $index
	return 1
    }
}

#------------------------------------------------------------------------------
# tablelist::insertElem
#
# Inserts the given text and auxiliary object (image or window) into the text
# widget w, just before the character position specified by index.  The object
# will follow the text if alignment is "right", and will precede it otherwise.
#------------------------------------------------------------------------------
proc tablelist::insertElem {w index text aux auxType alignment valignment} {
    set index [$w index $index]

    if {$auxType == 0} {				;# no image or window
	$w insert $index $text
    } elseif {[string compare $alignment "right"] == 0} {
	set padY [expr {[$w cget -spacing1] == 0}]
	if {$auxType == 1} {					;# image
	    set aux [lreplace $aux 4 4 e]
	    $w window create $index -align $valignment -padx 1 -pady $padY \
				    -create $aux
	    $w tag add elidedWin $index
	} else {						;# window
	    if {$auxType == 2} {				;# static width
		place $aux.w -anchor ne -relwidth "" -relx 1.0
	    } else {						;# dynamic width
		place $aux.w -anchor ne -relwidth 1.0 -relx 1.0
	    }
	    $w window create $index -align $valignment -padx 1 -pady $padY \
				    -window $aux
	}
	$w insert $index $text
    } else {
	$w insert $index $text
	set padY [expr {[$w cget -spacing1] == 0}]
	if {$auxType == 1} {					;# image
	    set aux [lreplace $aux 4 4 w]
	    $w window create $index -align $valignment -padx 1 -pady $padY \
				    -create $aux
	    $w tag add elidedWin $index
	} else {						;# window
	    if {$auxType == 2} {				;# static width
		place $aux.w -anchor nw -relwidth "" -relx 0.0
	    } else {						;# dynamic width
		place $aux.w -anchor nw -relwidth 1.0 -relx 0.0
	    }
	    $w window create $index -align $valignment -padx 1 -pady $padY \
				    -window $aux
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::insertMlElem
#
# Inserts the given message widget and auxiliary object (image or window) into
# the text widget w, just before the character position specified by index.
# The object will follow the message widget if alignment is "right", and will
# precede it otherwise.
#------------------------------------------------------------------------------
proc tablelist::insertMlElem {w index msgScript aux auxType alignment
			      valignment} {
    set index [$w index $index]
    set padY [expr {[$w cget -spacing1] == 0}]

    if {$auxType == 0} {				;# no image or window
	$w window create $index -align top -pady $padY -create $msgScript
	$w tag add elidedWin $index
    } elseif {[string compare $alignment "right"] == 0} {
	if {$auxType == 1} {					;# image
	    set aux [lreplace $aux 4 4 e]
	    $w window create $index -align $valignment -padx 1 -pady $padY \
				    -create $aux
	    $w tag add elidedWin $index
	} else {						;# window
	    if {$auxType == 2} {				;# static width
		place $aux.w -anchor ne -relwidth "" -relx 1.0
	    } else {						;# dynamic width
		place $aux.w -anchor ne -relwidth 1.0 -relx 1.0
	    }
	    $w window create $index -align $valignment -padx 1 -pady $padY \
				    -window $aux
	}
	$w window create $index -align top -pady $padY -create $msgScript
	$w tag add elidedWin $index
    } else {
	$w window create $index -align top -pady $padY -create $msgScript
	$w tag add elidedWin $index
	if {$auxType == 1} {					;# image
	    set aux [lreplace $aux 4 4 w]
	    $w window create $index -align $valignment -padx 1 -pady $padY \
				    -create $aux
	    $w tag add elidedWin $index
	} else {						;# window
	    if {$auxType == 2} {				;# static width
		place $aux.w -anchor nw -relwidth "" -relx 0.0
	    } else {						;# dynamic width
		place $aux.w -anchor nw -relwidth 1.0 -relx 0.0
	    }
	    $w window create $index -align $valignment -padx 1 -pady $padY \
				    -window $aux
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::updateCell
#
# Updates the contents 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.
#------------------------------------------------------------------------------
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
    }

    if {$indentWidth != 0} {
	if {[insertOrUpdateIndent $w $index1 $indent $indentWidth]} {
	    set index2 $index2+1c
	}
	set index1 $index1+1c
    }

    if {$auxWidth == 0} {				;# no image or window
	#
	# Work around a Tk peculiarity on Windows, related to deleting
	# an embedded window while resizing a text widget interactively
	#
	set path [lindex [$w dump -window $index1] 1]
	if {[string length $path] != 0 &&
	    [string compare [winfo class $path] "Message"] == 0} {
	    $path configure -text ""
	    $w window configure $index1 -window ""
	}

	if {$::tk_version >= 8.5} {
	    $w replace $index1 $index2 $text
	} else {
	    $w delete $index1 $index2
	    $w insert $index1 $text
	}
    } else {
	#
	# Check whether the image label or the frame containing a
	# window is mapped at the first or last position of the cell
	#
	if {$auxType == 1} {					;# image
	    if {[setImgLabelWidth $w $index1 $auxWidth]} {
		set auxFound 1
		set fromIdx $index1+1c
		set toIdx $index2
	    } elseif {[setImgLabelWidth $w $index2-1c $auxWidth]} {
		set auxFound 1
		set fromIdx $index1
		set toIdx $index2-1c
	    } else {
		set auxFound 0
		set fromIdx $index1
		set toIdx $index2
	    }
	} else {						;# window
	    if {[$aux cget -width] != $auxWidth} {
		$aux configure -width $auxWidth
	    }

	    if {[string compare [lindex [$w dump -window $index1] 1] \
		 $aux] == 0} {
		set auxFound 1
		set fromIdx $index1+1c
		set toIdx $index2
	    } elseif {[string compare [lindex [$w dump -window $index2-1c] 1] \
		       $aux] == 0} {
		set auxFound 1
		set fromIdx $index1
		set toIdx $index2-1c
	    } else {
		set auxFound 0
		set fromIdx $index1
		set toIdx $index2
	    }
	}

	#
	# Work around a Tk peculiarity on Windows, related to deleting
	# an embedded window while resizing a text widget interactively
	#
	set path [lindex [$w dump -window $fromIdx] 1]
	if {[string length $path] != 0 &&
	    [string compare [winfo class $path] "Message"] == 0} {
	    $path configure -text ""
	    $w window configure $fromIdx -window ""
	}

	$w delete $fromIdx $toIdx

	if {$auxFound} {
	    #
	    # Adjust the aux. window and insert the text
	    #
	    if {[string compare $alignment "right"] == 0} {
		if {$auxType == 1} {				;# image
		    setImgLabelAnchor $w $index1 e
		} else {					;# window
		    if {$auxType == 2} {			;# static width
			place $aux.w -anchor ne -relwidth "" -relx 1.0
		    } else {					;# dynamic width
			place $aux.w -anchor ne -relwidth 1.0 -relx 1.0
		    }
		}
		set index $index1
	    } else {
		if {$auxType == 1} {				;# image
		    setImgLabelAnchor $w $index1 w
		} else {					;# window
		    if {$auxType == 2} {			;# static width
			place $aux.w -anchor nw -relwidth "" -relx 0.0
		    } else {					;# dynamic width
			place $aux.w -anchor nw -relwidth 1.0 -relx 0.0
		    }
		}
		set index $index1+1c
	    }
	    if {[string compare $valignment [$w window cget $index1 -align]]
		!= 0} {
		$w window configure $index1 -align $valignment
	    }
	    $w insert $index $text
	} else {
	    #
	    # Insert the text and the aux. window
	    #
	    if {$auxType == 1} {				;# image
		set aux [lreplace $aux end end $auxWidth]
	    } else {						;# window
		if {[$aux cget -width] != $auxWidth} {
		    $aux configure -width $auxWidth
		}
	    }
	    insertElem $w $index1 $text $aux $auxType $alignment $valignment
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::updateMlCell
#
# Updates the contents 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.
#------------------------------------------------------------------------------
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
    }

    if {$indentWidth != 0} {
	if {[insertOrUpdateIndent $w $index1 $indent $indentWidth]} {
	    set index2 $index2+1c
	}
	set index1 $index1+1c
    }

    if {$auxWidth == 0} {				;# no image or window
	set areEqual [$w compare $index1 == $index2]
	$w delete $index1+1c $index2
	set padY [expr {[$w cget -spacing1] == 0}]
	if {[catch {$w window cget $index1 -create} script] == 0 &&
	    [string match "::tablelist::displayText*" $script]} {
	    $w window configure $index1 \
		      -align top -pady $padY -create $msgScript

	    set path [lindex [$w dump -window $index1] 1]
	    if {[string length $path] != 0 &&
		[string compare [winfo class $path] "Message"] == 0} {
		eval $msgScript
	    }
	} else {
	    if {!$areEqual} {
		$w delete $index1
	    }
	    $w window create $index1 -align top -pady $padY -create $msgScript
	    $w tag add elidedWin $index1
	}
    } else {
	#
	# Check whether the image label or the frame containing a
	# window is mapped at the first or last position of the cell
	#
	$w mark set index2Mark $index2
	if {$auxType == 1} {					;# image
	    if {[setImgLabelWidth $w $index1 $auxWidth]} {
		set auxFound 1
		if {[string compare $alignment "right"] == 0} {
		    $w delete $index1+1c $index2
		}
	    } elseif {[setImgLabelWidth $w $index2-1c $auxWidth]} {
		set auxFound 1
		if {[string compare $alignment "right"] != 0} {
		    $w delete $index1 $index2-1c
		}
	    } else {
		set auxFound 0
		$w delete $index1 $index2
	    }
	} else {						;# window
	    if {[$aux cget -width] != $auxWidth} {
		$aux configure -width $auxWidth
	    }

	    if {[string compare [lindex [$w dump -window $index1] 1] \
		 $aux] == 0} {
		set auxFound 1
		if {[string compare $alignment "right"] == 0} {
		    $w delete $index1+1c $index2
		}
	    } elseif {[string compare [lindex [$w dump -window $index2-1c] 1] \
		       $aux] == 0} {
		set auxFound 1
		if {[string compare $alignment "right"] != 0} {
		    $w delete $index1 $index2-1c
		}
	    } else {
		set auxFound 0
		$w delete $index1 $index2
	    }
	}

	if {$auxFound} {
	    #
	    # Adjust the aux. window and insert the message widget
	    #
	    if {[string compare $alignment "right"] == 0} {
		if {$auxType == 1} {				;# image
		    setImgLabelAnchor $w index2Mark-1c e
		} else {					;# window
		    if {$auxType == 2} {			;# static width
			place $aux.w -anchor ne -relwidth "" -relx 1.0
		    } else {					;# dynamic width
			place $aux.w -anchor ne -relwidth 1.0 -relx 1.0
		    }
		}
		set auxIdx index2Mark-1c
		set msgIdx index2Mark-2c
	    } else {
		if {$auxType == 1} {				;# image
		    setImgLabelAnchor $w $index1 w
		} else {					;# window
		    if {$auxType == 2} {			;# static width
			place $aux.w -anchor nw -relwidth "" -relx 0.0
		    } else {					;# dynamic width
			place $aux.w -anchor nw -relwidth 1.0 -relx 0.0
		    }
		}
		set auxIdx $index1
		set msgIdx $index1+1c
	    }
	    if {[string compare $valignment [$w window cget $auxIdx -align]]
		!= 0} {
		$w window configure $auxIdx -align $valignment
	    }

	    set padY [expr {[$w cget -spacing1] == 0}]
	    if {[catch {$w window cget $msgIdx -create} script] == 0 &&
		[string match "::tablelist::displayText*" $script]} {
		$w window configure $msgIdx \
			  -align top -pady $padY -create $msgScript

		set path [lindex [$w dump -window $msgIdx] 1]
		if {[string length $path] != 0 &&
		    [string compare [winfo class $path] "Message"] == 0} {
		    eval $msgScript
		}
	    } elseif {[string compare $alignment "right"] == 0} {
		$w window create index2Mark-1c \
			  -align top -pady $padY -create $msgScript
		$w tag add elidedWin index2Mark-1c
		$w delete $index1 index2Mark-2c
	    } else {
		$w window create $index1+1c \
			  -align top -pady $padY -create $msgScript
		$w tag add elidedWin $index1+1c
		$w delete $index1+2c index2Mark
	    }
	} else {
	    #
	    # Insert the message and aux. windows
	    #
	    if {$auxType == 1} {				;# image
		set aux [lreplace $aux end end $auxWidth]
	    } else {						;# window
		if {[$aux cget -width] != $auxWidth} {
		    $aux configure -width $auxWidth
		}
	    }
	    insertMlElem $w $index1 $msgScript $aux $auxType $alignment \
			 $valignment
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::setImgLabelWidth
#
# Sets the width of the image label embedded into the text widget w at the
# given index to the specified value.
#------------------------------------------------------------------------------
proc tablelist::setImgLabelWidth {w index width} {
    if {[catch {$w window cget $index -create} script] == 0 &&
	[string match "::tablelist::displayImage *" $script]} {
	if {$width != [lindex $script end]} {
	    set padY [expr {[$w cget -spacing1] == 0}]
	    set script [lreplace $script end end $width]
	    $w window configure $index -pady $padY -create $script

	    set path [lindex [$w dump -window $index] 1]
	    if {[string length $path] != 0} {
		$path configure -width $width
	    }
	}

	return 1
    } else {
	return 0
    }
}

#------------------------------------------------------------------------------
# tablelist::setImgLabelAnchor
#
# Sets the anchor of the image label embedded into the text widget w at the
# given index to the specified value.
#------------------------------------------------------------------------------
proc tablelist::setImgLabelAnchor {w index anchor} {
    set script [$w window cget $index -create]
    if {[string compare $anchor [lindex $script 4]] != 0} {
	set padY [expr {[$w cget -spacing1] == 0}]
	set script [lreplace $script 4 4 $anchor]
	$w window configure $index -pady $padY -create $script

	set path [lindex [$w dump -window $index] 1]
	if {[string length $path] != 0} {
	    $path configure -anchor $anchor
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::appendComplexElem
#
# Adjusts the given text and the width of the auxiliary object (image or
# window) corresponding to the specified cell of the tablelist widget win, and
# inserts the text and the auxiliary object (if any) just before the newline
# character at the end of the specified line of the tablelist's body.
#------------------------------------------------------------------------------
proc tablelist::appendComplexElem {win key row col text pixels alignment
				   snipStr cellFont cellTags line} {
    #
    # Adjust the cell text and the image or window width
    #
    set multiline [string match "*\n*" $text]
    upvar ::tablelist::ns${win}::data data
    if {$pixels == 0} {				;# convention: dynamic width
	if {$data($col-maxPixels) > 0} {
	    if {$data($col-reqPixels) > $data($col-maxPixels)} {
		set pixels $data($col-maxPixels)
	    }
	}
    }
    set aux [getAuxData $win $key $col auxType auxWidth $pixels]
    set indent [getIndentData $win $key $col indentWidth]
    set maxTextWidth $pixels
    if {$pixels != 0} {
	incr pixels $data($col-delta)
	set maxTextWidth [getMaxTextWidth $pixels $auxWidth $indentWidth]

	if {$data($col-wrap) && !$multiline} {
	    if {[font measure $cellFont -displayof $win $text] >
		$maxTextWidth} {
		set multiline 1
	    }
	}
    }
    variable snipSides
    set snipSide $snipSides($alignment,$data($col-changesnipside))
    if {$multiline} {
	set list [split $text "\n"]
	if {$data($col-wrap)} {
	    set snipSide ""
	}
	adjustMlElem $win list auxWidth indentWidth $cellFont $pixels \
		     $snipSide $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
    }

    #
    # Insert the text and the auxiliary object (if any) just before the newline
    #
    set w $data(body)
    set idx [$w index $line.end]
    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 \
		      -align top -pady $padY -create $msgScript
	    $w tag add elidedWin $line.end-1c
	} else {
	    $w insert $line.end "\t$text\t" $cellTags
	}
    } else {
	$w insert $line.end "\t\t" $cellTags
	if {$auxType == 1} {					;# image
	    #
	    # Update the creation script for the image label
	    #
	    set aux [lreplace $aux end end $auxWidth]
	} else {						;# window
	    #
	    # 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} {
	    insertMlElem $w $line.end-1c $msgScript $aux $auxType $alignment \
			 [getVAlignment $win $key $col]
	} else {
	    insertElem $w $line.end-1c $text $aux $auxType $alignment \
		       [getVAlignment $win $key $col]
	}
    }

    #
    # Insert the indentation image, if any
    #
    if {$indentWidth != 0} {
	insertOrUpdateIndent $w $idx+1c $indent $indentWidth
    }
}

#------------------------------------------------------------------------------
# tablelist::makeColFontAndTagLists
#
# Builds the lists data(colFontList) of the column fonts and data(colTagsList)
# of the column tag names for the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::makeColFontAndTagLists win {
    upvar ::tablelist::ns${win}::data data
    set widgetFont $data(-font)
    set data(colFontList) {}
    set data(colTagsList) {}
    set data(hasColTags) 0
    set viewable [winfo viewable $win]
    variable canElide

    for {set col 0} {$col < $data(colCount)} {incr col} {
	set tagNames {}

	if {[info exists data($col-font)]} {
	    lappend data(colFontList) $data($col-font)
	    lappend tagNames col-font-$data($col-font)
	    set data(hasColTags) 1
	} else {
	    lappend data(colFontList) $widgetFont
	}

	if {$viewable && $data($col-hide) && $canElide} {
	    lappend tagNames hiddenCol
	    set data(hasColTags) 1
	}

	lappend data(colTagsList) $tagNames
    }
}

#------------------------------------------------------------------------------
# tablelist::makeSortAndArrowColLists
#
# Builds the lists data(sortColList) of the sort columns and data(arrowColList)
# of the arrow columns for the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::makeSortAndArrowColLists win {
    upvar ::tablelist::ns${win}::data data
    set data(sortColList) {}
    set data(arrowColList) {}

    #
    # Build a list of {col sortRank} pairs and sort it based on sortRank
    #
    set pairList {}
    for {set col 0} {$col < $data(colCount)} {incr col} {
	if {$data($col-sortRank) > 0} {
	    lappend pairList [list $col $data($col-sortRank)]
	}
    }
    set pairList [lsort -integer -index 1 $pairList]

    #
    # Build data(sortColList) and data(arrowColList), and update
    # the sort ranks to have values from 1 to [llength $pairList]
    #
    set sortRank 1
    foreach pair $pairList {
	set col [lindex $pair 0]
	lappend data(sortColList) $col
	set data($col-sortRank) $sortRank
	if {$sortRank < 10 && $data(-showarrow) && $data($col-showarrow)} {
	    lappend data(arrowColList) $col
	    configCanvas $win $col
	    raiseArrow $win $col
	}
	incr sortRank
    }

    #
    # Special handling for the "aqua" theme if Cocoa is being used:
    # Deselect all header labels and select that of the main sort column
    #
    variable specialAquaHandling
    if {$specialAquaHandling &&
	[string compare [getCurrentTheme] "aqua"] == 0} {
	for {set col 0} {$col < $data(colCount)} {incr col} {
	    configLabel $data(hdrTxtFrLbl)$col -selected 0
	}

	if {[llength $data(sortColList)] != 0} {
	    set col [lindex $data(sortColList) 0]
	    configLabel $data(hdrTxtFrLbl)$col -selected 1
	    raise $data(hdrTxtFrLbl)$col
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::setupColumns
#
# Updates the value of the -colums configuration option for the tablelist
# widget win by using the width, title, and alignment specifications given in
# the columns argument, and creates the corresponding label (and separator)
# widgets if createLabels is true.
#------------------------------------------------------------------------------
proc tablelist::setupColumns {win columns createLabels} {
    variable usingTile
    variable configSpecs
    variable configOpts
    variable alignments
    upvar ::tablelist::ns${win}::data data

    set argCount [llength $columns]
    set colConfigVals {}

    #
    # Check the syntax of columns before performing any changes
    #
    for {set n 0} {$n < $argCount} {incr n} {
	#
	# Get the column width
	#
	set width [lindex $columns $n]
	set width [format "%d" $width]	;# integer check with error message

	#
	# Get the column title
	#
	if {[incr n] == $argCount} {
	    return -code error "column title missing"
	}
	set title [lindex $columns $n]

	#
	# Get the column alignment
	#
	set alignment left
	if {[incr n] < $argCount} {
	    set next [lindex $columns $n]
	    if {[isInteger $next]} {
		incr n -1
	    } else {
		set alignment [mwutil::fullOpt "alignment" $next $alignments]
	    }
	}

	#
	# Append the properly formatted values of width,
	# title, and alignment to the list colConfigVals
	#
	lappend colConfigVals $width $title $alignment
    }

    #
    # Save the value of colConfigVals in data(-columns)
    #
    set data(-columns) $colConfigVals

    #
    # Delete the labels, canvases, and separators if requested
    #
    if {$createLabels} {
	foreach w [winfo children $data(hdrTxtFr)] {
	    destroy $w
	}
	foreach w [winfo children $win] {
	    if {[regexp {^(sep[0-9]+|hsep)$} [winfo name $w]]} {
		destroy $w
	    }
	}
	set data(fmtCmdFlagList) {}
	set data(hiddenColCount) 0
    }

    #
    # Build the list data(colList), and create
    # the labels and canvases if requested
    #
    regexp {^(flat|flatAngle|sunken|photo)([0-9]+)x([0-9]+)$} \
	   $data(-arrowstyle) dummy arrowRelief arrowWidth arrowHeight
    set widgetFont $data(-font)
    set oldColCount $data(colCount)
    set data(colList) {}
    set data(colCount) 0
    set data(lastCol) -1
    set col 0
    foreach {width title alignment} $data(-columns) {
	#
	# Append the width in pixels and the
	# alignment to the list data(colList)
	#
	if {$width > 0} {		;# convention: width in characters
	    set pixels [charsToPixels $win $widgetFont $width]
	    set data($col-lastStaticWidth) $pixels
	} elseif {$width < 0} {		;# convention: width in pixels
	    set pixels [expr {(-1)*$width}]
	    set data($col-lastStaticWidth) $pixels
	} else {			;# convention: dynamic width
	    set pixels 0
	}
	lappend data(colList) $pixels $alignment
	incr data(colCount)
	set data(lastCol) $col

	if {$createLabels} {
	    set data($col-elide) 0
	    foreach {name val} {delta 0  lastStaticWidth 0  maxPixels 0
				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
				valign center  wrap 0} {
		if {![info exists data($col-$name)]} {
		    set data($col-$name) $val
		}
	    }
	    lappend data(fmtCmdFlagList) [info exists data($col-formatcommand)]
	    incr data(hiddenColCount) $data($col-hide)

	    #
	    # Create the label
	    #
	    set w $data(hdrTxtFrLbl)$col
	    if {$usingTile} {
		ttk::label $w -style TablelistHeader.TLabel -image "" \
			      -padding {1 1 1 1} -takefocus 0 -text "" \
			      -textvariable "" -underline -1 -wraplength 0
	    } else {
		tk::label $w -bitmap "" -highlightthickness 0 -image "" \
			     -takefocus 0 -text "" -textvariable "" \
			     -underline -1 -wraplength 0
	    }

	    #
	    # Apply to it the current configuration options
	    #
	    foreach opt $configOpts {
		set optGrp [lindex $configSpecs($opt) 2]
		if {[string compare $optGrp "l"] == 0} {
		    set optTail [string range $opt 6 end]
		    if {[info exists data($col$opt)]} {
			configLabel $w -$optTail $data($col$opt)
		    } else {
			configLabel $w -$optTail $data($opt)
		    }
		} elseif {[string compare $optGrp "c"] == 0} {
		    configLabel $w $opt $data($opt)
		}
	    }
	    catch {configLabel $w -state $data(-state)}

	    #
	    # Replace the binding tag (T)Label with $data(labelTag) and
	    # TablelistLabel in the list of binding tags of the label
	    #
	    bindtags $w [lreplace [bindtags $w] 1 1 \
			 $data(labelTag) TablelistLabel]

	    #
	    # Create a canvas containing the sort arrows
	    #
	    set w $data(hdrTxtFrCanv)$col
	    canvas $w -borderwidth 0 -highlightthickness 0 \
		      -relief flat -takefocus 0
	    createArrows $w $arrowWidth $arrowHeight $arrowRelief

	    #
	    # Apply to it the current configuration options
	    #
	    foreach opt $configOpts {
		if {[string compare [lindex $configSpecs($opt) 2] "c"] == 0} {
		    $w configure $opt $data($opt)
		}
	    }

	    #
	    # Replace the binding tag Canvas with $data(labelTag) and
	    # TablelistArrow in the list of binding tags of the canvas
	    #
	    bindtags $w [lreplace [bindtags $w] 1 1 \
			 $data(labelTag) TablelistArrow]

	    if {[info exists data($col-labelimage)]} {
		doColConfig $col $win -labelimage $data($col-labelimage)
	    }
	}

	#
	# Configure the edit window if present
	#
	if {$col == $data(editCol) &&
	    [string compare [winfo class $data(bodyFrEd)] "Mentry"] != 0} {
	    catch {$data(bodyFrEd) configure -justify $alignment}
	}

	incr col
    }
    set data(hasFmtCmds) [expr {[lsearch -exact $data(fmtCmdFlagList) 1] >= 0}]

    #
    # Clean up the images, data, and attributes
    # associated with the deleted columns
    #
    for {set col $data(colCount)} {$col < $oldColCount} {incr col} {
	set w $data(hdrTxtFrCanv)$col
	foreach shape {triangleUp darkLineUp lightLineUp
		       triangleDn darkLineDn lightLineDn} {
	    catch {image delete $shape$w}
	}

	deleteColData $win $col
	deleteColAttribs $win $col
    }

    #
    # Update data(-treecolumn) and data(treeCol) if needed
    #
    if {$createLabels} {
	set treeCol $data(-treecolumn)
	adjustColIndex $win treeCol
	set data(treeCol) $treeCol
	if {$data(colCount) != 0} { 
	    set data(-treecolumn) $treeCol
	}
    }

    #
    # Create the separators if needed
    #
    if {$createLabels && $data(-showseparators)} {
	createSeps $win
    }
}

#------------------------------------------------------------------------------
# tablelist::createSeps
#
# Creates and manages the separators in the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::createSeps win {
    upvar ::tablelist::ns${win}::data data
    variable usingTile
    set sepX [getSepX]

    for {set col 0} {$col < $data(colCount)} {incr col} {
	#
	# Create the col'th separator and attach it to
	# the right edge of the col'th header label
	#
	set w $data(sep)$col
	if {$usingTile} {
	    ttk::separator $w -style Seps$win.TSeparator \
			      -cursor $data(-cursor) -orient vertical \
			      -takefocus 0
	} else {
	    tk::frame $w -background $data(-background) -borderwidth 1 \
			 -container 0 -cursor $data(-cursor) \
			 -highlightthickness 0 -relief sunken \
			 -takefocus 0 -width 2
	}
	place $w -in $data(hdrTxtFrLbl)$col -anchor ne -bordermode outside \
		 -relx 1.0 -x $sepX

	#
	# Replace the binding tag TSeparator or Frame with $data(bodyTag)
	# and TablelistBody in the list of binding tags of the separator
	#
	bindtags $w [lreplace [bindtags $w] 1 1 $data(bodyTag) TablelistBody]
    }

    #
    # Create the horizontal separator
    #
    set w $data(hsep)
    if {$usingTile} {
	ttk::separator $w -style Seps$win.TSeparator -cursor $data(-cursor) \
			  -takefocus 0
    } else {
	tk::frame $w -background $data(-background) -borderwidth 1 \
		     -container 0 -cursor $data(-cursor) -height 2 \
		     -highlightthickness 0 -relief sunken -takefocus 0
    }

    #
    # Replace the binding tag TSeparator or Frame with $data(bodyTag) and
    # TablelistBody in the list of binding tags of the horizontal separator
    #
    bindtags $w [lreplace [bindtags $w] 1 1 $data(bodyTag) TablelistBody]
    
    adjustSepsWhenIdle $win
}

#------------------------------------------------------------------------------
# tablelist::adjustSepsWhenIdle
#
# Arranges for the height and vertical position of each separator in the
# tablelist widget win to be adjusted at idle time.
#------------------------------------------------------------------------------
proc tablelist::adjustSepsWhenIdle win {
    upvar ::tablelist::ns${win}::data data
    if {[info exists data(sepsId)]} {
	return ""
    }

    set data(sepsId) [after idle [list tablelist::adjustSeps $win]]
}

#------------------------------------------------------------------------------
# tablelist::adjustSeps
#
# Adjusts the height and vertical position of each separator in the tablelist
# widget win.
#------------------------------------------------------------------------------
proc tablelist::adjustSeps win {
    upvar ::tablelist::ns${win}::data data
    if {[info exists data(sepsId)]} {
	after cancel $data(sepsId)
	unset data(sepsId)
    }

    variable winSys
    set onWindows [expr {[string compare $winSys "win32"] == 0}]
    variable usingTile
    set sepX [getSepX]

    #
    # Get the height to be applied to the column separators
    # and place or unmanage the horizontal separator
    #
    set w $data(body)
    if {$data(-fullseparators)} {
	set sepHeight [winfo height $w]

	if {[winfo exists $data(hsep)]} {
	    place forget $data(hsep)
	}
    } else {
	set btmTextIdx [$w index @0,$data(btmY)]
	set btmLine [expr {int($btmTextIdx)}]
	if {$btmLine > $data(itemCount)} {		;# text widget bug
	    set btmLine $data(itemCount)
	    set btmTextIdx [expr {double($btmLine)}]
	}
	set dlineinfo [$w dlineinfo $btmTextIdx]
	if {$data(itemCount) == 0 || [llength $dlineinfo] == 0} {
	    set sepHeight 0
	} else {
	    foreach {x y width height baselinePos} $dlineinfo {}
	    set sepHeight [expr {$y + $height}]
	}

	if {$data(-showhorizseparator) && $data(-showseparators) &&
	    $sepHeight > 0 && $sepHeight < [winfo height $w]} {
	    set width [expr {[winfo reqwidth $data(hdrTxtFr)] + $sepX -
			     [winfo reqheight $data(hsep)] + 1}]
	    if {$onWindows && !$usingTile} {
		incr width
	    }
	    place $data(hsep) -in $w -y $sepHeight -width $width
	} elseif {[winfo exists $data(hsep)]} {
	    place forget $data(hsep)
	}
    }

    #
    # 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 startCol [expr {$data(-titlecolumns) - 1}]
    if {$startCol > $data(lastCol)} {
	set startCol $data(lastCol)
    }
    for {set col $startCol} {$col >= 0} {incr col -1} {
	if {!$data($col-hide)} {
	    break
	}
    }
    set mainSepHeight [expr {$sepHeight + [winfo height $data(hdr)] - 1}]
    set w $data(sep)
    if {$col < 0 || $mainSepHeight == 0} {
	if {[winfo exists $w]} {
	    place forget $w
	}
    } else {
	if {!$data(-showlabels)} {
	    incr mainSepHeight
	}
	place $w -in $data(hdrTxtFrLbl)$col -anchor ne -bordermode outside \
		 -height $mainSepHeight -relx 1.0 -x $sepX -y 1
	raise $w
    }

    #
    # Set the height and vertical position of the other column separators
    #
    if {$sepHeight == 0} {
	set relY 0.0
	set y -10
    } elseif {$data(-showlabels)} {
	set relY 1.0
	if {$usingTile || $onWindows} {
	    set y 0
	    incr sepHeight 1
	} else {
	    set y -1
	    incr sepHeight 2
	}
    } else {
	set relY 0.0
	if {$usingTile || $onWindows} {
	    set y 1
	    incr sepHeight 2
	} else {
	    set y 0
	    incr sepHeight 3
	}
    }
    foreach w [winfo children $win] {
	if {[regexp {^sep[0-9]+$} [winfo name $w]]} {
	    place configure $w -height $sepHeight -rely $relY -y $y
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::getSepX
#
# Returns the value of the -x option to be used when placing a separator
# relative to the corresponding header label, with -anchor ne.
#------------------------------------------------------------------------------
proc tablelist::getSepX {} {
    set x 1
    variable usingTile
    if {$usingTile} {
	set currentTheme [getCurrentTheme]
	variable xpStyle
	if {([string compare $currentTheme "aqua"] == 0) ||
	    ([string compare $currentTheme "xpnative"] == 0 && $xpStyle)} {
	    set x 0
	} elseif {[string compare $currentTheme "tileqt"] == 0} {
	    switch -- [string tolower [tileqt_currentThemeName]] {
		cleanlooks -
		gtk+ -
		oxygen	{ set x 0 }
		qtcurve	{ set x 2 }
	    }
	}
    }

    return $x
}

#------------------------------------------------------------------------------
# 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
# 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.
#------------------------------------------------------------------------------
proc tablelist::adjustColumns {win whichWidths stretchCols} {
    set compAllColWidths [expr {[string compare $whichWidths "allCols"] == 0}]
    set compAllLabelWidths \
	[expr {[string compare $whichWidths "allLabels"] == 0}]

    variable usingTile
    set usingAquaTheme \
	[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
    #
    upvar ::tablelist::ns${win}::data data
    set data(hdrPixels) 0
    variable canElide
    set tabs {}
    set col 0
    set x 0
    foreach {pixels alignment} $data(colList) {
	set w $data(hdrTxtFrLbl)$col
	if {$data($col-hide) && !$canElide} {
	    place forget $w
	    incr col
	    continue
	}

	#
	# Adjust the col'th label
	#
	if {[info exists data($col-labelalign)]} {
	    set labelAlignment $data($col-labelalign)
	} else {
	    set labelAlignment $alignment
	}
	if {$pixels != 0} {			;# convention: static width
	    incr pixels $data($col-delta)
	}
	adjustLabel $win $col $pixels $labelAlignment

	if {$pixels == 0} {			;# convention: dynamic width
	    #
	    # Compute the column or label width if requested
	    #
	    if {$compAllColWidths || [lsearch -exact $whichWidths $col] >= 0} {
		computeColWidth $win $col
	    } elseif {$compAllLabelWidths ||
		      [lsearch -exact $whichWidths l$col] >= 0} {
		computeLabelWidth $win $col
	    }

	    set pixels $data($col-reqPixels)
	    if {$data($col-maxPixels) > 0 && $pixels > $data($col-maxPixels)} {
		set pixels $data($col-maxPixels)
		incr pixels $data($col-delta)
		adjustLabel $win $col $pixels $labelAlignment
	    } else {
		incr pixels $data($col-delta)
	    }
	}

	if {$col == $data(editCol) &&
	    ![string match "*Checkbutton" [winfo class $data(bodyFrEd)]]} {
	    adjustEditWindow $win $pixels
	}

	set canvas $data(hdrTxtFrCanv)$col
	if {[lsearch -exact $data(arrowColList) $col] >= 0 &&
	    !$data($col-elide) && !$data($col-hide)} {
	    #
	    # Place the canvas to the left side of the label if the
	    # latter is right-justified and to its right side otherwise
	    #
	    set y 0
	    if {([winfo reqheight $w] - [winfo reqheight $canvas]) % 2 == 0 &&
		$data(arrowHeight) == 5} {
		set y -1
	    }
	    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
	    } else {
		place $canvas -in $w -anchor e -bordermode outside \
			      -relx 1.0 -x -$data(charWidth) -rely 0.49 -y $y
	    }
	    raise $canvas
	} else {
	    place forget $canvas
	}

	#
	# Place the label in the header frame
	#
	if {$data($col-elide) || $data($col-hide)} {
	    foreach l [getSublabels $w] {
		place forget $l
	    }
	    place $w -x [expr {$x - 1}] -relheight 1.0 -width 1
	    lower $w
	} else {
	    set x2 $x
	    set labelPixels [expr {$pixels + 2*$data(charWidth)}]
	    if {$usingAquaTheme} {
		incr x2 -1
		incr labelPixels
		if {$col == 0} {
		    incr x2 -1
		    incr labelPixels
		}
	    }
	    place $w -x $x2 -relheight 1.0 -width $labelPixels
	}

	#
	# Append a tab stop and the alignment to the tabs list
	#
	if {!$data($col-elide) && !$data($col-hide)} {
	    incr x $data(charWidth)
	    switch $alignment {
		left {
		    lappend tabs $x left
		    incr x $pixels
		}
		right {
		    incr x $pixels
		    lappend tabs $x right
		}
		center {
		    lappend tabs [expr {$x + $pixels/2}] center
		    incr x $pixels
		}
	    }
	    incr x $data(charWidth)
	    lappend tabs $x left
	}

	incr col
    }
    place configure $data(hdrFr) -x $x

    #
    # Apply the value of tabs to the body text widget
    #
    if {[info exists data(colBeingResized)]} {
	$data(body) tag configure visibleLines -tabs $tabs
    } else {
	$data(body) configure -tabs $tabs
    }

    #
    # Adjust the width and height of the frames data(hdrTxtFr) and data(hdr)
    #
    $data(hdrTxtFr) configure -width $x
    if {$data(-width) <= 0} {
	if {$stretchCols} {
	    $data(hdr) configure -width $x
	    $data(lb) configure -width [expr {$x / $data(charWidth)}]
	}
    } else {
	$data(hdr) configure -width 0
    }
    set data(hdrPixels) $x
    adjustHeaderHeight $win

    #
    # Stretch the stretchable columns if requested, and update
    # the scrolled column offset and the horizontal scrollbar
    #
    if {$stretchCols} {
	stretchColumnsWhenIdle $win
    }
    if {![info exists data(colBeingResized)]} {
	updateScrlColOffsetWhenIdle $win
    }
    updateHScrlbarWhenIdle $win
}

#------------------------------------------------------------------------------
# tablelist::adjustLabel
#
# Applies some configuration options to the col'th label of the tablelist
# widget win as well as to the label's sublabels (if any), and places the
# sublabels.
#------------------------------------------------------------------------------
proc tablelist::adjustLabel {win col pixels alignment} {
    variable usingTile
    set usingAquaTheme \
	[expr {$usingTile && [string compare [getCurrentTheme] "aqua"] == 0}]

    #
    # Apply some configuration options to the label and its sublabels (if any)
    #
    upvar ::tablelist::ns${win}::data data
    set w $data(hdrTxtFrLbl)$col
    variable anchors
    set anchor $anchors($alignment)
    set borderWidth [winfo pixels $w [$w cget -borderwidth]]
    if {$borderWidth < 0} {
	set borderWidth 0
    }
    set padX [expr {$data(charWidth) - $borderWidth}]
    if {$padX < 0} {
	set padX 0
    }
    set padL $padX
    set padR $padX
    set marginL $data(charWidth)
    set marginR $data(charWidth)
    if {$usingAquaTheme} {
	incr padL
	incr marginL
	if {$col == 0} {
	    incr padL
	    incr marginL
	}
	set padding [$w cget -padding]
	lset padding 0 $padL
	lset padding 2 $padR
	$w configure -anchor $anchor -justify $alignment -padding $padding
    } else {
	configLabel $w -anchor $anchor -justify $alignment -padx $padX
    }
    if {[info exists data($col-labelimage)]} {
	set imageWidth [image width $data($col-labelimage)]
	$w-tl configure -anchor $anchor -justify $alignment
    } else {
	set imageWidth 0
    }

    #
    # Make room for the canvas displaying an up- or down-arrow if needed
    #
    set title [lindex $data(-columns) [expr {3*$col + 1}]]
    set labelFont [$w cget -font]
    if {[lsearch -exact $data(arrowColList) $col] >= 0} {
	set spaceWidth [font measure $labelFont -displayof $w " "]
	set canvas $data(hdrTxtFrCanv)$col
	set canvasWidth $data(arrowWidth)
	if {[llength $data(arrowColList)] > 1} {
	    incr canvasWidth 6
	    $canvas itemconfigure sortRank \
		    -image sortRank$data($col-sortRank)$win
	}
	$canvas configure -width $canvasWidth
	set spaces "  "
	set n 2
	while {$n*$spaceWidth < $canvasWidth + $data(charWidth)} {
	    append spaces " "
	    incr n
	}
	set spacePixels [expr {$n * $spaceWidth}]
    } else {
	set spaces ""
	set spacePixels 0
    }

    set data($col-isSnipped) 0
    if {$pixels == 0} {				;# convention: dynamic width
	#
	# Set the label text
	#
	if {$imageWidth == 0} {				;# no image
	    if {[string length $title] == 0} {
		set text $spaces
	    } else {
		set lines {}
		foreach line [split $title "\n"] {
		    if {[string compare $alignment "right"] == 0} {
			lappend lines $spaces$line
		    } else {
			lappend lines $line$spaces
		    }
		}
		set text [join $lines "\n"]
	    }
	    $w configure -text $text
	} elseif {[string length $title] == 0} {	;# image w/o text
	    $w configure -text ""
	    set text $spaces
	    $w-tl configure -text $text
	    $w-il configure -width $imageWidth
	} else {					;# both image and text
	    $w configure -text ""
	    set lines {}
	    foreach line [split $title "\n"] {
		if {[string compare $alignment "right"] == 0} {
		    lappend lines "$spaces$line "
		} else {
		    lappend lines " $line$spaces"
		}
	    }
	    set text [join $lines "\n"]
	    $w-tl configure -text $text
	    $w-il configure -width $imageWidth
	}
    } else {
	#
	# Clip each line of title according to pixels and alignment
	#
	set lessPixels [expr {$pixels - $spacePixels}]
	variable snipSides
	set snipSide $snipSides($alignment,$data($col-changetitlesnipside))
	if {$imageWidth == 0} {				;# no image
	    if {[string length $title] == 0} {
		set text $spaces
	    } else {
		set lines {}
		foreach line [split $title "\n"] {
		    set lineSav $line
		    set line [strRange $win $line $labelFont \
			      $lessPixels $snipSide $data(-snipstring)]
		    if {[string compare $line $lineSav] != 0} {
			set data($col-isSnipped) 1
		    }
		    if {[string compare $alignment "right"] == 0} {
			lappend lines $spaces$line
		    } else {
			lappend lines $line$spaces
		    }
		}
		set text [join $lines "\n"]
	    }
	    $w configure -text $text
	} elseif {[string length $title] == 0} {	;# image w/o text
	    $w configure -text ""
	    if {$imageWidth + $spacePixels <= $pixels} {
		set text $spaces
		$w-tl configure -text $text
		$w-il configure -width $imageWidth
	    } elseif {$spacePixels < $pixels} {
		set text $spaces
		$w-tl configure -text $text
		$w-il configure -width [expr {$pixels - $spacePixels}]
	    } else {
		set imageWidth 0			;# can't disp. the image
		set text ""
	    }
	} else {					;# both image and text
	    $w configure -text ""
	    set gap [font measure $labelFont -displayof $win " "]
	    if {$imageWidth + $gap + $spacePixels <= $pixels} {
		incr lessPixels -[expr {$imageWidth + $gap}]
		set lines {}
		foreach line [split $title "\n"] {
		    set lineSav $line
		    set line [strRange $win $line $labelFont \
			      $lessPixels $snipSide $data(-snipstring)]
		    if {[string compare $line $lineSav] != 0} {
			set data($col-isSnipped) 1
		    }
		    if {[string compare $alignment "right"] == 0} {
			lappend lines "$spaces$line "
		    } else {
			lappend lines " $line$spaces"
		    }
		}
		set text [join $lines "\n"]
		$w-tl configure -text $text
		$w-il configure -width $imageWidth
	    } elseif {$imageWidth + $spacePixels <= $pixels} {	
		set data($col-isSnipped) 1
		set text $spaces		;# can't display the orig. text
		$w-tl configure -text $text
		$w-il configure -width $imageWidth
	    } elseif {$spacePixels < $pixels} {
		set data($col-isSnipped) 1
		set text $spaces		;# can't display the orig. text
		$w-tl configure -text $text
		$w-il configure -width [expr {$pixels - $spacePixels}]
	    } else {
		set data($col-isSnipped) 1
		set imageWidth 0		;# can't display the image
		set text ""			;# can't display the text
	    }
	}
    }

    #
    # Place the label's sublabels (if any)
    #
    if {$imageWidth == 0} {
	if {[info exists data($col-labelimage)]} {
	    place forget $w-il
	    place forget $w-tl
	}
    } else {
	if {[string length $text] == 0} {
	    place forget $w-tl
	}

	variable usingTile
	switch $alignment {
	    left {
		place $w-il -in $w -anchor w -bordermode outside \
			    -relx 0.0 -x $marginL -rely 0.49
		raise $w-il
		if {$usingTile} {
		    set padding [$w cget -padding]
		    lset padding 0 [incr padL [winfo reqwidth $w-il]]
		    $w configure -padding $padding -text $text
		} elseif {[string length $text] != 0} {
		    set textX [expr {$marginL + [winfo reqwidth $w-il]}]
		    place $w-tl -in $w -anchor w -bordermode outside \
				-relx 0.0 -x $textX -rely 0.49
		}
	    }

	    right {
		place $w-il -in $w -anchor e -bordermode outside \
			    -relx 1.0 -x -$marginR -rely 0.49
		raise $w-il
		if {$usingTile} {
		    set padding [$w cget -padding]
		    lset padding 2 [incr padR [winfo reqwidth $w-il]]
		    $w configure -padding $padding -text $text
		} elseif {[string length $text] != 0} {
		    set textX [expr {-$marginR - [winfo reqwidth $w-il]}]
		    place $w-tl -in $w -anchor e -bordermode outside \
				-relx 1.0 -x $textX -rely 0.49
		}
	    }

	    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
		} 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
		    }
		}
		raise $w-il
	    }
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::computeColWidth
#
# Computes the width of the col'th column of the tablelist widget win to be just
# large enough to hold all the elements of the column (including its label).
#------------------------------------------------------------------------------
proc tablelist::computeColWidth {win col} {
    upvar ::tablelist::ns${win}::data data
    set fmtCmdFlag [lindex $data(fmtCmdFlagList) $col]
    set data($col-elemWidth) 0
    set data($col-widestCount) 0

    #
    # Column elements
    #
    set row -1
    foreach item $data(itemList) {
	incr row

	if {$col >= [llength $item] - 1} {
	    continue
	}

	set key [lindex $item end]
	if {[info exists data($key-elide)] || [info exists data($key-hide)]} {
	    continue
	}

	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
	getIndentData $win $key $col indentWidth
	set cellFont [getCellFont $win $key $col]
	set elemWidth [getElemWidth $win $text $auxWidth $indentWidth $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
	}
    }
    set data($col-reqPixels) $data($col-elemWidth)

    #
    # Column label
    #
    computeLabelWidth $win $col
}

#------------------------------------------------------------------------------
# tablelist::computeLabelWidth
#
# Computes the 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
    set w $data(hdrTxtFrLbl)$col
    if {[info exists data($col-labelimage)]} {
	variable usingTile
	if {$usingTile} {
	    set netLabelWidth [expr {[winfo reqwidth $w] - 2*$data(charWidth)}]
	} else {
	    set netLabelWidth \
		[expr {[winfo reqwidth $w-il] + [winfo reqwidth $w-tl]}]
	}
    } else {
	set netLabelWidth [expr {[winfo reqwidth $w] - 2*$data(charWidth)}]
    }

    if {$netLabelWidth < $data($col-elemWidth)} {
	set data($col-reqPixels) $data($col-elemWidth)
    } else {
	set data($col-reqPixels) $netLabelWidth
    }
}

#------------------------------------------------------------------------------
# tablelist::adjustHeaderHeight
#
# Sets the height of the header frame of the tablelist widget win to the max.
# height of its children.
#------------------------------------------------------------------------------
proc tablelist::adjustHeaderHeight win {
    #
    # Compute the max. label height
    #
    upvar ::tablelist::ns${win}::data data
    set maxLabelHeight [winfo reqheight $data(hdrFrLbl)]
    for {set col 0} {$col < $data(colCount)} {incr col} {
	set w $data(hdrTxtFrLbl)$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} {
		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(hdrTxtFr) configure -height $maxLabelHeight
    if {$data(-showlabels)} {
	$data(hdr) configure -height $maxLabelHeight
	place configure $data(hdrTxt) -y 0
	place configure $data(hdrFr) -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

	$data(corner) configure -height 1
	place configure $data(cornerLbl) -y -1
    }
    adjustSepsWhenIdle $win
}

#------------------------------------------------------------------------------
# tablelist::stretchColumnsWhenIdle
#
# Arranges for the stretchable columns of the tablelist widget win to be
# stretched at idle time.
#------------------------------------------------------------------------------
proc tablelist::stretchColumnsWhenIdle win {
    upvar ::tablelist::ns${win}::data data
    if {[info exists data(stretchId)]} {
	return ""
    }

    set data(stretchId) [after idle [list tablelist::stretchColumns $win -1]]
}

#------------------------------------------------------------------------------
# tablelist::stretchColumns
#
# Stretches the stretchable columns to fill the tablelist window win
# horizontally.  The colOfFixedDelta argument specifies the column for which
# the stretching is to be made using a precomputed amount of pixels.
#------------------------------------------------------------------------------
proc tablelist::stretchColumns {win colOfFixedDelta} {
    upvar ::tablelist::ns${win}::data data
    if {[info exists data(stretchId)]} {
	after cancel $data(stretchId)
	unset data(stretchId)
    }

    set forceAdjust $data(forceAdjust)
    set data(forceAdjust) 0

    if {$data(hdrPixels) == 0 || $data(-width) <= 0} {
	return ""
    }

    #
    # Get the list data(stretchableCols) of the
    # numerical indices of the stretchable columns
    #
    set data(stretchableCols) {}
    if {[string compare $data(-stretch) "all"] == 0} {
	for {set col 0} {$col < $data(colCount)} {incr col} {
	    lappend data(stretchableCols) $col
	}
    } else {
	foreach col $data(-stretch) {
	    lappend data(stretchableCols) [colIndex $win $col 0]
	}
    }

    #
    # Compute the total number data(delta) of pixels by which the
    # columns are to be stretched and the total amount
    # data(stretchablePixels) of stretchable column widths in pixels
    #
    set data(delta) [winfo width $data(hdr)]
    set data(stretchablePixels) 0
    set lastColToStretch -1
    set col 0
    foreach {pixels alignment} $data(colList) {
	if {$data($col-hide)} {
	    incr col
	    continue
	}

	if {$pixels == 0} {			;# convention: dynamic width
	    set pixels $data($col-reqPixels)
	    if {$data($col-maxPixels) > 0} {
		if {$pixels > $data($col-maxPixels)} {
		    set pixels $data($col-maxPixels)
		}
	    }
	}
	incr data(delta) -[expr {$pixels + 2*$data(charWidth)}]
	if {[lsearch -exact $data(stretchableCols) $col] >= 0} {
	    incr data(stretchablePixels) $pixels
	    set lastColToStretch $col
	}

	incr col
    }
    if {$data(delta) < 0} {
	set delta 0
    } else {
	set delta $data(delta)
    }
    if {$data(stretchablePixels) == 0 && !$forceAdjust} {
	return ""
    }

    #
    # Distribute the value of delta to the stretchable
    # columns, proportionally to their widths in pixels
    #
    set rest $delta
    set col 0
    foreach {pixels alignment} $data(colList) {
	if {$data($col-hide) ||
	    [lsearch -exact $data(stretchableCols) $col] < 0} {
	    set data($col-delta) 0
	} else {
	    set oldDelta $data($col-delta)
	    if {$pixels == 0} {			;# convention: dynamic width
		set dynamic 1
		set pixels $data($col-reqPixels)
		if {$data($col-maxPixels) > 0} {
		    if {$pixels > $data($col-maxPixels)} {
			set pixels $data($col-maxPixels)
			set dynamic 0
		    }
		}
	    } else {
		set dynamic 0
	    }
	    if {$data(stretchablePixels) == 0} {
		set data($col-delta) 0
	    } else {
		if {$col != $colOfFixedDelta} {
		    set data($col-delta) \
			[expr {$delta*$pixels/$data(stretchablePixels)}]
		}
		incr rest -$data($col-delta)
	    }
	    if {$col == $lastColToStretch} {
		incr data($col-delta) $rest
	    }
	    if {!$dynamic && $data($col-delta) != $oldDelta} {
		redisplayColWhenIdle $win $col
	    }
	}

	incr col
    }

    #
    # Adjust the columns and schedule a view update for execution at idle time
    #
    adjustColumns $win {} 0
    updateViewWhenIdle $win 1
}

#------------------------------------------------------------------------------
# tablelist::moveActiveTag
#
# Moves the "active" tag to the line or cell that displays the active item or
# element of the tablelist widget win in its body text child.
#------------------------------------------------------------------------------
proc tablelist::moveActiveTag win {
    upvar ::tablelist::ns${win}::data data
    set w $data(body)
    $w tag remove active 1.0 end

    if {$data(itemCount) == 0 || $data(colCount) == 0} {
	return ""
    }

    set activeLine [expr {$data(activeRow) + 1}]
    set activeCol $data(activeCol)
    if {[string compare $data(-selecttype) "row"] == 0} {
	$w tag add active $activeLine.0 $activeLine.end
	updateColors $win $activeLine.0 $activeLine.end
    } elseif {$activeLine > 0 && $activeCol < $data(colCount) &&
	      !$data($activeCol-hide)} {
	findTabs $win $activeLine $activeCol $activeCol tabIdx1 tabIdx2
	$w tag add active $tabIdx1 $tabIdx2+1c
	updateColors $win $tabIdx1 $tabIdx2+1c
    }
}

#------------------------------------------------------------------------------
# tablelist::updateColorsWhenIdle
#
# 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.
#------------------------------------------------------------------------------
proc tablelist::updateColorsWhenIdle win {
    upvar ::tablelist::ns${win}::data data
    if {[info exists data(colorsId)]} {
	return ""
    }

    set data(colorsId) [after idle [list tablelist::updateColors $win]]
}

#------------------------------------------------------------------------------
# tablelist::updateColors
#
# 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.
#------------------------------------------------------------------------------
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)]} {
	    after cancel $data(colorsId)
	    unset data(colorsId)
	}
    } else {
	set updateAll 0
    }

    if {$updateAll} {
	if {$data(isDisabled)} {
	    $w tag add disabled $fromTextIdx $toTextIdx
	}

	variable canElide
	variable elide
	set topLine [expr {int([$w index @0,0])}]
	set btmLine [expr {int([$w index @0,$data(btmY)])}]
	if {$btmLine > $data(itemCount)} {		;# text widget bug
	    set btmLine $data(itemCount)
	}
	for {set line $topLine; set row [expr {$line - 1}]} \
	    {$line <= $btmLine} {set row $line; incr line} {
	    set key [lindex $data(keyList) $row]
	    if {[info exists data($key-elide)] ||
		[info exists data($key-hide)]} {
		continue
	    }

	    #
	    # Handle the -stripebackground and -stripeforeground
	    # column configuration options, as well as the
	    # -(select)background and -(select)foreground column,
	    # row, and cell configuration options in this row
	    #
	    set textIdx1 $line.0
	    set lineTagNames [$w tag names $textIdx1]
	    set inStripe [expr {[lsearch -exact $lineTagNames stripe] >= 0}]
	    for {set col 0} {$col < $data(colCount)} {incr col} {
		if {$data($col-hide) && !$canElide} {
		    continue
		}

		set tabIdx2 [$w search $elide "\t" $textIdx1+1c $line.end]
		set textIdx2 $tabIdx2+1c

		set cellTagNames [$w tag names $tabIdx2]
		foreach tag $cellTagNames {
		    if {[string match "*-*ground-*" $tag]} {
			$w tag remove $tag $textIdx1 $textIdx2
		    }
		}

		if {$inStripe} {
		    foreach opt {-stripebackground -stripeforeground} {
			set name $col$opt
			if {[info exists data($name)]} {
			    $w tag add col$opt-$data($name) $textIdx1 $textIdx2
			}
		    }
		}

		set selected [expr {[lsearch -exact $cellTagNames select] >= 0}]
		foreach optTail {background foreground} {
		    set normalOpt -$optTail
		    set selectOpt -select$optTail
		    foreach level      [list col row cell] \
			    normalName [list $col$normalOpt $key$normalOpt \
					$key,$col$normalOpt] \
			    selectName [list $col$selectOpt $key$selectOpt \
					$key,$col$selectOpt] {
			if {$selected} {
			    if {[info exists data($selectName)]} {
				$w tag add $level$selectOpt-$data($selectName) \
				       $textIdx1 $textIdx2
			    }
			} else {
			    if {[info exists data($normalName)]} {
				$w tag add $level$normalOpt-$data($normalName) \
				       $textIdx1 $textIdx2
			    }
			}
		    }
		}

		set textIdx1 $textIdx2
	    }
	}
    }

    set hasExpCollCtrlSelImgs [expr {$::tk_version >= 8.3 &&
	[info exists tablelist::$data(-treestyle)_collapsedSelImg]}]

    foreach {dummy path textIdx} [$w dump -window $fromTextIdx $toTextIdx] {
	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] ","] {}
	if {[info exists data($key-elide)] || [info exists data($key-hide)]} {
	    continue
	}

	set tagNames [$w tag names $textIdx]
	set selected [expr {[lsearch -exact $tagNames select] >= 0}]

	#
	# If the widget is an indentation label then conditionally remove the
	# "active" and "select" tags from its text position and the preceding
	# one, or change its image to become the "normal" or "selected" one
	#
	if {[string compare $path $w.ind_$key,$col] == 0} {
	    if {$data(protectIndents)} {
		set fromTextIdx [$w index $textIdx-1c]
		set toTextIdx   [$w index $textIdx+1c]

		$w tag remove active $fromTextIdx $toTextIdx

		if {$updateAll && $selected} {
		    $w tag remove select $fromTextIdx $toTextIdx
		    foreach tag [$w tag names $fromTextIdx] {
			if {[string match "*-selectbackground-*" $tag] ||
			    [string match "*-selectforeground-*" $tag]} {
			    $w tag remove $tag $fromTextIdx $toTextIdx
			}
		    }
		    set selected 0
		}
	    } elseif {$hasExpCollCtrlSelImgs} {
		set curImgName [$path cget -image]
		if {$selected} {
		    set newImgName [strMap {
			"SelActImg" "SelActImg" "ActImg" "SelActImg"
			"SelImg" "SelImg" "collapsedImg" "collapsedSelImg"
			"expandedImg" "expandedSelImg"
		    } $curImgName]
		} else {
		    set newImgName [strMap {"Sel" ""} $curImgName]
		}

		if {[string compare $curImgName $newImgName] != 0} {
		    set data($key,$col-indent) $newImgName
		    $path configure -image $data($key,$col-indent)
		}
	    }
	}

	if {!$updateAll} {
	    continue
	}

	#
	# 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)
	} elseif {$selected} {
	    if {[info exists data($key,$col-selectbackground)]} {
		set bg $data($key,$col-selectbackground)
	    } elseif {[info exists data($key-selectbackground)]} {
		set bg $data($key-selectbackground)
	    } elseif {[info exists data($col-selectbackground)]} {
		set bg $data($col-selectbackground)
	    } else {
		set bg $data(-selectbackground)
	    }

	    if {$isMessage || $isTblWin} {
		if {[info exists data($key,$col-selectforeground)]} {
		    set fg $data($key,$col-selectforeground)
		} elseif {[info exists data($key-selectforeground)]} {
		    set fg $data($key-selectforeground)
		} elseif {[info exists data($col-selectforeground)]} {
		    set fg $data($col-selectforeground)
		} else {
		    set fg $data(-selectforeground)
		}
	    }
	} 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)
	    } elseif {[lsearch -exact $tagNames stripe] >= 0} {
		if {[info exists data($col-stripebackground)]} {
		    set bg $data($col-stripebackground)
		} elseif {[string length $data(-stripebackground)] != 0} {
		    set bg $data(-stripebackground)
		} else {
		    set bg $data(-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)
		} elseif {[lsearch -exact $tagNames stripe] >= 0} {
		    if {[info exists data($col-stripeforeground)]} {
			set fg $data($col-stripeforeground)
		    } elseif {[string length $data(-stripeforeground)] != 0} {
			set fg $data(-stripeforeground)
		    } else {
			set fg $data(-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 [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
	adjustElidedText $win
	redisplayVisibleItems $win
    }
}

#------------------------------------------------------------------------------
# tablelist::updateHScrlbarWhenIdle
#
# Arranges for the horizontal scrollbar associated with the tablelist widget
# win to be updated at idle time.
#------------------------------------------------------------------------------
proc tablelist::updateHScrlbarWhenIdle win {
    upvar ::tablelist::ns${win}::data data
    if {[info exists data(hScrlbarId)]} {
	return ""
    }

    set data(hScrlbarId) [after idle [list tablelist::updateHScrlbar $win]]
}

#------------------------------------------------------------------------------
# tablelist::updateHScrlbar
#
# Updates the horizontal scrollbar associated with the tablelist widget win by
# invoking the command specified as the value of the -xscrollcommand option.
#------------------------------------------------------------------------------
proc tablelist::updateHScrlbar win {
    upvar ::tablelist::ns${win}::data data
    if {[info exists data(hScrlbarId)]} {
	after cancel $data(hScrlbarId)
	unset data(hScrlbarId)
    }

    if {$data(-titlecolumns) > 0 &&
	[string length $data(-xscrollcommand)] != 0} {
	eval $data(-xscrollcommand) [xviewSubCmd $win {}]
    }
}

#------------------------------------------------------------------------------
# tablelist::updateVScrlbarWhenIdle
#
# Arranges for the vertical scrollbar associated with the tablelist widget win
# to be updated at idle time.
#------------------------------------------------------------------------------
proc tablelist::updateVScrlbarWhenIdle win {
    upvar ::tablelist::ns${win}::data data
    if {[info exists data(vScrlbarId)]} {
	return ""
    }

    set data(vScrlbarId) [after idle [list tablelist::updateVScrlbar $win]]
}

#------------------------------------------------------------------------------
# tablelist::updateVScrlbar
#
# Updates the vertical scrollbar associated with the tablelist widget win by
# invoking the command specified as the value of the -yscrollcommand option.
#------------------------------------------------------------------------------
proc tablelist::updateVScrlbar win {
    upvar ::tablelist::ns${win}::data data
    if {[info exists data(vScrlbarId)]} {
	after cancel $data(vScrlbarId)
	unset data(vScrlbarId)
    }

    if {[string length $data(-yscrollcommand)] != 0} {
	eval $data(-yscrollcommand) [yviewSubCmd $win {}]
    }

    if {[winfo viewable $win] && ![info exists data(colBeingResized)] &&
	![info exists data(redrawId)]} {
	set data(redrawId) [after 50 [list tablelist::forceRedraw $win]]
    }

    if {$data(gotConfigureEvent)} {
	set data(gotConfigureEvent) 0
    } else {
	purgeWidgets $win
    }
}

#------------------------------------------------------------------------------
# tablelist::forceRedraw
#
# Enforces a redraw of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::forceRedraw win {
    upvar ::tablelist::ns${win}::data data
    if {[info exists data(redrawId)]} {
	after cancel $data(redrawId)
	unset data(redrawId)
    }

    set w $data(body)
    set fromTextIdx "[$w index @0,0] linestart"
    set toTextIdx "[$w index @0,$data(btmY)] lineend"
    $w tag add redraw $fromTextIdx $toTextIdx
    $w tag remove redraw $fromTextIdx $toTextIdx

    variable winSys
    if {[string compare $winSys "aqua"] == 0} {
	#
	# Work around some Tk bugs on Mac OS X Aqua
	#
	raise $w
	lower $w
	if {[winfo exists $data(bodyFr)]} {
	    lower $data(bodyFr)
	    raise $data(bodyFr)
	}
    }
}

#------------------------------------------------------------------------------
# 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
#
# Updates the elided text ranges of the body text child of the tablelist widget
# win.
#------------------------------------------------------------------------------
proc tablelist::adjustElidedText win {
    upvar ::tablelist::ns${win}::data data
    if {[info exists data(dispId)]} {
	return ""
    }

    #
    # Remove the "hiddenCol" tag
    #
    set w $data(body)
    $w tag remove hiddenCol 1.0 end

    #
    # Add the "hiddenCol" tag to the contents of the hidden
    # columns from the top to the bottom window line
    #
    variable canElide
    variable elide
    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
	    set btmLine $data(itemCount)
	}
	for {set line $topLine; set row [expr {$line - 1}]} \
	    {$line <= $btmLine} {set row $line; incr line} {
	    set key [lindex $data(keyList) $row]
	    if {[info exists data($key-elide)] ||
		[info exists data($key-hide)]} {
		continue
	    }

	    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+1c $line.end]+1c
		if {[string compare $textIdx2 "+1c"] == 0} {
		    break
		}
		if {$data($col-hide)} {
		    incr count
		    $w tag add hiddenCol $textIdx1 $textIdx2
		}
		set textIdx1 $textIdx2
	    }

	    #
	    # Update btmLine because it may
	    # change due to the "hiddenCol" tag
	    #
	    set btmLine [expr {int([$w index @0,$data(btmY)])}]
	    if {$btmLine > $data(itemCount)} {		;# text widget bug
		set btmLine $data(itemCount)
	    }
	}

	if {[lindex [$w yview] 1] == 1} {
	    for {set line $btmLine; set row [expr {$line - 1}]} \
		{$line >= $topLine} {set line $row; incr row -1} {
		set key [lindex $data(keyList) $row]
		if {[info exists data($key-elide)] ||
		    [info exists data($key-hide)]} {
		    continue
		}

		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+1c $line.end]+1c
		    if {[string compare $textIdx2 "+1c"] == 0} {
			break
		    }
		    if {$data($col-hide)} {
			incr count
			$w tag add hiddenCol $textIdx1 $textIdx2
		    }
		    set textIdx1 $textIdx2
		}

		#
		# Update topLine because it may
		# change due to the "hiddenCol" tag
		#
		set topLine [expr {int([$w index @0,0])}]
	    }
	}
    }

    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 from the top to the bottom window line
    #
    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
	    set btmLine $data(itemCount)
	}
	for {set line $topLine; set row [expr {$line - 1}]} \
	    {$line <= $btmLine} {set row $line; incr line} {
	    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
		}
	    }

	    #
	    # 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
		set btmLine $data(itemCount)
	    }
	}

	if {[lindex [$w yview] 1] == 1} {
	    for {set line $btmLine; set row [expr {$line - 1}]} \
		{$line >= $topLine} {set line $row; incr row -1} {
		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
		    }
		}

		#
		# Update topLine because it may
		# change due to the "elidedCol" tag
		#
		set topLine [expr {int([$w index @0,0])}]
	    }
	}
    }

    #
    # Adjust the columns
    #
    for {set col $firstCol} {$col <= $lastCol} {incr col} {
	set data($col-elide) 1
    }
    adjustColumns $win {} 0
}

#------------------------------------------------------------------------------
# tablelist::redisplayWhenIdle
#
# Arranges for the items of the tablelist widget win to be redisplayed at idle
# time.
#------------------------------------------------------------------------------
proc tablelist::redisplayWhenIdle win {
    upvar ::tablelist::ns${win}::data data
    if {[info exists data(redispId)] || $data(itemCount) == 0} {
	return ""
    }

    set data(redispId) [after idle [list tablelist::redisplay $win]]

    #
    # Cancel the execution of all delayed redisplayCol commands
    #
    foreach name [array names data *-redispId] {
	after cancel $data($name)
	unset data($name)
    }
}

#------------------------------------------------------------------------------
# tablelist::redisplay
#
# Redisplays the items of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::redisplay {win {getSelCells 1} {selCells {}}} {
    upvar ::tablelist::ns${win}::data data
    if {[info exists data(redispId)]} {
	after cancel $data(redispId)
	unset data(redispId)
    }

    #
    # Save the indices of the selected cells
    #
    if {$getSelCells} {
	set selCells [curCellSelection $win]
    }

    #
    # Save some data of the edit window if present
    #
    if {[set editCol $data(editCol)] >= 0} {
	set editRow $data(editRow)
	saveEditData $win
    }

    set w $data(body)
    set snipStr $data(-snipstring)
    set rowTagRefCount $data(rowTagRefCount)
    set cellTagRefCount $data(cellTagRefCount)
    set isSimple [expr {$data(imgCount) == 0 && $data(winCount) == 0 &&
			$data(indentCount) == 0}]
    set padY [expr {[$w cget -spacing1] == 0}]
    variable canElide
    variable snipSides
    set newItemList {}
    set row 0
    set line 1
    foreach item $data(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]
	if {$rowTagRefCount == 0} {
	    set hasRowFont 0
	} else {
	    set hasRowFont [info exists data($key-font)]
	}
	set newItem {}
	set col 0
	if {$isSimple} {
	    set insertArgs {}
	    set multilineData {}
	    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 {$cellTagRefCount != 0} {
		    if {[info exists data($key,$col-font)]} {
			set cellFont $data($key,$col-font)
			lappend cellTags cell-font-$data($key,$col-font)
		    }
		}

		#
		# Clip the element if necessary
		#
		set multiline [string match "*\n*" $text]
		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)

		    if {$data($col-wrap) && !$multiline} {
			if {[font measure $cellFont -displayof $win $text] >
			    $pixels} {
			    set multiline 1
			}
		    }

		    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]
		    }
		}

		lappend insertArgs "\t\t" $cellTags
		if {$multiline} {
		    lappend multilineData $col $text $cellFont $pixels \
					  $alignment
		}

		incr col
	    }

	    #
	    # Insert the item into the body 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 {
		if {[findTabs $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
		    $w tag add elidedWin $tabIdx2
		}
	    }

	} else {
	    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 {$cellTagRefCount != 0} {
		    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 body text widget
		#
		appendComplexElem $win $key $row $col $text $pixels \
				  $alignment $snipStr $cellFont $cellTags $line

		incr col
	    }
	}

	if {$rowTagRefCount != 0} {
	    if {[info exists data($key-font)]} {
		$w tag add row-font-$data($key-font) $line.0 $line.end
	    }
	}

	if {[info exists data($key-elide)]} {
	    $w tag add elidedRow $line.0 $line.end+1c
	}
	if {[info exists data($key-hide)]} {
	    $w tag add hiddenRow $line.0 $line.end+1c
	}

	lappend newItem $key
	lappend newItemList $newItem

	set row $line
	incr line
    }

    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
    #
    if {$data(ownsFocus)} {
	moveActiveTag $win
    }

    #
    # Adjust the elided text and restore the stripes in the body text widget
    #
    adjustElidedText $win
    redisplayVisibleItems $win
    makeStripes $win

    #
    # Restore the edit window if it was present before
    #
    if {$editCol >= 0} {
	doEditCell $win $editRow $editCol 1
    }
}

#------------------------------------------------------------------------------
# tablelist::redisplayVisibleItems
#
# Redisplays the visible items of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::redisplayVisibleItems win {
    upvar ::tablelist::ns${win}::data data
    if {$data(itemCount) == 0} {
	return ""
    }

    variable canElide
    variable elide
    variable snipSides

    displayItems $win
    set w $data(body)

    set fromTextIdx "[$w index @0,0] linestart"
    set toTextIdx "[$w index @0,$data(btmY)] lineend"
    $w tag remove elidedWin $fromTextIdx $toTextIdx

    set topLine [expr {int([$w index @0,0])}]
    set btmLine [expr {int([$w index @0,$data(btmY)])}]
    if {$btmLine > $data(itemCount)} {			;# text widget bug
	set btmLine $data(itemCount)
    }
    set snipStr $data(-snipstring)

    for {set line $topLine; set row [expr {$line - 1}]} \
	{$line <= $btmLine} {set row $line; incr line} {
	set item [lindex $data(itemList) $row]
	set key [lindex $item end]
	if {[info exists data($key-elide)] || [info exists data($key-hide)]} {
	    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]
	}

	set tabIdx1 $line.0
	set col 0
	foreach text $dispItem \
		colFont $data(colFontList) \
		colTags $data(colTagsList) \
		{pixels alignment} $data(colList) {
	    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
	    #
	    if {[string length $text] == 0 ||
		[string length [$w get $tabIdx1+1c $tabIdx2]] != 0 ||
		($row == $data(editRow) && $col == $data(editCol))} {
		set tabIdx1 [$w index $tabIdx2+1c]
		incr col
		continue
	    }

	    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)
	    }

	    #
	    # Nothing to do if the cell has an (indentation)
	    # image or window, or contains multiline text
	    #
	    set aux [getAuxData $win $key $col auxType auxWidth $pixels]
	    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
		continue
	    }

	    #
	    # Adjust the cell text
	    #
	    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 $indentWidth]

		if {$data($col-wrap) && !$multiline} {
		    if {[font measure $cellFont -displayof $win $text] >
			$maxTextWidth} {
			#
			# The element is displayed as multiline text
			#
			set tabIdx1 [$w index $tabIdx2+1c]
			incr col
			continue
		    }
		}
	    }
	    set snipSide $snipSides($alignment,$data($col-changesnipside))
	    adjustElem $win text auxWidth indentWidth $cellFont $pixels \
		       $snipSide $snipStr

	    #
	    # 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 \
		       $indent $indentWidth $alignment ""

	    set tabIdx1 [$w index tabMark2+1c]
	    incr col
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::redisplayColWhenIdle
#
# Arranges for the elements of the col'th column of the tablelist widget win to
# be redisplayed at idle time.
#------------------------------------------------------------------------------
proc tablelist::redisplayColWhenIdle {win col} {
    upvar ::tablelist::ns${win}::data data
    if {[info exists data($col-redispId)] || [info exists data(redispId)] ||
	$data(itemCount) == 0} {
	return ""
    }

    set data($col-redispId) \
	[after idle [list tablelist::redisplayCol $win $col 0 last]]
}

#------------------------------------------------------------------------------
# tablelist::redisplayCol
#
# Redisplays the elements of the col'th column of the tablelist widget win, in
# the range specified by first and last.
#------------------------------------------------------------------------------
proc tablelist::redisplayCol {win col first last} {
    upvar ::tablelist::ns${win}::data data
    set allRows [expr {$first == 0 && [string compare $last "last"] == 0}]
    if {$allRows && [info exists data($col-redispId)]} {
	after cancel $data($col-redispId)
	unset data($col-redispId)
    }

    if {$data(itemCount) == 0 || $first < 0 ||
	$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} {
	    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}]]
    variable snipSides
    set snipSide $snipSides($alignment,$data($col-changesnipside))

    for {set row $first; set line [expr {$first + 1}]} {$row <= $last} \
	{set row $line; incr line} {
	if {$row == $data(editRow) && $col == $data(editCol)} {
	    continue
	}

	set item [lindex $data(itemList) $row]
	set key [lindex $item end]
	if {!$allRows && ([info exists data($key-elide)] ||
			  [info exists data($key-hide)])} {
	    continue
	}

	#
	# 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 indent [getIndentData $win $key $col indentWidth]
	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 $indentWidth]

	    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 contents between the two tabs
	#
	if {[findTabs $win $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+1c $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]
	    }
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::makeStripesWhenIdle
#
# Arranges for the stripes in the body of the tablelist widget win to be
# redrawn at idle time.
#------------------------------------------------------------------------------
proc tablelist::makeStripesWhenIdle win {
    upvar ::tablelist::ns${win}::data data
    if {[info exists data(stripesId)] || $data(itemCount) == 0} {
	return ""
    }

    set data(stripesId) [after idle [list tablelist::makeStripes $win]]
}

#------------------------------------------------------------------------------
# tablelist::makeStripes
#
# Redraws the stripes in the body of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::makeStripes win {
    upvar ::tablelist::ns${win}::data data
    if {[info exists data(stripesId)]} {
	after cancel $data(stripesId)
	unset data(stripesId)
    }

    if {[info exists data(dispId)]} {
	return ""
    }

    set w $data(body)
    $w tag remove stripe 1.0 end
    if {[string length $data(-stripebackground)] != 0 ||
	[string length $data(-stripeforeground)] != 0} {
	set count 0
	set inStripe 0
	for {set row 0; set line 1} {$row < $data(itemCount)} \
	    {set row $line; incr line} {
	    set key [lindex $data(keyList) $row]
	    if {![info exists data($key-elide)] &&
		![info exists data($key-hide)]} {
		if {$inStripe} {
		    $w tag add stripe $line.0 $line.end
		}

		if {[incr count] == $data(-stripeheight)} {
		    set count 0
		    set inStripe [expr {!$inStripe}]
		}
	    }
	}
    }

    updateColors $win
}

#------------------------------------------------------------------------------
# tablelist::showLineNumbersWhenIdle
#
# Arranges for the line numbers in the tablelist widget win to be redisplayed
# at idle time.
#------------------------------------------------------------------------------
proc tablelist::showLineNumbersWhenIdle win {
    upvar ::tablelist::ns${win}::data data
    if {[info exists data(lineNumsId)] || $data(itemCount) == 0} {
	return ""
    }

    set data(lineNumsId) [after idle [list tablelist::showLineNumbers $win]]
}

#------------------------------------------------------------------------------
# tablelist::showLineNumbers
#
# Redisplays the line numbers (if any) in the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::showLineNumbers win {
    upvar ::tablelist::ns${win}::data data
    if {[info exists data(lineNumsId)]} {
	after cancel $data(lineNumsId)
	unset data(lineNumsId)
    }

    #
    # Update the item list
    #
    set colIdxList {}
    for {set col 0} {$col < $data(colCount)} {incr col} {
	if {!$data($col-showlinenumbers)} {
	    continue
	}

	lappend colIdxList $col

	set newItemList {}
	set line 1
	foreach item $data(itemList) {
	    set item [lreplace $item $col $col $line]
	    lappend newItemList $item
	    set key [lindex $item end]
	    if {![info exists data($key-hide)]} {
		incr line
	    }
	}
	set data(itemList) $newItemList

	redisplayColWhenIdle $win $col
    }

    if {[llength $colIdxList] == 0} {
	return ""
    }

    #
    # Update the list variable if present, and adjust the columns
    #
    condUpdateListVar $win
    adjustColumns $win $colIdxList 1
    return ""
}

#------------------------------------------------------------------------------
# tablelist::updateViewWhenIdle
#
# Arranges for the visible part of the tablelist widget win to be updated
# at idle time.
#------------------------------------------------------------------------------
proc tablelist::updateViewWhenIdle {win {reschedule 0}} {
    upvar ::tablelist::ns${win}::data data
    if {[info exists data(viewId)]} {
	if {$reschedule} {
	    after cancel $data(viewId)
	} else {
	    return ""
	}
    }

    set data(viewId) [after idle [list tablelist::updateView $win]]
}

#------------------------------------------------------------------------------
# tablelist::updateView
#
# Updates the visible part 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)
    }

    adjustElidedText $win
    redisplayVisibleItems $win
    updateColors $win
    adjustSeps $win
    updateVScrlbar $win
}

#------------------------------------------------------------------------------
# tablelist::destroyWidgets
#
# Destroys a list of widgets embedded into the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::destroyWidgets win {
    upvar ::tablelist::ns${win}::data data
    set destroyId [lindex $data(destroyIdList) 0]

    eval destroy $data(widgets-$destroyId)

    set data(destroyIdList) [lrange $data(destroyIdList) 1 end]
    unset data(widgets-$destroyId)
}

#------------------------------------------------------------------------------
# tablelist::synchronize
#
# This procedure is invoked either as an idle callback after the list variable
# associated with the tablelist widget win was written, or directly, upon
# execution of some widget commands.  It makes sure that the content of the
# widget is synchronized with the value of the list variable.
#------------------------------------------------------------------------------
proc tablelist::synchronize win {
    #
    # Nothing to do if the list variable was not written
    #
    upvar ::tablelist::ns${win}::data data
    if {![info exists data(syncId)]} {
	return ""
    }

    #
    # Here we are in the case that the procedure was scheduled for
    # execution at idle time.  However, it might have been invoked
    # directly, before the idle time occured; in this case we should
    # cancel the execution of the previously scheduled idle callback.
    #
    after cancel $data(syncId)	;# no harm if data(syncId) is no longer valid
    unset data(syncId)

    upvar #0 $data(-listvariable) var
    set newCount [llength $var]
    if {$newCount < $data(itemCount)} {
	#
	# Delete the items with indices >= newCount from the widget
	#
	set updateCount $newCount
	deleteRows $win $newCount $data(lastRow) 0
    } elseif {$newCount > $data(itemCount)} {
	#
	# Insert the items of var with indices
	# >= data(itemCount) into the widget
	#
	set updateCount $data(itemCount)
	insertRows $win $data(itemCount) [lrange $var $data(itemCount) end] 0 \
		   root $data(itemCount)
    } else {
	set updateCount $newCount
    }

    #
    # Update the first updateCount items of the internal list
    #
    set itemsChanged 0
    for {set row 0} {$row < $updateCount} {incr row} {
	set oldItem [lindex $data(itemList) $row]
	set newItem [adjustItem [lindex $var $row] $data(colCount)]
	lappend newItem [lindex $oldItem end]

	if {[string compare $oldItem $newItem] != 0} {
	    set data(itemList) [lreplace $data(itemList) $row $row $newItem]
	    set itemsChanged 1
	}
    }

    #
    # If necessary, adjust the columns and make sure
    # that the items will be redisplayed at idle time
    #
    if {$itemsChanged} {
	adjustColumns $win allCols 1
	redisplayWhenIdle $win
	showLineNumbersWhenIdle $win
	updateViewWhenIdle $win
    }
}

#------------------------------------------------------------------------------
# tablelist::getSublabels
#
# Returns the list of the existing sublabels $w-il and $w-tl associated with
# the label widget w.
#------------------------------------------------------------------------------
proc tablelist::getSublabels w {
    set lst {}
    foreach lbl [list $w-il $w-tl] {
	if {[winfo exists $lbl]} {
	    lappend lst $lbl
	}
    }

    return $lst
}

#------------------------------------------------------------------------------
# tablelist::parseLabelPath
#
# Extracts the path name of the tablelist widget as well as the column number
# from the path name w of a header label.
#------------------------------------------------------------------------------
proc tablelist::parseLabelPath {w winName colName} {
    if {![winfo exists $w]} {
	return 0
    }

    upvar $winName win $colName col
    return [regexp {^(\..+)\.hdr\.t\.f\.l([0-9]+)$} $w dummy win col]
}

#------------------------------------------------------------------------------
# tablelist::configLabel
#
# This procedure configures the label widget w according to the options and
# their values given in args.  It is needed for label widgets with sublabels.
#------------------------------------------------------------------------------
proc tablelist::configLabel {w args} {
    foreach {opt val} $args {
	switch -- $opt {
	    -active {
		if {[string compare [winfo class $w] "TLabel"] == 0} {
		    $w instate !selected {
			set state [expr {$val ? "active" : "!active"}]
			$w state $state
			variable themeDefaults
			if {$val} {
			    set bg $themeDefaults(-labelactiveBg)
			} else {
			    set bg $themeDefaults(-labelbackground)
			}
			foreach l [getSublabels $w] {
			    $l configure -background $bg
			}
		    }
		} else {
		    set state [expr {$val ? "active" : "normal"}]
		    catch {
			$w configure -state $state
			foreach l [getSublabels $w] {
			    $l configure -state $state
			}
		    }
		}

		parseLabelPath $w win col
		upvar ::tablelist::ns${win}::data data
		if {[lsearch -exact $data(arrowColList) $col] >= 0} {
		    configCanvas $win $col
		}
	    }

	    -activebackground -
	    -activeforeground -
	    -disabledforeground -
	    -cursor {
		$w configure $opt $val
		foreach l [getSublabels $w] {
		    $l configure $opt $val
		}
	    }

	    -background -
	    -font {
		if {[string compare [winfo class $w] "TLabel"] == 0 &&
		    [string length $val] == 0} {
		    variable themeDefaults
		    set val $themeDefaults(-label[string range $opt 1 end])
		}
		$w configure $opt $val
		foreach l [getSublabels $w] {
		    $l configure $opt $val
		}
	    }

	    -foreground {
		if {[string compare [winfo class $w] "TLabel"] == 0} {
		    variable themeDefaults
		    if {[string compare [winfo rgb $w $val] [winfo rgb $w \
			 $themeDefaults(-labelforeground)]] == 0} {
			set val ""    ;# for automatic adaptation to the states
		    }
		    $w instate !disabled {
			$w configure $opt $val
		    }
		} else {
		    $w configure $opt $val
		    foreach l [getSublabels $w] {
			$l configure $opt $val
		    }
		}
	    }

	    -padx {
		if {[string compare [winfo class $w] "TLabel"] == 0} {
		    set padding [$w cget -padding]
		    lset padding 0 $val
		    lset padding 2 $val
		    $w configure -padding $padding
		} else {
		    $w configure $opt $val
		}
	    }

	    -pady {
		if {[string compare [winfo class $w] "TLabel"] == 0} {
		    set val [winfo pixels $w $val]
		    set padding [$w cget -padding]
		    lset padding 1 $val
		    lset padding 3 $val
		    $w configure -padding $padding
		} else {
		    $w configure $opt $val
		}
	    }

	    -pressed {
		if {[string compare [winfo class $w] "TLabel"] == 0} {
		    set state [expr {$val ? "pressed" : "!pressed"}]
		    $w state $state
		    variable themeDefaults
		    if {$val} {
			if {[$w instate selected]} {
			    set bg $themeDefaults(-labelselectedpressedBg)
			} else {
			    set bg $themeDefaults(-labelpressedBg)
			}
		    } else {
			if {[$w instate selected]} {
			    set bg $themeDefaults(-labelselectedBg)
			} elseif {[$w instate active]} {
			    set bg $themeDefaults(-labelactiveBg)
			} else {
			    set bg $themeDefaults(-labelbackground)
			}
		    }
		    foreach l [getSublabels $w] {
			$l configure -background $bg
		    }

		    parseLabelPath $w win col
		    upvar ::tablelist::ns${win}::data data
		    if {[lsearch -exact $data(arrowColList) $col] >= 0} {
			configCanvas $win $col
		    }
		}
	    }

	    -selected {
		if {[string compare [winfo class $w] "TLabel"] == 0} {
		    set state [expr {$val ? "selected" : "!selected"}]
		    $w state $state
		    variable themeDefaults
		    if {$val} {
			if {[$w instate pressed]} {
			    set bg $themeDefaults(-labelselectedpressedBg)
			} else {
			    set bg $themeDefaults(-labelselectedBg)
			}
		    } else {
			if {[$w instate pressed]} {
			    set bg $themeDefaults(-labelpressedBg)
			} else {
			    set bg $themeDefaults(-labelbackground)
			}
		    }
		    foreach l [getSublabels $w] {
			$l configure -background $bg
		    }

		    parseLabelPath $w win col
		    upvar ::tablelist::ns${win}::data data
		    if {[lsearch -exact $data(arrowColList) $col] >= 0} {
			configCanvas $win $col
		    }
		}
	    }

	    -state {
		$w configure $opt $val
		if {[string compare [winfo class $w] "TLabel"] == 0} {
		    variable themeDefaults
		    if {[string compare $val "disabled"] == 0} {
			#
			# Set the label's foreground color to the theme-
			# specific one (needed for current tile versions)
			#
			$w configure -foreground ""

			set bg $themeDefaults(-labeldisabledBg)
		    } else {
			#
			# Restore the label's foreground color
			# (needed for current tile versions)
			#
			if {[parseLabelPath $w win col]} {
			    upvar ::tablelist::ns${win}::data data
			    if {[info exists data($col-labelforeground)]} {
				set fg $data($col-labelforeground)
			    } else {
				set fg $data(-labelforeground)
			    }
			    configLabel $w -foreground $fg
			}

			set bg $themeDefaults(-labelbackground)
		    }
		    foreach l [getSublabels $w] {
			$l configure -background $bg
		    }
		} else {
		    foreach l [getSublabels $w] {
			$l configure $opt $val
		    }
		}
	    }

	    default {
		if {[string compare $val [$w cget $opt]] != 0} {
		    $w configure $opt $val
		}
	    }
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::createArrows
#
# Creates two arrows in the canvas w.
#------------------------------------------------------------------------------
proc tablelist::createArrows {w width height relief} {
    if {$height < 6} {
	set wHeight 6
	set y 1
    } else {
	set wHeight $height
	set y 0
    }

    $w configure -width $width -height $wHeight

    #
    # Delete any existing arrow image items from
    # the canvas and the corresponding images
    #
    foreach shape {triangleUp darkLineUp lightLineUp
		   triangleDn darkLineDn lightLineDn} {
	$w delete $shape
	catch {image delete $shape$w}
    }

    #
    # Create the arrow images and canvas image items
    # corresponding to the procedure's arguments
    #
    $relief${width}x${height}Arrows $w
    foreach shape {triangleUp darkLineUp lightLineUp
		   triangleDn darkLineDn lightLineDn} {
	catch {$w create image 0 $y -anchor nw -image $shape$w -tags $shape}
    }

    #
    # Create the sort rank image item
    #
    $w delete sortRank
    set x [expr {$width + 2}]
    set y [expr {$wHeight - 6}]
    $w create image $x $y -anchor nw -tags sortRank
}

#------------------------------------------------------------------------------
# tablelist::configCanvas
#
# Sets the background color of the canvas displaying an up- or down-arrow for
# the given column, and fills the two arrows contained in the canvas.
#------------------------------------------------------------------------------
proc tablelist::configCanvas {win col} {
    upvar ::tablelist::ns${win}::data data
    set w $data(hdrTxtFrLbl)$col

    if {[string compare [winfo class $w] "TLabel"] == 0} {
	variable themeDefaults
	set labelBg $themeDefaults(-labelbackground)
	set fg [$w cget -foreground]
	set labelFg $fg
	if {[string length $fg] == 0} {
	    set labelFg $themeDefaults(-labelforeground)
	}

	if {[$w instate disabled]} {
	    set labelBg $themeDefaults(-labeldisabledBg)
	    set labelFg $themeDefaults(-labeldisabledFg)
	} elseif {[$win instate background]} {
	    set labelBg $themeDefaults(-labeldeactivatedBg)
	} else {
	    foreach state {active pressed selected} {
		$w instate $state {
		    set labelBg $themeDefaults(-label${state}Bg)
		    if {[string length $fg] == 0} {
			set labelFg $themeDefaults(-label${state}Fg)
		    }
		}
	    }
	    $w instate {selected pressed} {
		set labelBg $themeDefaults(-labelselectedpressedBg)
		if {[string length $fg] == 0} {
		    set labelFg $themeDefaults(-labelselectedpressedFg)
		}
	    }
	}
    } else {
	set labelBg [$w cget -background]
	set labelFg [$w cget -foreground]

	catch {
	    set state [$w cget -state]
	    if {[string compare $state "disabled"] == 0} {
		set labelFg [$w cget -disabledforeground]
	    } elseif {[string compare $state "active"] == 0} {
		variable winSys
		if {!([string compare $winSys "classic"] == 0 ||
		      [string compare $winSys "aqua"] == 0) ||
		    $::tk_version > 8.4} {
		    set labelBg [$w cget -activebackground]
		    set labelFg [$w cget -activeforeground]
		}
	    }
	}
    }

    set canvas $data(hdrTxtFrCanv)$col
    $canvas configure -background $labelBg
    sortRank$data($col-sortRank)$win configure -foreground $labelFg

    if {$data(isDisabled)} {
	fillArrows $canvas $data(-arrowdisabledcolor) $data(-arrowstyle)
    } else {
	fillArrows $canvas $data(-arrowcolor) $data(-arrowstyle)
    }
}

#------------------------------------------------------------------------------
# tablelist::fillArrows
#
# Fills the two arrows contained in the canvas w with the given color, or with
# the background color of the canvas if color is an empty string.  Also fills
# the arrow's borders (if any) with the corresponding 3-D shadow colors.
#------------------------------------------------------------------------------
proc tablelist::fillArrows {w color arrowStyle} {
    set bgColor [$w cget -background]
    if {[string length $color] == 0} {
	set color $bgColor
    }

    getShadows $w $color darkColor lightColor

    foreach dir {Up Dn} {
	#
	# Need catch because the triangle may be a photo image
	#
	catch {triangle$dir$w configure -foreground $color -background $bgColor}

	if {[string match "sunken*" $arrowStyle]} {
	    darkLine$dir$w  configure -foreground $darkColor
	    lightLine$dir$w configure -foreground $lightColor
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::getShadows
#
# Computes the shadow colors for a 3-D border from a given (background) color.
# This is the Tcl-counterpart of the function TkpGetShadows() in the Tk
# distribution file unix/tkUnix3d.c.
#------------------------------------------------------------------------------
proc tablelist::getShadows {w color darkColorName lightColorName} {
    upvar $darkColorName darkColor $lightColorName lightColor

    set rgb [winfo rgb $w $color]
    foreach {r g b} $rgb {}
    set maxIntens [lindex [winfo rgb $w white] 0]

    #
    # Compute the dark shadow color
    #
    if {[string compare $::tk_patchLevel "8.3.1"] >= 0 &&
	$r*0.5*$r + $g*1.0*$g + $b*0.28*$b < $maxIntens*0.05*$maxIntens} {
	#
	# The background is already very dark: make the dark
	# color a little lighter than the background by increasing
	# each color component 1/4th of the way to $maxIntens
	#
	foreach comp $rgb {
	    lappend darkRGB [expr {($maxIntens + 3*$comp)/4}]
	}
    } else {
	#
	# Compute the dark color by cutting 40% from
	# each of the background color components.
	#
	foreach comp $rgb {
	    lappend darkRGB [expr {60*$comp/100}]
	}
    }
    set darkColor [eval format "#%04x%04x%04x" $darkRGB]

    #
    # Compute the light shadow color
    #
    if {[string compare $::tk_patchLevel "8.3.1"] >= 0 &&
	$g > $maxIntens*0.95} {
	#
	# The background is already very bright: make the
	# light color a little darker than the background
	# by reducing each color component by 10%
	#
	foreach comp $rgb {
	    lappend lightRGB [expr {90*$comp/100}]
	}
    } else {
	#
	# Compute the light color by boosting each background
	# color component by 40% or half-way to white, whichever
	# is greater (the first approach works better for
	# unsaturated colors, the second for saturated ones)
	#
	foreach comp $rgb {
	    set comp1 [expr {140*$comp/100}]
	    if {$comp1 > $maxIntens} {
		set comp1 $maxIntens
	    }
	    set comp2 [expr {($maxIntens + $comp)/2}]
	    lappend lightRGB [expr {($comp1 > $comp2) ? $comp1 : $comp2}]
	}
    }
    set lightColor [eval format "#%04x%04x%04x" $lightRGB]
}

#------------------------------------------------------------------------------
# tablelist::raiseArrow
#
# Raises one of the two arrows contained in the canvas associated with the
# given column of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::raiseArrow {win col} {
    upvar ::tablelist::ns${win}::data data
    set w $data(hdrTxtFrCanv)$col
    variable directions
    set dir $directions($data(-incrarrowtype),$data($col-sortOrder))

    if {[string match "photo*" $data(-arrowstyle)]} {
	$w itemconfigure triangle$dir -state normal
	set dir [expr {([string compare $dir "Up"] == 0) ? "Dn" : "Up"}]
	$w itemconfigure triangle$dir -state hidden
    } else {
	$w raise triangle$dir
	$w raise darkLine$dir
	$w raise lightLine$dir
    }
}

#------------------------------------------------------------------------------
# tablelist::isHdrTxtFrXPosVisible
#
# Checks whether the given x position in the header text child 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)}]
}

#------------------------------------------------------------------------------
# tablelist::getScrlContentWidth
#
# Returns the total width of the non-hidden scrollable columns of the tablelist
# widget win, in the specified range.
#------------------------------------------------------------------------------
proc tablelist::getScrlContentWidth {win scrlColOffset lastCol} {
    upvar ::tablelist::ns${win}::data data
    set scrlContentWidth 0
    set nonHiddenCount 0
    for {set col $data(-titlecolumns)} {$col <= $lastCol} {incr col} {
	if {!$data($col-hide) && [incr nonHiddenCount] > $scrlColOffset} {
	    incr scrlContentWidth [colWidth $win $col -total]
	}
    }

    return $scrlContentWidth
}

#------------------------------------------------------------------------------
# tablelist::getScrlWindowWidth
#
# 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
# widget win.
#------------------------------------------------------------------------------
proc tablelist::getScrlWindowWidth win {
    upvar ::tablelist::ns${win}::data data
    set scrlWindowWidth [winfo width $data(hdr)]
    for {set col 0} {$col < $data(-titlecolumns) && $col < $data(colCount)} \
	{incr col} {
	if {!$data($col-hide)} {
	    incr scrlWindowWidth -[colWidth $win $col -total]
	}
    }

    return $scrlWindowWidth
}

#------------------------------------------------------------------------------
# tablelist::getMaxScrlColOffset
#
# Returns the max. scrolled column offset of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::getMaxScrlColOffset win {
    #
    # Get the number of non-hidden scrollable columns
    #
    upvar ::tablelist::ns${win}::data data
    set maxScrlColOffset 0
    for {set col $data(-titlecolumns)} {$col < $data(colCount)} {incr col} {
	if {!$data($col-hide)} {
	    incr maxScrlColOffset
	}
    }

    #
    # Decrement maxScrlColOffset while the total width of the
    # non-hidden scrollable columns starting with this offset
    # is less than the width of the window's scrollable part
    #
    set scrlWindowWidth [getScrlWindowWidth $win]
    if {$scrlWindowWidth > 0} {
	while {$maxScrlColOffset > 0} {
	    incr maxScrlColOffset -1
	    set scrlContentWidth \
		[getScrlContentWidth $win $maxScrlColOffset $data(lastCol)]
	    if {$scrlContentWidth == $scrlWindowWidth} {
		break
	    } elseif {$scrlContentWidth > $scrlWindowWidth} {
		incr maxScrlColOffset
		break
	    }
	}
    }

    return $maxScrlColOffset
}

#------------------------------------------------------------------------------
# tablelist::changeScrlColOffset
#
# Changes the scrolled column offset of the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::changeScrlColOffset {win scrlColOffset} {
    #
    # Make sure the offset is non-negative and no
    # greater than the max. scrolled column offset
    #
    if {$scrlColOffset < 0} {
	set scrlColOffset 0
    } else {
	set maxScrlColOffset [getMaxScrlColOffset $win]
	if {$scrlColOffset > $maxScrlColOffset} {
	    set scrlColOffset $maxScrlColOffset
	}
    }

    #
    # Update data(scrlColOffset) and adjust the
    # elided text in the tablelist's body if necessary
    #
    upvar ::tablelist::ns${win}::data data
    if {$scrlColOffset != $data(scrlColOffset)} {
	set data(scrlColOffset) $scrlColOffset
	adjustElidedText $win
	redisplayVisibleItems $win
    }
}

#------------------------------------------------------------------------------
# tablelist::scrlXOffsetToColOffset
#
# Returns the scrolled column offset of the tablelist widget win, corresponding
# to the desired x offset.
#------------------------------------------------------------------------------
proc tablelist::scrlXOffsetToColOffset {win scrlXOffset} {
    upvar ::tablelist::ns${win}::data data
    set scrlColOffset 0
    set scrlContentWidth 0
    for {set col $data(-titlecolumns)} {$col < $data(colCount)} {incr col} {
	if {$data($col-hide)} {
	    continue
	}

	incr scrlContentWidth [colWidth $win $col -total]
	if {$scrlContentWidth > $scrlXOffset} {
	    break
	} else {
	    incr scrlColOffset
	}
    }

    return $scrlColOffset
}

#------------------------------------------------------------------------------
# tablelist::scrlColOffsetToXOffset
#
# Returns the x offset corresponding to the specified scrolled column offset of
# the tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::scrlColOffsetToXOffset {win scrlColOffset} {
    upvar ::tablelist::ns${win}::data data
    set scrlXOffset 0
    set nonHiddenCount 0
    for {set col $data(-titlecolumns)} {$col < $data(colCount)} {incr col} {
	if {$data($col-hide)} {
	    continue
	}

	if {[incr nonHiddenCount] > $scrlColOffset} {
	    break
	} else {
	    incr scrlXOffset [colWidth $win $col -total]
	}
    }

    return $scrlXOffset
}

#------------------------------------------------------------------------------
# tablelist::getViewableRowCount
#
# Returns the number of viewable rows of the tablelist widget win in the
# specified range.
#------------------------------------------------------------------------------
proc tablelist::getViewableRowCount {win first last} {
    upvar ::tablelist::ns${win}::data data
    if {$first == 0 && $last == $data(lastRow)} {
	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} {
	    set key [lindex $data(keyList) $row]
	    if {![info exists data($key-elide)] &&
		![info exists data($key-hide)]} {
		incr count
	    }
	}

	return $count
    }
}

#------------------------------------------------------------------------------
# tablelist::viewableRowOffsetToRowIndex
#
# Returns the row index corresponding to the given viewable row offset in the
# tablelist widget win.
#------------------------------------------------------------------------------
proc tablelist::viewableRowOffsetToRowIndex {win offset} {
    upvar ::tablelist::ns${win}::data data
    if {$data(nonViewableRowCount) == 0} {
	return $offset
    } else {
	#
	# Rebuild the list data(viewableRowList) of the row
	# indices indicating the viewable rows if needed
	#
	if {[lindex $data(viewableRowList) 0] == -1} {
	    set data(viewableRowList) {}
	    for {set row 0} {$row < $data(itemCount)} {incr row} {
		set key [lindex $data(keyList) $row]
		if {![info exists data($key-elide)] &&
		    ![info exists data($key-hide)]} {
		    lappend data(viewableRowList) $row
		}
	    }
	}

	set viewableCount [llength $data(viewableRowList)]
	if {$viewableCount == 0} {
	    return 0
	} else {
	    if {$offset >= $viewableCount} {
		set offset [expr {$viewableCount - 1}]
	    }
	    if {$offset < 0} {
		set offset 0
	    }
	    return [lindex $data(viewableRowList) $offset]
	}
    }
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<














































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/scripts/tablelistWidget.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586
6587
6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
#==============================================================================
# Contains the implementation of the tablelist widget.
#
# Structure of the module:
#   - Namespace initialization
#   - Private procedure creating the default bindings
#   - Public procedure creating a new tablelist widget
#   - Private procedures implementing the tablelist widget command
#   - Private callback procedures
#
# Copyright (c) 2000-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

#
# Namespace initialization
# ========================
#

namespace eval tablelist {
    #
    # Get the current windowing system ("x11", "win32", "classic", or "aqua")
    #
    variable winSys
    if {[catch {tk windowingsystem} winSys] != 0} {
	switch $::tcl_platform(platform) {
	    unix	{ set winSys x11 }
	    windows	{ set winSys win32 }
	    macintosh	{ set winSys classic }
	}
    }

    #
    # Create aliases for a few tile commands if not yet present
    #
    proc createTileAliases {} {
	if {[string length [interp alias {} ::tablelist::style]] != 0} {
	    return ""
	}

	if {[string length [info commands ::ttk::style]] == 0} {
	    interp alias {} ::tablelist::style      {} ::style
	    if {[string compare $::tile::version "0.7"] >= 0} {
		interp alias {} ::tablelist::styleConfig {} ::style configure
	    } else {
		interp alias {} ::tablelist::styleConfig {} ::style default
	    }
	    interp alias {} ::tablelist::getThemes  {} ::tile::availableThemes
	    interp alias {} ::tablelist::setTheme   {} ::tile::setTheme

	    interp alias {} ::tablelist::tileqt_kdeStyleChangeNotification \
			 {} ::tile::theme::tileqt::kdeStyleChangeNotification
	    interp alias {} ::tablelist::tileqt_currentThemeName \
			 {} ::tile::theme::tileqt::currentThemeName
	    interp alias {} ::tablelist::tileqt_currentThemeColour \
			 {} ::tile::theme::tileqt::currentThemeColour
	} else {
	    interp alias {} ::tablelist::style	      {} ::ttk::style
	    interp alias {} ::tablelist::styleConfig  {} ::ttk::style configure
	    interp alias {} ::tablelist::getThemes    {} ::ttk::themes
	    interp alias {} ::tablelist::setTheme     {} ::ttk::setTheme

	    interp alias {} ::tablelist::tileqt_kdeStyleChangeNotification \
			 {} ::ttk::theme::tileqt::kdeStyleChangeNotification
	    interp alias {} ::tablelist::tileqt_currentThemeName \
			 {} ::ttk::theme::tileqt::currentThemeName
	    interp alias {} ::tablelist::tileqt_currentThemeColour \
			 {} ::ttk::theme::tileqt::currentThemeColour
	}
    }
    if {$usingTile} {
	createTileAliases 
    }

    variable pngSupported [expr {($::tk_version >= 8.6 &&
	![regexp {^8\.6(a[1-3]|b1)$} $::tk_patchLevel]) ||
	($::tk_version >= 8.5 && [catch {package require img::png}] == 0)}]

    variable specialAquaHandling [expr {$usingTile && ($::tk_version >= 8.6 ||
	[regexp {^8\.5\.(9|[1-9][0-9])$} $::tk_patchLevel]) &&
	[lsearch -exact [winfo server .] "AppKit"] >= 0}]

    #
    # The array configSpecs is used to handle configuration options.  The
    # names of its elements are the configuration options for the Tablelist
    # class.  The value of an array element is either an alias name or a list
    # containing the database name and class as well as an indicator specifying
    # the widget(s) to which the option applies: c stands for all children
    # (text widgets and labels), b for the body text widget, l for the labels,
    # f for the frame, and w for the widget itself.
    #
    #	Command-Line Name	 {Database Name		  Database Class      W}
    #	------------------------------------------------------------------------
    #
    variable configSpecs
    array set configSpecs {
	-acceptchildcommand	 {acceptChildCommand	  AcceptChildCommand  w}
	-acceptdropcommand	 {acceptDropCommand	  AcceptDropCommand   w}
	-activestyle		 {activeStyle		  ActiveStyle	      w}
	-arrowcolor		 {arrowColor		  ArrowColor	      w}
	-arrowdisabledcolor	 {arrowDisabledColor	  ArrowDisabledColor  w}
	-arrowstyle		 {arrowStyle		  ArrowStyle	      w}
	-autoscan		 {autoScan		  AutoScan	      w}
	-background		 {background		  Background	      b}
	-bg			 -background
	-borderwidth		 {borderWidth		  BorderWidth	      f}
	-bd			 -borderwidth
	-collapsecommand	 {collapseCommand	  CollapseCommand     w}
	-columns		 {columns		  Columns	      w}
	-columntitles		 {columnTitles		  ColumnTitles	      w}
	-cursor			 {cursor		  Cursor	      c}
	-customdragsource	 {customDragSource	  CustomDragSource    w}
	-disabledforeground	 {disabledForeground	  DisabledForeground  w}
	-editendcommand		 {editEndCommand	  EditEndCommand      w}
	-editselectedonly	 {editSelectedOnly	  EditSelectedOnly    w}
	-editstartcommand	 {editStartCommand	  EditStartCommand    w}
	-expandcommand		 {expandCommand		  ExpandCommand       w}
	-exportselection	 {exportSelection	  ExportSelection     w}
	-font			 {font			  Font		      b}
	-forceeditendcommand	 {forceEditEndCommand	  ForceEditEndCommand w}
	-foreground		 {foreground		  Foreground	      b}
	-fg			 -foreground
	-fullseparators		 {fullSeparators	  FullSeparators      w}
	-height			 {height		  Height	      w}
	-highlightbackground	 {highlightBackground	  HighlightBackground f}
	-highlightcolor		 {highlightColor	  HighlightColor      f}
	-highlightthickness	 {highlightThickness	  HighlightThickness  f}
	-incrarrowtype		 {incrArrowType		  IncrArrowType	      w}
	-instanttoggle		 {instantToggle		  InstantToggle	      w}
	-labelactivebackground	 {labelActiveBackground	  Foreground	      l}
	-labelactiveforeground	 {labelActiveForeground	  Background	      l}
	-labelbackground	 {labelBackground	  Background	      l}
	-labelbg		 -labelbackground
	-labelborderwidth	 {labelBorderWidth	  BorderWidth	      l}
	-labelbd		 -labelborderwidth
	-labelcommand		 {labelCommand		  LabelCommand	      w}
	-labelcommand2		 {labelCommand2		  LabelCommand2	      w}
	-labeldisabledforeground {labelDisabledForeground DisabledForeground  l}
	-labelfont		 {labelFont		  Font		      l}
	-labelforeground	 {labelForeground	  Foreground	      l}
	-labelfg		 -labelforeground
	-labelheight		 {labelHeight		  Height	      l}
	-labelpady		 {labelPadY		  Pad		      l}
	-labelrelief		 {labelRelief		  Relief	      l}
	-listvariable		 {listVariable		  Variable	      w}
	-movablecolumns	 	 {movableColumns	  MovableColumns      w}
	-movablerows		 {movableRows		  MovableRows	      w}
	-movecolumncursor	 {moveColumnCursor	  MoveColumnCursor    w}
	-movecursor		 {moveCursor		  MoveCursor	      w}
	-populatecommand	 {populateCommand	  PopulateCommand     w}
	-protecttitlecolumns	 {protectTitleColumns	  ProtectTitleColumns w}
	-relief			 {relief		  Relief	      f}
	-resizablecolumns	 {resizableColumns	  ResizableColumns    w}
	-resizecursor		 {resizeCursor		  ResizeCursor	      w}
	-selectbackground	 {selectBackground	  Foreground	      w}
	-selectborderwidth	 {selectBorderWidth	  BorderWidth	      w}
	-selectforeground	 {selectForeground	  Background	      w}
	-selectmode		 {selectMode		  SelectMode	      w}
	-selecttype		 {selectType		  SelectType	      w}
	-setfocus		 {setFocus		  SetFocus	      w}
	-setgrid		 {setGrid		  SetGrid	      w}
	-showarrow		 {showArrow		  ShowArrow	      w}
	-showeditcursor		 {showEditCursor	  ShowEditCursor      w}
	-showhorizseparator	 {showHorizSeparator	  ShowHorizSeparator  w}
	-showlabels		 {showLabels		  ShowLabels	      w}
	-showseparators		 {showSeparators	  ShowSeparators      w}
	-snipstring		 {snipString		  SnipString	      w}
	-sortcommand		 {sortCommand		  SortCommand	      w}
	-spacing		 {spacing		  Spacing	      w}
	-state			 {state			  State		      w}
	-stretch		 {stretch		  Stretch	      w}
	-stripebackground	 {stripeBackground	  Background	      w}
	-stripebg		 -stripebackground
	-stripeforeground	 {stripeForeground	  Foreground	      w}
	-stripefg		 -stripeforeground
	-stripeheight		 {stripeHeight		  StripeHeight	      w}
	-takefocus		 {takeFocus		  TakeFocus	      f}
	-targetcolor		 {targetColor		  TargetColor	      w}
	-tight			 {tight			  Tight		      w}
	-titlecolumns		 {titleColumns	  	  TitleColumns	      w}
	-tooltipaddcommand	 {tooltipAddCommand	  TooltipAddCommand   w}
	-tooltipdelcommand	 {tooltipDelCommand	  TooltipDelCommand   w}
	-treecolumn		 {treeColumn		  TreeColumn	      w}
	-treestyle		 {treeStyle		  TreeStyle	      w}
	-width			 {width			  Width		      w}
	-xscrollcommand		 {xScrollCommand	  ScrollCommand	      w}
	-yscrollcommand		 {yScrollCommand	  ScrollCommand	      w}
    }

    #
    # Extend the elements of the array configSpecs
    #
    extendConfigSpecs 

    variable configOpts [lsort [array names configSpecs]]

    #
    # The array colConfigSpecs is used to handle column configuration options.
    # The names of its elements are the column 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 colConfigSpecs
    array set colConfigSpecs {
	-align			{align			Align		    }
	-background		{background		Background	    }
	-bg			-background
	-changesnipside		{changeSnipSide		ChangeSnipSide	    }
	-changetitlesnipside	{changeTitleSnipSide	ChangeTitleSnipSide }
	-editable		{editable		Editable	    }
	-editwindow		{editWindow		EditWindow	    }
	-font			{font			Font		    }
	-foreground		{foreground		Foreground	    }
	-fg			-foreground
	-formatcommand		{formatCommand		FormatCommand	    }
	-hide			{hide			Hide		    }
	-labelalign		{labelAlign		Align		    }
	-labelbackground	{labelBackground	Background	    }
	-labelbg		-labelbackground
	-labelborderwidth	{labelBorderWidth	BorderWidth	    }
	-labelbd		-labelborderwidth
	-labelcommand		{labelCommand		LabelCommand	    }
	-labelcommand2		{labelCommand2		LabelCommand2	    }
	-labelfont		{labelFont		Font		    }
	-labelforeground	{labelForeground	Foreground	    }
	-labelfg		-labelforeground
	-labelheight		{labelHeight		Height		    }
	-labelimage		{labelImage		Image		    }
	-labelpady		{labelPadY		Pad		    }
	-labelrelief		{labelRelief		Relief		    }
	-maxwidth		{maxWidth		MaxWidth	    }
	-name			{name			Name		    }
	-resizable		{resizable		Resizable	    }
	-selectbackground	{selectBackground	Foreground	    }
	-selectforeground	{selectForeground	Background	    }
	-showarrow		{showArrow		ShowArrow	    }
	-showlinenumbers	{showLineNumbers	ShowLineNumbers	    }
	-sortcommand		{sortCommand		SortCommand	    }
	-sortmode		{sortMode		SortMode	    }
	-stretchable		{stretchable		Stretchable	    }
	-stripebackground	{stripeBackground	Background	    }
	-stripeforeground	{stripeForeground	Foreground	    }
	-text			{text			Text		    }
	-title			{title			Title		    }
	-valign			{valign			Valign		    }
	-width			{width			Width		    }
	-wrap			{wrap			Wrap		    }
    }

    #
    # Extend some elements of the array colConfigSpecs
    #
    lappend colConfigSpecs(-align)			- left
    lappend colConfigSpecs(-changesnipside)		- 0
    lappend colConfigSpecs(-changetitlesnipside)	- 0
    lappend colConfigSpecs(-editable)			- 0
    lappend colConfigSpecs(-editwindow)			- entry
    lappend colConfigSpecs(-hide)			- 0
    lappend colConfigSpecs(-maxwidth)			- 0
    lappend colConfigSpecs(-resizable)			- 1
    lappend colConfigSpecs(-showarrow)			- 1
    lappend colConfigSpecs(-showlinenumbers)		- 0
    lappend colConfigSpecs(-sortmode)			- ascii
    lappend colConfigSpecs(-stretchable)		- 0
    lappend colConfigSpecs(-valign)			- center
    lappend colConfigSpecs(-width)			- 0
    lappend colConfigSpecs(-wrap)			- 0

    if {$usingTile} {
	unset colConfigSpecs(-labelbackground)
	unset colConfigSpecs(-labelbg)
	unset colConfigSpecs(-labelheight)
    }

    #
    # The array rowConfigSpecs is used to handle row configuration options.
    # The names of its elements are the 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 rowConfigSpecs
    array set rowConfigSpecs {
	-background		{background		Background	}
	-bg			-background
	-font			{font			Font		}
	-foreground		{foreground		Foreground	}
	-fg			-foreground
	-hide			{hide			Hide		}
	-name			{name			Name		}
	-selectable		{selectable		Selectable	}
	-selectbackground	{selectBackground	Foreground	}
	-selectforeground	{selectForeground	Background	}
	-text			{text			Text		}
    }

    #
    # Check whether the -elide text widget tag option is available
    #
    variable canElide
    variable elide
    if {$::tk_version >= 8.3} {
	set canElide 1
	set elide -elide
    } else {
	set canElide 0
	set elide --
    }

    #
    # Extend some elements of the array rowConfigSpecs
    #
    if {$canElide} {
	lappend rowConfigSpecs(-hide)	- 0
    } else {
	unset rowConfigSpecs(-hide)
    }
    lappend rowConfigSpecs(-selectable)	- 1

    #
    # The array cellConfigSpecs is used to handle cell configuration options.
    # The names of its elements are the 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 cellConfigSpecs
    array set cellConfigSpecs {
	-background		{background		Background	}
	-bg			-background
	-editable		{editable		Editable	}
	-editwindow		{editWindow		EditWindow	}
	-font			{font			Font		}
	-foreground		{foreground		Foreground	}
	-fg			-foreground
	-image			{image			Image		}
	-selectbackground	{selectBackground	Foreground	}
	-selectforeground	{selectForeground	Background	}
	-stretchwindow		{stretchWindow		StretchWindow	}
	-text			{text			Text		}
	-valign			{valign			Valign		}
	-window			{window			Window		}
	-windowdestroy		{windowDestroy		WindowDestroy	}
	-windowupdate		{windowUpdate		WindowUpdate	}
    }

    #
    # Extend some elements of the array cellConfigSpecs
    #
    lappend cellConfigSpecs(-editable)		- 0
    lappend cellConfigSpecs(-editwindow)	- entry
    lappend cellConfigSpecs(-stretchwindow)	- 0
    lappend cellConfigSpecs(-valign)		- center

    #
    # Use a list to facilitate the handling of the command options 
    #
    variable cmdOpts [list \
	activate activatecell applysorting attrib bbox bodypath bodytag \
	canceledediting cancelediting cellattrib cellbbox cellcget \
	cellconfigure cellindex cellselection cget childcount childindex \
	childkeys collapse collapseall columnattrib columncget \
	columnconfigure columncount columnindex columnwidth config \
	configcelllist configcells configcolumnlist configcolumns \
	configrowlist configrows configure containing containingcell \
	containingcolumn cornerlabelpath cornerpath curcellselection \
	curselection depth delete deletecolumns descendantcount 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 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
	if {!$canElide} {
	    variable cmdOpts
	    foreach opt [list collapse collapseall expand expandall \
			 insertchild insertchildlist insertchildren \
			 togglerowhide] {
		set idx [lsearch -exact $cmdOpts $opt]
		set cmdOpts [lreplace $cmdOpts $idx $idx]
	    }
	}
    }
    restrictCmdOpts 

    #
    # Use lists to facilitate the handling of miscellaneous options
    #
    variable activeStyles  [list frame none underline]
    variable alignments    [list left right center]
    variable arrowStyles   [list flat5x3 flat5x4 flat6x4 flat7x4 flat7x5 \
				 flat7x7 flat8x5 flat9x5 flat9x6 flatAngle7x4 \
				 flatAngle7x5 flatAngle9x5 flatAngle9x6 \
				 flatAngle9x7 flatAngle10x6 flatAngle10x7 \
				 photo7x7 sunken8x7 sunken10x9 sunken12x11]
    variable arrowTypes    [list up down]
    variable colWidthOpts  [list -requested -stretched -total]
    variable expCollOpts   [list -fully -partly]
    variable findOpts      [list -descend -parent]
    variable gapTypeOpts   [list -any -horizontal -vertical]
    variable scanOpts      [list mark dragto]
    variable searchOpts    [list -all -backwards -check -descend -exact \
				 -formatted -glob -nocase -not -numeric \
				 -parent -regexp -start]
    variable selectionOpts [list anchor clear includes set]
    variable selectTypes   [list row cell]
    variable targetOpts    [list before inside]
    variable sortModes     [list ascii asciinocase command dictionary \
				 integer real]
    variable sortOpts      [list -increasing -decreasing]
    variable sortOrders    [list increasing decreasing]
    variable states	   [list disabled normal]
    variable treeStyles    [list adwaita ambiance aqua baghira dust dustSand \
				 gtk klearlooks mate mint newWave oxygen1 \
				 oxygen2 phase plastik plastique radiance \
				 ubuntu vistaAero vistaClassic win7Aero \
				 win7Classic winnative winxpBlue winxpOlive \
				 winxpSilver]
    variable valignments   [list center top bottom]

    proc restrictArrowStyles {} {
	variable pngSupported
	if {!$pngSupported} {
	    variable arrowStyles
	    set idx [lsearch -exact $arrowStyles "photo7x7"]
	    set arrowStyles [lreplace $arrowStyles $idx $idx]
	}
    }
    restrictArrowStyles 

    #
    # The array maxIndentDepths holds the current max.
    # indentation depth for every tree style in use
    #
    variable maxIndentDepths

    #
    # Define the command mapTabs, which returns the string obtained by
    # replacing all \t characters in its argument with \\t, as well as
    # the commands strMap and isInteger, needed because the "string map"
    # and "string is" commands were not available in Tcl 8.0 and 8.1.0
    #
    if {[catch {string map {} ""}] == 0} {
	interp alias {} ::tablelist::mapTabs {} string map {"\t" "\\t"}
	interp alias {} ::tablelist::strMap  {} string map
    } else {
	proc mapTabs str {
	    regsub -all "\t" $str "\\t" str
	    return $str
	}

	proc strMap {charMap str} {
	    foreach {key val} $charMap {
		#
		# We will only need this for noncritical key and str values
		#
		regsub -all $key $str $val str
	    }

	    return $str
	}
    }
    if {[catch {string is integer "0"}] == 0} {
	interp alias {} ::tablelist::isInteger {} string is integer -strict
    } else {
	proc isInteger str {
	    return [expr {[catch {format "%d" $str}] == 0}]
	}
    }

    #
    # Define the command genVirtualEvent, needed because the -data option of the
    # "event generate" command was not available in Tk versions earlier than 8.5
    #
    if {[catch {event generate . <<__>> -data ""}] == 0} {
	proc genVirtualEvent {win event userData} {
	    event generate $win $event -data $userData
	}
    } else {
	proc genVirtualEvent {win event userData} {
	    event generate $win $event
	}
    }

    interp alias {} ::tablelist::configSubCmd \
		 {} ::tablelist::configureSubCmd
    interp alias {} ::tablelist::insertchildSubCmd \
		 {} ::tablelist::insertchildrenSubCmd
}

#
# Private procedure creating the default bindings
# ===============================================
#

#------------------------------------------------------------------------------
# tablelist::createBindings
#
# Creates the default bindings for the binding tags Tablelist, TablelistWindow,
# TablelistKeyNav, TablelistBody, TablelistLabel, TablelistSubLabel,
# TablelistArrow, and TablelistEdit.
#------------------------------------------------------------------------------
proc tablelist::createBindings {} {
    #
    # Define some Tablelist class bindings
    #
    bind Tablelist <KeyPress> continue
    bind Tablelist <FocusIn> {
	tablelist::addActiveTag %W
	if {[string compare [focus -lastfor %W] %W] == 0} {
	    if {[winfo exists [%W editwinpath]]} {
		focus [set tablelist::ns%W::data(editFocus)]
	    } else {
		focus [%W bodypath]
	    }
	}
    }
    bind Tablelist <FocusOut>		{ tablelist::removeActiveTag %W }
    bind Tablelist <<TablelistSelect>>	{ event generate %W <<ListboxSelect>> }
    bind Tablelist <Destroy>		{ tablelist::cleanup %W }
    variable usingTile
    if {$usingTile} {
	bind Tablelist <Activate>	{ tablelist::updateCanvases %W }
	bind Tablelist <Deactivate>	{ tablelist::updateCanvases %W }
	bind Tablelist <<ThemeChanged>>	{
	    after idle [list tablelist::updateConfigSpecs %W]
	}
    }

    #
    # Define some TablelistWindow class bindings
    #
    bind TablelistWindow <Destroy>	{ tablelist::cleanupWindow %W }

    #
    # Define the binding tags TablelistKeyNav and TablelistBody
    #
    mwutil::defineKeyNav Tablelist
    defineTablelistBody 

    #
    # Define the virtual events <<Button3>> and <<ShiftButton3>>
    #
    event add <<Button3>> <Button-3>
    event add <<ShiftButton3>> <Shift-Button-3>
    variable winSys
    if {[string compare $winSys "classic"] == 0 ||
	[string compare $winSys "aqua"] == 0} {
	event add <<Button3>> <Control-Button-1>
	event add <<ShiftButton3>> <Shift-Control-Button-1>
    }

    #
    # Define some mouse bindings for the binding tag TablelistLabel
    #
    bind TablelistLabel <Enter>		  { tablelist::labelEnter  %W %X %Y %x }
    bind TablelistLabel <Motion>	  { tablelist::labelEnter  %W %X %Y %x }
    bind TablelistLabel <Leave>		  { tablelist::labelLeave  %W %X %x %y }
    bind TablelistLabel <Button-1>	  { tablelist::labelB1Down %W %x 0 }
    bind TablelistLabel <Shift-Button-1>  { tablelist::labelB1Down %W %x 1 }
    bind TablelistLabel <B1-Motion>	{ tablelist::labelB1Motion %W %X %x %y }
    bind TablelistLabel <B1-Enter>	{ tablelist::labelB1Enter  %W }
    bind TablelistLabel <B1-Leave>	{ tablelist::labelB1Leave  %W %x %y }
    bind TablelistLabel <ButtonRelease-1> { tablelist::labelB1Up   %W %X}
    bind TablelistLabel <<Button3>>	  { tablelist::labelB3Down %W 0 }
    bind TablelistLabel <<ShiftButton3>>  { tablelist::labelB3Down %W 1 }
    bind TablelistLabel <Double-Button-1>	{ tablelist::labelDblB1 %W %x 0}
    bind TablelistLabel <Shift-Double-Button-1> { tablelist::labelDblB1 %W %x 1}

    #
    # Define the binding tags TablelistSubLabel and TablelistArrow
    #
    defineTablelistSubLabel 
    defineTablelistArrow 

    #
    # Define the binding tag TablelistEdit if the file tablelistEdit.tcl exists
    #
    catch {defineTablelistEdit}
}

#
# Public procedure creating a new tablelist widget
# ================================================
#

#------------------------------------------------------------------------------
# tablelist::tablelist
#
# Creates a new tablelist widget whose name is specified as the first command-
# line argument, and configures it according to the options and their values
# given on the command line.  Returns the name of the newly created widget.
#------------------------------------------------------------------------------
proc tablelist::tablelist args {
    variable usingTile
    variable configSpecs
    variable configOpts
    variable canElide

    if {[llength $args] == 0} {
	mwutil::wrongNumArgs "tablelist pathName ?options?"
    }

    #
    # Create a frame of the class Tablelist
    #
    set win [lindex $args 0]
    if {[catch {
	if {$usingTile} {
	    ttk::frame $win -style Frame$win.TFrame -class Tablelist \
			    -height 0 -width 0 -padding 0
	} else {
	    tk::frame $win -class Tablelist -container 0 -height 0 -width 0
	    catch {$win configure -padx 0 -pady 0}
	}
    } result] != 0} {
	return -code error $result
    }

    #
    # Create a namespace within the current one to hold the data of the widget
    #
    namespace eval ns$win {
	#
	# The folowing array holds various data for this widget
	#
	variable data
	array set data {
	    arrowWidth		 10
	    arrowHeight		 9
	    hasListVar		 0
	    isDisabled		 0
	    ownsFocus		 0
	    charWidth		 1
	    hdrPixels		 0
	    activeRow		 0
	    activeCol		 0
	    anchorRow		 0
	    anchorCol		 0
	    seqNum		-1
	    freeKeyList		 {}
	    keyList		 {}
	    itemList		 {}
	    itemCount		 0
	    lastRow		-1
	    colList		 {}
	    colCount		 0
	    lastCol		-1
	    treeCol		 0
	    gotConfigureEvent	 0
	    rightX		 0
	    btmY		 0
	    rowTagRefCount	 0
	    cellTagRefCount	 0
	    imgCount		 0
	    winCount		 0
	    indentCount		 0
	    afterId		 ""
	    labelClicked	 0
	    arrowColList	 {}
	    sortColList		 {}
	    sortOrder		 ""
	    editKey		 ""
	    editRow		-1
	    editCol		-1
	    canceled		 0
	    fmtKey		 ""
	    fmtRow		-1
	    fmtCol		-1
	    prevCell		 ""
	    prevCol		-1
	    forceAdjust		 0
	    fmtCmdFlagList	 {}
	    hasFmtCmds		 0
	    scrlColOffset	 0
	    cellsToReconfig	 {}
	    nonViewableRowCount	 0
	    viewableRowList	 {-1}
	    hiddenColCount	 0
	    root-row		-1
	    root-parent		 ""
	    root-children	 {}
	    keyToRowMapValid	 1
	    searchStartIdx	 0
	    keyBeingExpanded	 ""
	    destroyIdList	 {}
	    justEntered		 0
	    inEditWin		 0
	}

	#
	# The following array is used to hold arbitrary
	# attributes and their values for this widget
	#
	variable attribs
    }

    #
    # Initialize some further components of data
    #
    upvar ::tablelist::ns${win}::data data
    foreach opt $configOpts {
	set data($opt) [lindex $configSpecs($opt) 3]
    }
    if {$usingTile} {
	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
    set data(-treestyle)	""		;# for Tk versions < 8.3
    set data(colFontList)	[list $data(-font)]
    set data(listVarTraceCmd)	[list tablelist::listVarTrace $win]
    set data(bodyTag)		body$win
    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(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(colGap)		$data(hdr).g
    set data(lb)		$win.lb
    set data(sep)		$win.sep
    set data(hsep)		$win.hsep

    #
    # Get a unique name for the corner frame (a sibling 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
    }
    set data(cornerLbl) $data(corner).l

    #
    # Create a child hierarchy used to hold the column labels.  The
    # labels will be created as children of the frame data(hdrTxtFr),
    # 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).
    #

    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 <Configure> {
	set tablelist::W [winfo parent %W]
	tablelist::stretchColumnsWhenIdle $tablelist::W
	tablelist::updateScrlColOffsetWhenIdle $tablelist::W
	tablelist::updateHScrlbarWhenIdle $tablelist::W
    }
    pack $w -fill x

    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
    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 \
			      -highlightthickness 0 -relief flat \
			      -takefocus 0 -width 0
    catch {$data(hdrTxtFr) configure -padx 0 -pady 0}
    $w window create 1.0 -window $data(hdrTxtFr)

    set w $data(hdrFr)			;# 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 x 0
    if {$usingTile} {
	ttk::label $w -style TablelistHeader.TLabel -image "" \
		      -padding {1 1 1 1} -takefocus 0 -text "" \
		      -textvariable "" -underline -1 -wraplength 0
	if {[string compare [getCurrentTheme] "aqua"] == 0} {
	    set x -1
	}
    } else {
	tk::label $w -bitmap "" -highlightthickness 0 -image "" \
		     -takefocus 0 -text "" -textvariable "" -underline -1 \
		     -wraplength 0
    }
    place $w -x $x -relheight 1.0 -relwidth 1.0

    set w $data(corner)			;# corner frame (outside the tablelist)
    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
    if {$usingTile} {
	ttk::label $w -style TablelistHeader.TLabel -image "" \
		      -padding {1 1 1 1} -takefocus 0 -text "" \
		      -textvariable "" -underline -1 -wraplength 0
    } else {
	tk::label $w -bitmap "" -highlightthickness 0 -image "" \
		     -takefocus 0 -text "" -textvariable "" -underline -1 \
		     -wraplength 0
    }
    place $w -relheight 1.0 -relwidth 1.0

    #
    # Create the body text widget within the main frame
    #
    set w $data(body)
    text $w -borderwidth 0 -exportselection 0 -highlightthickness 0 \
	    -insertwidth 0 -padx 0 -pady 0 -state normal -takefocus 0 -wrap none
    bind $w <Configure> {
	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
    }
    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]

    #
    # Create the "stripe", "select", "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
    # the input focus.  DO NOT CHANGE the order of creation of these tags!
    #
    $w tag configure stripe -background "" -foreground ""    ;# will be changed
    $w tag configure select -relief raised
    $w tag configure active -borderwidth ""		     ;# will be changed
    $w tag configure disabled -foreground ""		     ;# will be changed
    $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 hiddenCol -elide 1	;# used for hiding a column
	$w tag configure elidedCol -elide 1	;# used for horizontal scrolling
    }
    if {$::tk_version >= 8.5} {
	$w tag configure elidedWin -elide 1	;# used for eliding a window
    }

    #
    # Create two frames used to display a gap between two consecutive
    # rows/columns when moving a row/column interactively
    #
    tk::frame $data(rowGap) -borderwidth 1 -container 0 -highlightthickness 0 \
			    -relief sunken -takefocus 0 -height 4
    tk::frame $data(colGap) -borderwidth 1 -container 0 -highlightthickness 0 \
			    -relief sunken -takefocus 0 -width 4

    #
    # Create an unmanaged listbox child, used to handle the -setgrid option
    #
    listbox $data(lb)

    #
    # Create the bitmaps needed to display the sort ranks
    #
    createSortRankImgs $win

    #
    # 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
	} else {
	    tk::label $helpLabel -takefocus 0
	}
    }

    #
    # Configure the widget according to the command-line
    # arguments and to the available database options
    #
    if {[catch {
	mwutil::configureWidget $win configSpecs tablelist::doConfig \
				tablelist::doCget [lrange $args 1 end] 1
    } result] != 0} {
	destroy $win
	return -code error $result
    }

    #
    # Move the original widget command into the current namespace and
    # create an alias of the original name for a new widget procedure
    #
    rename ::$win $win
    interp alias {} ::$win {} tablelist::tablelistWidgetCmd $win

    #
    # Register a callback to be invoked whenever the PRIMARY
    # selection is owned by the window win and someone
    # attempts to retrieve it as a UTF8_STRING or STRING
    #
    selection handle -type UTF8_STRING $win \
	[list ::tablelist::fetchSelection $win]
    selection handle -type STRING $win \
	[list ::tablelist::fetchSelection $win]

    #
    # Set a trace on the array elements data(activeRow),
    # data(avtiveCol), and data(-selecttype)
    #
    foreach name {activeRow activeCol -selecttype} {
	trace variable data($name) w [list tablelist::activeTrace $win]
    }

    return $win
}

#
# Private procedures implementing the tablelist widget command
# ============================================================
#

#------------------------------------------------------------------------------
# tablelist::tablelistWidgetCmd
#
# Processes the Tcl command corresponding to a tablelist widget.
#------------------------------------------------------------------------------
proc tablelist::tablelistWidgetCmd {win args} {
    if {[llength $args] == 0} {
	mwutil::wrongNumArgs "$win option ?arg arg ...?"
    }

    variable cmdOpts
    set cmd [mwutil::fullOpt "option" [lindex $args 0] $cmdOpts]
    return [${cmd}SubCmd $win [lrange $args 1 end]]
}

#------------------------------------------------------------------------------
# tablelist::activateSubCmd
#------------------------------------------------------------------------------
proc tablelist::activateSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win activate index"
    }

    upvar ::tablelist::ns${win}::data data
    if {$data(isDisabled)} {
	return ""
    }

    synchronize $win
    displayItems $win
    set index [rowIndex $win [lindex $argList 0] 0]

    #
    # Adjust the index to fit within the existing viewable items
    #
    adjustRowIndex $win index 1

    set data(activeRow) $index
    return ""
}

#------------------------------------------------------------------------------
# tablelist::activatecellSubCmd
#------------------------------------------------------------------------------
proc tablelist::activatecellSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win activatecell cellIndex"
    }

    upvar ::tablelist::ns${win}::data data
    if {$data(isDisabled)} {
	return ""
    }

    synchronize $win
    displayItems $win
    foreach {row col} [cellIndex $win [lindex $argList 0] 0] {}

    #
    # Adjust the row and column indices to fit
    # within the existing viewable elements
    #
    adjustRowIndex $win row 1
    adjustColIndex $win col 1

    set data(activeRow) $row
    set data(activeCol) $col
    return ""
}

#------------------------------------------------------------------------------
# tablelist::applysortingSubCmd
#------------------------------------------------------------------------------
proc tablelist::applysortingSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win applysorting itemList"
    }

    return [sortList $win [lindex $argList 0]]
}

#------------------------------------------------------------------------------
# tablelist::attribSubCmd
#------------------------------------------------------------------------------
proc tablelist::attribSubCmd {win argList} {
    return [mwutil::attribSubCmd $win "widget" $argList]
}

#------------------------------------------------------------------------------
# tablelist::bboxSubCmd
#------------------------------------------------------------------------------
proc tablelist::bboxSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win bbox index"
    }

    synchronize $win
    displayItems $win
    set index [rowIndex $win [lindex $argList 0] 0]

    upvar ::tablelist::ns${win}::data data
    set w $data(body)
    set dlineinfo [$w dlineinfo [expr {double($index + 1)}]]
    if {$data(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::bodypathSubCmd
#------------------------------------------------------------------------------
proc tablelist::bodypathSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win bodypath"
    }

    upvar ::tablelist::ns${win}::data data
    return $data(body)
}

#------------------------------------------------------------------------------
# tablelist::bodytagSubCmd
#------------------------------------------------------------------------------
proc tablelist::bodytagSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win bodytag"
    }

    upvar ::tablelist::ns${win}::data data
    return $data(bodyTag)
}

#------------------------------------------------------------------------------
# tablelist::cancelededitingSubCmd
#------------------------------------------------------------------------------
proc tablelist::cancelededitingSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win canceledediting"
    }

    upvar ::tablelist::ns${win}::data data
    return $data(canceled)
}

#------------------------------------------------------------------------------
# tablelist::canceleditingSubCmd
#------------------------------------------------------------------------------
proc tablelist::canceleditingSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win cancelediting"
    }

    synchronize $win
    return [doCancelEditing $win]
}

#------------------------------------------------------------------------------
# tablelist::cellattribSubCmd
#------------------------------------------------------------------------------
proc tablelist::cellattribSubCmd {win argList} {
    if {[llength $argList] < 1} {
	mwutil::wrongNumArgs "$win cellattrib cellIndex ?name? ?value\
			      name value ...?"
    }

    synchronize $win
    foreach {row col} [cellIndex $win [lindex $argList 0] 1] {}
    upvar ::tablelist::ns${win}::data data
    set key [lindex $data(keyList) $row]
    return [mwutil::attribSubCmd $win $key,$col [lrange $argList 1 end]]
}

#------------------------------------------------------------------------------
# tablelist::cellbboxSubCmd
#------------------------------------------------------------------------------
proc tablelist::cellbboxSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win cellbbox cellIndex"
    }

    synchronize $win
    foreach {row col} [cellIndex $win [lindex $argList 0] 0] {}
    upvar ::tablelist::ns${win}::data data
    if {$row < 0 || $row > $data(lastRow) ||
	$col < 0 || $col > $data(lastCol)} {
	return {}
    }

    foreach {x y width height} [bboxSubCmd $win $row] {}
    set w $data(hdrTxtFrLbl)$col
    return [list [expr {[winfo rootx $w] - [winfo rootx $win]}] $y \
		 [winfo width $w] $height]
}

#------------------------------------------------------------------------------
# tablelist::cellcgetSubCmd
#------------------------------------------------------------------------------
proc tablelist::cellcgetSubCmd {win argList} {
    if {[llength $argList] != 2} {
	mwutil::wrongNumArgs "$win cellcget cellIndex option"
    }

    synchronize $win
    foreach {row col} [cellIndex $win [lindex $argList 0] 1] {}
    variable cellConfigSpecs
    set opt [mwutil::fullConfigOpt [lindex $argList 1] cellConfigSpecs]
    return [doCellCget $row $col $win $opt]
}

#------------------------------------------------------------------------------
# tablelist::cellconfigureSubCmd
#------------------------------------------------------------------------------
proc tablelist::cellconfigureSubCmd {win argList} {
    if {[llength $argList] < 1} {
	mwutil::wrongNumArgs "$win cellconfigure cellIndex ?option? ?value\
			      option value ...?"
    }

    synchronize $win
    displayItems $win
    variable cellConfigSpecs
    foreach {row col} [cellIndex $win [lindex $argList 0] 1] {}
    return [mwutil::configureSubCmd $win cellConfigSpecs \
	    "tablelist::doCellConfig $row $col" \
	    "tablelist::doCellCget $row $col" [lrange $argList 1 end]]
}

#------------------------------------------------------------------------------
# tablelist::cellindexSubCmd
#------------------------------------------------------------------------------
proc tablelist::cellindexSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win cellindex cellIndex"
    }

    synchronize $win
    return [join [cellIndex $win [lindex $argList 0] 0] ","]
}

#------------------------------------------------------------------------------
# tablelist::cellselectionSubCmd
#------------------------------------------------------------------------------
proc tablelist::cellselectionSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount < 2 || $argCount > 3} {
	mwutil::wrongNumArgs \
		"$win cellselection option firstCellIndex lastCellIndex" \
		"$win cellselection option cellIndexList"
    }

    synchronize $win
    displayItems $win
    variable selectionOpts
    set opt [mwutil::fullOpt "option" [lindex $argList 0] $selectionOpts]
    set first [lindex $argList 1]

    switch $opt {
	anchor -
	includes {
	    if {$argCount != 2} {
		mwutil::wrongNumArgs "$win cellselection $opt cellIndex"
	    }
	    foreach {row col} [cellIndex $win $first 0] {}
	    return [cellSelection $win $opt $row $col $row $col]
	}

	clear -
	set {
	    if {$argCount == 2} {
		foreach elem $first {
		    foreach {row col} [cellIndex $win $elem 0] {}
		    cellSelection $win $opt $row $col $row $col
		}
	    } else {
		foreach {firstRow firstCol} [cellIndex $win $first 0] {}
		foreach {lastRow lastCol} \
			[cellIndex $win [lindex $argList 2] 0] {}
		cellSelection $win $opt $firstRow $firstCol $lastRow $lastCol
	    }

	    updateColors $win
	    invokeMotionHandler $win
	    return ""
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::cgetSubCmd
#------------------------------------------------------------------------------
proc tablelist::cgetSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win cget option"
    }

    #
    # Return the value of the specified configuration option
    #
    variable configSpecs
    set opt [mwutil::fullConfigOpt [lindex $argList 0] configSpecs]
    return [doCget $win $opt]
}

#------------------------------------------------------------------------------
# tablelist::childcountSubCmd
#------------------------------------------------------------------------------
proc tablelist::childcountSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win childcount nodeIndex"
    }

    synchronize $win
    set key [nodeIndexToKey $win [lindex $argList 0]]
    upvar ::tablelist::ns${win}::data data
    return [llength $data($key-children)]
}

#------------------------------------------------------------------------------
# tablelist::childindexSubCmd
#------------------------------------------------------------------------------
proc tablelist::childindexSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win childindex index"
    }

    synchronize $win
    set row [rowIndex $win [lindex $argList 0] 0 1]
    upvar ::tablelist::ns${win}::data data
    set key [lindex $data(keyList) $row]
    set parentKey $data($key-parent)
    return [lsearch -exact $data($parentKey-children) $key]
}

#------------------------------------------------------------------------------
# tablelist::childkeysSubCmd
#------------------------------------------------------------------------------
proc tablelist::childkeysSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win childkeys nodeIndex"
    }

    synchronize $win
    set key [nodeIndexToKey $win [lindex $argList 0]]
    upvar ::tablelist::ns${win}::data data
    return $data($key-children)
}

#------------------------------------------------------------------------------
# tablelist::collapseSubCmd
#------------------------------------------------------------------------------
proc tablelist::collapseSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount < 1 || $argCount > 2} {
	mwutil::wrongNumArgs "$win collapse index ?-fully|-partly?"
    }

    synchronize $win
    displayItems $win
    set index [rowIndex $win [lindex $argList 0] 0 1]

    if {$argCount == 1} {
	set fullCollapsion 1
    } else {
	variable expCollOpts
	set opt [mwutil::fullOpt "option" [lindex $argList 1] $expCollOpts]
	set fullCollapsion [expr {[string compare $opt "-fully"] == 0}]
    }

    upvar ::tablelist::ns${win}::data data
    set key [lindex $data(keyList) $index]
    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)
    }

    if {[llength $data($key-children)] == 0} {
	return ""
    }

    #
    # 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 {$fullCollapsion} {
	    set descKey [lindex $data(keyList) $row]
	    if {[llength $data($descKey-children)] != 0} {
		collapseSubCmd $win [list [keyToRow $win $descKey] -fully]
	    }
	}
    }

    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
	#
	set widgets {}
	set fromTextIdx [expr {double($fromRow + 1)}]
	set toTextIdx [expr {double($toRow + 1)}]
	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 destroyId [after 300 [list tablelist::destroyWidgets $win]]
	lappend data(destroyIdList) $destroyId
	set data(widgets-$destroyId) $widgets

	adjustRowIndex $win data(anchorRow) 1

	set activeRow $data(activeRow)
	adjustRowIndex $win activeRow 1
	set data(activeRow) $activeRow

	makeStripes $win
	adjustElidedText $win
	redisplayVisibleItems $win
	updateColors $win
	adjustSepsWhenIdle $win
	updateVScrlbarWhenIdle $win
    }

    return ""
}

#------------------------------------------------------------------------------
# tablelist::collapseallSubCmd
#------------------------------------------------------------------------------
proc tablelist::collapseallSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount > 1} {
	mwutil::wrongNumArgs "$win collapseall ?-fully|-partly?"
    }

    if {$argCount == 0} {
	set fullCollapsion 1
    } else {
	variable expCollOpts
	set opt [mwutil::fullOpt "option" [lindex $argList 0] $expCollOpts]
	set fullCollapsion [expr {[string compare $opt "-fully"] == 0}]
    }

    synchronize $win
    displayItems $win

    upvar ::tablelist::ns${win}::data data
    set col $data(treeCol)

    if {[winfo viewable $win]} {
	purgeWidgets $win
	update idletasks
	if {![array exists ::tablelist::ns${win}::data]} {
	    return ""
	}
    }

    set childIdx 0
    set childCount [llength $data(root-children)]
    foreach key $data(root-children) {
	if {![info exists data($key,$col-indent)]} {
	    incr childIdx
	    continue
	}

	if {[string length $data(-collapsecommand)] != 0} {
	    uplevel #0 $data(-collapsecommand) [list $win [keyToRow $win $key]]
	}

	#
	# Change the indentation image from the expanded 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)
	}

	#
	# 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} {
			collapseSubCmd $win \
			    [list [keyToRow $win $descKey] -fully]
		    }
		}
	    }

	    #
	    # Destroy the label and messsage widgets
	    # embedded into the descendants just elided
	    #
	    set widgets {}
	    set fromTextIdx [expr {double($fromRow + 1)}]
	    set toTextIdx [expr {double($toRow + 1)}]
	    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 destroyId [after 300 [list tablelist::destroyWidgets $win]]
	    lappend data(destroyIdList) $destroyId
	    set data(widgets-$destroyId) $widgets
	}
    }

    adjustRowIndex $win data(anchorRow) 1

    set activeRow $data(activeRow)
    adjustRowIndex $win activeRow 1
    set data(activeRow) $activeRow

    makeStripes $win
    adjustElidedText $win
    redisplayVisibleItems $win
    updateColors $win
    adjustSepsWhenIdle $win
    updateVScrlbarWhenIdle $win
    return ""
}

#------------------------------------------------------------------------------
# tablelist::columnattribSubCmd
#------------------------------------------------------------------------------
proc tablelist::columnattribSubCmd {win argList} {
    if {[llength $argList] < 1} {
	mwutil::wrongNumArgs "$win columnattrib columnIndex ?name? ?value\
			      name value ...?"
    }

    set col [colIndex $win [lindex $argList 0] 1]
    return [mwutil::attribSubCmd $win $col [lrange $argList 1 end]]
}

#------------------------------------------------------------------------------
# tablelist::columncgetSubCmd
#------------------------------------------------------------------------------
proc tablelist::columncgetSubCmd {win argList} {
    if {[llength $argList] != 2} {
	mwutil::wrongNumArgs "$win columncget columnIndex option"
    }

    set col [colIndex $win [lindex $argList 0] 1]
    variable colConfigSpecs
    set opt [mwutil::fullConfigOpt [lindex $argList 1] colConfigSpecs]
    return [doColCget $col $win $opt]
}

#------------------------------------------------------------------------------
# tablelist::columnconfigureSubCmd
#------------------------------------------------------------------------------
proc tablelist::columnconfigureSubCmd {win argList} {
    if {[llength $argList] < 1} {
	mwutil::wrongNumArgs "$win columnconfigure columnIndex ?option? ?value\
			      option value ...?"
    }

    synchronize $win
    displayItems $win
    variable colConfigSpecs
    set col [colIndex $win [lindex $argList 0] 1]
    return [mwutil::configureSubCmd $win colConfigSpecs \
	    "tablelist::doColConfig $col" "tablelist::doColCget $col" \
	    [lrange $argList 1 end]]
}

#------------------------------------------------------------------------------
# tablelist::columncountSubCmd
#------------------------------------------------------------------------------
proc tablelist::columncountSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win columncount"
    }

    upvar ::tablelist::ns${win}::data data
    return $data(colCount)
}

#------------------------------------------------------------------------------
# tablelist::columnindexSubCmd
#------------------------------------------------------------------------------
proc tablelist::columnindexSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win columnindex columnIndex"
    }

    return [colIndex $win [lindex $argList 0] 0]
}

#------------------------------------------------------------------------------
# tablelist::columnwidthSubCmd
#------------------------------------------------------------------------------
proc tablelist::columnwidthSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount < 1 || $argCount > 2} {
	mwutil::wrongNumArgs "$win columnwidth columnIndex\
			      ?-requested|-stretched|-total?"
    }

    synchronize $win
    set col [colIndex $win [lindex $argList 0] 1]
    if {$argCount == 1} {
	set opt -requested
    } else {
	variable colWidthOpts
	set opt [mwutil::fullOpt "option" [lindex $argList 1] $colWidthOpts]
    }

    return [colWidth $win $col $opt]
}

#------------------------------------------------------------------------------
# tablelist::configcelllistSubCmd
#------------------------------------------------------------------------------
proc tablelist::configcelllistSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win configcelllist cellConfigSpecList"
    }

    return [configcellsSubCmd $win [lindex $argList 0]]
}

#------------------------------------------------------------------------------
# tablelist::configcellsSubCmd
#------------------------------------------------------------------------------
proc tablelist::configcellsSubCmd {win argList} {
    synchronize $win
    displayItems $win
    variable 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} [cellIndex $win $cell 1] {}
	mwutil::configureWidget $win cellConfigSpecs \
		"tablelist::doCellConfig $row $col" \
		"tablelist::doCellCget $row $col" [list $opt $val] 0
	incr argCount -3
    }

    return ""
}

#------------------------------------------------------------------------------
# tablelist::configcolumnlistSubCmd
#------------------------------------------------------------------------------
proc tablelist::configcolumnlistSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win configcolumnlist columnConfigSpecList"
    }

    return [configcolumnsSubCmd $win [lindex $argList 0]]
}

#------------------------------------------------------------------------------
# tablelist::configcolumnsSubCmd
#------------------------------------------------------------------------------
proc tablelist::configcolumnsSubCmd {win argList} {
    synchronize $win
    displayItems $win
    variable colConfigSpecs

    set argCount [llength $argList]
    foreach {col opt val} $argList {
	if {$argCount == 1} {
	    return -code error "option and value for \"$col\" missing"
	} elseif {$argCount == 2} {
	    return -code error "value for \"$opt\" missing"
	}
	set col [colIndex $win $col 1]
	mwutil::configureWidget $win colConfigSpecs \
		"tablelist::doColConfig $col" "tablelist::doColCget $col" \
		[list $opt $val] 0
	incr argCount -3
    }

    return ""
}

#------------------------------------------------------------------------------
# tablelist::configrowlistSubCmd
#------------------------------------------------------------------------------
proc tablelist::configrowlistSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win configrowlist rowConfigSpecList"
    }

    return [configrowsSubCmd $win [lindex $argList 0]]
}

#------------------------------------------------------------------------------
# tablelist::configrowsSubCmd
#------------------------------------------------------------------------------
proc tablelist::configrowsSubCmd {win argList} {
    synchronize $win
    displayItems $win
    variable 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 [rowIndex $win $rowSpec 0 1]
	mwutil::configureWidget $win rowConfigSpecs \
		"tablelist::doRowConfig $row" "tablelist::doRowCget $row" \
		[list $opt $val] 0
	incr argCount -3
    }

    return ""
}

#------------------------------------------------------------------------------
# tablelist::configureSubCmd
#------------------------------------------------------------------------------
proc tablelist::configureSubCmd {win argList} {
    variable configSpecs
    return [mwutil::configureSubCmd $win configSpecs tablelist::doConfig \
	    tablelist::doCget $argList]
}

#------------------------------------------------------------------------------
# tablelist::containingSubCmd
#------------------------------------------------------------------------------
proc tablelist::containingSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win containing y"
    }

    set y [format "%d" [lindex $argList 0]]
    synchronize $win
    displayItems $win
    return [containingRow $win $y]
}

#------------------------------------------------------------------------------
# tablelist::containingcellSubCmd
#------------------------------------------------------------------------------
proc tablelist::containingcellSubCmd {win argList} {
    if {[llength $argList] != 2} {
	mwutil::wrongNumArgs "$win containingcell x y"
    }

    set x [format "%d" [lindex $argList 0]]
    set y [format "%d" [lindex $argList 1]]
    synchronize $win
    displayItems $win
    return [containingRow $win $y],[containingCol $win $x]
}

#------------------------------------------------------------------------------
# tablelist::containingcolumnSubCmd
#------------------------------------------------------------------------------
proc tablelist::containingcolumnSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win containingcolumn x"
    }

    set x [format "%d" [lindex $argList 0]]
    synchronize $win
    displayItems $win
    return [containingCol $win $x]
}

#------------------------------------------------------------------------------
# tablelist::cornerlabelpathSubCmd
#------------------------------------------------------------------------------
proc tablelist::cornerlabelpathSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win cornerlabelpath"
    }

    upvar ::tablelist::ns${win}::data data
    return $data(cornerLbl)
}

#------------------------------------------------------------------------------
# tablelist::cornerpathSubCmd
#------------------------------------------------------------------------------
proc tablelist::cornerpathSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win cornerpath"
    }

    upvar ::tablelist::ns${win}::data data
    return $data(corner)
}

#------------------------------------------------------------------------------
# tablelist::curcellselectionSubCmd
#------------------------------------------------------------------------------
proc tablelist::curcellselectionSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win curcellselection"
    }

    synchronize $win
    displayItems $win
    return [curCellSelection $win]
}

#------------------------------------------------------------------------------
# tablelist::curselectionSubCmd
#------------------------------------------------------------------------------
proc tablelist::curselectionSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win curselection"
    }

    synchronize $win
    displayItems $win
    return [curSelection $win]
}

#------------------------------------------------------------------------------
# tablelist::deleteSubCmd
#------------------------------------------------------------------------------
proc tablelist::deleteSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount < 1 || $argCount > 2} {
	mwutil::wrongNumArgs "$win delete firstIndex lastIndex" \
			     "$win delete indexList"
    }

    upvar ::tablelist::ns${win}::data data
    if {$data(isDisabled)} {
	return ""
    }

    synchronize $win
    displayItems $win
    set first [lindex $argList 0]

    if {$argCount == 1} {
	if {[llength $first] == 1} {			;# just to save time
	    set index [rowIndex $win [lindex $first 0] 0]
	    return [deleteRows $win $index $index $data(hasListVar)]
	} elseif {$data(itemCount) == 0} {		;# no 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 [rowIndex $win $elem 0]
		if {$index < 0} {
		    set index 0
		} elseif {$index > $data(lastRow)} {
		    set index $data(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} {
		    deleteRows $win $index $index $data(hasListVar)
		    set prevIndex $index
		}
	    }
	    return ""
	}
    } else {
	set first [rowIndex $win $first 0]
	set last [rowIndex $win [lindex $argList 1] 0]
	return [deleteRows $win $first $last $data(hasListVar)]
    }
}

#------------------------------------------------------------------------------
# tablelist::deletecolumnsSubCmd
#------------------------------------------------------------------------------
proc tablelist::deletecolumnsSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount < 1 || $argCount > 2} {
	mwutil::wrongNumArgs \
		"$win deletecolumns firstColumnIndex lastColumnIndex" \
		"$win deletecolumns columnIndexList"
    }

    upvar ::tablelist::ns${win}::data data
    if {$data(isDisabled)} {
	return ""
    }

    synchronize $win
    displayItems $win
    set first [lindex $argList 0]

    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
	} elseif {$data(colCount) == 0} {		;# no columns present
	    return ""
	} else {					;# a bit more work
	    #
	    # Sort the numerical equivalents of the
	    # specified column indices in decreasing order
	    #
	    set colList {}
	    foreach elem $first {
		lappend colList [colIndex $win $elem 1]
	    }
	    set colList [lsort -integer -decreasing $colList]

	    #
	    # 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
		    set deleted 1
		    set prevCol $col
		}
	    }
	    if {$deleted} {
		redisplay $win 0 $selCells
	    }
	}
    } 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
	}
    }

    updateViewWhenIdle $win
    return ""
}

#------------------------------------------------------------------------------
# tablelist::depthSubCmd
#------------------------------------------------------------------------------
proc tablelist::depthSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win depth nodeIndex"
    }

    synchronize $win
    set key [nodeIndexToKey $win [lindex $argList 0]]
    return [depth $win $key]
}

#------------------------------------------------------------------------------
# tablelist::descendantcountSubCmd
#------------------------------------------------------------------------------
proc tablelist::descendantcountSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win descendantcount nodeIndex"
    }

    synchronize $win
    set key [nodeIndexToKey $win [lindex $argList 0]]
    return [descCount $win $key]
}

#------------------------------------------------------------------------------
# tablelist::editcellSubCmd
#------------------------------------------------------------------------------
proc tablelist::editcellSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win editcell cellIndex"
    }

    synchronize $win
    displayItems $win
    foreach {row col} [cellIndex $win [lindex $argList 0] 1] {}
    return [doEditCell $win $row $col 0]
}

#------------------------------------------------------------------------------
# tablelist::editinfoSubCmd
#------------------------------------------------------------------------------
proc tablelist::editinfoSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win editinfo"
    }

    upvar ::tablelist::ns${win}::data data
    return [list $data(editKey) $data(editRow) $data(editCol)]
}

#------------------------------------------------------------------------------
# tablelist::editwinpathSubCmd
#------------------------------------------------------------------------------
proc tablelist::editwinpathSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win editwinpath"
    }

    upvar ::tablelist::ns${win}::data data
    if {[winfo exists $data(bodyFrEd)]} {
	return $data(bodyFrEd)
    } else {
	return ""
    }
}

#------------------------------------------------------------------------------
# tablelist::editwintagSubCmd
#------------------------------------------------------------------------------
proc tablelist::editwintagSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win editwintag"
    }

    upvar ::tablelist::ns${win}::data data
    return $data(editwinTag)
}

#------------------------------------------------------------------------------
# tablelist::entrypathSubCmd
#------------------------------------------------------------------------------
proc tablelist::entrypathSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win entrypath"
    }

    upvar ::tablelist::ns${win}::data data
    if {[winfo exists $data(bodyFrEd)]} {
	set class [winfo class $data(bodyFrEd)]
	if {[regexp {^(Mentry|T?Checkbutton|T?Menubutton)$} $class]} {
	    return ""
	} else {
	    return $data(editFocus)
	}
    } else {
	return ""
    }
}

#------------------------------------------------------------------------------
# tablelist::expandSubCmd
#------------------------------------------------------------------------------
proc tablelist::expandSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount < 1 || $argCount > 2} {
	mwutil::wrongNumArgs "$win expand index ?-fully|-partly?"
    }

    synchronize $win
    displayItems $win
    set index [rowIndex $win [lindex $argList 0] 0 1]

    if {$argCount == 1} {
	set fullExpansion 1
    } else {
	variable expCollOpts
	set opt [mwutil::fullOpt "option" [lindex $argList 1] $expCollOpts]
	set fullExpansion [expr {[string compare $opt "-fully"] == 0}]
    }

    upvar ::tablelist::ns${win}::data data
    set key [lindex $data(keyList) $index]
    set col $data(treeCol)
    if {![info exists data($key,$col-indent)] ||
	[string match "*indented*" $data($key,$col-indent)]} {
	return ""
    }

    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) ""
    }

    #
    # 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)
    }

    #
    # 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]
	}
    }

    if {![string match "expand*SubCmd" $callerProc]} {
	makeStripes $win
	adjustElidedText $win
	redisplayVisibleItems $win
	updateColors $win
	adjustSepsWhenIdle $win
	updateVScrlbarWhenIdle $win
    }

    return ""
}

#------------------------------------------------------------------------------
# tablelist::expandallSubCmd
#------------------------------------------------------------------------------
proc tablelist::expandallSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount > 1} {
	mwutil::wrongNumArgs "$win expandall ?-fully|-partly?"
    }

    if {$argCount == 0} {
	set fullExpansion 1
    } else {
	variable expCollOpts
	set opt [mwutil::fullOpt "option" [lindex $argList 0] $expCollOpts]
	set fullExpansion [expr {[string compare $opt "-fully"] == 0}]
    }

    synchronize $win
    displayItems $win

    upvar ::tablelist::ns${win}::data data
    set col $data(treeCol)

    foreach key $data(root-children) {
	if {![info exists data($key,$col-indent)] ||
	    [string match "*indented*" $data($key,$col-indent)]} {
	    continue
	}

	if {[string length $data(-expandcommand)] != 0} {
	    set data(keyBeingExpanded) $key
	    uplevel #0 $data(-expandcommand) [list $win [keyToRow $win $key]]
	    set data(keyBeingExpanded) ""
	}

	#
	# 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)
	}

	#
	# Unelide the children and invoke expandSubCmd on them
	#
	foreach childKey $data($key-children) {
	    set childRow [keyToRow $win $childKey]
	    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]
	    }
	}
    }

    makeStripes $win
    adjustElidedText $win
    redisplayVisibleItems $win
    updateColors $win
    adjustSepsWhenIdle $win
    updateVScrlbarWhenIdle $win
    return ""
}

#------------------------------------------------------------------------------
# tablelist::expandedkeysSubCmd
#------------------------------------------------------------------------------
proc tablelist::expandedkeysSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win expandedkeys"
    }

    upvar ::tablelist::ns${win}::data data
    set result {}
    foreach name [array names data "*,$data(treeCol)-indent"] {
	if {[string match "tablelist_*_expanded*Img*" $data($name)]} {
	    set commaPos [string first "," $name]
	    lappend result [string range $name 0 [expr {$commaPos - 1}]]
	}
    }
    return $result
}

#------------------------------------------------------------------------------
# tablelist::fillcolumnSubCmd
#------------------------------------------------------------------------------
proc tablelist::fillcolumnSubCmd {win argList} {
    if {[llength $argList] != 2} {
	mwutil::wrongNumArgs "$win fillcolumn columnIndex text"
    }

    upvar ::tablelist::ns${win}::data data
    if {$data(isDisabled)} {
	return ""
    }

    synchronize $win
    displayItems $win
    set colIdx [colIndex $win [lindex $argList 0] 1]
    set text [lindex $argList 1]

    #
    # Update the item list
    #
    set newItemList {}
    foreach item $data(itemList) {
	set item [lreplace $item $colIdx $colIdx $text]
	lappend newItemList $item
    }
    set data(itemList) $newItemList

    #
    # Update the list variable if present
    #
    condUpdateListVar $win

    #
    # Adjust the columns and make sure the specified
    # column will be redisplayed at idle time
    #
    adjustColumns $win $colIdx 1
    redisplayColWhenIdle $win $colIdx
    updateViewWhenIdle $win
    return ""
}

#------------------------------------------------------------------------------
# tablelist::findcolumnnameSubCmd
#------------------------------------------------------------------------------
proc tablelist::findcolumnnameSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win findcolumnname name"
    }

    set name [lindex $argList 0]
    set nameIsEmpty [expr {[string length $name] == 0}]

    upvar ::tablelist::ns${win}::data data
    for {set col 0} {$col < $data(colCount)} {incr col} {
	set hasName [info exists data($col-name)]
	if {($hasName && [string compare $name $data($col-name)] == 0) ||
	    (!$hasName && $nameIsEmpty)} {
	    return $col
	}
    }

    return -1
}

#------------------------------------------------------------------------------
# tablelist::findrownameSubCmd
#------------------------------------------------------------------------------
proc tablelist::findrownameSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount < 1} {
	mwutil::wrongNumArgs "$win findrowname name ?-descend?\
			      ?-parent nodeIndex?"
    }

    synchronize $win
    set name [lindex $argList 0]
    set nameIsEmpty [expr {[string length $name] == 0}]

    #
    # Initialize some processing parameters
    #
    set parentKey root
    set descend 0						;# boolean

    #
    # Parse the argument list
    #
    variable findOpts
    for {set n 1} {$n < $argCount} {incr n} {
	set arg [lindex $argList $n]
	set opt [mwutil::fullOpt "option" $arg $findOpts]
	switch -- $opt {
	    -descend { set descend 1 }
	    -parent {
		if {$n == $argCount - 1} {
		    return -code error "value for \"$arg\" missing"
		}

		incr n
		set parentKey [nodeIndexToKey $win [lindex $argList $n]]
	    }
	}
    }

    upvar ::tablelist::ns${win}::data data
    set childCount [llength $data($parentKey-children)]
    if {$childCount == 0} {
	return -1
    }

    if {$descend} {
	set fromChildKey [lindex $data($parentKey-children) 0]
	set fromRow [keyToRow $win $fromChildKey]
	set toRow [nodeRow $win $parentKey end]
	for {set row $fromRow} {$row < $toRow} {incr row} {
	    set key [lindex $data(keyList) $row]
	    set hasName [info exists data($key-name)]
	    if {($hasName && [string compare $name $data($key-name)] == 0) ||
		(!$hasName && $nameIsEmpty)} {
		return $row
	    }
	}
    } else {
	for {set childIdx 0} {$childIdx < $childCount} {incr childIdx} {
	    set key [lindex $data($parentKey-children) $childIdx]
	    set hasName [info exists data($key-name)]
	    if {($hasName && [string compare $name $data($key-name)] == 0) ||
		(!$hasName && $nameIsEmpty)} {
		return [keyToRow $win $key]
	    }
	}
    }

    return -1
}

#------------------------------------------------------------------------------
# tablelist::finisheditingSubCmd
#------------------------------------------------------------------------------
proc tablelist::finisheditingSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win finishediting"
    }

    synchronize $win
    return [doFinishEditing $win]
}

#------------------------------------------------------------------------------
# tablelist::formatinfoSubCmd
#------------------------------------------------------------------------------
proc tablelist::formatinfoSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win formatinfo"
    }

    upvar ::tablelist::ns${win}::data data
    return [list $data(fmtKey) $data(fmtRow) $data(fmtCol)]
}

#------------------------------------------------------------------------------
# tablelist::getSubCmd
#------------------------------------------------------------------------------
proc tablelist::getSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount < 1 || $argCount > 2} {
	mwutil::wrongNumArgs "$win get firstIndex lastIndex" \
			     "$win get indexList"
    }

    synchronize $win
    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 [rowIndex $win $elem 0]
	    if {$row >= 0 && $row < $data(itemCount)} {
		set item [lindex $data(itemList) $row]
		lappend result [lrange $item 0 $data(lastCol)]
	    }
	}

	if {[llength $first] == 1} {
	    return [lindex $result 0]
	} else {
	    return $result
	}
    } else {
	set first [rowIndex $win $first 0]
	set last [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(lastRow)} {
	    set last $data(lastRow)
	}

	foreach item [lrange $data(itemList) $first $last] {
	    lappend result [lrange $item 0 $data(lastCol)]
	}
	return $result
    }
}

#------------------------------------------------------------------------------
# tablelist::getcellsSubCmd
#------------------------------------------------------------------------------
proc tablelist::getcellsSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount < 1 || $argCount > 2} {
	mwutil::wrongNumArgs "$win getcells firstCellIndex lastCellIndex" \
			     "$win getcells cellIndexList"
    }

    synchronize $win
    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} [cellIndex $win $elem 1] {}
	    lappend result [lindex [lindex $data(itemList) $row] $col]
	}

	if {[llength $first] == 1} {
	    return [lindex $result 0]
	} else {
	    return $result
	}
    } else {
	foreach {firstRow firstCol} [cellIndex $win $first 1] {}
	foreach {lastRow lastCol} [cellIndex $win [lindex $argList 1] 1] {}

	foreach item [lrange $data(itemList) $firstRow $lastRow] {
	    foreach elem [lrange $item $firstCol $lastCol] {
		lappend result $elem
	    }
	}
	return $result
    }
}

#------------------------------------------------------------------------------
# tablelist::getcolumnsSubCmd
#------------------------------------------------------------------------------
proc tablelist::getcolumnsSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount < 1 || $argCount > 2} {
	mwutil::wrongNumArgs \
		"$win getcolumns firstColumnIndex lastColumnIndex" \
		"$win getcolumns columnIndexList"
    }

    synchronize $win
    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(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(itemList) {
		lappend colResult [lindex $item $col]
	    }
	    lappend result $colResult
	}
	return $result
    }
}

#------------------------------------------------------------------------------
# tablelist::getformattedSubCmd
#------------------------------------------------------------------------------
proc tablelist::getformattedSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount < 1 || $argCount > 2} {
	mwutil::wrongNumArgs "$win getformatted firstIndex lastIndex" \
			     "$win getformatted indexList"
    }

    synchronize $win
    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 [rowIndex $win $elem 0]
	    if {$row >= 0 && $row < $data(itemCount)} {
		set item [lindex $data(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 [rowIndex $win $first 0]
	set last [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(lastRow)} {
	    set last $data(lastRow)
	}

	set row $first
	foreach item [lrange $data(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::getformattedcellsSubCmd
#------------------------------------------------------------------------------
proc tablelist::getformattedcellsSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount < 1 || $argCount > 2} {
	mwutil::wrongNumArgs \
		"$win getformattedcells firstCellIndex lastCellIndex" \
		"$win getformattedcells cellIndexList"
    }

    synchronize $win
    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} [cellIndex $win $elem 1] {}
	    set item [lindex $data(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} [cellIndex $win $first 1] {}
	foreach {lastRow lastCol} [cellIndex $win [lindex $argList 1] 1] {}

	set row $firstRow
	foreach item [lrange $data(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::getformattedcolumnsSubCmd
#------------------------------------------------------------------------------
proc tablelist::getformattedcolumnsSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount < 1 || $argCount > 2} {
	mwutil::wrongNumArgs \
		"$win getformattedcolumns firstColumnIndex lastColumnIndex" \
		"$win getformattedcolumns columnIndexList"
    }

    synchronize $win
    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(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(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::getfullkeysSubCmd
#------------------------------------------------------------------------------
proc tablelist::getfullkeysSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount < 1 || $argCount > 2} {
	mwutil::wrongNumArgs "$win getfullkeys firstIndex lastIndex" \
			     "$win getfullkeys indexList"
    }

    synchronize $win
    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 [rowIndex $win $elem 0]
	    if {$row >= 0 && $row < $data(itemCount)} {
		lappend result [lindex [lindex $data(itemList) $row] end]
	    }
	}

	if {[llength $first] == 1} {
	    return [lindex $result 0]
	} else {
	    return $result
	}
    } else {
	set first [rowIndex $win $first 0]
	set last [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(lastRow)} {
	    set last $data(lastRow)
	}

	foreach item [lrange $data(itemList) $first $last] {
	    lappend result [lindex $item end]
	}
	return $result
    }
}

#------------------------------------------------------------------------------
# tablelist::getkeysSubCmd
#------------------------------------------------------------------------------
proc tablelist::getkeysSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount < 1 || $argCount > 2} {
	mwutil::wrongNumArgs "$win getkeys firstIndex lastIndex" \
			     "$win getkeys indexList"
    }

    synchronize $win
    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 [rowIndex $win $elem 0]
	    if {$row >= 0 && $row < $data(itemCount)} {
		set item [lindex $data(itemList) $row]
		lappend result [string range [lindex $item end] 1 end]
	    }
	}

	if {[llength $first] == 1} {
	    return [lindex $result 0]
	} else {
	    return $result
	}
    } else {
	set first [rowIndex $win $first 0]
	set last [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(lastRow)} {
	    set last $data(lastRow)
	}

	foreach item [lrange $data(itemList) $first $last] {
	    lappend result [string range [lindex $item end] 1 end]
	}
	return $result
    }
}

#------------------------------------------------------------------------------
# tablelist::hasattribSubCmd
#------------------------------------------------------------------------------
proc tablelist::hasattribSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win hasattrib name"
    }

    return [mwutil::hasattribSubCmd $win "widget" [lindex $argList 0]]
}

#------------------------------------------------------------------------------
# tablelist::hascellattribSubCmd
#------------------------------------------------------------------------------
proc tablelist::hascellattribSubCmd {win argList} {
    if {[llength $argList] != 2} {
	mwutil::wrongNumArgs "$win hascellattrib cellIndex name"
    }

    synchronize $win
    foreach {row col} [cellIndex $win [lindex $argList 0] 1] {}
    upvar ::tablelist::ns${win}::data data
    set key [lindex $data(keyList) $row]
    return [mwutil::hasattribSubCmd $win $key,$col [lindex $argList 1]]
}

#------------------------------------------------------------------------------
# tablelist::hascolumnattribSubCmd
#------------------------------------------------------------------------------
proc tablelist::hascolumnattribSubCmd {win argList} {
    if {[llength $argList] != 2} {
	mwutil::wrongNumArgs "$win hascolumnattrib columnIndex name"
    }

    set col [colIndex $win [lindex $argList 0] 1]
    return [mwutil::hasattribSubCmd $win $col [lindex $argList 1]]
}

#------------------------------------------------------------------------------
# tablelist::hasrowattribSubCmd
#------------------------------------------------------------------------------
proc tablelist::hasrowattribSubCmd {win argList} {
    if {[llength $argList] != 2} {
	mwutil::wrongNumArgs "$win hasrowattrib index name"
    }

    synchronize $win
    set row [rowIndex $win [lindex $argList 0] 0 1]
    upvar ::tablelist::ns${win}::data data
    set key [lindex $data(keyList) $row]
    return [mwutil::hasattribSubCmd $win $key [lindex $argList 1]]
}

#------------------------------------------------------------------------------
# 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
    set treeCol $data(treeCol)
    set treeStyle $data(-treestyle)

    #
    # Mark the parent item as expanded if it was just indented
    #
    set depth [depth $win $parentKey]
    if {[info exists data($parentKey,$treeCol-indent)] &&
	[string compare $data($parentKey,$treeCol-indent) \
	 tablelist_${treeStyle}_indentedImg$depth] == 0} {
	set data($parentKey,$treeCol-indent) \
	    tablelist_${treeStyle}_expandedImg$depth
	if {[winfo exists $data(body).ind_$parentKey,$treeCol]} {
	    $data(body).ind_$parentKey,$treeCol configure -image \
		$data($parentKey,$treeCol-indent)
	}
    }

    #
    # Elide the new items if the parent is collapsed or non-viewable
    #
    set itemCount [llength $itemList]
    if {[string compare $parentKey $data(keyBeingExpanded)] != 0 &&
	(([info exists data($parentKey,$treeCol-indent)] && \
	  [string compare $data($parentKey,$treeCol-indent) \
	   tablelist_${treeStyle}_collapsedImg$depth] == 0) || \
	 [info exists data($parentKey-elide)] || \
	 [info exists data($parentKey-hide)])} {
	for {set n 0; set row $listIdx} {$n < $itemCount} {incr n; incr row} {
	    doRowConfig $row $win -elide 1
	}
    }

    #
    # Mark the new items as indented
    #
    incr depth
    variable maxIndentDepths
    if {$depth > $maxIndentDepths($treeStyle)} {
	createTreeImgs $treeStyle $depth
	set maxIndentDepths($treeStyle) $depth
    }
    for {set n 0; set row $listIdx} {$n < $itemCount} {incr n; incr row} {
	doCellConfig $row $treeCol $win -indent \
		     tablelist_${treeStyle}_indentedImg$depth
    }

    return $result
}

#------------------------------------------------------------------------------
# tablelist::insertchildrenSubCmd
#------------------------------------------------------------------------------
proc tablelist::insertchildrenSubCmd {win argList} {
    if {[llength $argList] < 2} {
	mwutil::wrongNumArgs "$win insertchildren parentNodeIndex childIndex\
			      ?item item ...?"
    }

    return [insertchildlistSubCmd $win [list [lindex $argList 0] \
	    [lindex $argList 1] [lrange $argList 2 end]]]
}

#------------------------------------------------------------------------------
# tablelist::insertcolumnlistSubCmd
#------------------------------------------------------------------------------
proc tablelist::insertcolumnlistSubCmd {win argList} {
    if {[llength $argList] != 2} {
	mwutil::wrongNumArgs "$win insertcolumnlist columnIndex columnList"
    }

    upvar ::tablelist::ns${win}::data data
    if {$data(isDisabled)} {
	return ""
    }

    synchronize $win
    displayItems $win
    set arg0 [lindex $argList 0]
    if {[string first $arg0 "end"] == 0 || $arg0 == $data(colCount)} {
	set col $data(colCount)
    } else {
	set col [colIndex $win $arg0 1]
    }

    return [insertCols $win $col [lindex $argList 1]]
}

#------------------------------------------------------------------------------
# tablelist::insertcolumnsSubCmd
#------------------------------------------------------------------------------
proc tablelist::insertcolumnsSubCmd {win argList} {
    if {[llength $argList] < 1} {
	mwutil::wrongNumArgs "$win insertcolumns columnIndex\
		?width title ?alignment? width title ?alignment? ...?"
    }

    upvar ::tablelist::ns${win}::data data
    if {$data(isDisabled)} {
	return ""
    }

    synchronize $win
    displayItems $win
    set arg0 [lindex $argList 0]
    if {[string first $arg0 "end"] == 0 || $arg0 == $data(colCount)} {
	set col $data(colCount)
    } else {
	set col [colIndex $win $arg0 1]
    }

    return [insertCols $win $col [lrange $argList 1 end]]
}

#------------------------------------------------------------------------------
# tablelist::insertlistSubCmd
#------------------------------------------------------------------------------
proc tablelist::insertlistSubCmd {win argList} {
    if {[llength $argList] != 2} {
	mwutil::wrongNumArgs "$win insertlist index itemList"
    }

    upvar ::tablelist::ns${win}::data data
    if {$data(isDisabled)} {
	return ""
    }

    synchronize $win
    set index [rowIndex $win [lindex $argList 0] 1]
    return [insertRows $win $index [lindex $argList 1] \
	    $data(hasListVar) root $index]
}

#------------------------------------------------------------------------------
# tablelist::iselemsnippedSubCmd
#------------------------------------------------------------------------------
proc tablelist::iselemsnippedSubCmd {win argList} {
    if {[llength $argList] != 2} {
	mwutil::wrongNumArgs "$win iselemsnipped cellIndex fullTextName"
    }

    synchronize $win
    foreach {row col} [cellIndex $win [lindex $argList 0] 1] {}
    set fullTextName [lindex $argList 1]
    upvar 2 $fullTextName fullText

    upvar ::tablelist::ns${win}::data data
    set item [lindex $data(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
    getIndentData $win $key $col indentWidth
    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::isexpandedSubCmd
#------------------------------------------------------------------------------
proc tablelist::isexpandedSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win isexpanded index"
    }

    synchronize $win
    set row [rowIndex $win [lindex $argList 0] 0]
    upvar ::tablelist::ns${win}::data data
    set key [lindex $data(keyList) $row]
    set treeCol $data(treeCol)
    if {[info exists data($key,$treeCol-indent)]} {
	return [string match "*expanded*" $data($key,$treeCol-indent)]
    } else {
	return 0
    }
}

#------------------------------------------------------------------------------
# tablelist::istitlesnippedSubCmd
#------------------------------------------------------------------------------
proc tablelist::istitlesnippedSubCmd {win argList} {
    if {[llength $argList] != 2} {
	mwutil::wrongNumArgs "$win istitlesnipped columnIndex fullTextName"
    }

    set col [colIndex $win [lindex $argList 0] 1]
    set fullTextName [lindex $argList 1]
    upvar 2 $fullTextName fullText

    upvar ::tablelist::ns${win}::data data
    set fullText [lindex $data(-columns) [expr {3*$col + 1}]]
    return $data($col-isSnipped)
}

#------------------------------------------------------------------------------
# tablelist::isviewableSubCmd
#------------------------------------------------------------------------------
proc tablelist::isviewableSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win isviewable index"
    }

    synchronize $win
    set row [rowIndex $win [lindex $argList 0] 0 1]
    return [isRowViewable $win $row]
}

#------------------------------------------------------------------------------
# tablelist::itemlistvarSubCmd
#------------------------------------------------------------------------------
proc tablelist::itemlistvarSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win itemlistvar"
    }

    return ::tablelist::ns${win}::data(itemList)
}

#------------------------------------------------------------------------------
# tablelist::labelpathSubCmd
#------------------------------------------------------------------------------
proc tablelist::labelpathSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win labelpath columnIndex"
    }

    set col [colIndex $win [lindex $argList 0] 1]
    upvar ::tablelist::ns${win}::data data
    return $data(hdrTxtFrLbl)$col
}

#------------------------------------------------------------------------------
# tablelist::labelsSubCmd
#------------------------------------------------------------------------------
proc tablelist::labelsSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win labels"
    }

    upvar ::tablelist::ns${win}::data data
    set labelList {}
    for {set col 0} {$col < $data(colCount)} {incr col} {
	lappend labelList $data(hdrTxtFrLbl)$col
    }

    return $labelList
}

#------------------------------------------------------------------------------
# tablelist::labeltagSubCmd
#------------------------------------------------------------------------------
proc tablelist::labeltagSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win labeltag"
    }

    upvar ::tablelist::ns${win}::data data
    return $data(labelTag)
}

#------------------------------------------------------------------------------
# tablelist::moveSubCmd
#------------------------------------------------------------------------------
proc tablelist::moveSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount < 2 || $argCount > 3} {
	mwutil::wrongNumArgs \
		"$win move sourceIndex targetIndex" \
		"$win move sourceIndex targetParentNodeIndex targetChildIndex"
    }

    synchronize $win
    displayItems $win
    set source [rowIndex $win [lindex $argList 0] 0]
    if {$argCount == 2} {
	set target [rowIndex $win [lindex $argList 1] 1]
	return [moveRow $win $source $target]
    } else {
	set targetParentKey [nodeIndexToKey $win [lindex $argList 1]]
	set targetChildIdx [lindex $argList 2]
	return [moveNode $win $source $targetParentKey $targetChildIdx]
    }
}

#------------------------------------------------------------------------------
# tablelist::movecolumnSubCmd
#------------------------------------------------------------------------------
proc tablelist::movecolumnSubCmd {win argList} {
    if {[llength $argList] != 2} {
	mwutil::wrongNumArgs "$win movecolumn sourceColumnIndex\
			      targetColumnIndex"
    }

    synchronize $win
    displayItems $win
    set arg0 [lindex $argList 0]
    set source [colIndex $win $arg0 1]
    set arg1 [lindex $argList 1]
    upvar ::tablelist::ns${win}::data data
    if {[string first $arg1 "end"] == 0 || $arg1 == $data(colCount)} {
	set target $data(colCount)
    } else {
	set target [colIndex $win $arg1 1]
    }

    return [moveCol $win $source $target]
}

#------------------------------------------------------------------------------
# tablelist::nearestSubCmd
#------------------------------------------------------------------------------
proc tablelist::nearestSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win nearest y"
    }

    set y [format "%d" [lindex $argList 0]]
    synchronize $win
    displayItems $win
    return [rowIndex $win @0,$y 0]
}

#------------------------------------------------------------------------------
# tablelist::nearestcellSubCmd
#------------------------------------------------------------------------------
proc tablelist::nearestcellSubCmd {win argList} {
    if {[llength $argList] != 2} {
	mwutil::wrongNumArgs "$win nearestcell x y"
    }

    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] ","]
}

#------------------------------------------------------------------------------
# tablelist::nearestcolumnSubCmd
#------------------------------------------------------------------------------
proc tablelist::nearestcolumnSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win nearestcolumn x"
    }

    set x [format "%d" [lindex $argList 0]]
    return [colIndex $win @$x,0 0]
}

#------------------------------------------------------------------------------
# tablelist::noderowSubCmd
#------------------------------------------------------------------------------
proc tablelist::noderowSubCmd {win argList} {
    if {[llength $argList] != 2} {
	mwutil::wrongNumArgs "$win noderow parentNodeIndex childIndex"
    }

    synchronize $win
    set parentKey [nodeIndexToKey $win [lindex $argList 0]]
    set childIdx [lindex $argList 1]
    return [nodeRow $win $parentKey $childIdx]
}

#------------------------------------------------------------------------------
# tablelist::parentkeySubCmd
#------------------------------------------------------------------------------
proc tablelist::parentkeySubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win parentkey nodeIndex"
    }

    synchronize $win
    set key [nodeIndexToKey $win [lindex $argList 0]]
    upvar ::tablelist::ns${win}::data data
    return $data($key-parent)
}

#------------------------------------------------------------------------------
# tablelist::refreshsortingSubCmd
#------------------------------------------------------------------------------
proc tablelist::refreshsortingSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount > 1} {
	mwutil::wrongNumArgs "$win refreshsorting ?parentNodeIndex?"
    }

    synchronize $win
    displayItems $win
    if {$argCount == 0} {
	set parentKey root
    } else {
	set parentKey [nodeIndexToKey $win [lindex $argList 0]]
    }

    upvar ::tablelist::ns${win}::data data
    set sortOrderList {}
    foreach col $data(sortColList) {
	lappend sortOrderList $data($col-sortOrder)
    }

    return [sortItems $win $parentKey $data(sortColList) $sortOrderList]
}

#------------------------------------------------------------------------------
# tablelist::rejectinputSubCmd
#------------------------------------------------------------------------------
proc tablelist::rejectinputSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win rejectinput"
    }

    upvar ::tablelist::ns${win}::data data
    set data(rejected) 1
    return ""
}

#------------------------------------------------------------------------------
# tablelist::resetsortinfoSubCmd
#------------------------------------------------------------------------------
proc tablelist::resetsortinfoSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win resetsortinfo"
    }

    upvar ::tablelist::ns${win}::data data

    foreach col $data(sortColList) {
	set data($col-sortRank) 0
	set data($col-sortOrder) ""
    }

    set whichWidths {}
    foreach col $data(arrowColList) {
	lappend whichWidths l$col
    }

    set data(sortColList) {}
    set data(arrowColList) {}
    set data(sortOrder) {}

    if {[llength $whichWidths] > 0} {
	synchronize $win
	displayItems $win
	adjustColumns $win $whichWidths 1
    }

    return ""
}

#------------------------------------------------------------------------------
# tablelist::rowattribSubCmd
#------------------------------------------------------------------------------
proc tablelist::rowattribSubCmd {win argList} {
    if {[llength $argList] < 1} {
	mwutil::wrongNumArgs "$win rowattrib index ?name? ?value\
			      name value ...?"
    }

    synchronize $win
    set row [rowIndex $win [lindex $argList 0] 0 1]
    upvar ::tablelist::ns${win}::data data
    set key [lindex $data(keyList) $row]
    return [mwutil::attribSubCmd $win $key [lrange $argList 1 end]]
}

#------------------------------------------------------------------------------
# tablelist::rowcgetSubCmd
#------------------------------------------------------------------------------
proc tablelist::rowcgetSubCmd {win argList} {
    if {[llength $argList] != 2} {
	mwutil::wrongNumArgs "$win rowcget index option"
    }

    synchronize $win
    set row [rowIndex $win [lindex $argList 0] 0 1]
    variable rowConfigSpecs
    set opt [mwutil::fullConfigOpt [lindex $argList 1] rowConfigSpecs]
    return [doRowCget $row $win $opt]
}

#------------------------------------------------------------------------------
# tablelist::rowconfigureSubCmd
#------------------------------------------------------------------------------
proc tablelist::rowconfigureSubCmd {win argList} {
    if {[llength $argList] < 1} {
	mwutil::wrongNumArgs "$win rowconfigure index ?option? ?value\
			      option value ...?"
    }

    synchronize $win
    displayItems $win
    variable rowConfigSpecs
    set row [rowIndex $win [lindex $argList 0] 0 1]
    return [mwutil::configureSubCmd $win rowConfigSpecs \
	    "tablelist::doRowConfig $row" "tablelist::doRowCget $row" \
	    [lrange $argList 1 end]]
}

#------------------------------------------------------------------------------
# tablelist::scanSubCmd
#------------------------------------------------------------------------------
proc tablelist::scanSubCmd {win argList} {
    if {[llength $argList] != 3} {
	mwutil::wrongNumArgs "$win scan mark|dragto x y"
    }

    set x [format "%d" [lindex $argList 1]]
    set y [format "%d" [lindex $argList 2]]
    variable scanOpts
    set opt [mwutil::fullOpt "option" [lindex $argList 0] $scanOpts]
    synchronize $win
    displayItems $win
    return [doScan $win $opt $x $y]
}

#------------------------------------------------------------------------------
# tablelist::searchcolumnSubCmd
#------------------------------------------------------------------------------
proc tablelist::searchcolumnSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount < 2} {
	mwutil::wrongNumArgs "$win searchcolumn columnIndex pattern ?options?"
    }

    synchronize $win
    set col [colIndex $win [lindex $argList 0] 1]
    set pattern [lindex $argList 1]

    #
    # Initialize some processing parameters
    #
    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

    #
    # Parse the argument list
    #
    variable searchOpts
    for {set n 2} {$n < $argCount} {incr n} {
	set arg [lindex $argList $n]
	set opt [mwutil::fullOpt "option" $arg $searchOpts]
	switch -- $opt {
	    -all	{ set allMatches 1}
	    -backwards	{ set backwards 1 }
	    -check {
		if {$n == $argCount - 1} {
		    return -code error "value for \"$arg\" missing"
		}

		incr n
		set checkCmd [lindex $argList $n]
	    }
	    -descend	{ set descend 1 }
	    -exact	{ set mode -exact }
	    -formatted	{ set formatted 1 }
	    -glob	{ set mode -glob }
	    -nocase	{ set noCase 1 }
	    -not	{ set negated 1 }
	    -numeric	{ set numeric 1 }
	    -parent {
		if {$n == $argCount - 1} {
		    return -code error "value for \"$arg\" missing"
		}

		incr n
		set parentKey [nodeIndexToKey $win [lindex $argList $n]]
	    }
	    -regexp	{ set mode -regexp }
	    -start {
		if {$n == $argCount - 1} {
		    return -code error "value for \"$arg\" missing"
		}

		incr n
		set startRow [rowIndex $win [lindex $argList $n] 0]
		set gotStartRow 1
	    }
	}
    }

    if {([string compare $mode "-exact"] == 0 && !$numeric && $noCase) ||
	([string compare $mode "-glob"] == 0 && $noCase)} {
	set pattern [string tolower $pattern]
    }

    upvar ::tablelist::ns${win}::data data
    if {[string length $data(-populatecommand)] != 0} {
	#
	# Populate the relevant subtree(s) if necessary
	#
	if {[string compare $parentKey "root"] == 0} {
	    if {$descend} {
		for {set row 0} {$row < $data(itemCount)} {incr row} {
		    populate $win $row 1
		}
	    }
	} else {
	    populate $win [keyToRow $win $parentKey] $descend
	}
    }

    #
    # Build the list of row indices of the matching elements
    #
    set rowList {}
    set useFormatCmd [expr {$formatted && [lindex $data(fmtCmdFlagList) $col]}]
    set childCount [llength $data($parentKey-children)]
    if {$childCount != 0} {
	if {$backwards} {
	    set childIdx [expr {$childCount - 1}]
	    if {$descend} {
		set childKey [lindex $data($parentKey-children) $childIdx]
		set maxRow [expr {[nodeRow $win $childKey end] - 1}]
		if {$gotStartRow && $maxRow > $startRow} {
		    set maxRow $startRow
		}
		set minRow [nodeRow $win $parentKey 0]
		for {set row $maxRow} {$row >= $minRow} {incr row -1} {
		    set item [lindex $data(itemList) $row]
		    set elem [lindex $item $col]
		    if {$useFormatCmd} {
			set key [lindex $item end]
			set elem [formatElem $win $key $row $col $elem]
		    }
		    if {[doesMatch $win $row $col $pattern $elem $mode \
			 $numeric $noCase $checkCmd] != $negated} {
			lappend rowList $row
			if {!$allMatches} {
			    break
			}
		    }
		}
	    } else {
		for {} {$childIdx >= 0} {incr childIdx -1} {
		    set key [lindex $data($parentKey-children) $childIdx]
		    set row [keyToRow $win $key]
		    if {$gotStartRow && $row > $startRow} {
			continue
		    }
		    set elem [lindex [lindex $data(itemList) $row] $col]
		    if {$useFormatCmd} {
			set elem [formatElem $win $key $row $col $elem]
		    }
		    if {[doesMatch $win $row $col $pattern $elem $mode \
			 $numeric $noCase $checkCmd] != $negated} {
			lappend rowList $row
			if {!$allMatches} {
			    break
			}
		    }
		}
	    }
	} else {
	    set childIdx 0
	    if {$descend} {
		set childKey [lindex $data($parentKey-children) $childIdx]
		set fromRow [keyToRow $win $childKey]
		if {$gotStartRow && $fromRow < $startRow} {
		    set fromRow $startRow
		}
		set toRow [nodeRow $win $parentKey end]
		for {set row $fromRow} {$row < $toRow} {incr row} {
		    set item [lindex $data(itemList) $row]
		    set elem [lindex $item $col]
		    if {$useFormatCmd} {
			set key [lindex $item end]
			set elem [formatElem $win $key $row $col $elem]
		    }
		    if {[doesMatch $win $row $col $pattern $elem $mode \
			 $numeric $noCase $checkCmd] != $negated} {
			lappend rowList $row
			if {!$allMatches} {
			    break
			}
		    }
		}
	    } else {
		for {} {$childIdx < $childCount} {incr childIdx} {
		    set key [lindex $data($parentKey-children) $childIdx]
		    set row [keyToRow $win $key]
		    if {$gotStartRow && $row < $startRow} {
			continue
		    }
		    set elem [lindex [lindex $data(itemList) $row] $col]
		    if {$useFormatCmd} {
			set elem [formatElem $win $key $row $col $elem]
		    }
		    if {[doesMatch $win $row $col $pattern $elem $mode \
			 $numeric $noCase $checkCmd] != $negated} {
			lappend rowList $row
			if {!$allMatches} {
			    break
			}
		    }
		}
	    }
	}
    }

    if {$allMatches} {
	return $rowList
    } elseif {[llength $rowList] == 0} {
	return -1
    } else {
	return [lindex $rowList 0]
    }
}

#------------------------------------------------------------------------------
# tablelist::seeSubCmd
#------------------------------------------------------------------------------
proc tablelist::seeSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win see index"
    }

    synchronize $win
    displayItems $win
    set index [rowIndex $win [lindex $argList 0] 0]
    seeRow $win $index
    return ""
}

#------------------------------------------------------------------------------
# tablelist::seecellSubCmd
#------------------------------------------------------------------------------
proc tablelist::seecellSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win seecell cellIndex"
    }

    synchronize $win
    displayItems $win
    foreach {row col} [cellIndex $win [lindex $argList 0] 0] {}
    if {[winfo viewable $win]} {
	return [seeCell $win $row $col]
    } else {
	after idle [list tablelist::seeCell $win $row $col]
	return ""
    }
}

#------------------------------------------------------------------------------
# tablelist::seecolumnSubCmd
#------------------------------------------------------------------------------
proc tablelist::seecolumnSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win seecolumn columnIndex"
    }

    synchronize $win
    displayItems $win
    set col [colIndex $win [lindex $argList 0] 0]
    if {[winfo viewable $win]} {
	return [seeCell $win [rowIndex $win @0,0 0] $col]
    } else {
	after idle [list tablelist::seeCell $win [rowIndex $win @0,0 0] $col]
	return ""
    }
}

#------------------------------------------------------------------------------
# tablelist::selectionSubCmd
#------------------------------------------------------------------------------
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"
    }

    synchronize $win
    displayItems $win
    variable selectionOpts
    set opt [mwutil::fullOpt "option" [lindex $argList 0] $selectionOpts]
    set first [lindex $argList 1]

    switch $opt {
	anchor -
	includes {
	    if {$argCount != 2} {
		mwutil::wrongNumArgs "$win selection $opt index"
	    }
	    set index [rowIndex $win $first 0]
	    return [rowSelection $win $opt $index $index]
	}

	clear -
	set {
	    if {$argCount == 2} {
		foreach elem $first {
		    set index [rowIndex $win $elem 0]
		    rowSelection $win $opt $index $index
		}
	    } else {
		set first [rowIndex $win $first 0]
		set last [rowIndex $win [lindex $argList 2] 0]
		rowSelection $win $opt $first $last
	    }

	    updateColors $win
	    invokeMotionHandler $win
	    return ""
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::separatorpathSubCmd
#------------------------------------------------------------------------------
proc tablelist::separatorpathSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount > 1} {
	mwutil::wrongNumArgs "$win separatorpath ?columnIndex?"
    }

    upvar ::tablelist::ns${win}::data data
    if {$argCount == 0} {
	if {[winfo exists $data(sep)]} {
	    return $data(sep)
	} else {
	    return ""
	}
    } else {
	set col [colIndex $win [lindex $argList 0] 1]
	if {$data(-showseparators)} {
	    return $data(sep)$col
	} else {
	    return ""
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::separatorsSubCmd
#------------------------------------------------------------------------------
proc tablelist::separatorsSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win separators"
    }

    set sepList {}
    foreach w [winfo children $win] {
	if {[regexp {^sep([0-9]+)?$} [winfo name $w]]} {
	    lappend sepList $w
	}
    }

    return [lsort -dictionary $sepList]
}

#------------------------------------------------------------------------------
# tablelist::showtargetmarkSubCmd
#------------------------------------------------------------------------------
proc tablelist::showtargetmarkSubCmd {win argList} {
    if {[llength $argList] != 2} {
	mwutil::wrongNumArgs "$win showtargetmark before|inside index"
    }

    variable targetOpts
    set opt [mwutil::fullOpt "option" [lindex $argList 0] $targetOpts]
    set index [lindex $argList 1]

    upvar ::tablelist::ns${win}::data data
    set w $data(body)

    switch $opt {
	before {
	    set row [rowIndex $win $index 1]
	    if {$data(itemCount) == 0} {
		set y 0
	    } elseif {$row >= $data(itemCount)} {
		set dlineinfo [$w dlineinfo [expr {double($data(itemCount))}]]
		if {[llength $dlineinfo] == 0} {
		    return ""
		}

		set lineY [lindex $dlineinfo 1]
		set lineHeight [lindex $dlineinfo 3]
		set y [expr {$lineY + $lineHeight}]
	    } else {
		if {$row < 0} {
		    set row 0
		}
		set dlineinfo [$w dlineinfo [expr {double($row + 1)}]]
		if {[llength $dlineinfo] == 0} {
		    return ""
		}

		set y [lindex $dlineinfo 1]
	    }

	    place $data(rowGap) -anchor w -y $y -height 4 \
				-width [winfo width $data(hdrTxtFr)]
	}

	inside {
	    set row [rowIndex $win $index 0 1]
	    set dlineinfo [$w dlineinfo [expr {double($row + 1)}]]
	    if {[llength $dlineinfo] == 0} {
		return ""
	    }

	    set lineY [lindex $dlineinfo 1]
	    set lineHeight [lindex $dlineinfo 3]
	    set y [expr {$lineY + $lineHeight/2}]

	    place $data(rowGap) -anchor w -y $y -height $lineHeight -width 6
	}
    }

    raise $data(rowGap)
    return ""
}

#------------------------------------------------------------------------------
# tablelist::sizeSubCmd
#------------------------------------------------------------------------------
proc tablelist::sizeSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win size"
    }

    synchronize $win
    upvar ::tablelist::ns${win}::data data
    return $data(itemCount)
}

#------------------------------------------------------------------------------
# tablelist::sortSubCmd
#------------------------------------------------------------------------------
proc tablelist::sortSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount > 1} {
	mwutil::wrongNumArgs "$win sort ?-increasing|-decreasing?"
    }

    if {$argCount == 0} {
	set order -increasing
    } else {
	variable sortOpts
	set order [mwutil::fullOpt "option" [lindex $argList 0] $sortOpts]
    }

    synchronize $win
    displayItems $win
    return [sortItems $win root -1 [string range $order 1 end]]
}

#------------------------------------------------------------------------------
# tablelist::sortbycolumnSubCmd
#------------------------------------------------------------------------------
proc tablelist::sortbycolumnSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount < 1 || $argCount > 2} {
	mwutil::wrongNumArgs "$win sortbycolumn columnIndex\
			      ?-increasing|-decreasing?"
    }

    synchronize $win
    displayItems $win
    set col [colIndex $win [lindex $argList 0] 1]
    if {$argCount == 1} {
	set order -increasing
    } else {
	variable sortOpts
	set order [mwutil::fullOpt "option" [lindex $argList 1] $sortOpts]
    }

    return [sortItems $win root $col [string range $order 1 end]]
}

#------------------------------------------------------------------------------
# tablelist::sortbycolumnlistSubCmd
#------------------------------------------------------------------------------
proc tablelist::sortbycolumnlistSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount < 1 || $argCount > 2} {
	mwutil::wrongNumArgs "$win sortbycolumnlist columnIndexList\
			      ?sortOrderList?"
    }

    synchronize $win
    displayItems $win
    set sortColList {}
    foreach elem [lindex $argList 0] {
	set col [colIndex $win $elem 1]
	if {[lsearch -exact $sortColList $col] >= 0} {
	    return -code error "duplicate column index \"$elem\""
	}
	lappend sortColList $col
    }

    set sortOrderList {}
    if {$argCount == 2} {
	variable sortOrders
	foreach elem [lindex $argList 1] {
	    lappend sortOrderList [mwutil::fullOpt "option" $elem $sortOrders]
	}
    }

    return [sortItems $win root $sortColList $sortOrderList]
}

#------------------------------------------------------------------------------
# tablelist::sortcolumnSubCmd
#------------------------------------------------------------------------------
proc tablelist::sortcolumnSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win sortcolumn"
    }

    upvar ::tablelist::ns${win}::data data
    if {[llength $data(sortColList)] == 0} {
	return -1
    } else {
	return [lindex $data(sortColList) 0]
    }
}

#------------------------------------------------------------------------------
# tablelist::sortcolumnlistSubCmd
#------------------------------------------------------------------------------
proc tablelist::sortcolumnlistSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win sortcolumnlist"
    }

    upvar ::tablelist::ns${win}::data data
    return $data(sortColList)
}

#------------------------------------------------------------------------------
# tablelist::sortorderSubCmd
#------------------------------------------------------------------------------
proc tablelist::sortorderSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win sortorder"
    }

    upvar ::tablelist::ns${win}::data data
    if {[llength $data(sortColList)] == 0} {
	return $data(sortOrder)
    } else {
	set col [lindex $data(sortColList) 0]
	return $data($col-sortOrder)
    }
}

#------------------------------------------------------------------------------
# tablelist::sortorderlistSubCmd
#------------------------------------------------------------------------------
proc tablelist::sortorderlistSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win sortorderlist"
    }

    upvar ::tablelist::ns${win}::data data
    set sortOrderList {}
    foreach col $data(sortColList) {
	lappend sortOrderList $data($col-sortOrder)
    }

    return $sortOrderList
}

#------------------------------------------------------------------------------
# tablelist::targetmarkpathSubCmd
#------------------------------------------------------------------------------
proc tablelist::targetmarkpathSubCmd {win argList} {
    if {[llength $argList] != 0} {
	mwutil::wrongNumArgs "$win targetmarkpath"
    }

    upvar ::tablelist::ns${win}::data data
    return $data(rowGap)
}

#------------------------------------------------------------------------------
# tablelist::targetmarkposSubCmd
#------------------------------------------------------------------------------
proc tablelist::targetmarkposSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount < 1 || $argCount > 2} {
	mwutil::wrongNumArgs "$win targetmarkpos y ?-any|-horizontal|-vertical?"
    }

    set y [format "%d" [lindex $argList 0]]
    if {$argCount == 1} {
	set opt -any
    } else {
	variable gapTypeOpts
	set opt [mwutil::fullOpt "option" [lindex $argList 1] $gapTypeOpts]
    }

    synchronize $win
    displayItems $win

    switch -- $opt {
	-any {
	    set row [containingRow $win $y relOffset]
	    if {$row < 0} {
		set place before
		upvar ::tablelist::ns${win}::data data
		set row [expr {
		    ($y < [winfo y $data(body)]) ? 0 : $data(itemCount)
		}]
	    } elseif {$relOffset < 0.25} {
		set place before
	    } elseif {$relOffset < 0.75} {
		set place inside
	    } else {
		set place before
		if {[isexpandedSubCmd $win $row]} {
		    incr row
		} else {
		    #
		    # Get the containing row's next sibling
		    #
		    set childIdx [childindexSubCmd $win $row]
		    set row [noderowSubCmd $win [list \
			     [parentkeySubCmd $win $row] [incr childIdx]]]
		}
	    }

	    return [list $place $row]
	}

	-horizontal {
	    set row [containingRow $win $y relOffset]
	    if {$row < 0} {
		upvar ::tablelist::ns${win}::data data
		set row [expr {
		    ($y < [winfo y $data(body)]) ? 0 : $data(itemCount)
		}]
	    } elseif {$relOffset >= 0.5} {
		if {[isexpandedSubCmd $win $row]} {
		    incr row
		} else {
		    #
		    # Get the containing row's next sibling
		    #
		    set childIdx [childindexSubCmd $win $row]
		    set row [noderowSubCmd $win [list \
			     [parentkeySubCmd $win $row] [incr childIdx]]]
		}
	    }

	    return [list before $row]
	}

	-vertical {
	    set row [containingRow $win $y]
	    return [list inside $row]
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::togglecolumnhideSubCmd
#------------------------------------------------------------------------------
proc tablelist::togglecolumnhideSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount < 1 || $argCount > 2} {
	mwutil::wrongNumArgs \
		"$win togglecolumnhide firstColumnIndex lastColumnIndex" \
		"$win togglecolumnhide columnIndexList"
    }

    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} {
	foreach elem $first {
	    set col [colIndex $win $elem 1]
	    set data($col-hide) [expr {!$data($col-hide)}]
	    if {$data($col-hide)} {
		incr data(hiddenColCount)
		if {$col == $data(editCol)} {
		    doCancelEditing $win
		}
	    } else {
		incr data(hiddenColCount) -1
	    }
	    lappend colIdxList $col
	}
    } else {
	set first [colIndex $win $first 1]
	set last [colIndex $win [lindex $argList 1] 1]

	for {set col $first} {$col <= $last} {incr col} {
	    set data($col-hide) [expr {!$data($col-hide)}]
	    if {$data($col-hide)} {
		incr data(hiddenColCount)
		if {$col == $data(editCol)} {
		    doCancelEditing $win
		}
	    } else {
		incr data(hiddenColCount) -1
	    }
	    lappend colIdxList $col
	}
    }

    if {[llength $colIdxList] == 0} {
	return ""
    }

    #
    # Adjust the columns and redisplay the items
    #
    makeColFontAndTagLists $win
    adjustColumns $win $colIdxList 1
    adjustColIndex $win data(anchorCol) 1
    adjustColIndex $win data(activeCol) 1
    if {!$canElide} {
	redisplay $win 0 $selCells
    }
    if {[string compare $data(-selecttype) "row"] == 0} {
	foreach row [curSelection $win] {
	    rowSelection $win set $row $row
	}
    }

    updateViewWhenIdle $win
    genVirtualEvent $win <<TablelistColHiddenStateChanged>> $colIdxList
    return ""
}

#------------------------------------------------------------------------------
# tablelist::togglerowhideSubCmd
#------------------------------------------------------------------------------
proc tablelist::togglerowhideSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount < 1 || $argCount > 2} {
	mwutil::wrongNumArgs "$win togglerowhide firstIndex lastIndex" \
			     "$win togglerowhide indexList"
    }

    synchronize $win
    displayItems $win
    set first [lindex $argList 0]

    #
    # Toggle the value of the -hide option of the specified rows
    #
    set rowIdxList {}
    set count 0
    if {$argCount == 1} {
	foreach elem $first {
	    set row [rowIndex $win $elem 0 1]
	    doRowConfig $row $win -hide [expr {![doRowCget $row $win -hide]}]
	    incr count
	    lappend rowIdxList $row
	}
    } else {
	set firstRow [rowIndex $win $first 0 1]
	set lastRow [rowIndex $win [lindex $argList 1] 0 1]
	for {set row $firstRow} {$row <= $lastRow} {incr row} {
	    doRowConfig $row $win -hide [expr {![doRowCget $row $win -hide]}]
	    incr count
	    lappend rowIdxList $row
	}
    }

    if {$count != 0} {
	makeStripesWhenIdle $win
	showLineNumbersWhenIdle $win
	updateViewWhenIdle $win
	genVirtualEvent $win <<TablelistRowHiddenStateChanged>> $rowIdxList
    }

    return ""
}

#------------------------------------------------------------------------------
# tablelist::toplevelkeySubCmd
#------------------------------------------------------------------------------
proc tablelist::toplevelkeySubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win toplevelkey index"
    }

    synchronize $win
    set row [rowIndex $win [lindex $argList 0] 0 1]
    upvar ::tablelist::ns${win}::data data
    set key [lindex $data(keyList) $row]
    return [topLevelKey $win $key]
}

#------------------------------------------------------------------------------
# tablelist::unsetattribSubCmd
#------------------------------------------------------------------------------
proc tablelist::unsetattribSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win unsetattrib name"
    }

    return [mwutil::unsetattribSubCmd $win "widget" [lindex $argList 0]]
}

#------------------------------------------------------------------------------
# tablelist::unsetcellattribSubCmd
#------------------------------------------------------------------------------
proc tablelist::unsetcellattribSubCmd {win argList} {
    if {[llength $argList] != 2} {
	mwutil::wrongNumArgs "$win unsetcellattrib cellIndex name"
    }

    synchronize $win
    foreach {row col} [cellIndex $win [lindex $argList 0] 1] {}
    upvar ::tablelist::ns${win}::data data
    set key [lindex $data(keyList) $row]
    return [mwutil::unsetattribSubCmd $win $key,$col [lindex $argList 1]]
}

#------------------------------------------------------------------------------
# tablelist::unsetcolumnattribSubCmd
#------------------------------------------------------------------------------
proc tablelist::unsetcolumnattribSubCmd {win argList} {
    if {[llength $argList] != 2} {
	mwutil::wrongNumArgs "$win unsetcolumnattrib columnIndex name"
    }

    set col [colIndex $win [lindex $argList 0] 1]
    return [mwutil::unsetattribSubCmd $win $col [lindex $argList 1]]
}

#------------------------------------------------------------------------------
# tablelist::unsetrowattribSubCmd
#------------------------------------------------------------------------------
proc tablelist::unsetrowattribSubCmd {win argList} {
    if {[llength $argList] != 2} {
	mwutil::wrongNumArgs "$win unsetrowattrib index name"
    }

    synchronize $win
    set row [rowIndex $win [lindex $argList 0] 0]
    upvar ::tablelist::ns${win}::data data
    set key [lindex $data(keyList) $row]
    return [mwutil::unsetattribSubCmd $win $key [lindex $argList 1]]
}

#------------------------------------------------------------------------------
# tablelist::viewablerowcountSubCmd
#------------------------------------------------------------------------------
proc tablelist::viewablerowcountSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount != 0 && $argCount != 2} {
	mwutil::wrongNumArgs "$win viewablerowcount ?firstIndex lastIndex?"
    }

    synchronize $win
    upvar ::tablelist::ns${win}::data data
    if {$argCount == 0} {
	set first 0
	set last $data(lastRow)
    } else {
	set first [rowIndex $win [lindex $argList 0] 0]
	set last [rowIndex $win [lindex $argList 1] 0]
    }
    if {$last < $first} {
	return 0
    }

    #
    # Adjust the range to fit within the existing items
    #
    if {$first < 0} {
	set first 0
    }
    if {$last > $data(lastRow)} {
	set last $data(lastRow)
    }

    return [getViewableRowCount $win $first $last]
}

#------------------------------------------------------------------------------
# tablelist::windowpathSubCmd
#------------------------------------------------------------------------------
proc tablelist::windowpathSubCmd {win argList} {
    if {[llength $argList] != 1} {
	mwutil::wrongNumArgs "$win windowpath 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).frm_$key,$col.w
    if {[winfo exists $w]} {
	return $w
    } else {
	return ""
    }
}

#------------------------------------------------------------------------------
# tablelist::xviewSubCmd
#------------------------------------------------------------------------------
proc tablelist::xviewSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount != 1 || [lindex $argList 0] != 0} {
	synchronize $win
	displayItems $win
    }
    upvar ::tablelist::ns${win}::data data

    switch $argCount {
	0 {
	    #
	    # Command: $win xview
	    #
	    if {$data(-titlecolumns) == 0} {
		return [$data(hdrTxt) xview]
	    } else {
		set scrlWindowWidth [getScrlWindowWidth $win]
		if {$scrlWindowWidth <= 0} {
		    return [list 0 0]
		}

		set scrlContentWidth [getScrlContentWidth $win 0 $data(lastCol)]
		if {$scrlContentWidth == 0} {
		    return [list 0 1]
		}

		set scrlXOffset \
		    [scrlColOffsetToXOffset $win $data(scrlColOffset)]
		set fraction1 [expr {$scrlXOffset/double($scrlContentWidth)}]
		set fraction2 [expr {($scrlXOffset + $scrlWindowWidth)/
				     double($scrlContentWidth)}]
		if {$fraction2 > 1.0} {
		    set fraction2 1.0
		}
		return [list [format "%g" $fraction1] [format "%g" $fraction2]]
	    }
	}

	1 {
	    #
	    # Command: $win xview <units>
	    #
	    set units [format "%d" [lindex $argList 0]]
	    if {$data(-titlecolumns) == 0} {
		foreach w [list $data(hdrTxt) $data(body)] {
		    $w xview moveto 0
		    $w xview scroll $units units
		}
	    } else {
		changeScrlColOffset $win $units
		updateColors $win
	    }
	    return ""
	}

	default {
	    #
	    # Command: $win xview moveto <fraction>
	    #	       $win xview scroll <number> units|pages
	    #
	    set argList [mwutil::getScrollInfo $argList]
	    if {$data(-titlecolumns) == 0} {
		foreach w [list $data(hdrTxt) $data(body)] {
		    eval [list $w xview] $argList
		}
	    } else {
		if {[string compare [lindex $argList 0] "moveto"] == 0} {
		    #
		    # Compute the new scrolled column offset
		    #
		    set fraction [lindex $argList 1]
		    set scrlContentWidth \
			[getScrlContentWidth $win 0 $data(lastCol)]
		    set pixels [expr {int($fraction*$scrlContentWidth + 0.5)}]
		    set scrlColOffset [scrlXOffsetToColOffset $win $pixels]

		    #
		    # Increase the new scrolled column offset if necessary
		    #
		    if {$pixels + [getScrlWindowWidth $win] >=
			$scrlContentWidth} {
			incr scrlColOffset
		    }

		    changeScrlColOffset $win $scrlColOffset
		} else {
		    set number [lindex $argList 1]
		    if {[string compare [lindex $argList 2] "units"] == 0} {
			changeScrlColOffset $win \
			    [expr {$data(scrlColOffset) + $number}]
		    } else {
			#
			# Compute the new scrolled column offset
			#
			set scrlXOffset \
			    [scrlColOffsetToXOffset $win $data(scrlColOffset)]
			set scrlWindowWidth [getScrlWindowWidth $win]
			set deltaPixels [expr {$number*$scrlWindowWidth}]
			set pixels [expr {$scrlXOffset + $deltaPixels}]
			set scrlColOffset [scrlXOffsetToColOffset $win $pixels]

			#
			# Adjust the new scrolled column offset if necessary
			#
			if {$number < 0 &&
			    [getScrlContentWidth $win $scrlColOffset \
			     $data(lastCol)] -
			    [getScrlContentWidth $win $data(scrlColOffset) \
			     $data(lastCol)] > -$deltaPixels} {
			    incr scrlColOffset
			}
			if {$scrlColOffset == $data(scrlColOffset)} {
			    if {$number < 0} {
				incr scrlColOffset -1
			    } elseif {$number > 0} {
				incr scrlColOffset
			    }
			}

			changeScrlColOffset $win $scrlColOffset
		    }
		}
		updateColors $win
	    }
	    variable winSys
	    if {[string compare $winSys "aqua"] == 0 && [winfo viewable $win]} {
		#
		# Work around a Tk bug on Mac OS X Aqua
		#
		if {[winfo exists $data(bodyFr)]} {
		    lower $data(bodyFr)
		    raise $data(bodyFr)
		}
	    }
	    return ""
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::yviewSubCmd
#------------------------------------------------------------------------------
proc tablelist::yviewSubCmd {win argList} {
    set argCount [llength $argList]
    if {$argCount != 1 || [lindex $argList 0] != 0} {
	synchronize $win
	displayItems $win
    }
    upvar ::tablelist::ns${win}::data data
    set w $data(body)

    switch $argCount {
	0 {
	    #
	    # Command: $win yview
	    #
	    set totalViewableCount \
		[expr {$data(itemCount) - $data(nonViewableRowCount)}]
	    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 upperViewableCount \
		[getViewableRowCount $win 0 [expr {$topRow - 1}]]
	    set winViewableCount [getViewableRowCount $win $topRow $btmRow]
	    set fraction1 [expr {$upperViewableCount/
				 double($totalViewableCount)}]
	    set fraction2 [expr {($upperViewableCount + $winViewableCount)/
				 double($totalViewableCount)}]
	    return [list [format "%g" $fraction1] [format "%g" $fraction2]]
	}

	1 {
	    #
	    # Command: $win yview <units>
	    #
	    set units [format "%d" [lindex $argList 0]]
	    set row [viewableRowOffsetToRowIndex $win $units]
	    $w yview $row
	    adjustElidedText $win
	    redisplayVisibleItems $win
	    updateColors $win
	    adjustSepsWhenIdle $win
	    updateVScrlbarWhenIdle $win
	    return ""
	}

	default {
	    #
	    # Command: $win yview moveto <fraction>
	    #	       $win yview scroll <number> units|pages
	    #
	    set argList [mwutil::getScrollInfo $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]]
		}
		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 upperViewableCount \
			[getViewableRowCount $win 0 [expr {$topRow - 1}]]
		    set offset [expr {$upperViewableCount + $number}]
		    set row [viewableRowOffsetToRowIndex $win $offset]
		    $w yview $row
		} 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 upperViewableCount \
			    [getViewableRowCount $win 0 [expr {$topRow - 1}]]
			set winViewableCount \
			    [getViewableRowCount $win $topRow $btmRow]
			set delta [expr {$winViewableCount - 2}]
			if {$number < 0} {
			    set delta [expr {(-1)*$delta}]
			}
			set offset [expr {$upperViewableCount + $delta}]
			set row [viewableRowOffsetToRowIndex $win $offset]
			$w yview $row
		    }
		}

		adjustElidedText $win
		redisplayVisibleItems $win
		updateColors $win
		adjustSepsWhenIdle $win
		updateVScrlbarWhenIdle $win
		return ""
	    }
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::cellSelection
#
# Processes the tablelist cellselection subcommand.
#------------------------------------------------------------------------------
proc tablelist::cellSelection {win opt firstRow firstCol lastRow lastCol} {
    upvar ::tablelist::ns${win}::data data
    if {$data(isDisabled) && [string compare $opt "includes"] != 0} {
	return ""
    }

    switch $opt {
	anchor {
	    #
	    # Adjust the row and column indices to fit
	    # within the existing viewable elements
	    #
	    adjustRowIndex $win firstRow 1
	    adjustColIndex $win firstCol 1

	    set data(anchorRow) $firstRow
	    set data(anchorCol) $firstCol
	    return ""
	}

	clear {
	    #
	    # 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
	    adjustColIndex $win lastCol

	    #
	    # Swap the indices if necessary
	    #
	    if {$lastRow < $firstRow} {
		set tmp $firstRow
		set firstRow $lastRow
		set lastRow $tmp
	    }
	    if {$lastCol < $firstCol} {
		set tmp $firstCol
		set firstCol $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
	    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]

		#
		# Deselect the relevant elements of the row
		#
		findTabs $win $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
		    $w tag remove select $textIdx1 $textIdx2
		    set textIdx1 $textIdx2
		}

		set selRange \
		    [$w tag nextrange select "$selStart lineend" $toTextIdx]
	    }

	    updateColorsWhenIdle $win
	    return ""
	}

	includes {
	    variable canElide
	    if {$firstRow < 0 || $firstRow > $data(lastRow) || \
		$firstCol < 0 || $firstCol > $data(lastCol) ||
		($data($firstCol-hide) && !$canElide)} {
		return 0
	    }

	    findTabs $win [expr {$firstRow + 1}] $firstCol $firstCol \
		     tabIdx1 tabIdx2
	    if {[lsearch -exact [$data(body) tag names $tabIdx2] select] < 0} {
		return 0
	    } else {
		return 1
	    }
	}

	set {
	    #
	    # 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
	    adjustColIndex $win lastCol

	    #
	    # Swap the indices if necessary
	    #
	    if {$lastRow < $firstRow} {
		set tmp $firstRow
		set firstRow $lastRow
		set lastRow $tmp
	    }
	    if {$lastCol < $firstCol} {
		set tmp $firstCol
		set firstCol $lastCol
		set lastCol $tmp
	    }

	    set w $data(body)
	    variable canElide
	    variable elide
	    for {set row $firstRow; set line [expr {$firstRow + 1}]} \
		{$row <= $lastRow} {set row $line; incr line} {
		#
		# Check whether the row is selectable
		#
		set key [lindex $data(keyList) $row]
		if {[info exists data($key-selectable)]} {
		    continue
		}

		#
		# Select the relevant elements of the row
		#
		findTabs $win $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
		    $w tag add select $textIdx1 $textIdx2
		    set textIdx1 $textIdx2
		}
	    }

	    #
	    # If the selection is exported and there are any selected
	    # cells in the widget then make win the new owner of the
	    # PRIMARY selection and register a callback to be invoked
	    # when it loses ownership of the PRIMARY selection
	    #
	    if {$data(-exportselection) &&
		[llength [$w tag nextrange select 1.0]] != 0} {
		selection own -command \
			[list ::tablelist::lostSelection $win] $win
	    }

	    updateColorsWhenIdle $win
	    return ""
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::colWidth
#
# Processes the tablelist columnwidth subcommand.
#------------------------------------------------------------------------------
proc tablelist::colWidth {win col opt} {
    upvar ::tablelist::ns${win}::data data
    set pixels [lindex $data(colList) [expr {2*$col}]]
    if {$pixels == 0} {				;# convention: dynamic width
	set pixels $data($col-reqPixels)
	if {$data($col-maxPixels) > 0} {
	    if {$pixels > $data($col-maxPixels)} {
		set pixels $data($col-maxPixels)
	    }
	}
    }

    switch -- $opt {
	-requested { return $pixels }
	-stretched { return [expr {$pixels + $data($col-delta)}] }
	-total {
	    return [expr {$pixels + $data($col-delta) + 2*$data(charWidth)}]
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::containingRow
#
# Processes the tablelist containing subcommand.
#------------------------------------------------------------------------------
proc tablelist::containingRow {win y {relOffsetName ""}} {
    upvar ::tablelist::ns${win}::data data
    if {$data(itemCount) == 0} {
	return -1
    }

    set row [rowIndex $win @0,$y 0]
    set w $data(body)
    incr y -[winfo y $w]
    if {$y < 0} {
	return -1
    }

    set dlineinfo [$w dlineinfo [expr {double($row + 1)}]]
    set lineY [lindex $dlineinfo 1]
    set lineHeight [lindex $dlineinfo 3]
    if {[llength $dlineinfo] != 0 && $y < $lineY + $lineHeight} {
	if {[string length $relOffsetName] != 0} {
	    upvar $relOffsetName relOffset
	    if {$y == $lineY + $lineHeight -1} {
		set relOffset 1.0
	    } else {
		set relOffset [expr {double($y - $lineY) / $lineHeight}]
	    }
	}
	return $row
    } else {
	return -1
    }
}

#------------------------------------------------------------------------------
# tablelist::containingCol
#
# Processes the tablelist containingcolumn subcommand.
#------------------------------------------------------------------------------
proc tablelist::containingCol {win x} {
    upvar ::tablelist::ns${win}::data data
    if {$x < [winfo x $data(body)]} {
	return -1
    }

    set col [colIndex $win @$x,0 0]
    if {$col < 0} {
	return -1
    }

    set lbl $data(hdrTxtFrLbl)$col
    if {$x + [winfo rootx $win] < [winfo width $lbl] + [winfo rootx $lbl]} {
	return $col
    } else {
	return -1
    }
}

#------------------------------------------------------------------------------
# tablelist::curCellSelection
#
# Processes the tablelist curcellselection subcommand.
#------------------------------------------------------------------------------
proc tablelist::curCellSelection {win {getKeys 0} {viewableOnly 0}} {
    variable canElide
    variable elide
    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 || $viewableOnly} {
	    set key [lindex $data(keyList) $row]
	}
	if {$viewableOnly &&
	    ([info exists data($key-elide)] || [info exists data($key-hide)])} {
	    continue
	}

	#
	# Get the index of the column starting at the text position selStart
	#
	set textIdx $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 firstCol $col
		break
	    } else {
		set textIdx [$w search $elide "\t" $textIdx+1c $selEnd]+1c
	    }
	}

	#
	# 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
	for {set col $firstCol} {$col < $data(colCount)} {incr col} {
	    if {$data($col-hide) && !$canElide} {
		continue
	    }

	    if {!($data($col-hide) && $viewableOnly)} {
		if {$getKeys} {
		    lappend result $key $col
		} else {
		    lappend result $row,$col
		}
	    }
	    if {[$w compare $textIdx == $selEnd]} {
		break
	    } else {
		set textIdx [$w search $elide "\t" $textIdx+1c $selEnd]+1c
	    }
	}
    }

    return $result
}

#------------------------------------------------------------------------------
# tablelist::curSelection
#
# Processes the tablelist curselection subcommand.
#------------------------------------------------------------------------------
proc tablelist::curSelection win {
    #
    # 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]
	lappend result [expr {int($selStart) - 1}]

	set selRange [$w tag nextrange select "$selStart lineend"]
    }

    return $result
}

#------------------------------------------------------------------------------
# tablelist::deleteRows
#
# Processes the tablelist delete subcommand.
#------------------------------------------------------------------------------
proc tablelist::deleteRows {win first last updateListVar} {
    #
    # 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(lastRow)} {
	set last $data(lastRow)
    }
    if {$last < $first} {
	return ""
    }

    #
    # Increase the last index if necessary, to make sure that all
    # descendants of the corresponding item will get deleted, too
    #
    set lastKey [lindex $data(keyList) $last]
    set last [expr {[nodeRow $win $lastKey end] - 1}]
    set count [expr {$last - $first + 1}]

    #
    # Check whether the width of any dynamic-width
    # column might be affected by the deletion
    #
    set w $data(body)
    if {$count == $data(itemCount)} {
	set colWidthsChanged 1				;# just to save time
	set data(seqNum) -1
	set data(freeKeyList) {}
    } else {
	variable canElide
	set colWidthsChanged 0
	set snipStr $data(-snipstring)
	set row 0
	set itemListRange [lrange $data(itemList) $first $last]
	foreach item $itemListRange {
	    #
	    # 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
		getIndentData $win $key $col indentWidth
		set cellFont [getCellFont $win $key $col]
		set elemWidth \
		    [getElemWidth $win $text $auxWidth $indentWidth $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 body text widget.  Interestingly,
    # for a large number of items it is much more efficient to delete
    # the lines in chunks than to invoke a global delete command.
    #
    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)}]
    }
    set rest [expr {$count % 50}]
    $w delete [expr {double($first + 1)}] [expr {double($first + $rest + 1)}]

    if {$last == $data(lastRow)} {
	#
	# Work around a peculiarity of the text widget:  Hide
	# the newline character that ends the line preceding
	# the first deleted one if it was hidden before
	#
	set textIdx [expr {double($first)}]
	foreach tag {elidedRow hiddenRow} {
	    if {[lsearch -exact [$w tag names $textIdx] $tag] >= 0} {
		$w tag add $tag $first.end
	    }
	}
    }

    #
    # 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
	}

	foreach opt {-background -foreground -name -selectable
		     -selectbackground -selectforeground} {
	    if {[info exists data($key$opt)]} {
		unset data($key$opt)
	    }
	}

	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
	    #
	    set parentKey $data($key-parent)
	    if {[info exists data($parentKey-children)]} {
		set childIdx [lsearch -exact $data($parentKey-children) $key]
		set data($parentKey-children) \
		    [lreplace $data($parentKey-children) $childIdx $childIdx]

		#
		# If the parent's list of children has become empty
		# then set its indentation image to the indented one
		#
		set col $data(treeCol)
		if {[llength $data($parentKey-children)] == 0 &&
		    [info exists data($parentKey,$col-indent)]} {
		    collapseSubCmd $win [list $parentKey -partly]
		    set data($parentKey,$col-indent) [strMap \
			{"collapsed" "indented" "expanded" "indented"
			 "Act" "" "Sel" ""} $data($parentKey,$col-indent)]
		    if {[winfo exists $data(body).ind_$parentKey,$col]} {
			$data(body).ind_$parentKey,$col configure -image \
			    $data($parentKey,$col-indent)
		    }
		}
	    }
	}

	foreach prop {-row -parent -children} {
	    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
			 -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-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-indent)]} {
		unset data($key,$col-indent)
		incr data(indentCount) -1
	    }
	}

	foreach name [array names attribs $key,*-*] {
	    unset attribs($name)
	}
    }

    if {$count == $data(itemCount)} {
	set data(root-children) {}
    }

    #
    # Delete the given items from the internal list
    #
    set data(itemList) [lreplace $data(itemList) $first $last]
    set data(keyList) [lreplace $data(keyList) $first $last]
    incr data(itemCount) -$count

    #
    # Delete the given items from the list variable if needed
    #
    if {$updateListVar} {
	upvar #0 $data(-listvariable) var
	trace vdelete var wu $data(listVarTraceCmd)
	set var [lreplace $var $first $last]
	trace variable var wu $data(listVarTraceCmd)
    }

    #
    # Update the key -> row mapping at idle time if needed
    #
    if {$last != $data(lastRow)} {
	set data(keyToRowMapValid) 0
	if {![info exists data(mapId)]} {
	    set data(mapId) \
		[after idle [list tablelist::updateKeyToRowMap $win]]
	}
    }

    incr data(lastRow) -$count

    #
    # Update the indices anchorRow and activeRow
    #
    if {$first <= $data(anchorRow)} {
	incr data(anchorRow) -$count
	if {$data(anchorRow) < $first} {
	    set data(anchorRow) $first
	}
	adjustRowIndex $win data(anchorRow) 1
    }
    if {$last < $data(activeRow)} {
	set activeRow $data(activeRow)
	incr activeRow -$count
	adjustRowIndex $win activeRow 1
	set data(activeRow) $activeRow
    } elseif {$first <= $data(activeRow)} {
	set activeRow $first
	adjustRowIndex $win activeRow 1
	set data(activeRow) $activeRow
    }

    #
    # Update data(editRow) if the edit window is present
    #
    if {$data(editRow) >= 0} {
	set data(editRow) [keyToRow $win $data(editKey)]
    }

    #
    # Adjust the heights of the body text widget
    # and of the listbox child, if necessary
    #
    if {$data(-height) <= 0} {
	set viewableRowCount \
	    [expr {$data(itemCount) - $data(nonViewableRowCount)}]
	$w configure -height $viewableRowCount
	$data(lb) configure -height $viewableRowCount
    }

    #
    # Invalidate the list of row indices indicating the
    # viewable rows, adjust the columns if necessary, and
    # schedule some operations for execution at idle time
    #
    set data(viewableRowList) {-1}
    if {$colWidthsChanged} {
	adjustColumns $win allCols 1
    }
    makeStripesWhenIdle $win
    showLineNumbersWhenIdle $win
    updateViewWhenIdle $win

    return ""
}

#------------------------------------------------------------------------------
# tablelist::deleteCols
#
# Processes the tablelist deletecolumns subcommand.
#------------------------------------------------------------------------------
proc tablelist::deleteCols {win first last selCellsName} {
    upvar ::tablelist::ns${win}::data data \
	  ::tablelist::ns${win}::attribs attribs $selCellsName selCells

    #
    # Delete the data and attributes corresponding to the given range
    #
    for {set col $first} {$col <= $last} {incr col} {
	if {$data($col-hide)} {
	    incr data(hiddenColCount) -1
	}
	deleteColData $win $col
	deleteColAttribs $win $col
	set selCells [deleteColFromCellList $selCells $col]
    }

    #
    # Shift the elements of data and attribs 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]
    }

    #
    # Update the item list
    #
    set newItemList {}
    foreach item $data(itemList) {
	set item [lreplace $item $first $last]
	lappend newItemList $item
    }
    set data(itemList) $newItemList

    #
    # Update the list variable if present
    #
    condUpdateListVar $win

    #
    # Set up and adjust the columns, and rebuild some columns-related lists
    #
    setupColumns $win \
	[lreplace $data(-columns) [expr {3*$first}] [expr {3*$last + 2}]] 1
    makeColFontAndTagLists $win
    makeSortAndArrowColLists $win
    adjustColumns $win {} 1
    updateViewWhenIdle $win

    #
    # Reconfigure the relevant column labels
    #
    for {set col $first} {$col < $data(colCount)} {incr col} {
	reconfigColLabels $win imgs $col
    }

    #
    # Update the indices anchorCol and activeCol
    #
    set count [expr {$last - $first + 1}]
    if {$first <= $data(anchorCol)} {
	incr data(anchorCol) -$count
	if {$data(anchorCol) < $first} {
	    set data(anchorCol) $first
	}
	adjustColIndex $win data(anchorCol) 1
    }
    if {$last < $data(activeCol)} {
	incr data(activeCol) -$count
	adjustColIndex $win data(activeCol) 1
    } elseif {$first <= $data(activeCol)} {
	set data(activeCol) $first
	adjustColIndex $win data(activeCol) 1
    }
}

#------------------------------------------------------------------------------
# tablelist::insertRows
#
# Processes the tablelist insert and insertlist subcommands.
#------------------------------------------------------------------------------
proc tablelist::insertRows {win index argList updateListVar parentKey \
			    childIdx} {
    set argCount [llength $argList]
    if {$argCount == 0} {
	return {}
    }

    upvar ::tablelist::ns${win}::data data
    if {$index < $data(itemCount)} {
	displayItems $win
    }

    if {$index < 0} {
	set index 0
    } elseif {$index > $data(itemCount)} {
	set index $data(itemCount)
    }

    set childCount [llength $data($parentKey-children)]
    if {$childIdx < 0} {
	set childIdx 0
    } elseif {$childIdx > $childCount} {	;# e.g., if $childIdx is "end"
	set childIdx $childCount
    }

    #
    # Insert the items into the internal list
    #
    set result {}
    set appendingItems [expr {$index == $data(itemCount)}]
    set appendingChildren [expr {$childIdx == $childCount}]
    set row $index
    foreach item $argList {
	#
	# Adjust the item
	#
	set item [adjustItem $item $data(colCount)]

	#
	# 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)
	}

	#
	# Get a free key for the new item
	#
	if {[llength $data(freeKeyList)] == 0} {
	    set key k[incr data(seqNum)]
	} else {
	    set key [lindex $data(freeKeyList) 0]
	    set data(freeKeyList) [lrange $data(freeKeyList) 1 end]
	}

	#
	# Insert the extended item into the internal list
	#
	lappend item $key
	if {$appendingItems} {
	    lappend data(itemList) $item	;# this works much faster
	    lappend data(keyList) $key		;# this works much faster
	} else {
	    set data(itemList) [linsert $data(itemList) $row $item]
	    set data(keyList) [linsert $data(keyList) $row $key]
	}

	array set data \
	      [list $key-row $row  $key-parent $parentKey  $key-children {}]

	#
	# Insert the key into the parent's list of children
	#
	if {$appendingChildren} {
	    lappend data($parentKey-children) $key    ;# this works much faster
	} else {
	    set data($parentKey-children) \
		[linsert $data($parentKey-children) $childIdx $key]
	}

	lappend data(rowsToDisplay) $row
	lappend result $key

	incr row
	incr childIdx
    }
    incr data(itemCount) $argCount
    set data(lastRow) [expr {$data(itemCount) - 1}]

    #
    # Update the key -> row mapping at idle time if needed
    #
    if {!$appendingItems} {
	set data(keyToRowMapValid) 0
	if {![info exists data(mapId)]} {
	    set data(mapId) \
		[after idle [list tablelist::updateKeyToRowMap $win]]
	}
    }

    if {![info exists data(dispId)]} {
	#
	# Arrange for the inserted items to be displayed at idle time
	#
	set data(dispId) [after idle [list tablelist::displayItems $win]]
    }

    #
    # Update the indices anchorRow and activeRow
    #
    if {$index <= $data(anchorRow)} {
	incr data(anchorRow) $argCount
	adjustRowIndex $win data(anchorRow) 1
    }
    if {$index <= $data(activeRow)} {
	set activeRow $data(activeRow)
	incr activeRow $argCount
	adjustRowIndex $win activeRow 1
	set data(activeRow) $activeRow
    }

    #
    # Update data(editRow) if the edit window is present
    #
    if {$data(editRow) >= 0} {
	set data(editRow) [keyToRow $win $data(editKey)]
    }

    return $result
}

#------------------------------------------------------------------------------
# tablelist::displayItems
#
# This procedure is invoked either as an idle callback after inserting some
# items into the internal list of the tablelist widget win, or directly, upon
# execution of some widget commands.  It displays the inserted items.
#------------------------------------------------------------------------------
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)]} {
	return ""
    }

    #
    # Here we are in the case that the procedure was scheduled for
    # execution at idle time.  However, it might have been invoked
    # directly, before the idle time occured; in this case we should
    # cancel the execution of the previously scheduled idle callback.
    #
    after cancel $data(dispId)	;# no harm if data(dispId) is no longer valid
    unset data(dispId)

    #
    # Insert the items into the body text widget
    #
    variable canElide
    variable snipSides
    set w $data(body)
    set widgetFont $data(-font)
    set snipStr $data(-snipstring)
    set padY [expr {[$w cget -spacing1] == 0}]
    set wasEmpty [expr {[llength $data(rowsToDisplay)] == $data(itemCount)}]
    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]
	}

	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
		}

		#
		# 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
			}
		    }

		    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]
		    }
		}

		lappend insertArgs "\t\t" $colTags
		if {$multiline} {
		    lappend multilineData $col $text $colFont $pixels $alignment
		}
		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
		#
		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 {$pixels != 0} {
		    incr pixels $data($col-delta)

		    if {$data($col-wrap) && !$multiline} {
			if {[font measure $widgetFont -displayof $win $text] >
			    $pixels} {
			    set multiline 1
			}
		    }

		    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]
		    }
		}

		append insertStr "\t\t"
		if {$multiline} {
		    lappend multilineData $col $text $widgetFont \
					  $pixels $alignment
		}
		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 $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)

    #
    # Adjust the heights of the body text widget
    # and of the listbox child, if necessary
    #
    if {$data(-height) <= 0} {
	set viewableRowCount \
	    [expr {$data(itemCount) - $data(nonViewableRowCount)}]
	$w configure -height $viewableRowCount
	$data(lb) configure -height $viewableRowCount
    }

    #
    # 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
    }

    #
    # Invalidate the list of row indices indicating the
    # viewable rows, adjust the columns if necessary, and
    # schedule some operations for execution at idle time
    #
    set data(viewableRowList) {-1}
    if {$colWidthsChanged} {
	adjustColumns $win {} 1
    }
    makeStripesWhenIdle $win
    showLineNumbersWhenIdle $win
    updateViewWhenIdle $win

    activeTrace $win data activeRow w
    if {$wasEmpty} {
	$w xview moveto [lindex [$data(hdrTxt) xview] 0]
    }
}

#------------------------------------------------------------------------------
# tablelist::insertCols
#
# Processes the tablelist insertcolumns and insertcolumnlist subcommands.
#------------------------------------------------------------------------------
proc tablelist::insertCols {win colIdx argList} {
    set argCount [llength $argList]
    if {$argCount == 0} {
	return ""
    }

    upvar ::tablelist::ns${win}::data data \
	  ::tablelist::ns${win}::attribs attribs

    #
    # Check the syntax of argList and get the number of columns to be inserted
    #
    variable alignments
    set count 0
    for {set n 0} {$n < $argCount} {incr n} {
	#
	# Check the column width
	#
	format "%d" [lindex $argList $n]    ;# integer check with error message

	#
	# Check whether the column title is present
	#
	if {[incr n] == $argCount} {
	    return -code error "column title missing"
	}

	#
	# Check the column alignment
	#
	set alignment left
	if {[incr n] < $argCount} {
	    set next [lindex $argList $n]
	    if {[isInteger $next]} {
		incr n -1
	    } else {
		mwutil::fullOpt "alignment" $next $alignments
	    }
	}

	incr count
    }

    #
    # Shift the elements of data and attribs 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]
    }

    #
    # Update the item list
    #
    set emptyStrs {}
    for {set n 0} {$n < $count} {incr n} {
	lappend emptyStrs ""
    }
    set newItemList {}
    foreach item $data(itemList) {
	set item [eval [list linsert $item $colIdx] $emptyStrs]
	lappend newItemList $item
    }
    set data(itemList) $newItemList

    #
    # Update the list variable if present
    #
    condUpdateListVar $win

    #
    # Set up and adjust the columns, and rebuild some columns-related lists
    #
    setupColumns $win \
	[eval [list linsert $data(-columns) [expr {3*$colIdx}]] $argList] 1
    makeColFontAndTagLists $win
    makeSortAndArrowColLists $win
    set limit [expr {$colIdx + $count}]
    set colIdxList {}
    for {set col $colIdx} {$col < $limit} {incr col} {
	lappend colIdxList $col
    }
    adjustColumns $win $colIdxList 1

    #
    # Redisplay the items
    #
    redisplay $win 0 $selCells

    #
    # Reconfigure the relevant column labels
    #
    for {set col $limit} {$col < $data(colCount)} {incr col} {
	reconfigColLabels $win imgs $col
    }

    #
    # Update the indices anchorCol and activeCol
    #
    if {$colIdx <= $data(anchorCol)} {
	incr data(anchorCol) $argCount
	adjustColIndex $win data(anchorCol) 1
    }
    if {$colIdx <= $data(activeCol)} {
	incr data(activeCol) $argCount
	adjustColIndex $win data(activeCol) 1
    }

    updateViewWhenIdle $win
    return ""
}

#------------------------------------------------------------------------------
# tablelist::doScan
#
# Processes the tablelist scan subcommand.
#------------------------------------------------------------------------------
proc tablelist::doScan {win opt x y} {
    upvar ::tablelist::ns${win}::data data
    set w $data(body)
    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} {
	    adjustElidedText $win
	    redisplayVisibleItems $win
	    updateColors $win
	    adjustSepsWhenIdle $win
	    updateVScrlbarWhenIdle $win
	}
    } elseif {[string compare $opt "mark"] == 0} {
	$w scan mark 0 $y

	set data(scanMarkX) $x
	set data(scanMarkXOffset) \
	    [scrlColOffsetToXOffset $win $data(scrlColOffset)]
    } 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
	}

	#
	# Change the scrolled column offset and adjust the elided text
	#
	changeScrlColOffset $win [scrlXOffsetToColOffset $win $scrlXOffset]
	adjustElidedText $win
	redisplayVisibleItems $win
	updateColors $win
	adjustSepsWhenIdle $win
	updateVScrlbarWhenIdle $win
    }

    return ""
}

#------------------------------------------------------------------------------
# tablelist::populate
#
# Helper procedure invoked in searchcolumnSubCmd.
#------------------------------------------------------------------------------
proc tablelist::populate {win index fully} {
    upvar ::tablelist::ns${win}::data data
    set key [lindex $data(keyList) $index]
    set col $data(treeCol)
    if {![info exists data($key,$col-indent)] ||
	[string match "*indented*" $data($key,$col-indent)]} {
	return ""
    }

    if {[llength $data($key-children)] == 0} {
	uplevel #0 $data(-populatecommand) [list $win $index]
    }

    if {$fully} {
	#
	# Invoke this procedure recursively on the children
	#
	foreach childKey $data($key-children) {
	    populate $win [keyToRow $win $childKey] 1
	}
    }

    return ""
}

#------------------------------------------------------------------------------
# tablelist::doesMatch
#
# Helper procedure invoked in searchcolumnSubCmd.
#------------------------------------------------------------------------------
proc doesMatch {win row col pattern value mode numeric noCase checkCmd} {
    switch -- $mode {
	-exact {
	    if {$numeric} {
		set result [expr {$pattern == $value}]
	    } else {
		if {$noCase} {
		    set value [string tolower $value]
		}
		set result [expr {[string compare $pattern $value] == 0}]
	    }
	}

	-glob {
	    if {$noCase} {
		set value [string tolower $value]
	    }
	    set result [string match $pattern $value]
	}

	-regexp {
	    if {$noCase} {
		set result [regexp -nocase $pattern $value]
	    } else {
		set result [regexp $pattern $value]
	    }
	}
    }

    if {!$result || [string length $checkCmd] == 0} {
	return $result
    } else {
	return [uplevel #0 $checkCmd [list $win $row $col $value]]
    }
}

#------------------------------------------------------------------------------
# tablelist::seeRow
#
# Processes the tablelist see subcommand.
#------------------------------------------------------------------------------
proc tablelist::seeRow {win index} {
    #
    # Adjust the index to fit within the existing items
    #
    adjustRowIndex $win index
    upvar ::tablelist::ns${win}::data data
    set key [lindex $data(keyList) $index]
    if {$data(itemCount) == 0 || [info exists data($key-hide)]} {
	return ""
    }

    #
    # Expand as many ancestors as needed
    #
    while {[info exists data($key-elide)]} {
	set key $data($key-parent)
	expandSubCmd $win [list $key -partly]
    }

    #
    # Bring the given row into the window and restore
    # the horizontal view in the body text widget
    #
    $data(body) see [expr {double($index + 1)}]
    $data(body) xview moveto [lindex [$data(hdrTxt) xview] 0]

    updateView $win
    return ""
}

#------------------------------------------------------------------------------
# tablelist::seeCell
#
# Processes the tablelist seecell subcommand.
#------------------------------------------------------------------------------
proc tablelist::seeCell {win row col} {
    #
    # This might be an "after idle" callback; check whether the window exists
    #
    if {![array exists ::tablelist::ns${win}::data]} {
	return ""
    }

    #
    # Adjust the row and column indices to fit within the existing elements
    #
    adjustRowIndex $win row
    adjustColIndex $win col
    upvar ::tablelist::ns${win}::data data
    set key [lindex $data(keyList) $row]
    if {[info exists data($key-hide)] ||
	($data(colCount) != 0 && $data($col-hide))} {
	return ""
    }

    #
    # Expand as many ancestors as needed
    #
    while {[info exists data($key-elide)]} {
	set key $data($key-parent)
	expandSubCmd $win [list $key -partly]
    }

    set b $data(body)
    if {$data(colCount) == 0} {
	$b see [expr {double($row + 1)}]
	return ""
    }

    #
    # Force any geometry manager calculations to be completed first
    #
    update idletasks
    if {![array exists ::tablelist::ns${win}::data]} {
	return ""
    }

    #
    # If the tablelist is empty then insert a temporary row
    #
    set h $data(hdrTxt)
    if {$data(itemCount) == 0} {
	variable canElide
	for {set n 0} {$n < $data(colCount)} {incr n} {
	    if {!$data($n-hide) || $canElide} {
		$b insert end "\t\t"
	    }
	}

	$b xview moveto [lindex [$h xview] 0]
    }

    if {$data(-titlecolumns) == 0} {
	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}]

	switch $alignment {
	    left {
		#
		# Bring the cell's left edge into view
		#
		$b see $tabIdx1
		$h xview moveto [lindex [$b xview] 0]

		#
		# Shift the view in the header text widget until the right
		# edge of the cell becomes visible but finish the scrolling
		# before the cell's left edge would become invisible
		#
		while {![isHdrTxtFrXPosVisible $win $rX]} {
		    $h xview scroll 1 units
		    if {![isHdrTxtFrXPosVisible $win $lX]} {
			$h xview scroll -1 units
			break
		    }
		}
	    }

	    center {
		#
		# Bring the cell's left edge into view
		#
		$b see $tabIdx1
		set winWidth [winfo width $h]
		if {[winfo width $data(hdrTxtFrLbl)$col] > $winWidth} {
		    #
		    # The cell doesn't fit into the window:  Bring its
		    # center into the window's middle horizontal position
		    #
		    $h xview moveto \
		       [expr {double($lX + $rX - $winWidth)/2/$data(hdrPixels)}]
		} else {
		    #
		    # Shift the view in the header text widget until
		    # the right edge of the cell becomes visible
		    #
		    $h xview moveto [lindex [$b xview] 0]
		    while {![isHdrTxtFrXPosVisible $win $rX]} {
			$h xview scroll 1 units
		    }
		}
	    }

	    right {
		#
		# Bring the cell's right edge into view
		#
		$b see $nextIdx
		$h xview moveto [lindex [$b xview] 0]

		#
		# Shift the view in the header text widget until the left
		# edge of the cell becomes visible but finish the scrolling
		# before the cell's right edge would become invisible
		#
		while {![isHdrTxtFrXPosVisible $win $lX]} {
		    $h xview scroll -1 units
		    if {![isHdrTxtFrXPosVisible $win $rX]} {
			$h xview scroll 1 units
			break
		    }
		}
	    }
	}

	$b xview moveto [lindex [$h xview] 0]

    } else {
	#
	# Bring the cell's row into view
	#
	$b see [expr {double($row + 1)}]

	set scrlWindowWidth [getScrlWindowWidth $win]

	if {($col < $data(-titlecolumns)) ||
	    (!$data($col-elide) &&
	     [getScrlContentWidth $win $data(scrlColOffset) $col] <=
	     $scrlWindowWidth)} {
	    #
	    # The given column index specifies either a title column or
	    # one that is fully visible; restore the horizontal view
	    #
	    $b xview moveto [lindex [$h xview] 0]
	} elseif {$data($col-elide) ||
		  [winfo width $data(hdrTxtFrLbl)$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
	    # make the column the first visible one among all scrollable columns
	    #
	    set scrlColOffset 0
	    for {incr col -1} {$col >= $data(-titlecolumns)} {incr col -1} {
		if {!$data($col-hide)} {
		    incr scrlColOffset
		}
	    }
	    changeScrlColOffset $win $scrlColOffset
	} else {
	    #
	    # The given column index specifies a non-elided
	    # scrollable column; shift the horizontal view
	    # repeatedly until the column becomes visible
	    #
	    set scrlColOffset [expr {$data(scrlColOffset) + 1}]
	    while {[getScrlContentWidth $win $scrlColOffset $col] >
		   $scrlWindowWidth} {
		incr scrlColOffset
	    }
	    changeScrlColOffset $win $scrlColOffset
	}
    }

    #
    # Delete the temporary row if any
    #
    if {$data(itemCount) == 0} {
	$b delete 1.0 end
    }

    updateView $win
    return ""
}

#------------------------------------------------------------------------------
# tablelist::rowSelection
#
# Processes the tablelist selection subcommand.
#------------------------------------------------------------------------------
proc tablelist::rowSelection {win opt first last} {
    upvar ::tablelist::ns${win}::data data
    if {$data(isDisabled) && [string compare $opt "includes"] != 0} {
	return ""
    }

    switch $opt {
	anchor {
	    #
	    # Adjust the index to fit within the existing viewable items
	    #
	    adjustRowIndex $win first 1

	    set data(anchorRow) $first
	    return ""
	}

	clear {
	    #
	    # Swap the indices if necessary
	    #
	    if {$last < $first} {
		set tmp $first
		set first $last
		set last $tmp
	    }

	    set fromTextIdx [expr {$first + 1}].0
	    set toTextIdx [expr {$last + 1}].end
	    $data(body) tag remove select $fromTextIdx $toTextIdx

	    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 {
	    #
	    # Swap the indices if necessary and adjust
	    # the range to fit within the existing items
	    #
	    if {$last < $first} {
		set tmp $first
		set first $last
		set last $tmp
	    }
	    if {$first < 0} {
		set first 0
	    }
	    if {$last > $data(lastRow)} {
		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} {
		#
		# 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 the selection is exported and there are any selected
	    # cells in the widget then make win the new owner of the
	    # PRIMARY selection and register a callback to be invoked
	    # when it loses ownership of the PRIMARY selection
	    #
	    if {$data(-exportselection) &&
		[llength [$w tag nextrange select 1.0]] != 0} {
		selection own -command \
			[list ::tablelist::lostSelection $win] $win
	    }

	    updateColorsWhenIdle $win
	    return ""
	}
    }
}

#------------------------------------------------------------------------------
# tablelist::moveTo
#
# 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 {
    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 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
    }

    if {$row != $topRow} {
	$w yview $row
	updateView $win
    }

    return ""
}

#
# Private callback procedures
# ===========================
#

#------------------------------------------------------------------------------
# tablelist::fetchSelection
#
# This procedure is invoked when the PRIMARY selection is owned by the
# tablelist widget win and someone attempts to retrieve it as a STRING.  It
# returns part or all of the selection, as given by offset and maxChars.  The
# string which is to be (partially) returned is built by joining all of the
# selected viewable elements of the (partly) selected viewable rows together
# with tabs and the rows themselves with newlines.
#------------------------------------------------------------------------------
proc tablelist::fetchSelection {win offset maxChars} {
    upvar ::tablelist::ns${win}::data data
    if {!$data(-exportselection)} {
	return ""
    }

    set selection ""
    set prevRow -1
    foreach cellIdx [curCellSelection $win 0 1] {
	scan $cellIdx "%d,%d" row col
	if {$row != $prevRow} {
	    if {$prevRow != -1} {
		append selection "\n"
	    }

	    set prevRow $row
	    set item [lindex $data(itemList) $row]
	    set key [lindex $item end]
	    set isFirstCol 1
	}

	set text [lindex $item $col]
	if {[lindex $data(fmtCmdFlagList) $col]} {
	    set text [formatElem $win $key $row $col $text]
	}

	if {!$isFirstCol} {
	    append selection "\t"
	}
	append selection $text

	set isFirstCol 0
    }

    return [string range $selection $offset [expr {$offset + $maxChars - 1}]]
}

#------------------------------------------------------------------------------
# tablelist::lostSelection
#
# This procedure is invoked when the tablelist widget win loses ownership of
# the PRIMARY selection.  It deselects all items of the widget with the aid of
# the rowSelection procedure if the selection is exported.
#------------------------------------------------------------------------------
proc tablelist::lostSelection win {
    upvar ::tablelist::ns${win}::data data
    if {$data(-exportselection)} {
	rowSelection $win clear 0 $data(lastRow)
	event generate $win <<TablelistSelectionLost>>
    }
}

#------------------------------------------------------------------------------
# tablelist::activeTrace
#
# This procedure is executed whenever the array element data(activeRow),
# data(activeCol), or data(-selecttype) is written.  It moves the "active" tag
# 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} {
    #
    # Conditionally move the "active" tag to the line
    # or cell that displays the active item or element
    #
    upvar ::tablelist::ns${win}::data data
    if {$data(ownsFocus) && ![info exists data(dispId)]} {
	moveActiveTag $win
    }
}

#------------------------------------------------------------------------------
# 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
# 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} {
    upvar ::tablelist::ns${win}::data data
    switch $op {
	w {
	    if {![info exists data(syncId)]} {
		#
		# Arrange for the contents 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]]
	    }
	}

	u {
	    #
	    # 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)
	    }
	    set ::$varName {}
	    foreach item $data(itemList) {
		lappend ::$varName [lrange $item 0 $data(lastCol)]
	    }
	    trace variable ::$varName wu $data(listVarTraceCmd)
	}
    }
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/scripts/tclIndex.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
# Tcl autoload index file, version 2.0
# This file is generated by the "auto_mkindex" command
# and sourced to set up indexing information for one or
# more commands.  Typically each line is a command that
# sets an element in the auto_index array, where the
# element name is the name of a command and the value is
# a script that loads the command.

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]]
set auto_index(::tablelist::addBWidgetSpinBox) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::addBWidgetComboBox) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::addIncrEntryfield) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::addIncrDateTimeWidget) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::addIncrSpinner) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::addIncrSpinint) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::addIncrCombobox) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::addCtext) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::addOakleyCombobox) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::addDateMentry) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::addTimeMentry) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::addDateTimeMentry) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::addFixedPointMentry) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::addIPAddrMentry) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::addIPv6AddrMentry) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::checkEditWinName) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::createCheckbutton) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::createMenubutton) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::postMenuCmd) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::createTileEntry) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::createTileSpinbox) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::createTileCombobox) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::createTileCheckbutton) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::createTileMenubutton) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::createBWidgetComboBox) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::createIncrCombobox) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::createOakleyCombobox) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::doEditCell) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::doCancelEditing) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::doFinishEditing) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::clearTakefocusOpt) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::adjustTextHeight) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::setMentryCursor) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::adjustEditWindow) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::setEditWinFont) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::saveEditData) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::saveEditConfigOpts) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::restoreEditData) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::restoreEditConfigOpts) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::defineTablelistEdit) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::insertChar) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::cancelEditing) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::finishEditing) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::goToNextPrevCell) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::goLeftRight) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::goUpDown) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::goToPrevNextLine) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::goToPriorNextPage) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::genMouseWheelEvent) [list source [file join $dir tablelistEdit.tcl]]
set auto_index(::tablelist::genOptionMouseWheelEvent) [list source [file join $dir tablelistEdit.tcl]]
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::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::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]]
set auto_index(::tablelist::krocTheme) [list source [file join $dir tablelistThemes.tcl]]
set auto_index(::tablelist::plastikTheme) [list source [file join $dir tablelistThemes.tcl]]
set auto_index(::tablelist::srivTheme) [list source [file join $dir tablelistThemes.tcl]]
set auto_index(::tablelist::srivlgTheme) [list source [file join $dir tablelistThemes.tcl]]
set auto_index(::tablelist::stepTheme) [list source [file join $dir tablelistThemes.tcl]]
set auto_index(::tablelist::tileqtTheme) [list source [file join $dir tablelistThemes.tcl]]
set auto_index(::tablelist::vistaTheme) [list source [file join $dir tablelistThemes.tcl]]
set auto_index(::tablelist::winnativeTheme) [list source [file join $dir tablelistThemes.tcl]]
set auto_index(::tablelist::winxpblueTheme) [list source [file join $dir tablelistThemes.tcl]]
set auto_index(::tablelist::xpnativeTheme) [list source [file join $dir tablelistThemes.tcl]]
set auto_index(::tablelist::rgb2hsv) [list source [file join $dir tablelistThemes.tcl]]
set auto_index(::tablelist::hsv2rgb) [list source [file join $dir tablelistThemes.tcl]]
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::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::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]]
set auto_index(::tablelist::depth) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::topLevelKey) [list source [file join $dir tablelistUtil.tcl]]
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::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]]
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::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::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]]
set auto_index(::tablelist::strRange) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::adjustItem) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::formatElem) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::formatItem) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::hasChars) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::getListWidth) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::joinList) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::displayIndent) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::displayImage) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::displayText) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::getAuxData) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::getIndentData) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::getMaxTextWidth) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::adjustElem) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::adjustMlElem) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::getElemWidth) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::insertOrUpdateIndent) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::insertElem) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::insertMlElem) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::updateCell) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::updateMlCell) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::setImgLabelWidth) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::setImgLabelAnchor) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::appendComplexElem) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::makeColFontAndTagLists) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::makeSortAndArrowColLists) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::setupColumns) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::createSeps) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::adjustSepsWhenIdle) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::adjustSeps) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::getSepX) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::adjustColumns) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::adjustLabel) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::computeColWidth) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::computeLabelWidth) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::adjustHeaderHeight) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::stretchColumnsWhenIdle) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::stretchColumns) [list source [file join $dir tablelistUtil.tcl]]
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::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]]
set auto_index(::tablelist::updateHScrlbar) [list source [file join $dir tablelistUtil.tcl]]
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::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]]
set auto_index(::tablelist::redisplayColWhenIdle) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::redisplayCol) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::makeStripesWhenIdle) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::makeStripes) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::showLineNumbersWhenIdle) [list source [file join $dir tablelistUtil.tcl]]
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::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]]
set auto_index(::tablelist::configLabel) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::createArrows) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::configCanvas) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::fillArrows) [list source [file join $dir tablelistUtil.tcl]]
set auto_index(::tablelist::getShadows) [list source [file join $dir tablelistUtil.tcl]]
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::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]]
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::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::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::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::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::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::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::photo7x7Arrows) [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::baghiraTreeImgs) [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::mintTreeImgs) [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::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::vistaAeroTreeImgs) [list source [file join $dir tablelistImages.tcl]]
set auto_index(::tablelist::vistaClassicTreeImgs) [list source [file join $dir tablelistImages.tcl]]
set auto_index(::tablelist::winnativeTreeImgs) [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::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::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]]
set auto_index(::tablelist::createBindings) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::tablelist) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::tablelistWidgetCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::activateSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::activatecellSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::applysortingSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::attribSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::bboxSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::bodypathSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::bodytagSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::cancelededitingSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::canceleditingSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::cellattribSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::cellbboxSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::cellcgetSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::cellconfigureSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::cellindexSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::cellselectionSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::cgetSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::childcountSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::childindexSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::childkeysSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::collapseSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::collapseallSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::columnattribSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::columncgetSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::columnconfigureSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::columncountSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::columnindexSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::columnwidthSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::configcelllistSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::configcellsSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::configcolumnlistSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::configcolumnsSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::configrowlistSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::configrowsSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::configureSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::containingSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::containingcellSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::containingcolumnSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::cornerlabelpathSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::cornerpathSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::curcellselectionSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::curselectionSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::deleteSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::deletecolumnsSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::depthSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::descendantcountSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::editcellSubCmd) [list source [file join $dir tablelistWidget.tcl]]
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::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]]
set auto_index(::tablelist::expandedkeysSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::fillcolumnSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::findcolumnnameSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::findrownameSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::finisheditingSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::formatinfoSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::getSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::getcellsSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::getcolumnsSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::getformattedSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::getformattedcellsSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::getformattedcolumnsSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::getfullkeysSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::getkeysSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::hasattribSubCmd) [list source [file join $dir tablelistWidget.tcl]]
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::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]]
set auto_index(::tablelist::insertSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::insertchildlistSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::insertchildrenSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::insertcolumnlistSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::insertcolumnsSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::insertlistSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::iselemsnippedSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::isexpandedSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::istitlesnippedSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::isviewableSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::itemlistvarSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::labelpathSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::labelsSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::labeltagSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::moveSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::movecolumnSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::nearestSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::nearestcellSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::nearestcolumnSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::noderowSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::parentkeySubCmd) [list source [file join $dir tablelistWidget.tcl]]
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::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]]
set auto_index(::tablelist::scanSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::searchcolumnSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::seeSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::seecellSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::seecolumnSubCmd) [list source [file join $dir tablelistWidget.tcl]]
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::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]]
set auto_index(::tablelist::sortbycolumnSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::sortbycolumnlistSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::sortcolumnSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::sortcolumnlistSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::sortorderSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::sortorderlistSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::targetmarkpathSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::targetmarkposSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::togglecolumnhideSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::togglerowhideSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::toplevelkeySubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::unsetattribSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::unsetcellattribSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::unsetcolumnattribSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::unsetrowattribSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::viewablerowcountSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::windowpathSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::xviewSubCmd) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::yviewSubCmd) [list source [file join $dir tablelistWidget.tcl]]
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::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::deleteCols) [list source [file join $dir tablelistWidget.tcl]]
set auto_index(::tablelist::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]]
set auto_index(::tablelist::populate) [list source [file join $dir tablelistWidget.tcl]]
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::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]]
set auto_index(::tablelist::listVarTrace) [list source [file join $dir tablelistWidget.tcl]]
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted scriptlibs/tablelist5.13/tablelist.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#==============================================================================
# Main Tablelist package module.
#
# Copyright (c) 2000-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

package require Tcl 8
package require Tk  8
package require -exact tablelist::common 5.13

package provide tablelist $::tablelist::version
package provide Tablelist $::tablelist::version

::tablelist::useTile 0
::tablelist::createBindings
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






























Deleted scriptlibs/tablelist5.13/tablelistPublic.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#==============================================================================
# Main Tablelist and Tablelist_tile package module.
#
# Copyright (c) 2000-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

namespace eval ::tablelist {
    #
    # Public variables:
    #
    variable version	5.13
    variable library
    if {$tcl_version >= 8.4} {
	set library	[file normalize [DIR]]
    } else {
	set library	[DIR]			;# no "file normalize" yet
    }

    #
    # Creates a new tablelist widget:
    #
    namespace export	tablelist

    #
    # Sort the items of a tablelist widget by one or more of its columns:
    #
    namespace export	sortByColumn addToSortColumns

    #
    # Helper procedures used in binding scripts:
    #
    namespace export	convEventFields getTablelistPath getTablelistColumn

    #
    # Register various widgets for interactive cell editing:
    #
    namespace export	addBWidgetEntry addBWidgetSpinBox addBWidgetComboBox
    namespace export    addIncrEntryfield addIncrDateTimeWidget \
			addIncrSpinner addIncrSpinint addIncrCombobox
    namespace export	addCtext addOakleyCombobox
    namespace export	addDateMentry addTimeMentry addDateTimeMentry \
			addFixedPointMentry addIPAddrMentry addIPv6AddrMentry
}

package provide tablelist::common $::tablelist::version

#
# The following procedure, invoked in "tablelist.tcl" and "tablelist_tile.tcl",
# sets the variable ::tablelist::usingTile to the given value and sets a trace
# on this variable.
#
proc ::tablelist::useTile {bool} {
    variable usingTile $bool
    trace variable usingTile wu [list ::tablelist::restoreUsingTile $bool]
}

#
# The following trace procedure is executed whenever the variable
# ::tablelist::usingTile is written or unset.  It restores the variable to its
# original value, given by the first argument.
#
proc ::tablelist::restoreUsingTile {origVal varName index op} {
    variable usingTile $origVal
    switch $op {
	w {
	    return -code error "it is not allowed to use both Tablelist and\
				Tablelist_tile in the same application"
	}
	u {
	    trace variable usingTile wu \
		  [list ::tablelist::restoreUsingTile $origVal]
	}
    }
}

interp alias {} ::tk::frame {} ::frame
interp alias {} ::tk::label {} ::label

#
# Everything else needed is lazily loaded on demand, via the dispatcher
# set up in the subdirectory "scripts" (see the file "tclIndex").
#
lappend auto_path [file join $::tablelist::library scripts]
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






































































































































































Deleted scriptlibs/tablelist5.13/tablelist_tile.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#==============================================================================
# Main Tablelist_tile package module.
#
# Copyright (c) 2000-2015  Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
#==============================================================================

package require Tcl 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 tablelist::common 5.13

package provide tablelist_tile $::tablelist::version
package provide Tablelist_tile $::tablelist::version

::tablelist::useTile 1
::tablelist::createBindings

namespace eval ::tablelist {
    #
    # Commands related to tile themes:
    #
    namespace export	getThemes getCurrentTheme setTheme setThemeDefaults
}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


















































Deleted scriptlibs/windowlist/pkgIndex.tcl.

1
2
3
4
5
6
7
8
9
10
11
# Tcl package index file, version 1.1
# This file is generated by the "pkg_mkIndex" command
# and sourced either when an application starts up or
# by a "package unknown" script.  It invokes the
# "package ifneeded" command to set up package-related
# information so that packages will be loaded automatically
# in response to "package require" commands.  When this
# script is sourced, the variable $dir must contain the
# full path name of this file's directory.

package ifneeded windowlist 1.4 [list source [file join $dir windowlist.tcl]]
<
<
<
<
<
<
<
<
<
<
<






















Deleted scriptlibs/windowlist/windowlist.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#windowlist.tcl: provides routines for managing windows from menu, i.e. minimize, raise, bring all to front; standard menu item on Mac OS X. 

#(c) 2011 WordTech Communications LLC. License: standard Tcl license, http://www.tcl.tk/software/tcltk/license.html

#includes code from http://wiki.tcl.tk/1461

##"cycle through windows" code courtesy of Tom Hennigan, tomhennigan@gmail.com, (c) 2009

package provide windowlist 1.4

namespace eval windowlist {

    #make the window menu
    proc windowMenu {mainmenu} {

	menu $mainmenu.windowlist

	$mainmenu.windowlist add command -label "Minimize" -command [namespace current]::minimizeFrontWindow -accelerator Command-M
	$mainmenu.windowlist add separator
	$mainmenu.windowlist add command -label "Bring All to Front" -command [namespace current]::raiseAllWindows
	$mainmenu.windowlist add separator
	$mainmenu.windowlist add command -label "Cycle Through Windows" \
	    -command  {raise [lindex [wm stackorder .] 0]} \
	    -accelerator "Command-`"
       	bind all <Command-quoteleft> {raise [lindex [wm stackorder .] 0]}
	$mainmenu.windowlist add separator
	$mainmenu.windowlist add command -label "Main Window" -command ::tk::mac::ReopenApplication
	$mainmenu.windowlist add separator
	$mainmenu.windowlist add command -label [wm title .] -command ::tk::mac::ReopenApplication
	
	$mainmenu add cascade -label "Window" -menu $mainmenu.windowlist
	
        #bind the window menu to update whenever a new window is added, on menu selection
       	bind all <<MenuSelect>> +[list [namespace current]::updateWindowMenu $mainmenu.windowlist]
	bind all <Command-M>  [namespace current]::minimizeFrontWindow
	bind all <Command-m>  [namespace current]::minimizeFrontWindow
	bind . <Command-w> {wm state . withdrawn}
	bind .  <Command-W> {wm state . withdrawn}
	wm protocol . WM_DELETE_WINDOW {wm state . withdrawn}

    }

    
    #update the window menu with windows
    proc updateWindowMenu {windowmenu} {

	set windowlist [wm stackorder .]

	#search for drawer window first
	if {[lsearch $windowlist ".drawer"] >= 0 } {
	    set windowlist [lreplace $windowlist [lsearch $windowlist ".drawer"] [lsearch $windowlist ".drawer"]]
	    update
	}
	
	if {$windowlist == {}} {
	    return
	}

	$windowmenu delete 8 end
	foreach item $windowlist {
	    $windowmenu add command -label "[wm title $item]"  -command [list raise $item]

	}
    }



    #make all windows visible
    proc raiseAllWindows {} {

	#get list of mapped windows

	if {![winfo ismapped .]} {

	    wm deiconify .

	}

	set windowlist [wm stackorder .]

	#do nothing if all windows are minimized
	if {$windowlist == {}} {
	    return
	}

	#use [winfo children .] here to get windows that are minimized
	foreach item [winfo children .] {
	    
	    #get all toplevel windows, exclude menubar windows
	    if { [string equal [winfo toplevel $item] $item] && [catch {$item cget -tearoff}]} {
		wm deiconify $item
	    }
	}
	#be sure to deiconify ., since the above command only gets the child toplevels
	wm deiconify .
    }

    #minimize the selected window
    proc minimizeFrontWindow {} {

	#get list of mapped windows
	set windowlist [wm stackorder .]

	#do nothing if all windows are minimized
	if {$windowlist == {}} {
	    return
	} else {

	    #minimize topmost window
	    set topwindow [lindex $windowlist end]
	    wm iconify $topwindow

	}
    }
    
    namespace export *
}

#raise window if closed--dock click
proc ::tk::mac::ReopenApplication {} {

    if { [wm state .] == "withdrawn"} {
	wm state . normal
	raise .
    } else {
	wm deiconify .
	raise .
    }

}






<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
















































































































































































































































































Deleted winlibs/tkdnd2.8/pkgIndex.tcl.

1
2
3
4
5
6
#
# Tcl package index file
#
package ifneeded tkdnd 2.8 \
  "source \{$dir/tkdnd.tcl\} ; \
   tkdnd::initialise \{$dir\} tkdnd28.dll tkdnd"
<
<
<
<
<
<












Deleted winlibs/tkdnd2.8/tkdnd.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
#
# tkdnd.tcl --
#
#    This file implements some utility procedures that are used by the TkDND
#    package.
#
# This software is copyrighted by:
# George Petasis, National Centre for Scientific Research "Demokritos",
# Aghia Paraskevi, Athens, Greece.
# e-mail: petasis@iit.demokritos.gr
#
# The following terms apply to all files associated
# with the software unless explicitly disclaimed in individual files.
#
# The authors hereby grant permission to use, copy, modify, distribute,
# and license this software and its documentation for any purpose, provided
# that existing copyright notices are retained in all copies and that this
# notice is included verbatim in any distributions. No written agreement,
# license, or royalty fee is required for any of the authorized uses.
# Modifications to this software may be copyrighted by their authors
# and need not follow the licensing terms described here, provided that
# the new terms are clearly indicated on the first page of each file where
# they apply.
#
# 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.
#

package require Tk

namespace eval ::tkdnd {
  variable _topw ".drag"
  variable _tabops
  variable _state
  variable _x0
  variable _y0
  variable _platform_namespace
  variable _drop_file_temp_dir
  variable _auto_update 1

  variable _windowingsystem

  bind TkDND_Drag1 <ButtonPress-1> {tkdnd::_begin_drag press  1 %W %s %X %Y %x %y}
  bind TkDND_Drag1 <B1-Motion>     {tkdnd::_begin_drag motion 1 %W %s %X %Y %x %y}
  bind TkDND_Drag2 <ButtonPress-2> {tkdnd::_begin_drag press  2 %W %s %X %Y %x %y}
  bind TkDND_Drag2 <B2-Motion>     {tkdnd::_begin_drag motion 2 %W %s %X %Y %x %y}
  bind TkDND_Drag3 <ButtonPress-3> {tkdnd::_begin_drag press  3 %W %s %X %Y %x %y}
  bind TkDND_Drag3 <B3-Motion>     {tkdnd::_begin_drag motion 3 %W %s %X %Y %x %y}

  # ----------------------------------------------------------------------------
  #  Command tkdnd::initialise: Initialise the TkDND package.
  # ----------------------------------------------------------------------------
  proc initialise { dir PKG_LIB_FILE PACKAGE_NAME} {
    variable _platform_namespace
    variable _drop_file_temp_dir
    variable _windowingsystem
    global env

    switch [tk windowingsystem] {
      x11 {
        set _windowingsystem x11
      }
      win32 -
      windows {
        set _windowingsystem windows
      }
      aqua  {
        set _windowingsystem aqua
      }
      default {
        error "unknown Tk windowing system"
      }
    }

    ## Get User's home directory: We try to locate the proper path from a set of
    ## environmental variables...
    foreach var {HOME HOMEPATH USERPROFILE ALLUSERSPROFILE APPDATA} {
      if {[info exists env($var)]} {
        if {[file isdirectory $env($var)]} {
          set UserHomeDir $env($var)
          break
        }
      }
    }

    ## Should use [tk windowingsystem] instead of tcl platform array:
    ## OS X returns "unix," but that's not useful because it has its own
    ## windowing system, aqua
    ## Under windows we have to also combine HOMEDRIVE & HOMEPATH...
    if {![info exists UserHomeDir] &&
        [string equal $_windowingsystem windows] &&
        [info exists env(HOMEDRIVE)] && [info exists env(HOMEPATH)]} {
      if {[file isdirectory $env(HOMEDRIVE)$env(HOMEPATH)]} {
        set UserHomeDir $env(HOMEDRIVE)$env(HOMEPATH)
      }
    }
    ## Have we located the needed path?
    if {![info exists UserHomeDir]} {
      set UserHomeDir [pwd]
    }
    set UserHomeDir [file normalize $UserHomeDir]

    ## Try to locate a temporary directory...
    foreach var {TKDND_TEMP_DIR TEMP TMP} {
      if {[info exists env($var)]} {
        if {[file isdirectory $env($var)] && [file writable $env($var)]} {
          set _drop_file_temp_dir $env($var)
          break
        }
      }
    }
    if {![info exists _drop_file_temp_dir]} {
      foreach _dir [list "$UserHomeDir/Local Settings/Temp" \
                         "$UserHomeDir/AppData/Local/Temp" \
                         /tmp \
                         C:/WINDOWS/Temp C:/Temp C:/tmp \
                         D:/WINDOWS/Temp D:/Temp D:/tmp] {
        if {[file isdirectory $_dir] && [file writable $_dir]} {
          set _drop_file_temp_dir $_dir
          break
        }
      }
    }
    if {![info exists _drop_file_temp_dir]} {
      set _drop_file_temp_dir $UserHomeDir
    }
    set _drop_file_temp_dir [file native $_drop_file_temp_dir]

    source $dir/tkdnd_generic.tcl
    switch $_windowingsystem {
      x11 {
        source $dir/tkdnd_unix.tcl
        set _platform_namespace xdnd
      }
      win32 -
      windows {
        source $dir/tkdnd_windows.tcl
        set _platform_namespace olednd
      }
      aqua  {
        source $dir/tkdnd_macosx.tcl
        set _platform_namespace macdnd
      }
      default {
        error "unknown Tk windowing system"
      }
    }
    load $dir/$PKG_LIB_FILE $PACKAGE_NAME
    source $dir/tkdnd_compat.tcl
    ${_platform_namespace}::initialise
  };# initialise

  proc GetDropFileTempDirectory { } {
    variable _drop_file_temp_dir
    return $_drop_file_temp_dir
  }
  proc SetDropFileTempDirectory { dir } {
    variable _drop_file_temp_dir
    set _drop_file_temp_dir $dir
  }
 
};# namespace ::tkdnd

# ----------------------------------------------------------------------------
#  Command tkdnd::drag_source
# ----------------------------------------------------------------------------
proc ::tkdnd::drag_source { mode path { types {} } { event 1 } } {
  set tags [bindtags $path]
  set idx  [lsearch $tags "TkDND_Drag*"]
  switch -- $mode {
    register {
      if { $idx != -1 } {
        bindtags $path [lreplace $tags $idx $idx TkDND_Drag$event]
      } else {
        bindtags $path [concat $tags TkDND_Drag$event]
      }
      set types [platform_specific_types $types]
      set old_types [bind $path <<DragSourceTypes>>]
      foreach type $types {
        if {[lsearch $old_types $type] < 0} {lappend old_types $type}
      }
      bind $path <<DragSourceTypes>> $old_types
    }
    unregister {
      if { $idx != -1 } {
        bindtags $path [lreplace $tags $idx $idx]
      }
    }
  }
};# tkdnd::drag_source

# ----------------------------------------------------------------------------
#  Command tkdnd::drop_target
# ----------------------------------------------------------------------------
proc ::tkdnd::drop_target { mode path { types {} } } {
  variable _windowingsystem
  set types [platform_specific_types $types]
  switch -- $mode {
    register {
      switch $_windowingsystem {
        x11 {
          _register_types $path [winfo toplevel $path] $types
        }
        win32 -
        windows {
          _RegisterDragDrop $path
          bind <Destroy> $path {+ tkdnd::_RevokeDragDrop %W}
        }
        aqua {
          macdnd::registerdragwidget [winfo toplevel $path] $types
        }
        default {
          error "unknown Tk windowing system"
        }
      }
      set old_types [bind $path <<DropTargetTypes>>]
      set new_types {}
      foreach type $types {
        if {[lsearch -exact $old_types $type] < 0} {lappend new_types $type}
      }
      if {[llength $new_types]} {
        bind $path <<DropTargetTypes>> [concat $old_types $new_types]
      }
    }
    unregister {
      switch $_windowingsystem {
        x11 {
        }
        win32 -
        windows {
          _RevokeDragDrop $path
        }
        aqua {
          error todo
        }
        default {
          error "unknown Tk windowing system"
        }
      }
      bind $path <<DropTargetTypes>> {}
    }
  }
};# tkdnd::drop_target

# ----------------------------------------------------------------------------
#  Command tkdnd::_begin_drag
# ----------------------------------------------------------------------------
proc ::tkdnd::_begin_drag { event button source state X Y x y } {
  variable _x0
  variable _y0
  variable _state

  switch -- $event {
    press {
      set _x0    $X
      set _y0    $Y
      set _state "press"
    }
    motion {
      if { ![info exists _state] } {
        # This is just extra protection. There seem to be
        # rare cases where the motion comes before the press.
        return
      }
      if { [string equal $_state "press"] } {
        if { abs($_x0-$X) > 3 || abs($_y0-$Y) > 3 } {
          set _state "done"
          _init_drag $button $source $state $X $Y $x $y
        }
      }
    }
  }
};# tkdnd::_begin_drag

# ----------------------------------------------------------------------------
#  Command tkdnd::_init_drag
# ----------------------------------------------------------------------------
proc ::tkdnd::_init_drag { button source state rootX rootY X Y } {
  # Call the <<DragInitCmd>> binding.
  set cmd [bind $source <<DragInitCmd>>]
  if {[string length $cmd]} {
    set cmd [string map [list %W $source %X $rootX %Y $rootY %x $X %y $Y \
                              %S $state  %e <<DragInitCmd>> %A \{\} %% % \
                              %t [bind $source <<DragSourceTypes>>]] $cmd]
    set code [catch {uplevel \#0 $cmd} info options]
    switch -exact -- $code {
      0 {}
      3 - 4 {
        # FRINK: nocheck
        return
      }
      default {
        return -options $options $info
      }
    }

    set len [llength $info]
    if {$len == 3} {
      foreach { actions types _data } $info { break }
      set types [platform_specific_types $types]
      set data [list]
      foreach type $types {
        lappend data $_data
      }
      unset _data
    } elseif {$len == 2} {
      foreach { actions _data } $info { break }
      set data [list]; set types [list]
      foreach {t d} $_data {
        foreach t [platform_specific_types $t] {
          lappend types $t; lappend data $d
        }
      }
      unset _data t d
    } else {
      if {$len == 1 && [string equal [lindex $actions 0] "refuse_drop"]} {
        return
      }
      error "not enough items in the result of the <<DragInitCmd>>\
             event binding. Either 2 or 3 items are expected."
    }
    set action refuse_drop
    variable _windowingsystem
    switch $_windowingsystem {
      x11 {
        set action [xdnd::_dodragdrop $source $actions $types $data $button]
      }
      win32 -
      windows {
        set action [_DoDragDrop $source $actions $types $data $button]
      }
      aqua {
        set action [macdnd::dodragdrop $source $actions $types $data $button]
      }
      default {
        error "unknown Tk windowing system"
      }
    }
    ## Call _end_drag to notify the widget of the result of the drag
    ## operation...
    _end_drag $button $source {} $action {} $data {} $state $rootX $rootY $X $Y
  }
};# tkdnd::_init_drag

# ----------------------------------------------------------------------------
#  Command tkdnd::_end_drag
# ----------------------------------------------------------------------------
proc ::tkdnd::_end_drag { button source target action type data result
                          state rootX rootY X Y } {
  set rootX 0
  set rootY 0
  # Call the <<DragEndCmd>> binding.
  set cmd [bind $source <<DragEndCmd>>]
  if {[string length $cmd]} {
    set cmd [string map [list %W $source %X $rootX %Y $rootY %x $X %y $Y %% % \
                              %S $state %e <<DragEndCmd>> %A \{$action\}] $cmd]
    set info [uplevel \#0 $cmd]
    # if { $info != "" } {
    #   variable _windowingsystem
    #   foreach { actions types data } $info { break }
    #   set types [platform_specific_types $types]
    #   switch $_windowingsystem {
    #     x11 {
    #       error "dragging from Tk widgets not yet supported"
    #     }
    #     win32 -
    #     windows {
    #       set action [_DoDragDrop $source $actions $types $data $button]
    #     }
    #     aqua {
    #       macdnd::dodragdrop $source $actions $types $data
    #     }
    #     default {
    #       error "unknown Tk windowing system"
    #     }
    #   }
    #   ## Call _end_drag to notify the widget of the result of the drag
    #   ## operation...
    #   _end_drag $button $source {} $action {} $data {} $state $rootX $rootY
    # }
  }
};# tkdnd::_end_drag

# ----------------------------------------------------------------------------
#  Command tkdnd::platform_specific_types
# ----------------------------------------------------------------------------
proc ::tkdnd::platform_specific_types { types } {
  variable _platform_namespace
  ${_platform_namespace}::platform_specific_types $types
}; # tkdnd::platform_specific_types

# ----------------------------------------------------------------------------
#  Command tkdnd::platform_independent_types
# ----------------------------------------------------------------------------
proc ::tkdnd::platform_independent_types { types } {
  variable _platform_namespace
  ${_platform_namespace}::platform_independent_types $types
}; # tkdnd::platform_independent_types

# ----------------------------------------------------------------------------
#  Command tkdnd::platform_specific_type
# ----------------------------------------------------------------------------
proc ::tkdnd::platform_specific_type { type } {
  variable _platform_namespace
  ${_platform_namespace}::platform_specific_type $type
}; # tkdnd::platform_specific_type

# ----------------------------------------------------------------------------
#  Command tkdnd::platform_independent_type
# ----------------------------------------------------------------------------
proc ::tkdnd::platform_independent_type { type } {
  variable _platform_namespace
  ${_platform_namespace}::platform_independent_type $type
}; # tkdnd::platform_independent_type

# ----------------------------------------------------------------------------
#  Command tkdnd::bytes_to_string
# ----------------------------------------------------------------------------
proc ::tkdnd::bytes_to_string { bytes } {
  set string {}
  foreach byte $bytes {
    append string [binary format c $byte]
  }
  return $string
};# tkdnd::bytes_to_string

# ----------------------------------------------------------------------------
#  Command tkdnd::urn_unquote
# ----------------------------------------------------------------------------
proc ::tkdnd::urn_unquote {url} {
  set result ""
  set start 0
  while {[regexp -start $start -indices {%[0-9a-fA-F]{2}} $url match]} {
    foreach {first last} $match break
    append result [string range $url $start [expr {$first - 1}]]
    append result [format %c 0x[string range $url [incr first] $last]]
    set start [incr last]
  }
  append result [string range $url $start end]
  return $result
};# tkdnd::urn_unquote
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted winlibs/tkdnd2.8/tkdnd28.dll.

cannot compute difference between binary files

Deleted winlibs/tkdnd2.8/tkdnd_compat.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#
# tkdnd_compat.tcl --
# 
#    This file implements some utility procedures, to support older versions
#    of the TkDND package.
#
# This software is copyrighted by:
# George Petasis, National Centre for Scientific Research "Demokritos",
# Aghia Paraskevi, Athens, Greece.
# e-mail: petasis@iit.demokritos.gr
#
# The following terms apply to all files associated
# with the software unless explicitly disclaimed in individual files.
#
# The authors hereby grant permission to use, copy, modify, distribute,
# and license this software and its documentation for any purpose, provided
# that existing copyright notices are retained in all copies and that this
# notice is included verbatim in any distributions. No written agreement,
# license, or royalty fee is required for any of the authorized uses.
# Modifications to this software may be copyrighted by their authors
# and need not follow the licensing terms described here, provided that
# the new terms are clearly indicated on the first page of each file where
# they apply.
# 
# 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.
#

namespace eval compat {

};# namespace compat

# ----------------------------------------------------------------------------
#  Command ::dnd
# ----------------------------------------------------------------------------
proc ::dnd {method window args} {
  switch $method {
    bindtarget {
      switch [llength $args] {
        0 {return [tkdnd::compat::bindtarget0 $window]}
        1 {return [tkdnd::compat::bindtarget1 $window [lindex $args 0]]}
        2 {return [tkdnd::compat::bindtarget2 $window [lindex $args 0] \
                                                      [lindex $args 1]]}
        3 {return [tkdnd::compat::bindtarget3 $window [lindex $args 0] \
                                     [lindex $args 1] [lindex $args 2]]}
        4 {return [tkdnd::compat::bindtarget4 $window [lindex $args 0] \
                    [lindex $args 1] [lindex $args 2] [lindex $args 3]]}
      }
    }
    cleartarget {
      return [tkdnd::compat::cleartarget $window]
    }
    bindsource {
      switch [llength $args] {
        0 {return [tkdnd::compat::bindsource0 $window]}
        1 {return [tkdnd::compat::bindsource1 $window [lindex $args 0]]}
        2 {return [tkdnd::compat::bindsource2 $window [lindex $args 0] \
                                                      [lindex $args 1]]}
        3 {return [tkdnd::compat::bindsource3 $window [lindex $args 0] \
                                     [lindex $args 1] [lindex $args 2]]}
      }
    }
    clearsource {
      return [tkdnd::compat::clearsource $window]
    }
    drag {
      return [tkdnd::_init_drag $window "press" 0 0]
    }
  }
  error "invalid number of arguments!"
};# ::dnd

# ----------------------------------------------------------------------------
#  Command compat::bindtarget
# ----------------------------------------------------------------------------
proc compat::bindtarget0 {window} {
  return [bind $window <<DropTargetTypes>>]
};# compat::bindtarget0

proc compat::bindtarget1 {window type} {
  return [bindtarget2 $window $type <Drop>]
};# compat::bindtarget1

proc compat::bindtarget2 {window type event} {
  switch $event {
    <DragEnter> {return [bind $window <<DropEnter>>]}
    <Drag>      {return [bind $window <<DropPosition>>]}
    <DragLeave> {return [bind $window <<DropLeave>>]}
    <Drop>      {return [bind $window <<Drop>>]}
  }
};# compat::bindtarget2

proc compat::bindtarget3 {window type event script} {
  set type [normalise_type $type]
  ::tkdnd::drop_target register $window [list $type]
  switch $event {
    <DragEnter> {return [bind $window <<DropEnter>> $script]}
    <Drag>      {return [bind $window <<DropPosition>> $script]}
    <DragLeave> {return [bind $window <<DropLeave>> $script]}
    <Drop>      {return [bind $window <<Drop>> $script]}
  }
};# compat::bindtarget3

proc compat::bindtarget4 {window type event script priority} {
  return [bindtarget3 $window $type $event $script]
};# compat::bindtarget4

proc compat::normalise_type { type } {
  switch $type {
    text/plain -
    {text/plain;charset=UTF-8} -
    Text                       {return DND_Text}
    text/uri-list -
    Files                      {return DND_Files}
    default                    {return $type}
  }
};# compat::normalise_type

# ----------------------------------------------------------------------------
#  Command compat::bindsource
# ----------------------------------------------------------------------------
proc compat::bindsource0 {window} {
  return [bind $window <<DropTargetTypes>>]
};# compat::bindsource0

proc compat::bindsource1 {window type} {
  return [bindsource2 $window $type <Drop>]
};# compat::bindsource1

proc compat::bindsource2 {window type script} {
  ::tkdnd::drag_source register $window $type 2
  bind $window <<DragInitCmd>> "list {copy} %t \[$script\]"
};# compat::bindsource2

proc compat::bindsource3 {window type script priority} {
  return [bindsource2 $window $type $script]
};# compat::bindsource3

# ----------------------------------------------------------------------------
#  Command compat::cleartarget
# ----------------------------------------------------------------------------
proc compat::cleartarget {window} {
};# compat::cleartarget

# ----------------------------------------------------------------------------
#  Command compat::clearsource
# ----------------------------------------------------------------------------
proc compat::clearsource {window} {
};# compat::clearsource
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






























































































































































































































































































































Deleted winlibs/tkdnd2.8/tkdnd_generic.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
#
# tkdnd_generic.tcl --
#
#    This file implements some utility procedures that are used by the TkDND
#    package.
#
# This software is copyrighted by:
# George Petasis, National Centre for Scientific Research "Demokritos",
# Aghia Paraskevi, Athens, Greece.
# e-mail: petasis@iit.demokritos.gr
#
# The following terms apply to all files associated
# with the software unless explicitly disclaimed in individual files.
#
# The authors hereby grant permission to use, copy, modify, distribute,
# and license this software and its documentation for any purpose, provided
# that existing copyright notices are retained in all copies and that this
# notice is included verbatim in any distributions. No written agreement,
# license, or royalty fee is required for any of the authorized uses.
# Modifications to this software may be copyrighted by their authors
# and need not follow the licensing terms described here, provided that
# the new terms are clearly indicated on the first page of each file where
# they apply.
#
# 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.
#

namespace eval generic {
  variable _types {}
  variable _typelist {}
  variable _codelist {}
  variable _actionlist {}
  variable _pressedkeys {}
  variable _action {}
  variable _common_drag_source_types {}
  variable _common_drop_target_types {}
  variable _drag_source {}
  variable _drop_target {}

  variable _last_mouse_root_x 0
  variable _last_mouse_root_y 0

  variable _tkdnd2platform
  variable _platform2tkdnd

  proc debug {msg} {
    puts $msg
  };# debug

  proc initialise { } {
  };# initialise

  proc initialise_platform_to_tkdnd_types { types } {
    variable _platform2tkdnd
    variable _tkdnd2platform
    set _platform2tkdnd [dict create {*}$types]
    set _tkdnd2platform [dict create]
    foreach type [dict keys $_platform2tkdnd] {
      dict lappend _tkdnd2platform [dict get $_platform2tkdnd $type] $type
    }
  };# initialise_platform_to_tkdnd_types

  proc initialise_tkdnd_to_platform_types { types } {
    variable _tkdnd2platform
    set _tkdnd2platform [dict create {*}$types]
  };# initialise_tkdnd_to_platform_types

};# namespace generic

# ----------------------------------------------------------------------------
#  Command generic::HandleEnter
# ----------------------------------------------------------------------------
proc generic::HandleEnter { drop_target drag_source typelist codelist
                            actionlist pressedkeys } {
  variable _typelist;                 set _typelist    $typelist
  variable _pressedkeys;              set _pressedkeys $pressedkeys
  variable _action;                   set _action      refuse_drop
  variable _common_drag_source_types; set _common_drag_source_types {}
  variable _common_drop_target_types; set _common_drop_target_types {}
  variable _actionlist
  variable _drag_source;              set _drag_source $drag_source
  variable _drop_target;              set _drop_target {}
  variable _actionlist;               set _actionlist  $actionlist
  variable _codelist                  set _codelist    $codelist

  variable _last_mouse_root_x;        set _last_mouse_root_x 0
  variable _last_mouse_root_y;        set _last_mouse_root_y 0
  # debug "\n==============================================================="
  # debug "generic::HandleEnter: drop_target=$drop_target,\
  #        drag_source=$drag_source,\
  #        typelist=$typelist"
  # debug "generic::HandleEnter: ACTION: default"
  return default
};# generic::HandleEnter

# ----------------------------------------------------------------------------
#  Command generic::HandlePosition
# ----------------------------------------------------------------------------
proc generic::HandlePosition { drop_target drag_source pressedkeys
                               rootX rootY } {
  variable _types
  variable _typelist
  variable _codelist
  variable _actionlist
  variable _pressedkeys
  variable _action
  variable _common_drag_source_types
  variable _common_drop_target_types
  variable _drag_source
  variable _drop_target

  variable _last_mouse_root_x;        set _last_mouse_root_x $rootX
  variable _last_mouse_root_y;        set _last_mouse_root_y $rootY

  # debug "generic::HandlePosition: drop_target=$drop_target,\
  #            _drop_target=$_drop_target, rootX=$rootX, rootY=$rootY"

  if {![info exists _drag_source] && ![string length $_drag_source]} {
    # debug "generic::HandlePosition: no or empty _drag_source:\
    #               return refuse_drop"
    return refuse_drop
  }

  if {$drag_source ne "" && $drag_source ne $_drag_source} {
    debug "generic position event from unexpected source: $_drag_source\
           != $drag_source"
    return refuse_drop
  }

  set _pressedkeys $pressedkeys

  ## Does the new drop target support any of our new types?
  # foreach {common_drag_source_types common_drop_target_types} \
  #         [GetWindowCommonTypes $drop_target $_typelist] {break}
  foreach {drop_target common_drag_source_types common_drop_target_types} \
          [FindWindowWithCommonTypes $drop_target $_typelist] {break}

  # debug "\t($_drop_target) -> ($drop_target)"
  if {$drop_target != $_drop_target} {
    if {[string length $_drop_target]} {
      ## Call the <<DropLeave>> event.
      # debug "\t<<DropLeave>> on $_drop_target"
      set cmd [bind $_drop_target <<DropLeave>>]
      if {[string length $cmd]} {
        set cmd [string map [list %W $_drop_target %X $rootX %Y $rootY \
          %CST \{$_common_drag_source_types\} \
          %CTT \{$_common_drop_target_types\} \
          %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \
          %ST  \{$_typelist\}    %TT \{$_types\} \
          %A   \{$_action\}      %a \{$_actionlist\} \
          %b   \{$_pressedkeys\} %m \{$_pressedkeys\} \
          %D   \{\}              %e <<DropLeave>> \
          %L   \{$_typelist\}    %% % \
          %t   \{$_typelist\}    %T  \{[lindex $_common_drag_source_types 0]\} \
          %c   \{$_codelist\}    %C  \{[lindex $_codelist 0]\} \
          ] $cmd]
        uplevel \#0 $cmd
      }
    }
    set _drop_target $drop_target
    set _action      refuse_drop

    if {[llength $common_drag_source_types]} {
      set _action [lindex $_actionlist 0]
      set _common_drag_source_types $common_drag_source_types
      set _common_drop_target_types $common_drop_target_types
      ## Drop target supports at least one type. Send a <<DropEnter>>.
      # puts "<<DropEnter>> -> $drop_target"
      set cmd [bind $drop_target <<DropEnter>>]
      if {[string length $cmd]} {
        focus $drop_target
        set cmd [string map [list %W $drop_target %X $rootX %Y $rootY \
          %CST \{$_common_drag_source_types\} \
          %CTT \{$_common_drop_target_types\} \
          %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \
          %ST  \{$_typelist\}    %TT \{$_types\} \
          %A   $_action          %a  \{$_actionlist\} \
          %b   \{$_pressedkeys\} %m  \{$_pressedkeys\} \
          %D   \{\}              %e  <<DropEnter>> \
          %L   \{$_typelist\}    %%  % \
          %t   \{$_typelist\}    %T  \{[lindex $_common_drag_source_types 0]\} \
          %c   \{$_codelist\}    %C  \{[lindex $_codelist 0]\} \
          ] $cmd]
        set _action [uplevel \#0 $cmd]
        switch -exact -- $_action {
          copy - move - link - ask - private - refuse_drop - default {}
          default {set _action copy}
        }
      }
    }
  }

  set _drop_target {}
  if {[llength $common_drag_source_types]} {
    set _common_drag_source_types $common_drag_source_types
    set _common_drop_target_types $common_drop_target_types
    set _drop_target $drop_target
    ## Drop target supports at least one type. Send a <<DropPosition>>.
    set cmd [bind $drop_target <<DropPosition>>]
    if {[string length $cmd]} {
      set cmd [string map [list %W $drop_target %X $rootX %Y $rootY \
        %CST \{$_common_drag_source_types\} \
        %CTT \{$_common_drop_target_types\} \
        %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \
        %ST  \{$_typelist\}    %TT \{$_types\} \
        %A   $_action          %a  \{$_actionlist\} \
        %b   \{$_pressedkeys\} %m  \{$_pressedkeys\} \
        %D   \{\}              %e  <<DropPosition>> \
        %L   \{$_typelist\}    %%  % \
        %t   \{$_typelist\}    %T  \{[lindex $_common_drag_source_types 0]\} \
        %c   \{$_codelist\}    %C  \{[lindex $_codelist 0]\} \
        ] $cmd]
      set _action [uplevel \#0 $cmd]
    }
  }
  # Return values: copy, move, link, ask, private, refuse_drop, default
  # debug "generic::HandlePosition: ACTION: $_action"
  switch -exact -- $_action {
    copy - move - link - ask - private - refuse_drop - default {}
    default {set _action copy}
  }
  return $_action
};# generic::HandlePosition

# ----------------------------------------------------------------------------
#  Command generic::HandleLeave
# ----------------------------------------------------------------------------
proc generic::HandleLeave { } {
  variable _types
  variable _typelist
  variable _codelist
  variable _actionlist
  variable _pressedkeys
  variable _action
  variable _common_drag_source_types
  variable _common_drop_target_types
  variable _drag_source
  variable _drop_target
  variable _last_mouse_root_x
  variable _last_mouse_root_y
  if {![info exists _drop_target]} {set _drop_target {}}
  # debug "generic::HandleLeave: _drop_target=$_drop_target"
  if {[info exists _drop_target] && [string length $_drop_target]} {
    set cmd [bind $_drop_target <<DropLeave>>]
    if {[string length $cmd]} {
      set cmd [string map [list %W $_drop_target \
        %X $_last_mouse_root_x %Y $_last_mouse_root_y \
        %CST \{$_common_drag_source_types\} \
        %CTT \{$_common_drop_target_types\} \
        %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \
        %ST  \{$_typelist\}    %TT \{$_types\} \
        %A   \{$_action\}      %a  \{$_actionlist\} \
        %b   \{$_pressedkeys\} %m  \{$_pressedkeys\} \
        %D   \{\}              %e  <<DropLeave>> \
        %L   \{$_typelist\}    %%  % \
        %t   \{$_typelist\}    %T  \{[lindex $_common_drag_source_types 0]\} \
        %c   \{$_codelist\}    %C  \{[lindex $_codelist 0]\} \
        ] $cmd]
      set _action [uplevel \#0 $cmd]
    }
  }
  foreach var {_types _typelist _actionlist _pressedkeys _action
               _common_drag_source_types _common_drop_target_types
               _drag_source _drop_target} {
    set $var {}
  }
};# generic::HandleLeave

# ----------------------------------------------------------------------------
#  Command generic::HandleDrop
# ----------------------------------------------------------------------------
proc generic::HandleDrop {drop_target drag_source pressedkeys rootX rootY time } {
  variable _types
  variable _typelist
  variable _codelist
  variable _actionlist
  variable _pressedkeys
  variable _action
  variable _common_drag_source_types
  variable _common_drop_target_types
  variable _drag_source
  variable _drop_target
  variable _last_mouse_root_x
  variable _last_mouse_root_y
  variable _last_mouse_root_x;        set _last_mouse_root_x $rootX
  variable _last_mouse_root_y;        set _last_mouse_root_y $rootY

  set _pressedkeys $pressedkeys

  # puts "generic::HandleDrop: $time"

  if {![info exists _drag_source] && ![string length $_drag_source]} {
    return refuse_drop
  }
  if {![info exists _drop_target] && ![string length $_drop_target]} {
    return refuse_drop
  }
  if {![llength $_common_drag_source_types]} {return refuse_drop}
  ## Get the dropped data.
  set data [GetDroppedData $time]
  ## Try to select the most specific <<Drop>> event.
  foreach type [concat $_common_drag_source_types $_common_drop_target_types] {
    set type [platform_independent_type $type]
    set cmd [bind $_drop_target <<Drop:$type>>]
    if {[string length $cmd]} {
      set cmd [string map [list %W $_drop_target %X $rootX %Y $rootY \
        %CST \{$_common_drag_source_types\} \
        %CTT \{$_common_drop_target_types\} \
        %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \
        %ST  \{$_typelist\}    %TT \{$_types\} \
        %A   $_action          %a \{$_actionlist\} \
        %b   \{$_pressedkeys\} %m \{$_pressedkeys\} \
        %D   [list $data]      %e <<Drop:$type>> \
        %L   \{$_typelist\}    %% % \
        %t   \{$_typelist\}    %T  \{[lindex $_common_drag_source_types 0]\} \
        %c   \{$_codelist\}    %C  \{[lindex $_codelist 0]\} \
        ] $cmd]
      set _action [uplevel \#0 $cmd]
      # Return values: copy, move, link, ask, private, refuse_drop
      switch -exact -- $_action {
        copy - move - link - ask - private - refuse_drop - default {}
        default {set _action copy}
      }
      return $_action
    }
  }
  set cmd [bind $_drop_target <<Drop>>]
  if {[string length $cmd]} {
    set cmd [string map [list %W $_drop_target %X $rootX %Y $rootY \
      %CST \{$_common_drag_source_types\} \
      %CTT \{$_common_drop_target_types\} \
      %CPT \{[lindex [platform_independent_type [lindex $_common_drag_source_types 0]] 0]\} \
      %ST  \{$_typelist\}    %TT \{$_types\} \
      %A   $_action          %a \{$_actionlist\} \
      %b   \{$_pressedkeys\} %m \{$_pressedkeys\} \
      %D   [list $data]      %e <<Drop>> \
      %L   \{$_typelist\}    %% % \
      %t   \{$_typelist\}    %T  \{[lindex $_common_drag_source_types 0]\} \
      %c   \{$_codelist\}    %C  \{[lindex $_codelist 0]\} \
      ] $cmd]
    set _action [uplevel \#0 $cmd]
  }
  # Return values: copy, move, link, ask, private, refuse_drop
  switch -exact -- $_action {
    copy - move - link - ask - private - refuse_drop - default {}
    default {set _action copy}
  }
  return $_action
};# generic::HandleDrop

# ----------------------------------------------------------------------------
#  Command generic::GetWindowCommonTypes
# ----------------------------------------------------------------------------
proc generic::GetWindowCommonTypes { win typelist } {
  set types [bind $win <<DropTargetTypes>>]
  # debug ">> Accepted types: $win $_types"
  set common_drag_source_types {}
  set common_drop_target_types {}
  if {[llength $types]} {
    ## Examine the drop target types, to find at least one match with the drag
    ## source types...
    set supported_types [supported_types $typelist]
    foreach type $types {
      foreach matched [lsearch -glob -all -inline $supported_types $type] {
        ## Drop target supports this type.
        lappend common_drag_source_types $matched
        lappend common_drop_target_types $type
      }
    }
  }
  list $common_drag_source_types $common_drop_target_types
};# generic::GetWindowCommonTypes

# ----------------------------------------------------------------------------
#  Command generic::FindWindowWithCommonTypes
# ----------------------------------------------------------------------------
proc generic::FindWindowWithCommonTypes { win typelist } {
  set toplevel [winfo toplevel $win]
  while {![string equal $win $toplevel]} {
    foreach {common_drag_source_types common_drop_target_types} \
            [GetWindowCommonTypes $win $typelist] {break}
    if {[llength $common_drag_source_types]} {
      return [list $win $common_drag_source_types $common_drop_target_types]
    }
    set win [winfo parent $win]
  }
  ## We have reached the toplevel, which may be also a target (SF Bug #30)
  foreach {common_drag_source_types common_drop_target_types} \
          [GetWindowCommonTypes $win $typelist] {break}
  if {[llength $common_drag_source_types]} {
    return [list $win $common_drag_source_types $common_drop_target_types]
  }
  return { {} {} {} }
};# generic::FindWindowWithCommonTypes

# ----------------------------------------------------------------------------
#  Command generic::GetDroppedData
# ----------------------------------------------------------------------------
proc generic::GetDroppedData { time } {
  variable _dropped_data
  return  $_dropped_data
};# generic::GetDroppedData

# ----------------------------------------------------------------------------
#  Command generic::SetDroppedData
# ----------------------------------------------------------------------------
proc generic::SetDroppedData { data } {
  variable _dropped_data
  set _dropped_data $data
};# generic::SetDroppedData

# ----------------------------------------------------------------------------
#  Command generic::GetDragSource
# ----------------------------------------------------------------------------
proc generic::GetDragSource { } {
  variable _drag_source
  return  $_drag_source
};# generic::GetDragSource

# ----------------------------------------------------------------------------
#  Command generic::GetDropTarget
# ----------------------------------------------------------------------------
proc generic::GetDropTarget { } {
  variable _drop_target
  return $_drop_target
};# generic::GetDropTarget

# ----------------------------------------------------------------------------
#  Command generic::GetDragSourceCommonTypes
# ----------------------------------------------------------------------------
proc generic::GetDragSourceCommonTypes { } {
  variable _common_drag_source_types
  return  $_common_drag_source_types
};# generic::GetDragSourceCommonTypes

# ----------------------------------------------------------------------------
#  Command generic::GetDropTargetCommonTypes
# ----------------------------------------------------------------------------
proc generic::GetDropTargetCommonTypes { } {
  variable _common_drag_source_types
  return  $_common_drag_source_types
};# generic::GetDropTargetCommonTypes

# ----------------------------------------------------------------------------
#  Command generic::platform_specific_types
# ----------------------------------------------------------------------------
proc generic::platform_specific_types { types } {
  set new_types {}
  foreach type $types {
    set new_types [concat $new_types [platform_specific_type $type]]
  }
  return $new_types
}; # generic::platform_specific_types

# ----------------------------------------------------------------------------
#  Command generic::platform_specific_type
# ----------------------------------------------------------------------------
proc generic::platform_specific_type { type } {
  variable _tkdnd2platform
  if {[dict exists $_tkdnd2platform $type]} {
    return [dict get $_tkdnd2platform $type]
  }
  list $type
}; # generic::platform_specific_type

# ----------------------------------------------------------------------------
#  Command tkdnd::platform_independent_types
# ----------------------------------------------------------------------------
proc ::tkdnd::platform_independent_types { types } {
  set new_types {}
  foreach type $types {
    set new_types [concat $new_types [platform_independent_type $type]]
  }
  return $new_types
}; # tkdnd::platform_independent_types

# ----------------------------------------------------------------------------
#  Command generic::platform_independent_type
# ----------------------------------------------------------------------------
proc generic::platform_independent_type { type } {
  variable _platform2tkdnd
  if {[dict exists $_platform2tkdnd $type]} {
    return [dict get $_platform2tkdnd $type]
  }
  return $type
}; # generic::platform_independent_type

# ----------------------------------------------------------------------------
#  Command generic::supported_types
# ----------------------------------------------------------------------------
proc generic::supported_types { types } {
  set new_types {}
  foreach type $types {
    if {[supported_type $type]} {lappend new_types $type}
  }
  return $new_types
}; # generic::supported_types

# ----------------------------------------------------------------------------
#  Command generic::supported_type
# ----------------------------------------------------------------------------
proc generic::supported_type { type } {
  variable _platform2tkdnd
  if {[dict exists $_platform2tkdnd $type]} {
    return 1
  }
  return 0
}; # generic::supported_type
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<














































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted winlibs/tkdnd2.8/tkdnd_macosx.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#
# tkdnd_macosx.tcl --
#
#    This file implements some utility procedures that are used by the TkDND
#    package.

#   This software is copyrighted by:
#   Georgios Petasis, Athens, Greece.
#   e-mail: petasisg@yahoo.gr, petasis@iit.demokritos.gr
#
#   Mac portions (c) 2009 Kevin Walzer/WordTech Communications LLC,
#   kw@codebykevin.com
#
#
# The following terms apply to all files associated
# with the software unless explicitly disclaimed in individual files.
#
# The authors hereby grant permission to use, copy, modify, distribute,
# and license this software and its documentation for any purpose, provided
# that existing copyright notices are retained in all copies and that this
# notice is included verbatim in any distributions. No written agreement,
# license, or royalty fee is required for any of the authorized uses.
# Modifications to this software may be copyrighted by their authors
# and need not follow the licensing terms described here, provided that
# the new terms are clearly indicated on the first page of each file where
# they apply.
#
# 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.
#

#basic API for Mac Drag and Drop

#two data types supported: strings and file paths

#two commands at C level: ::tkdnd::macdnd::registerdragwidget, ::tkdnd::macdnd::unregisterdragwidget

#data retrieval mechanism: text or file paths are copied from drag clipboard to system clipboard and retrieved via [clipboard get]; array of file paths is converted to single tab-separated string, can be split into Tcl list

if {[tk windowingsystem] eq "aqua" && "AppKit" ni [winfo server .]} {
  error {TkAqua Cocoa required}
}

namespace eval macdnd {

  proc initialise { } {
     ## Mapping from platform types to TkDND types...
    ::tkdnd::generic::initialise_platform_to_tkdnd_types [list \
       NSPasteboardTypeString  DND_Text  \
       NSFilenamesPboardType   DND_Files \
       NSPasteboardTypeHTML    DND_HTML  \
    ]
  };# initialise

};# namespace macdnd

# ----------------------------------------------------------------------------
#  Command macdnd::HandleEnter
# ----------------------------------------------------------------------------
proc macdnd::HandleEnter { path drag_source typelist } {
  variable _pressedkeys
  variable _actionlist
  set _pressedkeys 1
  set _actionlist  { copy move link ask private }
  ::tkdnd::generic::HandleEnter $path $drag_source $typelist $typelist \
           $_actionlist $_pressedkeys
};# macdnd::HandleEnter

# ----------------------------------------------------------------------------
#  Command macdnd::HandlePosition
# ----------------------------------------------------------------------------
proc macdnd::HandlePosition { drop_target rootX rootY {drag_source {}} } {
  variable _pressedkeys
  variable _last_mouse_root_x; set _last_mouse_root_x $rootX
  variable _last_mouse_root_y; set _last_mouse_root_y $rootY
  ::tkdnd::generic::HandlePosition $drop_target $drag_source \
                                   $_pressedkeys $rootX $rootY
};# macdnd::HandlePosition

# ----------------------------------------------------------------------------
#  Command macdnd::HandleLeave
# ----------------------------------------------------------------------------
proc macdnd::HandleLeave { args } {
  ::tkdnd::generic::HandleLeave
};# macdnd::HandleLeave

# ----------------------------------------------------------------------------
#  Command macdnd::HandleDrop
# ----------------------------------------------------------------------------
proc macdnd::HandleDrop { drop_target data args } {
  variable _pressedkeys
  variable _last_mouse_root_x
  variable _last_mouse_root_y
  ## Get the dropped data...
  ::tkdnd::generic::SetDroppedData $data
  ::tkdnd::generic::HandleDrop {} {} $_pressedkeys \
                               $_last_mouse_root_x $_last_mouse_root_y 0
};# macdnd::HandleDrop

# ----------------------------------------------------------------------------
#  Command macdnd::GetDragSourceCommonTypes
# ----------------------------------------------------------------------------
proc macdnd::GetDragSourceCommonTypes { } {
  ::tkdnd::generic::GetDragSourceCommonTypes
};# macdnd::GetDragSourceCommonTypes

# ----------------------------------------------------------------------------
#  Command macdnd::platform_specific_types
# ----------------------------------------------------------------------------
proc macdnd::platform_specific_types { types } {
  ::tkdnd::generic::platform_specific_types $types
}; # macdnd::platform_specific_types

# ----------------------------------------------------------------------------
#  Command macdnd::platform_specific_type
# ----------------------------------------------------------------------------
proc macdnd::platform_specific_type { type } {
  ::tkdnd::generic::platform_specific_type $type
}; # macdnd::platform_specific_type

# ----------------------------------------------------------------------------
#  Command tkdnd::platform_independent_types
# ----------------------------------------------------------------------------
proc ::tkdnd::platform_independent_types { types } {
  ::tkdnd::generic::platform_independent_types $types
}; # tkdnd::platform_independent_types

# ----------------------------------------------------------------------------
#  Command macdnd::platform_independent_type
# ----------------------------------------------------------------------------
proc macdnd::platform_independent_type { type } {
  ::tkdnd::generic::platform_independent_type $type
}; # macdnd::platform_independent_type
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






























































































































































































































































































Deleted winlibs/tkdnd2.8/tkdnd_unix.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
#
# tkdnd_unix.tcl --
#
#    This file implements some utility procedures that are used by the TkDND
#    package.
#
# This software is copyrighted by:
# George Petasis, National Centre for Scientific Research "Demokritos",
# Aghia Paraskevi, Athens, Greece.
# e-mail: petasis@iit.demokritos.gr
#
# The following terms apply to all files associated
# with the software unless explicitly disclaimed in individual files.
#
# The authors hereby grant permission to use, copy, modify, distribute,
# and license this software and its documentation for any purpose, provided
# that existing copyright notices are retained in all copies and that this
# notice is included verbatim in any distributions. No written agreement,
# license, or royalty fee is required for any of the authorized uses.
# Modifications to this software may be copyrighted by their authors
# and need not follow the licensing terms described here, provided that
# the new terms are clearly indicated on the first page of each file where
# they apply.
#
# 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.
#

namespace eval xdnd {
  variable _dragging 0

  proc initialise { } {
    ## Mapping from platform types to TkDND types...
    ::tkdnd::generic::initialise_platform_to_tkdnd_types [list \
       text/plain\;charset=utf-8     DND_Text  \
       UTF8_STRING                   DND_Text  \
       text/plain                    DND_Text  \
       STRING                        DND_Text  \
       TEXT                          DND_Text  \
       COMPOUND_TEXT                 DND_Text  \
       text/uri-list                 DND_Files \
       text/html\;charset=utf-8      DND_HTML  \
       text/html                     DND_HTML  \
       application/x-color           DND_Color \
    ]
  };# initialise

};# namespace xdnd

# ----------------------------------------------------------------------------
#  Command xdnd::HandleXdndEnter
# ----------------------------------------------------------------------------
proc xdnd::HandleXdndEnter { path drag_source typelist } {
  variable _pressedkeys
  variable _actionlist
  set _pressedkeys 1
  set _actionlist  { copy move link ask private }
  ::tkdnd::generic::HandleEnter $path $drag_source $typelist $typelist \
           $_actionlist $_pressedkeys
};# xdnd::HandleXdndEnter

# ----------------------------------------------------------------------------
#  Command xdnd::HandleXdndPosition
# ----------------------------------------------------------------------------
proc xdnd::HandleXdndPosition { drop_target rootX rootY {drag_source {}} } {
  variable _pressedkeys
  variable _last_mouse_root_x; set _last_mouse_root_x $rootX
  variable _last_mouse_root_y; set _last_mouse_root_y $rootY
  ::tkdnd::generic::HandlePosition $drop_target $drag_source \
                                   $_pressedkeys $rootX $rootY
};# xdnd::HandleXdndPosition

# ----------------------------------------------------------------------------
#  Command xdnd::HandleXdndLeave
# ----------------------------------------------------------------------------
proc xdnd::HandleXdndLeave { } {
  ::tkdnd::generic::HandleLeave
};# xdnd::HandleXdndLeave

# ----------------------------------------------------------------------------
#  Command xdnd::_HandleXdndDrop
# ----------------------------------------------------------------------------
proc xdnd::HandleXdndDrop { time } {
  variable _pressedkeys
  variable _last_mouse_root_x
  variable _last_mouse_root_y
  ## Get the dropped data...
  ::tkdnd::generic::SetDroppedData [GetDroppedData $time]
  ::tkdnd::generic::HandleDrop {} {} $_pressedkeys \
                               $_last_mouse_root_x $_last_mouse_root_y $time
};# xdnd::HandleXdndDrop

# ----------------------------------------------------------------------------
#  Command xdnd::_GetDroppedData
# ----------------------------------------------------------------------------
proc xdnd::GetDroppedData { time } {
  set _drag_source              [::tkdnd::generic::GetDragSource]
  set _drop_target              [::tkdnd::generic::GetDropTarget]
  set _common_drag_source_types [::tkdnd::generic::GetDragSourceCommonTypes]
  if {![llength $_common_drag_source_types]} {
    error "no common data types between the drag source and drop target widgets"
  }
  ## Is drag source in this application?
  if {[catch {winfo pathname -displayof $_drop_target $_drag_source} p]} {
    set _use_tk_selection 0
  } else {
    set _use_tk_selection 1
  }
  foreach type $_common_drag_source_types {
    # puts "TYPE: $type ($_drop_target)"
    # _get_selection $_drop_target $time $type
    if {$_use_tk_selection} {
      if {![catch {
        selection get -displayof $_drop_target -selection XdndSelection \
                      -type $type
                                              } result options]} {
        return [normalise_data $type $result]
      }
    } else {
      # puts "_selection_get -displayof $_drop_target -selection XdndSelection \
      #                 -type $type -time $time"
      #after 100 [list focus -force $_drop_target]
      #after 50 [list raise [winfo toplevel $_drop_target]]
      if {![catch {
        _selection_get -displayof $_drop_target -selection XdndSelection \
                      -type $type -time $time
                                              } result options]} {
        return [normalise_data $type $result]
      }
    }
  }
  return -options $options $result
};# xdnd::GetDroppedData

# ----------------------------------------------------------------------------
#  Command xdnd::platform_specific_types
# ----------------------------------------------------------------------------
proc xdnd::platform_specific_types { types } {
  ::tkdnd::generic::platform_specific_types $types
}; # xdnd::platform_specific_types

# ----------------------------------------------------------------------------
#  Command xdnd::platform_specific_type
# ----------------------------------------------------------------------------
proc xdnd::platform_specific_type { type } {
  ::tkdnd::generic::platform_specific_type $type
}; # xdnd::platform_specific_type

# ----------------------------------------------------------------------------
#  Command tkdnd::platform_independent_types
# ----------------------------------------------------------------------------
proc ::tkdnd::platform_independent_types { types } {
  ::tkdnd::generic::platform_independent_types $types
}; # tkdnd::platform_independent_types

# ----------------------------------------------------------------------------
#  Command xdnd::platform_independent_type
# ----------------------------------------------------------------------------
proc xdnd::platform_independent_type { type } {
  ::tkdnd::generic::platform_independent_type $type
}; # xdnd::platform_independent_type

# ----------------------------------------------------------------------------
#  Command xdnd::_normalise_data
# ----------------------------------------------------------------------------
proc xdnd::normalise_data { type data } {
  # Tk knows how to interpret the following types:
  #    STRING, TEXT, COMPOUND_TEXT
  #    UTF8_STRING
  # Else, it returns a list of 8 or 32 bit numbers...
  switch -glob $type {
    STRING - UTF8_STRING - TEXT - COMPOUND_TEXT {return $data}
    text/html {
      if {[catch {
            encoding convertfrom unicode $data
           } string]} {
        set string $data
      }
      return [string map {\r\n \n} $string]
    }
    text/html\;charset=utf-8  -
    text/plain\;charset=utf-8 -
    text/plain {
      if {[catch {
            encoding convertfrom utf-8 [tkdnd::bytes_to_string $data]
           } string]} {
        set string $data
      }
      return [string map {\r\n \n} $string]
    }
    text/uri-list* {
      if {[catch {
            encoding convertfrom utf-8 [tkdnd::bytes_to_string $data
          } string]} {
        set string $data
      }
      ## Get rid of \r\n
      set string [string trim [string map {\r\n \n} $string]]
      set files {}
      foreach quoted_file [split $string] {
        set file [tkdnd::urn_unquote $quoted_file]
        switch -glob $file {
          file://*  {lappend files [string range $file 7 end]}
          ftp://*   -
          https://* -
          http://*  {lappend files $quoted_file}
          default   {lappend files $file}
        }
      }
      return $files
    }
    application/x-color {
      return $data
    }
    text/x-moz-url -
    application/q-iconlist -
    default    {return $data}
  }
}; # xdnd::normalise_data

#############################################################################
##
##  XDND drag implementation
##
#############################################################################

# ----------------------------------------------------------------------------
#  Command xdnd::_selection_ownership_lost
# ----------------------------------------------------------------------------
proc xdnd::_selection_ownership_lost {} {
  variable _dragging
  set _dragging 0
};# _selection_ownership_lost

# ----------------------------------------------------------------------------
#  Command xdnd::_dodragdrop
# ----------------------------------------------------------------------------
proc xdnd::_dodragdrop { source actions types data button } {
  variable _dragging

  # puts "xdnd::_dodragdrop: source: $source, actions: $actions, types: $types,\
  #       data: \"$data\", button: $button"
  if {$_dragging} {
    ## We are in the middle of another drag operation...
    error "another drag operation in progress"
  }

  variable _dodragdrop_drag_source                $source
  variable _dodragdrop_drop_target                0
  variable _dodragdrop_drop_target_proxy          0
  variable _dodragdrop_actions                    $actions
  variable _dodragdrop_action_descriptions        $actions
  variable _dodragdrop_actions_len                [llength $actions]
  variable _dodragdrop_types                      $types
  variable _dodragdrop_types_len                  [llength $types]
  variable _dodragdrop_data                       $data
  variable _dodragdrop_transfer_data              {}
  variable _dodragdrop_button                     $button
  variable _dodragdrop_time                       0
  variable _dodragdrop_default_action             refuse_drop
  variable _dodragdrop_waiting_status             0
  variable _dodragdrop_drop_target_accepts_drop   0
  variable _dodragdrop_drop_target_accepts_action refuse_drop
  variable _dodragdrop_current_cursor             $_dodragdrop_default_action
  variable _dodragdrop_drop_occured               0
  variable _dodragdrop_selection_requestor        0

  ##
  ## If we have more than 3 types, the property XdndTypeList must be set on
  ## the drag source widget...
  ##
  if {$_dodragdrop_types_len > 3} {
    _announce_type_list $_dodragdrop_drag_source $_dodragdrop_types
  }

  ##
  ## Announce the actions & their descriptions on the XdndActionList &
  ## XdndActionDescription properties...
  ##
  _announce_action_list $_dodragdrop_drag_source $_dodragdrop_actions \
                        $_dodragdrop_action_descriptions

  ##
  ## Arrange selection handlers for our drag source, and all the supported types
  ##
  registerSelectionHandler $source $types

  ##
  ## Step 1: When a drag begins, the source takes ownership of XdndSelection.
  ##
  selection own -command ::tkdnd::xdnd::_selection_ownership_lost \
                -selection XdndSelection $source
  set _dragging 1

  ## Grab the mouse pointer...
  _grab_pointer $source $_dodragdrop_default_action

  ## Register our generic event handler...
  #  The generic event callback will report events by modifying variable
  #  ::xdnd::_dodragdrop_event: a dict with event information will be set as
  #  the value of the variable...
  _register_generic_event_handler

  ## Set a timeout for debugging purposes...
  #  after 60000 {set ::tkdnd::xdnd::_dragging 0}

  tkwait variable ::tkdnd::xdnd::_dragging
  _SendXdndLeave

  set _dragging 0
  _ungrab_pointer $source
  _unregister_generic_event_handler
  catch {selection clear -selection XdndSelection}
  unregisterSelectionHandler $source $types
  return $_dodragdrop_drop_target_accepts_action
};# xdnd::_dodragdrop

# ----------------------------------------------------------------------------
#  Command xdnd::_process_drag_events
# ----------------------------------------------------------------------------
proc xdnd::_process_drag_events {event} {
  # The return value from proc is normally 0. A non-zero return value indicates
  # that the event is not to be handled further; that is, proc has done all
  # processing that is to be allowed for the event
  variable _dragging
  if {!$_dragging} {return 0}
  # puts $event

  variable _dodragdrop_time
  set time [dict get $event time]
  set type [dict get $event type]
  if {$time < $_dodragdrop_time && ![string equal $type SelectionRequest]} {
    return 0
  }
  set _dodragdrop_time $time

  variable _dodragdrop_drag_source
  variable _dodragdrop_drop_target
  variable _dodragdrop_drop_target_proxy
  variable _dodragdrop_default_action
  switch $type {
    MotionNotify {
      set rootx  [dict get $event x_root]
      set rooty  [dict get $event y_root]
      set window [_find_drop_target_window $_dodragdrop_drag_source \
                                           $rootx $rooty]
      if {[string length $window]} {
        ## Examine the modifiers to suggest an action...
        set _dodragdrop_default_action [_default_action $event]
        ## Is it a Tk widget?
        # set path [winfo containing $rootx $rooty]
        # puts "Window under mouse: $window ($path)"
        if {$_dodragdrop_drop_target != $window} {
          ## Send XdndLeave to $_dodragdrop_drop_target
          _SendXdndLeave
          ## Is there a proxy? If not, _find_drop_target_proxy returns the
          ## target window, so we always get a valid "proxy".
          set proxy [_find_drop_target_proxy $_dodragdrop_drag_source $window]
          ## Send XdndEnter to $window
          _SendXdndEnter $window $proxy
          ## Send XdndPosition to $_dodragdrop_drop_target
          _SendXdndPosition $rootx $rooty $_dodragdrop_default_action
        } else {
          ## Send XdndPosition to $_dodragdrop_drop_target
          _SendXdndPosition $rootx $rooty $_dodragdrop_default_action
        }
      } else {
        ## No window under the mouse. Send XdndLeave to $_dodragdrop_drop_target
        _SendXdndLeave
      }
    }
    ButtonPress {
    }
    ButtonRelease {
      variable _dodragdrop_button
      set button [dict get $event button]
      if {$button == $_dodragdrop_button} {
        ## The button that initiated the drag was released. Trigger drop...
        _SendXdndDrop
      }
      return 1
    }
    KeyPress {
    }
    KeyRelease {
      set keysym [dict get $event keysym]
      switch $keysym {
        Escape {
          ## The user has pressed escape. Abort...
          if {$_dragging} {set _dragging 0}
        }
      }
    }
    SelectionRequest {
      variable _dodragdrop_selection_requestor
      variable _dodragdrop_selection_property
      variable _dodragdrop_selection_selection
      variable _dodragdrop_selection_target
      variable _dodragdrop_selection_time
      set _dodragdrop_selection_requestor [dict get $event requestor]
      set _dodragdrop_selection_property  [dict get $event property]
      set _dodragdrop_selection_selection [dict get $event selection]
      set _dodragdrop_selection_target    [dict get $event target]
      set _dodragdrop_selection_time      $time
      return 0
    }
    default {
      return 0
    }
  }
  return 0
};# _process_drag_events

# ----------------------------------------------------------------------------
#  Command xdnd::_SendXdndEnter
# ----------------------------------------------------------------------------
proc xdnd::_SendXdndEnter {window proxy} {
  variable _dodragdrop_drag_source
  variable _dodragdrop_drop_target
  variable _dodragdrop_drop_target_proxy
  variable _dodragdrop_types
  variable _dodragdrop_waiting_status
  variable _dodragdrop_drop_occured
  if {$_dodragdrop_drop_target > 0} _SendXdndLeave
  if {$_dodragdrop_drop_occured} return
  set _dodragdrop_drop_target       $window
  set _dodragdrop_drop_target_proxy $proxy
  set _dodragdrop_waiting_status    0
  if {$_dodragdrop_drop_target < 1} return
  # puts "XdndEnter: $_dodragdrop_drop_target $_dodragdrop_drop_target_proxy"
  _send_XdndEnter $_dodragdrop_drag_source $_dodragdrop_drop_target \
                  $_dodragdrop_drop_target_proxy $_dodragdrop_types
};# xdnd::_SendXdndEnter

# ----------------------------------------------------------------------------
#  Command xdnd::_SendXdndPosition
# ----------------------------------------------------------------------------
proc xdnd::_SendXdndPosition {rootx rooty action} {
  variable _dodragdrop_drag_source
  variable _dodragdrop_drop_target
  if {$_dodragdrop_drop_target < 1} return
  variable _dodragdrop_drop_occured
  if {$_dodragdrop_drop_occured} return
  variable _dodragdrop_drop_target_proxy
  variable _dodragdrop_waiting_status
  ## Arrange a new XdndPosition, to be send periodically...
  variable _dodragdrop_xdnd_position_heartbeat
  catch {after cancel $_dodragdrop_xdnd_position_heartbeat}
  set _dodragdrop_xdnd_position_heartbeat [after 200 \
    [list ::tkdnd::xdnd::_SendXdndPosition $rootx $rooty $action]]
  if {$_dodragdrop_waiting_status} {return}
  # puts "XdndPosition: $_dodragdrop_drop_target $rootx $rooty $action"
  _send_XdndPosition $_dodragdrop_drag_source $_dodragdrop_drop_target \
                     $_dodragdrop_drop_target_proxy $rootx $rooty $action
  set _dodragdrop_waiting_status 1
};# xdnd::_SendXdndPosition

# ----------------------------------------------------------------------------
#  Command xdnd::_HandleXdndStatus
# ----------------------------------------------------------------------------
proc xdnd::_HandleXdndStatus {event} {
  variable _dodragdrop_drop_target
  variable _dodragdrop_waiting_status

  variable _dodragdrop_drop_target_accepts_drop
  variable _dodragdrop_drop_target_accepts_action
  set _dodragdrop_waiting_status 0
  foreach key {target accept want_position action x y w h} {
    set $key [dict get $event $key]
  }
  set _dodragdrop_drop_target_accepts_drop   $accept
  set _dodragdrop_drop_target_accepts_action $action
  if {$_dodragdrop_drop_target < 1} return
  variable _dodragdrop_drop_occured
  if {$_dodragdrop_drop_occured} return
  _update_cursor
  # puts "XdndStatus: $event"
};# xdnd::_HandleXdndStatus

# ----------------------------------------------------------------------------
#  Command xdnd::_HandleXdndFinished
# ----------------------------------------------------------------------------
proc xdnd::_HandleXdndFinished {event} {
  variable _dodragdrop_xdnd_finished_event_after_id
  catch {after cancel $_dodragdrop_xdnd_finished_event_after_id}
  set _dodragdrop_xdnd_finished_event_after_id {}
  variable _dodragdrop_drop_target
  set _dodragdrop_drop_target 0
  variable _dragging
  if {$_dragging} {set _dragging 0}

  variable _dodragdrop_drop_target_accepts_drop
  variable _dodragdrop_drop_target_accepts_action
  if {[dict size $event]} {
    foreach key {target accept action} {
      set $key [dict get $event $key]
    }
    set _dodragdrop_drop_target_accepts_drop   $accept
    set _dodragdrop_drop_target_accepts_action $action
  } else {
    set _dodragdrop_drop_target_accepts_drop 0
  }
  if {!$_dodragdrop_drop_target_accepts_drop} {
    set _dodragdrop_drop_target_accepts_action refuse_drop
  }
  # puts "XdndFinished: $event"
};# xdnd::_HandleXdndFinished

# ----------------------------------------------------------------------------
#  Command xdnd::_SendXdndLeave
# ----------------------------------------------------------------------------
proc xdnd::_SendXdndLeave {} {
  variable _dodragdrop_drag_source
  variable _dodragdrop_drop_target
  if {$_dodragdrop_drop_target < 1} return
  variable _dodragdrop_drop_target_proxy
  # puts "XdndLeave: $_dodragdrop_drop_target"
  _send_XdndLeave $_dodragdrop_drag_source $_dodragdrop_drop_target \
                  $_dodragdrop_drop_target_proxy
  set _dodragdrop_drop_target 0
  variable _dodragdrop_drop_target_accepts_drop
  variable _dodragdrop_drop_target_accepts_action
  set _dodragdrop_drop_target_accepts_drop   0
  set _dodragdrop_drop_target_accepts_action refuse_drop
  variable _dodragdrop_drop_occured
  if {$_dodragdrop_drop_occured} return
  _update_cursor
};# xdnd::_SendXdndLeave

# ----------------------------------------------------------------------------
#  Command xdnd::_SendXdndDrop
# ----------------------------------------------------------------------------
proc xdnd::_SendXdndDrop {} {
  variable _dodragdrop_drag_source
  variable _dodragdrop_drop_target
  if {$_dodragdrop_drop_target < 1} {
    ## The mouse has been released over a widget that does not accept drops.
    _HandleXdndFinished {}
    return
  }
  variable _dodragdrop_drop_occured
  if {$_dodragdrop_drop_occured} {return}
  variable _dodragdrop_drop_target_proxy
  variable _dodragdrop_drop_target_accepts_drop
  variable _dodragdrop_drop_target_accepts_action

  set _dodragdrop_drop_occured 1
  _update_cursor clock

  if {!$_dodragdrop_drop_target_accepts_drop} {
    _SendXdndLeave
    _HandleXdndFinished {}
    return
  }
  # puts "XdndDrop: $_dodragdrop_drop_target"
  variable _dodragdrop_drop_timestamp
  set _dodragdrop_drop_timestamp [_send_XdndDrop \
                 $_dodragdrop_drag_source $_dodragdrop_drop_target \
                 $_dodragdrop_drop_target_proxy]
  set _dodragdrop_drop_target 0
  # puts "XdndDrop: $_dodragdrop_drop_target"
  ## Arrange a timeout for receiving XdndFinished...
  variable _dodragdrop_xdnd_finished_event_after_id
  set _dodragdrop_xdnd_finished_event_after_id \
    [after 10000 [list ::tkdnd::xdnd::_HandleXdndFinished {}]]
};# xdnd::_SendXdndDrop

# ----------------------------------------------------------------------------
#  Command xdnd::_update_cursor
# ----------------------------------------------------------------------------
proc xdnd::_update_cursor { {cursor {}}} {
  # puts "_update_cursor $cursor"
  variable _dodragdrop_current_cursor
  variable _dodragdrop_drag_source
  variable _dodragdrop_drop_target_accepts_drop
  variable _dodragdrop_drop_target_accepts_action

  if {![string length $cursor]} {
    set cursor refuse_drop
    if {$_dodragdrop_drop_target_accepts_drop} {
      set cursor $_dodragdrop_drop_target_accepts_action
    }
  }
  if {![string equal $cursor $_dodragdrop_current_cursor]} {
    _set_pointer_cursor $_dodragdrop_drag_source $cursor
    set _dodragdrop_current_cursor $cursor
  }
};# xdnd::_update_cursor

# ----------------------------------------------------------------------------
#  Command xdnd::_default_action
# ----------------------------------------------------------------------------
proc xdnd::_default_action {event} {
  variable _dodragdrop_actions
  variable _dodragdrop_actions_len
  if {$_dodragdrop_actions_len == 1} {return [lindex $_dodragdrop_actions 0]}

  set alt     [dict get $event Alt]
  set shift   [dict get $event Shift]
  set control [dict get $event Control]

  if {$shift && $control && [lsearch $_dodragdrop_actions link] != -1} {
    return link
  } elseif {$control && [lsearch $_dodragdrop_actions copy] != -1} {
    return copy
  } elseif {$shift && [lsearch $_dodragdrop_actions move] != -1} {
    return move
  } elseif {$alt && [lsearch $_dodragdrop_actions link] != -1} {
    return link
  }
  return default
};# xdnd::_default_action

# ----------------------------------------------------------------------------
#  Command xdnd::getFormatForType
# ----------------------------------------------------------------------------
proc xdnd::getFormatForType {type} {
  switch -glob [string tolower $type] {
    text/plain\;charset=utf-8 -
    text/html\;charset=utf-8  -
    utf8_string               {set format UTF8_STRING}
    text/html                 -
    text/plain                -
    string                    -
    text                      -
    compound_text             {set format STRING}
    text/uri-list*            {set format UTF8_STRING}
    application/x-color       {set format $type}
    default                   {set format $type}
  }
  return $format
};# xdnd::getFormatForType

# ----------------------------------------------------------------------------
#  Command xdnd::registerSelectionHandler
# ----------------------------------------------------------------------------
proc xdnd::registerSelectionHandler {source types} {
  foreach type $types {
    selection handle -selection XdndSelection \
                     -type $type \
                     -format [getFormatForType $type] \
                     $source [list ::tkdnd::xdnd::_SendData $type]
  }
};# xdnd::registerSelectionHandler

# ----------------------------------------------------------------------------
#  Command xdnd::unregisterSelectionHandler
# ----------------------------------------------------------------------------
proc xdnd::unregisterSelectionHandler {source types} {
  foreach type $types {
    catch {
      selection handle -selection XdndSelection \
                       -type $type \
                       -format [getFormatForType $type] \
                       $source {}
    }
  }
};# xdnd::unregisterSelectionHandler

# ----------------------------------------------------------------------------
#  Command xdnd::_convert_to_unsigned
# ----------------------------------------------------------------------------
proc xdnd::_convert_to_unsigned {data format} {
  switch $format {
    8  { set mask 0xff }
    16 { set mask 0xffff }
    32 { set mask 0xffffff }
    default {error "unsupported format $format"}
  }
  ## Convert signed integer into unsigned...
  set d [list]
  foreach num $data {
    lappend d [expr { $num & $mask }]
  }
  return $d
};# xdnd::_convert_to_unsigned

# ----------------------------------------------------------------------------
#  Command xdnd::_SendData
# ----------------------------------------------------------------------------
proc xdnd::_SendData {type offset bytes args} {
  variable _dodragdrop_drag_source
  variable _dodragdrop_types
  variable _dodragdrop_data
  variable _dodragdrop_transfer_data

  ## The variable _dodragdrop_data contains a list of data, one for each
  ## type in the _dodragdrop_types variable. We have to search types, and find
  ## the corresponding entry in the _dodragdrop_data list.
  set index [lsearch $_dodragdrop_types $type]
  if {$index < 0} {
    error "unable to locate data suitable for type \"$type\""
  }
  set typed_data [lindex $_dodragdrop_data $index]
  set format 8
  if {$offset == 0} {
    ## Prepare the data to be transfered...
    switch -glob $type {
      text/plain* - UTF8_STRING - STRING - TEXT - COMPOUND_TEXT {
        binary scan [encoding convertto utf-8 $typed_data] \
                    c* _dodragdrop_transfer_data
        set _dodragdrop_transfer_data \
           [_convert_to_unsigned $_dodragdrop_transfer_data $format]
      }
      text/uri-list* {
        set files [list]
        foreach file $typed_data {
          switch -glob $file {
            *://*     {lappend files $file}
            default   {lappend files file://$file}
          }
        }
        binary scan [encoding convertto utf-8 "[join $files \r\n]\r\n"] \
                    c* _dodragdrop_transfer_data
        set _dodragdrop_transfer_data \
           [_convert_to_unsigned $_dodragdrop_transfer_data $format]
      }
      application/x-color {
        set format 16
        ## Try to understand the provided data: we accept a standard Tk colour,
        ## or a list of 3 values (red green blue) or a list of 4 values
        ## (red green blue opacity).
        switch [llength $typed_data] {
          1 { set color [winfo rgb $_dodragdrop_drag_source $typed_data]
              lappend color 65535 }
          3 { set color $typed_data; lappend color 65535 }
          4 { set color $typed_data }
          default {error "unknown color data: \"$typed_data\""}
        }
        ## Convert the 4 elements into 16 bit values...
        set _dodragdrop_transfer_data [list]
        foreach c $color {
          lappend _dodragdrop_transfer_data [format 0x%04X $c]
        }
      }
      default {
        set format 32
        binary scan $typed_data c* _dodragdrop_transfer_data
      }
    }
  }

  ##
  ## Data has been split into bytes. Count the bytes requested, and return them
  ##
  set data [lrange $_dodragdrop_transfer_data $offset [expr {$offset+$bytes-1}]]
  switch $format {
    8  {
      set data [encoding convertfrom utf-8 [binary format c* $data]]
    }
    16 {
      variable _dodragdrop_selection_requestor
      if {$_dodragdrop_selection_requestor} {
        ## Tk selection cannot process this format (only 8 & 32 supported).
        ## Call our XChangeProperty...
        set numItems [llength $data]
        variable _dodragdrop_selection_property
        variable _dodragdrop_selection_selection
        variable _dodragdrop_selection_target
        variable _dodragdrop_selection_time
        XChangeProperty $_dodragdrop_drag_source \
                        $_dodragdrop_selection_requestor \
                        $_dodragdrop_selection_property \
                        $_dodragdrop_selection_target \
                        $format \
                        $_dodragdrop_selection_time \
                        $data $numItems
        return -code break
      }
    }
    32 {
    }
    default {
      error "unsupported format $format"
    }
  }
  # puts "SendData: $type $offset $bytes $args ($typed_data)"
  # puts "          $data"
  return $data
};# xdnd::_SendData
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<












































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted winlibs/tkdnd2.8/tkdnd_windows.tcl.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#
# tkdnd_windows.tcl --
#
#    This file implements some utility procedures that are used by the TkDND
#    package.
#
# This software is copyrighted by:
# George Petasis, National Centre for Scientific Research "Demokritos",
# Aghia Paraskevi, Athens, Greece.
# e-mail: petasis@iit.demokritos.gr
#
# The following terms apply to all files associated
# with the software unless explicitly disclaimed in individual files.
#
# The authors hereby grant permission to use, copy, modify, distribute,
# and license this software and its documentation for any purpose, provided
# that existing copyright notices are retained in all copies and that this
# notice is included verbatim in any distributions. No written agreement,
# license, or royalty fee is required for any of the authorized uses.
# Modifications to this software may be copyrighted by their authors
# and need not follow the licensing terms described here, provided that
# the new terms are clearly indicated on the first page of each file where
# they apply.
#
# 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.
#

namespace eval olednd {

  proc initialise { } {
    ## Mapping from platform types to TkDND types...
    ::tkdnd::generic::initialise_platform_to_tkdnd_types [list \
       CF_UNICODETEXT          DND_Text  \
       CF_TEXT                 DND_Text  \
       CF_HDROP                DND_Files \
       FileGroupDescriptor     DND_Files \
       FileGroupDescriptorW    DND_Files \
       CF_HTML                 DND_HTML  \
       {HTML Format}           DND_HTML  \
       CF_RTF                  DND_RTF   \
       CF_RTFTEXT              DND_RTF   \
       {Rich Text Format}      DND_RTF   \
    ]

    ## Mapping from TkDND types to platform types...
    ::tkdnd::generic::initialise_tkdnd_to_platform_types [list \
       DND_Text  {CF_UNICODETEXT CF_TEXT}               \
       DND_Files {CF_HDROP}                             \
       DND_HTML  {CF_HTML {HTML Format}}                \
       DND_RTF   {CF_RTF CF_RTFTEXT {Rich Text Format}} \
    ]
  };# initialise

};# namespace olednd

# ----------------------------------------------------------------------------
#  Command olednd::HandleDragEnter
# ----------------------------------------------------------------------------
proc olednd::HandleDragEnter { drop_target typelist actionlist pressedkeys
                               rootX rootY codelist } {
  focus $drop_target
  ::tkdnd::generic::HandleEnter $drop_target 0 $typelist \
                                $codelist $actionlist $pressedkeys
  set action [::tkdnd::generic::HandlePosition $drop_target {} \
                                               $pressedkeys $rootX $rootY]
  if {$::tkdnd::_auto_update} {update}
  return $action
};# olednd::HandleDragEnter

# ----------------------------------------------------------------------------
#  Command olednd::HandleDragOver
# ----------------------------------------------------------------------------
proc olednd::HandleDragOver { drop_target pressedkeys rootX rootY } {
  set action [::tkdnd::generic::HandlePosition $drop_target {} \
                                               $pressedkeys $rootX $rootY]
  if {$::tkdnd::_auto_update} {update}
  return $action
};# olednd::HandleDragOver

# ----------------------------------------------------------------------------
#  Command olednd::HandleDragLeave
# ----------------------------------------------------------------------------
proc olednd::HandleDragLeave { drop_target } {
  ::tkdnd::generic::HandleLeave
  if {$::tkdnd::_auto_update} {update}
};# olednd::HandleDragLeave

# ----------------------------------------------------------------------------
#  Command olednd::HandleXdndDrop
# ----------------------------------------------------------------------------
proc olednd::HandleDrop { drop_target pressedkeys rootX rootY type data } {
  ::tkdnd::generic::SetDroppedData [normalise_data $type $data]
  set action [::tkdnd::generic::HandleDrop $drop_target {} \
                                           $pressedkeys $rootX $rootY 0]
  if {$::tkdnd::_auto_update} {update}
  return $action
};# olednd::HandleXdndDrop

# ----------------------------------------------------------------------------
#  Command olednd::GetDragSourceCommonTypes
# ----------------------------------------------------------------------------
proc olednd::GetDragSourceCommonTypes { drop_target } {
  ::tkdnd::generic::GetDragSourceCommonTypes
};# olednd::GetDragSourceCommonTypes

# ----------------------------------------------------------------------------
#  Command olednd::platform_specific_types
# ----------------------------------------------------------------------------
proc olednd::platform_specific_types { types } {
  ::tkdnd::generic::platform_specific_types $types
}; # olednd::platform_specific_types

# ----------------------------------------------------------------------------
#  Command olednd::platform_specific_type
# ----------------------------------------------------------------------------
proc olednd::platform_specific_type { type } {
  ::tkdnd::generic::platform_specific_type $type
}; # olednd::platform_specific_type

# ----------------------------------------------------------------------------
#  Command tkdnd::platform_independent_types
# ----------------------------------------------------------------------------
proc ::tkdnd::platform_independent_types { types } {
  ::tkdnd::generic::platform_independent_types $types
}; # tkdnd::platform_independent_types

# ----------------------------------------------------------------------------
#  Command olednd::platform_independent_type
# ----------------------------------------------------------------------------
proc olednd::platform_independent_type { type } {
  ::tkdnd::generic::platform_independent_type $type
}; # olednd::platform_independent_type

# ----------------------------------------------------------------------------
#  Command olednd::normalise_data
# ----------------------------------------------------------------------------
proc olednd::normalise_data { type data } {
  switch [lindex [::tkdnd::generic::platform_independent_type $type] 0] {
    DND_Text   {return $data}
    DND_Files  {return $data}
    DND_HTML   {return [encoding convertfrom utf-8 $data]}
    default    {return $data}
  }
}; # olednd::normalise_data
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<