1# 2# tkextlib/tkDND/tkdnd.rb 3# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) 4# 5 6require 'tk' 7 8# call setup script for general 'tkextlib' libraries 9require 'tkextlib/setup.rb' 10 11# call setup script 12require 'tkextlib/tkDND/setup.rb' 13 14TkPackage.require('tkdnd') 15 16module Tk 17 module TkDND 18 PACKAGE_NAME = 'tkdnd'.freeze 19 def self.package_name 20 PACKAGE_NAME 21 end 22 23 def self.package_version 24 begin 25 TkPackage.require('tkdnd') 26 rescue 27 '' 28 end 29 end 30 31 class DND_Subst < TkUtil::CallbackSubst 32 KEY_TBL = [ 33 [ ?a, ?l, :actions ], 34 [ ?A, ?s, :action ], 35 [ ?b, ?L, :codes ], 36 [ ?c, ?s, :code ], 37 [ ?d, ?l, :descriptions ], 38 [ ?D, ?l, :data ], 39 [ ?L, ?l, :source_types ], 40 [ ?m, ?l, :modifiers ], 41 [ ?t, ?l, :types ], 42 [ ?T, ?s, :type ], 43 [ ?W, ?w, :widget ], 44 [ ?x, ?n, :x ], 45 [ ?X, ?n, :x_root ], 46 [ ?y, ?n, :y ], 47 [ ?Y, ?n, :y_root ], 48 nil 49 ] 50 51 PROC_TBL = [ 52 [ ?n, TkComm.method(:num_or_str) ], 53 [ ?s, TkComm.method(:string) ], 54 [ ?l, TkComm.method(:list) ], 55 [ ?L, TkComm.method(:simplelist) ], 56 [ ?w, TkComm.method(:window) ], 57 nil 58 ] 59 60=begin 61 # for Ruby m17n :: ?x --> String --> char-code ( getbyte(0) ) 62 KEY_TBL.map!{|inf| 63 if inf.kind_of?(Array) 64 inf[0] = inf[0].getbyte(0) if inf[0].kind_of?(String) 65 inf[1] = inf[1].getbyte(0) if inf[1].kind_of?(String) 66 end 67 inf 68 } 69 70 PROC_TBL.map!{|inf| 71 if inf.kind_of?(Array) 72 inf[0] = inf[0].getbyte(0) if inf[0].kind_of?(String) 73 end 74 inf 75 } 76=end 77 78 # setup tables 79 _setup_subst_table(KEY_TBL, PROC_TBL); 80 end 81 82 module DND 83 def self.version 84 begin 85 TkPackage.require('tkdnd') 86 rescue 87 '' 88 end 89 end 90 91 def dnd_bindtarget_info(type=nil, event=nil) 92 if event 93 procedure(tk_call('dnd', 'bindtarget', @path, type, event)) 94 elsif type 95 procedure(tk_call('dnd', 'bindtarget', @path, type)) 96 else 97 simplelist(tk_call('dnd', 'bindtarget', @path)) 98 end 99 end 100 101 #def dnd_bindtarget(type, event, cmd=Proc.new, prior=50, *args) 102 # event = tk_event_sequence(event) 103 # if prior.kind_of?(Numeric) 104 # tk_call('dnd', 'bindtarget', @path, type, event, 105 # install_bind_for_event_class(DND_Subst, cmd, *args), 106 # prior) 107 # else 108 # tk_call('dnd', 'bindtarget', @path, type, event, 109 # install_bind_for_event_class(DND_Subst, cmd, prior, *args)) 110 # end 111 # self 112 #end 113 def dnd_bindtarget(type, event, *args) 114 # if args[0].kind_of?(Proc) || args[0].kind_of?(Method) 115 if TkComm._callback_entry?(args[0]) || !block_given? 116 cmd = args.shift 117 else 118 cmd = Proc.new 119 end 120 121 prior = 50 122 prior = args.shift unless args.empty? 123 124 event = tk_event_sequence(event) 125 if prior.kind_of?(Numeric) 126 tk_call('dnd', 'bindtarget', @path, type, event, 127 install_bind_for_event_class(DND_Subst, cmd, *args), 128 prior) 129 else 130 tk_call('dnd', 'bindtarget', @path, type, event, 131 install_bind_for_event_class(DND_Subst, cmd, prior, *args)) 132 end 133 self 134 end 135 136 def dnd_cleartarget 137 tk_call('dnd', 'cleartarget', @path) 138 self 139 end 140 141 def dnd_bindsource_info(type=nil) 142 if type 143 procedure(tk_call('dnd', 'bindsource', @path, type)) 144 else 145 simplelist(tk_call('dnd', 'bindsource', @path)) 146 end 147 end 148 149 #def dnd_bindsource(type, cmd=Proc.new, prior=None) 150 # tk_call('dnd', 'bindsource', @path, type, cmd, prior) 151 # self 152 #end 153 def dnd_bindsource(type, *args) 154 # if args[0].kind_of?(Proc) || args[0].kind_of?(Method) 155 if TkComm._callback_entry?(args[0]) || !block_given? 156 cmd = args.shift 157 else 158 cmd = Proc.new 159 end 160 161 args = [None] if args.empty 162 163 tk_call('dnd', 'bindsource', @path, type, cmd, *args) 164 self 165 end 166 167 def dnd_clearsource() 168 tk_call('dnd', 'clearsource', @path) 169 self 170 end 171 172 def dnd_drag(keys=nil) 173 tk_call('dnd', 'drag', @path, *hash_kv(keys)) 174 self 175 end 176 end 177 end 178end 179 180class TkWindow 181 include Tk::TkDND::DND 182end 183