1 #
2 # tk/root.rb : treat root widget
3 #
4 require 'tk'
5 require 'tk/wm'
6 require 'tk/menuspec'
7
8 class Tk::Root<TkWindow
9 include Wm
10 include TkMenuSpec
11
12 def __methodcall_optkeys # { key=>method, ... }
13 TOPLEVEL_METHODCALL_OPTKEYS
14 end
15 private :__methodcall_optkeys
16
17 def Root.new(keys=nil, &b)
18 unless TkCore::INTERP.tk_windows['.']
19 TkCore::INTERP.tk_windows['.'] =
20 super(:without_creating=>true, :widgetname=>'.'){}
21 end
22 root = TkCore::INTERP.tk_windows['.']
23
24 keys = _symbolkey2str(keys)
25
26 # wm commands
27 root.instance_eval{
28 __methodcall_optkeys.each{|key, method|
29 value = keys.delete(key.to_s)
30 self.__send__(method, value) if value
31 }
32 }
33
34 if keys # wm commands ( for backward comaptibility )
35 keys.each{|k,v|
36 if v.kind_of? Array
37 root.__send__(k,*v)
38 else
39 root.__send__(k,v)
40 end
41 }
42 end
43
44 if block_given?
45 if TkCore::WITH_RUBY_VM ### Ruby 1.9 !!!!
46 root.instance_exec(root, &b)
47 else
48 root.instance_eval(&b)
49 end
50 end
51 root
52 end
53
54 WidgetClassName = 'Tk'.freeze
55 WidgetClassNames[WidgetClassName] = self
56
57 def self.to_eval
58 # self::WidgetClassName
59 '.'
60 end
61
62 def create_self
63 @path = '.'
64 end
65 private :create_self
66
67 def path
68 "."
69 end
70
71 def add_menu(menu_info, tearoff=false, opts=nil)
72 # See tk/menuspec.rb for menu_info.
73 # opts is a hash of default configs for all of cascade menus.
74 # Configs of menu_info can override it.
75 if tearoff.kind_of?(Hash)
76 opts = tearoff
77 tearoff = false
78 end
79 _create_menubutton(self, menu_info, tearoff, opts)
80 end
81
82 def add_menubar(menu_spec, tearoff=false, opts=nil)
83 # See tk/menuspec.rb for menu_spec.
84 # opts is a hash of default configs for all of cascade menus.
85 # Configs of menu_spec can override it.
86 menu_spec.each{|info| add_menu(info, tearoff, opts)}
87 self.menu
88 end
89
90 def Root.destroy
91 TkCore::INTERP._invoke('destroy', '.')
92 end
93 end
94
95 TkRoot = Tk::Root unless Object.const_defined? :TkRoot