diff options
author | nagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-03-30 08:44:55 +0000 |
---|---|---|
committer | nagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-03-30 08:44:55 +0000 |
commit | a50a6582ff34aabe45a97530a127b52a9ad53511 (patch) | |
tree | 08e9410ac38b9d3a2780f4ebca96bfc6edeb7a2a /ext | |
parent | a937ea5c991407a49ef39947b68c3c39992a5f35 (diff) | |
download | ruby-a50a6582ff34aabe45a97530a127b52a9ad53511.tar.gz ruby-a50a6582ff34aabe45a97530a127b52a9ad53511.tar.xz ruby-a50a6582ff34aabe45a97530a127b52a9ad53511.zip |
* ext/tcltklib/tcltklib.c: add TclTkIp#_create_console() method to
create a Tcl/Tk's console window.
* ext/tk/lib/multi-tk.rb: support TclTkIp#_create_console() method.
* ext/tk/lib/remote-tk.rb: ditto.
* ext/tk/lib/tk/console.rb: ditto.
* ext/tk/lib/tk.rb: update RELEASE_DATE
* ext/tk/sample/demo-*/check2.rb: use 'return' in the Proc object.
* ext/tk/sample/tkextlib/**: ditto.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8@8213 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r-- | ext/tcltklib/tcltklib.c | 88 | ||||
-rw-r--r-- | ext/tk/lib/multi-tk.rb | 4 | ||||
-rw-r--r-- | ext/tk/lib/remote-tk.rb | 4 | ||||
-rw-r--r-- | ext/tk/lib/tk.rb | 2 | ||||
-rw-r--r-- | ext/tk/lib/tk/console.rb | 3 | ||||
-rw-r--r-- | ext/tk/sample/demos-en/check2.rb | 44 | ||||
-rw-r--r-- | ext/tk/sample/demos-jp/check2.rb | 44 | ||||
-rw-r--r-- | ext/tk/sample/tkextlib/bwidget/tree.rb | 2 | ||||
-rw-r--r-- | ext/tk/sample/tkextlib/tkHTML/hv.rb | 85 | ||||
-rw-r--r-- | ext/tk/sample/tkextlib/tkHTML/ss.rb | 682 | ||||
-rw-r--r-- | ext/tk/sample/tkextlib/tktable/basic.rb | 4 | ||||
-rw-r--r-- | ext/tk/sample/tkextlib/tktable/command.rb | 4 | ||||
-rw-r--r-- | ext/tk/sample/tkextlib/tktable/debug.rb | 2 | ||||
-rw-r--r-- | ext/tk/sample/tkextlib/tktable/maxsize.rb | 2 | ||||
-rw-r--r-- | ext/tk/sample/tkextlib/treectrl/demo.rb | 1 |
15 files changed, 553 insertions, 418 deletions
diff --git a/ext/tcltklib/tcltklib.c b/ext/tcltklib/tcltklib.c index 8756d5425..1a00c7e75 100644 --- a/ext/tcltklib/tcltklib.c +++ b/ext/tcltklib/tcltklib.c @@ -4,7 +4,7 @@ * Oct. 24, 1997 Y. Matsumoto */ -#define TCLTKLIB_RELEASE_DATE "2005-03-10" +#define TCLTKLIB_RELEASE_DATE "2005-03-30" #include "ruby.h" #include "rubysig.h" @@ -22,6 +22,12 @@ #include <tcl.h> #include <tk.h> +#ifndef TCL_ALPHA_RELEASE +#define TCL_ALPHA_RELEASE 0 +#define TCL_BETA_RELEASE 1 +#define TCL_FINAL_RELEASE 2 +#endif + #ifdef __MACOS__ # include <tkMac.h> # include <Quickdraw.h> @@ -4945,6 +4951,84 @@ ip_create_slave(argc, argv, self) return retval; } +#if defined(MAC_TCL) || defined(__WIN32__) +#if TCL_MAJOR_VERSION < 8 \ + || (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 0) \ + || (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 1 \ + && (TCL_RELEASE_LEVEL == TCL_ALPHA_RELEASE \ + || (TCL_RELEASE_LEVEL == TCL_BETA_RELEASE \ + && TCL_RELEASE_SERIAL < 2) ) ) +EXTERN void TkConsoleCreate _((void)); +#endif +#if TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 1 \ + && ( (TCL_RELEASE_LEVEL == TCL_FINAL_RELEASE \ + && TCL_RELEASE_SERIAL == 0) \ + || (TCL_RELEASE_LEVEL == TCL_BETA_RELEASE \ + && TCL_RELEASE_SERIAL >= 2) ) +EXTERN void TkConsoleCreate_ _((void)); +#endif +#endif +static VALUE +ip_create_console_core(interp, argc, argv) + VALUE interp; + int argc; /* dummy */ + VALUE *argv; /* dummy */ +{ + struct tcltkip *ptr = get_ip(interp); + + if (Tcl_GetVar(ptr->ip,"tcl_interactive",TCL_GLOBAL_ONLY) == (char*)NULL) { + Tcl_SetVar(ptr->ip, "tcl_interactive", "0", TCL_GLOBAL_ONLY); + } + + +#if TCL_MAJOR_VERSION > 8 \ + || (TCL_MAJOR_VERSION == 8 \ + && (TCL_MINOR_VERSION > 1 \ + || (TCL_MINOR_VERSION == 1 \ + && TCL_RELEASE_LEVEL == TCL_FINAL_RELEASE \ + && TCL_RELEASE_SERIAL >= 1) ) ) + Tk_InitConsoleChannels(ptr->ip); + + if (Tk_CreateConsoleWindow(ptr->ip) != TCL_OK) { + rb_raise(rb_eRuntimeError, "fail to create console-window"); + } +#else +#if defined(MAC_TCL) || defined(__WIN32__) +#if TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 1 \ + && ( (TCL_RELEASE_LEVEL == TCL_FINAL_RELEASE && TCL_RELEASE_SERIAL == 0) \ + || (TCL_RELEASE_LEVEL == TCL_BETA_RELEASE && TCL_RELEASE_SERIAL >= 2) ) + TkConsoleCreate_(); +#else + TkConsoleCreate(); +#endif + + if (TkConsoleInit(ptr->ip) != TCL_OK) { + rb_raise(rb_eRuntimeError, "fail to create console-window"); + } +#else + rb_notimplement(); +#endif +#endif + + return interp; +} + +static VALUE +ip_create_console(self) + VALUE self; +{ + struct tcltkip *ptr = get_ip(self); + + /* ip is deleted? */ + if (ptr == (struct tcltkip *)NULL || ptr->ip == (Tcl_Interp*)NULL + || Tcl_InterpDeleted(ptr->ip)) { + DUMP1("ip is deleted"); + rb_raise(rb_eRuntimeError, "interpreter is deleted"); + } + + return tk_funcall(ip_create_console_core, 0, (VALUE*)NULL, self); +} + /* make ip "safe" */ static VALUE ip_make_safe_core(interp, argc, argv) @@ -8349,6 +8433,8 @@ Init_tcltklib() rb_define_method(ip, "_invoke", ip_invoke, -1); rb_define_method(ip, "_return_value", ip_retval, 0); + rb_define_method(ip, "_create_console", ip_create_console, 0); + /* --------------------------------------------------------------- */ rb_define_method(ip, "_get_variable", ip_get_variable, 2); diff --git a/ext/tk/lib/multi-tk.rb b/ext/tk/lib/multi-tk.rb index a38f079ad..49427575d 100644 --- a/ext/tk/lib/multi-tk.rb +++ b/ext/tk/lib/multi-tk.rb @@ -1787,6 +1787,10 @@ class << MultiTkIp def _conv_listelement(arg) __getip._conv_listelement(arg) end + + def _create_console + __getip._create_console + end end diff --git a/ext/tk/lib/remote-tk.rb b/ext/tk/lib/remote-tk.rb index 04d86d4cd..03b6a45e5 100644 --- a/ext/tk/lib/remote-tk.rb +++ b/ext/tk/lib/remote-tk.rb @@ -400,6 +400,10 @@ class RemoteTkIp @interp._conv_listelement(str) end + def _create_console + fail RuntimeError, 'not support "_create_console" on the remote interpreter' + end + def mainloop fail RuntimeError, 'not support "mainloop" on the remote interpreter' end diff --git a/ext/tk/lib/tk.rb b/ext/tk/lib/tk.rb index 61e76c29b..1997bba9c 100644 --- a/ext/tk/lib/tk.rb +++ b/ext/tk/lib/tk.rb @@ -4024,7 +4024,7 @@ end #Tk.freeze module Tk - RELEASE_DATE = '2005-03-26'.freeze + RELEASE_DATE = '2005-03-30'.freeze autoload :AUTO_PATH, 'tk/variable' autoload :TCL_PACKAGE_PATH, 'tk/variable' diff --git a/ext/tk/lib/tk/console.rb b/ext/tk/lib/tk/console.rb index f0d2c7aa8..1a267b717 100644 --- a/ext/tk/lib/tk/console.rb +++ b/ext/tk/lib/tk/console.rb @@ -9,6 +9,9 @@ module TkConsole TkCommandNames = ['console'.freeze].freeze + def self.create + TkCore::INTERP._create_console + end def self.title(str=None) tk_call 'console', str end diff --git a/ext/tk/sample/demos-en/check2.rb b/ext/tk/sample/demos-en/check2.rb index e2d5982d2..97d61fba0 100644 --- a/ext/tk/sample/demos-en/check2.rb +++ b/ext/tk/sample/demos-en/check2.rb @@ -76,31 +76,31 @@ TkCheckButton.new($check2_demo, :text=>'Safety Check', :variable=>safety, # tristate check in_check = false tristate_check = proc{|n1,n2,op| - return if in_check - - in_check = true - begin - if n1 == safety - if safety == 'none' - wipers.value = 0 - brakes.value = 0 - sober.value = 0 - elsif safety == 'all' - wipers.value = 1 - brakes.value = 1 - sober.value = 1 - end - else - if wipers == 1 && brakes == 1 && sober == 1 - safety.value = 'all' - elsif wipers == 1 || brakes == 1 || sober == 1 - safety.value = 'partial' + unless in_check + in_check = true + begin + if n1 == safety + if safety == 'none' + wipers.value = 0 + brakes.value = 0 + sober.value = 0 + elsif safety == 'all' + wipers.value = 1 + brakes.value = 1 + sober.value = 1 + end else - safety.value = 'none' + if wipers == 1 && brakes == 1 && sober == 1 + safety.value = 'all' + elsif wipers == 1 || brakes == 1 || sober == 1 + safety.value = 'partial' + else + safety.value = 'none' + end end + ensure + in_check = false end - ensure - in_check = false end } diff --git a/ext/tk/sample/demos-jp/check2.rb b/ext/tk/sample/demos-jp/check2.rb index 5d0c74a74..f681a4d68 100644 --- a/ext/tk/sample/demos-jp/check2.rb +++ b/ext/tk/sample/demos-jp/check2.rb @@ -76,31 +76,31 @@ TkCheckButton.new($check2_demo, :text=>'°ÂÁ´À¸¡ºº', :variable=>safety, # tristate check in_check = false tristate_check = proc{|n1,n2,op| - return if in_check - - in_check = true - begin - if n1 == safety - if safety == 'none' - wipers.value = 0 - brakes.value = 0 - sober.value = 0 - elsif safety == 'all' - wipers.value = 1 - brakes.value = 1 - sober.value = 1 - end - else - if wipers == 1 && brakes == 1 && sober == 1 - safety.value = 'all' - elsif wipers == 1 || brakes == 1 || sober == 1 - safety.value = 'partial' + unless in_check + in_check = true + begin + if n1 == safety + if safety == 'none' + wipers.value = 0 + brakes.value = 0 + sober.value = 0 + elsif safety == 'all' + wipers.value = 1 + brakes.value = 1 + sober.value = 1 + end else - safety.value = 'none' + if wipers == 1 && brakes == 1 && sober == 1 + safety.value = 'all' + elsif wipers == 1 || brakes == 1 || sober == 1 + safety.value = 'partial' + else + safety.value = 'none' + end end + ensure + in_check = false end - ensure - in_check = false end } diff --git a/ext/tk/sample/tkextlib/bwidget/tree.rb b/ext/tk/sample/tkextlib/bwidget/tree.rb index 2b33962fa..e1fcaa774 100644 --- a/ext/tk/sample/tkextlib/bwidget/tree.rb +++ b/ext/tk/sample/tkextlib/bwidget/tree.rb @@ -119,7 +119,7 @@ module DemoTree Tk.root.bind_remove('Unmap') Tk.root.bind_remove('Map') Tk.root.bind_remove('Configure') - return true + true }) end diff --git a/ext/tk/sample/tkextlib/tkHTML/hv.rb b/ext/tk/sample/tkextlib/tkHTML/hv.rb index d9f3ea7d7..a4d78ea5b 100644 --- a/ext/tk/sample/tkextlib/tkHTML/hv.rb +++ b/ext/tk/sample/tkextlib/tkHTML/hv.rb @@ -78,38 +78,43 @@ big_imgs = {} hotkey = {} move_big_image = proc{|b| - return unless big_imgs.key?(b) - b.copy(big_imgs[b]) - big_imgs[b].delete - big_imgs.delete(b) - Tk.update + if big_imgs.key?(b) + b.copy(big_imgs[b]) + big_imgs[b].delete + big_imgs.delete(b) + Tk.update + end } image_cmd = proc{|*args| - return smgray unless show_img.bool - fn = args[0] - if old_imgs.key?(fn) - images[fn] = old_imgs[fn] - old_imgs.delete(fn) - return images[fn] - end + if show_img.bool + smgray + else + fn = args[0] - begin - img = TkPhotoImage.new(:file=>fn) - rescue - return smgray - end + if old_imgs.key?(fn) + images[fn] = old_imgs[fn] + old_imgs.delete(fn) + images[fn] - if img.width * img.height > 20000 - b = TkPhotoImage.new(:width=>img.width, :height=>img.height) - big_imgs[b] = img - img = b - Tk.after_idle(proc{ move_big_image.call(b) }) + else + begin + img = TkPhotoImage.new(:file=>fn) + rescue + smgray + else + if img.width * img.height > 20000 + b = TkPhotoImage.new(:width=>img.width, :height=>img.height) + big_imgs[b] = img + img = b + Tk.after_idle(proc{ move_big_image.call(b) }) + end + + images[fn] = img + img + end + end end - - images[fn] = img - - img } # @@ -183,12 +188,13 @@ clear_screen = proc{ # Load a file into the HTML widget # load_file = proc{|name| - return unless (doc = read_file.call(name)) - clear_screen.call - last_file = name - html.configure(:base=>name) - html.parse(doc) - old_imgs.clear + if (doc = read_file.call(name)) + clear_screen.call + last_file = name + html.configure(:base=>name) + html.parse(doc) + old_imgs.clear + end } href_binding = proc{|x, y| @@ -196,15 +202,16 @@ href_binding = proc{|x, y| html.selection_clear priv['mark'] = "@#{x},#{y}" lst = html.href(x, y) - return if lst.size.zero? - lnk, target = lst + unless lst.size.zero? + lnk, target = lst - if lnk != "" - if lnk =~ /^#{last_file}#(.*)$/ - html.yview($1) - else - load_file.call(lnk) + if lnk != "" + if lnk =~ /^#{last_file}#(.*)$/ + html.yview($1) + else + load_file.call(lnk) + end end end } diff --git a/ext/tk/sample/tkextlib/tkHTML/ss.rb b/ext/tk/sample/tkextlib/tkHTML/ss.rb index 3dbb7ec71..1c13d7ac3 100644 --- a/ext/tk/sample/tkextlib/tkHTML/ss.rb +++ b/ext/tk/sample/tkextlib/tkHTML/ss.rb @@ -6,401 +6,431 @@ require 'tk' require 'tkextlib/tkHTML' -root = TkRoot.new(:title=>'HTML File Viewer', :iconname=>'HV') -fswin = nil - -html = nil -html_fs = nil - -hotkey = {} - file = ARGV[0] +class TkHTML_File_Viewer + include TkComm # These are images to use with the actual image specified in a # "<img>" markup can't be found. # -biggray = TkPhotoImage.new(:data=><<'EOD') +@@biggray = TkPhotoImage.new(:data=><<'EOD') R0lGODdhPAA+APAAALi4uAAAACwAAAAAPAA+AAACQISPqcvtD6OctNqLs968+w+G4kiW5omm 6sq27gvH8kzX9o3n+s73/g8MCofEovGITCqXzKbzCY1Kp9Sq9YrNFgsAO/// EOD -smgray = TkPhotoImage.new(:data=><<'EOD') +@@smgray = TkPhotoImage.new(:data=><<'EOD') R0lGODdhOAAYAPAAALi4uAAAACwAAAAAOAAYAAACI4SPqcvtD6OctNqLs968+w+G4kiW5omm 6sq27gvH8kzX9m0VADv/ EOD + def initialize(file = nil) + @root = TkRoot.new(:title=>'HTML File Viewer', :iconname=>'HV') + @fswin = nil + + @html = nil + @html_fs = nil + + @hotkey = {} + + @applet_arg = TkVarAccess.new_hash('AppletArg') + + @images = {} + @old_imgs = {} + @big_imgs = {} + + @last_dir = Dir.pwd + + @last_file = '' + + @key_block = false + + Tk::HTML_Widget::ClippingWindow.bind('1', + proc{|w, ksym| key_press(w, ksym)}, + '%W Down') + Tk::HTML_Widget::ClippingWindow.bind('3', + proc{|w, ksym| key_press(w, ksym)}, + '%W Up') + Tk::HTML_Widget::ClippingWindow.bind('2', + proc{|w, ksym| key_press(w, ksym)}, + '%W Down') + + Tk::HTML_Widget::ClippingWindow.bind('KeyPress', + proc{|w, ksym| key_press(w, ksym)}, + '%W %K') + + ############################################ + # + # Build the half-size view of the page + # + menu_spec = [ + [['File', 0], + ['Open', proc{sel_load()}, 0], + ['Full Screen', proc{fullscreen()}, 0], + ['Refresh', proc{refresh()}, 0], + '---', + ['Exit', proc{exit}, 1]] + ] + + mbar = @root.add_menubar(menu_spec) + + @html = Tk::HTML_Widget.new(:width=>512, :height=>384, + :padx=>5, :pady=>9, + :formcommand=>proc{|*args| form_cmd(*args)}, + :imagecommand=>proc{|*args| + image_cmd(1, *args) + }, + :scriptcommand=>proc{|*args| + script_cmd(*args) + }, + :appletcommand=>proc{|*args| + applet_cmd(*args) + }, + :hyperlinkcommand=>proc{|*args| + hyper_cmd(*args) + }, + :fontcommand=>proc{|*args| + pick_font(*args) + }, + :appletcommand=>proc{|*args| + run_applet('small', *args) + }, + :bg=>'white', :tablerelief=>:raised) -# -# A font chooser routine. -# -# html[:fontcommand] = pick_font -pick_font = proc{|size, attrs| - # puts "FontCmd: #{size} #{attrs}" - [ ((attrs =~ /fixed/)? 'courier': 'charter'), - (12 * (1.2**(size.to_f - 4.0))).to_i, - ((attrs =~ /italic/)? 'italic': 'roman'), - ((attrs =~ /bold/)? 'bold': 'normal') ].join(' ') -} - -# This routine is called to pick fonts for the fullscreen view. -# -baseFontSize = 24 -pick_font_fs = proc{|size, attrs| - # puts "FontCmd: #{size} #{attrs}" - [ ((attrs =~ /fixed/)? 'courier': 'charter'), - (baseFontSize * (1.2**(size.to_f - 4.0))).to_i, - ((attrs =~ /italic/)? 'italic': 'roman'), - ((attrs =~ /bold/)? 'bold': 'normal') ].join(' ') -} + @html.token_handler('meta', proc{|*args| meta(@html, *args)}) -# -# -hyper_cmd = proc{|*args| - puts "HyperlinkCommand: #{args.inspect}" -} + vscr = @html.yscrollbar(TkScrollbar.new) + hscr = @html.xscrollbar(TkScrollbar.new) -# This routine is called to run an applet -# -applet_arg = TkVarAccess.new_hash('AppletArg') -run_applet = proc{|size, w, arglist| - applet_arg.value = Hash[*simplelist(arglist)] + Tk.grid(@html, vscr, :sticky=>:news) + Tk.grid(hscr, :sticky=>:ew) + @root.grid_columnconfigure(0, :weight=>1) + @root.grid_columnconfigure(1, :weight=>0) + @root.grid_rowconfigure(0, :weight=>1) + @root.grid_rowconfigure(1, :weight=>0) - return unless applet_arg.key?('src') + ############################################ - src = html.remove(applet_arg['src']) + @html.clipwin.focus - applet_arg['window'] = w - applet_arg['fontsize'] = size + # If an arguent was specified, read it into the HTML widget. + # + Tk.update + if file && file != "" + load_file(file) + end + end - begin - Tk.load_tclscript(src) - rescue => e - puts "Applet error: #{e.message}" + # + # A font chooser routine. + # + # html[:fontcommand] = pick_font + def pick_font(size, attrs) + # puts "FontCmd: #{size} #{attrs}" + [ ((attrs =~ /fixed/)? 'courier': 'charter'), + (12 * (1.2**(size.to_f - 4.0))).to_i, + ((attrs =~ /italic/)? 'italic': 'roman'), + ((attrs =~ /bold/)? 'bold': 'normal') ].join(' ') end -} -# -# -form_cmd = proc{|n, cmd, *args| -} + # This routine is called to pick fonts for the fullscreen view. + # + def pick_font_fs(size, attrs) + baseFontSize = 24 -# -# -images = {} -old_imgs = {} -big_imgs = {} + # puts "FontCmd: #{size} #{attrs}" + [ ((attrs =~ /fixed/)? 'courier': 'charter'), + (baseFontSize * (1.2**(size.to_f - 4.0))).to_i, + ((attrs =~ /italic/)? 'italic': 'roman'), + ((attrs =~ /bold/)? 'bold': 'normal') ].join(' ') + end -# -# -move_big_image = proc{|b| - return unless big_imgs.key?(b) - b.copy(big_imgs[b]) - big_imgs[b].delete - big_imgs.delete(b) -} - -image_cmd = proc{|hs, *args| - fn = args[0] - - if old_imgs.key?(fn) - return (images[fn] = old_imgs.delete(fn)) + # + # + def hyper_cmd(*args) + puts "HyperlinkCommand: #{args.inspect}" end - begin - img = TkPhotoImage.new(:file=>fn) - rescue - return ((hs)? smallgray: biggray) + # This routine is called to run an applet + # + def run_applet(size, w, arglist) + applet_arg.value = Hash[*simplelist(arglist)] + + return unless @applet_arg.key?('src') + + src = @html.remove(@applet_arg['src']) + + @applet_arg['window'] = w + @applet_arg['fontsize'] = size + + begin + Tk.load_tclscript(src) + rescue => e + puts "Applet error: #{e.message}" + end end - if hs - img2 = TkPhotoImage.new - img2.copy(img, :subsample=>[2,2]) - img.delete - img = img2 + # + # + def form_cmd(n, cmd, *args) + # p [n, cmd, *args] end - if img.width * img.height > 20000 - b = TkPhotoImage.new(:width=>img.width, :height=>img.height) - big_imgs[b] = img - img = b - Tk.after_idle(proc{ move_big_image.call(b) }) + # + # + def move_big_image(b) + return unless @big_imgs.key?(b) + b.copy(@big_imgs[b]) + @big_imgs[b].delete + @big_imgs.delete(b) end - images[fn] = img + def image_cmd(hs, *args) + fn = args[0] - img -} + if @old_imgs.key?(fn) + return (@images[fn] = @old_imgs.delete(fn)) + end + begin + img = TkPhotoImage.new(:file=>fn) + rescue + return ((hs)? @@smallgray: @@biggray) + end -# -# This routine is called for every <SCRIPT> markup -# -script_cmd = proc{|*args| - # puts "ScriptCmd: #{args.inspect}" -} + if hs + img2 = TkPhotoImage.new + img2.copy(img, :subsample=>[2,2]) + img.delete + img = img2 + end -# This routine is called for every <APPLET> markup -# -applet_cmd = proc{|w, arglist| - # puts "AppletCmd: w=#{w} arglist=#{arglist}" - #TkLabel.new(w, :text=>"The Applet #{w}", :bd=>2, :relief=>raised) -} + if img.width * img.height > 20000 + b = TkPhotoImage.new(:width=>img.width, :height=>img.height) + @big_imgs[b] = img + img = b + Tk.after_idle(proc{ move_big_image(b) }) + end -# This binding fires when there is a click on a hyperlink -# -href_binding = proc{|w, x, y| - lst = w.href(x, y) - unless lst.empty? - process_url.call(lst) - end -} + @images[fn] = img -# -# -last_dir = Dir.pwd -load_file = nil - -sel_load = proc{ - filetypes = [ - ['Html Files', ['.html', '.htm']], - ['All Files', '*'] - ] - - f = Tk.getOpenFile(:initialdir=>last_dir, :filetypes=>filetypes) - if f != '' - load_file.call(f) - last_dir = File.dirname(f) + img end -} -# Clear the screen. -# -clear_screen = proc{ - if html_fs && html_fs.exist? - w = html_fs - else - w = html - end - w.clear - old_imgs.clear - big_imgs.clear - hotkey.clear - images.each{|k, v| old_imgs[k] = v } - images.clear -} - -# Read a file -# -read_file = proc{|name| - begin - fp = open(name, 'r') - ret = fp.read(File.size(name)) - rescue - ret = nil - fp = nil - Tk.messageBox(:icon=>'error', :message=>"fail to open '#{name}'", - :type=>:ok) - ensure - fp.close if fp + # + # This routine is called for every <SCRIPT> markup + # + def script_cmd(*args) + # puts "ScriptCmd: #{args.inspect}" end - ret -} -# Process the given URL -# -process_url = proc{|url| - case url[0] - when /^file:/ - load_file.call(url[0][5..-1]) - when /^exec:/ - Tk.ip_eval(url[0][5..-1].tr('\\', ' ')) - else - load_file.call(url[0]) + # This routine is called for every <APPLET> markup + # + def applet_cmd(w, arglist) + # puts "AppletCmd: w=#{w} arglist=#{arglist}" + #TkLabel.new(w, :text=>"The Applet #{w}", :bd=>2, :relief=>raised) end -} -# Load a file into the HTML widget -# -last_file = '' - -load_file = proc{|name| - return unless (doc = read_file.call(name)) - clear_screen.call - last_file = name - if html_fs && html_fs.exist? - w = html_fs - else - w = html + # This binding fires when there is a click on a hyperlink + # + def href_binding(w, x, y) + lst = w.href(x, y) + unless lst.empty? + process_url(lst) + end end - w.configure(:base=>name) - w.parse(doc) - w.configure(:cursor=>'top_left_arrow') - old_imgs.clear -} - -# Refresh the current file. -# -refresh = proc{|*args| - load_file.call(last_file) if last_file -} - -# This routine is called whenever a "<meta>" markup is seen. -# -meta = proc{|w, tag, alist| - v = Hash[*simplelist(alist)] - if v.kye?('key') && v.key?('href') - hotkey[v['key']] = w.resolve(v['href']) + # + # + def sel_load + filetypes = [ + ['Html Files', ['.html', '.htm']], + ['All Files', '*'] + ] + + f = Tk.getOpenFile(:initialdir=>@last_dir, :filetypes=>filetypes) + if f != '' + load_file(f) + @last_dir = File.dirname(f) + end end - if v.kye?('next') - hotkey['Down'] =v['next'] + # Clear the screen. + # + def clear_screen + if @html_fs && @html_fs.exist? + w = @html_fs + else + w = @html + end + w.clear + @old_imgs.clear + @big_imgs.clear + @hotkey.clear + @images.each{|k, v| @old_imgs[k] = v } + @images.clear end - if v.kye?('prev') - hotkey['Up'] =v['prev'] + # Read a file + # + def read_file(name) + begin + fp = open(name, 'r') + ret = fp.read(File.size(name)) + rescue + ret = nil + fp = nil + Tk.messageBox(:icon=>'error', :message=>"fail to open '#{name}'", + :type=>:ok) + ensure + fp.close if fp + end + ret end - if v.kye?('other') - hotkey['o'] =v['other'] + # Process the given URL + # + def process_url(url) + case url[0] + when /^file:/ + load_file(url[0][5..-1]) + when /^exec:/ + Tk.ip_eval(url[0][5..-1].tr('\\', ' ')) + else + load_file(url[0]) + end end -} -# Go from full-screen mode back to window mode. -# -fullscreen_off = proc{ - fswin.destroy - root.deiconify - Tk.update - root.raise - html.clipwin.focus - clear_screen.call - old_imgs.clear - refresh.call -} - -# Go from window mode to full-screen mode. -# -fullscreen = proc{ - if fswin && fswin.exist? - fswin.deiconify - Tk.update - fswin.raise - return + # Load a file into the HTML widget + # + def load_file(name) + return unless (doc = read_file(name)) + clear_screen() + @last_file = name + if @html_fs && @html_fs.exist? + w = @html_fs + else + w = @html + end + w.configure(:base=>name) + w.parse(doc) + w.configure(:cursor=>'top_left_arrow') + @old_imgs.clear end - width = root.winfo_screenwidth - height = root.winfo_screenheight - fswin = TkToplevel.new(:overrideredirect=>true, - :geometry=>"#{width}x#{height}+0+0") - - html_fs = Tk::HTML_Widget.new(fswin, :padx=>5, :pady=>9, - :formcommand=>form_cmd, - :imagecommand=>proc{image_cmd.call(0)}, - :scriptcommand=>script_cmd, - :appletcommand=>applet_cmd, - :hyperlinkcommand=>hyper_cmd, - :bg=>'white', :tablerelief=>:raised, - :appletcommand=>proc{|*args| - run_applet('big', *args) - }, - :fontcommand=>pick_font_fs, - :cursor=>:tcross) { - pack(:fill=>:both, :expand=>true) - token_handler('meta', proc{|*args| meta.call(self, *args)}) - } - - clear_screen.call - old_imgs.clear - refresh.call - Tk.update - html_fs.clipwin.focus -} - -# -# -key_block = false + # Refresh the current file. + # + def refresh(*args) + load_file(@last_file) if @last_file + end -key_press = proc{|w, keysym| - return if key_block - key_block = true - Tk.after(250, proc{key_block = false}) + # This routine is called whenever a "<meta>" markup is seen. + # + def meta(w, tag, alist) + v = Hash[*simplelist(alist)] - if hotkey.key?(keysym) - process_url.call(hotkey[keysym]) - end - case keysym - when 'Escape' - if fswin && fswin.exist? - fullscreen_off.call - else - fullscreen.call + if v.key?('key') && v.key?('href') + @hotkey[v['key']] = w.resolve(v['href']) end - end -} -Tk::HTML_Widget::ClippingWindow.bind('1', key_press, '%W Down') -Tk::HTML_Widget::ClippingWindow.bind('3', key_press, '%W Up') -Tk::HTML_Widget::ClippingWindow.bind('2', key_press, '%w Down') + if v.key?('next') + @hotkey['Down'] =v['next'] + end -Tk::HTML_Widget::ClippingWindow.bind('KeyPress', key_press, '%W %K') + if v.key?('prev') + @hotkey['Up'] =v['prev'] + end + if v.key?('other') + @hotkey['o'] =v['other'] + end + end -############################################ -# -# Build the half-size view of the page -# -menu_spec = [ - [['File', 0], - ['Open', sel_load, 0], - ['Full Screen', fullscreen, 0], - ['Refresh', refresh, 0], - '---', - ['Exit', proc{exit}, 1]] -] - -mbar = root.add_menubar(menu_spec) - -html = Tk::HTML_Widget.new(:width=>512, :height=>384, - :padx=>5, :pady=>9, - :formcommand=>form_cmd, - :imagecommand=>proc{|*args| - image_cmd.call(1, *args) - }, - :scriptcommand=>script_cmd, - :appletcommand=>applet_cmd, - :hyperlinkcommand=>hyper_cmd, - :fontcommand=>pick_font, - :appletcommand=>proc{|*args| - run_applet.call('small', *args) - }, - :bg=>'white', :tablerelief=>:raised) - -html.token_handler('meta', proc{|*args| meta.call(html, *args)}) - -vscr = html.yscrollbar(TkScrollbar.new) -hscr = html.xscrollbar(TkScrollbar.new) - -Tk.grid(html, vscr, :sticky=>:news) -Tk.grid(hscr, :sticky=>:ew) -Tk.root.grid_columnconfigure(0, :weight=>1) -Tk.root.grid_columnconfigure(1, :weight=>0) -Tk.root.grid_rowconfigure(0, :weight=>1) -Tk.root.grid_rowconfigure(1, :weight=>0) + # Go from full-screen mode back to window mode. + # + def fullscreen_off + @fswin.destroy + @root.deiconify + Tk.update + @root.raise + @html.clipwin.focus + clear_screen() + @old_imgs.clear + refresh() + end + # Go from window mode to full-screen mode. + # + def fullscreen + if @fswin && @fswin.exist? + @fswin.deiconify + Tk.update + @fswin.raise + return + end -############################################ + width = @root.winfo_screenwidth + height = @root.winfo_screenheight + @fswin = TkToplevel.new(:overrideredirect=>true, + :geometry=>"#{width}x#{height}+0+0") + + @html_fs = Tk::HTML_Widget.new(@fswin, :padx=>5, :pady=>9, + :formcommand=>proc{|*args| + form_cmd(*args) + }, + :imagecommand=>proc{|*args| + image_cmd(0, *args) + }, + :scriptcommand=>proc{|*args| + script_cmd(*args) + }, + :appletcommand=>proc{|*args| + applet_cmd(*args) + }, + :hyperlinkcommand=>proc{|*args| + hyper_cmd(*args) + }, + :appletcommand=>proc{|*args| + run_applet('big', *args) + }, + :fontcommand=>proc{|*args| + pick_font_fs(*args) + }, + :bg=>'white', :tablerelief=>:raised, + :cursor=>:tcross) { + pack(:fill=>:both, :expand=>true) + token_handler('meta', proc{|*args| meta(self, *args)}) + } + + clear_screen() + @old_imgs.clear + refresh() + Tk.update + @html_fs.clipwin.focus + end -html.clipwin.focus + # + # + def key_press(w, keysym) + return if @key_block + @key_block = true + Tk.after(250, proc{@key_block = false}) -# If an arguent was specified, read it into the HTML widget. -# -Tk.update -if file && file != "" - load_file.call(file) + if @hotkey.key?(keysym) + process_url(@hotkey[keysym]) + end + case keysym + when 'Escape' + if @fswin && @fswin.exist? + fullscreen_off() + else + fullscreen() + end + end + end end - ############################################ +TkHTML_File_Viewer.new(file) + Tk.mainloop diff --git a/ext/tk/sample/tkextlib/tktable/basic.rb b/ext/tk/sample/tkextlib/tktable/basic.rb index ece46b318..0d2d48893 100644 --- a/ext/tk/sample/tkextlib/tktable/basic.rb +++ b/ext/tk/sample/tkextlib/tktable/basic.rb @@ -29,11 +29,11 @@ table = Tk::TkTable.new(:rows=>rows, :cols=>cols, :variable=>ary, :rowstretchmode=>:last, :colstretchmode=>:last, :rowtagcommand=>proc{|row| row = Integer(row) - return 'OddRow' if row>0 && row%2 == 1 + (row>0 && row%2 == 1)? 'OddRow': '' }, :coltagcommand=>proc{|col| col = Integer(col) - return 'OddCol' if col>0 && col%2 == 1 + (col>0 && col%2 == 1)? 'OddCol': '' }, :selectmode=>:extended, :sparsearray=>false) diff --git a/ext/tk/sample/tkextlib/tktable/command.rb b/ext/tk/sample/tkextlib/tktable/command.rb index eb9ddffb7..bf36159cc 100644 --- a/ext/tk/sample/tkextlib/tktable/command.rb +++ b/ext/tk/sample/tkextlib/tktable/command.rb @@ -45,11 +45,11 @@ table = Tk::TkTable.new(:rows=>rows, :cols=>cols, :rowstretchmode=>:last, :colstretchmode=>:last, :rowtagcommand=>proc{|row| row = Integer(row) - return 'OddRow' if row>0 && row%2 == 1 + (row>0 && row%2 == 1)? 'OddRow': '' }, :coltagcommand=>proc{|col| col = Integer(col) - return 'OddCol' if col>0 && col%2 == 1 + (col>0 && col%2 == 1)? 'OddCol': '' }, :selectmode=>:extended, :flashmode=>true, :rowstretch=>:unset, :colstretch=>:unset, diff --git a/ext/tk/sample/tkextlib/tktable/debug.rb b/ext/tk/sample/tkextlib/tktable/debug.rb index 3200c1c77..d5cd5e49b 100644 --- a/ext/tk/sample/tkextlib/tktable/debug.rb +++ b/ext/tk/sample/tkextlib/tktable/debug.rb @@ -29,7 +29,7 @@ table = Tk::TkTable.new(:rows=>rows, :cols=>cols, :variable=>ary, :roworigin=>-5, :colorigin=>-2, :coltagcommand=>proc{|col| col = Integer(col) - return 'OddCol' if col>0 && col%2 == 1 + (col>0 && col%2 == 1)? 'OddCol': '' }, :selectmode=>:extended, :flashmode=>true, :rowstretch=>:unset, :colstretch=>:unset, diff --git a/ext/tk/sample/tkextlib/tktable/maxsize.rb b/ext/tk/sample/tkextlib/tktable/maxsize.rb index c9ca745ee..aff68ff37 100644 --- a/ext/tk/sample/tkextlib/tktable/maxsize.rb +++ b/ext/tk/sample/tkextlib/tktable/maxsize.rb @@ -28,7 +28,7 @@ table = Tk::TkTable.new(:rows=>rows, :cols=>cols, :variable=>ary, :titlerows=>1, :titlecols=>1, :coltagcommand=>proc{|col| col = Integer(col) - return 'OddCol' if col>0 && col%2 == 1 + (col>0 && col%2 == 1)? 'OddCol': '' }, :selectmode=>:extended, :colstretch=>:unset, :rowstretch=>:unset, diff --git a/ext/tk/sample/tkextlib/treectrl/demo.rb b/ext/tk/sample/tkextlib/treectrl/demo.rb index 1f822a654..92742e583 100644 --- a/ext/tk/sample/tkextlib/treectrl/demo.rb +++ b/ext/tk/sample/tkextlib/treectrl/demo.rb @@ -111,6 +111,7 @@ class TkTreeCtrl_demo [['File']] ] if Tk::PLATFORM['platform'] != 'unix' + TkConsole.create TkConsole.eval('.console conf -height 8') menuspec[0] << ['Console', proc{ if TkComm.bool(TkConsole.eval('winfo ismapped .')) |