1#
2#  tkextlib/tcllib/swaplist.rb
3#                               by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)
4#
5#   * Part of tcllib extension
6#   * A dialog which allows a user to move options between two lists
7#
8
9require 'tk'
10require 'tkextlib/tcllib.rb'
11
12# TkPackage.require('swaplist', '0.1')
13TkPackage.require('swaplist')
14
15module Tk::Tcllib
16  class Swaplist_Dialog < TkWindow
17    PACKAGE_NAME = 'swaplist'.freeze
18    def self.package_name
19      PACKAGE_NAME
20    end
21
22    def self.package_version
23      begin
24        TkPackage.require('swaplist')
25      rescue
26        ''
27      end
28    end
29  end
30end
31
32
33class Tk::Tcllib::Swaplist_Dialog
34  TkCommandNames = ['::swaplist::swaplist'.freeze].freeze
35  WidgetClassName = 'Swaplist'.freeze
36  WidgetClassNames[WidgetClassName] ||= self
37
38  def self.show(*args)
39    dialog = self.new(*args)
40    dialog.show
41    [dialog.status, dialog.value]
42  end
43  def self.display(*args)
44    self.show(*args)
45  end
46
47  def initialize(*args)
48    # args = (parent=nil, complete_list=[], selected_list=[], keys=nil)
49    keys = args.pop
50    if keys.kind_of?(Hash)
51      @selected_list = args.pop
52      @complete_list = args.pop
53      @keys = _symbolkey2str(keys)
54      args.push(keys)
55    else
56      @selected_list = keys
57      @complete_list = args.pop
58      @keys = {}
59    end
60
61    @selected_list = [] unless @selected_list
62    @complete_list = [] unless @complete_list
63
64    @variable = TkVariable.new
65    @status = nil
66
67    super(*args)
68  end
69
70  def create_self(keys)
71    # dummy
72  end
73  private :create_self
74
75  def show
76    @variable.value = ''
77    @status = bool(tk_call(self.class::TkCommandNames[0],
78                           @path, @variable,
79                           @complete_list, @selected_list,
80                           *hash_kv(@keys)))
81  end
82  alias display show
83
84  def status
85    @status
86  end
87
88  def value
89    @variable.list
90  end
91  alias selected value
92
93  def cget_strict(slot)
94    slot = slot.to_s
95    if slot == 'complete_list'
96      @complete_list
97    elsif slot == 'selected_list'
98      @selected_list
99    else
100      @keys[slot]
101    end
102  end
103  def cget(slot)
104    cget_strict(slot)
105  end
106
107  def configure(slot, value=None)
108    if slot.kind_of?(Hash)
109      slot.each{|k, v| configure(k, v)}
110    else
111      slot = slot.to_s
112      value = _symbolkey2str(value) if value.kind_of?(Hash)
113      if value && value != None
114        if slot == 'complete_list'
115          @complete_list = value
116        elsif slot == 'selected_list'
117          @selected_list = value
118        else
119          @keys[slot] = value
120        end
121      else
122        if slot == 'complete_list'
123          @complete_list = []
124        elsif slot == 'selected_list'
125          @selected_list = []
126        else
127          @keys.delete(slot)
128        end
129      end
130    end
131    self
132  end
133
134  def configinfo(slot = nil)
135    if slot
136      slot = slot.to_s
137      if slot == 'complete_list'
138        [ slot, nil, nil, nil, @complete_list ]
139      elsif slot == 'selected_list'
140        [ slot, nil, nil, nil, @selected_list ]
141      else
142        [ slot, nil, nil, nil, @keys[slot] ]
143      end
144    else
145      @keys.collect{|k, v| [ k, nil, nil, nil, v ] }           \
146      << [ 'complete_list', nil, nil, nil, @complete_list ]   \
147      << [ 'selected_list', nil, nil, nil, @selected_list ]
148    end
149  end
150end
151