source: trunk/BWidget-1.2.1/dragsite.tcl @ 931

Last change on this file since 931 was 931, checked in by toby, 11 years ago

include rest of files

File size: 6.1 KB
RevLine 
[931]1# ------------------------------------------------------------------------------
2#  dragsite.tcl
3#  This file is part of Unifix BWidget Toolkit
4#  $Id: dragsite.tcl,v 1.7 1999/07/09 08:10:29 eric Exp $
5# ------------------------------------------------------------------------------
6#  Index of commands:
7#     - DragSite::include
8#     - DragSite::setdrag
9#     - DragSite::register
10#     - DragSite::_begin_drag
11#     - DragSite::_init_drag
12#     - DragSite::_end_drag
13#     - DragSite::_update_operation
14# ------------------------------------------------------------------------------
15
16namespace eval DragSite {
17    Widget::declare DragSite {
18        {-dragevent     Enum   1  0 {1 2 3}}
19        {-draginitcmd   String "" 0}
20        {-dragendcmd    String "" 0}
21    }
22
23    variable _topw ".drag"
24    variable _tabops
25    variable _state
26    variable _x0
27    variable _y0
28
29    bind BwDrag1 <ButtonPress-1> {DragSite::_begin_drag press  %W %s %X %Y}
30    bind BwDrag1 <B1-Motion>     {DragSite::_begin_drag motion %W %s %X %Y}
31    bind BwDrag2 <ButtonPress-2> {DragSite::_begin_drag press  %W %s %X %Y}
32    bind BwDrag2 <B2-Motion>     {DragSite::_begin_drag motion %W %s %X %Y}
33    bind BwDrag3 <ButtonPress-3> {DragSite::_begin_drag press  %W %s %X %Y}
34    bind BwDrag3 <B3-Motion>     {DragSite::_begin_drag motion %W %s %X %Y}
35
36    proc use {} {}
37}
38
39
40# ------------------------------------------------------------------------------
41#  Command DragSite::include
42# ------------------------------------------------------------------------------
43proc DragSite::include { class type event } {
44    set dragoptions {
45        {-dragenabled Boolean 0  0}
46        {-draginitcmd String  "" 0}
47        {-dragendcmd  String  "" 0}
48    }
49    lappend dragoptions \
50        [list -dragtype  String $type  0] \
51        [list -dragevent Enum   $event 0 {1 2 3}]
52    Widget::declare $class $dragoptions
53}
54
55
56# ------------------------------------------------------------------------------
57#  Command DragSite::setdrag
58#  Widget interface to register
59# ------------------------------------------------------------------------------
60proc DragSite::setdrag { path subpath initcmd endcmd {force 0}} {
61    set cen       [Widget::hasChanged $path -dragenabled en]
62    set cdragevt  [Widget::hasChanged $path -dragevent   dragevt]
63    if { $en } {
64        if { $force || $cen || $cdragevt } {
65            register $subpath \
66                -draginitcmd $initcmd \
67                -dragendcmd  $endcmd  \
68                -dragevent   $dragevt
69        }
70    } else {
71        register $subpath
72    }
73}
74
75
76# ------------------------------------------------------------------------------
77#  Command DragSite::register
78# ------------------------------------------------------------------------------
79proc DragSite::register { path args } {
80    upvar \#0 DragSite::$path drag
81
82    if { [info exists drag] } {
83        bind $path $drag(evt) {}
84        unset drag
85    }
86    Widget::init DragSite .drag$path $args
87    set event   [Widget::getoption .drag$path -dragevent]
88    set initcmd [Widget::getoption .drag$path -draginitcmd]
89    set endcmd  [Widget::getoption .drag$path -dragendcmd]
90    set tags    [bindtags $path]
91    set idx     [lsearch $tags "BwDrag*"]
92    Widget::destroy .drag$path
93    if { $initcmd != "" } {
94        if { $idx != -1 } {
95            bindtags $path [lreplace $tags $idx $idx BwDrag$event]
96        } else {
97            bindtags $path [concat $tags BwDrag$event]
98        }
99        set drag(initcmd) $initcmd
100        set drag(endcmd)  $endcmd
101        set drag(evt)     $event
102    } elseif { $idx != -1 } {
103        bindtags $path [lreplace $tags $idx $idx]
104    }
105}
106
107
108# ------------------------------------------------------------------------------
109#  Command DragSite::_begin_drag
110# ------------------------------------------------------------------------------
111proc DragSite::_begin_drag { event source state X Y } {
112    variable _x0
113    variable _y0
114    variable _state
115
116    switch -- $event {
117        press {
118            set _x0    $X
119            set _y0    $Y
120            set _state "press"
121        }
122        motion {
123            if { ![string compare $_state "press"] } {
124                if { abs($_x0-$X) > 3 || abs($_y0-$Y) > 3 } {
125                    set _state "done"
126                    _init_drag $source $state $X $Y
127                }
128            }
129        }
130    }
131}
132
133
134# ------------------------------------------------------------------------------
135#  Command DragSite::_init_drag
136# ------------------------------------------------------------------------------
137proc DragSite::_init_drag { source state X Y } {
138    variable _topw
139    upvar \#0 DragSite::$source drag
140
141    destroy  $_topw
142    toplevel $_topw
143    wm withdraw $_topw
144    wm overrideredirect $_topw 1
145
146    set info [uplevel \#0 $drag(initcmd) [list $source $X $Y .drag]]
147    if { $info != "" } {
148        set type [lindex $info 0]
149        set ops  [lindex $info 1]
150        set data [lindex $info 2]
151
152        if { [winfo children $_topw] == "" } {
153            if { ![string compare $type "BITMAP"] || ![string compare $type "IMAGE"] } {
154                label $_topw.l -image [Bitmap::get dragicon] -relief flat -bd 0
155            } else {
156                label $_topw.l -image [Bitmap::get dragfile] -relief flat -bd 0
157            }
158            pack  $_topw.l
159        }
160        wm geometry $_topw +[expr $X+1]+[expr $Y+1]
161        wm deiconify $_topw
162        tkwait visibility $_topw
163        BWidget::grab  set $_topw
164        BWidget::focus set $_topw
165
166        bindtags $_topw [list $_topw DragTop]
167        DropSite::_init_drag $_topw $drag(evt) $source $state $X $Y $type $ops $data
168    } else {
169        destroy $_topw
170    }
171}
172
173
174# ------------------------------------------------------------------------------
175#  Command DragSite::_end_drag
176# ------------------------------------------------------------------------------
177proc DragSite::_end_drag { source target op type data result } {
178    variable _topw
179    upvar \#0 DragSite::$source drag
180
181    BWidget::grab  release $_topw
182    BWidget::focus release $_topw
183    destroy $_topw
184    if { $drag(endcmd) != "" } {
185        uplevel \#0 $drag(endcmd) [list $source $target $op $type $data $result]
186    }
187}
188
189
Note: See TracBrowser for help on using the repository browser.