arcadia 0.12.2 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +25 -14
- data/conf/LC/en-UK.LANG +3 -1
- data/conf/arcadia.conf +10 -0
- data/conf/arcadia.res.rb +29 -1
- data/ext/ae-editor/ae-editor.rb +239 -48
- data/ext/ae-file-history/ae-file-history.conf +11 -1
- data/ext/ae-file-history/ae-file-history.rb +120 -2
- data/ext/ae-ruby-debug/ae-ruby-debug.rb +6 -5
- data/ext/ae-subprocess-inspector/ae-subprocess-inspector.rb +7 -3
- data/ext/ae-term/ae-term.rb +1 -1
- data/lib/a-commons.rb +72 -56
- data/lib/a-contracts.rb +23 -1
- data/lib/a-core.rb +136 -41
- data/lib/a-tkcommons.rb +127 -36
- data/tcl/fsdialog/fsdialog.tcl +2 -2
- data/tcl/ptwidgets-1.1.0/COPYRIGHT +10 -0
- data/tcl/ptwidgets-1.1.0/ChangeLog +194 -0
- data/tcl/ptwidgets-1.1.0/README +50 -0
- data/tcl/ptwidgets-1.1.0/common/stacktrace.tcl +29 -0
- data/tcl/ptwidgets-1.1.0/common/tokenframe.tcl +200 -0
- data/tcl/ptwidgets-1.1.0/doc/img/toggleswitch_off.png +0 -0
- data/tcl/ptwidgets-1.1.0/doc/img/toggleswitch_on.png +0 -0
- data/tcl/ptwidgets-1.1.0/doc/img/tokenentry.png +0 -0
- data/tcl/ptwidgets-1.1.0/doc/img/tokensearch_popup_example.png +0 -0
- data/tcl/ptwidgets-1.1.0/doc/img/tokensearch_popup_example2.png +0 -0
- data/tcl/ptwidgets-1.1.0/doc/img/wmarkentry.png +0 -0
- data/tcl/ptwidgets-1.1.0/doc/toggleswitch.html +402 -0
- data/tcl/ptwidgets-1.1.0/doc/tokenentry.html +1366 -0
- data/tcl/ptwidgets-1.1.0/doc/tokensearch.html +1549 -0
- data/tcl/ptwidgets-1.1.0/doc/wmarkentry.html +634 -0
- data/tcl/ptwidgets-1.1.0/library/toggleswitch.tcl +432 -0
- data/tcl/ptwidgets-1.1.0/library/tokenentry.tcl +2208 -0
- data/tcl/ptwidgets-1.1.0/library/tokensearch.tcl +2488 -0
- data/tcl/ptwidgets-1.1.0/library/wmarkentry.tcl +630 -0
- data/tcl/ptwidgets-1.1.0/pkgIndex.tcl +10 -0
- data/tcl/ptwidgets-1.1.0/test/Makefile +3 -0
- data/tcl/ptwidgets-1.1.0/test/run.tcl +3 -0
- data/tcl/ptwidgets-1.1.0/test/test.tcl +89 -0
- data/tcl/ptwidgets-1.1.0/test/toggleswitch.test +562 -0
- data/tcl/ptwidgets-1.1.0/test/tokenentry.test +1023 -0
- data/tcl/ptwidgets-1.1.0/test/tokensearch.test +1023 -0
- data/tcl/ptwidgets-1.1.0/test/wmarkentry.test +1325 -0
- data/tcl/themes/altTheme.tcl +101 -0
- data/tcl/themes/aquaTheme.tcl +59 -0
- data/tcl/themes/clamTheme.tcl +140 -0
- data/tcl/themes/classicTheme.tcl +108 -0
- data/tcl/themes/pkgIndex.tcl +3 -0
- data/tcl/themes/ttk.tcl +176 -0
- data/tcl/themes/vistaTheme.tcl +224 -0
- data/tcl/themes/winTheme.tcl +80 -0
- data/tcl/themes/xpTheme.tcl +65 -0
- data/tcl/tkfbox/folder.gif +0 -0
- data/tcl/tkfbox/textfile.gif +0 -0
- data/tcl/tkfbox/tkfbox.tcl +1 -0
- data/tcl/tkfbox/tkfbox.tcl~ +1 -0
- data/tcl/tkfbox/updir.xbm +1 -0
- metadata +43 -2
@@ -0,0 +1,630 @@
|
|
1
|
+
#===============================================================
|
2
|
+
# Main wmarkentry package module
|
3
|
+
#
|
4
|
+
# Copyright (c) 2011-2012 Trevor Williams (phase1geo@gmail.com)
|
5
|
+
#===============================================================
|
6
|
+
|
7
|
+
package provide wmarkentry 1.0
|
8
|
+
|
9
|
+
namespace eval wmarkentry {
|
10
|
+
|
11
|
+
array set options {}
|
12
|
+
array set state {}
|
13
|
+
array set textvar {}
|
14
|
+
|
15
|
+
array set entry_options {
|
16
|
+
-background 1
|
17
|
+
-bg 1
|
18
|
+
-borderwidth 1
|
19
|
+
-bd 1
|
20
|
+
-cursor 1
|
21
|
+
-disabledbackground 1
|
22
|
+
-disabledforeground 1
|
23
|
+
-exportselection 1
|
24
|
+
-font 1
|
25
|
+
-highlightbackground 1
|
26
|
+
-highlightcolor 1
|
27
|
+
-highlightthickness 1
|
28
|
+
-insertbackground 1
|
29
|
+
-insertborderwidth 1
|
30
|
+
-insertofftime 1
|
31
|
+
-insertontime 1
|
32
|
+
-insertwidth 1
|
33
|
+
-invalidcommand 1
|
34
|
+
-invcmd 1
|
35
|
+
-justify 1
|
36
|
+
-readonlybackground 1
|
37
|
+
-relief 1
|
38
|
+
-selectbackground 1
|
39
|
+
-selectborderwidth 1
|
40
|
+
-selectforeground 1
|
41
|
+
-show 1
|
42
|
+
-state 1
|
43
|
+
-takefocus 1
|
44
|
+
-validate 1
|
45
|
+
-validatecommand 1
|
46
|
+
-vcmd 1
|
47
|
+
-width 1
|
48
|
+
-xscrollcommand 1
|
49
|
+
}
|
50
|
+
|
51
|
+
array set widget_options {
|
52
|
+
-background {background Background}
|
53
|
+
-bg -background
|
54
|
+
-borderwidth {borderWidth BorderWidth}
|
55
|
+
-bd -borderwidth
|
56
|
+
-cursor {cursor Cursor}
|
57
|
+
-disabledbackground {disabledBackground DisabledBackground}
|
58
|
+
-disabledforeground {disabledForeground DisabledForeground}
|
59
|
+
-exportselection {exportSelection ExportSelection}
|
60
|
+
-font {font Font}
|
61
|
+
-foreground {foreground Foreground}
|
62
|
+
-fg -foreground
|
63
|
+
-highlightbackground {highlightBackground HighlightBackground}
|
64
|
+
-highlightcolor {highlightColor HighlightColor}
|
65
|
+
-highlightthickness {highlightThickness HighlightThickness}
|
66
|
+
-insertbackground {insertBackground InsertBackground}
|
67
|
+
-insertborderwidth {insertBorderWidth InsertBorderWidth}
|
68
|
+
-insertofftime {insertOffTime InsertOffTime}
|
69
|
+
-insertontime {insertOnTime InsertOnTime}
|
70
|
+
-insertwidth {insertWidth InsertWidth}
|
71
|
+
-invalidcommand {invalidCommand InvalidCommand}
|
72
|
+
-invcmd -invalidcommand
|
73
|
+
-justify {justify Justify}
|
74
|
+
-readonlybackground {readonlyBackground ReadonlyBackground}
|
75
|
+
-relief {relief Relief}
|
76
|
+
-selectbackground {selectBackground Background}
|
77
|
+
-selectborderwidth {selectBorderWidth BorderWidth}
|
78
|
+
-selectforeground {selectForeground Foreground}
|
79
|
+
-show {show Show}
|
80
|
+
-state {state State}
|
81
|
+
-takefocus {takeFocus TakeFocus}
|
82
|
+
-textvariable {textVariable Variable}
|
83
|
+
-validate {validate Validate}
|
84
|
+
-validatecommand {validateCommand ValidateCommand}
|
85
|
+
-vcmd -validatecommand
|
86
|
+
-watermark {watermark Watermark}
|
87
|
+
-watermarkforeground {watermarkForeground Foreground}
|
88
|
+
-width {width Width}
|
89
|
+
-xscrollcommand {xScrollCommand ScrollCommand}
|
90
|
+
}
|
91
|
+
|
92
|
+
###########################################################################
|
93
|
+
# Main procedure which creates the given window and initializes it.
|
94
|
+
proc wmarkentry {w args} {
|
95
|
+
|
96
|
+
variable options
|
97
|
+
variable widget_options
|
98
|
+
variable state
|
99
|
+
|
100
|
+
# Create the frame
|
101
|
+
frame $w -class WMarkEntry -relief flat -takefocus 0
|
102
|
+
|
103
|
+
# Initially, we pack the frame with a text widget
|
104
|
+
entry $w.e -highlightthickness 0 -relief flat -bg white -takefocus 1
|
105
|
+
|
106
|
+
# Pack the text widget
|
107
|
+
pack $w.e -side left -fill both -expand yes
|
108
|
+
|
109
|
+
# Initialize default options
|
110
|
+
if {[array size options] == 0} {
|
111
|
+
foreach opt [array names widget_options] {
|
112
|
+
if {![catch "$w.e configure $opt" rc]} {
|
113
|
+
if {[llength $widget_options($opt)] != 1} {
|
114
|
+
if {$opt eq "-background"} {
|
115
|
+
set default_value "white"
|
116
|
+
} elseif {$opt eq "-relief"} {
|
117
|
+
set default_value "flat"
|
118
|
+
} else {
|
119
|
+
set default_value [lindex $rc 4]
|
120
|
+
}
|
121
|
+
option add *WMarkEntry.[lindex $rc 1] $default_value
|
122
|
+
}
|
123
|
+
}
|
124
|
+
}
|
125
|
+
option add *WMarkEntry.watermark ""
|
126
|
+
option add *WMarkEntry.watermarkForeground "light gray"
|
127
|
+
}
|
128
|
+
|
129
|
+
# Initialize variables
|
130
|
+
set state($w) "empty"
|
131
|
+
|
132
|
+
# Initialize the options array
|
133
|
+
foreach opt [array names widget_options] {
|
134
|
+
if {[llength $widget_options($opt)] != 1} {
|
135
|
+
set options($w,$opt) [option get $w [lindex $widget_options($opt) 0] [lindex $widget_options($opt) 1]]
|
136
|
+
}
|
137
|
+
}
|
138
|
+
|
139
|
+
# Setup bindings
|
140
|
+
bind $w.e <Left> {
|
141
|
+
if {[wmarkentry::handle_text_movement [winfo parent %W]]} {
|
142
|
+
break
|
143
|
+
}
|
144
|
+
}
|
145
|
+
bind $w.e <Right> {
|
146
|
+
if {[wmarkentry::handle_text_movement [winfo parent %W]]} {
|
147
|
+
break
|
148
|
+
}
|
149
|
+
}
|
150
|
+
bind $w.e <Down> {
|
151
|
+
if {[wmarkentry::handle_text_movement [winfo parent %W]]} {
|
152
|
+
break
|
153
|
+
}
|
154
|
+
}
|
155
|
+
bind $w.e <Up> {
|
156
|
+
if {[wmarkentry::handle_text_movement [winfo parent %W]]} {
|
157
|
+
break
|
158
|
+
}
|
159
|
+
}
|
160
|
+
bind $w.e <Button-1> {
|
161
|
+
if {[wmarkentry::handle_text_movement [winfo parent %W]]} {
|
162
|
+
%W icursor 0
|
163
|
+
focus %W
|
164
|
+
break
|
165
|
+
}
|
166
|
+
}
|
167
|
+
bind $w.e <B1-Motion> {
|
168
|
+
if {[wmarkentry::handle_text_movement [winfo parent %W]]} {
|
169
|
+
break
|
170
|
+
}
|
171
|
+
}
|
172
|
+
bind $w.e <B1-Leave> {
|
173
|
+
if {[wmarkentry::handle_text_movement [winfo parent %W]]} {
|
174
|
+
break
|
175
|
+
}
|
176
|
+
}
|
177
|
+
bind $w.e <Control-k> {
|
178
|
+
if {$wmarkentry::state([winfo parent %W]) eq "empty"} {
|
179
|
+
break
|
180
|
+
} else {
|
181
|
+
wmarkentry::handle_state [winfo parent %W] 0
|
182
|
+
}
|
183
|
+
}
|
184
|
+
bind $w.e <Control-a> {
|
185
|
+
if {$wmarkentry::state([winfo parent %W]) eq "empty"} {
|
186
|
+
break
|
187
|
+
}
|
188
|
+
}
|
189
|
+
bind $w.e <Control-A> {
|
190
|
+
if {$wmarkentry::state([winfo parent %W]) eq "empty"} {
|
191
|
+
break
|
192
|
+
}
|
193
|
+
}
|
194
|
+
bind $w.e <End> {
|
195
|
+
if {$wmarkentry::state([winfo parent %W]) eq "empty"} {
|
196
|
+
break
|
197
|
+
}
|
198
|
+
}
|
199
|
+
bind $w.e <Control-e> {
|
200
|
+
if {$wmarkentry::state([winfo parent %W]) eq "empty"} {
|
201
|
+
break
|
202
|
+
}
|
203
|
+
}
|
204
|
+
bind $w.e <Control-E> {
|
205
|
+
if {$wmarkentry::state([winfo parent %W]) eq "empty"} {
|
206
|
+
break
|
207
|
+
}
|
208
|
+
}
|
209
|
+
bind $w.e <Any-KeyPress> "wmarkentry::keypress $w %A"
|
210
|
+
|
211
|
+
# Configure the widget
|
212
|
+
eval "configure 1 $w $args"
|
213
|
+
|
214
|
+
# Rename and alias the wmarkentry window
|
215
|
+
rename ::$w $w
|
216
|
+
interp alias {} ::$w {} wmarkentry::widget_cmd $w
|
217
|
+
|
218
|
+
return $w
|
219
|
+
|
220
|
+
}
|
221
|
+
|
222
|
+
###########################################################################
|
223
|
+
# This procedure is called whenever the user presses a key in the text box.
|
224
|
+
proc keypress {w c} {
|
225
|
+
|
226
|
+
# Update the current state
|
227
|
+
if {($c eq "") || ($c eq "\b") || ($c eq "\t") || ($c eq "\n") || ($c eq "\r")} {
|
228
|
+
handle_state $w 0
|
229
|
+
} else {
|
230
|
+
handle_state $w 1
|
231
|
+
}
|
232
|
+
|
233
|
+
}
|
234
|
+
|
235
|
+
###########################################################################
|
236
|
+
# Handles any sort of movement of the insertion cursor or selection within
|
237
|
+
# the entry widget.
|
238
|
+
proc handle_text_movement {w} {
|
239
|
+
|
240
|
+
variable state
|
241
|
+
|
242
|
+
# If we are empty, always set the insertion cursor to 1.0
|
243
|
+
if {$state($w) eq "empty"} {
|
244
|
+
$w.e icursor 0
|
245
|
+
$w.e selection clear
|
246
|
+
focus $w.e
|
247
|
+
return 1
|
248
|
+
}
|
249
|
+
|
250
|
+
return 0
|
251
|
+
|
252
|
+
}
|
253
|
+
|
254
|
+
###########################################################################
|
255
|
+
# Handles a Control-x binding on the given widget.
|
256
|
+
proc handle_cut {w} {
|
257
|
+
|
258
|
+
if {![$w.e selection present]} {
|
259
|
+
clipboard clear
|
260
|
+
clipboard append [$w.txt get]
|
261
|
+
$w.e delete 0 end
|
262
|
+
handle_state $w 1
|
263
|
+
} else {
|
264
|
+
clipboard clear
|
265
|
+
clipboard append [string range [$w.e get] [$w.e index sel.first] [$w.e index sel.last]]
|
266
|
+
$w.e delete sel.first sel.last
|
267
|
+
handle_state $w 1
|
268
|
+
}
|
269
|
+
|
270
|
+
}
|
271
|
+
|
272
|
+
###########################################################################
|
273
|
+
# Handles a Control-c binding on the given widget.
|
274
|
+
proc handle_copy {w} {
|
275
|
+
|
276
|
+
if {![$w.e selection present]} {
|
277
|
+
clipboard clear
|
278
|
+
clipboard append [$w.e get]
|
279
|
+
} else {
|
280
|
+
clipboard clear
|
281
|
+
clipboard append [string range [$w.e get] [$w.e index sel.first] [$w.e index sel.last]]
|
282
|
+
}
|
283
|
+
|
284
|
+
}
|
285
|
+
|
286
|
+
###########################################################################
|
287
|
+
# Handles a Control-v binding on the given widget.
|
288
|
+
proc handle_paste {w} {
|
289
|
+
|
290
|
+
# Handle the current state
|
291
|
+
handle_state $w 1
|
292
|
+
|
293
|
+
# Insert the clipboard text
|
294
|
+
$w.e insert insert [clipboard get]
|
295
|
+
|
296
|
+
}
|
297
|
+
|
298
|
+
###########################################################################
|
299
|
+
# Handles the current state of the widget (empty/non-empty) and handles
|
300
|
+
# any watermark display (or removal of the display).
|
301
|
+
proc handle_state {w keyed} {
|
302
|
+
|
303
|
+
variable state
|
304
|
+
variable options
|
305
|
+
|
306
|
+
# If we are in the empty state
|
307
|
+
if {$state($w) eq "empty"} {
|
308
|
+
|
309
|
+
$w.e delete 0 end
|
310
|
+
|
311
|
+
if {$keyed} {
|
312
|
+
set state($w) "non-empty"
|
313
|
+
$w.e configure -foreground $options($w,-foreground)
|
314
|
+
} else {
|
315
|
+
$w.e configure -foreground $options($w,-watermarkforeground)
|
316
|
+
$w.e insert end $options($w,-watermark)
|
317
|
+
$w.e icursor 0
|
318
|
+
}
|
319
|
+
|
320
|
+
# Otherwise, we are in the not-empty state
|
321
|
+
} elseif {$state($w) eq "non-empty"} {
|
322
|
+
|
323
|
+
# If the widget is empty, set the state to empty and fill it with the
|
324
|
+
# empty string.
|
325
|
+
after idle [list wmarkentry::handle_non_empty_state $w]
|
326
|
+
|
327
|
+
}
|
328
|
+
|
329
|
+
}
|
330
|
+
|
331
|
+
###########################################################################
|
332
|
+
# Handles the non-empty state of the widget.
|
333
|
+
proc handle_non_empty_state {w} {
|
334
|
+
|
335
|
+
variable state
|
336
|
+
variable options
|
337
|
+
|
338
|
+
if {[string trim [$w.e get]] eq ""} {
|
339
|
+
set state($w) "empty"
|
340
|
+
$w.e configure -foreground $options($w,-watermarkforeground)
|
341
|
+
$w.e insert end $options($w,-watermark)
|
342
|
+
$w.e icursor 0
|
343
|
+
}
|
344
|
+
|
345
|
+
}
|
346
|
+
|
347
|
+
###########################################################################
|
348
|
+
# Handles a specified textvariable read/write request.
|
349
|
+
proc handle_textvariable {w name1 name2 op} {
|
350
|
+
|
351
|
+
variable options
|
352
|
+
|
353
|
+
if {$options($w,-textvariable) eq $name1} {
|
354
|
+
upvar #0 $options($w,-textvariable) textvar
|
355
|
+
if {$op eq "write"} {
|
356
|
+
delete $w 0 end
|
357
|
+
insert $w end $textvar
|
358
|
+
} elseif {$op eq "read"} {
|
359
|
+
set textvar [get $w]
|
360
|
+
}
|
361
|
+
}
|
362
|
+
|
363
|
+
}
|
364
|
+
|
365
|
+
###########################################################################
|
366
|
+
# Handles all commands.
|
367
|
+
proc widget_cmd {w args} {
|
368
|
+
|
369
|
+
if {[llength $args] == 0} {
|
370
|
+
return -code error "wmarkentry widget called without a command"
|
371
|
+
}
|
372
|
+
|
373
|
+
set cmd [lindex $args 0]
|
374
|
+
set opts [lrange $args 1 end]
|
375
|
+
|
376
|
+
switch $cmd {
|
377
|
+
configure { return [eval "wmarkentry::configure 0 $w $opts"] }
|
378
|
+
cget { return [eval "wmarkentry::cget $w $opts"] }
|
379
|
+
insert { return [eval "wmarkentry::insert $w $opts"] }
|
380
|
+
delete { return [eval "wmarkentry::delete $w $opts"] }
|
381
|
+
get { return [eval "wmarkentry::get $w"] }
|
382
|
+
selection { return [eval "wmarkentry::selection $w $opts"] }
|
383
|
+
icursor { return [eval "wmarkentry::icursor $w $opts"] }
|
384
|
+
index { return [eval "wmarkentry::index $w $opts"] }
|
385
|
+
default { return [eval "$w.e $cmd $opts"] }
|
386
|
+
}
|
387
|
+
|
388
|
+
}
|
389
|
+
|
390
|
+
###########################################################################
|
391
|
+
# USER COMMANDS
|
392
|
+
###########################################################################
|
393
|
+
|
394
|
+
###########################################################################
|
395
|
+
# Main configuration routine.
|
396
|
+
proc configure {initialize w args} {
|
397
|
+
|
398
|
+
variable options
|
399
|
+
variable entry_options
|
400
|
+
variable widget_options
|
401
|
+
variable state
|
402
|
+
|
403
|
+
if {([llength $args] == 0) && !$initialize} {
|
404
|
+
|
405
|
+
set results [list]
|
406
|
+
|
407
|
+
foreach opt [lsort [array names widget_options]] {
|
408
|
+
if {[llength $widget_options($opt)] == 2} {
|
409
|
+
set opt_name [lindex $widget_options($opt) 0]
|
410
|
+
set opt_class [lindex $widget_options($opt) 1]
|
411
|
+
set opt_default [option get $w $opt_name $opt_class]
|
412
|
+
if {[info exists entry_options($opt)]} {
|
413
|
+
lappend results [list $opt $opt_name $opt_class $opt_default [$w.e cget $opt]]
|
414
|
+
} elseif {[info exists options($w,$opt)]} {
|
415
|
+
lappend results [list $opt $opt_name $opt_class $opt_default $options($w,$opt)]
|
416
|
+
} else {
|
417
|
+
lappend results [list $opt $opt_name $opt_class $opt_default ""]
|
418
|
+
}
|
419
|
+
}
|
420
|
+
}
|
421
|
+
|
422
|
+
return $results
|
423
|
+
|
424
|
+
} elseif {([llength $args] == 1) && !$initialize} {
|
425
|
+
|
426
|
+
set opt [lindex $args 0]
|
427
|
+
|
428
|
+
if {[info exists widget_options($opt)]} {
|
429
|
+
if {[llength $widget_options($opt)] == 1} {
|
430
|
+
set opt [lindex $widget_options($opt) 0]
|
431
|
+
}
|
432
|
+
set opt_name [lindex $widget_options($opt) 0]
|
433
|
+
set opt_class [lindex $widget_options($opt) 1]
|
434
|
+
set opt_default [option get $w $opt_name $opt_class]
|
435
|
+
if {[info exists entry_options($opt)]} {
|
436
|
+
return [list $opt $opt_name $opt_class $opt_default [$w.e cget $opt]]
|
437
|
+
} elseif {[info exists options($w,$opt)]} {
|
438
|
+
return [list $opt $opt_name $opt_class $opt_default $options($w,$opt)]
|
439
|
+
} else {
|
440
|
+
return [list $opt $opt_name $opt_class $opt_default ""]
|
441
|
+
}
|
442
|
+
}
|
443
|
+
|
444
|
+
return -code error "WMarkEntry configuration option [lindex $args 0] does not exist"
|
445
|
+
|
446
|
+
} else {
|
447
|
+
|
448
|
+
# Save the original contents
|
449
|
+
array set orig_options [array get options]
|
450
|
+
|
451
|
+
# Parse the arguments
|
452
|
+
foreach {name value} $args {
|
453
|
+
if {$name eq "-fg"} {
|
454
|
+
set name "-foreground"
|
455
|
+
}
|
456
|
+
if {[info exists entry_options($name)]} {
|
457
|
+
$w.e configure $name $value
|
458
|
+
} elseif {[info exists options($w,$name)]} {
|
459
|
+
set options($w,$name) $value
|
460
|
+
} else {
|
461
|
+
return -code error "Illegal option given to the wmarkentry configure command ($name)"
|
462
|
+
}
|
463
|
+
}
|
464
|
+
|
465
|
+
# Handle the textvariable option, if it was specified
|
466
|
+
if {$orig_options($w,-textvariable) ne $options($w,-textvariable)} {
|
467
|
+
catch "trace remove variable $orig_options($w,-textvariable) {write read} {wmarkentry::handle_textvariable $w}"
|
468
|
+
if {$options($w,-textvariable) ne ""} {
|
469
|
+
trace add variable $options($w,-textvariable) {write read} "wmarkentry::handle_textvariable $w"
|
470
|
+
handle_textvariable $w $options($w,-textvariable) "" write
|
471
|
+
}
|
472
|
+
}
|
473
|
+
|
474
|
+
# Make sure that the state is handled correctly
|
475
|
+
handle_state $w 0
|
476
|
+
|
477
|
+
}
|
478
|
+
|
479
|
+
}
|
480
|
+
|
481
|
+
###########################################################################
|
482
|
+
# Gets configuration option value(s).
|
483
|
+
proc cget {w args} {
|
484
|
+
|
485
|
+
variable options
|
486
|
+
variable entry_options
|
487
|
+
|
488
|
+
if {[llength $args] != 1} {
|
489
|
+
return -code error "Incorrect number of parameters given to the wmarkentry cget command"
|
490
|
+
}
|
491
|
+
|
492
|
+
if {[set name [lindex $args 0]] eq "-fg"} {
|
493
|
+
set name "-foreground"
|
494
|
+
}
|
495
|
+
|
496
|
+
if {[info exists entry_options($name)]} {
|
497
|
+
return [$w.e cget $name]
|
498
|
+
} elseif {[info exists options($w,$name)]} {
|
499
|
+
return $options($w,$name)
|
500
|
+
} else {
|
501
|
+
return -code error "Illegal option given to the wmarkentry cget command ([lindex $args 0])"
|
502
|
+
}
|
503
|
+
|
504
|
+
}
|
505
|
+
|
506
|
+
###########################################################################
|
507
|
+
# Wrapper around the entry insert command. Handles any needed changes to the
|
508
|
+
# watermark.
|
509
|
+
proc insert {w args} {
|
510
|
+
|
511
|
+
# If the user is inserted a non-empty string of data, make sure the state
|
512
|
+
# is handled properly.
|
513
|
+
if {[lindex $args 1] ne ""} {
|
514
|
+
handle_state $w 1
|
515
|
+
} else {
|
516
|
+
handle_state $w 0
|
517
|
+
}
|
518
|
+
|
519
|
+
return [eval "$w.e insert $args"]
|
520
|
+
|
521
|
+
}
|
522
|
+
|
523
|
+
###########################################################################
|
524
|
+
# Wrapper around the entry delete command. Handles any needed changes to the
|
525
|
+
# watermark.
|
526
|
+
proc delete {w args} {
|
527
|
+
|
528
|
+
# Perform the deletion command
|
529
|
+
set retval [eval "$w.e delete $args"]
|
530
|
+
|
531
|
+
# Handle any needed state changes
|
532
|
+
handle_state $w 1
|
533
|
+
|
534
|
+
}
|
535
|
+
|
536
|
+
###########################################################################
|
537
|
+
# Wrapper around the entry get command. Handles the case where the state is
|
538
|
+
# empty (returns empty string).
|
539
|
+
proc get {w} {
|
540
|
+
|
541
|
+
variable state
|
542
|
+
|
543
|
+
if {$state($w) eq "empty"} {
|
544
|
+
return ""
|
545
|
+
} else {
|
546
|
+
return [$w.e get]
|
547
|
+
}
|
548
|
+
|
549
|
+
}
|
550
|
+
|
551
|
+
###########################################################################
|
552
|
+
# Wrapper around the entry selection command. Handles any needed changes
|
553
|
+
# to the watermark.
|
554
|
+
proc selection {w args} {
|
555
|
+
|
556
|
+
variable state
|
557
|
+
|
558
|
+
switch [lindex $args 0] {
|
559
|
+
adjust {
|
560
|
+
if {$state($w) eq "empty"} {
|
561
|
+
return [$w.e selection adjust 0]
|
562
|
+
} else {
|
563
|
+
return [eval "$w.e selection $args"]
|
564
|
+
}
|
565
|
+
}
|
566
|
+
clear {
|
567
|
+
return [eval "$w.e selection $args"]
|
568
|
+
}
|
569
|
+
from {
|
570
|
+
if {$state($w) eq "empty"} {
|
571
|
+
return [$w.e selection from 0]
|
572
|
+
} else {
|
573
|
+
return [eval "$w.e selection $args"]
|
574
|
+
}
|
575
|
+
}
|
576
|
+
present {
|
577
|
+
if {$state($w) eq "empty"} {
|
578
|
+
return 0
|
579
|
+
} else {
|
580
|
+
return [eval "$w.e selection present"]
|
581
|
+
}
|
582
|
+
}
|
583
|
+
range {
|
584
|
+
if {$state($w) ne "empty"} {
|
585
|
+
eval "$w.e selection $args"
|
586
|
+
}
|
587
|
+
}
|
588
|
+
to {
|
589
|
+
if {$state($w) eq "empty"} {
|
590
|
+
return [$w.e selection to 0]
|
591
|
+
} else {
|
592
|
+
return [eval "$w.e selection $args"]
|
593
|
+
}
|
594
|
+
}
|
595
|
+
}
|
596
|
+
|
597
|
+
}
|
598
|
+
|
599
|
+
###########################################################################
|
600
|
+
# Wrapper around the entry icursor command. Handles any needed changes
|
601
|
+
# to the watermark.
|
602
|
+
proc icursor {w args} {
|
603
|
+
|
604
|
+
variable state
|
605
|
+
|
606
|
+
if {$state($w) eq "empty"} {
|
607
|
+
return [$w.e icursor 0]
|
608
|
+
} else {
|
609
|
+
return [eval "$w.e icursor $args"]
|
610
|
+
}
|
611
|
+
|
612
|
+
}
|
613
|
+
|
614
|
+
###########################################################################
|
615
|
+
# Wrapper around the entry index command.
|
616
|
+
proc index {w args} {
|
617
|
+
|
618
|
+
variable state
|
619
|
+
|
620
|
+
if {($state($w) eq "empty") && ([lindex $args 0] eq "end")} {
|
621
|
+
return 0
|
622
|
+
} else {
|
623
|
+
return [eval "$w.e index $args"]
|
624
|
+
}
|
625
|
+
|
626
|
+
}
|
627
|
+
|
628
|
+
namespace export *
|
629
|
+
|
630
|
+
}
|