1##########################################################################
2# TkTree widget class
3#
4#    see <http://wiki.tcl.tk/10615>
5#
6#  Note:  optional argument '-font' of the Tcl library is changed to
7#         'itemfont' on this Ruby library, because of avoiding font
8#         operation trouble in 'initialize' method  ( see the following
9#         test script ).
10#
11##########################################################################
12require 'tk'
13
14class TkTree < TkCanvas
15  TCL_SCRIPT_PATH = File.join(File.dirname(__FILE__), 'tktree.tcl')
16
17  def create_self(keys)
18    args = [@path]
19    if keys.kind_of?(Hash)
20      font = keys.delete('itemfont')
21#      font = hash_kv(font) if font.kind_of?(Hash)
22      keys['font'] = font if font
23#      args.concat(hash_kv(keys))
24      args << keys
25    end
26    begin
27      tk_call('::tktree::treecreate', *args)
28    rescue NameError, RuntimeError
29      Tk.load_tclscript(TkTree::TCL_SCRIPT_PATH)
30      tk_call('::tktree::treecreate', *args)
31    end
32  end
33
34  def newitem(itempath, keys = nil)
35    if keys.kind_of?(Hash)
36      keys = _symbolkey2str(keys)
37      font = keys.delete('itemfont')
38#      font = hash_kv(font) if font.kind_of?(Hash)
39      keys['font'] = font if font
40#      tk_call('::tktree::newitem', @path, itempath, *hash_kv(keys))
41      tk_call('::tktree::newitem', @path, itempath, keys)
42    else
43      tk_call('::tktree::newitem', @path, itempath)
44    end
45  end
46
47  def delitem(itempath)
48    tk_call('::tktree::delitem', @path, itempath)
49  end
50
51  def labelat(xpos, ypos)
52    tk_call('::tktree::delitem', @path, xpos, ypos)
53  end
54
55  def getselection
56    tk_call('::tktree::getselection', @path)
57  end
58
59  def setselection(itempath)
60    tk_call('::tktree::getselection', @path, itempath)
61  end
62end
63
64
65##########################################################################
66# test script
67##########################################################################
68if __FILE__ == $0
69  TkLabel.new(:text=><<EOL, :relief=>:ridge, :justify=>:left).pack
70
71 This is a sample to use a Tcl library script on Ruby/Tk.
72 This sample loads tktree.tcl (see <http://wiki.tcl.tk/10615>)
73 and calls functions of the Tcl script.
74EOL
75
76  items = %w(/group1/item1 /group1/item2 /group1/subgroup/item1 /group2/item1 /item1)
77
78  tr1 = TkTree.new.pack(:expand=>true, :fill=>:both)
79  tr1.focus
80
81  items.each{|item|
82    tr1.newitem(item,
83                :command=>proc{Tk.messageBox(:message=>"#{item} executed")})
84  }
85
86  f = TkFrame.new.pack(:expand=>true, :fill=>:both)
87  tr2 = TkTree.new(f, :bg=>'black', #:itemfont=>{:family=>'Times', :size=>14},
88                   :textcolor=>'red', :bd=>4, :relief=>:ridge,
89                   :selectbackground=>'darkBlue', :selectforeground=>'yellow',
90                   :selectborderwidth=>3, :linecolor=>'yellow') {
91    yscrollbar(TkScrollbar.new(f, :width=>10).pack(:side=>:right, :fill=>:y))
92    xscrollbar(TkScrollbar.new(f, :width=>10).pack(:side=>:bottom, :fill=>:x))
93    pack(:expand=>true, :fill=>:both)
94  }
95
96  items.each{|item|
97    tr2.newitem(item, :textcolor=>'green', :image=>'',
98                :itemfont=>{:family=>'Times', :size=>10},
99                :command=>proc{Tk.messageBox(:message=>"#{item} executed")})
100  }
101
102  Tk.mainloop
103end
104