WJG 24-Oct-2005
############################################ # text_drag.tcl # ------------------------ # Written by: William J Giddings # 24th October, 2005 ############################################ # Description: # ----------- # Rudimentary drag of selected text from one # location to another. # # Procedures: # ----------- # text_drag::init # # Note: # ---- # This code sample does not handle formatting tags. # One possible solution to this would be to include ttd. ############################################ set run_demo yes namespace eval text_drag { set dragstring () } #--------------- # a single proc to add new bindings #--------------- proc text_drag::init {w} { # grab the text $w tag bind sel <Button-2> { set text_drag::dragstring [%W get sel.first sel.last] } # and drop it bind $w <ButtonRelease-2> { if {$::text_drag::dragstring != ""} { %W delete sel.first sel.last %W insert @%x,%y $::text_drag::dragstring # move insert to end of the dragged selection %W mark set insert @%x,%y set tmp [%W index insert] %W mark set insert "$tmp + [string length $::text_drag::dragstring]c" # clear the dragged text set ::text_drag::dragstring "" } } } #--------------- # the ubiqitous demo #--------------- proc demo {} { text .txt pack .txt ::text_drag::init .txt } if {$run_demo} {demo}
ttd by Bryan Oakley '..is some experimental code investigating the possibility of defining a new file format capable of storing the contents of a Tk text widget.' Well recommended. I use it all the time.
WJG (28/Apr/2006) Here's a re-work of the above code. This time Button-1 can be used for the drag operations rather than Button-2. Also, the cursor changes from 'Xterm' to 'Arrow' when dragging the text around.
############################################ # text_drag.tcl # ------------------------ # Written by: William J Giddings # 28/Apr/2006 ############################################ # Description: # ----------- # Rudimentary drag of selected text from one # location to another. # # Procedures: # ----------- # drag # # Note: # ---- # This code sample does not handle formatting tags. # One possible solution to this would be to include ttd. ############################################ namespace eval drag { set dragstring {} set drag 0 set first 0 set last 0 set old_cursor {} # set tag colour settings for specific platforms switch $tcl_platform(platform) { macintosh - windows { set fg systemHighlightText set bg systemHighlight } unix { set fg selectBackground set bg selectForeground } } } #--------------- # a single proc to add new bindings #--------------- proc drag {w} { # if we're in 'drag' mode, prevent any new selection bind $w <B1-Motion> { if {$drag::drag == 1} { break } } # remark the text selection and modify cursor $w tag bind sel <Button-1> { set drag::dragstring [%W get sel.first sel.last] set drag::first [%W index sel.first] set drag::last [%W index sel.last] %W tag add drag sel.first sel.last # give the impression that the selection is still applied %W tag configure drag \ -background $::drag::bg \ -foreground $::drag::fg selection clear set drag::drag 1 set drag::old_cursor [%W cget -cursor] %W configure -cursor arrow } # move the selected text to the new location, reset cursor bind $w <ButtonRelease-1> { # do nothing if released within the original selection range if {[lsearch [%W tag name insert] drag]} {return} if {$drag::drag==1} { set str [%W get $drag::first $drag::last] %W delete $drag::first $drag::last %W mark set insert @%x,%y set tmp [%W index insert] %W insert $tmp $str %W tag delete drag set drag::drag 0 %W configure -cursor $drag::old_cursor } } } #--------------- # the ubiquitous demo #--------------- if {$run_demo} { catch {console show} pack [text .txt] # attach drag bindings drag .txt } [WJG] (10/May/05) Modified the Button-Release binding.
Kite (27/July/09) Fixed some errors, add drag move animation. Now work the same as Editplus.
############################################ # text_drag.tcl # ------------------------ # Written by: William J Giddings # 28/Apr/2006 # Fixed by: Kitedriver # 27/July/2009 ############################################ # Description: # ----------- # Rudimentary drag of selected text from one # location to another. # # Procedures: # ----------- # drag # # Note: # ---- # This code sample does not handle formatting tags. # One possible solution to this would be to include ttd. ############################################ set run_demo yes namespace eval drag { set dragstring {} set drag 0 set first 0 set last 0 set old_cursor {} # set tag colour settings for specific platforms switch $tcl_platform(platform) { macintosh - windows { set fg systemHighlightText set bg systemHighlight } unix { set fg selectBackground set bg selectForeground } } } #--------------- # a single proc to add new bindings #--------------- proc drag {w} { # 當「點擊於選擇上」時, 「拖動」開始 # remark the text selection and modify cursor $w tag bind sel <Button-1> { puts dragbegin # 用「選擇」建立「拖動標籤」, 并染色 set drag::dragstring [%W get sel.first sel.last] ;# %W表示控件$w, tcl語法 set drag::first [%W index sel.first] set drag::last [%W index sel.last] %W tag add drag $drag::first $drag::last # give the impression that the selection is still applied %W tag configure drag \ -background $::drag::bg \ -foreground $::drag::fg selection clear # 更改「鼠標」 set drag::old_cursor [%W cget -cursor] %W configure -cursor arrow # 舉起「拖動旗子」 set drag::drag 1 } # 「拖動」時的定位, 動畫 # if we're in 'drag' mode, prevent any new selection bind $w <B1-Motion> { if {$drag::drag == 1} { puts dragmove # 移動「插入遊標」 %W mark set insert @%x,%y break } } # 「拖動」結束 # move the selected text to the new location, reset cursor bind $w <ButtonRelease-1> { if {$drag::drag==1} { puts dragend # 移動「插入遊標」 %W mark set insert @%x,%y # 如果於原有「拖動標籤」內, 取消「拖動」 # Cancel dragging if released within the original selection range if {[lsearch [%W tag names insert] drag]!=-1} { %W configure -cursor $drag::old_cursor %W tag delete drag set drag::drag 0 return } # 進行實際的「文本移動」 set str [%W get $drag::first $drag::last] %W delete $drag::first $drag::last %W insert [%W index insert] $str %W configure -cursor $drag::old_cursor %W tag delete drag set drag::drag 0 } } } #--------------- # the ubiquitous demo #--------------- if {$run_demo} { catch {console show} pack [text .txt] # attach drag bindings .txt insert 1.1 "hello world 1234567890" drag .txt }