source: proiecte/pmake3d/make3d_original/Make3dSingleImageStanford_version0.1/third_party/vrippack-0.31/lib/linux/tk8.4/listbox.tcl @ 37

Last change on this file since 37 was 37, checked in by (none), 14 years ago

Added original make3d

File size: 13.8 KB
Line 
1# listbox.tcl --
2#
3# This file defines the default bindings for Tk listbox widgets
4# and provides procedures that help in implementing those bindings.
5#
6# RCS: @(#) $Id: listbox.tcl,v 1.13.2.2 2004/02/17 07:17:17 das Exp $
7#
8# Copyright (c) 1994 The Regents of the University of California.
9# Copyright (c) 1994-1995 Sun Microsystems, Inc.
10# Copyright (c) 1998 by Scriptics Corporation.
11#
12# See the file "license.terms" for information on usage and redistribution
13# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
14
15#--------------------------------------------------------------------------
16# tk::Priv elements used in this file:
17#
18# afterId -             Token returned by "after" for autoscanning.
19# listboxPrev -         The last element to be selected or deselected
20#                       during a selection operation.
21# listboxSelection -    All of the items that were selected before the
22#                       current selection operation (such as a mouse
23#                       drag) started;  used to cancel an operation.
24#--------------------------------------------------------------------------
25
26#-------------------------------------------------------------------------
27# The code below creates the default class bindings for listboxes.
28#-------------------------------------------------------------------------
29
30# Note: the check for existence of %W below is because this binding
31# is sometimes invoked after a window has been deleted (e.g. because
32# there is a double-click binding on the widget that deletes it).  Users
33# can put "break"s in their bindings to avoid the error, but this check
34# makes that unnecessary.
35
36bind Listbox <1> {
37    if {[winfo exists %W]} {
38        tk::ListboxBeginSelect %W [%W index @%x,%y]
39    }
40}
41
42# Ignore double clicks so that users can define their own behaviors.
43# Among other things, this prevents errors if the user deletes the
44# listbox on a double click.
45
46bind Listbox <Double-1> {
47    # Empty script
48}
49
50bind Listbox <B1-Motion> {
51    set tk::Priv(x) %x
52    set tk::Priv(y) %y
53    tk::ListboxMotion %W [%W index @%x,%y]
54}
55bind Listbox <ButtonRelease-1> {
56    tk::CancelRepeat
57    %W activate @%x,%y
58}
59bind Listbox <Shift-1> {
60    tk::ListboxBeginExtend %W [%W index @%x,%y]
61}
62bind Listbox <Control-1> {
63    tk::ListboxBeginToggle %W [%W index @%x,%y]
64}
65bind Listbox <B1-Leave> {
66    set tk::Priv(x) %x
67    set tk::Priv(y) %y
68    tk::ListboxAutoScan %W
69}
70bind Listbox <B1-Enter> {
71    tk::CancelRepeat
72}
73
74bind Listbox <Up> {
75    tk::ListboxUpDown %W -1
76}
77bind Listbox <Shift-Up> {
78    tk::ListboxExtendUpDown %W -1
79}
80bind Listbox <Down> {
81    tk::ListboxUpDown %W 1
82}
83bind Listbox <Shift-Down> {
84    tk::ListboxExtendUpDown %W 1
85}
86bind Listbox <Left> {
87    %W xview scroll -1 units
88}
89bind Listbox <Control-Left> {
90    %W xview scroll -1 pages
91}
92bind Listbox <Right> {
93    %W xview scroll 1 units
94}
95bind Listbox <Control-Right> {
96    %W xview scroll 1 pages
97}
98bind Listbox <Prior> {
99    %W yview scroll -1 pages
100    %W activate @0,0
101}
102bind Listbox <Next> {
103    %W yview scroll 1 pages
104    %W activate @0,0
105}
106bind Listbox <Control-Prior> {
107    %W xview scroll -1 pages
108}
109bind Listbox <Control-Next> {
110    %W xview scroll 1 pages
111}
112bind Listbox <Home> {
113    %W xview moveto 0
114}
115bind Listbox <End> {
116    %W xview moveto 1
117}
118bind Listbox <Control-Home> {
119    %W activate 0
120    %W see 0
121    %W selection clear 0 end
122    %W selection set 0
123    event generate %W <<ListboxSelect>>
124}
125bind Listbox <Shift-Control-Home> {
126    tk::ListboxDataExtend %W 0
127}
128bind Listbox <Control-End> {
129    %W activate end
130    %W see end
131    %W selection clear 0 end
132    %W selection set end
133    event generate %W <<ListboxSelect>>
134}
135bind Listbox <Shift-Control-End> {
136    tk::ListboxDataExtend %W [%W index end]
137}
138bind Listbox <<Copy>> {
139    if {[string equal [selection own -displayof %W] "%W"]} {
140        clipboard clear -displayof %W
141        clipboard append -displayof %W [selection get -displayof %W]
142    }
143}
144bind Listbox <space> {
145    tk::ListboxBeginSelect %W [%W index active]
146}
147bind Listbox <Select> {
148    tk::ListboxBeginSelect %W [%W index active]
149}
150bind Listbox <Control-Shift-space> {
151    tk::ListboxBeginExtend %W [%W index active]
152}
153bind Listbox <Shift-Select> {
154    tk::ListboxBeginExtend %W [%W index active]
155}
156bind Listbox <Escape> {
157    tk::ListboxCancel %W
158}
159bind Listbox <Control-slash> {
160    tk::ListboxSelectAll %W
161}
162bind Listbox <Control-backslash> {
163    if {[string compare [%W cget -selectmode] "browse"]} {
164        %W selection clear 0 end
165        event generate %W <<ListboxSelect>>
166    }
167}
168
169# Additional Tk bindings that aren't part of the Motif look and feel:
170
171bind Listbox <2> {
172    %W scan mark %x %y
173}
174bind Listbox <B2-Motion> {
175    %W scan dragto %x %y
176}
177
178# The MouseWheel will typically only fire on Windows.  However,
179# someone could use the "event generate" command to produce one
180# on other platforms.
181
182if {[string equal [tk windowingsystem] "classic"]
183        || [string equal [tk windowingsystem] "aqua"]} {
184    bind Listbox <MouseWheel> {
185        %W yview scroll [expr {- (%D)}] units
186    }
187    bind Listbox <Option-MouseWheel> {
188        %W yview scroll [expr {-10 * (%D)}] units
189    }
190    bind Listbox <Shift-MouseWheel> {
191        %W xview scroll [expr {- (%D)}] units
192    }
193    bind Listbox <Shift-Option-MouseWheel> {
194        %W xview scroll [expr {-10 * (%D)}] units
195    }
196} else {
197    bind Listbox <MouseWheel> {
198        %W yview scroll [expr {- (%D / 120) * 4}] units
199    }
200}
201
202if {[string equal "x11" [tk windowingsystem]]} {
203    # Support for mousewheels on Linux/Unix commonly comes through mapping
204    # the wheel to the extended buttons.  If you have a mousewheel, find
205    # Linux configuration info at:
206    #   http://www.inria.fr/koala/colas/mouse-wheel-scroll/
207    bind Listbox <4> {
208        if {!$tk_strictMotif} {
209            %W yview scroll -5 units
210        }
211    }
212    bind Listbox <5> {
213        if {!$tk_strictMotif} {
214            %W yview scroll 5 units
215        }
216    }
217}
218
219# ::tk::ListboxBeginSelect --
220#
221# This procedure is typically invoked on button-1 presses.  It begins
222# the process of making a selection in the listbox.  Its exact behavior
223# depends on the selection mode currently in effect for the listbox;
224# see the Motif documentation for details.
225#
226# Arguments:
227# w -           The listbox widget.
228# el -          The element for the selection operation (typically the
229#               one under the pointer).  Must be in numerical form.
230
231proc ::tk::ListboxBeginSelect {w el} {
232    variable ::tk::Priv
233    if {[string equal [$w cget -selectmode] "multiple"]} {
234        if {[$w selection includes $el]} {
235            $w selection clear $el
236        } else {
237            $w selection set $el
238        }
239    } else {
240        $w selection clear 0 end
241        $w selection set $el
242        $w selection anchor $el
243        set Priv(listboxSelection) {}
244        set Priv(listboxPrev) $el
245    }
246    event generate $w <<ListboxSelect>>
247}
248
249# ::tk::ListboxMotion --
250#
251# This procedure is called to process mouse motion events while
252# button 1 is down.  It may move or extend the selection, depending
253# on the listbox's selection mode.
254#
255# Arguments:
256# w -           The listbox widget.
257# el -          The element under the pointer (must be a number).
258
259proc ::tk::ListboxMotion {w el} {
260    variable ::tk::Priv
261    if {$el == $Priv(listboxPrev)} {
262        return
263    }
264    set anchor [$w index anchor]
265    switch [$w cget -selectmode] {
266        browse {
267            $w selection clear 0 end
268            $w selection set $el
269            set Priv(listboxPrev) $el
270            event generate $w <<ListboxSelect>>
271        }
272        extended {
273            set i $Priv(listboxPrev)
274            if {[string equal {} $i]} {
275                set i $el
276                $w selection set $el
277            }
278            if {[$w selection includes anchor]} {
279                $w selection clear $i $el
280                $w selection set anchor $el
281            } else {
282                $w selection clear $i $el
283                $w selection clear anchor $el
284            }
285            if {![info exists Priv(listboxSelection)]} {
286                set Priv(listboxSelection) [$w curselection]
287            }
288            while {($i < $el) && ($i < $anchor)} {
289                if {[lsearch $Priv(listboxSelection) $i] >= 0} {
290                    $w selection set $i
291                }
292                incr i
293            }
294            while {($i > $el) && ($i > $anchor)} {
295                if {[lsearch $Priv(listboxSelection) $i] >= 0} {
296                    $w selection set $i
297                }
298                incr i -1
299            }
300            set Priv(listboxPrev) $el
301            event generate $w <<ListboxSelect>>
302        }
303    }
304}
305
306# ::tk::ListboxBeginExtend --
307#
308# This procedure is typically invoked on shift-button-1 presses.  It
309# begins the process of extending a selection in the listbox.  Its
310# exact behavior depends on the selection mode currently in effect
311# for the listbox;  see the Motif documentation for details.
312#
313# Arguments:
314# w -           The listbox widget.
315# el -          The element for the selection operation (typically the
316#               one under the pointer).  Must be in numerical form.
317
318proc ::tk::ListboxBeginExtend {w el} {
319    if {[string equal [$w cget -selectmode] "extended"]} {
320        if {[$w selection includes anchor]} {
321            ListboxMotion $w $el
322        } else {
323            # No selection yet; simulate the begin-select operation.
324            ListboxBeginSelect $w $el
325        }
326    }
327}
328
329# ::tk::ListboxBeginToggle --
330#
331# This procedure is typically invoked on control-button-1 presses.  It
332# begins the process of toggling a selection in the listbox.  Its
333# exact behavior depends on the selection mode currently in effect
334# for the listbox;  see the Motif documentation for details.
335#
336# Arguments:
337# w -           The listbox widget.
338# el -          The element for the selection operation (typically the
339#               one under the pointer).  Must be in numerical form.
340
341proc ::tk::ListboxBeginToggle {w el} {
342    variable ::tk::Priv
343    if {[string equal [$w cget -selectmode] "extended"]} {
344        set Priv(listboxSelection) [$w curselection]
345        set Priv(listboxPrev) $el
346        $w selection anchor $el
347        if {[$w selection includes $el]} {
348            $w selection clear $el
349        } else {
350            $w selection set $el
351        }
352        event generate $w <<ListboxSelect>>
353    }
354}
355
356# ::tk::ListboxAutoScan --
357# This procedure is invoked when the mouse leaves an entry window
358# with button 1 down.  It scrolls the window up, down, left, or
359# right, depending on where the mouse left the window, and reschedules
360# itself as an "after" command so that the window continues to scroll until
361# the mouse moves back into the window or the mouse button is released.
362#
363# Arguments:
364# w -           The entry window.
365
366proc ::tk::ListboxAutoScan {w} {
367    variable ::tk::Priv
368    if {![winfo exists $w]} return
369    set x $Priv(x)
370    set y $Priv(y)
371    if {$y >= [winfo height $w]} {
372        $w yview scroll 1 units
373    } elseif {$y < 0} {
374        $w yview scroll -1 units
375    } elseif {$x >= [winfo width $w]} {
376        $w xview scroll 2 units
377    } elseif {$x < 0} {
378        $w xview scroll -2 units
379    } else {
380        return
381    }
382    ListboxMotion $w [$w index @$x,$y]
383    set Priv(afterId) [after 50 [list tk::ListboxAutoScan $w]]
384}
385
386# ::tk::ListboxUpDown --
387#
388# Moves the location cursor (active element) up or down by one element,
389# and changes the selection if we're in browse or extended selection
390# mode.
391#
392# Arguments:
393# w -           The listbox widget.
394# amount -      +1 to move down one item, -1 to move back one item.
395
396proc ::tk::ListboxUpDown {w amount} {
397    variable ::tk::Priv
398    $w activate [expr {[$w index active] + $amount}]
399    $w see active
400    switch [$w cget -selectmode] {
401        browse {
402            $w selection clear 0 end
403            $w selection set active
404            event generate $w <<ListboxSelect>>
405        }
406        extended {
407            $w selection clear 0 end
408            $w selection set active
409            $w selection anchor active
410            set Priv(listboxPrev) [$w index active]
411            set Priv(listboxSelection) {}
412            event generate $w <<ListboxSelect>>
413        }
414    }
415}
416
417# ::tk::ListboxExtendUpDown --
418#
419# Does nothing unless we're in extended selection mode;  in this
420# case it moves the location cursor (active element) up or down by
421# one element, and extends the selection to that point.
422#
423# Arguments:
424# w -           The listbox widget.
425# amount -      +1 to move down one item, -1 to move back one item.
426
427proc ::tk::ListboxExtendUpDown {w amount} {
428    variable ::tk::Priv
429    if {[string compare [$w cget -selectmode] "extended"]} {
430        return
431    }
432    set active [$w index active]
433    if {![info exists Priv(listboxSelection)]} {
434        $w selection set $active
435        set Priv(listboxSelection) [$w curselection]
436    }
437    $w activate [expr {$active + $amount}]
438    $w see active
439    ListboxMotion $w [$w index active]
440}
441
442# ::tk::ListboxDataExtend
443#
444# This procedure is called for key-presses such as Shift-KEndData.
445# If the selection mode isn't multiple or extend then it does nothing.
446# Otherwise it moves the active element to el and, if we're in
447# extended mode, extends the selection to that point.
448#
449# Arguments:
450# w -           The listbox widget.
451# el -          An integer element number.
452
453proc ::tk::ListboxDataExtend {w el} {
454    set mode [$w cget -selectmode]
455    if {[string equal $mode "extended"]} {
456        $w activate $el
457        $w see $el
458        if {[$w selection includes anchor]} {
459            ListboxMotion $w $el
460        }
461    } elseif {[string equal $mode "multiple"]} {
462        $w activate $el
463        $w see $el
464    }
465}
466
467# ::tk::ListboxCancel
468#
469# This procedure is invoked to cancel an extended selection in
470# progress.  If there is an extended selection in progress, it
471# restores all of the items between the active one and the anchor
472# to their previous selection state.
473#
474# Arguments:
475# w -           The listbox widget.
476
477proc ::tk::ListboxCancel w {
478    variable ::tk::Priv
479    if {[string compare [$w cget -selectmode] "extended"]} {
480        return
481    }
482    set first [$w index anchor]
483    set last $Priv(listboxPrev)
484    if { [string equal $last ""] } {
485        # Not actually doing any selection right now
486        return
487    }
488    if {$first > $last} {
489        set tmp $first
490        set first $last
491        set last $tmp
492    }
493    $w selection clear $first $last
494    while {$first <= $last} {
495        if {[lsearch $Priv(listboxSelection) $first] >= 0} {
496            $w selection set $first
497        }
498        incr first
499    }
500    event generate $w <<ListboxSelect>>
501}
502
503# ::tk::ListboxSelectAll
504#
505# This procedure is invoked to handle the "select all" operation.
506# For single and browse mode, it just selects the active element.
507# Otherwise it selects everything in the widget.
508#
509# Arguments:
510# w -           The listbox widget.
511
512proc ::tk::ListboxSelectAll w {
513    set mode [$w cget -selectmode]
514    if {[string equal $mode "single"] || [string equal $mode "browse"]} {
515        $w selection clear 0 end
516        $w selection set active
517    } else {
518        $w selection set 0 end
519    }
520    event generate $w <<ListboxSelect>>
521}
Note: See TracBrowser for help on using the repository browser.