arcadia 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +126 -123
- data/arcadia.rb +770 -756
- data/base/a-contracts.rb +130 -93
- data/base/a-ext.rb +280 -280
- data/base/a-libs.rb +5 -11
- data/base/a-utils.rb +235 -44
- data/conf/arcadia.conf +20 -16
- data/conf/arcadia.init.rb +0 -0
- data/conf/arcadia.res.rb +74 -0
- data/ext/ae-complete-code/ae-complete-code.conf +0 -0
- data/ext/ae-complete-code/ae-complete-code.rb +80 -79
- data/ext/ae-debug/ae-debug.conf +0 -0
- data/ext/ae-debug/ae-debug.rb +2 -6
- data/ext/ae-debug/debug1.57.rb +0 -0
- data/ext/ae-doc-code/ae-doc-code.conf +15 -0
- data/ext/ae-doc-code/ae-doc-code.rb +289 -0
- data/ext/ae-editor/ae-editor.conf +17 -8
- data/ext/ae-editor/ae-editor.rb +738 -396
- data/ext/ae-event-log/ae-event-log.conf +0 -0
- data/ext/ae-event-log/ae-event-log.rb +0 -0
- data/ext/ae-file-history/ae-file-history.conf +2 -2
- data/ext/ae-file-history/ae-file-history.rb +286 -290
- data/ext/ae-inspector/ae-inspector.conf +0 -0
- data/ext/ae-inspector/ae-inspector.rb +0 -0
- data/ext/ae-output-event/ae-output-event.conf +2 -2
- data/ext/ae-output/ae-output.conf +2 -2
- data/ext/ae-output/ae-output.rb +173 -178
- data/ext/ae-palette/ae-palette.conf +0 -0
- data/ext/ae-palette/ae-palette.rb +0 -0
- data/ext/ae-shell/ae-shell.conf +0 -0
- data/ext/ae-shell/ae-shell.rb +54 -54
- data/lib/tk/al-tk.rb +3076 -3082
- data/lib/tk/al-tk.res.rb +0 -0
- data/lib/tk/al-tkarcadia.rb +0 -0
- data/lib/tk/al-tkcustom.rb +0 -0
- data/lib/tkext/al-bwidget.rb +0 -0
- data/lib/tkext/al-iwidgets.rb +0 -0
- data/lib/tkext/al-tile.rb +0 -0
- data/lib/tkext/al-tktable.rb +0 -0
- data/tcl/BWidget-1.8.0/BWman/ArrowButton.html +276 -0
- data/tcl/BWidget-1.8.0/BWman/BWidget.html +228 -0
- data/tcl/BWidget-1.8.0/BWman/Button.html +273 -0
- data/tcl/BWidget-1.8.0/BWman/ButtonBox.html +264 -0
- data/tcl/BWidget-1.8.0/BWman/ComboBox.html +402 -0
- data/tcl/BWidget-1.8.0/BWman/Dialog.html +314 -0
- data/tcl/BWidget-1.8.0/BWman/DragSite.html +139 -0
- data/tcl/BWidget-1.8.0/BWman/DropSite.html +254 -0
- data/tcl/BWidget-1.8.0/BWman/DynamicHelp.html +248 -0
- data/tcl/BWidget-1.8.0/BWman/Entry.html +341 -0
- data/tcl/BWidget-1.8.0/BWman/Label.html +331 -0
- data/tcl/BWidget-1.8.0/BWman/LabelEntry.html +194 -0
- data/tcl/BWidget-1.8.0/BWman/LabelFrame.html +144 -0
- data/tcl/BWidget-1.8.0/BWman/ListBox.html +678 -0
- data/tcl/BWidget-1.8.0/BWman/MainFrame.html +283 -0
- data/tcl/BWidget-1.8.0/BWman/MessageDlg.html +218 -0
- data/tcl/BWidget-1.8.0/BWman/NoteBook.html +374 -0
- data/tcl/BWidget-1.8.0/BWman/PagesManager.html +180 -0
- data/tcl/BWidget-1.8.0/BWman/PanedWindow.html +142 -0
- data/tcl/BWidget-1.8.0/BWman/PanelFrame.html +153 -0
- data/tcl/BWidget-1.8.0/BWman/PasswdDlg.html +214 -0
- data/tcl/BWidget-1.8.0/BWman/ProgressBar.html +152 -0
- data/tcl/BWidget-1.8.0/BWman/ProgressDlg.html +145 -0
- data/tcl/BWidget-1.8.0/BWman/ScrollView.html +130 -0
- data/tcl/BWidget-1.8.0/BWman/ScrollableFrame.html +191 -0
- data/tcl/BWidget-1.8.0/BWman/ScrolledWindow.html +116 -0
- data/tcl/BWidget-1.8.0/BWman/SelectColor.html +164 -0
- data/tcl/BWidget-1.8.0/BWman/SelectFont.html +152 -0
- data/tcl/BWidget-1.8.0/BWman/Separator.html +77 -0
- data/tcl/BWidget-1.8.0/BWman/SpinBox.html +250 -0
- data/tcl/BWidget-1.8.0/BWman/StatusBar.html +147 -0
- data/tcl/BWidget-1.8.0/BWman/TitleFrame.html +107 -0
- data/tcl/BWidget-1.8.0/BWman/Tree.html +947 -0
- data/tcl/BWidget-1.8.0/BWman/Widget.html +502 -0
- data/tcl/BWidget-1.8.0/BWman/contents.html +84 -0
- data/tcl/BWidget-1.8.0/BWman/index.html +7 -0
- data/tcl/BWidget-1.8.0/BWman/navtree.html +41 -0
- data/tcl/BWidget-1.8.0/BWman/options.htm +458 -0
- data/tcl/BWidget-1.8.0/CHANGES.txt +266 -0
- data/tcl/BWidget-1.8.0/ChangeLog +1641 -0
- data/tcl/BWidget-1.8.0/LICENSE.txt +41 -0
- data/tcl/BWidget-1.8.0/README.txt +127 -0
- data/tcl/BWidget-1.8.0/arrow.tcl +551 -0
- data/tcl/BWidget-1.8.0/bitmap.tcl +94 -0
- data/tcl/BWidget-1.8.0/button.tcl +324 -0
- data/tcl/BWidget-1.8.0/buttonbox.tcl +403 -0
- data/tcl/BWidget-1.8.0/color.tcl +493 -0
- data/tcl/BWidget-1.8.0/combobox.tcl +809 -0
- data/tcl/BWidget-1.8.0/demo/basic.tcl +199 -0
- data/tcl/BWidget-1.8.0/demo/bwidget.xbm +46 -0
- data/tcl/BWidget-1.8.0/demo/demo.tcl +212 -0
- data/tcl/BWidget-1.8.0/demo/dnd.tcl +42 -0
- data/tcl/BWidget-1.8.0/demo/manager.tcl +141 -0
- data/tcl/BWidget-1.8.0/demo/select.tcl +59 -0
- data/tcl/BWidget-1.8.0/demo/tmpldlg.tcl +214 -0
- data/tcl/BWidget-1.8.0/demo/tree.tcl +260 -0
- data/tcl/BWidget-1.8.0/demo/x1.xbm +2258 -0
- data/tcl/BWidget-1.8.0/dialog.tcl +345 -0
- data/tcl/BWidget-1.8.0/dragsite.tcl +197 -0
- data/tcl/BWidget-1.8.0/dropsite.tcl +455 -0
- data/tcl/BWidget-1.8.0/dynhelp.tcl +625 -0
- data/tcl/BWidget-1.8.0/entry.tcl +469 -0
- data/tcl/BWidget-1.8.0/font.tcl +566 -0
- data/tcl/BWidget-1.8.0/images/bold.gif +0 -0
- data/tcl/BWidget-1.8.0/images/copy.gif +0 -0
- data/tcl/BWidget-1.8.0/images/cut.gif +0 -0
- data/tcl/BWidget-1.8.0/images/dragfile.gif +0 -0
- data/tcl/BWidget-1.8.0/images/dragicon.gif +0 -0
- data/tcl/BWidget-1.8.0/images/error.gif +0 -0
- data/tcl/BWidget-1.8.0/images/file.gif +0 -0
- data/tcl/BWidget-1.8.0/images/folder.gif +0 -0
- data/tcl/BWidget-1.8.0/images/hourglass.gif +0 -0
- data/tcl/BWidget-1.8.0/images/info.gif +0 -0
- data/tcl/BWidget-1.8.0/images/italic.gif +0 -0
- data/tcl/BWidget-1.8.0/images/minus.xbm +5 -0
- data/tcl/BWidget-1.8.0/images/new.gif +0 -0
- data/tcl/BWidget-1.8.0/images/opcopy.xbm +5 -0
- data/tcl/BWidget-1.8.0/images/open.gif +0 -0
- data/tcl/BWidget-1.8.0/images/openfold.gif +0 -0
- data/tcl/BWidget-1.8.0/images/oplink.xbm +5 -0
- data/tcl/BWidget-1.8.0/images/opmove.xbm +5 -0
- data/tcl/BWidget-1.8.0/images/overstrike.gif +0 -0
- data/tcl/BWidget-1.8.0/images/palette.gif +0 -0
- data/tcl/BWidget-1.8.0/images/passwd.gif +0 -0
- data/tcl/BWidget-1.8.0/images/paste.gif +0 -0
- data/tcl/BWidget-1.8.0/images/plus.xbm +5 -0
- data/tcl/BWidget-1.8.0/images/print.gif +0 -0
- data/tcl/BWidget-1.8.0/images/question.gif +0 -0
- data/tcl/BWidget-1.8.0/images/redo.gif +0 -0
- data/tcl/BWidget-1.8.0/images/save.gif +0 -0
- data/tcl/BWidget-1.8.0/images/target.xbm +9 -0
- data/tcl/BWidget-1.8.0/images/underline.gif +0 -0
- data/tcl/BWidget-1.8.0/images/undo.gif +0 -0
- data/tcl/BWidget-1.8.0/images/warning.gif +0 -0
- data/tcl/BWidget-1.8.0/init.tcl +40 -0
- data/tcl/BWidget-1.8.0/label.tcl +271 -0
- data/tcl/BWidget-1.8.0/labelentry.tcl +100 -0
- data/tcl/BWidget-1.8.0/labelframe.tcl +160 -0
- data/tcl/BWidget-1.8.0/lang/da.rc +52 -0
- data/tcl/BWidget-1.8.0/lang/de.rc +52 -0
- data/tcl/BWidget-1.8.0/lang/en.rc +52 -0
- data/tcl/BWidget-1.8.0/lang/es.rc +53 -0
- data/tcl/BWidget-1.8.0/lang/fr.rc +52 -0
- data/tcl/BWidget-1.8.0/listbox.tcl +1638 -0
- data/tcl/BWidget-1.8.0/mainframe.tcl +711 -0
- data/tcl/BWidget-1.8.0/messagedlg.tcl +128 -0
- data/tcl/BWidget-1.8.0/notebook.tcl +1164 -0
- data/tcl/BWidget-1.8.0/pagesmgr.tcl +294 -0
- data/tcl/BWidget-1.8.0/panedw.tcl +381 -0
- data/tcl/BWidget-1.8.0/panelframe.tcl +246 -0
- data/tcl/BWidget-1.8.0/passwddlg.tcl +178 -0
- data/tcl/BWidget-1.8.0/pkgIndex.tcl +47 -0
- data/tcl/BWidget-1.8.0/progressbar.tcl +208 -0
- data/tcl/BWidget-1.8.0/progressdlg.tcl +87 -0
- data/tcl/BWidget-1.8.0/scrollframe.tcl +226 -0
- data/tcl/BWidget-1.8.0/scrollview.tcl +254 -0
- data/tcl/BWidget-1.8.0/scrollw.tcl +280 -0
- data/tcl/BWidget-1.8.0/separator.tcl +75 -0
- data/tcl/BWidget-1.8.0/spinbox.tcl +331 -0
- data/tcl/BWidget-1.8.0/statusbar.tcl +422 -0
- data/tcl/BWidget-1.8.0/tests/entry.test +173 -0
- data/tcl/BWidget-1.8.0/titleframe.tcl +170 -0
- data/tcl/BWidget-1.8.0/tree.tcl +2228 -0
- data/tcl/BWidget-1.8.0/utils.tcl +645 -0
- data/tcl/BWidget-1.8.0/widget.tcl +1576 -0
- data/tcl/BWidget-1.8.0/wizard.tcl +1028 -0
- data/tcl/BWidget-1.8.0/xpm2image.tcl +115 -0
- metadata +141 -5
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# ------------------------------------------------------------------------------
|
|
2
|
+
# separator.tcl
|
|
3
|
+
# This file is part of Unifix BWidget Toolkit
|
|
4
|
+
# ------------------------------------------------------------------------------
|
|
5
|
+
# Index of commands:
|
|
6
|
+
# - Separator::create
|
|
7
|
+
# - Separator::configure
|
|
8
|
+
# - Separator::cget
|
|
9
|
+
# ------------------------------------------------------------------------------
|
|
10
|
+
|
|
11
|
+
namespace eval Separator {
|
|
12
|
+
Widget::define Separator separator
|
|
13
|
+
|
|
14
|
+
Widget::declare Separator {
|
|
15
|
+
{-background TkResource "" 0 frame}
|
|
16
|
+
{-cursor TkResource "" 0 frame}
|
|
17
|
+
{-relief Enum groove 0 {ridge groove}}
|
|
18
|
+
{-orient Enum horizontal 1 {horizontal vertical}}
|
|
19
|
+
{-bg Synonym -background}
|
|
20
|
+
}
|
|
21
|
+
Widget::addmap Separator "" :cmd { -background {} -cursor {} }
|
|
22
|
+
|
|
23
|
+
bind Separator <Destroy> [list Widget::destroy %W]
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
# ------------------------------------------------------------------------------
|
|
28
|
+
# Command Separator::create
|
|
29
|
+
# ------------------------------------------------------------------------------
|
|
30
|
+
proc Separator::create { path args } {
|
|
31
|
+
array set maps [list Separator {} :cmd {}]
|
|
32
|
+
array set maps [Widget::parseArgs Separator $args]
|
|
33
|
+
eval [list frame $path] $maps(:cmd) -class Separator
|
|
34
|
+
Widget::initFromODB Separator $path $maps(Separator)
|
|
35
|
+
|
|
36
|
+
if { [Widget::cget $path -orient] == "horizontal" } {
|
|
37
|
+
$path configure -borderwidth 1 -height 2
|
|
38
|
+
} else {
|
|
39
|
+
$path configure -borderwidth 1 -width 2
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if { [string equal [Widget::cget $path -relief] "groove"] } {
|
|
43
|
+
$path configure -relief sunken
|
|
44
|
+
} else {
|
|
45
|
+
$path configure -relief raised
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return [Widget::create Separator $path]
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
# ------------------------------------------------------------------------------
|
|
53
|
+
# Command Separator::configure
|
|
54
|
+
# ------------------------------------------------------------------------------
|
|
55
|
+
proc Separator::configure { path args } {
|
|
56
|
+
set res [Widget::configure $path $args]
|
|
57
|
+
|
|
58
|
+
if { [Widget::hasChanged $path -relief relief] } {
|
|
59
|
+
if { $relief == "groove" } {
|
|
60
|
+
$path:cmd configure -relief sunken
|
|
61
|
+
} else {
|
|
62
|
+
$path:cmd configure -relief raised
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return $res
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
# ------------------------------------------------------------------------------
|
|
71
|
+
# Command Separator::cget
|
|
72
|
+
# ------------------------------------------------------------------------------
|
|
73
|
+
proc Separator::cget { path option } {
|
|
74
|
+
return [Widget::cget $path $option]
|
|
75
|
+
}
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
# spinbox.tcl --
|
|
2
|
+
#
|
|
3
|
+
# BWidget SpinBox implementation.
|
|
4
|
+
#
|
|
5
|
+
# Copyright (c) 1999 by Unifix
|
|
6
|
+
# Copyright (c) 2000 by Ajuba Solutions
|
|
7
|
+
# All rights reserved.
|
|
8
|
+
#
|
|
9
|
+
# RCS: @(#) $Id: spinbox.tcl,v 1.12 2003/10/20 21:23:52 damonc Exp $
|
|
10
|
+
# -----------------------------------------------------------------------------
|
|
11
|
+
# Index of commands:
|
|
12
|
+
# - SpinBox::create
|
|
13
|
+
# - SpinBox::configure
|
|
14
|
+
# - SpinBox::cget
|
|
15
|
+
# - SpinBox::setvalue
|
|
16
|
+
# - SpinBox::_destroy
|
|
17
|
+
# - SpinBox::_modify_value
|
|
18
|
+
# - SpinBox::_test_options
|
|
19
|
+
# -----------------------------------------------------------------------------
|
|
20
|
+
|
|
21
|
+
namespace eval SpinBox {
|
|
22
|
+
Widget::define SpinBox spinbox Entry ArrowButton
|
|
23
|
+
|
|
24
|
+
Widget::tkinclude SpinBox frame :cmd \
|
|
25
|
+
include {-background -borderwidth -bg -bd -relief} \
|
|
26
|
+
initialize {-relief sunken -borderwidth 2}
|
|
27
|
+
|
|
28
|
+
Widget::bwinclude SpinBox Entry .e \
|
|
29
|
+
remove {-relief -bd -borderwidth -fg -bg} \
|
|
30
|
+
rename {-foreground -entryfg -background -entrybg}
|
|
31
|
+
|
|
32
|
+
Widget::declare SpinBox {
|
|
33
|
+
{-range String "" 0}
|
|
34
|
+
{-values String "" 0}
|
|
35
|
+
{-modifycmd String "" 0}
|
|
36
|
+
{-repeatdelay Int 400 0 {%d >= 0}}
|
|
37
|
+
{-repeatinterval Int 100 0 {%d >= 0}}
|
|
38
|
+
{-foreground TkResource black 0 {button}}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
Widget::addmap SpinBox "" :cmd {-background {}}
|
|
42
|
+
Widget::addmap SpinBox ArrowButton .arrup {
|
|
43
|
+
-foreground {} -background {} -disabledforeground {} -state {} \
|
|
44
|
+
-repeatinterval {} -repeatdelay {}
|
|
45
|
+
}
|
|
46
|
+
Widget::addmap SpinBox ArrowButton .arrdn {
|
|
47
|
+
-foreground {} -background {} -disabledforeground {} -state {} \
|
|
48
|
+
-repeatinterval {} -repeatdelay {}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
::bind SpinBox <FocusIn> [list after idle {BWidget::refocus %W %W.e}]
|
|
52
|
+
::bind SpinBox <Destroy> [list SpinBox::_destroy %W]
|
|
53
|
+
|
|
54
|
+
variable _widget
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
# -----------------------------------------------------------------------------
|
|
59
|
+
# Command SpinBox::create
|
|
60
|
+
# -----------------------------------------------------------------------------
|
|
61
|
+
proc SpinBox::create { path args } {
|
|
62
|
+
array set maps [list SpinBox {} :cmd {} .e {} .arrup {} .arrdn {}]
|
|
63
|
+
array set maps [Widget::parseArgs SpinBox $args]
|
|
64
|
+
eval [list frame $path] $maps(:cmd) \
|
|
65
|
+
[list -highlightthickness 0 -takefocus 0 -class SpinBox]
|
|
66
|
+
Widget::initFromODB SpinBox $path $maps(SpinBox)
|
|
67
|
+
|
|
68
|
+
set entry [eval [list Entry::create $path.e] $maps(.e) -relief flat -bd 0]
|
|
69
|
+
bindtags $path.e [linsert [bindtags $path.e] 1 SpinBoxEntry]
|
|
70
|
+
|
|
71
|
+
set farr [frame $path.farr -relief flat -bd 0 -highlightthickness 0]
|
|
72
|
+
set height [expr {[winfo reqheight $path.e]/2-2}]
|
|
73
|
+
set width 11
|
|
74
|
+
set arrup [eval [list ArrowButton::create $path.arrup -dir top] \
|
|
75
|
+
$maps(.arrup) \
|
|
76
|
+
[list -highlightthickness 0 -borderwidth 1 -takefocus 0 \
|
|
77
|
+
-type button -width $width -height $height \
|
|
78
|
+
-armcommand [list SpinBox::_modify_value $path next arm] \
|
|
79
|
+
-disarmcommand [list SpinBox::_modify_value $path next disarm]]]
|
|
80
|
+
set arrdn [eval [list ArrowButton::create $path.arrdn -dir bottom] \
|
|
81
|
+
$maps(.arrdn) \
|
|
82
|
+
[list -highlightthickness 0 -borderwidth 1 -takefocus 0 \
|
|
83
|
+
-type button -width $width -height $height \
|
|
84
|
+
-armcommand [list SpinBox::_modify_value $path previous arm] \
|
|
85
|
+
-disarmcommand [list SpinBox::_modify_value $path previous disarm]]]
|
|
86
|
+
|
|
87
|
+
# --- update SpinBox value ---
|
|
88
|
+
_test_options $path
|
|
89
|
+
set val [Entry::cget $path.e -text]
|
|
90
|
+
if { [string equal $val ""] } {
|
|
91
|
+
Entry::configure $path.e -text $::SpinBox::_widget($path,curval)
|
|
92
|
+
} else {
|
|
93
|
+
set ::SpinBox::_widget($path,curval) $val
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
grid $arrup -in $farr -column 0 -row 0 -sticky nsew
|
|
97
|
+
grid $arrdn -in $farr -column 0 -row 2 -sticky nsew
|
|
98
|
+
grid rowconfigure $farr 0 -weight 1
|
|
99
|
+
grid rowconfigure $farr 2 -weight 1
|
|
100
|
+
|
|
101
|
+
pack $farr -side right -fill y
|
|
102
|
+
pack $entry -side left -fill both -expand yes
|
|
103
|
+
|
|
104
|
+
::bind $entry <Key-Up> [list SpinBox::_modify_value $path next activate]
|
|
105
|
+
::bind $entry <Key-Down> [list SpinBox::_modify_value $path previous activate]
|
|
106
|
+
::bind $entry <Key-Prior> [list SpinBox::_modify_value $path last activate]
|
|
107
|
+
::bind $entry <Key-Next> [list SpinBox::_modify_value $path first activate]
|
|
108
|
+
|
|
109
|
+
::bind $farr <Configure> {grid rowconfigure %W 1 -minsize [expr {%h%%2}]}
|
|
110
|
+
|
|
111
|
+
return [Widget::create SpinBox $path]
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
# -----------------------------------------------------------------------------
|
|
115
|
+
# Command SpinBox::configure
|
|
116
|
+
# -----------------------------------------------------------------------------
|
|
117
|
+
proc SpinBox::configure { path args } {
|
|
118
|
+
set res [Widget::configure $path $args]
|
|
119
|
+
if { [Widget::hasChangedX $path -values] ||
|
|
120
|
+
[Widget::hasChangedX $path -range] } {
|
|
121
|
+
_test_options $path
|
|
122
|
+
}
|
|
123
|
+
return $res
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
# -----------------------------------------------------------------------------
|
|
128
|
+
# Command SpinBox::cget
|
|
129
|
+
# -----------------------------------------------------------------------------
|
|
130
|
+
proc SpinBox::cget { path option } {
|
|
131
|
+
return [Widget::cget $path $option]
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
# -----------------------------------------------------------------------------
|
|
136
|
+
# Command SpinBox::setvalue
|
|
137
|
+
# -----------------------------------------------------------------------------
|
|
138
|
+
proc SpinBox::setvalue { path index } {
|
|
139
|
+
variable _widget
|
|
140
|
+
|
|
141
|
+
set values [Widget::getMegawidgetOption $path -values]
|
|
142
|
+
set value [Entry::cget $path.e -text]
|
|
143
|
+
|
|
144
|
+
if { [llength $values] } {
|
|
145
|
+
# --- -values SpinBox ---
|
|
146
|
+
switch -- $index {
|
|
147
|
+
next {
|
|
148
|
+
if { [set idx [lsearch $values $value]] != -1 } {
|
|
149
|
+
incr idx
|
|
150
|
+
} elseif { [set idx [lsearch $values "$value*"]] == -1 } {
|
|
151
|
+
set idx [lsearch $values $_widget($path,curval)]
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
previous {
|
|
155
|
+
if { [set idx [lsearch $values $value]] != -1 } {
|
|
156
|
+
incr idx -1
|
|
157
|
+
} elseif { [set idx [lsearch $values "$value*"]] == -1 } {
|
|
158
|
+
set idx [lsearch $values $_widget($path,curval)]
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
first {
|
|
162
|
+
set idx 0
|
|
163
|
+
}
|
|
164
|
+
last {
|
|
165
|
+
set idx [expr {[llength $values]-1}]
|
|
166
|
+
}
|
|
167
|
+
default {
|
|
168
|
+
if { [string index $index 0] == "@" } {
|
|
169
|
+
set idx [string range $index 1 end]
|
|
170
|
+
if { [catch {string compare [expr {int($idx)}] $idx} res] || $res != 0 } {
|
|
171
|
+
return -code error "bad index \"$index\""
|
|
172
|
+
}
|
|
173
|
+
} else {
|
|
174
|
+
return -code error "bad index \"$index\""
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if { $idx >= 0 && $idx < [llength $values] } {
|
|
179
|
+
set newval [lindex $values $idx]
|
|
180
|
+
} else {
|
|
181
|
+
return 0
|
|
182
|
+
}
|
|
183
|
+
} else {
|
|
184
|
+
# --- -range SpinBox ---
|
|
185
|
+
foreach {vmin vmax incr} [Widget::getMegawidgetOption $path -range] {
|
|
186
|
+
break
|
|
187
|
+
}
|
|
188
|
+
# Allow zero padding on the value; strip it out for calculation by
|
|
189
|
+
# scanning the value into a floating point number.
|
|
190
|
+
scan $value %f value
|
|
191
|
+
switch -- $index {
|
|
192
|
+
next {
|
|
193
|
+
if { [catch {expr {double($value-$vmin)/$incr}} idx] } {
|
|
194
|
+
set newval $_widget($path,curval)
|
|
195
|
+
} else {
|
|
196
|
+
set newval [expr {$vmin+(round($idx)+1)*$incr}]
|
|
197
|
+
if { $newval < $vmin } {
|
|
198
|
+
set newval $vmin
|
|
199
|
+
} elseif { $newval > $vmax } {
|
|
200
|
+
set newval $vmax
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
previous {
|
|
205
|
+
if { [catch {expr {double($value-$vmin)/$incr}} idx] } {
|
|
206
|
+
set newval $_widget($path,curval)
|
|
207
|
+
} else {
|
|
208
|
+
set newval [expr {$vmin+(round($idx)-1)*$incr}]
|
|
209
|
+
if { $newval < $vmin } {
|
|
210
|
+
set newval $vmin
|
|
211
|
+
} elseif { $newval > $vmax } {
|
|
212
|
+
set newval $vmax
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
first {
|
|
217
|
+
set newval $vmin
|
|
218
|
+
}
|
|
219
|
+
last {
|
|
220
|
+
set newval $vmax
|
|
221
|
+
}
|
|
222
|
+
default {
|
|
223
|
+
if { [string index $index 0] == "@" } {
|
|
224
|
+
set idx [string range $index 1 end]
|
|
225
|
+
if { [catch {string compare [expr {int($idx)}] $idx} res] || $res != 0 } {
|
|
226
|
+
return -code error "bad index \"$index\""
|
|
227
|
+
}
|
|
228
|
+
set newval [expr {$vmin+int($idx)*$incr}]
|
|
229
|
+
if { $newval < $vmin || $newval > $vmax } {
|
|
230
|
+
return 0
|
|
231
|
+
}
|
|
232
|
+
} else {
|
|
233
|
+
return -code error "bad index \"$index\""
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
set _widget($path,curval) $newval
|
|
239
|
+
Entry::configure $path.e -text $newval
|
|
240
|
+
return 1
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
# -----------------------------------------------------------------------------
|
|
245
|
+
# Command SpinBox::getvalue
|
|
246
|
+
# -----------------------------------------------------------------------------
|
|
247
|
+
proc SpinBox::getvalue { path } {
|
|
248
|
+
variable _widget
|
|
249
|
+
|
|
250
|
+
set values [Widget::getMegawidgetOption $path -values]
|
|
251
|
+
set value [Entry::cget $path.e -text]
|
|
252
|
+
|
|
253
|
+
if { [llength $values] } {
|
|
254
|
+
# --- -values SpinBox ---
|
|
255
|
+
return [lsearch $values $value]
|
|
256
|
+
} else {
|
|
257
|
+
foreach {vmin vmax incr} [Widget::getMegawidgetOption $path -range] {
|
|
258
|
+
break
|
|
259
|
+
}
|
|
260
|
+
if { ![catch {expr {double($value-$vmin)/$incr}} idx] &&
|
|
261
|
+
$idx == int($idx) } {
|
|
262
|
+
return [expr {int($idx)}]
|
|
263
|
+
}
|
|
264
|
+
return -1
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
# -----------------------------------------------------------------------------
|
|
270
|
+
# Command SpinBox::bind
|
|
271
|
+
# -----------------------------------------------------------------------------
|
|
272
|
+
proc SpinBox::bind { path args } {
|
|
273
|
+
return [eval [list ::bind $path.e] $args]
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
# -----------------------------------------------------------------------------
|
|
278
|
+
# Command SpinBox::_modify_value
|
|
279
|
+
# -----------------------------------------------------------------------------
|
|
280
|
+
proc SpinBox::_modify_value { path direction reason } {
|
|
281
|
+
if { $reason == "arm" || $reason == "activate" } {
|
|
282
|
+
SpinBox::setvalue $path $direction
|
|
283
|
+
}
|
|
284
|
+
if { ($reason == "disarm" || $reason == "activate") &&
|
|
285
|
+
[set cmd [Widget::getMegawidgetOption $path -modifycmd]] != "" } {
|
|
286
|
+
uplevel \#0 $cmd
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
# -----------------------------------------------------------------------------
|
|
291
|
+
# Command SpinBox::_test_options
|
|
292
|
+
# -----------------------------------------------------------------------------
|
|
293
|
+
proc SpinBox::_test_options { path } {
|
|
294
|
+
set values [Widget::getMegawidgetOption $path -values]
|
|
295
|
+
if { [llength $values] } {
|
|
296
|
+
set ::SpinBox::_widget($path,curval) [lindex $values 0]
|
|
297
|
+
} else {
|
|
298
|
+
foreach {vmin vmax incr} [Widget::getMegawidgetOption $path -range] {
|
|
299
|
+
break
|
|
300
|
+
}
|
|
301
|
+
set update 0
|
|
302
|
+
if { [catch {expr {int($vmin)}}] } {
|
|
303
|
+
set vmin 0
|
|
304
|
+
set update 1
|
|
305
|
+
}
|
|
306
|
+
if { [catch {expr {$vmax<$vmin}} res] || $res } {
|
|
307
|
+
set vmax $vmin
|
|
308
|
+
set update 1
|
|
309
|
+
}
|
|
310
|
+
if { [catch {expr {$incr<0}} res] || $res } {
|
|
311
|
+
set incr 1
|
|
312
|
+
set update 1
|
|
313
|
+
}
|
|
314
|
+
# Only do the set back (which is expensive) if we changed a value
|
|
315
|
+
if { $update } {
|
|
316
|
+
Widget::setMegawidgetOption $path -range [list $vmin $vmax $incr]
|
|
317
|
+
}
|
|
318
|
+
set ::SpinBox::_widget($path,curval) $vmin
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
# -----------------------------------------------------------------------------
|
|
324
|
+
# Command SpinBox::_destroy
|
|
325
|
+
# -----------------------------------------------------------------------------
|
|
326
|
+
proc SpinBox::_destroy { path } {
|
|
327
|
+
variable _widget
|
|
328
|
+
|
|
329
|
+
unset _widget($path,curval)
|
|
330
|
+
Widget::destroy $path
|
|
331
|
+
}
|
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
# ------------------------------------------------------------------------
|
|
2
|
+
# statusbar.tcl
|
|
3
|
+
# Create a status bar Tk widget
|
|
4
|
+
#
|
|
5
|
+
# Provides a status bar to be placed at the bottom of a toplevel.
|
|
6
|
+
# Currently does not support being placed in a toplevel that has
|
|
7
|
+
# gridding applied (via widget -setgrid or wm grid).
|
|
8
|
+
#
|
|
9
|
+
# Ensure that the widget is placed at the very bottom of the toplevel,
|
|
10
|
+
# otherwise the resize behavior may behave oddly.
|
|
11
|
+
# ------------------------------------------------------------------------
|
|
12
|
+
|
|
13
|
+
package require Tk 8.3
|
|
14
|
+
|
|
15
|
+
if {0} {
|
|
16
|
+
proc sample {} {
|
|
17
|
+
# sample usage
|
|
18
|
+
eval destroy [winfo children .]
|
|
19
|
+
pack [text .t -width 0 -height 0] -fill both -expand 1
|
|
20
|
+
|
|
21
|
+
set sbar .s
|
|
22
|
+
StatusBar $sbar
|
|
23
|
+
pack $sbar -side bottom -fill x
|
|
24
|
+
set f [$sbar getframe]
|
|
25
|
+
|
|
26
|
+
# Specify -width 1 for the label widget so it truncates nicely
|
|
27
|
+
# instead of requesting large sizes for long messages
|
|
28
|
+
set w [label $f.status -width 1 -anchor w -textvariable ::STATUS]
|
|
29
|
+
set ::STATUS "This is a status message"
|
|
30
|
+
# give the entry weight, as we want it to be the one that expands
|
|
31
|
+
$sbar add $w -weight 1
|
|
32
|
+
|
|
33
|
+
# BWidget's progressbar
|
|
34
|
+
set w [ProgressBar $f.bpbar -orient horizontal \
|
|
35
|
+
-variable ::PROGRESS -bd 1 -relief sunken]
|
|
36
|
+
set ::PROGRESS 50
|
|
37
|
+
$sbar add $w
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
namespace eval StatusBar {
|
|
42
|
+
Widget::define StatusBar statusbar
|
|
43
|
+
|
|
44
|
+
Widget::declare StatusBar {
|
|
45
|
+
{-background TkResource "" 0 frame}
|
|
46
|
+
{-borderwidth TkResource 0 0 frame}
|
|
47
|
+
{-relief TkResource flat 0 frame}
|
|
48
|
+
{-showseparator Boolean 1 0}
|
|
49
|
+
{-showresizesep Boolean 0 0}
|
|
50
|
+
{-showresize Boolean 1 0}
|
|
51
|
+
{-width TkResource 100 0 frame}
|
|
52
|
+
{-height TkResource 18 0 frame}
|
|
53
|
+
{-ipad String 1 0}
|
|
54
|
+
{-pad String 0 0}
|
|
55
|
+
{-bg Synonym -background}
|
|
56
|
+
{-bd Synonym -borderwidth}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
# -background, -borderwidth and -relief apply to outer frame, but relief
|
|
60
|
+
# should be left flat for proper look
|
|
61
|
+
Widget::addmap StatusBar "" :cmd {
|
|
62
|
+
-background {} -width {} -height {} -borderwidth {} -relief {}
|
|
63
|
+
}
|
|
64
|
+
Widget::addmap StatusBar "" .sbar {
|
|
65
|
+
-background {}
|
|
66
|
+
}
|
|
67
|
+
Widget::addmap StatusBar "" .resize {
|
|
68
|
+
-background {}
|
|
69
|
+
}
|
|
70
|
+
Widget::addmap StatusBar "" .hsep {
|
|
71
|
+
-background {}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
# -pad provides general padding around the status bar
|
|
75
|
+
# -ipad provides padding around each status bar item
|
|
76
|
+
# Padding can be a list of {padx pady}
|
|
77
|
+
|
|
78
|
+
variable HaveMarlett \
|
|
79
|
+
[expr {[lsearch -exact [font families] "Marlett"] != -1}]
|
|
80
|
+
|
|
81
|
+
bind StatusResize <1> \
|
|
82
|
+
[namespace code [list begin_resize %W %X %Y]]
|
|
83
|
+
bind StatusResize <B1-Motion> \
|
|
84
|
+
[namespace code [list continue_resize %W %X %Y]]
|
|
85
|
+
bind StatusResize <ButtonRelease-1> \
|
|
86
|
+
[namespace code [list end_resize %W %X %Y]]
|
|
87
|
+
|
|
88
|
+
bind StatusBar <Destroy> [list StatusBar::_destroy %W]
|
|
89
|
+
|
|
90
|
+
# PNG version has partial alpha transparency for better look
|
|
91
|
+
variable pngdata {
|
|
92
|
+
iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAFM0aXcAAAABGdBTUEAAYagM
|
|
93
|
+
eiWXwAAAGJJREFUGJW9kVEOgCAMQzs8GEezN69fkKlbUAz2r3l5NGTA+pCU+Q
|
|
94
|
+
IA5sv39wGgZKClZGBhJMVTklRr3VNwMz04mVfQzQiEm79EkrYZycxIkq8kkv2
|
|
95
|
+
v6RFGku9TUrj8RGr9AGy6mhv2ymLwAAAAAElFTkSuQmCC
|
|
96
|
+
}
|
|
97
|
+
variable gifdata {
|
|
98
|
+
R0lGODlhDwAPAJEAANnZ2f///4CAgD8/PyH5BAEAAAAALAAAAAAPAA8AAAJEh
|
|
99
|
+
I+py+1IQvh4IZlG0Qg+QshkAokGQfAvZCBIhG8hA0Ea4UPIQJBG+BAyEKQhCH
|
|
100
|
+
bIQAgNEQCAIA0hAyE0AEIGgjSEDBQAOw==
|
|
101
|
+
}
|
|
102
|
+
if {[package provide img::png] != ""} {
|
|
103
|
+
image create photo ::StatusBar::resizer -format PNG -data $pngdata
|
|
104
|
+
} else {
|
|
105
|
+
image create photo ::StatusBar::resizer -format GIF -data $gifdata
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
# ------------------------------------------------------------------------
|
|
111
|
+
# Command StatusBar::create
|
|
112
|
+
# ------------------------------------------------------------------------
|
|
113
|
+
proc StatusBar::create { path args } {
|
|
114
|
+
variable _widget
|
|
115
|
+
variable HaveMarlett
|
|
116
|
+
|
|
117
|
+
# Allow for img::png loaded after initial source
|
|
118
|
+
if {[package provide img::png] != ""} {
|
|
119
|
+
variable pngdata
|
|
120
|
+
::StatusBar::resizer configure -format PNG -data $pngdata
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
Widget::init StatusBar $path $args
|
|
124
|
+
|
|
125
|
+
eval [list frame $path -class StatusBar] [Widget::subcget $path :cmd]
|
|
126
|
+
|
|
127
|
+
foreach {padx pady} [_padval [Widget::cget $path -pad]] \
|
|
128
|
+
{ipadx ipady} [_padval [Widget::cget $path -ipad]] { break }
|
|
129
|
+
|
|
130
|
+
if {[Widget::theme]} {
|
|
131
|
+
set sbar [ttk::frame $path.sbar -padding [list $padx $pady]]
|
|
132
|
+
} else {
|
|
133
|
+
set sbar [eval [list frame $path.sbar -padx $padx -pady $pady] \
|
|
134
|
+
[Widget::subcget $path .sbar]]
|
|
135
|
+
}
|
|
136
|
+
if {[string equal $::tcl_platform(platform) "windows"]} {
|
|
137
|
+
set cursor size_nw_se
|
|
138
|
+
} else {
|
|
139
|
+
set cursor sizing; # bottom_right_corner ??
|
|
140
|
+
}
|
|
141
|
+
set resize [eval [list label $path.resize] \
|
|
142
|
+
[Widget::subcget $path .resize] \
|
|
143
|
+
[list -borderwidth 0 -relief flat -anchor se \
|
|
144
|
+
-cursor $cursor -anchor se -padx 0 -pady 0]]
|
|
145
|
+
if {$HaveMarlett} {
|
|
146
|
+
$resize configure -font "Marlett -16" -text \u006f
|
|
147
|
+
} else {
|
|
148
|
+
$resize configure -image ::StatusBar::resizer
|
|
149
|
+
}
|
|
150
|
+
bindtags $resize [list all [winfo toplevel $path] StatusResize $resize]
|
|
151
|
+
|
|
152
|
+
if {[Widget::theme]} {
|
|
153
|
+
set fsep [ttk::separator $path.hsep -orient horizontal]
|
|
154
|
+
} else {
|
|
155
|
+
set fsep [eval [list frame $path.hsep -bd 1 -height 2 -relief sunken] \
|
|
156
|
+
[Widget::subcget $path .hsep]]
|
|
157
|
+
}
|
|
158
|
+
set sep [_sep $path sepresize {}]
|
|
159
|
+
|
|
160
|
+
grid $fsep -row 0 -column 0 -columnspan 3 -sticky ew
|
|
161
|
+
grid $sbar -row 1 -column 0 -sticky news
|
|
162
|
+
grid $sep -row 1 -column 1 -sticky ns -padx $ipadx -pady $ipady
|
|
163
|
+
grid $resize -row 1 -column 2 -sticky news
|
|
164
|
+
grid columnconfigure $path 0 -weight 1
|
|
165
|
+
if {![Widget::cget $path -showseparator]} {
|
|
166
|
+
grid remove $fsep
|
|
167
|
+
}
|
|
168
|
+
if {![Widget::cget $path -showresize]} {
|
|
169
|
+
grid remove $sep $resize
|
|
170
|
+
} elseif {![Widget::cget $path -showresizesep]} {
|
|
171
|
+
grid remove $sep
|
|
172
|
+
}
|
|
173
|
+
set _widget($path,items) {}
|
|
174
|
+
|
|
175
|
+
return [Widget::create StatusBar $path]
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
# ------------------------------------------------------------------------
|
|
180
|
+
# Command StatusBar::configure
|
|
181
|
+
# ------------------------------------------------------------------------
|
|
182
|
+
proc StatusBar::configure { path args } {
|
|
183
|
+
variable _widget
|
|
184
|
+
|
|
185
|
+
set res [Widget::configure $path $args]
|
|
186
|
+
|
|
187
|
+
foreach {chshow chshowrsep chshowsep chipad chpad} \
|
|
188
|
+
[Widget::hasChangedX $path -showresize -showresizesep -showseparator \
|
|
189
|
+
-ipad -pad] { break }
|
|
190
|
+
|
|
191
|
+
if {$chshow} {
|
|
192
|
+
set show [Widget::cget $path -showresize]
|
|
193
|
+
set showrsep [Widget::cget $path -showresizesep]
|
|
194
|
+
if {$show} {
|
|
195
|
+
if {$showrsep} {
|
|
196
|
+
grid $path.sepresize
|
|
197
|
+
}
|
|
198
|
+
grid $path.resize
|
|
199
|
+
} else {
|
|
200
|
+
grid remove $path.sepresize $path.resize
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
if {$chshowsep} {
|
|
204
|
+
if {$show} {
|
|
205
|
+
grid $path.hsep
|
|
206
|
+
} else {
|
|
207
|
+
grid remove $path.hsep
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if {$chipad} {
|
|
211
|
+
foreach {ipadx ipady} [_padval [Widget::cget $path -ipad]] { break }
|
|
212
|
+
foreach w [grid slaves $path.sbar] {
|
|
213
|
+
grid configure $w -padx $ipadx -pady $ipady
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
if {$chpad} {
|
|
217
|
+
foreach {padx pady} [_padval [Widget::cget $path -pad]] { break }
|
|
218
|
+
if {[string equal [winfo class $path.sbar] "TFrame"]} {
|
|
219
|
+
$path.sbar configure -padding [list $padx $pady]
|
|
220
|
+
} else {
|
|
221
|
+
$path.sbar configure -padx $padx -pady $pady
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return $res
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
# ------------------------------------------------------------------------
|
|
229
|
+
# Command StatusBar::cget
|
|
230
|
+
# ------------------------------------------------------------------------
|
|
231
|
+
proc StatusBar::cget { path option } {
|
|
232
|
+
return [Widget::cget $path $option]
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
# ------------------------------------------------------------------------
|
|
236
|
+
# Command StatusBar::getframe
|
|
237
|
+
# ------------------------------------------------------------------------
|
|
238
|
+
proc StatusBar::getframe {path} {
|
|
239
|
+
# This is the frame that users should place their statusbar widgets in
|
|
240
|
+
return $path.sbar
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
# ------------------------------------------------------------------------
|
|
244
|
+
# Command StatusBar::add
|
|
245
|
+
# ------------------------------------------------------------------------
|
|
246
|
+
proc StatusBar::add {path w args} {
|
|
247
|
+
variable _widget
|
|
248
|
+
|
|
249
|
+
array set opts [list \
|
|
250
|
+
-weight 0 \
|
|
251
|
+
-separator 1 \
|
|
252
|
+
-sticky news \
|
|
253
|
+
-pad [Widget::cget $path -ipad] \
|
|
254
|
+
]
|
|
255
|
+
foreach {key val} $args {
|
|
256
|
+
if {[info exists opts($key)]} {
|
|
257
|
+
set opts($key) $val
|
|
258
|
+
} else {
|
|
259
|
+
set msg "unknown option \"$key\", must be one of: "
|
|
260
|
+
append msg [join [lsort [array names opts]] {, }]
|
|
261
|
+
return -code error $msg
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
foreach {ipadx ipady} [_padval $opts(-pad)] { break }
|
|
265
|
+
|
|
266
|
+
set sbar $path.sbar
|
|
267
|
+
foreach {cols rows} [grid size $sbar] break
|
|
268
|
+
# Add separator if requested, and we aren't the first element
|
|
269
|
+
if {$opts(-separator) && $cols != 0} {
|
|
270
|
+
set sep [_sep $path sep[winfo name $w]]
|
|
271
|
+
# only append name, to distinguish us from them
|
|
272
|
+
lappend _widget($path,items) [winfo name $sep]
|
|
273
|
+
grid $sep -in $sbar -row 0 -column $cols \
|
|
274
|
+
-sticky ns -padx $ipadx -pady $ipady
|
|
275
|
+
incr cols
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
lappend _widget($path,items) $w
|
|
279
|
+
grid $w -in $sbar -row 0 -column $cols -sticky $opts(-sticky) \
|
|
280
|
+
-padx $ipadx -pady $ipady
|
|
281
|
+
grid columnconfigure $sbar $cols -weight $opts(-weight)
|
|
282
|
+
|
|
283
|
+
return $w
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
# ------------------------------------------------------------------------
|
|
287
|
+
# Command StatusBar::delete
|
|
288
|
+
# ------------------------------------------------------------------------
|
|
289
|
+
proc StatusBar::remove {path args} {
|
|
290
|
+
variable _widget
|
|
291
|
+
|
|
292
|
+
set destroy [string equal [lindex $args 0] "-destroy"]
|
|
293
|
+
if {$destroy} {
|
|
294
|
+
set args [lrange $args 1 end]
|
|
295
|
+
}
|
|
296
|
+
foreach w $args {
|
|
297
|
+
set idx [lsearch -exact $_widget($path,items) $w]
|
|
298
|
+
if {$idx == -1 || ![winfo exists $w]} {
|
|
299
|
+
# ignore unknown or non-widget items (like our separators)
|
|
300
|
+
continue
|
|
301
|
+
}
|
|
302
|
+
# separator is always previous item
|
|
303
|
+
set sidx [expr {$idx - 1}]
|
|
304
|
+
set sep [lindex $_widget($path,items) $sidx]
|
|
305
|
+
if {[string match .* $sep]} {
|
|
306
|
+
# not one of our separators
|
|
307
|
+
incr sidx
|
|
308
|
+
} elseif {$sep != ""} {
|
|
309
|
+
# destroy separator too
|
|
310
|
+
set sep $path.sbar.$sep
|
|
311
|
+
destroy $sep
|
|
312
|
+
}
|
|
313
|
+
if {$destroy} {
|
|
314
|
+
destroy $w
|
|
315
|
+
} else {
|
|
316
|
+
grid forget $w
|
|
317
|
+
}
|
|
318
|
+
if {$idx == 0} {
|
|
319
|
+
# separator of next item is no longer necessary
|
|
320
|
+
set sep [lindex $_widget($path,items) [expr {$idx + 1}]]
|
|
321
|
+
if {$sep != "" && ![string match .* $sep]} {
|
|
322
|
+
incr idx
|
|
323
|
+
set sep $path.sbar.$sep
|
|
324
|
+
destroy $sep
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
set _widget($path,items) [lreplace $_widget($path,items) $sidx $idx]
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
# ------------------------------------------------------------------------
|
|
332
|
+
# Command StatusBar::delete
|
|
333
|
+
# ------------------------------------------------------------------------
|
|
334
|
+
proc StatusBar::delete {path args} {
|
|
335
|
+
return [StatusBar::remove $path -destroy $args]
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
# ------------------------------------------------------------------------
|
|
339
|
+
# Command StatusBar::items
|
|
340
|
+
# ------------------------------------------------------------------------
|
|
341
|
+
proc StatusBar::items {path} {
|
|
342
|
+
variable _widget
|
|
343
|
+
return $_widget($path,items)
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
proc StatusBar::_sep {path name {sub .sbar}} {
|
|
347
|
+
if {[Widget::theme]} {
|
|
348
|
+
return [ttk::separator $path$sub.$name -orient vertical]
|
|
349
|
+
} else {
|
|
350
|
+
return [frame $path$sub.$name -bd 1 -width 2 -relief sunken]
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
proc StatusBar::_padval {padval} {
|
|
355
|
+
set len [llength $padval]
|
|
356
|
+
foreach {a b} $padval { break }
|
|
357
|
+
if {$len == 0 || $len > 2} {
|
|
358
|
+
return -code error \
|
|
359
|
+
"invalid pad value \"$padval\", must be 1 or 2 pixel values"
|
|
360
|
+
} elseif {$len == 1} {
|
|
361
|
+
return [list $a $a]
|
|
362
|
+
} elseif {$len == 2} {
|
|
363
|
+
return $padval
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
# ------------------------------------------------------------------------
|
|
368
|
+
# Command StatusBar::_destroy
|
|
369
|
+
# ------------------------------------------------------------------------
|
|
370
|
+
proc StatusBar::_destroy { path } {
|
|
371
|
+
variable _widget
|
|
372
|
+
variable resize
|
|
373
|
+
array unset widget $path,*
|
|
374
|
+
array unset resize $path.resize,*
|
|
375
|
+
Widget::destroy $path
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
# The following proc handles the mouse click on the resize control. It stores
|
|
379
|
+
# the original size of the window and the initial coords of the mouse relative
|
|
380
|
+
# to the root.
|
|
381
|
+
|
|
382
|
+
proc StatusBar::begin_resize {w rootx rooty} {
|
|
383
|
+
variable resize
|
|
384
|
+
set t [winfo toplevel $w]
|
|
385
|
+
set relx [expr {$rootx - [winfo rootx $t]}]
|
|
386
|
+
set rely [expr {$rooty - [winfo rooty $t]}]
|
|
387
|
+
set resize($w,x) $relx
|
|
388
|
+
set resize($w,y) $rely
|
|
389
|
+
set resize($w,w) [winfo width $t]
|
|
390
|
+
set resize($w,h) [winfo height $t]
|
|
391
|
+
set resize($w,winc) 1
|
|
392
|
+
set resize($w,hinc) 1
|
|
393
|
+
set resize($w,grid) [wm grid $t]
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
# The following proc handles mouse motion on the resize control by asking the
|
|
397
|
+
# wm to adjust the size of the window.
|
|
398
|
+
|
|
399
|
+
proc StatusBar::continue_resize {w rootx rooty} {
|
|
400
|
+
variable resize
|
|
401
|
+
if {[llength $resize($w,grid)]} {
|
|
402
|
+
# at this time, we don't know how to handle gridded resizing
|
|
403
|
+
return
|
|
404
|
+
}
|
|
405
|
+
set t [winfo toplevel $w]
|
|
406
|
+
set relx [expr {$rootx - [winfo rootx $t]}]
|
|
407
|
+
set rely [expr {$rooty - [winfo rooty $t]}]
|
|
408
|
+
set width [expr {$relx - $resize($w,x) + $resize($w,w)}]
|
|
409
|
+
set height [expr {$rely - $resize($w,y) + $resize($w,h)}]
|
|
410
|
+
if {$width < 0} { set width 0 }
|
|
411
|
+
if {$height < 0} { set height 0 }
|
|
412
|
+
wm geometry $t ${width}x${height}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
# The following proc cleans up when the user releases the mouse button.
|
|
416
|
+
|
|
417
|
+
proc StatusBar::end_resize {w rootx rooty} {
|
|
418
|
+
variable resize
|
|
419
|
+
#continue_resize $w $rootx $rooty
|
|
420
|
+
#wm grid $t $resize($w,grid)
|
|
421
|
+
array unset resize $w,*
|
|
422
|
+
}
|