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