123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442 |
- # -*- mode: TCL; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
- #
- # $Id: Utils.tcl,v 1.4 2004/03/28 02:44:57 hobbs Exp $
- #
- # Util.tcl --
- #
- # The Tix utility commands. Some of these commands are
- # replacement of or extensions to the existing TK
- # commands. Occasionaly, you have to use the commands inside
- # this file instead of thestandard TK commands to make your
- # applicatiion work better with Tix. Please read the
- # documentations (programmer's guide, man pages) for information
- # about these utility commands.
- #
- # Copyright (c) 1993-1999 Ioi Kim Lam.
- # Copyright (c) 2000-2001 Tix Project Group.
- # Copyright (c) 2004 ActiveState
- #
- # See the file "license.terms" for information on usage and redistribution
- # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
- #
- #
- # kludge: should be able to handle all kinds of flags
- # now only handles "-flag value" pairs.
- #
- proc tixHandleArgv {p_argv p_options validFlags} {
- upvar $p_options opt
- upvar $p_argv argv
- set old_argv $argv
- set argv ""
- foreac {flag value} $old_argv {
- if {[lsearch $validFlags $flag] != -1} {
- # The caller will handle this option exclusively
- # It won't be added back to the original arglist
- #
- eval $opt($flag,action) $value
- } else {
- # The caller does not handle this option
- #
- lappend argv $flag
- lappend argv $value
- }
- }
- }
- #-----------------------------------------------------------------------
- # tixDisableAll -
- #
- # Disable all members in a sub widget tree
- #
- proc tixDisableAll {w} {
- foreach x [tixDescendants $w] {
- catch {$x config -state disabled}
- }
- }
- #----------------------------------------------------------------------
- # tixEnableAll -
- #
- # enable all members in a sub widget tree
- #
- proc tixEnableAll {w} {
- foreach x [tixDescendants $w] {
- catch {$x config -state normal}
- }
- }
- #----------------------------------------------------------------------
- # tixDescendants -
- #
- # Return a list of all the member of a widget subtree, including
- # the tree's root widget.
- #
- proc tixDescendants {parent} {
- set des ""
- lappend des $parent
- foreach w [winfo children $parent] {
- foreach x [tixDescendants $w] {
- lappend des $x
- }
- }
- return $des
- }
- #----------------------------------------------------------------------
- # tixTopLevel -
- #
- # Create a toplevel widget and unmap it immediately. This will ensure
- # that this toplevel widgets will not be popped up prematurely when you
- # create Tix widgets inside it.
- #
- # "tixTopLevel" also provide options for you to specify the appearance
- # and behavior of this toplevel.
- #
- #
- #
- proc tixTopLevel {w args} {
- set opt (-geometry) ""
- set opt (-minsize) ""
- set opt (-maxsize) ""
- set opt (-width) ""
- set opt (-height) ""
- eval [linsert $args 0 toplevel $w]
- wm withdraw $w
- }
- # This is a big kludge
- #
- # Substitutes all [...] and $.. in the string in $args
- #
- proc tixInt_Expand {args} {
- return $args
- }
- # Print out all the config options of a widget
- #
- proc tixPConfig {w} {
- puts [join [lsort [$w config]] \n]
- }
- proc tixAppendBindTag {w tag} {
- bindtags $w [concat [bindtags $w] $tag]
- }
- proc tixAddBindTag {w tag} {
- bindtags $w [concat $tag [bindtags $w] ]
- }
- proc tixSubwidgetRef {sub} {
- return $::tixSRef($sub)
- }
- proc tixSubwidgetRetCreate {sub ref} {
- set ::tixSRef($sub) $ref
- }
- proc tixSubwidgetRetDelete {sub} {
- catch {unset ::tixSRef($sub)}
- }
- proc tixListboxGetCurrent {listbox} {
- return [tixEvent flag V]
- }
- # tixSetMegaWidget --
- #
- # Associate a subwidget with its mega widget "owner". This is mainly
- # used when we add a new bindtag to a subwidget and we need to find out
- # the name of the mega widget inside the binding.
- #
- proc tixSetMegaWidget {w mega {type any}} {
- set ::tixMega($type,$w) $mega
- }
- proc tixGetMegaWidget {w {type any}} {
- return $::tixMega($type,$w)
- }
- proc tixUnsetMegaWidget {w} {
- if {[info exists ::tixMega($w)]} { unset ::tixMega($w) }
- }
- # tixBusy : display busy cursors on a window
- #
- #
- # Should flush the event queue (but not do any idle tasks) before blocking
- # the target window (I am not sure if it is aready doing so )
- #
- # ToDo: should take some additional windows to raise
- #
- proc tixBusy {w flag {focuswin ""}} {
- if {[info command tixInputOnly] == ""} {
- return
- }
- global tixBusy
- set toplevel [winfo toplevel $w]
- if {![info exists tixBusy(cursor)]} {
- set tixBusy(cursor) watch
- # set tixBusy(cursor) "[tix getbitmap hourglass] \
- # [string range [tix getbitmap hourglass.mask] 1 end]\
- # black white"
- }
- if {$toplevel eq "."} {
- set inputonly0 .__tix__busy0
- set inputonly1 .__tix__busy1
- set inputonly2 .__tix__busy2
- set inputonly3 .__tix__busy3
- } else {
- set inputonly0 $toplevel.__tix__busy0
- set inputonly1 $toplevel.__tix__busy1
- set inputonly2 $toplevel.__tix__busy2
- set inputonly3 $toplevel.__tix__busy3
- }
- if {![winfo exists $inputonly0]} {
- for {set i 0} {$i < 4} {incr i} {
- tixInputOnly [set inputonly$i] -cursor $tixBusy(cursor)
- }
- }
- if {$flag eq "on"} {
- if {$focuswin != "" && [winfo id $focuswin] != 0} {
- if {[info exists tixBusy($focuswin,oldcursor)]} {
- return
- }
- set tixBusy($focuswin,oldcursor) [$focuswin cget -cursor]
- $focuswin config -cursor $tixBusy(cursor)
- set x1 [expr {[winfo rootx $focuswin]-[winfo rootx $toplevel]}]
- set y1 [expr {[winfo rooty $focuswin]-[winfo rooty $toplevel]}]
- set W [winfo width $focuswin]
- set H [winfo height $focuswin]
- set x2 [expr {$x1 + $W}]
- set y2 [expr {$y1 + $H}]
- if {$y1 > 0} {
- tixMoveResizeWindow $inputonly0 0 0 10000 $y1
- }
- if {$x1 > 0} {
- tixMoveResizeWindow $inputonly1 0 0 $x1 10000
- }
- tixMoveResizeWindow $inputonly2 0 $y2 10000 10000
- tixMoveResizeWindow $inputonly3 $x2 0 10000 10000
- for {set i 0} {$i < 4} {incr i} {
- tixMapWindow [set inputonly$i]
- tixRaiseWindow [set inputonly$i]
- }
- tixFlushX $w
- } else {
- tixMoveResizeWindow $inputonly0 0 0 10000 10000
- tixMapWindow $inputonly0
- tixRaiseWindow $inputonly0
- }
- } else {
- tixUnmapWindow $inputonly0
- tixUnmapWindow $inputonly1
- tixUnmapWindow $inputonly2
- tixUnmapWindow $inputonly3
- if {$focuswin != "" && [winfo id $focuswin] != 0} {
- if {[info exists tixBusy($focuswin,oldcursor)]} {
- $focuswin config -cursor $tixBusy($focuswin,oldcursor)
- if {[info exists tixBusy($focuswin,oldcursor)]} {
- unset tixBusy($focuswin,oldcursor)
- }
- }
- }
- }
- }
- proc tixOptionName {w} {
- return [string range $w 1 end]
- }
- proc tixSetSilent {chooser value} {
- $chooser config -disablecallback true
- $chooser config -value $value
- $chooser config -disablecallback false
- }
- # This command is useful if you want to ingore the arguments
- # passed by the -command or -browsecmd options of the Tix widgets. E.g
- #
- # tixFileSelectDialog .c -command "puts foo; tixBreak"
- #
- #
- proc tixBreak {args} {}
- #----------------------------------------------------------------------
- # tixDestroy -- deletes a Tix class object (not widget classes)
- #----------------------------------------------------------------------
- proc tixDestroy {w} {
- upvar #0 $w data
- set destructor ""
- if {[info exists data(className)]} {
- catch {
- set destructor [tixGetMethod $w $data(className) Destructor]
- }
- }
- if {$destructor != ""} {
- $destructor $w
- }
- catch {rename $w ""}
- catch {unset data}
- return ""
- }
- proc tixPushGrab {args} {
- global tix_priv
- if {![info exists tix_priv(grab-list)]} {
- set tix_priv(grab-list) ""
- set tix_priv(grab-mode) ""
- set tix_priv(grab-nopush) ""
- }
- set len [llength $args]
- if {$len == 1} {
- set opt ""
- set w [lindex $args 0]
- } elseif {$len == 2} {
- set opt [lindex $args 0]
- set w [lindex $args 1]
- } else {
- error "wrong # of arguments: tixPushGrab ?-global? window"
- }
- # Not everyone will call tixPushGrab. If someone else has a grab already
- # save that one as well, so that we can restore that later
- #
- set last [lindex $tix_priv(grab-list) end]
- set current [grab current $w]
- if {$current ne "" && $current ne $last} {
- # Someone called "grab" directly
- #
- lappend tix_priv(grab-list) $current
- lappend tix_priv(grab-mode) [grab status $current]
- lappend tix_priv(grab-nopush) 1
- }
- # Now push myself into the stack
- #
- lappend tix_priv(grab-list) $w
- lappend tix_priv(grab-mode) $opt
- lappend tix_priv(grab-nopush) 0
- if {$opt eq "-global"} {
- grab -global $w
- } else {
- grab $w
- }
- }
- proc tixPopGrab {} {
- global tix_priv
- if {![info exists tix_priv(grab-list)]} {
- set tix_priv(grab-list) ""
- set tix_priv(grab-mode) ""
- set tix_priv(grab-nopush) ""
- }
- set len [llength $tix_priv(grab-list)]
- if {$len <= 0} {
- error "no window is grabbed by tixGrab"
- }
- set w [lindex $tix_priv(grab-list) end]
- grab release $w
- if {$len > 1} {
- set tix_priv(grab-list) [lrange $tix_priv(grab-list) 0 end-1]
- set tix_priv(grab-mode) [lrange $tix_priv(grab-mode) 0 end-1]
- set tix_priv(grab-nopush) [lrange $tix_priv(grab-nopush) 0 end-1]
- set w [lindex $tix_priv(grab-list) end]
- set m [lindex $tix_priv(grab-list) end]
- set np [lindex $tix_priv(grab-nopush) end]
- if {$np == 1} {
- # We have a grab set by "grab"
- #
- set len [llength $tix_priv(grab-list)]
- if {$len > 1} {
- set tix_priv(grab-list) [lrange $tix_priv(grab-list) 0 end-1]
- set tix_priv(grab-mode) [lrange $tix_priv(grab-mode) 0 end-1]
- set tix_priv(grab-nopush) \
- [lrange $tix_priv(grab-nopush) 0 end-1]
- } else {
- set tix_priv(grab-list) ""
- set tix_priv(grab-mode) ""
- set tix_priv(grab-nopush) ""
- }
- }
- if {$m == "-global"} {
- grab -global $w
- } else {
- grab $w
- }
- } else {
- set tix_priv(grab-list) ""
- set tix_priv(grab-mode) ""
- set tix_priv(grab-nopush) ""
- }
- }
- proc tixWithinWindow {wid rootX rootY} {
- set wc [winfo containing $rootX $rootY]
- if {$wid eq $wc} { return 1 }
- # no see if it is an enclosing parent
- set rx1 [winfo rootx $wid]
- set ry1 [winfo rooty $wid]
- set rw [winfo width $wid]
- set rh [winfo height $wid]
- set rx2 [expr {$rx1+$rw}]
- set ry2 [expr {$ry1+$rh}]
- if {$rootX >= $rx1 && $rootX < $rx2 && $rootY >= $ry1 && $rootY < $ry2} {
- return 1
- } else {
- return 0
- }
- }
- proc tixWinWidth {w} {
- set W [winfo width $w]
- set bd [expr {[$w cget -bd] + [$w cget -highlightthickness]}]
- return [expr {$W - 2*$bd}]
- }
- proc tixWinHeight {w} {
- set H [winfo height $w]
- set bd [expr {[$w cget -bd] + [$w cget -highlightthickness]}]
- return [expr {$H - 2*$bd}]
- }
- # junk?
- #
- proc tixWinCmd {w} {
- return [winfo command $w]
- }
|