1 #
2 # tk/toplevel.rb : treat toplevel widget
3 #
4 require 'tk'
5 require 'tk/wm'
6 require 'tk/menuspec'
7
8 class Tk::Toplevel<TkWindow
9 include Wm
10 include TkMenuSpec
11
12 TkCommandNames = ['toplevel'.freeze].freeze
13 WidgetClassName = 'Toplevel'.freeze
14 WidgetClassNames[WidgetClassName] = self
15
16 ################# old version
17 # def initialize(parent=nil, screen=nil, classname=nil, keys=nil)
18 # if screen.kind_of? Hash
19 # keys = screen.dup
20 # else
21 # @screen = screen
22 # end
23 # @classname = classname
24 # if keys.kind_of? Hash
25 # keys = keys.dup
26 # @classname = keys.delete('classname') if keys.key?('classname')
27 # @colormap = keys.delete('colormap') if keys.key?('colormap')
28 # @container = keys.delete('container') if keys.key?('container')
29 # @screen = keys.delete('screen') if keys.key?('screen')
30 # @use = keys.delete('use') if keys.key?('use')
31 # @visual = keys.delete('visual') if keys.key?('visual')
32 # end
33 # super(parent, keys)
34 # end
35 #
36 # def create_self
37 # s = []
38 # s << "-class" << @classname if @classname
39 # s << "-colormap" << @colormap if @colormap
40 # s << "-container" << @container if @container
41 # s << "-screen" << @screen if @screen
42 # s << "-use" << @use if @use
43 # s << "-visual" << @visual if @visual
44 # tk_call 'toplevel', @path, *s
45 # end
46 #################
47
48 def __boolval_optkeys
49 super() << 'container'
50 end
51 private :__boolval_optkeys
52
53 def __strval_optkeys
54 super() << 'screen'
55 end
56 private :__strval_optkeys
57
58 def __val2ruby_optkeys # { key=>proc, ... }
59 super().update('menu'=>proc{|v| window(v)})
60 end
61 private :__val2ruby_optkeys
62
63 def __methodcall_optkeys # { key=>method, ... }
64 TOPLEVEL_METHODCALL_OPTKEYS
65 end
66 private :__methodcall_optkeys
67
68 def _wm_command_option_chk(keys)
69 keys = {} unless keys
70 new_keys = {}
71 wm_cmds = {}
72
73 conf_methods = _symbolkey2str(__methodcall_optkeys())
74
75 keys.each{|k,v| # k is a String
76 if conf_methods.key?(k)
77 wm_cmds[conf_methods[k]] = v
78 elsif Wm.method_defined?(k)
79 case k
80 when 'screen','class','colormap','container','use','visual'
81 new_keys[k] = v
82 else
83 case self.method(k).arity
84 when -1,1
85 wm_cmds[k] = v
86 else
87 new_keys[k] = v
88 end
89 end
90 else
91 new_keys[k] = v
92 end
93 }
94 [new_keys, wm_cmds]
95 end
96 private :_wm_command_option_chk
97
98 def initialize(parent=nil, screen=nil, classname=nil, keys=nil)
99 my_class_name = nil
100 if self.class < WidgetClassNames[WidgetClassName]
101 my_class_name = self.class.name
102 my_class_name = nil if my_class_name == ''
103 end
104 if parent.kind_of? Hash
105 keys = _symbolkey2str(parent)
106 if keys.key?('classname')
107 keys['class'] = keys.delete('classname')
108 end
109 @classname = keys['class']
110 @colormap = keys['colormap']
111 @container = keys['container']
112 @screen = keys['screen']
113 @use = keys['use']
114 @visual = keys['visual']
115 if !@classname && my_class_name
116 keys['class'] = @classname = my_class_name
117 end
118 if @classname.kind_of? TkBindTag
119 @db_class = @classname
120 keys['class'] = @classname = @classname.id
121 elsif @classname
122 @db_class = TkDatabaseClass.new(@classname)
123 keys['class'] = @classname
124 else
125 @db_class = self.class
126 @classname = @db_class::WidgetClassName
127 end
128 keys, cmds = _wm_command_option_chk(keys)
129 super(keys)
130 cmds.each{|k,v|
131 if v.kind_of? Array
132 self.__send__(k,*v)
133 else
134 self.__send__(k,v)
135 end
136 }
137 return
138 end
139
140 if screen.kind_of? Hash
141 keys = screen
142 else
143 @screen = screen
144 if classname.kind_of? Hash
145 keys = classname
146 else
147 @classname = classname
148 end
149 end
150 if keys.kind_of? Hash
151 keys = _symbolkey2str(keys)
152 if keys.key?('classname')
153 keys['class'] = keys.delete('classname')
154 end
155 @classname = keys['class'] unless @classname
156 @colormap = keys['colormap']
157 @container = keys['container']
158 @screen = keys['screen'] unless @screen
159 @use = keys['use']
160 @visual = keys['visual']
161 else
162 keys = {}
163 end
164 if !@classname && my_class_name
165 keys['class'] = @classname = my_class_name
166 end
167 if @classname.kind_of? TkBindTag
168 @db_class = @classname
169 keys['class'] = @classname = @classname.id
170 elsif @classname
171 @db_class = TkDatabaseClass.new(@classname)
172 keys['class'] = @classname
173 else
174 @db_class = self.class
175 @classname = @db_class::WidgetClassName
176 end
177 keys, cmds = _wm_command_option_chk(keys)
178 super(parent, keys)
179 cmds.each{|k,v|
180 if v.kind_of? Array
181 self.send(k,*v)
182 else
183 self.send(k,v)
184 end
185 }
186 end
187
188 #def create_self(keys)
189 # if keys and keys != None
190 # tk_call_without_enc('toplevel', @path, *hash_kv(keys, true))
191 # else
192 # tk_call_without_enc('toplevel', @path)
193 # end
194 #end
195 #private :create_self
196
197 def specific_class
198 @classname
199 end
200
201 def add_menu(menu_info, tearoff=false, opts=nil)
202 # See tk/menuspec.rb for menu_info.
203 # opts is a hash of default configs for all of cascade menus.
204 # Configs of menu_info can override it.
205 if tearoff.kind_of?(Hash)
206 opts = tearoff
207 tearoff = false
208 end
209 _create_menubutton(self, menu_info, tearoff, opts)
210 end
211
212 def add_menubar(menu_spec, tearoff=false, opts=nil)
213 # See tk/menuspec.rb for menu_spec.
214 # opts is a hash of default configs for all of cascade menus.
215 # Configs of menu_spec can override it.
216 menu_spec.each{|info| add_menu(info, tearoff, opts)}
217 self.menu
218 end
219
220 def self.database_class
221 if self == WidgetClassNames[WidgetClassName] || self.name == ''
222 self
223 else
224 TkDatabaseClass.new(self.name)
225 end
226 end
227 def self.database_classname
228 self.database_class.name
229 end
230
231 def self.bind(*args, &b)
232 if self == WidgetClassNames[WidgetClassName] || self.name == ''
233 super(*args, &b)
234 else
235 TkDatabaseClass.new(self.name).bind(*args, &b)
236 end
237 end
238 def self.bind_append(*args, &b)
239 if self == WidgetClassNames[WidgetClassName] || self.name == ''
240 super(*args, &b)
241 else
242 TkDatabaseClass.new(self.name).bind_append(*args, &b)
243 end
244 end
245 def self.bind_remove(*args)
246 if self == WidgetClassNames[WidgetClassName] || self.name == ''
247 super(*args)
248 else
249 TkDatabaseClass.new(self.name).bind_remove(*args)
250 end
251 end
252 def self.bindinfo(*args)
253 if self == WidgetClassNames[WidgetClassName] || self.name == ''
254 super(*args)
255 else
256 TkDatabaseClass.new(self.name).bindinfo(*args)
257 end
258 end
259 end
260
261 #TkToplevel = Tk::Toplevel unless Object.const_defined? :TkToplevel
262 Tk.__set_toplevel_aliases__(:Tk, Tk::Toplevel, :TkToplevel)