~ubuntu-branches/ubuntu/intrepid/ruby1.8/intrepid-updates

« back to all changes in this revision

Viewing changes to ext/tk/sample/tkextlib/ICONS/viewIcons.rb

  • Committer: Bazaar Package Importer
  • Author(s): akira yamada
  • Date: 2007-03-13 22:11:58 UTC
  • mfrom: (1.1.5 upstream)
  • Revision ID: james.westby@ubuntu.com-20070313221158-h3oql37brlaf2go2
Tags: 1.8.6-1
* new upstream version, 1.8.6.
* libruby1.8 conflicts with libopenssl-ruby1.8 (< 1.8.6) (closes: #410018)
* changed packaging style to cdbs from dbs.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/env ruby
 
2
#
 
3
#   viewIcons.rb
 
4
#
 
5
#     --  Display icons from icon library.
 
6
#
 
7
#     --  Copy the clicked icon data (command string of creating 
 
8
#         a TkPhotoImage instance) to the clipboard.
 
9
#
 
10
require 'tk'
 
11
require 'tkextlib/ICONS'
 
12
 
 
13
class ViewIcons
 
14
  #####################################
 
15
  private
 
16
  #####################################
 
17
  def _create_controls
 
18
    @controls = base = TkFrame.new
 
19
    columns = TkFrame.new(base)
 
20
    line1 = TkFrame.new(base, :height=>2, :borderwidth=>1, :relief=>:sunken)
 
21
    line2 = TkFrame.new(base, :height=>2, :borderwidth=>1, :relief=>:sunken)
 
22
 
 
23
    lbl_library = TkLabel.new(base, :font=>@boldfont, :text=>'Library')
 
24
    lbl_groups  = TkLabel.new(base, :font=>@boldfont, :text=>'Groups')
 
25
    lbl_columns = TkLabel.new(base, :font=>@boldfont, :text=>'Columns')
 
26
 
 
27
    ent_library = TkEntry.new(base, :width=>50, :textvariable=>@library)
 
28
    ent_groups  = TkEntry.new(base, :width=>50, :textvariable=>@groups)
 
29
 
 
30
    btn_browse = TkButton.new(base, :text=>'Browse', 
 
31
                                    :command=>method(:select_icons))
 
32
    btn_view   = TkButton.new(base, :text=>'View',
 
33
                                    :command=>method(:display_icons))
 
34
    btn_exit   = TkButton.new(base, :text=>'Exit', :command=>proc{exit})
 
35
 
 
36
    @column_btns = {}
 
37
    6.step(20, 2){|i|
 
38
      @column_btns[i] = TkButton.new(columns, 
 
39
                                     :text=>i.to_s, :width=>2, 
 
40
                                     :command=>proc{set_columns(i)}
 
41
                                     ).pack(:side=>:left)
 
42
    }
 
43
    @column_btns[@columns][:relief] = :sunken
 
44
 
 
45
    lbl_library.grid(:row=>0, :column=>0, :padx=>4)
 
46
    ent_library.grid(:row=>0, :column=>1)
 
47
    btn_browse.grid(:row=>0, :column=>2, :padx=>4, :pady=>2, :sticky=>:ew)
 
48
 
 
49
    line1.grid(:row=>1, :column=>0, :pady=>2, :columnspan=>3, :sticky=>:ew)
 
50
 
 
51
    lbl_groups.grid(:row=>2, :column=>0, :padx=>4)
 
52
    ent_groups.grid(:row=>2, :column=>1)
 
53
    btn_view.grid(:row=>2, :column=>2, :padx=>4, :pady=>2, :sticky=>:ew)
 
54
 
 
55
    line1.grid(:row=>3, :column=>0, :pady=>2, :columnspan=>3, :sticky=>:ew)
 
56
 
 
57
    lbl_columns.grid(:row=>4, :column=>0, :padx=>4)
 
58
    columns.grid(:row=>4, :column=>1, :padx=>2, :sticky=>:ew)
 
59
    btn_exit.grid(:row=>4, :column=>2, :padx=>4, :pady=>2, :sticky=>:ew)
 
60
 
 
61
    base.pack
 
62
 
 
63
    ent_library.bind('Return', method(:display_icons), '')
 
64
    ent_groups.bind('Return', method(:display_icons), '')
 
65
  end
 
66
 
 
67
  def _create_display
 
68
    base = TkFrame.new(:borderwidth=>2, :relief=>:sunken)
 
69
 
 
70
    @icons_window = icons = TkCanvas.new(base)
 
71
    xscr = icons.xscrollbar(TkScrollbar.new(base))
 
72
    yscr = icons.yscrollbar(TkScrollbar.new(base))
 
73
 
 
74
    icons.grid(:row=>0, :column=>0, :sticky=>:news)
 
75
    yscr.grid(:row=>0, :column=>1, :sticky=>:ns)
 
76
    xscr.grid(:row=>1, :column=>0, :sticky=>:ew)
 
77
    base.grid_columnconfigure(0, :weight=>1)
 
78
    base.grid_columnconfigure(1, :weight=>0)
 
79
    base.grid_rowconfigure(0, :weight=>1)
 
80
    base.grid_rowconfigure(1, :weight=>0)
 
81
    # yscr.pack(:side=>:right, :fill=>:y)
 
82
    # xscr.pack(:side=>:bottom, :fill=>:x)
 
83
    # icons.pack(:side=>:left, :fill=>:both, :expand=>true)
 
84
 
 
85
    @icons_layout = TkFrame.new(icons).pack
 
86
    TkcWindow.create(icons, 0, 0, :anchor=>:nw, :window=>@icons_layout)
 
87
    @icons_layout.bind('Configure', method(:layout_resize), '')
 
88
 
 
89
    base.pack(:expand=>true, :fill=>:both)
 
90
  end
 
91
 
 
92
  def _create_info_window
 
93
    @info_window = TkToplevel.new(:background=>'lightyellow', :borderwidth=>1, 
 
94
                                  :relief=>:solid){|w|
 
95
      lbl_name = TkLabel.new(w, :text=>'Name', :background=>'lightyellow', 
 
96
                             :font=>@boldfont, :justify=>:left)
 
97
      lbl_grps = TkLabel.new(w, :text=>'Groups', :background=>'lightyellow', 
 
98
                             :font=>@boldfont, :justify=>:left)
 
99
      lbl_type = TkLabel.new(w, :text=>'Type', :background=>'lightyellow', 
 
100
                             :font=>@boldfont, :justify=>:left)
 
101
      lbl_size = TkLabel.new(w, :text=>'Size', :background=>'lightyellow', 
 
102
                             :font=>@boldfont, :justify=>:left)
 
103
 
 
104
      lbl_name.grid(:row=>0, :column=>0, :sticky=>:w)
 
105
      lbl_grps.grid(:row=>1, :column=>0, :sticky=>:w)
 
106
      lbl_type.grid(:row=>2, :column=>0, :sticky=>:w)
 
107
      lbl_size.grid(:row=>3, :column=>0, :sticky=>:w)
 
108
 
 
109
      @name = TkLabel.new(w, :background=>'lightyellow', :justify=>:left)
 
110
      @grps = TkLabel.new(w, :background=>'lightyellow', :justify=>:left)
 
111
      @type = TkLabel.new(w, :background=>'lightyellow', :justify=>:left)
 
112
      @size = TkLabel.new(w, :background=>'lightyellow', :justify=>:left)
 
113
 
 
114
      @name.grid(:row=>0, :column=>1, :sticky=>:w)
 
115
      @grps.grid(:row=>1, :column=>1, :sticky=>:w)
 
116
      @type.grid(:row=>2, :column=>1, :sticky=>:w)
 
117
      @size.grid(:row=>3, :column=>1, :sticky=>:w)
 
118
 
 
119
      def name(txt)
 
120
        @name['text'] = txt
 
121
      end
 
122
      def groups(txt)
 
123
        @grps['text'] = txt
 
124
      end
 
125
      def type(txt)
 
126
        @type['text'] = txt
 
127
      end
 
128
      def size(txt)
 
129
        @size['text'] = txt
 
130
      end
 
131
 
 
132
      overrideredirect(true)
 
133
      withdraw
 
134
    }
 
135
  end
 
136
 
 
137
  def initialize(init_path = Tk::LIBRARY)
 
138
    init_path = Tk::LIBRARY unless init_path
 
139
    init_path = File.expand_path(init_path)
 
140
    if File.directory?(init_path)
 
141
      @initial_dir  = init_path
 
142
      @initial_file = 'tkIcons'
 
143
    else
 
144
      @initial_dir  = File.dirname(init_path)
 
145
      @initial_file = File.basename(init_path)
 
146
    end
 
147
 
 
148
    if Tk::PLATFORM['platform'] == 'unix'
 
149
      TkOption.add('*HighlightThickness', 0)
 
150
    end
 
151
 
 
152
    @columns = 14
 
153
    @command = ""
 
154
 
 
155
    @delay_timer = nil
 
156
 
 
157
    dummy = TkLabel.new
 
158
    @font = dummy.font
 
159
    @boldfont = TkFont.new(@font, :weight=>:bold)
 
160
    @icons = {}
 
161
    @icon_name = {}
 
162
    @icon_info = {}
 
163
 
 
164
    @library = TkVariable.new(File.join(@initial_dir, @initial_file))
 
165
    @groups  = TkVariable.new('*')
 
166
 
 
167
    _create_controls
 
168
 
 
169
    _create_display
 
170
 
 
171
    _create_info_window
 
172
 
 
173
    Tk.root.title('viewIcons')
 
174
    layout_resize
 
175
    Tk.root.resizable(false, true)
 
176
 
 
177
    display_icons
 
178
  end
 
179
 
 
180
  def init_info(item, name)
 
181
    @icon_name[item] = name
 
182
 
 
183
    item.bind('Button-1', method(:clip_info),  '%W')
 
184
    item.bind('Enter',    method(:delay_info), '%W')
 
185
    item.bind('Leave',    method(:cancel_info), '')
 
186
  end
 
187
 
 
188
  def delay_info(item)
 
189
    cancel_info
 
190
    @delay_timer = TkTimer.new(200, 1, proc{ show_info(item) }).start
 
191
  end
 
192
 
 
193
  def cancel_info
 
194
    if @delay_timer
 
195
      @delay_timer.cancel 
 
196
      @delay_timer = nil
 
197
    end
 
198
    @info_window.withdraw
 
199
  end
 
200
 
 
201
  def show_info(item)
 
202
    name, groups, type, size = @icon_info[@icon_name[item]]
 
203
    @info_window.name(name)
 
204
    @info_window.groups(groups)
 
205
    @info_window.type(type)
 
206
    @info_window.size(size)
 
207
 
 
208
    info_x = item.winfo_rootx + 10
 
209
    info_y = item.winfo_rooty + item.winfo_height
 
210
 
 
211
    @info_window.geometry("+#{info_x}+#{info_y}")
 
212
    @info_window.deiconify
 
213
 
 
214
    @info_window.raise
 
215
 
 
216
    @delay_timer = nil
 
217
  end
 
218
 
 
219
  def primary_transfer(offset, max_chars)
 
220
    @command
 
221
  end
 
222
 
 
223
  def lost_selection
 
224
    @command = ""
 
225
  end
 
226
 
 
227
  def clip_info(item)
 
228
    name = @icon_name[item]
 
229
    data_width = 60
 
230
 
 
231
    cmd = "#{name} = TkPhotoImage.new(:data=><<'EOD')\n"
 
232
 
 
233
    icon_data = Tk::ICONS.query(name, :file=>@library.value, :items=>'d')[0][0]
 
234
 
 
235
    icon_data.scan(/.{1,#{data_width}}/m){|s| cmd << '   ' << s << "\n"}
 
236
 
 
237
    cmd << "EOD\n"
 
238
 
 
239
    @command = cmd
 
240
 
 
241
    TkClipboard.clear
 
242
    TkClipboard.append(@command)
 
243
 
 
244
    if Tk::PLATFORM['platform'] == 'unix'
 
245
      TkSelection.handle(Tk.root, method(:primary_transfer), 
 
246
                         :selection=>'PRIMARY')
 
247
      TkSelection.set_owner(Tk.root, :selection=>'PRIMARY', 
 
248
                            :command=>method(:lost_selection))
 
249
    end
 
250
 
 
251
    Tk.bell
 
252
  end
 
253
 
 
254
  def layout_resize
 
255
    Tk.update
 
256
    bbox = @icons_window.bbox('all')
 
257
    width = @controls.winfo_width - @icons_window.yscrollbar.winfo_width - 8
 
258
 
 
259
    @icons_window.configure(:width=>width, :scrollregion=>bbox, 
 
260
                            :xscrollincrement=>'0.1i', 
 
261
                            :yscrollincrement=>'0.1i')
 
262
  end
 
263
 
 
264
  def select_icons
 
265
    new_lib = Tk.getOpenFile(:initialdir=>@initial_dir, 
 
266
                             :initialfile=>'tkIcons', 
 
267
                             :title=>'Select Icon Library', 
 
268
                             :filetypes=>[
 
269
                               ['Icon Libraries', ['tkIcons*']], 
 
270
                               ['All Files', ['*']]
 
271
                             ])
 
272
 
 
273
    @library.value = new_lib if new_lib.length != 0
 
274
    display_icons
 
275
  end
 
276
 
 
277
  def display_icons
 
278
    column = 0
 
279
    limit = @columns - 1
 
280
    row = 0
 
281
 
 
282
    unless File.exist?(@library.value)
 
283
      Tk.messageBox(:icon=>'warning', :message=>'File does not exist', 
 
284
                    :title=>'viewIcons')
 
285
      return
 
286
    end
 
287
 
 
288
    cursor = Tk.root[:cursor]
 
289
    Tk.root[:cursor] = 'watch'
 
290
 
 
291
    Tk::ICONS.delete(@icons)
 
292
 
 
293
    @icons_frame.destroy if @icons_frame
 
294
    @icons_frame = TkFrame.new(@icons_layout).pack
 
295
 
 
296
    @icons = Tk::ICONS.create(:file=>@library.value, :group=>@groups.value)
 
297
 
 
298
    Tk::ICONS.query(:file=>@library.value, :group=>@groups.value).each{|inf|
 
299
      name = inf[0]
 
300
      @icon_info[name] = inf
 
301
 
 
302
      lbl = TkLabel.new(@icons_frame, :image=>"::icon::#{name}")
 
303
      lbl.grid(:column=>column, :row=>row, :padx=>3, :pady=>3)
 
304
      # lbl.grid_columnconfigure column
 
305
 
 
306
      init_info(lbl, name)
 
307
 
 
308
      if column == limit
 
309
        column = 0
 
310
        row += 1
 
311
      else
 
312
        column += 1
 
313
      end
 
314
    }
 
315
 
 
316
    Tk.root[:cursor] = cursor
 
317
  end
 
318
 
 
319
  def set_columns(columns)
 
320
    @columns = columns
 
321
    6.step(20, 2){|i| @column_btns[i][:relief] = :raised }
 
322
    @column_btns[@columns][:relief] = :sunken
 
323
    display_icons
 
324
  end
 
325
end
 
326
 
 
327
ViewIcons.new(ARGV[0])
 
328
 
 
329
Tk.mainloop