1# 2# tkextlib/iwidgets/hierarchy.rb 3# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) 4# 5 6require 'tk' 7require 'tk/text' 8require 'tkextlib/iwidgets.rb' 9 10module Tk 11 module Iwidgets 12 class Hierarchy < Tk::Iwidgets::Scrolledwidget 13 end 14 end 15end 16 17class Tk::Iwidgets::Hierarchy 18 ItemConfCMD = ['tag'.freeze, 'configure'.freeze].freeze 19 include TkTextTagConfig 20 21 TkCommandNames = ['::iwidgets::hierarchy'.freeze].freeze 22 WidgetClassName = 'Hierarchy'.freeze 23 WidgetClassNames[WidgetClassName] ||= self 24 25 #################################### 26 27 include Tk::ValidateConfigure 28 29 class QueryCommand < TkValidateCommand 30 class ValidateArgs < TkUtil::CallbackSubst 31 KEY_TBL = [ [?n, ?s, :node], nil ] 32 PROC_TBL = [ [?s, TkComm.method(:string) ], nil ] 33 34=begin 35 # for Ruby m17n :: ?x --> String --> char-code ( getbyte(0) ) 36 KEY_TBL.map!{|inf| 37 if inf.kind_of?(Array) 38 inf[0] = inf[0].getbyte(0) if inf[0].kind_of?(String) 39 inf[1] = inf[1].getbyte(0) if inf[1].kind_of?(String) 40 end 41 inf 42 } 43 44 PROC_TBL.map!{|inf| 45 if inf.kind_of?(Array) 46 inf[0] = inf[0].getbyte(0) if inf[0].kind_of?(String) 47 end 48 inf 49 } 50=end 51 52 _setup_subst_table(KEY_TBL, PROC_TBL); 53 54 def self.ret_val(val) 55 val 56 end 57 end 58 59 def self._config_keys 60 # array of config-option key (string or symbol) 61 ['querycommand'] 62 end 63 end 64 65 class IndicatorCommand < TkValidateCommand 66 class ValidateArgs < TkUtil::CallbackSubst 67 KEY_TBL = [ 68 [ ?n, ?s, :node ], 69 [ ?s, ?b, :status ], 70 nil 71 ] 72 73 PROC_TBL = [ 74 [ ?s, TkComm.method(:string) ], 75 [ ?b, TkComm.method(:bool) ], 76 nil 77 ] 78 79=begin 80 # for Ruby m17n :: ?x --> String --> char-code ( getbyte(0) ) 81 KEY_TBL.map!{|inf| 82 if inf.kind_of?(Array) 83 inf[0] = inf[0].getbyte(0) if inf[0].kind_of?(String) 84 inf[1] = inf[1].getbyte(0) if inf[1].kind_of?(String) 85 end 86 inf 87 } 88 89 PROC_TBL.map!{|inf| 90 if inf.kind_of?(Array) 91 inf[0] = inf[0].getbyte(0) if inf[0].kind_of?(String) 92 end 93 inf 94 } 95=end 96 97 _setup_subst_table(KEY_TBL, PROC_TBL); 98 99 def self.ret_val(val) 100 val 101 end 102 end 103 104 def self._config_keys 105 # array of config-option key (string or symbol) 106 ['iconcommand', 'icondblcommand', 'imagedblcommand'] 107 end 108 end 109 110 class IconCommand < TkValidateCommand 111 class ValidateArgs < TkUtil::CallbackSubst 112 KEY_TBL = [ 113 [ ?n, ?s, :node ], 114 [ ?i, ?s, :icon ], 115 nil 116 ] 117 PROC_TBL = [ [ ?s, TkComm.method(:string) ], nil ] 118 119=begin 120 # for Ruby m17n :: ?x --> String --> char-code ( getbyte(0) ) 121 KEY_TBL.map!{|inf| 122 if inf.kind_of?(Array) 123 inf[0] = inf[0].getbyte(0) if inf[0].kind_of?(String) 124 inf[1] = inf[1].getbyte(0) if inf[1].kind_of?(String) 125 end 126 inf 127 } 128 129 PROC_TBL.map!{|inf| 130 if inf.kind_of?(Array) 131 inf[0] = inf[0].getbyte(0) if inf[0].kind_of?(String) 132 end 133 inf 134 } 135=end 136 137 _setup_subst_table(KEY_TBL, PROC_TBL); 138 139 def self.ret_val(val) 140 val 141 end 142 end 143 144 def self._config_keys 145 # array of config-option key (string or symbol) 146 ['dblclickcommand', 'imagecommand', 'selectcommand'] 147 end 148 end 149 150 def __validation_class_list 151 super() << QueryCommand << IndicatorCommand << IconCommand 152 end 153 154 Tk::ValidateConfigure.__def_validcmd(binding, QueryCommand) 155 Tk::ValidateConfigure.__def_validcmd(binding, IndicatorCommand) 156 Tk::ValidateConfigure.__def_validcmd(binding, IconCommand) 157 158 #################################### 159 160 def __boolval_optkeys 161 super() << 'alwaysquery' << 'expanded' << 'filter' 162 end 163 private :__boolval_optkeys 164 165 def __strval_optkeys 166 super() << 'markbackground' << 'markforeground' << 'textbackground' 167 end 168 private :__strval_optkeys 169 170 def __font_optkeys 171 super() << 'textfont' 172 end 173 private :__font_optkeys 174 175 def clear 176 tk_call(@path, 'clear') 177 self 178 end 179 180 def collapse(node) 181 tk_call(@path, 'collapse') 182 self 183 end 184 185 def current 186 tk_call(@path, 'current') 187 end 188 189 def draw(mode=None) 190 case mode 191 when None 192 # do nothing 193 when 'now', :now 194 mode = '-now' 195 when 'eventually', :eventually 196 mode = '-eventually' 197 when String, Symbol 198 mode = mode.to_s 199 mode = '-' << mode if mode[0] != ?- 200 end 201 tk_call(@path, 'draw', mode) 202 end 203 204 def expand(node) 205 tk_call(@path, 'expand', node) 206 self 207 end 208 209 def expanded?(node) 210 bool(tk_call(@path, 'expanded', node)) 211 end 212 213 def exp_state 214 list(tk_call(@path, 'expState')) 215 end 216 alias expand_state exp_state 217 alias expanded_list exp_state 218 219 def mark_clear 220 tk_call(@path, 'mark', 'clear') 221 self 222 end 223 def mark_add(*nodes) 224 tk_call(@path, 'mark', 'add', *nodes) 225 self 226 end 227 def mark_remove(*nodes) 228 tk_call(@path, 'mark', 'remove', *nodes) 229 self 230 end 231 def mark_get 232 list(tk_call(@path, 'mark', 'get')) 233 end 234 235 def refresh(node) 236 tk_call(@path, 'refresh', node) 237 self 238 end 239 240 def prune(node) 241 tk_call(@path, 'prune', node) 242 self 243 end 244 245 def selection_clear 246 tk_call(@path, 'selection', 'clear') 247 self 248 end 249 def selection_add(*nodes) 250 tk_call(@path, 'selection', 'add', *nodes) 251 self 252 end 253 def selection_remove(*nodes) 254 tk_call(@path, 'selection', 'remove', *nodes) 255 self 256 end 257 def selection_get 258 list(tk_call(@path, 'selection', 'get')) 259 end 260 261 def toggle(node) 262 tk_call(@path, 'toggle', node) 263 self 264 end 265 266 # based on Tk::Text widget 267 268 def bbox(index) 269 list(tk_send_without_enc('bbox', _get_eval_enc_str(index))) 270 end 271 272 def compare(idx1, op, idx2) 273 bool(tk_send_without_enc('compare', _get_eval_enc_str(idx1), 274 op, _get_eval_enc_str(idx2))) 275 end 276 277 def debug 278 bool(tk_send_without_enc('debug')) 279 end 280 def debug=(boolean) 281 tk_send_without_enc('debug', boolean) 282 #self 283 boolean 284 end 285 286 def delete(first, last=None) 287 tk_send_without_enc('delete', first, last) 288 self 289 end 290 291 def dlineinfo(index) 292 list(tk_send_without_enc('dlineinfo', _get_eval_enc_str(index))) 293 end 294 295 def get(*index) 296 _fromUTF8(tk_send_without_enc('get', *index)) 297 end 298 299 def index(index) 300 tk_send_without_enc('index', _get_eval_enc_str(index)) 301 end 302 303 def insert(index, chars, *tags) 304 if tags[0].kind_of? Array 305 # multiple chars-taglist argument :: str, [tag,...], str, [tag,...], ... 306 args = [chars] 307 while tags.size > 0 308 args << tags.shift.collect{|x|_get_eval_string(x)}.join(' ') # taglist 309 args << tags.shift if tags.size > 0 # chars 310 end 311 super(index, *args) 312 else 313 # single chars-taglist argument :: str, tag, tag, ... 314 if tags.size == 0 315 super(index, chars) 316 else 317 super(index, chars, tags.collect{|x|_get_eval_string(x)}.join(' ')) 318 end 319 end 320 end 321 322 def scan_mark(x, y) 323 tk_send_without_enc('scan', 'mark', x, y) 324 self 325 end 326 def scan_dragto(x, y) 327 tk_send_without_enc('scan', 'dragto', x, y) 328 self 329 end 330 def see(index) 331 tk_send_without_enc('see', index) 332 self 333 end 334 335 # based on tk/scrollable.rb 336 def xview(*index) 337 if index.size == 0 338 list(tk_send_without_enc('xview')) 339 else 340 tk_send_without_enc('xview', *index) 341 self 342 end 343 end 344 def xview_moveto(*index) 345 xview('moveto', *index) 346 end 347 def xview_scroll(*index) 348 xview('scroll', *index) 349 end 350 351 def yview(*index) 352 if index.size == 0 353 list(tk_send_without_enc('yview')) 354 else 355 tk_send_without_enc('yview', *index) 356 self 357 end 358 end 359 def yview_moveto(*index) 360 yview('moveto', *index) 361 end 362 def yview_scroll(*index) 363 yview('scroll', *index) 364 end 365end 366