From 1e760c0be3ed35874204114e7454509f740c0fe2 Mon Sep 17 00:00:00 2001 From: shyouhei Date: Wed, 22 Aug 2007 01:53:51 +0000 Subject: add tag v1_8_6_71 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/tags/v1_8_5_71@13189 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- .../ext/tk/sample/tkextlib/ICONS/viewIcons.rb | 329 +++++++++++++++++++++ 1 file changed, 329 insertions(+) create mode 100644 ruby_1_8_6/ext/tk/sample/tkextlib/ICONS/viewIcons.rb (limited to 'ruby_1_8_6/ext/tk/sample/tkextlib/ICONS/viewIcons.rb') diff --git a/ruby_1_8_6/ext/tk/sample/tkextlib/ICONS/viewIcons.rb b/ruby_1_8_6/ext/tk/sample/tkextlib/ICONS/viewIcons.rb new file mode 100644 index 0000000000..fc88eb5c85 --- /dev/null +++ b/ruby_1_8_6/ext/tk/sample/tkextlib/ICONS/viewIcons.rb @@ -0,0 +1,329 @@ +#!/usr/bin/env ruby +# +# viewIcons.rb +# +# -- Display icons from icon library. +# +# -- Copy the clicked icon data (command string of creating +# a TkPhotoImage instance) to the clipboard. +# +require 'tk' +require 'tkextlib/ICONS' + +class ViewIcons + ##################################### + private + ##################################### + def _create_controls + @controls = base = TkFrame.new + columns = TkFrame.new(base) + line1 = TkFrame.new(base, :height=>2, :borderwidth=>1, :relief=>:sunken) + line2 = TkFrame.new(base, :height=>2, :borderwidth=>1, :relief=>:sunken) + + lbl_library = TkLabel.new(base, :font=>@boldfont, :text=>'Library') + lbl_groups = TkLabel.new(base, :font=>@boldfont, :text=>'Groups') + lbl_columns = TkLabel.new(base, :font=>@boldfont, :text=>'Columns') + + ent_library = TkEntry.new(base, :width=>50, :textvariable=>@library) + ent_groups = TkEntry.new(base, :width=>50, :textvariable=>@groups) + + btn_browse = TkButton.new(base, :text=>'Browse', + :command=>method(:select_icons)) + btn_view = TkButton.new(base, :text=>'View', + :command=>method(:display_icons)) + btn_exit = TkButton.new(base, :text=>'Exit', :command=>proc{exit}) + + @column_btns = {} + 6.step(20, 2){|i| + @column_btns[i] = TkButton.new(columns, + :text=>i.to_s, :width=>2, + :command=>proc{set_columns(i)} + ).pack(:side=>:left) + } + @column_btns[@columns][:relief] = :sunken + + lbl_library.grid(:row=>0, :column=>0, :padx=>4) + ent_library.grid(:row=>0, :column=>1) + btn_browse.grid(:row=>0, :column=>2, :padx=>4, :pady=>2, :sticky=>:ew) + + line1.grid(:row=>1, :column=>0, :pady=>2, :columnspan=>3, :sticky=>:ew) + + lbl_groups.grid(:row=>2, :column=>0, :padx=>4) + ent_groups.grid(:row=>2, :column=>1) + btn_view.grid(:row=>2, :column=>2, :padx=>4, :pady=>2, :sticky=>:ew) + + line1.grid(:row=>3, :column=>0, :pady=>2, :columnspan=>3, :sticky=>:ew) + + lbl_columns.grid(:row=>4, :column=>0, :padx=>4) + columns.grid(:row=>4, :column=>1, :padx=>2, :sticky=>:ew) + btn_exit.grid(:row=>4, :column=>2, :padx=>4, :pady=>2, :sticky=>:ew) + + base.pack + + ent_library.bind('Return', method(:display_icons), '') + ent_groups.bind('Return', method(:display_icons), '') + end + + def _create_display + base = TkFrame.new(:borderwidth=>2, :relief=>:sunken) + + @icons_window = icons = TkCanvas.new(base) + xscr = icons.xscrollbar(TkScrollbar.new(base)) + yscr = icons.yscrollbar(TkScrollbar.new(base)) + + icons.grid(:row=>0, :column=>0, :sticky=>:news) + yscr.grid(:row=>0, :column=>1, :sticky=>:ns) + xscr.grid(:row=>1, :column=>0, :sticky=>:ew) + base.grid_columnconfigure(0, :weight=>1) + base.grid_columnconfigure(1, :weight=>0) + base.grid_rowconfigure(0, :weight=>1) + base.grid_rowconfigure(1, :weight=>0) + # yscr.pack(:side=>:right, :fill=>:y) + # xscr.pack(:side=>:bottom, :fill=>:x) + # icons.pack(:side=>:left, :fill=>:both, :expand=>true) + + @icons_layout = TkFrame.new(icons).pack + TkcWindow.create(icons, 0, 0, :anchor=>:nw, :window=>@icons_layout) + @icons_layout.bind('Configure', method(:layout_resize), '') + + base.pack(:expand=>true, :fill=>:both) + end + + def _create_info_window + @info_window = TkToplevel.new(:background=>'lightyellow', :borderwidth=>1, + :relief=>:solid){|w| + lbl_name = TkLabel.new(w, :text=>'Name', :background=>'lightyellow', + :font=>@boldfont, :justify=>:left) + lbl_grps = TkLabel.new(w, :text=>'Groups', :background=>'lightyellow', + :font=>@boldfont, :justify=>:left) + lbl_type = TkLabel.new(w, :text=>'Type', :background=>'lightyellow', + :font=>@boldfont, :justify=>:left) + lbl_size = TkLabel.new(w, :text=>'Size', :background=>'lightyellow', + :font=>@boldfont, :justify=>:left) + + lbl_name.grid(:row=>0, :column=>0, :sticky=>:w) + lbl_grps.grid(:row=>1, :column=>0, :sticky=>:w) + lbl_type.grid(:row=>2, :column=>0, :sticky=>:w) + lbl_size.grid(:row=>3, :column=>0, :sticky=>:w) + + @name = TkLabel.new(w, :background=>'lightyellow', :justify=>:left) + @grps = TkLabel.new(w, :background=>'lightyellow', :justify=>:left) + @type = TkLabel.new(w, :background=>'lightyellow', :justify=>:left) + @size = TkLabel.new(w, :background=>'lightyellow', :justify=>:left) + + @name.grid(:row=>0, :column=>1, :sticky=>:w) + @grps.grid(:row=>1, :column=>1, :sticky=>:w) + @type.grid(:row=>2, :column=>1, :sticky=>:w) + @size.grid(:row=>3, :column=>1, :sticky=>:w) + + def name(txt) + @name['text'] = txt + end + def groups(txt) + @grps['text'] = txt + end + def type(txt) + @type['text'] = txt + end + def size(txt) + @size['text'] = txt + end + + overrideredirect(true) + withdraw + } + end + + def initialize(init_path = Tk::LIBRARY) + init_path = Tk::LIBRARY unless init_path + init_path = File.expand_path(init_path) + if File.directory?(init_path) + @initial_dir = init_path + @initial_file = 'tkIcons' + else + @initial_dir = File.dirname(init_path) + @initial_file = File.basename(init_path) + end + + if Tk::PLATFORM['platform'] == 'unix' + TkOption.add('*HighlightThickness', 0) + end + + @columns = 14 + @command = "" + + @delay_timer = nil + + dummy = TkLabel.new + @font = dummy.font + @boldfont = TkFont.new(@font, :weight=>:bold) + @icons = {} + @icon_name = {} + @icon_info = {} + + @library = TkVariable.new(File.join(@initial_dir, @initial_file)) + @groups = TkVariable.new('*') + + _create_controls + + _create_display + + _create_info_window + + Tk.root.title('viewIcons') + layout_resize + Tk.root.resizable(false, true) + + display_icons + end + + def init_info(item, name) + @icon_name[item] = name + + item.bind('Button-1', method(:clip_info), '%W') + item.bind('Enter', method(:delay_info), '%W') + item.bind('Leave', method(:cancel_info), '') + end + + def delay_info(item) + cancel_info + @delay_timer = TkTimer.new(200, 1, proc{ show_info(item) }).start + end + + def cancel_info + if @delay_timer + @delay_timer.cancel + @delay_timer = nil + end + @info_window.withdraw + end + + def show_info(item) + name, groups, type, size = @icon_info[@icon_name[item]] + @info_window.name(name) + @info_window.groups(groups) + @info_window.type(type) + @info_window.size(size) + + info_x = item.winfo_rootx + 10 + info_y = item.winfo_rooty + item.winfo_height + + @info_window.geometry("+#{info_x}+#{info_y}") + @info_window.deiconify + + @info_window.raise + + @delay_timer = nil + end + + def primary_transfer(offset, max_chars) + @command + end + + def lost_selection + @command = "" + end + + def clip_info(item) + name = @icon_name[item] + data_width = 60 + + cmd = "#{name} = TkPhotoImage.new(:data=><<'EOD')\n" + + icon_data = Tk::ICONS.query(name, :file=>@library.value, :items=>'d')[0][0] + + icon_data.scan(/.{1,#{data_width}}/m){|s| cmd << ' ' << s << "\n"} + + cmd << "EOD\n" + + @command = cmd + + TkClipboard.clear + TkClipboard.append(@command) + + if Tk::PLATFORM['platform'] == 'unix' + TkSelection.handle(Tk.root, method(:primary_transfer), + :selection=>'PRIMARY') + TkSelection.set_owner(Tk.root, :selection=>'PRIMARY', + :command=>method(:lost_selection)) + end + + Tk.bell + end + + def layout_resize + Tk.update + bbox = @icons_window.bbox('all') + width = @controls.winfo_width - @icons_window.yscrollbar.winfo_width - 8 + + @icons_window.configure(:width=>width, :scrollregion=>bbox, + :xscrollincrement=>'0.1i', + :yscrollincrement=>'0.1i') + end + + def select_icons + new_lib = Tk.getOpenFile(:initialdir=>@initial_dir, + :initialfile=>'tkIcons', + :title=>'Select Icon Library', + :filetypes=>[ + ['Icon Libraries', ['tkIcons*']], + ['All Files', ['*']] + ]) + + @library.value = new_lib if new_lib.length != 0 + display_icons + end + + def display_icons + column = 0 + limit = @columns - 1 + row = 0 + + unless File.exist?(@library.value) + Tk.messageBox(:icon=>'warning', :message=>'File does not exist', + :title=>'viewIcons') + return + end + + cursor = Tk.root[:cursor] + Tk.root[:cursor] = 'watch' + + Tk::ICONS.delete(@icons) + + @icons_frame.destroy if @icons_frame + @icons_frame = TkFrame.new(@icons_layout).pack + + @icons = Tk::ICONS.create(:file=>@library.value, :group=>@groups.value) + + Tk::ICONS.query(:file=>@library.value, :group=>@groups.value).each{|inf| + name = inf[0] + @icon_info[name] = inf + + lbl = TkLabel.new(@icons_frame, :image=>"::icon::#{name}") + lbl.grid(:column=>column, :row=>row, :padx=>3, :pady=>3) + # lbl.grid_columnconfigure column + + init_info(lbl, name) + + if column == limit + column = 0 + row += 1 + else + column += 1 + end + } + + Tk.root[:cursor] = cursor + end + + def set_columns(columns) + @columns = columns + 6.step(20, 2){|i| @column_btns[i][:relief] = :raised } + @column_btns[@columns][:relief] = :sunken + display_icons + end +end + +ViewIcons.new(ARGV[0]) + +Tk.mainloop -- cgit v1.2.3