summaryrefslogtreecommitdiff
path: root/ext/tk/lib/tkextlib/bwidget/messagedlg.rb
blob: 7b626147370251ae818d19bf78041bfb830a815e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#
#  tkextlib/bwidget/messagedlg.rb
#                               by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)
#

require 'tk'
require 'tkextlib/bwidget.rb'
require 'tkextlib/bwidget/dialog.rb'

module Tk
  module BWidget
    class MessageDlg < TkWindow
    end
  end
end

class Tk::BWidget::MessageDlg
  TkCommandNames = ['MessageDlg'.freeze].freeze
  WidgetClassName = 'MessageDlg'.freeze
  WidgetClassNames[WidgetClassName] ||= self

  def initialize(parent=nil, keys=nil)
    @relative = ''
    if parent.kind_of?(Hash)
      keys = _symbolkey2str(parent)
      @relative = keys['parent'] if keys.key?('parent')
      @relative = keys.delete('relative') if keys.key?('relative')
      super(keys)
    elsif keys
      keys = _symbolkey2str(keys)
      @relative = keys.delete('parent') if keys.key?('parent')
      @relative = keys.delete('relative') if keys.key?('relative')
      super(parent, keys)
    else
      super(parent)
    end
  end

  def create_self(keys)
    # NOT create widget.
    # Because the widget no longer exist when returning from creation.
    @keys = _symbolkey2str(keys).update('parent'=>@relative)
    @info = nil
  end
  private :create_self

  def __strval_optkeys
    super() << 'message' << 'title'
  end
  private :__strval_optkeys

  def __listval_optkeys
    super() << 'buttons'
  end
  private :__listval_optkeys

  def cget(slot)
    slot = slot.to_s
    if slot == 'relative'
      slot = 'parent'
    end
    if winfo_exist?
      val = super(slot)
      @keys[slot] = val
    end
    @keys[slot]
  end
  def cget_strict(slot)
    slot = slot.to_s
    if slot == 'relative'
      slot = 'parent'
    end
    if winfo_exist?
      val = super(slot)
      @keys[slot] = val
    end
    @keys[slot]
  end

  def configure(slot, value=None)
    if winfo_exist?
      super(slot, value)
    end
    if slot.kind_of?(Hash)
      slot = _symbolkey2str(slot)
      slot['parent'] = slot.delete('relative') if slot.key?('relative')
      @keys.update(slot)

      if @info
        # update @info
        slot.each{|k, v|
          if TkComm::GET_CONFIGINFO_AS_ARRAY
            if (inf = @info.assoc(k))
              inf[-1] = v
            else
              @info << [k, '', '', '', v]
            end
          else
            if (inf = @info[k])
              inf[-1] = v
            else
              @info[k] = ['', '', '', v]
            end
          end
        }
      end

    else # ! Hash
      slot = slot.to_s
      slot = 'parent' if slot == 'relative'
      @keys[slot] = value

      if @info
        # update @info
        if TkComm::GET_CONFIGINFO_AS_ARRAY
          if (inf = @info.assoc(slot))
            inf[-1] = value
          else
            @info << [slot, '', '', '', value]
          end
        else
          if (inf = @info[slot])
            inf[-1] = value
          else
            @info[slot] = ['', '', '', value]
          end
        end
      end
    end

    self
  end

  def configinfo(slot=nil)
    if winfo_exist?
      @info = super()
      if TkComm::GET_CONFIGINFO_AS_ARRAY
        @info << ['relative', 'parent']
      else
        @info['relative'] = 'parent'
      end
    end

    if TkComm::GET_CONFIGINFO_AS_ARRAY
      if @info
        if winfo_exist?
          # update @keys
          @info.each{|inf| @keys[inf[0]] = inf[-1] if inf.size > 2 }
        end
      else
        @info = []
        @keys.each{|k, v|
          @info << [k, '', '', '', v]
        }
        @info << ['relative', 'parent']
      end

      if slot
        @info.asoc(slot.to_s).dup
      else
        @info.dup
      end

    else # ! TkComm::GET_CONFIGINFO_AS_ARRAY
      if @info
        if winfo_exist?
          # update @keys
          @info.each{|k, inf| @keys[k] = inf[-1] if inf.size > 2 }
        end
      else
        @info = {}
        @keys.each{|k, v|
          @info[k] = ['', '', '', v]
        }
        @info['relative'] = 'parent'
      end

      if slot
        @info[slot.to_s].dup
      else
        @info.dup
      end
    end
  end

  def create
    # return the index of the pressed button, or nil if it is destroyed
    ret = num_or_str(tk_call(self.class::TkCommandNames[0],
                             @path, *hash_kv(@keys)))
    (ret < 0)? nil: ret
  end
end