1# 2# tkextlib/treectrl/tktreectrl.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/treectrl/setup.rb' 13 14# TkPackage.require('treectrl', '1.0') 15# TkPackage.require('treectrl', '1.1') 16TkPackage.require('treectrl') 17 18module Tk 19 class TreeCtrl < TkWindow 20 BindTag_FileList = TkBindTag.new_by_name('TreeCtrlFileList') 21 22 PACKAGE_NAME = 'treectrl'.freeze 23 def self.package_name 24 PACKAGE_NAME 25 end 26 27 def self.package_version 28 begin 29 TkPackage.require('treectrl') 30 rescue 31 '' 32 end 33 end 34 35 HasColumnCreateCommand = 36 (TkPackage.vcompare(self.package_version, '1.1') >= 0) 37 38 # dummy :: 39 # pkgIndex.tcl of TreeCtrl-1.0 doesn't support auto_load for 40 # 'loupe' command (probably it is bug, I think). 41 # So, calling a 'treectrl' command for loading the dll with 42 # the auto_load facility. 43 begin 44 tk_call('treectrl') 45 rescue 46 end 47 def self.loupe(img, x, y, w, h, zoom) 48 # NOTE: platform == 'unix' only 49 50 # img => TkPhotoImage 51 # x, y => screen coords 52 # w, h => magnifier width and height 53 # zoom => zooming rate 54 Tk.tk_call_without_enc('loupe', img, x, y, w, h, zoom) 55 end 56 57 def self.text_layout(font, text, keys={}) 58 TkComm.list(Tk.tk_call_without_enc('textlayout', font, text, keys)) 59 end 60 61 def self.image_tint(img, color, alpha) 62 Tk.tk_call_without_enc('imagetint', img, color, alpha) 63 end 64 65 class NotifyEvent < TkUtil::CallbackSubst 66 end 67 68 module ConfigMethod 69 end 70 end 71 TreeCtrl_Widget = TreeCtrl 72end 73 74############################################## 75 76class Tk::TreeCtrl::NotifyEvent 77 # [ <'%' subst-key char>, <proc type char>, <instance var (accessor) name>] 78 KEY_TBL = [ 79 [ ?c, ?n, :item_num ], 80 [ ?d, ?s, :detail ], 81 [ ?D, ?l, :items ], 82 [ ?e, ?e, :event ], 83 [ ?I, ?n, :id ], 84 [ ?l, ?n, :lower_bound ], 85 [ ?p, ?n, :active_id ], 86 [ ?P, ?e, :pattern ], 87 [ ?S, ?l, :sel_items ], 88 [ ?T, ?w, :widget ], 89 [ ?u, ?n, :upper_bound ], 90 [ ?W, ?o, :object ], 91 [ ??, ?x, :parm_info ], 92 nil 93 ] 94 95 # [ <proc type char>, <proc/method to convert tcl-str to ruby-obj>] 96 PROC_TBL = [ 97 [ ?n, TkComm.method(:num_or_str) ], 98 [ ?s, TkComm.method(:string) ], 99 [ ?l, TkComm.method(:list) ], 100 [ ?w, TkComm.method(:window) ], 101 102 [ ?e, proc{|val| 103 case val 104 when /^<<[^<>]+>>$/ 105 TkVirtualEvent.getobj(val[1..-2]) 106 when /^<[^<>]+>$/ 107 val[1..-2] 108 else 109 val 110 end 111 } 112 ], 113 114 [ ?o, proc{|val| TkComm.tk_tcl2ruby(val)} ], 115 116 [ ?x, proc{|val| 117 begin 118 inf = {} 119 Hash[*(TkComm.list(val))].each{|k, v| 120 if keyinfo = KEY_TBL.assoc(k[0]) 121 if cmd = PROC_TBL.assoc(keyinfo[1]) 122 begin 123 new_v = cmd.call(v) 124 v = new_v 125 rescue 126 end 127 end 128 end 129 inf[k] = v 130 } 131 inf 132 rescue 133 val 134 end 135 } ], 136 137 nil 138 ] 139 140=begin 141 # for Ruby m17n :: ?x --> String --> char-code ( getbyte(0) ) 142 KEY_TBL.map!{|inf| 143 if inf.kind_of?(Array) 144 inf[0] = inf[0].getbyte(0) if inf[0].kind_of?(String) 145 inf[1] = inf[1].getbyte(0) if inf[1].kind_of?(String) 146 end 147 inf 148 } 149 150 PROC_TBL.map!{|inf| 151 if inf.kind_of?(Array) 152 inf[0] = inf[0].getbyte(0) if inf[0].kind_of?(String) 153 end 154 inf 155 } 156=end 157 158 # setup tables to be used by scan_args, _get_subst_key, _get_all_subst_keys 159 # 160 # _get_subst_key() and _get_all_subst_keys() generates key-string 161 # which describe how to convert callback arguments to ruby objects. 162 # When binding parameters are given, use _get_subst_key(). 163 # But when no parameters are given, use _get_all_subst_keys() to 164 # create a Event class object as a callback parameter. 165 # 166 # scan_args() is used when doing callback. It convert arguments 167 # ( which are Tcl strings ) to ruby objects based on the key string 168 # that is generated by _get_subst_key() or _get_all_subst_keys(). 169 # 170 _setup_subst_table(KEY_TBL, PROC_TBL); 171end 172 173############################################## 174 175module Tk::TreeCtrl::ConfigMethod 176 include TkItemConfigMethod 177 178 def treectrl_tagid(key, obj) 179 if key.kind_of?(Array) 180 key = key.join(' ') 181 else 182 key = key.to_s 183 end 184 185 if (obj.kind_of?(Tk::TreeCtrl::Column) || 186 obj.kind_of?(Tk::TreeCtrl::Element) || 187 obj.kind_of?(Tk::TreeCtrl::Item) || 188 obj.kind_of?(Tk::TreeCtrl::Style)) 189 obj = obj.id 190 end 191 192 case key 193 when 'column' 194 obj 195 196 when 'debug' 197 None 198 199 when 'dragimage' 200 None 201 202 when 'element' 203 obj 204 205 when 'item element' 206 obj 207 208 when 'marquee' 209 None 210 211 when 'notify' 212 obj 213 214 when 'style' 215 obj 216 217 else 218 obj 219 end 220 end 221 222 def tagid(mixed_id) 223 if mixed_id == 'debug' 224 ['debug', None] 225 elsif mixed_id == 'dragimage' 226 ['dragimage', None] 227 elsif mixed_id == 'marquee' 228 ['marquee', None] 229 elsif mixed_id.kind_of?(Array) 230 [mixed_id[0], treectrl_tagid(*mixed_id)] 231 else 232 tagid(mixed_id.split(':')) 233 end 234 end 235 236 def __item_cget_cmd(mixed_id) 237 if mixed_id[0] == 'column' && mixed_id[1] == 'drag' 238 return [self.path, 'column', 'dragcget'] 239 end 240 241 if mixed_id[1].kind_of?(Array) 242 id = mixed_id[1] 243 else 244 id = [mixed_id[1]] 245 end 246 247 if mixed_id[0].kind_of?(Array) 248 ([self.path].concat(mixed_id[0]) << 'cget').concat(id) 249 else 250 [self.path, mixed_id[0], 'cget'].concat(id) 251 end 252 end 253 private :__item_cget_cmd 254 255 def __item_config_cmd(mixed_id) 256 if mixed_id[0] == 'column' && mixed_id[1] == 'drag' 257 return [self.path, 'column', 'dragconfigure'] 258 end 259 260 if mixed_id[1].kind_of?(Array) 261 id = mixed_id[1] 262 else 263 id = [mixed_id[1]] 264 end 265 266 if mixed_id[0].kind_of?(Array) 267 ([self.path].concat(mixed_id[0]) << 'configure').concat(id) 268 else 269 [self.path, mixed_id[0], 'configure'].concat(id) 270 end 271 end 272 private :__item_config_cmd 273 274 def __item_pathname(id) 275 if id.kind_of?(Array) 276 key = id[0] 277 if key.kind_of?(Array) 278 key = key.join(' ') 279 end 280 281 tag = id[1] 282 if tag.kind_of?(Array) 283 tag = tag.join(' ') 284 end 285 286 id = [key, tag].join(':') 287 end 288 [self.path, id].join(';') 289 end 290 private :__item_pathname 291 292 def __item_configinfo_struct(id) 293 if id.kind_of?(Array) && id[0].to_s == 'notify' 294 {:key=>0, :alias=>nil, :db_name=>nil, :db_class=>nil, 295 :default_value=>nil, :current_value=>1} 296 else 297 {:key=>0, :alias=>1, :db_name=>1, :db_class=>2, 298 :default_value=>3, :current_value=>4} 299 end 300 end 301 private :__item_configinfo_struct 302 303 304 def __item_font_optkeys(id) 305 if id.kind_of?(Array) && (id[0] == 'element' || 306 (id[0].kind_of?(Array) && id[0][1] == 'element')) 307 [] 308 else 309 ['font'] 310 end 311 end 312 private :__item_font_optkeys 313 314 def __item_numstrval_optkeys(id) 315 if id == 'debug' 316 ['displaydelay'] 317 else 318 super(id) 319 end 320 end 321 private :__item_numstrval_optkeys 322 323 def __item_boolval_optkeys(id) 324 if id == 'debug' 325 ['data', 'display', 'enable', 'span', 'textlayout'] 326 elsif id == 'dragimage' 327 ['visible'] 328 elsif id == 'marquee' 329 ['visible'] 330 elsif id.kind_of?(Array) 331 case id[0] 332 when 'item' 333 ['visible', 'wrap', 'open', 'returnid', 'visible'] 334 when 'column' 335 if id[1] == 'drag' 336 ['enable'] 337 else 338 ['button', 'expand', 'resize', 'squeeze', 'sunken', 339 'visible', 'widthhack'] 340 end 341 when 'element' 342 ['draw', 'filled', 'showfocus', 'clip', 'destroy'] 343 when 'notify' 344 ['active'] 345 when 'style' 346 ['detach', 'indent', 'visible'] 347 else 348 if id[0].kind_of?(Array) && id[0][1] == 'element' 349 ['filled', 'showfocus'] 350 else 351 super(id) 352 end 353 end 354 else 355 super(id) 356 end 357 end 358 private :__item_boolval_optkeys 359 360 def __item_strval_optkeys(id) 361 if id == 'debug' 362 ['erasecolor'] 363 elsif id.kind_of?(Array) 364 case id[0] 365 when 'column' 366 if id[1] == 'drag' 367 ['indicatorcolor'] 368 else 369 super(id) << 'textcolor' 370 end 371 when 'element' 372 super(id) << 'fill' << 'outline' << 'format' 373 else 374 super(id) 375 end 376 else 377 super(id) 378 end 379 end 380 private :__item_strval_optkeys 381 382 def __item_listval_optkeys(id) 383 if id.kind_of?(Array) 384 case id[0] 385 when 'column' 386 ['itembackground'] 387 when 'element' 388 ['relief'] 389 when 'style' 390 ['union'] 391 else 392 if id[0].kind_of?(Array) && id[0][1] == 'element' 393 ['relief'] 394 else 395 [] 396 end 397 end 398 else 399 [] 400 end 401 end 402 private :__item_listval_optkeys 403 404 def __item_val2ruby_optkeys(id) 405 if id.kind_of?(Array) 406 case id[0] 407 when 'item' 408 { 'button' => proc{|id,val| (val == 'auto')? val: TkComm.bool(val)} } 409 else 410 [] 411 end 412 else 413 [] 414 end 415 end 416 private :__item_val2ruby_optkeys 417 418 def __item_keyonly_optkeys(id) # { def_key=>(undef_key|nil), ... } 419 { 420 'notreally'=>nil, 421 'increasing'=>'decreasing', 422 'decreasing'=>'increasing', 423 'ascii'=>nil, 424 'dictionary'=>nil, 425 'integer'=>nil, 426 'real'=>nil 427 } 428 end 429 private :__item_keyonly_optkeys 430 431 def column_cget_tkstring(tagOrId, option) 432 itemcget_tkstring(['column', tagOrId], option) 433 end 434 def column_cget(tagOrId, option) 435 itemcget(['column', tagOrId], option) 436 end 437 def column_cget_strict(tagOrId, option) 438 itemcget_strict(['column', tagOrId], option) 439 end 440 def column_configure(tagOrId, slot, value=None) 441 itemconfigure(['column', tagOrId], slot, value) 442 end 443 def column_configinfo(tagOrId, slot=nil) 444 itemconfiginfo(['column', tagOrId], slot) 445 end 446 def current_column_configinfo(tagOrId, slot=nil) 447 current_itemconfiginfo(['column', tagOrId], slot) 448 end 449 450 def column_dragcget_tkstring(option) 451 itemcget_tkstring(['column', 'drag'], option) 452 end 453 def column_dragcget(option) 454 itemcget(['column', 'drag'], option) 455 end 456 def column_dragcget_strict(option) 457 itemcget_strict(['column', 'drag'], option) 458 end 459 def column_dragconfigure(slot, value=None) 460 itemconfigure(['column', 'drag'], slot, value) 461 end 462 def column_dragconfiginfo(slot=nil) 463 itemconfiginfo(['column', 'drag'], slot) 464 end 465 def current_column_dragconfiginfo(slot=nil) 466 current_itemconfiginfo(['column', 'drag'], slot) 467 end 468 469 def debug_cget_tkstring(option) 470 itemcget_tkstring('debug', option) 471 end 472 def debug_cget(option) 473 itemcget('debug', option) 474 end 475 def debug_cget_strict(option) 476 itemcget_strict('debug', option) 477 end 478 def debug_configure(slot, value=None) 479 itemconfigure('debug', slot, value) 480 end 481 def debug_configinfo(slot=nil) 482 itemconfiginfo('debug', slot) 483 end 484 def current_debug_configinfo(slot=nil) 485 current_itemconfiginfo('debug', slot) 486 end 487 488 def dragimage_cget_tkstring(option) 489 itemcget_tkstring('dragimage', option) 490 end 491 def dragimage_cget(option) 492 itemcget('dragimage', option) 493 end 494 def dragimage_cget_strict(option) 495 itemcget_strict('dragimage', option) 496 end 497 def dragimage_configure(slot, value=None) 498 itemconfigure('dragimage', slot, value) 499 end 500 def dragimage_configinfo(slot=nil) 501 itemconfiginfo('dragimage', slot) 502 end 503 def current_dragimage_configinfo(slot=nil) 504 current_itemconfiginfo('dragimage', slot) 505 end 506 507 def element_cget_tkstring(tagOrId, option) 508 itemcget_tkstring(['element', tagOrId], option) 509 end 510 def element_cget(tagOrId, option) 511 itemcget(['element', tagOrId], option) 512 end 513 def element_cget_strict(tagOrId, option) 514 itemcget_strict(['element', tagOrId], option) 515 end 516 def element_configure(tagOrId, slot, value=None) 517 itemconfigure(['element', tagOrId], slot, value) 518 end 519 def element_configinfo(tagOrId, slot=nil) 520 itemconfiginfo(['element', tagOrId], slot) 521 end 522 def current_element_configinfo(tagOrId, slot=nil) 523 current_itemconfiginfo(['element', tagOrId], slot) 524 end 525 526 def item_cget_tkstring(tagOrId, option) 527 itemcget_tkstring(['item', tagOrId], option) 528 end 529 def item_cget(tagOrId, option) 530 itemcget(['item', tagOrId], option) 531 end 532 def item_cget_strict(tagOrId, option) 533 itemcget_strict(['item', tagOrId], option) 534 end 535 def item_configure(tagOrId, slot, value=None) 536 itemconfigure(['item', tagOrId], slot, value) 537 end 538 def item_configinfo(tagOrId, slot=nil) 539 itemconfiginfo(['item', tagOrId], slot) 540 end 541 def current_item_configinfo(tagOrId, slot=nil) 542 current_itemconfiginfo(['item', tagOrId], slot) 543 end 544 545 def item_element_cget_tkstring(item, column, elem, option) 546 itemcget_tkstring([['item', 'element'], [item, column, elem]], option) 547 end 548 def item_element_cget(item, column, elem, option) 549 itemcget([['item', 'element'], [item, column, elem]], option) 550 end 551 def item_element_cget_strict(item, column, elem, option) 552 itemcget_strict([['item', 'element'], [item, column, elem]], option) 553 end 554 def item_element_configure(item, column, elem, slot, value=None) 555 itemconfigure([['item', 'element'], [item, column, elem]], slot, value) 556 end 557 def item_element_configinfo(item, column, elem, slot=nil) 558 itemconfiginfo([['item', 'element'], [item, column, elem]], slot) 559 end 560 def current_item_element_configinfo(item, column, elem, slot=nil) 561 current_itemconfiginfo([['item', 'element'], [item, column, elem]], slot) 562 end 563 564 def marquee_cget_tkstring(option) 565 itemcget_tkstring('marquee', option) 566 end 567 def marquee_cget(option) 568 itemcget('marquee', option) 569 end 570 def marquee_cget_strict(option) 571 itemcget_strict('marquee', option) 572 end 573 def marquee_configure(slot, value=None) 574 itemconfigure('marquee', slot, value) 575 end 576 def marquee_configinfo(slot=nil) 577 itemconfiginfo('marquee', slot) 578 end 579 def current_marquee_configinfo(slot=nil) 580 current_itemconfiginfo('marquee', slot) 581 end 582 583 def notify_cget_tkstring(win, pattern, option) 584 pattern = "<#{pattern}>" 585 # "notify" doesn't have cget subcommand. 586 tk_split_simplelist(tk_call_without_enc(*(__item_confinfo_cmd(tagid(['notify', [win, pattern]])) << "-#{option}")), false, true)[-1] 587 end 588 def notify_cget(win, pattern, option) 589 pattern = "<#{pattern}>" 590 # "notify" doesn't have cget subcommand. 591 current_itemconfiginfo(['notify', [win, pattern]])[option.to_s] 592 end 593 def notify_cget_strict(win, pattern, option) 594 pattern = "<#{pattern}>" 595 # "notify" doesn't have cget subcommand. 596 info = current_itemconfiginfo(['notify', [win, pattern]]) 597 option = option.to_s 598 unless info.has_key?(option) 599 fail RuntimeError, "unknown option \"#{option}\"" 600 else 601 info[option] 602 end 603 end 604 def notify_configure(win, pattern, slot, value=None) 605 pattern = "<#{pattern}>" 606 itemconfigure(['notify', [win, pattern]], slot, value) 607 end 608 def notify_configinfo(win, pattern, slot=nil) 609 pattern = "<#{pattern}>" 610 itemconfiginfo(['notify', [win, pattern]], slot) 611 end 612 def current_notify_configinfo(tagOrId, slot=nil) 613 pattern = "<#{pattern}>" 614 current_itemconfiginfo(['notify', [win, pattern]], slot) 615 end 616 617 def style_cget_tkstring(tagOrId, option) 618 itemcget_tkstring(['style', tagOrId], option) 619 end 620 def style_cget(tagOrId, option) 621 itemcget(['style', tagOrId], option) 622 end 623 def style_cget_strict(tagOrId, option) 624 itemcget_strict(['style', tagOrId], option) 625 end 626 def style_configure(tagOrId, slot, value=None) 627 itemconfigure(['style', tagOrId], slot, value) 628 end 629 def style_configinfo(tagOrId, slot=nil) 630 itemconfiginfo(['style', tagOrId], slot) 631 end 632 def current_style_configinfo(tagOrId, slot=nil) 633 current_itemconfiginfo(['style', tagOrId], slot) 634 end 635 636 private :itemcget_tkstring, :itemcget, :itemcget_strict 637 private :itemconfigure, :itemconfiginfo, :current_itemconfiginfo 638end 639 640############################################## 641 642class Tk::TreeCtrl 643 include Tk::TreeCtrl::ConfigMethod 644 include Scrollable 645 646 TkCommandNames = ['treectrl'.freeze].freeze 647 WidgetClassName = 'TreeCtrl'.freeze 648 WidgetClassNames[WidgetClassName] ||= self 649 650 ######################### 651 652 def __destroy_hook__ 653 Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL.mutex.synchronize{ 654 Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL.delete(@path) 655 } 656 Tk::TreeCtrl::Element::TreeCtrlElementID_TBL.mutex.synchronize{ 657 Tk::TreeCtrl::Element::TreeCtrlElementID_TBL.delete(@path) 658 } 659 Tk::TreeCtrl::Item::TreeCtrlItemID_TBL.mutex.synchronize{ 660 Tk::TreeCtrl::Item::TreeCtrlItemID_TBL.delete(@path) 661 } 662 Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL.mutex.synchronize{ 663 Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL.delete(@path) 664 } 665 end 666 667 ######################### 668 669 def __strval_optkeys 670 super() + [ 671 'buttoncolor', 'columnprefix', 'itemprefix', 'linecolor' 672 ] 673 end 674 private :__strval_optkeys 675 676 def __boolval_optkeys 677 [ 678 'itemwidthequal', 'usetheme', 679 'showbuttons', 'showheader', 'showlines', 'showroot', 680 'showrootbutton', 'showrootlines', 'showrootchildbuttons' 681 ] 682 end 683 private :__boolval_optkeys 684 685 def __listval_optkeys 686 [ 'defaultstyle' ] 687 end 688 private :__listval_optkeys 689 690 ######################### 691 692 def install_bind(cmd, *args) 693 install_bind_for_event_class(Tk::TreeCtrl::NotifyEvent, cmd, *args) 694 end 695 696 ######################### 697 698 def create_self(keys) 699 if keys and keys != None 700 tk_call_without_enc(self.class::TkCommandNames[0], @path, 701 *hash_kv(keys, true)) 702 else 703 tk_call_without_enc(self.class::TkCommandNames[0], @path) 704 end 705 end 706 private :create_self 707 708 ######################### 709 710 def activate(desc) 711 tk_send('activate', desc) 712 self 713 end 714 715 def canvasx(x) 716 number(tk_send('canvasx', x)) 717 end 718 719 def canvasy(y) 720 number(tk_send('canvasy', y)) 721 end 722 723 def collapse(*dsc) 724 tk_send_without_enc('collapse', *(dsc.map!{|d| _get_eval_string(d, true)})) 725 self 726 end 727 728 def collapse_recurse(*dsc) 729 tk_send_without_enc('collapse', '-recurse', 730 *(dsc.map!{|d| _get_eval_string(d, true)})) 731 self 732 end 733 734 def column_bbox(idx) 735 list(tk_send('column', 'bbox', idx)) 736 end 737 738 def column_compare(column1, op, column2) 739 bool(tk_send('column', 'compare', column1, op, column2)) 740 end 741 742 def column_count 743 num_or_str(tk_send('column', 'count')) 744 end 745 746 def column_create(keys=nil) 747 if keys && keys.kind_of?(Hash) 748 num_or_str(tk_send('column', 'create', *hash_kv(keys))) 749 else 750 num_or_str(tk_send('column', 'create')) 751 end 752 end 753 754 def column_delete(idx) 755 Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL.mutex.synchronize{ 756 if Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL[self.path] 757 Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL[self.path].delete(idx) 758 end 759 } 760 tk_send('column', 'delete', idx) 761 self 762 end 763 764 def column_index(idx) 765 num_or_str(tk_send('column', 'index', idx)) 766 end 767 768 def column_id(idx) 769 tk_send('column', 'id', idx) 770 end 771 772 def column_list(visible=false) 773 if visible 774 simplelist(tk_send('column', 'list', '-visible')) 775 else 776 simplelist(tk_send('column', 'list')) 777 end 778 end 779 def column_visible_list 780 column_list(true) 781 end 782 783 def column_move(idx, before) 784 tk_send('column', 'move', idx, before) 785 self 786 end 787 788 def column_needed_width(idx) 789 num_or_str(tk_send('column', 'neededwidth', idx)) 790 end 791 alias column_neededwidth column_needed_width 792 793 def column_order(column, visible=false) 794 if visible 795 num_or_str(tk_send('column', 'order', column, '-visible')) 796 else 797 num_or_str(tk_send('column', 'order', column)) 798 end 799 end 800 def column_visible_order(column) 801 column_order(column, true) 802 end 803 804 def column_width(idx) 805 num_or_str(tk_send('column', 'width', idx)) 806 end 807 808 def compare(item1, op, item2) 809 bool(tk_send('compare', item1, op, item2)) 810 end 811 812 def contentbox() 813 list(tk_send('contentbox')) 814 end 815 816 def depth(item=None) 817 num_or_str(tk_send_without_enc('depth', _get_eval_string(item, true))) 818 end 819 820 def dragimage_add(item, *args) 821 tk_send('dragimage', 'add', item, *args) 822 self 823 end 824 825 def dragimage_clear() 826 tk_send('dragimage', 'clear') 827 self 828 end 829 830 def dragimage_offset(*args) # x, y 831 if args.empty? 832 list(tk_send('dragimage', 'offset')) 833 else 834 tk_send('dragimage', 'offset', *args) 835 self 836 end 837 end 838 839 def dragimage_visible(*args) # mode 840 if args..empty? 841 bool(tk_send('dragimage', 'visible')) 842 else 843 tk_send('dragimage', 'visible', *args) 844 self 845 end 846 end 847 def dragimage_visible? 848 dragimage_visible() 849 end 850 851 def debug_dinfo 852 tk_send('debug', 'dinfo') 853 self 854 end 855 856 def debug_scroll 857 tk_send('debug', 'scroll') 858 end 859 860 def element_create(elem, type, keys=nil) 861 if keys && keys.kind_of?(Hash) 862 tk_send('element', 'create', elem, type, *hash_kv(keys)) 863 else 864 tk_send('element', 'create', elem, type) 865 end 866 end 867 868 def element_delete(*elems) 869 Tk::TreeCtrl::Element::TreeCtrlElementID_TBL.mutex.synchronize{ 870 if Tk::TreeCtrl::Element::TreeCtrlElementID_TBL[self.path] 871 elems.each{|elem| 872 Tk::TreeCtrl::Element::TreeCtrlElementID_TBL[self.path].delete(elem) 873 } 874 end 875 } 876 tk_send('element', 'delete', *elems) 877 self 878 end 879 880 def element_names() 881 list(tk_send('element', 'names')).collect!{|elem| 882 Tk::TreeCtrl::Element.id2obj(self, elem) 883 } 884 end 885 886 def _conv_element_perstate_val(opt, val) 887 case opt 888 when 'background', 'foreground', 'fill', 'outline', 'format' 889 val 890 when 'draw', 'filled', 'showfocus', 'destroy' 891 bool(val) 892 else 893 tk_tcl2ruby(val) 894 end 895 end 896 private :_conv_element_perstate_val 897 898 def element_perstate(elem, opt, st_list) 899 tk_send('element', 'perstate', elem, "-{opt}", st_list) 900 end 901 902 def element_type(elem) 903 tk_send('element', 'type', elem) 904 end 905 906 def element_class(elem) 907 Tk::TreeCtrl::Element.type2class(element_type(elem)) 908 end 909 910 def expand(*dsc) 911 tk_send('expand', *dsc) 912 self 913 end 914 915 def expand_recurse(*dsc) 916 tk_send('expand', '-recurse', *dsc) 917 self 918 end 919 920 def identify(x, y) 921 lst = list(tk_send('identify', x, y)) 922 923 if lst[0] == 'item' 924 lst[1] = Tk::TreeCtrl::Item.id2obj(self, lst[1]) 925 size = lst.size 926 i = 2 927 while i < size 928 case lst[i] 929 when 'line' 930 i += 1 931 lst[i] = Tk::TreeCtrl::Item.id2obj(self, lst[i]) 932 i += 1 933 934 when 'button' 935 i += 1 936 937 when 'column' 938 i += 2 939 940 when 'elem' 941 i += 1 942 lst[i] = Tk::TreeCtrl::Element.id2obj(self, lst[i]) 943 i += 1 944 945 else 946 i += 1 947 end 948 end 949 end 950 951 lst 952 end 953 954 def index(idx) 955 num_or_str(tk_send('index', idx)) 956 end 957 958 def item_ancestors(item) 959 list(tk_send('item', 'ancestors', item)).collect!{|id| 960 Tk::TreeCtrl::Item.id2obj(self, id) 961 } 962 end 963 964 def item_bbox(item, *args) 965 list(tk_send('item', 'bbox', item, *args)) 966 end 967 968 def item_children(item) 969 list(tk_send('item', 'children', item)).collect!{|id| 970 Tk::TreeCtrl::Item.id2obj(self, id) 971 } 972 end 973 974 def item_collapse(item) 975 tk_send_without_enc('item', 'collapse', _get_eval_string(item, true)) 976 self 977 end 978 979 def item_collapse_recurse(item) 980 tk_send_without_enc('item', 'collapse', 981 _get_eval_string(item, true), '-recurse') 982 self 983 end 984 985 def item_compare(item1, op, item2) 986 bool(tk_send('item', 'compare', item1, op, item2)) 987 end 988 989 def item_complex(item, *args) 990 tk_send_without_enc('item', 'complex', 991 _get_eval_string(item, true), 992 *(args.map!{|arg| _get_eval_string(arg, true)})) 993 self 994 end 995 996 def item_count 997 num_or_str(tk_send('item', 'count')) 998 end 999 1000 def item_create(keys={}) 1001 num_or_str(tk_send_without_enc('item', 'create', *hash_kv(keys, true))) 1002 end 1003 1004 def _erase_children(item) 1005 item_children(item).each{|i| _erase_children(i)} 1006 # table is already locked 1007 Tk::TreeCtrl::Item::TreeCtrlItemID_TBL[self.path].delete(item) 1008 end 1009 private :_erase_children 1010 1011 def item_delete(first, last=None) 1012 Tk::TreeCtrl::Item::TreeCtrlItemID_TBL.mutex.synchronize{ 1013 if Tk::TreeCtrl::Item::TreeCtrlItemID_TBL[self.path] 1014 if first == 'all' || first == :all || last == 'all' || last == :all 1015 Tk::TreeCtrl::Item::TreeCtrlItemID_TBL[self.path].clear 1016 elsif last == None 1017 _erase_children(first) 1018 else 1019 self.range(first, last).each{|id| 1020 _erase_children(id) 1021 } 1022 end 1023 end 1024 } 1025 tk_send('item', 'delete', first, last) 1026 self 1027 end 1028 1029 def item_dump(item) 1030 list(tk_send('item', 'dump', item)) 1031 end 1032 1033 def item_dump_hash(item) 1034 Hash[*list(tk_send('item', 'dump', item))] 1035 end 1036 1037 def item_element_actual(item, column, elem, key) 1038 tk_send('item', 'element', 'actual', item, column, elem, "-#{key}") 1039 end 1040 1041 def item_element_perstate(elem, opt, st_list) 1042 tk_send('item', 'element', 'perstate', elem, "-{opt}", st_list) 1043 end 1044 1045 def item_expand(item) 1046 tk_send('item', 'expand', item) 1047 self 1048 end 1049 1050 def item_expand_recurse(item) 1051 tk_send('item', 'expand', item, '-recurse') 1052 self 1053 end 1054 1055 def item_firstchild(parent, child=nil) 1056 if child 1057 tk_send_without_enc('item', 'firstchild', 1058 _get_eval_string(parent, true), 1059 _get_eval_string(child, true)) 1060 self 1061 else 1062 id = num_or_str(tk_send_without_enc('item', 'firstchild', 1063 _get_eval_string(parent, true))) 1064 Tk::TreeCtrl::Item.id2obj(self, id) 1065 end 1066 end 1067 alias item_first_child item_firstchild 1068 1069 def item_hasbutton(item, st=None) 1070 if st == None 1071 bool(tk_send_without_enc('item', 'hasbutton', 1072 _get_eval_string(item, true))) 1073 else 1074 tk_send_without_enc('item', 'hasbutton', 1075 _get_eval_string(item, true), 1076 _get_eval_string(st)) 1077 self 1078 end 1079 end 1080 alias item_has_button item_hasbutton 1081 1082 def item_hasbutton?(item) 1083 item_hasbutton(item) 1084 end 1085 alias item_has_button? item_hasbutton? 1086 1087 def item_id(item) 1088 tk_send('item', 'id', item) 1089 end 1090 1091 def item_image(item, column=nil, *args) 1092 if args.empty? 1093 if column 1094 img = tk_send('item', 'image', item, column) 1095 TkImage::Tk_IMGTBL[img]? TkImage::Tk_IMGTBL[img] : img 1096 else 1097 simplelist(tk_send('item', 'image', item)).collect!{|img| 1098 TkImage::Tk_IMGTBL[img]? TkImage::Tk_IMGTBL[img] : img 1099 } 1100 end 1101 else 1102 tk_send('item', 'image', item, column, *args) 1103 self 1104 end 1105 end 1106 def get_item_image(item, column=nil) 1107 item_image(item, column) 1108 end 1109 def set_item_image(item, col, img, *args) 1110 item_image(item, col, img, *args) 1111 end 1112 1113 def item_index(item) 1114 list(tk_send('item', 'index', item)) 1115 end 1116 1117 def item_isancestor(item, des) 1118 bool(tk_send('item', 'isancestor', item, des)) 1119 end 1120 alias item_is_ancestor item_isancestor 1121 alias item_isancestor? item_isancestor 1122 alias item_is_ancestor? item_isancestor 1123 1124 def item_isopen(item) 1125 bool(tk_send('item', 'isopen', item)) 1126 end 1127 alias item_is_open item_isopen 1128 alias item_isopen? item_isopen 1129 alias item_is_open? item_isopen 1130 alias item_isopened? item_isopen 1131 alias item_is_opened? item_isopen 1132 1133 def item_lastchild(parent, child=nil) 1134 if child 1135 tk_send_without_enc('item', 'lastchild', 1136 _get_eval_string(parent, true), 1137 _get_eval_string(child, true)) 1138 self 1139 else 1140 id = num_or_str(tk_send_without_enc('item', 'lastchild', 1141 _get_eval_string(parent, true))) 1142 Tk::TreeCtrl::Item.id2obj(self, id) 1143 end 1144 end 1145 alias item_last_child item_lastchild 1146 1147 def item_nextsibling(sibling, nxt=nil) 1148 if nxt 1149 tk_send('item', 'nextsibling', sibling, nxt) 1150 self 1151 else 1152 id = num_or_str(tk_send('item', 'nextsibling', sibling)) 1153 Tk::TreeCtrl::Item.id2obj(self, id) 1154 end 1155 end 1156 alias item_next_sibling item_nextsibling 1157 1158 def item_numchildren(item) 1159 number(tk_send_without_enc('item', 'numchildren', 1160 _get_eval_string(item, true))) 1161 end 1162 alias item_num_children item_numchildren 1163 alias item_children_size item_numchildren 1164 1165 def item_order(item, visible=false) 1166 if visible 1167 ret = num_or_str(tk_send('item', 'order', item, '-visible')) 1168 else 1169 ret = num_or_str(tk_send('item', 'order', item)) 1170 end 1171 1172 (ret.kind_of?(Fixnum) && ret < 0)? nil: ret 1173 end 1174 def item_visible_order(item) 1175 item_order(item, true) 1176 end 1177 1178 def item_parent(item) 1179 id = num_or_str(tk_send('item', 'parent', item)) 1180 Tk::TreeCtrl::Item.id2obj(self, id) 1181 end 1182 1183 def item_prevsibling(sibling, prev=nil) 1184 if prev 1185 tk_send('item', 'prevsibling', sibling, prev) 1186 self 1187 else 1188 id = num_or_str(tk_send('item', 'prevsibling', sibling)) 1189 Tk::TreeCtrl::Item.id2obj(self, id) 1190 end 1191 end 1192 alias item_prev_sibling item_prevsibling 1193 1194 def item_range(first, last) 1195 simplelist(tk_send('item', 'range', first, last)) 1196 end 1197 1198 def item_remove(item) 1199 tk_send('item', 'remove', item) 1200 self 1201 end 1202 1203 def item_rnc(item) 1204 list(tk_send('item', 'rnc', item)) 1205 end 1206 1207 def _item_sort_core(real_sort, item, *opts) 1208 # opts ::= sort_param [, sort_param, ... ] 1209 # sort_param ::= {key=>val, ...} 1210 # [type, desc, {key=>val, ...}] 1211 # param 1212 opts = opts.collect{|param| 1213 if param.kind_of?(Hash) 1214 param = _symbolkey2str(param) 1215 if param.key?('column') 1216 key = '-column' 1217 desc = param.delete('column') 1218 elsif param.key?('element') 1219 key = '-element' 1220 desc = param.delete('element') 1221 else 1222 key = nil 1223 end 1224 1225 if param.empty? 1226 param = None 1227 else 1228 param = hash_kv(__conv_item_keyonly_opts(item, param)) 1229 end 1230 1231 if key 1232 [key, desc].concat(param) 1233 else 1234 param 1235 end 1236 1237 elsif param.kind_of?(Array) 1238 if param[2].kind_of?(Hash) 1239 param[2] = hash_kv(__conv_item_keyonly_opts(item, param[2])) 1240 end 1241 param 1242 1243 elsif param.kind_of?(String) && param =~ /\A[a-z]+\Z/ 1244 '-' << param 1245 1246 elsif param.kind_of?(Symbol) 1247 '-' << param.to_s 1248 1249 else 1250 param 1251 end 1252 }.flatten 1253 1254 if real_sort 1255 tk_send('item', 'sort', item, *opts) 1256 self 1257 else 1258 list(tk_send('item', 'sort', item, '-notreally', *opts)) 1259 end 1260 end 1261 private :_item_sort_core 1262 1263 def item_sort(item, *opts) 1264 _item_sort_core(true, item, *opts) 1265 end 1266 def item_sort_not_really(item, *opts) 1267 _item_sort_core(false, item, *opts) 1268 end 1269 1270 def item_span(item, column=nil, *args) 1271 if args.empty? 1272 if column 1273 list(tk_send('item', 'span', item, column)) 1274 else 1275 simplelist(tk_send('item', 'span', item)).collect!{|elem| list(elem)} 1276 end 1277 else 1278 tk_send('item', 'span', item, column, *args) 1279 self 1280 end 1281 end 1282 def get_item_span(item, column=nil) 1283 item_span(item, column) 1284 end 1285 def set_item_span(item, col, num, *args) 1286 item_span(item, col, num, *args) 1287 end 1288 1289 def item_state_forcolumn(item, column, *args) 1290 tk_send('item', 'state', 'forcolumn', item, column, *args) 1291 end 1292 alias item_state_for_column item_state_forcolumn 1293 1294 def item_state_get(item, *args) 1295 if args.empty? 1296 list(tk_send('item', 'state', 'get', item *args)) 1297 else 1298 bool(tk_send('item', 'state', 'get', item)) 1299 end 1300 end 1301 1302 def item_state_set(item, *args) 1303 tk_send('item', 'state', 'set', item, *args) 1304 end 1305 1306 def item_style_elements(item, column) 1307 list(tk_send('item', 'style', 'elements', item, column)).collect!{|id| 1308 Tk::TreeCtrl::Style.id2obj(self, id) 1309 } 1310 end 1311 1312 def item_style_map(item, column, style, map) 1313 tk_send('item', 'style', 'map', item, column, style, map) 1314 self 1315 end 1316 1317 def item_style_set(item, column=nil, *args) 1318 if args.empty? 1319 if column 1320 id = tk_send_without_enc('item', 'style', 'set', 1321 _get_eval_string(item, true), 1322 _get_eval_string(column, true)) 1323 Tk::TreeCtrl::Style.id2obj(self, id) 1324 else 1325 list(tk_send_without_enc('item', 'style', 'set', 1326 _get_eval_string(item, true))).collect!{|id| 1327 Tk::TreeCtrl::Style.id2obj(self, id) 1328 } 1329 end 1330 else 1331 tk_send_without_enc('item', 'style', 'set', 1332 _get_eval_string(item, true), 1333 _get_eval_string(column, true), 1334 *(args.flatten.map!{|arg| 1335 _get_eval_string(arg, true) 1336 })) 1337 self 1338 end 1339 end 1340 1341 def item_text(item, column, txt=nil, *args) 1342 if args.empty? 1343 if txt 1344 tk_send('item', 'text', item, column, txt) 1345 self 1346 else 1347 tk_send('item', 'text', item, column) 1348 end 1349 else 1350 tk_send('item', 'text', item, column, txt, *args) 1351 self 1352 end 1353 end 1354 1355 def item_toggle(item) 1356 tk_send('item', 'toggle', item) 1357 self 1358 end 1359 1360 def item_toggle_recurse(item) 1361 tk_send('item', 'toggle', item, '-recurse') 1362 self 1363 end 1364 1365 def item_visible(item, st=None) 1366 if st == None 1367 bool(tk_send('item', 'visible', item)) 1368 else 1369 tk_send('item', 'visible', item, st) 1370 self 1371 end 1372 end 1373 def item_visible?(item) 1374 item_visible(item) 1375 end 1376 1377 def marquee_anchor(*args) 1378 if args.empty? 1379 list(tk_send('marquee', 'anchor')) 1380 else 1381 tk_send('marquee', 'anchor', *args) 1382 self 1383 end 1384 end 1385 1386 def marquee_coords(*args) 1387 if args.empty? 1388 list(tk_send('marquee', 'coords')) 1389 else 1390 tk_send('marquee', 'coords', *args) 1391 self 1392 end 1393 end 1394 1395 def marquee_corner(*args) 1396 if args.empty? 1397 tk_send('marquee', 'corner') 1398 else 1399 tk_send('marquee', 'corner', *args) 1400 self 1401 end 1402 end 1403 1404 def marquee_identify() 1405 list(tk_send('marquee', 'identify')).collect!{|id| 1406 Tk::TreeCtrl::Item.id2obj(self, id) 1407 } 1408 end 1409 1410 def marquee_visible(st=None) 1411 if st == None 1412 bool(tk_send('marquee', 'visible')) 1413 else 1414 tk_send('marquee', 'visible', st) 1415 self 1416 end 1417 end 1418 def marquee_visible?() 1419 marquee_visible() 1420 end 1421 1422 #def notify_bind(obj, event, cmd=Proc.new, *args) 1423 # _bind([@path, 'notify', 'bind', obj], event, cmd, *args) 1424 # self 1425 #end 1426 def notify_bind(obj, event, *args) 1427 # if args[0].kind_of?(Proc) || args[0].kind_of?(Method) 1428 if TkComm._callback_entry?(args[0]) || !block_given? 1429 cmd = args.shift 1430 else 1431 cmd = Proc.new 1432 end 1433 _bind([@path, 'notify', 'bind', obj], event, cmd, *args) 1434 self 1435 end 1436 1437 #def notify_bind_append(obj, event, cmd=Proc.new, *args) 1438 # _bind_append([@path, 'notify', 'bind', obj], event, cmd, *args) 1439 # self 1440 #end 1441 def notify_bind_append(obj, event, *args) 1442 # if args[0].kind_of?(Proc) || args[0].kind_of?(Method) 1443 if TkComm._callback_entry?(args[0]) || !block_given? 1444 cmd = args.shift 1445 else 1446 cmd = Proc.new 1447 end 1448 _bind_append([@path, 'notify', 'bind', obj], event, cmd, *args) 1449 self 1450 end 1451 1452 def notify_bind_remove(obj, event) 1453 _bind_remove([@path, 'notify', 'bind', obj], event) 1454 self 1455 end 1456 1457 def notify_bindinfo(obj, event=nil) 1458 _bindinfo([@path, 'notify', 'bind', obj], event) 1459 end 1460 1461 def notify_detailnames(event) 1462 list(tk_send('notify', 'detailnames', event)) 1463 end 1464 1465 def notify_eventnames() 1466 list(tk_send('notify', 'eventnames')) 1467 end 1468 1469 def notify_generate(pattern, char_map=None, percents_cmd=None) 1470 pattern = "<#{pattern}>" 1471 tk_send('notify', 'generate', pattern, char_map, percents_cmd) 1472 self 1473 end 1474 1475 def notify_install(pattern, percents_cmd=nil, &b) 1476 pattern = "<#{pattern}>" 1477 percents_cmd = Proc.new(&b) if !percents_cmd && b 1478 if percents_cmd 1479 procedure(tk_send('notify', 'install', pattern, percents_cmd)) 1480 else 1481 procedure(tk_send('notify', 'install', pattern)) 1482 end 1483 end 1484 1485 def notify_install_detail(event, detail, percents_cmd=nil, &b) 1486 percents_cmd = Proc.new(&b) if !percents_cmd && b 1487 if percents_cmd 1488 tk_send('notify', 'install', 'detail', event, detail, percents_cmd) 1489 else 1490 tk_send('notify', 'install', 'detail', event, detail) 1491 end 1492 end 1493 1494 def notify_install_event(event, percents_cmd=nil, &b) 1495 percents_cmd = Proc.new(&b) if !percents_cmd && b 1496 if percents_cmd 1497 tk_send('notify', 'install', 'event', event, percents_cmd) 1498 else 1499 tk_send('notify', 'install', 'event', event) 1500 end 1501 end 1502 1503 def notify_linkage(pattern, detail=None) 1504 if detail != None 1505 tk_send('notify', 'linkage', pattern, detail) 1506 else 1507 begin 1508 if pattern.to_s.index(?-) 1509 # TreeCtrl 1.1 format? 1510 begin 1511 tk_send('notify', 'linkage', "<#{pattern}>") 1512 rescue 1513 # TreeCtrl 1.0? 1514 tk_send('notify', 'linkage', pattern) 1515 end 1516 else 1517 # TreeCtrl 1.0 format? 1518 begin 1519 tk_send('notify', 'linkage', pattern) 1520 rescue 1521 # TreeCtrl 1.1? 1522 tk_send('notify', 'linkage', "<#{pattern}>") 1523 end 1524 end 1525 end 1526 end 1527 end 1528 1529 def notify_unbind(pattern=nil) 1530 if pattern 1531 tk_send('notify', 'unbind', "<#{pattern}>") 1532 else 1533 tk_send('notify', 'unbind') 1534 end 1535 self 1536 end 1537 1538 def notify_uninstall(pattern) 1539 pattern = "<#{pattern}>" 1540 tk_send('notify', 'uninstall', pattern) 1541 self 1542 end 1543 1544 def notify_uninstall_detail(event, detail) 1545 tk_send('notify', 'uninstall', 'detail', event, detail) 1546 self 1547 end 1548 1549 def notify_uninstall_event(event) 1550 tk_send('notify', 'uninstall', 'event', event) 1551 self 1552 end 1553 1554 def numcolumns() 1555 num_or_str(tk_send('numcolumns')) 1556 end 1557 alias num_columns numcolumns 1558 alias columns_size numcolumns 1559 1560 def numitems() 1561 num_or_str(tk_send('numitems')) 1562 end 1563 alias num_items numitems 1564 alias items_size numitems 1565 1566 def orphans() 1567 list(tk_send('orphans')).collect!{|id| 1568 Tk::TreeCtrl::Item.id2obj(self, id) 1569 } 1570 end 1571 1572 def range(first, last) 1573 list(tk_send('range', first, last)).collect!{|id| 1574 Tk::TreeCtrl::Item.id2obj(self, id) 1575 } 1576 end 1577 1578 def state_define(name) 1579 tk_send('state', 'define', name) 1580 self 1581 end 1582 1583 def state_linkage(name) 1584 tk_send('state', 'linkage', name) 1585 end 1586 1587 def state_names() 1588 list(tk_send('state', 'names')) 1589 end 1590 1591 def state_undefine(*names) 1592 tk_send('state', 'undefine', *names) 1593 self 1594 end 1595 1596 def see(item, column=None, keys={}) 1597 tk_send('see', item, column, *hash_kv(keys)) 1598 self 1599 end 1600 1601 def selection_add(first, last=None) 1602 tk_send('selection', 'add', first, last) 1603 self 1604 end 1605 1606 def selection_anchor(item=None) 1607 id = num_or_str(tk_send('selection', 'anchor', item)) 1608 Tk::TreeCtrl::Item.id2obj(self, id) 1609 end 1610 1611 def selection_clear(*args) # first, last 1612 tk_send('selection', 'clear', *args) 1613 self 1614 end 1615 1616 def selection_count() 1617 number(tk_send('selection', 'count')) 1618 end 1619 1620 def selection_get() 1621 list(tk_send('selection', 'get')).collect!{|id| 1622 Tk::TreeCtrl::Item.id2obj(self, id) 1623 } 1624 end 1625 1626 def selection_includes(item) 1627 bool(tk_send('selection', 'includes', item)) 1628 end 1629 1630 def selection_modify(sel, desel) 1631 tk_send('selection', 'modify', sel, desel) 1632 self 1633 end 1634 1635 def style_create(style, keys=None) 1636 if keys && keys != None 1637 tk_send('style', 'create', style, *hash_kv(keys)) 1638 else 1639 tk_send('style', 'create', style) 1640 end 1641 end 1642 1643 def style_delete(*args) 1644 Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL.mutex.synchronize{ 1645 if Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL[self.path] 1646 args.each{|sty| 1647 Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL[self.path].delete(sty) 1648 } 1649 end 1650 } 1651 tk_send('style', 'delete', *args) 1652 self 1653 end 1654 1655 def style_elements(style, *elems) 1656 if elems.empty? 1657 list(tk_send('style', 'elements', style)).collect!{|id| 1658 Tk::TreeCtrl::Element.id2obj(self, id) 1659 } 1660 else 1661 tk_send('style', 'elements', style, elems.flatten) 1662 self 1663 end 1664 end 1665 1666 def _conv_style_layout_val(sty, val) 1667 case sty.to_s 1668 when 'padx', 'pady', 'ipadx', 'ipady' 1669 lst = list(val) 1670 (lst.size == 1)? lst[0]: lst 1671 when 'detach', 'indent' 1672 bool(val) 1673 when 'union' 1674 simplelist(val).collect!{|elem| 1675 Tk::TreeCtrl::Element.id2obj(self, elem) 1676 } 1677 else 1678 val 1679 end 1680 end 1681 private :_conv_style_layout_val 1682 1683 def style_layout(style, elem, keys=None) 1684 if keys && keys != None 1685 if keys.kind_of?(Hash) 1686 tk_send('style', 'layout', style, elem, *hash_kv(keys)) 1687 self 1688 else 1689 _conv_style_layout_val(keys, 1690 tk_send('style', 'layout', 1691 style, elem, "-#{keys}")) 1692 end 1693 else 1694 ret = Hash.new 1695 Hash[*simplelist(tk_send('style', 'layout', style, elem))].each{|k, v| 1696 k = k[1..-1] 1697 ret[k] = _conv_style_layout_val(k, v) 1698 } 1699 ret 1700 end 1701 end 1702 def get_style_layout(style, elem, opt=None) 1703 style_layout(style, elem, opt) 1704 end 1705 def set_style_layout(style, elem, slot, value=None) 1706 if slot.kind_of?(Hash) 1707 style_layout(style, elem, slot) 1708 else 1709 style_layout(style, elem, {slot=>value}) 1710 end 1711 end 1712 1713 def style_names() 1714 list(tk_send('style', 'names')).collect!{|id| 1715 Tk::TreeCtrl::Style.id2obj(self, id) 1716 } 1717 end 1718 1719 def toggle(*items) 1720 tk_send('toggle', *items) 1721 self 1722 end 1723 1724 def toggle_recurse() 1725 tk_send('toggle', '-recurse', *items) 1726 self 1727 end 1728end 1729 1730##################### 1731 1732class Tk::TreeCtrl::Column < TkObject 1733 TreeCtrlColumnID_TBL = TkCore::INTERP.create_table 1734 1735 (TreeCtrlColumnID = ['treectrl_column'.freeze, TkUtil.untrust('00000')]).instance_eval{ 1736 @mutex = Mutex.new 1737 def mutex; @mutex; end 1738 freeze 1739 } 1740 1741 TkCore::INTERP.init_ip_env{ 1742 Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL.mutex.synchronize{ 1743 Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL.clear 1744 } 1745 } 1746 1747 def self.id2obj(tree, id) 1748 tpath = tree.path 1749 Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL.mutex.synchronize{ 1750 if Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL[tpath] 1751 Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL[tpath][id]? \ 1752 Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL[tpath][id] : id 1753 else 1754 id 1755 end 1756 } 1757 end 1758 1759 def initialize(parent, keys={}) 1760 @tree = parent 1761 @tpath = parent.path 1762 1763 keys = _symbolkey2str(keys) 1764 1765 Tk::TreeCtrl::Column::TreeCtrlColumnID.mutex.synchronize{ 1766 @path = @id = 1767 keys.delete('tag') || 1768 Tk::TreeCtrl::Column::TreeCtrlColumnID.join(TkCore::INTERP._ip_id_) 1769 Tk::TreeCtrl::Column::TreeCtrlColumnID[1].succ! 1770 } 1771 1772 keys['tag'] = @id 1773 1774 Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL.mutex.synchronize{ 1775 Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL[@tpath] ||= {} 1776 Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL[@tpath][@id] = self 1777 } 1778 1779 @tree.column_create(keys) 1780 end 1781 1782 def id 1783 @id 1784 end 1785 1786 def to_s 1787 @id.to_s.dup 1788 end 1789 1790 def cget_tkstring(opt) 1791 @tree.column_cget_tkstring(@tree.column_index(@id), opt) 1792 end 1793 def cget(opt) 1794 @tree.column_cget(@tree.column_index(@id), opt) 1795 end 1796 def cget_strict(opt) 1797 @tree.column_cget_strict(@tree.column_index(@id), opt) 1798 end 1799 1800 def configure(*args) 1801 @tree.column_configure(@tree.column_index(@id), *args) 1802 end 1803 1804 def configinfo(*args) 1805 @tree.column_configinfo(@tree.column_index(@id), *args) 1806 end 1807 1808 def current_configinfo(*args) 1809 @tree.current_column_configinfo(@tree.column_index(@id), *args) 1810 end 1811 1812 def delete 1813 @tree.column_delete(@tree.column_index(@id)) 1814 self 1815 end 1816 1817 def index 1818 @tree.column_index(@id) 1819 end 1820 1821 def move(before) 1822 @tree.column_move(@tree.column_index(@id), before) 1823 self 1824 end 1825 1826 def needed_width 1827 @tree.column_needed_width(@tree.column_index(@id)) 1828 end 1829 alias neededwidth needed_width 1830 1831 def current_width 1832 @tree.column_width(@tree.column_index(@id)) 1833 end 1834end 1835 1836##################### 1837 1838class Tk::TreeCtrl::Element < TkObject 1839 TreeCtrlElementID_TBL = TkCore::INTERP.create_table 1840 1841 (TreeCtrlElementID = ['treectrl_element'.freeze, TkUtil.untrust('00000')]).instance_eval{ 1842 @mutex = Mutex.new 1843 def mutex; @mutex; end 1844 freeze 1845 } 1846 TreeCtrlElemTypeToClass = {} 1847 1848 TkCore::INTERP.init_ip_env{ 1849 Tk::TreeCtrl::Element::TreeCtrlElementID_TBL.mutex.synchronize{ 1850 Tk::TreeCtrl::Element::TreeCtrlElementID_TBL.clear 1851 } 1852 } 1853 1854 def self.type2class(type) 1855 TreeCtrlElemTypeToClass[type] || type 1856 end 1857 1858 def self.id2obj(tree, id) 1859 tpath = tree.path 1860 Tk::TreeCtrl::Element::TreeCtrlElementID_TBL.mutex.synchronize{ 1861 if Tk::TreeCtrl::Element::TreeCtrlElementID_TBL[tpath] 1862 Tk::TreeCtrl::Element::TreeCtrlElementID_TBL[tpath][id]? \ 1863 Tk::TreeCtrl::Element::TreeCtrlElementID_TBL[tpath][id] : id 1864 else 1865 id 1866 end 1867 } 1868 end 1869 1870 def initialize(parent, type, keys=nil) 1871 @tree = parent 1872 @tpath = parent.path 1873 @type = type.to_s 1874 Tk::TreeCtrl::Element::TreeCtrlElementID.mutex.synchronize{ 1875 @path = @id = 1876 Tk::TreeCtrl::Element::TreeCtrlElementID.join(TkCore::INTERP._ip_id_) 1877 Tk::TreeCtrl::Element::TreeCtrlElementID[1].succ! 1878 } 1879 1880 Tk::TreeCtrl::Element::TreeCtrlElementID_TBL.mutex.synchronize{ 1881 Tk::TreeCtrl::Element::TreeCtrlElementID_TBL[@tpath] ||= {} 1882 Tk::TreeCtrl::Element::TreeCtrlElementID_TBL[@tpath][@id] = self 1883 } 1884 1885 @tree.element_create(@id, @type, keys) 1886 end 1887 1888 def id 1889 @id 1890 end 1891 1892 def to_s 1893 @id.dup 1894 end 1895 1896 def cget_tkstring(opt) 1897 @tree.element_cget_tkstring(@id, opt) 1898 end 1899 def cget(opt) 1900 @tree.element_cget(@id, opt) 1901 end 1902 def cget_strict(opt) 1903 @tree.element_cget_strict(@id, opt) 1904 end 1905 1906 def configure(*args) 1907 @tree.element_configure(@id, *args) 1908 end 1909 1910 def configinfo(*args) 1911 @tree.element_configinfo(@id, *args) 1912 end 1913 1914 def current_configinfo(*args) 1915 @tree.current_element_configinfo(@id, *args) 1916 end 1917 1918 def delete 1919 @tree.element_delete(@id) 1920 self 1921 end 1922 1923 def element_type 1924 @tree.element_type(@id) 1925 end 1926 1927 def element_class 1928 @tree.element_class(@id) 1929 end 1930end 1931 1932class Tk::TreeCtrl::BitmapElement < Tk::TreeCtrl::Element 1933 TreeCtrlElemTypeToClass['bitmap'] = self 1934 1935 def initialize(parent, keys=nil) 1936 super(parent, 'bitmap', keys) 1937 end 1938end 1939 1940class Tk::TreeCtrl::BorderElement < Tk::TreeCtrl::Element 1941 TreeCtrlElemTypeToClass['border'] = self 1942 1943 def initialize(parent, keys=nil) 1944 super(parent, 'border', keys) 1945 end 1946end 1947 1948class Tk::TreeCtrl::ImageElement < Tk::TreeCtrl::Element 1949 TreeCtrlElemTypeToClass['image'] = self 1950 1951 def initialize(parent, keys=nil) 1952 super(parent, 'image', keys) 1953 end 1954end 1955 1956class Tk::TreeCtrl::RectangleElement < Tk::TreeCtrl::Element 1957 TreeCtrlElemTypeToClass['rect'] = self 1958 1959 def initialize(parent, keys=nil) 1960 super(parent, 'rect', keys) 1961 end 1962end 1963 1964##################### 1965 1966class Tk::TreeCtrl::Item < TkObject 1967 TreeCtrlItemID_TBL = TkCore::INTERP.create_table 1968 1969 TkCore::INTERP.init_ip_env{ 1970 Tk::TreeCtrl::Item::TreeCtrlItemID_TBL.mutex.synchronize{ 1971 Tk::TreeCtrl::Item::TreeCtrlItemID_TBL.clear 1972 } 1973 } 1974 1975 def self.id2obj(tree, id) 1976 tpath = tree.path 1977 Tk::TreeCtrl::Item::TreeCtrlItemID_TBL.mutex.synchronize{ 1978 if Tk::TreeCtrl::Item::TreeCtrlItemID_TBL[tpath] 1979 Tk::TreeCtrl::Item::TreeCtrlItemID_TBL[tpath][id]? \ 1980 Tk::TreeCtrl::Item::TreeCtrlItemID_TBL[tpath][id] : id 1981 else 1982 id 1983 end 1984 } 1985 end 1986 1987 def initialize(parent, keys={}) 1988 @tree = parent 1989 @tpath = parent.path 1990 @path = @id = @tree.item_create(keys) 1991 1992 Tk::TreeCtrl::Item::TreeCtrlItemID_TBL.mutex.synchronize{ 1993 Tk::TreeCtrl::Item::TreeCtrlItemID_TBL[@tpath] ||= {} 1994 Tk::TreeCtrl::Item::TreeCtrlItemID_TBL[@tpath][@id] = self 1995 } 1996 end 1997 1998 def id 1999 @id 2000 end 2001 2002 def to_s 2003 @id.to_s.dup 2004 end 2005 2006 def ancestors 2007 @tree.item_ancestors(@id) 2008 end 2009 2010 def bbox(*args) 2011 @tree.item_bbox(@id, *args) 2012 end 2013 2014 def children 2015 @tree.item_children(@id) 2016 end 2017 2018 def collapse 2019 @tree.item_collapse(@id) 2020 self 2021 end 2022 2023 def collapse_recurse 2024 @tree.item_collapse_recurse(@id) 2025 self 2026 end 2027 2028 def complex(*args) 2029 @tree.item_complex(@id, *args) 2030 self 2031 end 2032 2033 def cget_tkstring(opt) 2034 @tree.item_cget_tkstring(@id, opt) 2035 end 2036 def cget(opt) 2037 @tree.item_cget(@id, opt) 2038 end 2039 def cget_strict(opt) 2040 @tree.item_cget_strict(@id, opt) 2041 end 2042 2043 def configure(*args) 2044 @tree.item_configure(@id, *args) 2045 end 2046 2047 def configinfo(*args) 2048 @tree.item_configinfo(@id, *args) 2049 end 2050 2051 def current_configinfo(*args) 2052 @tree.current_item_configinfo(@id, *args) 2053 end 2054 2055 def delete 2056 @tree.item_delete(@id) 2057 self 2058 end 2059 2060 def element_dump 2061 @tree.item_dump(@id) 2062 end 2063 2064 def element_dump_hash 2065 @tree.item_dump_hash(@id) 2066 end 2067 2068 def element_actual(column, elem, key) 2069 @tree.item_element_actual(@id, column, elem, key) 2070 end 2071 2072 def element_cget_tkstring(opt) 2073 @tree.item_element_cget(@id, opt) 2074 end 2075 def element_cget_tkstring(opt) 2076 @tree.item_element_cget(@id, opt) 2077 end 2078 def element_cget_strict(opt) 2079 @tree.item_element_cget_strict(@id, opt) 2080 end 2081 2082 def element_configure(*args) 2083 @tree.item_element_configure(@id, *args) 2084 end 2085 2086 def element_configinfo(*args) 2087 @tree.item_element_configinfo(@id, *args) 2088 end 2089 2090 def current_element_configinfo(*args) 2091 @tree.current_item_element_configinfo(@id, *args) 2092 end 2093 2094 def expand 2095 @tree.item_expand(@id) 2096 self 2097 end 2098 2099 def expand_recurse 2100 @tree.item_expand_recurse(@id) 2101 self 2102 end 2103 2104 def firstchild(child=nil) 2105 if child 2106 @tree.item_firstchild(@id, child) 2107 self 2108 else 2109 @tree.item_firstchild(@id) 2110 end 2111 end 2112 alias first_child firstchild 2113 2114 def hasbutton(st=None) 2115 if st == None 2116 @tree.item_hasbutton(@id) 2117 else 2118 @tree.item_hasbutton(@id, st) 2119 self 2120 end 2121 end 2122 alias has_button hasbutton 2123 2124 def hasbutton? 2125 @tree.item_hasbutton(@id) 2126 end 2127 alias has_button? hasbutton? 2128 2129 def index 2130 @tree.item_index(@id) 2131 end 2132 2133 def isancestor(des) 2134 @tree.item_isancestor(@id, des) 2135 end 2136 alias is_ancestor isancestor 2137 alias isancestor? isancestor 2138 alias is_ancestor? isancestor 2139 alias ancestor? isancestor 2140 2141 def isopen 2142 @tree.item_isopen(@id) 2143 end 2144 alias is_open isopen 2145 alias isopen? isopen 2146 alias is_open? isopen 2147 alias isopened? isopen 2148 alias is_opened? isopen 2149 alias open? isopen 2150 2151 def lastchild(child=nil) 2152 if child 2153 @tree.item_lastchild(@id, child) 2154 self 2155 else 2156 @tree.item_lastchild(@id) 2157 end 2158 end 2159 alias last_child lastchild 2160 2161 def nextsibling(nxt=nil) 2162 if nxt 2163 @tree.item_nextsibling(@id, nxt) 2164 self 2165 else 2166 @tree.item_nextsibling(@id) 2167 end 2168 end 2169 alias next_sibling nextsibling 2170 2171 def numchildren 2172 @tree.item_numchildren(@id) 2173 end 2174 alias num_children numchildren 2175 alias children_size numchildren 2176 2177 def parent_index 2178 @tree.item_parent(@id) 2179 end 2180 2181 def prevsibling(nxt=nil) 2182 if nxt 2183 @tree.item_prevsibling(@id, nxt) 2184 self 2185 else 2186 @tree.item_prevsibling(@id) 2187 end 2188 end 2189 alias prev_sibling prevsibling 2190 2191 def remove 2192 @tree.item_remove(@id) 2193 end 2194 2195 def rnc 2196 @tree.item_rnc(@id) 2197 end 2198 2199 def sort(*opts) 2200 @tree.item_sort(@id, *opts) 2201 end 2202 def sort_not_really(*opts) 2203 @tree.item_sort_not_really(@id, *opts) 2204 self 2205 end 2206 2207 def state_forcolumn(column, *args) 2208 @tree.item_state_forcolumn(@id, column, *args) 2209 self 2210 end 2211 alias state_for_column state_forcolumn 2212 2213 def state_get(*args) 2214 @tree.item_state_get(@id, *args) 2215 end 2216 2217 def state_set(*args) 2218 @tree.item_state_set(@id, *args) 2219 self 2220 end 2221 2222 def style_elements(column) 2223 @tree.item_style_elements(@id, column) 2224 end 2225 2226 def style_map(column, style, map) 2227 @tree.item_style_map(@id, column, style, map) 2228 self 2229 end 2230 2231 def style_set(column=nil, *args) 2232 if args.empty? 2233 @tree.item_style_set(@id, column) 2234 else 2235 @tree.item_style_set(@id, column, *args) 2236 self 2237 end 2238 end 2239 2240 def item_text(column, txt=nil, *args) 2241 if args.empty? 2242 if txt 2243 @tree.item_text(@id, column, txt) 2244 self 2245 else 2246 @tree.item_text(@id, column) 2247 end 2248 else 2249 @tree.item_text(@id, column, txt, *args) 2250 self 2251 end 2252 end 2253 2254 def toggle 2255 @tree.item_toggle(@id) 2256 self 2257 end 2258 2259 def toggle_recurse 2260 @tree.item_toggle_recurse(@id) 2261 self 2262 end 2263 2264 def visible(st=None) 2265 if st == None 2266 @tree.item_visible(@id) 2267 else 2268 @tree.item_visible(@id, st) 2269 self 2270 end 2271 end 2272end 2273 2274##################### 2275 2276class Tk::TreeCtrl::Style < TkObject 2277 TreeCtrlStyleID_TBL = TkCore::INTERP.create_table 2278 2279 (TreeCtrlStyleID = ['treectrl_style'.freeze, TkUtil.untrust('00000')]).instance_eval{ 2280 @mutex = Mutex.new 2281 def mutex; @mutex; end 2282 freeze 2283 } 2284 2285 TkCore::INTERP.init_ip_env{ 2286 Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL.mutex.synchronize{ 2287 Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL.clear 2288 } 2289 } 2290 2291 def self.id2obj(tree, id) 2292 tpath = tree.path 2293 Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL.mutex.synchronize{ 2294 if Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL[tpath] 2295 Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL[tpath][id]? \ 2296 Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL[tpath][id] : id 2297 else 2298 id 2299 end 2300 } 2301 end 2302 2303 def initialize(parent, keys=nil) 2304 @tree = parent 2305 @tpath = parent.path 2306 2307 Tk::TreeCtrl::Style::TreeCtrlStyleID.mutex.synchronize{ 2308 @path = @id = 2309 Tk::TreeCtrl::Style::TreeCtrlStyleID.join(TkCore::INTERP._ip_id_) 2310 Tk::TreeCtrl::Style::TreeCtrlStyleID[1].succ! 2311 } 2312 2313 Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL.mutex.synchronize{ 2314 Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL[@tpath] ||= {} 2315 Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL[@tpath][@id] = self 2316 } 2317 2318 @tree.style_create(@id, keys) 2319 end 2320 2321 def id 2322 @id 2323 end 2324 2325 def to_s 2326 @id.dup 2327 end 2328 2329 def cget_tkstring(opt) 2330 @tree.style_cget_tkstring(@id, opt) 2331 end 2332 def cget(opt) 2333 @tree.style_cget(@id, opt) 2334 end 2335 def cget_strict(opt) 2336 @tree.style_cget_strict(@id, opt) 2337 end 2338 2339 def configure(*args) 2340 @tree.style_configure(@id, *args) 2341 end 2342 2343 def configinfo(*args) 2344 @tree.style_configinfo(@id, *args) 2345 end 2346 2347 def current_configinfo(*args) 2348 @tree.current_style_configinfo(@id, *args) 2349 end 2350 2351 def delete 2352 @tree.style_delete(@id) 2353 self 2354 end 2355 2356 def elements(*elems) 2357 if elems.empty? 2358 @tree.style_elements(@id) 2359 else 2360 @tree.style_elements(@id, *elems) 2361 self 2362 end 2363 end 2364 2365 def layout(elem, keys=None) 2366 if keys && keys != None && keys.kind_of?(Hash) 2367 @tree.style_layout(@id, elem, keys) 2368 self 2369 else 2370 @tree.style_layout(@id, elem, keys) 2371 end 2372 end 2373end 2374 2375module Tk::TreeCtrl::BindCallback 2376 include Tk 2377 extend Tk 2378end 2379 2380class << Tk::TreeCtrl::BindCallback 2381 def percentsCmd(*args) 2382 tk_call('::TreeCtrl::PercentsCmd', *args) 2383 end 2384 def cursorCheck(w, x, y) 2385 tk_call('::TreeCtrl::CursorCheck', w, x, y) 2386 end 2387 def cursorCheckAux(w) 2388 tk_call('::TreeCtrl::CursorCheckAux', w) 2389 end 2390 def cursorCancel(w) 2391 tk_call('::TreeCtrl::CursorCancel', w) 2392 end 2393 def buttonPress1(w, x, y) 2394 tk_call('::TreeCtrl::ButtonPress1', w, x, y) 2395 end 2396 def doubleButton1(w, x, y) 2397 tk_call('::TreeCtrl::DoubleButton1', w, x, y) 2398 end 2399 def motion1(w, x, y) 2400 tk_call('::TreeCtrl::Motion1', w, x, y) 2401 end 2402 def leave1(w, x, y) 2403 tk_call('::TreeCtrl::Leave1', w, x, y) 2404 end 2405 def release1(w, x, y) 2406 tk_call('::TreeCtrl::Release1', w, x, y) 2407 end 2408 def beginSelect(w, el) 2409 tk_call('::TreeCtrl::BeginSelect', w, el) 2410 end 2411 def motion(w, le) 2412 tk_call('::TreeCtrl::Motion', w, el) 2413 end 2414 def beginExtend(w, el) 2415 tk_call('::TreeCtrl::BeginExtend', w, el) 2416 end 2417 def beginToggle(w, el) 2418 tk_call('::TreeCtrl::BeginToggle', w, el) 2419 end 2420 def cancelRepeat 2421 tk_call('::TreeCtrl::CancelRepeat') 2422 end 2423 def autoScanCheck(w, x, y) 2424 tk_call('::TreeCtrl::AutoScanCheck', w, x, y) 2425 end 2426 def autoScanCheckAux(w) 2427 tk_call('::TreeCtrl::AutoScanCheckAux', w) 2428 end 2429 def autoScanCancel(w) 2430 tk_call('::TreeCtrl::AutoScanCancel', w) 2431 end 2432 def up_down(w, n) 2433 tk_call('::TreeCtrl::UpDown', w, n) 2434 end 2435 def left_right(w, n) 2436 tk_call('::TreeCtrl::LeftRight', w, n) 2437 end 2438 def setActiveItem(w, idx) 2439 tk_call('::TreeCtrl::SetActiveItem', w, idx) 2440 end 2441 def extendUpDown(w, amount) 2442 tk_call('::TreeCtrl::ExtendUpDown', w, amount) 2443 end 2444 def dataExtend(w, el) 2445 tk_call('::TreeCtrl::DataExtend', w, el) 2446 end 2447 def cancel(w) 2448 tk_call('::TreeCtrl::Cancel', w) 2449 end 2450 def selectAll(w) 2451 tk_call('::TreeCtrl::selectAll', w) 2452 end 2453 def marqueeBegin(w, x, y) 2454 tk_call('::TreeCtrl::MarqueeBegin', w, x, y) 2455 end 2456 def marqueeUpdate(w, x, y) 2457 tk_call('::TreeCtrl::MarqueeUpdate', w, x, y) 2458 end 2459 def marqueeEnd(w, x, y) 2460 tk_call('::TreeCtrl::MarqueeEnd', w, x, y) 2461 end 2462 def scanMark(w, x, y) 2463 tk_call('::TreeCtrl::ScanMark', w, x, y) 2464 end 2465 def scanDrag(w, x, y) 2466 tk_call('::TreeCtrl::ScanDrag', w, x, y) 2467 end 2468 2469 # filelist-bindings 2470 def fileList_button1(w, x, y) 2471 tk_call('::TreeCtrl::FileListButton1', w, x, y) 2472 end 2473 def fileList_motion1(w, x, y) 2474 tk_call('::TreeCtrl::FileListMotion1', w, x, y) 2475 end 2476 def fileList_motion(w, x, y) 2477 tk_call('::TreeCtrl::FileListMotion', w, x, y) 2478 end 2479 def fileList_leave1(w, x, y) 2480 tk_call('::TreeCtrl::FileListLeave1', w, x, y) 2481 end 2482 def fileList_release1(w, x, y) 2483 tk_call('::TreeCtrl::FileListRelease1', w, x, y) 2484 end 2485 def fileList_edit(w, i, s, e) 2486 tk_call('::TreeCtrl::FileListEdit', w, i, s, e) 2487 end 2488 def fileList_editCancel(w) 2489 tk_call('::TreeCtrl::FileListEditCancel', w) 2490 end 2491 def fileList_autoScanCheck(w, x, y) 2492 tk_call('::TreeCtrl::FileListAutoScanCheck', w, x, y) 2493 end 2494 def fileList_autoScanCheckAux(w) 2495 tk_call('::TreeCtrl::FileListAutoScanCheckAux', w) 2496 end 2497 2498 def entryOpen(w, item, col, elem) 2499 tk_call('::TreeCtrl::EntryOpen', w, item, col, elem) 2500 end 2501 def entryExpanderOpen(w, item, col, elem) 2502 tk_call('::TreeCtrl::EntryExpanderOpen', w, item, col, elem) 2503 end 2504 def entryClose(w, accept) 2505 tk_call('::TreeCtrl::EntryClose', w, accept) 2506 end 2507 def entryExpanderKeypress(w) 2508 tk_call('::TreeCtrl::EntryExpanderKeypress', w) 2509 end 2510 def textOpen(w, item, col, elem, width=0, height=0) 2511 tk_call('::TreeCtrl::TextOpen', w, item, col, elem, width, height) 2512 end 2513 def textExpanderOpen(w, item, col, elem, width) 2514 tk_call('::TreeCtrl::TextOpen', w, item, col, elem, width) 2515 end 2516 def textClose(w, accept) 2517 tk_call('::TreeCtrl::TextClose', w, accept) 2518 end 2519 def textExpanderKeypress(w) 2520 tk_call('::TreeCtrl::TextExpanderKeypress', w) 2521 end 2522end 2523