source: tol/tolbase/lib/toltk/scrollw.tcl @ 6d7779d

1941-docker-image-to-testdevel
Last change on this file since 6d7779d was 6d7779d, checked in by Jorge Pérez <josp.jorge@…>, 18 years ago

initial import

git-svn-id: ​https://www.tol-project.org/svn/tolp/trunk@1 be4846ae-f051-483a-831f-b64e7d08527f

  • Property mode set to 100644
File size: 12.3 KB
Line 
1#/////////////////////////////////////////////////////////////////////////////
2# FILE    : scrollw.tcl
3# PURPOSE : This file is part of Unifix BWidget Toolkit
4#/////////////////////////////////////////////////////////////////////////////
5
6
7
8
9namespace eval ScrolledWindow {
10    Widget::declare ScrolledWindow {
11        {-background  TkResource ""   0 button}
12        {-scrollbar   Enum       both 0 {none both vertical horizontal}}
13        {-auto        Enum       both 0 {none both vertical horizontal}}
14        {-sides       Enum       se   0 {ne en nw wn se es sw ws}}
15        {-size        Int        0    1 "%d >= 0"}
16        {-ipad        Int        1    1 "%d >= 0"}
17        {-managed     Boolean    1    1}
18        {-relief      TkResource flat 0 frame}
19        {-borderwidth TkResource 0    0 frame}
20        {-bg          Synonym    -background}
21        {-bd          Synonym    -borderwidth}
22    }
23
24    Widget::addmap ScrolledWindow "" ._grid.f {-relief {} -borderwidth {}}
25
26    proc ::ScrolledWindow {path args} {
27        return [eval ScrolledWindow::create $path $args]
28    }
29    proc use {} {}
30}
31
32
33# -----------------------------------------------------------------------------
34#  Command ScrolledWindow::create
35# -----------------------------------------------------------------------------
36proc ScrolledWindow::create { path args } {
37    upvar \#0 ScrolledWindow::$path data
38
39    Widget::init ScrolledWindow $path $args
40
41    set bg     [Widget::cget $path -background]
42    set sbsize [Widget::cget $path -size]
43    set ipad   [Widget::cget $path -ipad]
44    set sw     [frame $path \
45                    -relief flat -borderwidth 0 -background $bg \
46                    -highlightthickness 0 -takefocus 0]
47    set grid   [frame $path._grid \
48                    -relief flat -borderwidth 0 -background $bg \
49                    -highlightthickness 0 -takefocus 0]
50    set fv     [frame $grid.vframe \
51                    -relief flat -borderwidth 0 -background $bg \
52                    -highlightthickness 0 -takefocus 0]
53    set fh     [frame $grid.hframe \
54                    -relief flat -borderwidth 0 -background $bg \
55                    -highlightthickness 0 -takefocus 0]
56    eval frame $grid.f -background $bg -highlightthickness 0 \
57        [Widget::subcget $path ._grid.f]
58
59    scrollbar $grid.hscroll \
60        -highlightthickness 0 -takefocus 0 \
61        -orient  horiz  \
62        -relief  sunken \
63        -bg      $bg
64    scrollbar $grid.vscroll \
65        -highlightthickness 0 -takefocus 0 \
66        -orient  vert   \
67        -relief  sunken \
68        -bg      $bg
69
70    set data(realized) 0
71
72    _setData $path \
73        [Widget::cget $path -scrollbar] \
74        [Widget::cget $path -auto] \
75        [Widget::cget $path -sides]
76
77    if {[Widget::cget $path -managed]} {
78        set data(hsb,packed) $data(hsb,present)
79        set data(vsb,packed) $data(vsb,present)
80    } else {
81        set data(hsb,packed) 0
82        set data(vsb,packed) 0
83    }
84    if {$sbsize} {
85        $grid.vscroll configure -width $sbsize
86        $grid.hscroll configure -width $sbsize
87    } else {
88        set sbsize [$grid.vscroll cget -width]
89    }
90    set size [expr {$sbsize+$ipad}]
91
92    $grid.vframe configure -width  $size
93    $grid.hframe configure -height $size
94    set vplaceopt [list -in $grid.vframe -x [expr {(1-$data(vsb,west))*$ipad}] -y 0 -width [expr {-$ipad}]]
95    set hplaceopt [list -in $grid.hframe -x 0 -y [expr {(1-$data(hsb,north))*$ipad}] -height [expr {-$ipad}]]
96    pack propagate $grid.vframe 0
97    pack propagate $grid.hframe 0
98    pack $grid.vscroll -in $grid.vframe
99    pack $grid.hscroll -in $grid.hframe
100
101    bind $grid.hscroll <Configure> \
102        "ScrolledWindow::_setSBSize $grid.hscroll $size -relwidth 1.0 -relheight 1.0 $hplaceopt"
103    bind $grid.vscroll <Configure> \
104        "ScrolledWindow::_setSBSize $grid.vscroll $size -relwidth 1.0 -relheight 1.0 $vplaceopt"
105
106    grid $grid.hframe \
107        -column     [expr {$data(vsb,west)*$data(vsb,packed)}] \
108        -row        [expr {1-$data(hsb,north)}]  \
109        -columnspan [expr {2-$data(vsb,packed)}] \
110        -sticky we
111    grid $grid.vframe \
112        -column  [expr {1-$data(vsb,west)}] \
113        -row     [expr {$data(hsb,north)*$data(hsb,packed)}] \
114        -rowspan [expr {2-$data(hsb,packed)}] \
115        -sticky ns
116
117    grid $grid.f \
118        -column     [expr {$data(vsb,west)*$data(vsb,packed)}]  \
119        -row        [expr {$data(hsb,north)*$data(hsb,packed)}] \
120        -columnspan [expr {2-$data(vsb,packed)}] \
121        -rowspan    [expr {2-$data(hsb,packed)}] \
122        -sticky     nwse
123
124    grid columnconfigure $grid $data(vsb,west)  -weight 1
125    grid rowconfigure    $grid $data(hsb,north) -weight 1
126    pack $grid -fill both -expand yes
127
128    bind $grid <Configure> "ScrolledWindow::_realize $path"
129    bind $grid <Destroy>   "ScrolledWindow::_destroy $path"
130    raise $grid.f
131    rename $path ::$path:cmd
132    proc ::$path { cmd args } "return \[eval ScrolledWindow::\$cmd $path \$args\]"
133
134    return $path
135}
136
137
138# -----------------------------------------------------------------------------
139#  Command ScrolledWindow::getframe
140# -----------------------------------------------------------------------------
141proc ScrolledWindow::getframe { path } {
142    return $path
143}
144
145
146# -----------------------------------------------------------------------------
147#  Command ScrolledWindow::setwidget
148# -----------------------------------------------------------------------------
149proc ScrolledWindow::setwidget { path widget } {
150    upvar \#0 ScrolledWindow::$path data
151
152    set grid   $path._grid
153
154    pack $widget -in $grid.f -fill both -expand yes
155
156    $grid.hscroll configure -command "$widget xview"
157    $grid.vscroll configure -command "$widget yview"
158    $widget configure \
159        -xscrollcommand "ScrolledWindow::_set_hscroll $path" \
160        -yscrollcommand "ScrolledWindow::_set_vscroll $path"
161}
162
163
164# -----------------------------------------------------------------------------
165#  Command ScrolledWindow::configure
166# -----------------------------------------------------------------------------
167proc ScrolledWindow::configure { path args } {
168    upvar \#0 ScrolledWindow::$path data
169
170puts " ScrolledWindow::configure $args"
171
172    set grid $path._grid
173    set res [Widget::configure $path $args]
174    if { [Widget::hasChanged $path -background bg] } {
175        $path configure -background $bg
176        $grid configure -background $bg
177        $grid.f configure -background $bg
178        catch {$grid.hscroll configure -background $bg}
179        catch {$grid.vscroll configure -background $bg}
180    }
181
182    if {[Widget::hasChanged $path -scrollbar scrollbar] |
183        [Widget::hasChanged $path -auto      auto]     |
184        [Widget::hasChanged $path -sides     sides]} {
185        _setData $path $scrollbar $auto $sides
186        set hscroll [$grid.hscroll get]
187        set vmin    [lindex $hscroll 0]
188        set vmax    [lindex $hscroll 1]
189        set data(hsb,packed) [expr {$data(hsb,present) &&
190                                    (!$data(hsb,auto) || ($vmin != 0 || $vmax != 1))}]
191        set vscroll [$grid.vscroll get]
192        set vmin    [lindex $vscroll 0]
193        set vmax    [lindex $vscroll 1]
194        set data(vsb,packed) [expr {$data(vsb,present) &&
195                                    (!$data(vsb,auto) || ($vmin != 0 || $vmax != 1))}]
196
197        set ipad [Widget::cget $path -ipad]
198        place configure $grid.vscroll \
199            -x [expr {(1-$data(vsb,west))*$ipad}]
200        place configure $grid.hscroll \
201            -y [expr {(1-$data(hsb,north))*$ipad}]
202
203        grid configure $grid.hframe \
204            -column     [expr {$data(vsb,west)*$data(vsb,packed)}] \
205            -row        [expr {1-$data(hsb,north)}]  \
206            -columnspan [expr {2-$data(vsb,packed)}]
207        grid configure $grid.vframe \
208            -column  [expr {1-$data(vsb,west)}] \
209            -row     [expr {$data(hsb,north)*$data(hsb,packed)}] \
210            -rowspan [expr {2-$data(hsb,packed)}]
211        grid configure $grid.f \
212            -column     [expr {$data(vsb,west)*$data(vsb,packed)}] \
213            -row        [expr {$data(hsb,north)*$data(hsb,packed)}] \
214            -columnspan [expr {2-$data(vsb,packed)}] \
215            -rowspan    [expr {2-$data(hsb,packed)}]
216        grid columnconfigure $grid $data(vsb,west)             -weight 1
217        grid columnconfigure $grid [expr {1-$data(vsb,west)}]  -weight 0
218        grid rowconfigure    $grid $data(hsb,north)            -weight 1
219        grid rowconfigure    $grid [expr {1-$data(hsb,north)}] -weight 0
220    }
221    return $res
222}
223
224
225# -----------------------------------------------------------------------------
226#  Command ScrolledWindow::cget
227# -----------------------------------------------------------------------------
228proc ScrolledWindow::cget { path option } {
229    return [Widget::cget $path $option]
230}
231
232
233# -----------------------------------------------------------------------------
234#  Command ScrolledWindow::_destroy
235# -----------------------------------------------------------------------------
236proc ScrolledWindow::_destroy { path } {
237    upvar \#0 ScrolledWindow::$path data
238
239    unset data
240    Widget::destroy $path
241    # Esta linea ya no aparece en la version 1.7.1
242    #rename $path {}
243}
244
245# -----------------------------------------------------------------------------
246#  Command ScrolledWindow::_set_hscroll
247# -----------------------------------------------------------------------------
248proc ScrolledWindow::_set_hscroll { path vmin vmax } {
249    upvar \#0 ScrolledWindow::$path data
250
251  rename ::ScrolledWindow::_set_hscroll __save_hscroll__
252  proc ::ScrolledWindow::_set_hscroll { args } {
253    return
254  }
255    if {$data(realized) && $data(hsb,present)} {
256        set grid $path._grid
257        if {$data(hsb,auto)} {
258            if {$data(hsb,packed) && $vmin == 0 && $vmax == 1} {
259                set data(hsb,packed) 0
260                grid configure $grid.f $grid.vframe -row 0 -rowspan 2
261            } elseif {!$data(hsb,packed) && ($vmin != 0 || $vmax != 1)} {
262                set data(hsb,packed) 1
263                grid configure $grid.f $grid.vframe -row $data(hsb,north) -rowspan 1
264            }
265        }
266        update idletask
267        $grid.hscroll set $vmin $vmax
268    }
269  rename ::ScrolledWindow::_set_hscroll ""
270  rename __save_hscroll__ ::ScrolledWindow::_set_hscroll
271}
272
273
274# -----------------------------------------------------------------------------
275#  Command ScrolledWindow::_set_vscroll
276# -----------------------------------------------------------------------------
277proc ScrolledWindow::_set_vscroll { path vmin vmax } {
278    upvar \#0 ScrolledWindow::$path data
279
280  rename ::ScrolledWindow::_set_vscroll __save_vscroll__
281  proc ::ScrolledWindow::_set_vscroll { args } {
282    return
283  }
284    if {$data(realized) && $data(vsb,present)} {
285        set grid $path._grid
286        if {$data(vsb,auto)} {
287            if {$data(vsb,packed) && $vmin == 0 && $vmax == 1} {
288                set data(vsb,packed) 0
289                grid configure $grid.f $grid.hframe -column 0 -columnspan 2
290            } elseif {!$data(vsb,packed) && ($vmin != 0 || $vmax != 1) } {
291                set data(vsb,packed) 1
292                grid configure $grid.f $grid.hframe -column $data(vsb,west) -columnspan 1
293            }
294        }
295        update idletask
296        $grid.vscroll set $vmin $vmax
297    }
298    rename ::ScrolledWindow::_set_vscroll ""
299    rename __save_vscroll__ ::ScrolledWindow::_set_vscroll
300}
301
302
303proc ScrolledWindow::_setData {path scrollbar auto sides} {
304    upvar \#0 ScrolledWindow::$path data
305
306    set sb    [lsearch {none horizontal vertical both} $scrollbar]
307    set auto  [lsearch {none horizontal vertical both} $auto]
308    set north [string match *n* $sides]
309    set west  [string match *w* $sides]
310
311    set data(hsb,present)  [expr {($sb & 1) != 0}]
312    set data(hsb,auto)     [expr {($auto & 1) != 0}]
313    set data(hsb,north)    $north
314
315    set data(vsb,present)  [expr {($sb & 2) != 0}]
316    set data(vsb,auto)     [expr {($auto & 2) != 0}]
317    set data(vsb,west)     $west
318}
319
320
321proc ScrolledWindow::_setSBSize {sb size args} {
322    $sb configure -width $size
323    eval place $sb $args
324}
325
326
327# -----------------------------------------------------------------------------
328#  Command ScrolledWindow::_realize
329# -----------------------------------------------------------------------------
330proc ScrolledWindow::_realize { path } {
331    upvar \#0 ScrolledWindow::$path data
332
333    set grid $path._grid
334    bind $grid <Configure> {}
335    set data(realized) 1
336    place $grid -anchor nw -x 0 -y 0 -relwidth 1.0 -relheight 1.0
337}
Note: See TracBrowser for help on using the repository browser.