2 # templdlg demo --- called from demo.rb
4 unless Object.const_defined?('DemoVar')
5 fail RuntimeError, "This is NOT a stand alone script. This script is called from 'demo.rb'. "
14 frame = nb.insert('end', 'demoTree', :text=>'Tree')
15 pw = Tk::BWidget::PanedWindow.new(frame, :side=>:top)
17 pane = pw.add(:weight=>1)
18 title = Tk::BWidget::TitleFrame.new(pane, :text=>'Directory tree')
19 sw = Tk::BWidget::ScrolledWindow.new(title.get_frame,
20 :relief=>:sunken, :borderwidth=>2)
21 tree = Tk::BWidget::Tree.new(sw, :relief=>:flat, :borderwidth=>0,
22 :width=>15, :highlightthickness=>0,
23 :redraw=>false, :dropenabled=>true,
24 :dragenabled=>true, :dragevent=>3,
40 :closecmd=>proc{|node|
45 sw.pack(:side=>:top, :expand=>true, :fill=>:both)
46 title.pack(:fill=>:both, :expand=>true)
48 pane = pw.add(:weight=>2)
49 lf = Tk::BWidget::TitleFrame.new(pane, :text=>'Content')
50 sw = Tk::BWidget::ScrolledWindow.new(lf.get_frame,
51 :scrollbar=>:horizontal,
52 :auto=>:none, :relief=>:sunken,
55 list = Tk::BWidget::ListBox.new(sw, :relief=>:flat, :borderwidth=>0,
56 :highlightthickness=>0, :width=>20,
57 :multicolumn=>true, :redraw=>false,
58 :dragevent=>3, :dropenabled=>true,
74 Tk.pack(sw, lf, :fill=>:both, :expand=>true)
76 pw.pack(:fill=>:both, :expand=>true)
78 tree.textbind('ButtonPress-1',
79 proc{|node, ev| select('tree', 1, tree, list, node)})
80 tree.textbind('Double-ButtonPress-1',
81 proc{|node, ev| select('tree', 2, tree, list, node)})
83 list.textbind('ButtonPress-1',
84 proc{|node, ev| select('list', 1, tree, list, node)})
85 list.textbind('Double-ButtonPress-1',
86 proc{|node, ev| select('list', 2, tree, list, node)})
88 list.imagebind('Double-ButtonPress-1',
89 proc{|node, ev| select('list', 2, tree, list, node)})
91 nb.itemconfigure('demoTree',
92 :createcmd=>proc{|*args| init(tree, list, *args)},
95 /\d+x\d+([+-]{1,2}\d+)([+-]{1,2}\d+)/
96 global_w = ($1 || 0).to_i
97 global_h = ($2 || 0).to_i
99 Tk::BWidget.place(@@top, 0, 0, :at,
100 global_w - Tk.root.winfo_screenwidth, global_h)
102 Tk.root.bind('Unmap', proc{@@top.withdraw})
103 Tk.root.bind('Map', proc{@@top.deiconify})
104 Tk.root.bind('Configure', proc{|w|
107 /\d+x\d+([+-]{1,2}\d+)([+-]{1,2}\d+)/
108 global_w = ($1 || 0).to_i
109 global_h = ($2 || 0).to_i
110 Tk::BWidget.place(@@top, 0, 0, :at,
111 global_w - Tk.root.winfo_screenwidth,
118 @@top.withdraw if @@top
119 Tk.root.bind_remove('Unmap')
120 Tk.root.bind_remove('Map')
121 Tk.root.bind_remove('Configure')
126 def self.init(tree, list, *args)
128 if Tk::PLATFORM['platform'] == 'unix'
129 rootdir = File.expand_path('~')
134 tree.insert('end', 'root', 'home',
135 :text=>rootdir, :data=>rootdir, :open=>true,
136 :image=>Tk::BWidget::Bitmap.new('openfold'))
137 getdir(tree, 'home', rootdir)
138 select('tree', 1, tree, list, 'home')
142 @@top = TkToplevel.new
144 @@top.protocol('WM_DELETE_WINDOW'){
147 @@top.resizable(false, false)
148 @@top.title('Drag rectangle to scroll directory tree')
149 @@top.transient(Tk.root)
150 Tk::BWidget::ScrollView.new(@@top, :window=>tree, :fill=>'white',
151 :width=>300, :height=>300, :relief=>:sunken,
152 :bd=>1).pack(:fill=>:both, :expand=>true)
155 def self.getdir(tree, node, path)
156 lentries = Dir.glob(File.join(path, '*')).sort
159 basename = File.basename(f)
160 if File.directory?(f)
161 Tk::BWidget::Tree::Node.new(tree, node,
162 :index=>'end', :text=>basename,
163 :image=>Tk::BWidget::Bitmap.new('folder'),
164 :drawcross=>:allways, :data=>f)
170 tree.itemconfigure(node, :drawcross=>:auto, :data=>lfiles)
173 def self.moddir(idx, tree, node)
174 if (idx != 0 && tree.itemcget(node, :drawcross).to_s == 'allways')
175 getdir(tree, node, tree.itemcget(node, :data))
176 if tree.nodes(node).empty?
177 tree.itemconfigure(node, :image=>Tk::BWidget::Bitmap.new('folder'))
179 tree.itemconfigure(node, :image=>Tk::BWidget::Bitmap.new('openfold'))
182 img = %w(folder openfold)[idx] || 'openfold'
183 tree.itemconfigure(node, :image=>Tk::BWidget::Bitmap.new(img))
187 def self.select(where, num, tree, list, node)
190 if (where == 'tree' &&
191 tree.selection_get.find{|x|
192 TkUtil._get_eval_string(x) == TkUtil._get_eval_string(node)
195 Tk.after(500, proc{edit('tree', tree, list, node)})
198 if (where == 'list' &&
199 list.selection_get.find{|x|
200 TkUtil._get_eval_string(x) == TkUtil._get_eval_string(node)
203 Tk.after(500, proc{edit('list', tree, list, node)})
207 select_node(tree, list, node)
209 list.selection_set(node)
211 elsif (where == 'list' && tree.exist?(node))
212 parent = tree.parent(node)
213 while TkUtil._get_eval_string(parent) != 'root'
214 tree.itemconfigure(parent, :open=>true)
215 parent = tree.parent(parent)
217 select_node(tree, list, node)
221 def self.select_node(tree, list, node)
222 tree.selection_set(node)
224 list.delete(*(list.items(0, 'end')))
226 dir = tree.itemcget(node, :data)
227 if tree.itemcget(node, :drawcross).to_s == 'allways'
228 getdir(tree, node, dir)
229 dir = tree.itemcget(node, :data)
232 tree.nodes(node).each{|subnode|
233 list.insert('end', subnode,
234 :text=>tree.itemcget(subnode, :text),
235 :image=>Tk::BWidget::Bitmap.new('folder'))
238 TkComm.simplelist(dir).each{|f|
239 Tk::BWidget::ListBox::Item.new(list, 'end', :text=>f,
240 :image=>Tk::BWidget::Bitmap.new('file'))
244 def self.edit(where, tree, list, node)
247 if (where == 'tree' &&
248 tree.selection_get.find{|x|
249 TkUtil._get_eval_string(x) == TkUtil._get_eval_string(node)
251 res = tree.edit(node, tree.itemcget(node, :text))
253 tree.itemconfigure(node, :text=>res)
255 list.itemconfigure(node, :text=>res)
257 tree.selection_set(node)
263 res = list.edit(node, list.igemcget(node, :text))
265 list.itemconfigure(node, :text=>res)
267 tree.itemconfigure(node, :text=>res)
269 cursel = tree.selection_get[0]
270 index = list.index(node) - tree.nodes(cursel).size
271 data = TkComm.simplelist(tree.itemcget(cursel, :data))
273 tree.itemconfigure(cursel, :date=>data)
275 list.selection_set(node)
280 def self.expand(tree, but)
281 unless (cur = tree.selection_get).empty?