123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505 |
- # -*- mode: TCL; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
- #
- # $Id: ResizeH.tcl,v 1.3 2001/12/09 05:04:02 idiscovery Exp $
- #
- # ResizeH.tcl --
- #
- # tixResizeHandle: A general purpose "resizing handle"
- # widget. You can use it to resize pictures, widgets, etc. When
- # using it to resize a widget, you can use the "attachwidget"
- # command to attach it to a widget and it will handle all the
- # events for you.
- #
- # Copyright (c) 1993-1999 Ioi Kim Lam.
- # Copyright (c) 2000-2001 Tix Project Group.
- #
- # See the file "license.terms" for information on usage and redistribution
- # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
- #
- #
- #
- tixWidgetClass tixResizeHandle {
- -classname TixResizeHandle
- -superclass tixVResize
- -method {
- attachwidget detachwidget hide show
- }
- -flag {
- -command -cursorfg -cursorbg -handlesize -hintcolor -hintwidth -x -y
- }
- -configspec {
- {-command command Command ""}
- {-cursorfg cursorFg CursorColor white}
- {-cursorbg cursorBg CursorColor red}
- {-handlesize handleSize HandleSize 6}
- {-hintcolor hintColor HintColor red}
- {-hintwidth hintWidth HintWidth 1}
- {-x x X 0}
- {-y y Y 0}
- }
- }
- proc tixResizeHandle:InitWidgetRec {w} {
- upvar #0 $w data
- tixChainMethod $w InitWidgetRec
- set data(shown) 0
- set data(widget) ""
- }
- proc tixResizeHandle:ConstructWidget {w} {
- upvar #0 $w data
- tixChainMethod $w ConstructWidget
- # Create the hints
- #
- set data(w_ht) $w:tix_priv_ht
- set data(w_hb) $w:tix_priv_hb
- set data(w_hl) $w:tix_priv_hl
- set data(w_hr) $w:tix_priv_hr
- frame $data(w_ht) -height $data(-hintwidth) -bg $data(-background)
- frame $data(w_hb) -height $data(-hintwidth) -bg $data(-background)
- frame $data(w_hl) -width $data(-hintwidth) -bg $data(-background)
- frame $data(w_hr) -width $data(-hintwidth) -bg $data(-background)
- # Create the corner resize handles
- #
- set data(w_r00) $w
- # Windows don't like this
- # $data(rootCmd) config\
- # -cursor "top_left_corner $data(-cursorbg) $data(-cursorfg)"
- $data(rootCmd) config -cursor top_left_corner
- set data(w_r01) $w:tix_priv_01
- set data(w_r10) $w:tix_priv_10
- set data(w_r11) $w:tix_priv_11
- frame $data(w_r01) -relief $data(-relief) -bd $data(-borderwidth) \
- -cursor "bottom_left_corner"\
- -bg $data(-background)
- frame $data(w_r10) -relief $data(-relief) -bd $data(-borderwidth) \
- -cursor "top_right_corner"\
- -bg $data(-background)
- frame $data(w_r11) -relief $data(-relief) -bd $data(-borderwidth) \
- -cursor "bottom_right_corner"\
- -bg $data(-background)
- # Create the border resize handles
- #
- set data(w_bt) $w:tix_priv_bt
- set data(w_bb) $w:tix_priv_bb
- set data(w_bl) $w:tix_priv_bl
- set data(w_br) $w:tix_priv_br
- frame $data(w_bt) -relief $data(-relief) -bd $data(-borderwidth) \
- -cursor "top_side"\
- -bg $data(-background)
- frame $data(w_bb) -relief $data(-relief) -bd $data(-borderwidth) \
- -cursor "bottom_side"\
- -bg $data(-background)
- frame $data(w_bl) -relief $data(-relief) -bd $data(-borderwidth) \
- -cursor "left_side"\
- -bg $data(-background)
- frame $data(w_br) -relief $data(-relief) -bd $data(-borderwidth) \
- -cursor "right_side"\
- -bg $data(-background)
- }
- proc tixResizeHandle:SetBindings {w} {
- upvar #0 $w data
- tixChainMethod $w SetBindings
- bind $data(w_r00) <1> \
- "tixResizeHandle:dragstart $w $data(w_r00) 1 %X %Y {1 1 -1 -1}"
- bind $data(w_r01) <1> \
- "tixResizeHandle:dragstart $w $data(w_r01) 1 %X %Y {1 0 -1 1}"
- bind $data(w_r10) <1> \
- "tixResizeHandle:dragstart $w $data(w_r10) 1 %X %Y {0 1 1 -1}"
- bind $data(w_r11) <1> \
- "tixResizeHandle:dragstart $w $data(w_r11) 1 %X %Y {0 0 1 1}"
- bind $data(w_bt) <1> \
- "tixResizeHandle:dragstart $w $data(w_bt) 1 %X %Y {0 1 0 -1}"
- bind $data(w_bb) <1> \
- "tixResizeHandle:dragstart $w $data(w_bb) 1 %X %Y {0 0 0 1}"
- bind $data(w_bl) <1> \
- "tixResizeHandle:dragstart $w $data(w_bl) 1 %X %Y {1 0 -1 0}"
- bind $data(w_br) <1> \
- "tixResizeHandle:dragstart $w $data(w_br) 1 %X %Y {0 0 1 0}"
- foreach win [list \
- $data(w_r00)\
- $data(w_r01)\
- $data(w_r10)\
- $data(w_r11)\
- $data(w_bt)\
- $data(w_bb)\
- $data(w_bl)\
- $data(w_br)\
- ] {
- bind $win <B1-Motion> "tixVResize:drag $w %X %Y"
- bind $win <ButtonRelease-1> "tixVResize:dragend $w $win 0 %X %Y"
- bind $win <Any-Escape> "tixVResize:dragend $w $win 1 0 0"
- }
- }
- #----------------------------------------------------------------------
- # Config Methods
- #----------------------------------------------------------------------
- proc tixResizeHandle:config-width {w value} {
- tixWidgetDoWhenIdle tixResizeHandle:ComposeWindow $w
- }
- proc tixResizeHandle:config-height {w value} {
- tixWidgetDoWhenIdle tixResizeHandle:ComposeWindow $w
- }
- proc tixResizeHandle:config-x {w value} {
- tixWidgetDoWhenIdle tixResizeHandle:ComposeWindow $w
- }
- proc tixResizeHandle:config-y {w value} {
- tixWidgetDoWhenIdle tixResizeHandle:ComposeWindow $w
- }
- #----------------------------------------------------------------------
- # Public Methods
- #----------------------------------------------------------------------
- proc tixResizeHandle:dragstart {w win depress rootx rooty mrect} {
- upvar #0 $w data
- set wx $data(-x)
- set wy $data(-y)
- set ww $data(-width)
- set wh $data(-height)
- tixVResize:dragstart $w $win $depress $rootx $rooty \
- [list $wx $wy $ww $wh] $mrect
- }
- # tixDeleteBindTag --
- #
- # Delete the bindtag(s) in the args list from the bindtags of the widget
- #
- proc tixDeleteBindTag {w args} {
- if {![winfo exists $w]} {
- return
- }
- set newtags ""
- foreach tag [bindtags $w] {
- if {[lsearch $args $tag] == -1} {
- lappend newtags $tag
- }
- }
- bindtags $w $newtags
- }
- proc tixAddBindTag {w args} {
- bindtags $w [concat [bindtags $w] $args]
- }
- proc tixResizeHandle:attachwidget {w widget args} {
- upvar #0 $w data
- set opt(-move) 0
- tixHandleOptions opt {-move} $args
- if {$data(widget) != ""} {
- tixDeleteBindTag $data(widget) TixResizeHandleTag:$w
- }
- set data(widget) $widget
- if {$data(widget) != ""} {
- # Just in case TixResizeHandleTag was already there
- tixDeleteBindTag $data(widget) TixResizeHandleTag:$w
- tixAddBindTag $data(widget) TixResizeHandleTag:$w
-
- set data(-x) [winfo x $data(widget)]
- set data(-y) [winfo y $data(widget)]
- set data(-width) [winfo width $data(widget)]
- set data(-height) [winfo height $data(widget)]
- tixResizeHandle:show $w
- tixResizeHandle:ComposeWindow $w
- # Now set the bindings
- #
- if {$opt(-move)} {
- bind TixResizeHandleTag:$w <1> \
- "tixResizeHandle:Attach $w %X %Y"
- bind TixResizeHandleTag:$w <B1-Motion> \
- "tixResizeHandle:BMotion $w %X %Y"
- bind TixResizeHandleTag:$w <Any-Escape> \
- "tixResizeHandle:BRelease $w 1 %X %Y"
- bind TixResizeHandleTag:$w <ButtonRelease-1>\
- "tixResizeHandle:BRelease $w 0 %X %Y"
- } else {
- # if "move" is false, then the widget won't be moved as a whole --
- # ResizeHandle will only move its sides
- bind TixResizeHandleTag:$w <1> {;}
- bind TixResizeHandleTag:$w <B1-Motion> {;}
- bind TixResizeHandleTag:$w <Any-Escape> {;}
- bind TixResizeHandleTag:$w <ButtonRelease-1> {;}
- }
- }
- }
- proc tixResizeHandle:detachwidget {w} {
- upvar #0 $w data
- if {$data(widget) != ""} {
- tixDeleteBindTag $data(widget) TixResizeHandleTag:$w
- }
- tixResizeHandle:hide $w
- }
- proc tixResizeHandle:show {w} {
- upvar #0 $w data
- set data(shown) 1
- raise $data(w_ht)
- raise $data(w_hb)
- raise $data(w_hl)
- raise $data(w_hr)
- raise $data(w_r00)
- raise $data(w_r01)
- raise $data(w_r10)
- raise $data(w_r11)
- raise $data(w_bt)
- raise $data(w_bb)
- raise $data(w_bl)
- raise $data(w_br)
- # tixCancleIdleTask tixResizeHandle:ComposeWindow $w
- tixResizeHandle:ComposeWindow $w
- }
- proc tixResizeHandle:hide {w} {
- upvar #0 $w data
- if {!$data(shown)} {
- return
- }
- set data(shown) 0
- place forget $data(w_r00)
- place forget $data(w_r01)
- place forget $data(w_r10)
- place forget $data(w_r11)
- place forget $data(w_bt)
- place forget $data(w_bb)
- place forget $data(w_bl)
- place forget $data(w_br)
- place forget $data(w_ht)
- place forget $data(w_hb)
- place forget $data(w_hl)
- place forget $data(w_hr)
- }
- proc tixResizeHandle:Destructor {w} {
- upvar #0 $w data
- if {$data(widget) != ""} {
- tixDeleteBindTag $data(widget) TixResizeHandleTag:$w
- }
- catch {destroy $data(w_r01)}
- catch {destroy $data(w_r10)}
- catch {destroy $data(w_r11)}
- catch {destroy $data(w_bt)}
- catch {destroy $data(w_bb)}
- catch {destroy $data(w_bl)}
- catch {destroy $data(w_br)}
- catch {destroy $data(w_ht)}
- catch {destroy $data(w_hb)}
- catch {destroy $data(w_hl)}
- catch {destroy $data(w_hr)}
- tixChainMethod $w Destructor
- }
- #----------------------------------------------------------------------
- # Private Methods Dealing With Attached Widgets
- #----------------------------------------------------------------------
- proc tixResizeHandle:Attach {w rx ry} {
- upvar #0 $w data
- tixResizeHandle:dragstart $w $data(widget) 0 $rx $ry {1 1 0 0}
- }
- proc tixResizeHandle:BMotion {w rx ry} {
- tixVResize:drag $w $rx $ry
- }
- proc tixResizeHandle:BRelease {w isAbort rx ry} {
- upvar #0 $w data
- tixVResize:dragend $w $data(widget) $isAbort $rx $ry
- }
- #----------------------------------------------------------------------
- # Private Methods
- #----------------------------------------------------------------------
- proc tixResizeHandle:DrawTmpLines {w} {
- upvar #0 $w data
- # I've seen this error - mike
- if {![info exists data(hf:x1)]} {return}
- set x1 $data(hf:x1)
- if {![info exists data(hf:y1)]} {return}
- set y1 $data(hf:y1)
- if {![info exists data(hf:x2)]} {return}
- set x2 $data(hf:x2)
- if {![info exists data(hf:y2)]} {return}
- set y2 $data(hf:y2)
- tixTmpLine $x1 $y1 $x2 $y1 $w
- tixTmpLine $x1 $y2 $x2 $y2 $w
- tixTmpLine $x1 $y1 $x1 $y2 $w
- tixTmpLine $x2 $y1 $x2 $y2 $w
- }
- # Place the hint frame to indicate the changes
- #
- proc tixResizeHandle:SetHintFrame {w x1 y1 width height} {
- upvar #0 $w data
- # The four sides of the window
- #
- set x2 [expr "$x1+$width"]
- set y2 [expr "$y1+$height"]
- set rx [winfo rootx [winfo parent $w]]
- set ry [winfo rooty [winfo parent $w]]
- incr x1 $rx
- incr y1 $ry
- incr x2 $rx
- incr y2 $ry
- if {[info exists data(hf:x1)]} {
- tixResizeHandle:DrawTmpLines $w
- }
- set data(hf:x1) $x1
- set data(hf:y1) $y1
- set data(hf:x2) $x2
- set data(hf:y2) $y2
- tixResizeHandle:DrawTmpLines $w
- }
- proc tixResizeHandle:ShowHintFrame {w} {
- upvar #0 $w data
- place forget $data(w_ht)
- place forget $data(w_hb)
- place forget $data(w_hl)
- place forget $data(w_hr)
- update
- }
- proc tixResizeHandle:HideHintFrame {w} {
- upvar #0 $w data
- tixResizeHandle:DrawTmpLines $w
- unset data(hf:x1)
- unset data(hf:y1)
- unset data(hf:x2)
- unset data(hf:y2)
- }
- proc tixResizeHandle:UpdateSize {w x y width height} {
- upvar #0 $w data
- set data(-x) $x
- set data(-y) $y
- set data(-width) $width
- set data(-height) $height
- tixResizeHandle:ComposeWindow $w
- if {$data(widget) != ""} {
- place $data(widget) -x $x -y $y -width $width -height $height
- }
- if {$data(-command) != ""} {
- eval $data(-command) $x $y $width $height
- }
- }
- proc tixResizeHandle:ComposeWindow {w} {
- upvar #0 $w data
- set px $data(-x)
- set py $data(-y)
- set pw $data(-width)
- set ph $data(-height)
- # Show the hint frames
- #
- set x1 $px
- set y1 $py
- set x2 [expr "$px+$pw"]
- set y2 [expr "$py+$ph"]
- place $data(w_ht) -x $x1 -y $y1 -width $pw -bordermode outside
- place $data(w_hb) -x $x1 -y $y2 -width $pw -bordermode outside
- place $data(w_hl) -x $x1 -y $y1 -height $ph -bordermode outside
- place $data(w_hr) -x $x2 -y $y1 -height $ph -bordermode outside
- # Set the four corner resize handles
- #
- set sz_2 [expr $data(-handlesize)/2]
- set x1 [expr "$px - $sz_2"]
- set y1 [expr "$py - $sz_2"]
- set x2 [expr "$px - $sz_2" + $pw]
- set y2 [expr "$py - $sz_2" + $ph]
- place $data(w_r00) -x $x1 -y $y1 \
- -width $data(-handlesize) -height $data(-handlesize)
- place $data(w_r01) -x $x1 -y $y2\
- -width $data(-handlesize) -height $data(-handlesize)
- place $data(w_r10) -x $x2 -y $y1\
- -width $data(-handlesize) -height $data(-handlesize)
- place $data(w_r11) -x $x2 -y $y2\
- -width $data(-handlesize) -height $data(-handlesize)
- # Set the four border resize handles
- #
- set mx [expr "$px + $pw/2 - $sz_2"]
- set my [expr "$py + $ph/2 - $sz_2"]
- place $data(w_bt) -x $mx -y $y1 \
- -width $data(-handlesize) -height $data(-handlesize)
- place $data(w_bb) -x $mx -y $y2 \
- -width $data(-handlesize) -height $data(-handlesize)
- place $data(w_bl) -x $x1 -y $my \
- -width $data(-handlesize) -height $data(-handlesize)
- place $data(w_br) -x $x2 -y $my \
- -width $data(-handlesize) -height $data(-handlesize)
- }
|