1#
2#  tkextlib/bwidget/messagedlg.rb
3#                               by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)
4#
5
6require 'tk'
7require 'tkextlib/bwidget.rb'
8require 'tkextlib/bwidget/dialog.rb'
9
10module Tk
11  module BWidget
12    class MessageDlg < TkWindow
13    end
14  end
15end
16
17class Tk::BWidget::MessageDlg
18  TkCommandNames = ['MessageDlg'.freeze].freeze
19  WidgetClassName = 'MessageDlg'.freeze
20  WidgetClassNames[WidgetClassName] ||= self
21
22  def initialize(parent=nil, keys=nil)
23    @relative = ''
24    if parent.kind_of?(Hash)
25      keys = _symbolkey2str(parent)
26      @relative = keys['parent'] if keys.key?('parent')
27      @relative = keys.delete('relative') if keys.key?('relative')
28      super(keys)
29    elsif keys
30      keys = _symbolkey2str(keys)
31      @relative = keys.delete('parent') if keys.key?('parent')
32      @relative = keys.delete('relative') if keys.key?('relative')
33      super(parent, keys)
34    else
35      super(parent)
36    end
37  end
38
39  def create_self(keys)
40    # NOT create widget.
41    # Because the widget no longer exist when returning from creation.
42    @keys = _symbolkey2str(keys).update('parent'=>@relative)
43    @info = nil
44  end
45  private :create_self
46
47  def __strval_optkeys
48    super() << 'message' << 'title'
49  end
50  private :__strval_optkeys
51
52  def __listval_optkeys
53    super() << 'buttons'
54  end
55  private :__listval_optkeys
56
57  def cget(slot)
58    slot = slot.to_s
59    if slot == 'relative'
60      slot = 'parent'
61    end
62    if winfo_exist?
63      val = super(slot)
64      @keys[slot] = val
65    end
66    @keys[slot]
67  end
68  def cget_strict(slot)
69    slot = slot.to_s
70    if slot == 'relative'
71      slot = 'parent'
72    end
73    if winfo_exist?
74      val = super(slot)
75      @keys[slot] = val
76    end
77    @keys[slot]
78  end
79
80  def configure(slot, value=None)
81    if winfo_exist?
82      super(slot, value)
83    end
84    if slot.kind_of?(Hash)
85      slot = _symbolkey2str(slot)
86      slot['parent'] = slot.delete('relative') if slot.key?('relative')
87      @keys.update(slot)
88
89      if @info
90        # update @info
91        slot.each{|k, v|
92          if TkComm::GET_CONFIGINFO_AS_ARRAY
93            if (inf = @info.assoc(k))
94              inf[-1] = v
95            else
96              @info << [k, '', '', '', v]
97            end
98          else
99            if (inf = @info[k])
100              inf[-1] = v
101            else
102              @info[k] = ['', '', '', v]
103            end
104          end
105        }
106      end
107
108    else # ! Hash
109      slot = slot.to_s
110      slot = 'parent' if slot == 'relative'
111      @keys[slot] = value
112
113      if @info
114        # update @info
115        if TkComm::GET_CONFIGINFO_AS_ARRAY
116          if (inf = @info.assoc(slot))
117            inf[-1] = value
118          else
119            @info << [slot, '', '', '', value]
120          end
121        else
122          if (inf = @info[slot])
123            inf[-1] = value
124          else
125            @info[slot] = ['', '', '', value]
126          end
127        end
128      end
129    end
130
131    self
132  end
133
134  def configinfo(slot=nil)
135    if winfo_exist?
136      @info = super()
137      if TkComm::GET_CONFIGINFO_AS_ARRAY
138        @info << ['relative', 'parent']
139      else
140        @info['relative'] = 'parent'
141      end
142    end
143
144    if TkComm::GET_CONFIGINFO_AS_ARRAY
145      if @info
146        if winfo_exist?
147          # update @keys
148          @info.each{|inf| @keys[inf[0]] = inf[-1] if inf.size > 2 }
149        end
150      else
151        @info = []
152        @keys.each{|k, v|
153          @info << [k, '', '', '', v]
154        }
155        @info << ['relative', 'parent']
156      end
157
158      if slot
159        @info.asoc(slot.to_s).dup
160      else
161        @info.dup
162      end
163
164    else # ! TkComm::GET_CONFIGINFO_AS_ARRAY
165      if @info
166        if winfo_exist?
167          # update @keys
168          @info.each{|k, inf| @keys[k] = inf[-1] if inf.size > 2 }
169        end
170      else
171        @info = {}
172        @keys.each{|k, v|
173          @info[k] = ['', '', '', v]
174        }
175        @info['relative'] = 'parent'
176      end
177
178      if slot
179        @info[slot.to_s].dup
180      else
181        @info.dup
182      end
183    end
184  end
185
186  def create
187    # return the index of the pressed button, or nil if it is destroyed
188    ret = num_or_str(tk_call(self.class::TkCommandNames[0],
189                             @path, *hash_kv(@keys)))
190    (ret < 0)? nil: ret
191  end
192end
193