From ce1b23b7a5a496f4b6d3ad4627a161b1dc6945fe Mon Sep 17 00:00:00 2001 From: nagai Date: Thu, 15 Jul 2004 01:18:57 +0000 Subject: * ext/tk/, ext/tcltklib/: bug fix * ext/tk/lib/tk.rb: better operation for SIGINT when processing callbacks. * ext/tk/lib/tk/msgcat.rb: ditto. * ext/tk/lib/tk/variable.rb: ditto. * ext/tk/lib/tk/timer.rb: ditto. * ext/tk/lib/tk/validation.rb: add Tk::ValidateConfigure.__def_validcmd() to define validatecommand methods easier * ext/tk/lib/tk.rb (_genobj_for_tkwidget): support autoload Tk ext classes * ext/tk/lib/tk/canvas.rb and so on: remove the parent widget type check for items (e.g. canvas items; depends on the class) to avoid some troubles on Tk extension widget class definition. * ext/tk/lib/tkextlib/: add Iwidget and TkTable extension support * ext/tk/sample/tkextlib/: add samples of Iwidget and TkTable git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6630 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/tk/ChangeLog.tkextlib | 12 + ext/tk/MANIFEST | 103 ++- ext/tk/lib/tk.rb | 78 +- ext/tk/lib/tk/canvas.rb | 6 +- ext/tk/lib/tk/canvastag.rb | 30 +- ext/tk/lib/tk/event.rb | 4 + ext/tk/lib/tk/menu.rb | 12 +- ext/tk/lib/tk/menuspec.rb | 32 +- ext/tk/lib/tk/text.rb | 4 +- ext/tk/lib/tk/textimage.rb | 6 +- ext/tk/lib/tk/textmark.rb | 12 +- ext/tk/lib/tk/texttag.rb | 14 +- ext/tk/lib/tk/textwindow.rb | 6 +- ext/tk/lib/tk/validation.rb | 18 +- ext/tk/lib/tk/variable.rb | 61 +- ext/tk/lib/tkextlib/SUPPORT_STATUS | 11 +- ext/tk/lib/tkextlib/bwidget.rb | 2 + ext/tk/lib/tkextlib/bwidget/listbox.rb | 2 +- ext/tk/lib/tkextlib/bwidget/tree.rb | 2 +- ext/tk/lib/tkextlib/itk/incr_tk.rb | 6 +- ext/tk/lib/tkextlib/iwidgets.rb | 21 + ext/tk/lib/tkextlib/iwidgets/buttonbox.rb | 8 +- ext/tk/lib/tkextlib/iwidgets/checkbox.rb | 8 +- ext/tk/lib/tkextlib/iwidgets/dialogshell.rb | 8 +- ext/tk/lib/tkextlib/iwidgets/entryfield.rb | 6 + ext/tk/lib/tkextlib/iwidgets/menubar.rb | 190 +++++ ext/tk/lib/tkextlib/iwidgets/messagebox.rb | 8 +- ext/tk/lib/tkextlib/iwidgets/notebook.rb | 163 +++++ ext/tk/lib/tkextlib/iwidgets/optionmenu.rb | 87 +++ ext/tk/lib/tkextlib/iwidgets/panedwindow.rb | 127 ++++ ext/tk/lib/tkextlib/iwidgets/promptdialog.rb | 131 ++++ ext/tk/lib/tkextlib/iwidgets/pushbutton.rb | 30 + ext/tk/lib/tkextlib/iwidgets/radiobox.rb | 8 +- ext/tk/lib/tkextlib/iwidgets/scopedobject.rb | 24 + ext/tk/lib/tkextlib/iwidgets/scrolledcanvas.rb | 315 ++++++++ ext/tk/lib/tkextlib/iwidgets/scrolledframe.rb | 59 ++ ext/tk/lib/tkextlib/iwidgets/scrolledhtml.rb | 43 ++ ext/tk/lib/tkextlib/iwidgets/scrolledlistbox.rb | 190 +++++ ext/tk/lib/tkextlib/iwidgets/scrolledtext.rb | 518 ++++++++++++++ ext/tk/lib/tkextlib/iwidgets/selectionbox.rb | 92 +++ ext/tk/lib/tkextlib/iwidgets/selectiondialog.rb | 92 +++ ext/tk/lib/tkextlib/iwidgets/spindate.rb | 38 + ext/tk/lib/tkextlib/iwidgets/spinint.rb | 20 + ext/tk/lib/tkextlib/iwidgets/spinner.rb | 150 ++++ ext/tk/lib/tkextlib/iwidgets/spintime.rb | 38 + ext/tk/lib/tkextlib/iwidgets/tabnotebook.rb | 154 ++++ ext/tk/lib/tkextlib/iwidgets/tabset.rb | 89 +++ ext/tk/lib/tkextlib/iwidgets/toolbar.rb | 37 +- ext/tk/lib/tkextlib/tcllib.rb | 8 +- ext/tk/lib/tkextlib/tcllib/autoscroll.rb | 59 +- ext/tk/lib/tkextlib/tcllib/cursor.rb | 55 +- ext/tk/lib/tkextlib/tcllib/ip_entry.rb | 1 + ext/tk/lib/tkextlib/tcllib/plotchart.rb | 87 ++- ext/tk/lib/tkextlib/tcllib/style.rb | 28 +- ext/tk/lib/tkextlib/tile.rb | 2 + ext/tk/lib/tkextlib/tktable.rb | 14 + ext/tk/lib/tkextlib/tktable/setup.rb | 8 + ext/tk/lib/tkextlib/tktable/tktable.rb | 796 +++++++++++++++++++++ ext/tk/lib/tkextlib/vu.rb | 2 + ext/tk/lib/tkextlib/vu/pie.rb | 6 +- ext/tk/sample/tkextlib/ICONS/LICENSE.orig | 2 +- ext/tk/sample/tkextlib/ICONS/viewIcons.rb | 2 +- ext/tk/sample/tkextlib/bwidget/LICENSE.orig | 2 +- ext/tk/sample/tkextlib/bwidget/basic.rb | 3 + ext/tk/sample/tkextlib/bwidget/dnd.rb | 3 + ext/tk/sample/tkextlib/bwidget/manager.rb | 3 + ext/tk/sample/tkextlib/bwidget/select.rb | 3 + ext/tk/sample/tkextlib/bwidget/tmpldlg.rb | 3 + ext/tk/sample/tkextlib/bwidget/tree.rb | 3 + .../tkextlib/iwidgets/catalog_demo/LICENSE.orig | 42 ++ .../tkextlib/iwidgets/catalog_demo/images/box.xbm | 14 + .../iwidgets/catalog_demo/images/close.gif | Bin 0 -> 249 bytes .../tkextlib/iwidgets/catalog_demo/images/copy.gif | Bin 0 -> 269 bytes .../tkextlib/iwidgets/catalog_demo/images/cut.gif | Bin 0 -> 179 bytes .../tkextlib/iwidgets/catalog_demo/images/exit.gif | Bin 0 -> 396 bytes .../tkextlib/iwidgets/catalog_demo/images/find.gif | Bin 0 -> 386 bytes .../tkextlib/iwidgets/catalog_demo/images/help.gif | Bin 0 -> 591 bytes .../tkextlib/iwidgets/catalog_demo/images/line.xbm | 14 + .../tkextlib/iwidgets/catalog_demo/images/mag.gif | Bin 0 -> 183 bytes .../tkextlib/iwidgets/catalog_demo/images/new.gif | Bin 0 -> 212 bytes .../tkextlib/iwidgets/catalog_demo/images/open.gif | Bin 0 -> 258 bytes .../tkextlib/iwidgets/catalog_demo/images/oval.xbm | 14 + .../iwidgets/catalog_demo/images/paste.gif | Bin 0 -> 376 bytes .../iwidgets/catalog_demo/images/points.xbm | 14 + .../tkextlib/iwidgets/catalog_demo/images/poly.gif | Bin 0 -> 141 bytes .../iwidgets/catalog_demo/images/print.gif | Bin 0 -> 263 bytes .../iwidgets/catalog_demo/images/ruler.gif | Bin 0 -> 174 bytes .../tkextlib/iwidgets/catalog_demo/images/save.gif | Bin 0 -> 270 bytes .../iwidgets/catalog_demo/images/select.gif | Bin 0 -> 124 bytes .../tkextlib/iwidgets/catalog_demo/images/text.xbm | 14 + ext/tk/sample/tkextlib/iwidgets/sample/feedback.rb | 2 +- .../sample/tkextlib/iwidgets/sample/finddialog.rb | 15 + .../tkextlib/iwidgets/sample/labeledframe.rb | 14 + .../sample/tkextlib/iwidgets/sample/mainwindow.rb | 64 ++ ext/tk/sample/tkextlib/iwidgets/sample/menubar.rb | 124 ++++ ext/tk/sample/tkextlib/iwidgets/sample/menubar2.rb | 44 ++ ext/tk/sample/tkextlib/iwidgets/sample/notebook.rb | 30 + .../sample/tkextlib/iwidgets/sample/notebook2.rb | 30 + .../sample/tkextlib/iwidgets/sample/optionmenu.rb | 14 + .../sample/tkextlib/iwidgets/sample/panedwindow.rb | 22 + .../tkextlib/iwidgets/sample/panedwindow2.rb | 22 + .../tkextlib/iwidgets/sample/promptdialog.rb | 17 + .../sample/tkextlib/iwidgets/sample/pushbutton.rb | 9 + .../tkextlib/iwidgets/sample/scrolledcanvas.rb | 13 + .../tkextlib/iwidgets/sample/scrolledframe.rb | 18 + .../tkextlib/iwidgets/sample/scrolledhtml.rb | 15 + .../tkextlib/iwidgets/sample/scrolledlistbox.rb | 22 + .../tkextlib/iwidgets/sample/scrolledtext.rb | 11 + .../tkextlib/iwidgets/sample/selectionbox.rb | 19 + .../tkextlib/iwidgets/sample/selectiondialog.rb | 12 + ext/tk/sample/tkextlib/iwidgets/sample/spindate.rb | 7 + ext/tk/sample/tkextlib/iwidgets/sample/spinint.rb | 10 + ext/tk/sample/tkextlib/iwidgets/sample/spinner.rb | 33 + ext/tk/sample/tkextlib/iwidgets/sample/spintime.rb | 7 + .../sample/tkextlib/iwidgets/sample/tabnotebook.rb | 26 + .../tkextlib/iwidgets/sample/tabnotebook2.rb | 30 + ext/tk/sample/tkextlib/iwidgets/sample/tabset.rb | 34 + ext/tk/sample/tkextlib/iwidgets/sample/toolbar.rb | 152 ++++ ext/tk/sample/tkextlib/tkHTML/COPYRIGHT.orig | 12 + ext/tk/sample/tkextlib/tktable/LICENSE.orig | 52 ++ ext/tk/sample/tkextlib/tktable/basic.rb | 60 ++ ext/tk/sample/tkextlib/tktable/buttons.rb | 76 ++ ext/tk/sample/tkextlib/tktable/command.rb | 89 +++ ext/tk/sample/tkextlib/tktable/debug.rb | 101 +++ ext/tk/sample/tkextlib/tktable/dynarows.rb | 99 +++ ext/tk/sample/tkextlib/tktable/maxsize.rb | 67 ++ ext/tk/sample/tkextlib/tktable/tcllogo.gif | Bin 0 -> 2341 bytes ext/tk/sample/tkextlib/tktable/valid.rb | 88 +++ ext/tk/sample/tkextlib/vu/LICENSE.orig | 2 +- ext/tk/sample/tktree.rb | 10 +- ext/tk/tkutil.c | 40 +- 131 files changed, 5607 insertions(+), 182 deletions(-) create mode 100644 ext/tk/lib/tkextlib/iwidgets/menubar.rb create mode 100644 ext/tk/lib/tkextlib/iwidgets/notebook.rb create mode 100644 ext/tk/lib/tkextlib/iwidgets/optionmenu.rb create mode 100644 ext/tk/lib/tkextlib/iwidgets/panedwindow.rb create mode 100644 ext/tk/lib/tkextlib/iwidgets/promptdialog.rb create mode 100644 ext/tk/lib/tkextlib/iwidgets/pushbutton.rb create mode 100644 ext/tk/lib/tkextlib/iwidgets/scopedobject.rb create mode 100644 ext/tk/lib/tkextlib/iwidgets/scrolledcanvas.rb create mode 100644 ext/tk/lib/tkextlib/iwidgets/scrolledframe.rb create mode 100644 ext/tk/lib/tkextlib/iwidgets/scrolledhtml.rb create mode 100644 ext/tk/lib/tkextlib/iwidgets/scrolledlistbox.rb create mode 100644 ext/tk/lib/tkextlib/iwidgets/scrolledtext.rb create mode 100644 ext/tk/lib/tkextlib/iwidgets/selectionbox.rb create mode 100644 ext/tk/lib/tkextlib/iwidgets/selectiondialog.rb create mode 100644 ext/tk/lib/tkextlib/iwidgets/spindate.rb create mode 100644 ext/tk/lib/tkextlib/iwidgets/spinint.rb create mode 100644 ext/tk/lib/tkextlib/iwidgets/spinner.rb create mode 100644 ext/tk/lib/tkextlib/iwidgets/spintime.rb create mode 100644 ext/tk/lib/tkextlib/iwidgets/tabnotebook.rb create mode 100644 ext/tk/lib/tkextlib/iwidgets/tabset.rb create mode 100644 ext/tk/lib/tkextlib/tktable.rb create mode 100644 ext/tk/lib/tkextlib/tktable/setup.rb create mode 100644 ext/tk/lib/tkextlib/tktable/tktable.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/catalog_demo/LICENSE.orig create mode 100644 ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/box.xbm create mode 100644 ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/close.gif create mode 100644 ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/copy.gif create mode 100644 ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/cut.gif create mode 100644 ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/exit.gif create mode 100644 ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/find.gif create mode 100644 ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/help.gif create mode 100644 ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/line.xbm create mode 100644 ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/mag.gif create mode 100644 ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/new.gif create mode 100644 ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/open.gif create mode 100644 ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/oval.xbm create mode 100644 ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/paste.gif create mode 100644 ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/points.xbm create mode 100644 ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/poly.gif create mode 100644 ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/print.gif create mode 100644 ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/ruler.gif create mode 100644 ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/save.gif create mode 100644 ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/select.gif create mode 100644 ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/text.xbm create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/finddialog.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/labeledframe.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/mainwindow.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/menubar.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/menubar2.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/notebook.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/notebook2.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/optionmenu.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/panedwindow.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/panedwindow2.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/promptdialog.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/pushbutton.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/scrolledcanvas.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/scrolledframe.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/scrolledhtml.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/scrolledlistbox.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/scrolledtext.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/selectionbox.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/selectiondialog.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/spindate.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/spinint.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/spinner.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/spintime.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/tabnotebook.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/tabnotebook2.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/tabset.rb create mode 100644 ext/tk/sample/tkextlib/iwidgets/sample/toolbar.rb create mode 100644 ext/tk/sample/tkextlib/tkHTML/COPYRIGHT.orig create mode 100644 ext/tk/sample/tkextlib/tktable/LICENSE.orig create mode 100644 ext/tk/sample/tkextlib/tktable/basic.rb create mode 100644 ext/tk/sample/tkextlib/tktable/buttons.rb create mode 100644 ext/tk/sample/tkextlib/tktable/command.rb create mode 100644 ext/tk/sample/tkextlib/tktable/debug.rb create mode 100644 ext/tk/sample/tkextlib/tktable/dynarows.rb create mode 100644 ext/tk/sample/tkextlib/tktable/maxsize.rb create mode 100755 ext/tk/sample/tkextlib/tktable/tcllogo.gif create mode 100644 ext/tk/sample/tkextlib/tktable/valid.rb (limited to 'ext/tk') diff --git a/ext/tk/ChangeLog.tkextlib b/ext/tk/ChangeLog.tkextlib index 484624b179..7eeabaa66c 100644 --- a/ext/tk/ChangeLog.tkextlib +++ b/ext/tk/ChangeLog.tkextlib @@ -1,3 +1,15 @@ +2004-07-15 Hidetoshi NAGAI + + * bug fix + + * support TkTable extension + +2004-07-12 Hidetoshi NAGAI + + * bug fix + + * support Iwidgets extension + 2004-07-10 Hidetoshi NAGAI * bug fix diff --git a/ext/tk/MANIFEST b/ext/tk/MANIFEST index 2a912a013c..ba354f9c63 100644 --- a/ext/tk/MANIFEST +++ b/ext/tk/MANIFEST @@ -139,7 +139,6 @@ lib/tkextlib/itk/setup.rb lib/tkextlib/iwidgets.rb lib/tkextlib/iwidgets/buttonbox.rb lib/tkextlib/iwidgets/calendar.rb -lib/tkextlib/iwidgets/setup.rb lib/tkextlib/iwidgets/canvasprintbox.rb lib/tkextlib/iwidgets/canvasprintdialog.rb lib/tkextlib/iwidgets/checkbox.rb @@ -157,9 +156,41 @@ lib/tkextlib/iwidgets/feedback.rb lib/tkextlib/iwidgets/fileselectionbox.rb lib/tkextlib/iwidgets/fileselectiondialog.rb lib/tkextlib/iwidgets/finddialog.rb +lib/tkextlib/iwidgets/hierarchy.rb +lib/tkextlib/iwidgets/hyperhelp.rb lib/tkextlib/iwidgets/labeledframe.rb lib/tkextlib/iwidgets/labeledwidget.rb +lib/tkextlib/iwidgets/mainwindow.rb +lib/tkextlib/iwidgets/menubar.rb +lib/tkextlib/iwidgets/messagebox.rb +lib/tkextlib/iwidgets/messagedialog.rb +lib/tkextlib/iwidgets/notebook.rb +lib/tkextlib/iwidgets/optionmenu.rb +lib/tkextlib/iwidgets/panedwindow.rb +lib/tkextlib/iwidgets/promptdialog.rb +lib/tkextlib/iwidgets/pushbutton.rb +lib/tkextlib/iwidgets/radiobox.rb +lib/tkextlib/iwidgets/scopedobject.rb +lib/tkextlib/iwidgets/scrolledcanvas.rb +lib/tkextlib/iwidgets/scrolledframe.rb +lib/tkextlib/iwidgets/scrolledhtml.rb +lib/tkextlib/iwidgets/scrolledlistbox.rb +lib/tkextlib/iwidgets/scrolledtext.rb +lib/tkextlib/iwidgets/scrolledwidget.rb +lib/tkextlib/iwidgets/selectionbox.rb +lib/tkextlib/iwidgets/selectiondialog.rb +lib/tkextlib/iwidgets/setup.rb lib/tkextlib/iwidgets/shell.rb +lib/tkextlib/iwidgets/spindate.rb +lib/tkextlib/iwidgets/spinint.rb +lib/tkextlib/iwidgets/spinner.rb +lib/tkextlib/iwidgets/spintime.rb +lib/tkextlib/iwidgets/tabnotebook.rb +lib/tkextlib/iwidgets/tabset.rb +lib/tkextlib/iwidgets/timeentry.rb +lib/tkextlib/iwidgets/timefield.rb +lib/tkextlib/iwidgets/toolbar.rb +lib/tkextlib/iwidgets/watch.rb lib/tkextlib/tcllib.rb lib/tkextlib/tcllib/README lib/tkextlib/tcllib/autoscroll.rb @@ -206,7 +237,9 @@ lib/tkextlib/tkimg/tiff.rb lib/tkextlib/tkimg/window.rb lib/tkextlib/tkimg/xbm.rb lib/tkextlib/tkimg/xpm.rb -lib/tkextlib/tktrans.rb +lib/tkextlib/tktable.rb +lib/tkextlib/tktable/setup.rb +lib/tkextlib/tktable/tktable.rb lib/tkextlib/tktrans/setup.rb lib/tkextlib/tktrans/tktrans.rb lib/tkextlib/treectrl.rb @@ -461,7 +494,28 @@ sample/tkextlib/bwidget/select.rb sample/tkextlib/bwidget/tmpldlg.rb sample/tkextlib/bwidget/tree.rb sample/tkextlib/bwidget/x1.xbm +sample/tkextlib/iwidgets/catalog_demo/LICENSE.orig +sample/tkextlib/iwidgets/catalog_demo/images/box.xbm sample/tkextlib/iwidgets/catalog_demo/images/clear.gif +sample/tkextlib/iwidgets/catalog_demo/images/close.gif +sample/tkextlib/iwidgets/catalog_demo/images/copy.gif +sample/tkextlib/iwidgets/catalog_demo/images/cut.gif +sample/tkextlib/iwidgets/catalog_demo/images/exit.gif +sample/tkextlib/iwidgets/catalog_demo/images/find.gif +sample/tkextlib/iwidgets/catalog_demo/images/help.gif +sample/tkextlib/iwidgets/catalog_demo/images/line.xbm +sample/tkextlib/iwidgets/catalog_demo/images/mag.gif +sample/tkextlib/iwidgets/catalog_demo/images/new.gif +sample/tkextlib/iwidgets/catalog_demo/images/open.gif +sample/tkextlib/iwidgets/catalog_demo/images/oval.xbm +sample/tkextlib/iwidgets/catalog_demo/images/paste.gif +sample/tkextlib/iwidgets/catalog_demo/images/points.xbm +sample/tkextlib/iwidgets/catalog_demo/images/poly.gif +sample/tkextlib/iwidgets/catalog_demo/images/print.gif +sample/tkextlib/iwidgets/catalog_demo/images/ruler.gif +sample/tkextlib/iwidgets/catalog_demo/images/save.gif +sample/tkextlib/iwidgets/catalog_demo/images/select.gif +sample/tkextlib/iwidgets/catalog_demo/images/text.xbm sample/tkextlib/iwidgets/sample/buttonbox.rb sample/tkextlib/iwidgets/sample/calendar.rb sample/tkextlib/iwidgets/sample/canvasprintbox.rb @@ -482,14 +536,51 @@ sample/tkextlib/iwidgets/sample/extfileselectiondialog.rb sample/tkextlib/iwidgets/sample/feedback.rb sample/tkextlib/iwidgets/sample/fileselectionbox.rb sample/tkextlib/iwidgets/sample/fileselectiondialog.rb +sample/tkextlib/iwidgets/sample/finddialog.rb +sample/tkextlib/iwidgets/sample/hierarchy.rb +sample/tkextlib/iwidgets/sample/hyperhelp.rb +sample/tkextlib/iwidgets/sample/labeledframe.rb sample/tkextlib/iwidgets/sample/labeledwidget.rb +sample/tkextlib/iwidgets/sample/mainwindow.rb +sample/tkextlib/iwidgets/sample/menubar.rb +sample/tkextlib/iwidgets/sample/menubar2.rb +sample/tkextlib/iwidgets/sample/messagebox1.rb +sample/tkextlib/iwidgets/sample/messagebox2.rb +sample/tkextlib/iwidgets/sample/messagedialog.rb +sample/tkextlib/iwidgets/sample/notebook.rb +sample/tkextlib/iwidgets/sample/notebook2.rb +sample/tkextlib/iwidgets/sample/optionmenu.rb +sample/tkextlib/iwidgets/sample/panedwindow.rb +sample/tkextlib/iwidgets/sample/panedwindow2.rb +sample/tkextlib/iwidgets/sample/promptdialog.rb +sample/tkextlib/iwidgets/sample/pushbutton.rb +sample/tkextlib/iwidgets/sample/radiobox.rb +sample/tkextlib/iwidgets/sample/scrolledcanvas.rb +sample/tkextlib/iwidgets/sample/scrolledframe.rb +sample/tkextlib/iwidgets/sample/scrolledhtml.rb +sample/tkextlib/iwidgets/sample/scrolledlistbox.rb +sample/tkextlib/iwidgets/sample/scrolledtext.rb +sample/tkextlib/iwidgets/sample/selectionbox.rb +sample/tkextlib/iwidgets/sample/selectiondialog.rb sample/tkextlib/iwidgets/sample/shell.rb +sample/tkextlib/iwidgets/sample/spindate.rb +sample/tkextlib/iwidgets/sample/spinint.rb +sample/tkextlib/iwidgets/sample/spinner.rb +sample/tkextlib/iwidgets/sample/spintime.rb +sample/tkextlib/iwidgets/sample/tabnotebook.rb +sample/tkextlib/iwidgets/sample/tabnotebook2.rb +sample/tkextlib/iwidgets/sample/tabset.rb +sample/tkextlib/iwidgets/sample/timeentry.rb +sample/tkextlib/iwidgets/sample/timefield.rb +sample/tkextlib/iwidgets/sample/toolbar.rb +sample/tkextlib/iwidgets/sample/watch.rb sample/tkextlib/tcllib/LICENSE.orig sample/tkextlib/tcllib/datefield.rb sample/tkextlib/tcllib/plotdemos1.rb sample/tkextlib/tcllib/plotdemos2.rb sample/tkextlib/tcllib/plotdemos3.rb sample/tkextlib/tcllib/xyplot.rb +sample/tkextlib/tkHTML/COPYRIGHT.orig sample/tkextlib/tkHTML/README sample/tkextlib/tkHTML/hv.rb sample/tkextlib/tkHTML/ss.rb @@ -573,6 +664,14 @@ sample/tkextlib/tkHTML/page4/image7 sample/tkextlib/tkHTML/page4/image8 sample/tkextlib/tkHTML/page4/image9 sample/tkextlib/tkHTML/page4/index.html +sample/tkextlib/tktable/LICENSE.orig +sample/tkextlib/tktable/basic.rb +sample/tkextlib/tktable/buttons.rb +sample/tkextlib/tktable/command.rb +sample/tkextlib/tktable/debug.rb +sample/tkextlib/tktable/dynarows.rb +sample/tkextlib/tktable/maxsize.rb +sample/tkextlib/tktable/valid.rb sample/tkextlib/vu/LICENSE.orig sample/tkextlib/vu/README.txt sample/tkextlib/vu/canvItems.rb diff --git a/ext/tk/lib/tk.rb b/ext/tk/lib/tk.rb index bb2335f107..312452df1d 100644 --- a/ext/tk/lib/tk.rb +++ b/ext/tk/lib/tk.rb @@ -26,6 +26,7 @@ module TkComm extend TkUtil WidgetClassNames = {}.taint + TkExtlibAutoloadModule = [].taint # None = Object.new ### --> definition is moved to TkUtil module # def None.to_s @@ -92,17 +93,64 @@ module TkComm # gen_class_name = ruby_class_name + 'GeneratedOnTk' gen_class_name = ruby_class_name classname_def = '' - elsif Object.const_defined?('Tk' + tk_class) - ruby_class_name = 'Tk' + tk_class + else # ruby_class == nil + mods = TkExtlibAutoloadModule.find_all{|m| m.const_defined?(tk_class)} + mods.each{|mod| + begin + mod.const_get(tk_class) # auto_load + break if (ruby_class = WidgetClassNames[tk_class]) + rescue LoadError + # ignore load error + end + } + + unless ruby_class + std_class = 'Tk' << tk_class + if Object.const_defined?(std_class) + Object.const_get(std_class) # auto_load + ruby_class = WidgetClassNames[tk_class] + end + end + + if ruby_class + # found + ruby_class_name = ruby_class.name + gen_class_name = ruby_class_name + classname_def = '' + else + # unknown + ruby_class_name = 'TkWindow' + gen_class_name = 'TkWidget_' + tk_class + classname_def = "WidgetClassName = '#{tk_class}'.freeze" + end + end + +################################### +=begin + if ruby_class = WidgetClassNames[tk_class] + ruby_class_name = ruby_class.name # gen_class_name = ruby_class_name + 'GeneratedOnTk' gen_class_name = ruby_class_name classname_def = '' else - ruby_class_name = 'TkWindow' - # gen_class_name = ruby_class_name + tk_class + 'GeneratedOnTk' - gen_class_name = 'TkWidget_' + tk_class - classname_def = "WidgetClassName = '#{tk_class}'.freeze" + mod = TkExtlibAutoloadModule.find{|m| m.const_defined?(tk_class)} + if mod + ruby_class_name = mod.name + '::' + tk_class + gen_class_name = ruby_class_name + classname_def = '' + elsif Object.const_defined?('Tk' + tk_class) + ruby_class_name = 'Tk' + tk_class + # gen_class_name = ruby_class_name + 'GeneratedOnTk' + gen_class_name = ruby_class_name + classname_def = '' + else + ruby_class_name = 'TkWindow' + # gen_class_name = ruby_class_name + tk_class + 'GeneratedOnTk' + gen_class_name = 'TkWidget_' + tk_class + classname_def = "WidgetClassName = '#{tk_class}'.freeze" + end end +=end =begin unless Object.const_defined? gen_class_name @@ -131,7 +179,12 @@ module TkComm private :_genobj_for_tkwidget module_function :_genobj_for_tkwidget - def tk_tcl2ruby(val, enc_mode = nil, listobj = true) + def _at(x,y) + "@#{Integer(x)},#{Integer(y)}" + end + module_function :_at + + def tk_tcl2ruby(val, enc_mode = false, listobj = true) if val =~ /^rb_out\S* (c(_\d+_)?\d+)/ #return Tk_CMDTBL[$1] return TkCore::INTERP.tk_cmd_tbl[$1] @@ -181,7 +234,7 @@ module TkComm private :tk_tcl2ruby module_function :tk_tcl2ruby - private_class_method :tk_tcl2ruby + #private_class_method :tk_tcl2ruby unless const_defined?(:USE_TCLs_LIST_FUNCTIONS) USE_TCLs_LIST_FUNCTIONS = true @@ -238,7 +291,8 @@ if USE_TCLs_LIST_FUNCTIONS array2tk_list(e) elsif e.kind_of? Hash tmp_ary = [] - e.each{|k,v| tmp_ary << k << v } + #e.each{|k,v| tmp_ary << k << v } + e.each{|k,v| tmp_ary << "-#{_get_eval_string(k)}" << v } array2tk_list(tmp_ary) else _get_eval_string(e) @@ -369,7 +423,9 @@ else if e.kind_of? Array "{#{array2tk_list(e)}}" elsif e.kind_of? Hash - "{#{e.to_a.collect{|ee| array2tk_list(ee)}.join(' ')}}" + # "{#{e.to_a.collect{|ee| array2tk_list(ee)}.join(' ')}}" + e.each{|k,v| tmp_ary << "-#{_get_eval_string(k)}" << v } + array2tk_list(tmp_ary) else s = _get_eval_string(e) (s.index(/\s/) || s.size == 0)? "{#{s}}": s @@ -3108,7 +3164,6 @@ class TkObject, , ... , , , ... + # # If you need support extra arguments given by Tcl/Tk, # please override _get_extra_args_tbl diff --git a/ext/tk/lib/tk/menu.rb b/ext/tk/lib/tk/menu.rb index fdb4ec201b..f0f5dcd2e8 100644 --- a/ext/tk/lib/tk/menu.rb +++ b/ext/tk/lib/tk/menu.rb @@ -320,9 +320,9 @@ class TkMenuClonefalse) + parent.menu(mbar) + end + mbar + end + private :_create_menu_for_menubar + def _create_menubutton(parent, menu_info, tearoff=false, default_opts = nil) btn_info = menu_info[0] @@ -160,12 +184,10 @@ module TkMenuSpec tearoff = keys.delete('tearoff') if keys.key?('tearoff') - if parent.kind_of?(TkRoot) || parent.kind_of?(TkToplevel) + if _use_menubar?(parent) # menubar by menu entries - unless (mbar = parent.menu).kind_of?(TkMenu) - mbar = TkMenu.new(parent, :tearoff=>false) - parent.menu(mbar) - end + + mbar = _create_menu_for_menubar(parent) menu_name = nil diff --git a/ext/tk/lib/tk/text.rb b/ext/tk/lib/tk/text.rb index d2fdfd9401..bd4586e4e2 100644 --- a/ext/tk/lib/tk/text.rb +++ b/ext/tk/lib/tk/text.rb @@ -502,9 +502,9 @@ class TkText, , ... , , , ... + # #def self._get_extra_args_tbl # # return an array of convert procs # [] #end + + def self.ret_val(val) + (val)? '1': '0' + end end ############################################### @@ -257,7 +263,7 @@ class TkValidateCommand else @id = install_cmd(proc{|*arg| ex_args = [] - extra_args_tbl.reverse_each{|conv| ex_args << conv.call(args.pop)} + extra_args_tbl.reverse_each{|conv| ex_args << conv.call(arg.pop)} klass.ret_val(cmd.call( *(ex_args.concat(klass.scan_args(keys, arg))) )) @@ -272,9 +278,9 @@ class TkValidateCommand else @id = install_cmd(proc{|*arg| ex_args = [] - extra_args_tbl.reverse_each{|conv| ex_args << conv.call(args.pop)} + extra_args_tbl.reverse_each{|conv| ex_args << conv.call(arg.pop)} klass.ret_val(cmd.call( - *(ex_args << klass.new(*klass.scan_args(keys,arg))) + *(ex_args << klass.new(*klass.scan_args(keys, arg))) )) }) + ' ' + args end diff --git a/ext/tk/lib/tk/variable.rb b/ext/tk/lib/tk/variable.rb index 6398537bfa..22b17eb0e1 100644 --- a/ext/tk/lib/tk/variable.rb +++ b/ext/tk/lib/tk/variable.rb @@ -96,12 +96,45 @@ TkCore::INTERP.add_tk_procs('rb_var', 'args', <<-'EOL') end end + # + # default_value is available only when the variable is an assoc array. + # + def default_value(val=nil, &b) + if b + @def_default = :proc + @default_val = proc(&b) + else + @def_default = :val + @default_val = val + end + self + end + def default_value=(val) + @def_default = :val + @default_val = val + self + end + def default_proc(cmd = Proc.new) + @def_default = :proc + @default_val = cmd + self + end + + def undef_default + @default_val = nil + @def_default = false + self + end + def initialize(val="") # @id = Tk_VARIABLE_ID.join('') @id = Tk_VARIABLE_ID.join(TkCore::INTERP._ip_id_) Tk_VARIABLE_ID[1].succ! TkVar_ID_TBL[@id] = self + @def_default = false + @default_val = nil + @trace_var = nil @trace_elem = nil @trace_opts = nil @@ -290,7 +323,19 @@ if USE_TCLs_SET_VARIABLE_FUNCTIONS def [](*idxs) index = idxs.collect{|idx| _get_eval_string(idx, true)}.join(',') - _fromUTF8(INTERP._get_global_var2(@id, index)) + begin + _fromUTF8(INTERP._get_global_var2(@id, index)) + rescue => e + case @def_default + when :proc + @default_val.call(self, *idxs) + when :val + @default_val + else + fail e + end + end + #_fromUTF8(INTERP._get_global_var2(@id, index)) #_fromUTF8(INTERP._get_global_var2(@id, _toUTF8(_get_eval_string(index)))) #_fromUTF8(INTERP._get_global_var2(@id, _get_eval_string(index, true))) end @@ -389,7 +434,19 @@ else def [](*idxs) index = idxs.collect{|idx| _get_eval_string(idx)}.join(',') - INTERP._eval(Kernel.format('global %s; set %s(%s)', @id, @id, index)) + begin + INTERP._eval(Kernel.format('global %s; set %s(%s)', @id, @id, index)) + rescue => e + case @def_default + when :proc + @default_val.call(self, *idxs) + when :val + @default_val + else + fail e + end + end + #INTERP._eval(Kernel.format('global %s; set %s(%s)', @id, @id, index)) #INTERP._eval(Kernel.format('global %s; set %s(%s)', # @id, @id, _get_eval_string(index))) #INTERP._eval(Kernel.format('set %s(%s)', @id, _get_eval_string(index))) diff --git a/ext/tk/lib/tkextlib/SUPPORT_STATUS b/ext/tk/lib/tkextlib/SUPPORT_STATUS index 4fd652a8a2..81e92a1acf 100644 --- a/ext/tk/lib/tkextlib/SUPPORT_STATUS +++ b/ext/tk/lib/tkextlib/SUPPORT_STATUS @@ -49,8 +49,14 @@ script may give you some hints about that. Tcllib http://sf.net/projects/tcllib ==> tcllib (partial support; Tklib part only) +IWidgets http://sf.net/projects/incrTcl ==> iwidgets + BWidgets http://sf.net/projects/tcllib ==> bwidget +TkTable http://sf.net/projects/tktable ==> tktable + [ * see also + written by Ferenc Engard (ferenc@engard.hu) ] + vu http://tktable.sourceforge.net ==> vu TkHTML http://www.hwaci.com/sw/tkhtml/index.html ==> tkHTML @@ -84,11 +90,6 @@ TkDND http://sourceforge.net/projects/tkdnd ==> tkDND TclX http://sf.net/projects/tclx * may support Tk part only -IWidgets http://sf.net/projects/incrTcl - -TkTable http://sf.net/projects/tktable - * see http://www.korus.hu/~fery/ruby/tktable.rb - winico http://tktable.sourceforge.net diff --git a/ext/tk/lib/tkextlib/bwidget.rb b/ext/tk/lib/tkextlib/bwidget.rb index 78d7d5230f..411a6ac99a 100644 --- a/ext/tk/lib/tkextlib/bwidget.rb +++ b/ext/tk/lib/tkextlib/bwidget.rb @@ -17,6 +17,8 @@ TkPackage.require('BWidget') module Tk module BWidget + TkComm::TkExtlibAutoloadModule.unshift(self) + extend TkCore LIBRARY = tk_call('set', '::BWIDGET::LIBRARY') diff --git a/ext/tk/lib/tkextlib/bwidget/listbox.rb b/ext/tk/lib/tkextlib/bwidget/listbox.rb index 28173fb7f9..102be9a5fa 100644 --- a/ext/tk/lib/tkextlib/bwidget/listbox.rb +++ b/ext/tk/lib/tkextlib/bwidget/listbox.rb @@ -162,7 +162,7 @@ class Tk::BWidget::ListBox::Item include TkTreatTagFont ListItem_TBL = TkCore::INTERP.create_table - ListItem_ID = ['item:'.freeze, '00000'.taint].freeze + ListItem_ID = ['bw:item'.freeze, '00000'.taint].freeze TkCore::INTERP.init_ip_env{ ListItem_TBL.clear } diff --git a/ext/tk/lib/tkextlib/bwidget/tree.rb b/ext/tk/lib/tkextlib/bwidget/tree.rb index 888ce9409f..f657e7148e 100644 --- a/ext/tk/lib/tkextlib/bwidget/tree.rb +++ b/ext/tk/lib/tkextlib/bwidget/tree.rb @@ -203,7 +203,7 @@ class Tk::BWidget::Tree::Node include TkTreatTagFont TreeNode_TBL = TkCore::INTERP.create_table - TreeNode_ID = ['node:'.freeze, '00000'.taint].freeze + TreeNode_ID = ['bw:node'.freeze, '00000'.taint].freeze TkCore::INTERP.init_ip_env{ TreeNode_TBL.clear } diff --git a/ext/tk/lib/tkextlib/itk/incr_tk.rb b/ext/tk/lib/tkextlib/itk/incr_tk.rb index db01bfe85e..84143a3ea3 100644 --- a/ext/tk/lib/tkextlib/itk/incr_tk.rb +++ b/ext/tk/lib/tkextlib/itk/incr_tk.rb @@ -47,6 +47,10 @@ module Tk '::itk::' << self::WidgetClassName end + def __destroy_hook__ + Tk::Itk::Component::ComponentID_TBL.delete(self.path) + end + #### [incr Tk] public methods def component simplelist(tk_send('component')) @@ -129,7 +133,7 @@ module Tk end ComponentID_TBL = TkCore::INTERP.create_table - Itk_Component_ID = ['itk_component'.freeze, '00000'.taint].freeze + Itk_Component_ID = ['itk:component'.freeze, '00000'.taint].freeze TkCore::INTERP.init_ip_env{ ComponentID_TBL.clear } diff --git a/ext/tk/lib/tkextlib/iwidgets.rb b/ext/tk/lib/tkextlib/iwidgets.rb index 0370ad5d23..b76fb79cc1 100644 --- a/ext/tk/lib/tkextlib/iwidgets.rb +++ b/ext/tk/lib/tkextlib/iwidgets.rb @@ -19,6 +19,8 @@ TkPackage.require('Iwidgets') module Tk module Iwidgets + TkComm::TkExtlibAutoloadModule.unshift(self) + extend TkCore def self.package_version @@ -55,11 +57,30 @@ module Tk autoload :Labeledframe, 'tkextlib/iwidgets/labeledframe' autoload :Labeledwidget, 'tkextlib/iwidgets/labeledwidget' autoload :Mainwindow, 'tkextlib/iwidgets/mainwindow' + autoload :Menubar, 'tkextlib/iwidgets/menubar' autoload :Messagebox, 'tkextlib/iwidgets/messagebox' autoload :Messagedialog, 'tkextlib/iwidgets/messagedialog' + autoload :Notebook, 'tkextlib/iwidgets/notebook' + autoload :Optionmenu, 'tkextlib/iwidgets/optionmenu' + autoload :Panedwindow, 'tkextlib/iwidgets/panedwindow' + autoload :Pushbutton, 'tkextlib/iwidgets/pushbutton' + autoload :Promptdialog, 'tkextlib/iwidgets/promptdialog' autoload :Radiobox, 'tkextlib/iwidgets/radiobox' + autoload :Scrolledcanvas, 'tkextlib/iwidgets/scrolledcanvas' + autoload :Scrolledframe, 'tkextlib/iwidgets/scrolledframe' + autoload :Scrolledhtml, 'tkextlib/iwidgets/scrolledhtml' + autoload :Scrolledlistbox, 'tkextlib/iwidgets/scrolledlistbox' + autoload :Scrolledtext, 'tkextlib/iwidgets/scrolledtext' autoload :Scrolledwidget, 'tkextlib/iwidgets/scrolledwidget' + autoload :Selectionbox, 'tkextlib/iwidgets/selectionbox' + autoload :Selectiondialog, 'tkextlib/iwidgets/selectiondialog' autoload :Shell, 'tkextlib/iwidgets/shell' + autoload :Spindate, 'tkextlib/iwidgets/spindate' + autoload :Spinint, 'tkextlib/iwidgets/spinint' + autoload :Spinner, 'tkextlib/iwidgets/spinner' + autoload :Spintime, 'tkextlib/iwidgets/spintime' + autoload :Tabnotebook, 'tkextlib/iwidgets/tabnotebook' + autoload :Tabset, 'tkextlib/iwidgets/tabset' autoload :Timeentry, 'tkextlib/iwidgets/timeentry' autoload :Timefield, 'tkextlib/iwidgets/timefield' autoload :Toolbar, 'tkextlib/iwidgets/toolbar' diff --git a/ext/tk/lib/tkextlib/iwidgets/buttonbox.rb b/ext/tk/lib/tkextlib/iwidgets/buttonbox.rb index 5ca48ed229..1ff190b9ff 100644 --- a/ext/tk/lib/tkextlib/iwidgets/buttonbox.rb +++ b/ext/tk/lib/tkextlib/iwidgets/buttonbox.rb @@ -56,7 +56,9 @@ class Tk::Iwidgets::Buttonbox keys = tag tag = nil end - unless tag + if tag + tag = Tk::Itk::Component.new(self, tagid(tag)) + else tag = Tk::Itk::Component.new(self) end tk_call(@path, 'add', tagid(tag), *hash_kv(keys)) @@ -87,7 +89,9 @@ class Tk::Iwidgets::Buttonbox keys = tag tag = nil end - unless tag + if tag + tag = Tk::Itk::Component.new(self, tagid(tag)) + else tag = Tk::Itk::Component.new(self) end tk_call(@path, 'insert', index(idx), tagid(tag), *hash_kv(keys)) diff --git a/ext/tk/lib/tkextlib/iwidgets/checkbox.rb b/ext/tk/lib/tkextlib/iwidgets/checkbox.rb index 5e0fb5e7b6..05d0e1d813 100644 --- a/ext/tk/lib/tkextlib/iwidgets/checkbox.rb +++ b/ext/tk/lib/tkextlib/iwidgets/checkbox.rb @@ -56,7 +56,9 @@ class Tk::Iwidgets::Checkbox keys = tag tag = nil end - unless tag + if tag + tag = Tk::Itk::Component.new(self, tagid(tag)) + else tag = Tk::Itk::Component.new(self) end tk_call(@path, 'add', tagid(tag), *hash_kv(keys)) @@ -93,7 +95,9 @@ class Tk::Iwidgets::Checkbox keys = tag tag = nil end - unless tag + if tag + tag = Tk::Itk::Component.new(self, tagid(tag)) + else tag = Tk::Itk::Component.new(self) end tk_call(@path, 'insert', index(idx), tagid(tag), *hash_kv(keys)) diff --git a/ext/tk/lib/tkextlib/iwidgets/dialogshell.rb b/ext/tk/lib/tkextlib/iwidgets/dialogshell.rb index 4736ebab77..88b9a97094 100644 --- a/ext/tk/lib/tkextlib/iwidgets/dialogshell.rb +++ b/ext/tk/lib/tkextlib/iwidgets/dialogshell.rb @@ -56,7 +56,9 @@ class Tk::Iwidgets::Dialogshell keys = tag tag = nil end - unless tag + if tag + tag = Tk::Itk::Component.new(self, tagid(tag)) + else tag = Tk::Itk::Component.new(self) end tk_call(@path, 'add', tagid(tag), *hash_kv(keys)) @@ -87,7 +89,9 @@ class Tk::Iwidgets::Dialogshell keys = tag tag = nil end - unless tag + if tag + tag = Tk::Itk::Component.new(self, tagid(tag)) + else tag = Tk::Itk::Component.new(self) end tk_call(@path, 'insert', index(idx), tagid(tag), *hash_kv(keys)) diff --git a/ext/tk/lib/tkextlib/iwidgets/entryfield.rb b/ext/tk/lib/tkextlib/iwidgets/entryfield.rb index 6299259b9b..300573bcec 100644 --- a/ext/tk/lib/tkextlib/iwidgets/entryfield.rb +++ b/ext/tk/lib/tkextlib/iwidgets/entryfield.rb @@ -87,7 +87,13 @@ class Tk::Iwidgets::Entryfield def value _fromUTF8(tk_send_without_enc('get')) end + def value= (val) + tk_send_without_enc('delete', 0, 'end') + tk_send_without_enc('insert', 0, _get_eval_enc_str(val)) + val + end alias get value + alias set value= def cursor=(index) tk_send_without_enc('icursor', index) diff --git a/ext/tk/lib/tkextlib/iwidgets/menubar.rb b/ext/tk/lib/tkextlib/iwidgets/menubar.rb new file mode 100644 index 0000000000..b4c94ff564 --- /dev/null +++ b/ext/tk/lib/tkextlib/iwidgets/menubar.rb @@ -0,0 +1,190 @@ +# +# tkextlib/iwidgets/menubar.rb +# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) +# + +require 'tk' +require 'tkextlib/iwidgets.rb' + +module Tk + module Iwidgets + class Menubar < Tk::Itk::Widget + end + end +end + +class Tk::Iwidgets::Menubar + TkCommandNames = ['::iwidgets::menubar'.freeze].freeze + WidgetClassName = 'Menubar'.freeze + WidgetClassNames[WidgetClassName] = self + + #################################### + + include TkItemConfigMethod + + def __item_cget_cmd(id) + [self.path, 'menucget', id] + end + private :__item_cget_cmd + + def __item_config_cmd(id) + [self.path, 'menuconfigure', id] + end + private :__item_config_cmd + + def tagid(tagOrId) + if tagOrId.kind_of?(Tk::Itk::Component) + tagOrId.name + else + #_get_eval_string(tagOrId) + tagOrId + end + end + + alias menucget itemcget + alias menuconfigure itemconfigure + alias menuconfiginfo itemconfiginfo + alias current_menuconfiginfo current_itemconfiginfo + + private :itemcget, :itemconfigure + private :itemconfiginfo, :current_itemconfiginfo + + #################################### + + def __methodcall_optkeys + {'menubuttons'=>'menubuttons'} + end + + def menubuttons(val = nil) + unless val + return tk_call(@path, 'cget', '-menubuttons') + end + + tk_call(@path, 'configure', '-menubuttons', _parse_menu_spec(val)) + self + end + + def _parse_menu_spec(menu_spec) + ret = '' + menu_spec.each{|spec| + next unless spec + + if spec.kind_of?(Hash) + args = [spec] + type = 'options' + else + type, *args = spec + end + + type = type.to_s + case type + when 'options' + keys = args[0] + ary = [type] + ary.concat(hash_kv(keys)) + ret << array2tk_list(ary) << "\n" + + when 'menubutton', 'cascade' + name, keys = args + if keys + ary = [type, name] + keys = _symbolkey2str(keys) + keys['menu'] = _parse_menu_spec(keys['menu']) if keys.key?('menu') + ary.concat(hash_kv(keys)) + ret << array2tk_list(ary) << "\n" + else + ret << array2tk_list([type, name]) << "\n" + end + + else + name, keys = args + if keys + ary = [type, name] + ary.concat(hash_kv(keys)) + ret << array2tk_list(ary) << "\n" + else + ret << array2tk_list([type, name]) << "\n" + end + end + } + ret + end + + #################################### + + def add(type, tag=nil, keys={}) + if tag.kind_of?(Hash) + keys = tag + tag = nil + end + if tag + tag = Tk::Itk::Component.new(self, tagid(tag)) + else + tag = Tk::Itk::Component.new(self) + end + keys = _symbolkey2str(keys) + keys['menu'] = _parse_menu_spec(keys['menu']) if keys.key?('menu') + tk_call(@path, 'add', type, tagid(tag), *hash_kv(keys)) + tag + end + + def delete(path1, path2=nil) + if path2 + else + tk_call(@path, 'delete', index(idx)) + end + self + end + + def index(idx) + number(tk_call(@path, 'index', tagid(idx))) + end + + def insert(idx, type, tag=nil, keys={}) + if tag.kind_of?(Hash) + keys = tag + tag = nil + end + if tag + tag = Tk::Itk::Component.new(self, tagid(tag)) + else + tag = Tk::Itk::Component.new(self) + end + keys = _symbolkey2str(keys) + keys['menu'] = _parse_menu_spec(keys['menu']) if keys.key?('menu') + tk_call(@path, 'insert', index(idx), type, tagid(tag), *hash_kv(keys)) + tag + end + + def invoke(idx) + tk_call(@path, 'invoke', index(idx)) + self + end + + def menupath(pat) + if (win = tk_call(@path, 'path', pat)) == '-1' + return nil + end + window(win) + end + def menupath_glob(pat) + if (win = tk_call(@path, 'path', '-glob', pat)) == '-1' + return nil + end + window(win) + end + def menupath_tclregexp(pat) + if (win = tk_call(@path, 'path', '-regexp', pat)) == '-1' + return nil + end + window(win) + end + + def type(path) + tk_call(@path, 'type', path) + end + + def yposition(path) + number(tk_call(@path, 'yposition', path)) + end +end diff --git a/ext/tk/lib/tkextlib/iwidgets/messagebox.rb b/ext/tk/lib/tkextlib/iwidgets/messagebox.rb index a9d9775c75..608f6f7adb 100644 --- a/ext/tk/lib/tkextlib/iwidgets/messagebox.rb +++ b/ext/tk/lib/tkextlib/iwidgets/messagebox.rb @@ -41,10 +41,10 @@ class Tk::Iwidgets::Messagebox end end - alias type_cget itemcget - alias type_configure itemconfigure - alias type_configinfo itemconfiginfo - alias current_type_configinfo current_itemconfiginfo + alias typecget itemcget + alias typeconfigure itemconfigure + alias typeconfiginfo itemconfiginfo + alias current_typeconfiginfo current_itemconfiginfo private :itemcget, :itemconfigure private :itemconfiginfo, :current_itemconfiginfo diff --git a/ext/tk/lib/tkextlib/iwidgets/notebook.rb b/ext/tk/lib/tkextlib/iwidgets/notebook.rb new file mode 100644 index 0000000000..511ee3dff3 --- /dev/null +++ b/ext/tk/lib/tkextlib/iwidgets/notebook.rb @@ -0,0 +1,163 @@ +# +# tkextlib/iwidgets/notebook.rb +# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) +# + +require 'tk' +require 'tkextlib/iwidgets.rb' + +module Tk + module Iwidgets + class Notebook < Tk::Itk::Widget + end + end +end + +class Tk::Iwidgets::Notebook + TkCommandNames = ['::iwidgets::notebook'.freeze].freeze + WidgetClassName = 'Notebook'.freeze + WidgetClassNames[WidgetClassName] = self + + #################################### + + include TkItemConfigMethod + + def __item_cget_cmd(id) + [self.path, 'tabcget', id] + end + private :__item_cget_cmd + + def __item_config_cmd(id) + [self.path, 'tabconfigure', id] + end + private :__item_config_cmd + + def tagid(tagOrId) + if tagOrId.kind_of?(Tk::Itk::Component) + tagOrId.name + else + #_get_eval_string(tagOrId) + tagOrId + end + end + + alias pagecget itemcget + alias pageconfigure itemconfigure + alias pageconfiginfo itemconfiginfo + alias current_pageconfiginfo current_itemconfiginfo + + private :itemcget, :itemconfigure + private :itemconfiginfo, :current_itemconfiginfo + + #################################### + + def add(keys={}) + window(tk_call(@path, 'add', *hash_kv(keys))) + end + + def child_site_list + list(tk_call(@path, 'childsite')) + end + + def child_site(idx) + if (new_idx = self.index(idx)) < 0 + new_idx = tagid(idx) + end + window(tk_call(@path, 'childsite', new_idx)) + end + + def delete(idx1, idx2=nil) + if (new_idx1 = self.index(idx1)) < 0 + new_idx1 = tagid(idx1) + end + if idx2 + if (new_idx2 = self.index(idx2)) < 0 + new_idx2 = tagid(idx2) + end + tk_call(@path, 'delete', new_idx1, new_idx2) + else + tk_call(@path, 'delete', new_idx1) + end + self + end + + def index(idx) + number(tk_call(@path, 'index', tagid(idx))) + end + + def insert(idx, keys={}) + if (new_idx = self.index(idx)) < 0 + new_idx = tagid(idx) + end + window(tk_call(@path, 'insert', new_idx, *hash_kv(keys))) + end + + def next + tk_call(@path, 'next') + self + end + + def prev + tk_call(@path, 'prev') + self + end + + def select(idx) + if (new_idx = self.index(idx)) < 0 + new_idx = tagid(idx) + end + tk_call(@path, 'select', new_idx) + self + end + + def scrollcommand(cmd=Proc.new) + configure_cmd 'scrollcommand', cmd + self + end + alias xscrollcommand scrollcommand + alias yscrollcommand scrollcommand + + def xscrollbar(bar=nil) + if bar + @scrollbar = bar + @scrollbar.orient 'horizontal' + self.scrollcommand {|*arg| @scrollbar.set(*arg)} + @scrollbar.command {|*arg| self.xview(*arg)} + Tk.update # avoid scrollbar trouble + end + @scrollbar + end + def yscrollbar(bar=nil) + if bar + @scrollbar = bar + @scrollbar.orient 'vertical' + self.scrollcommand {|*arg| @scrollbar.set(*arg)} + @scrollbar.command {|*arg| self.yview(*arg)} + Tk.update # avoid scrollbar trouble + end + @scrollbar + end + alias scrollbar yscrollbar + + def view(*index) + if index.size == 0 + window(tk_send_without_enc('view')) + else + tk_send_without_enc('view', *index) + self + end + end + alias xview view + alias yview view + + def view_moveto(*index) + view('moveto', *index) + end + alias xview_moveto view_moveto + alias yview_moveto view_moveto + def view_scroll(*index) + view('scroll', *index) + end + alias xview_scroll view_scroll + alias yview_scroll view_scroll +end diff --git a/ext/tk/lib/tkextlib/iwidgets/optionmenu.rb b/ext/tk/lib/tkextlib/iwidgets/optionmenu.rb new file mode 100644 index 0000000000..226163a150 --- /dev/null +++ b/ext/tk/lib/tkextlib/iwidgets/optionmenu.rb @@ -0,0 +1,87 @@ +# +# tkextlib/iwidgets/optionmenu.rb +# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) +# + +require 'tk' +require 'tkextlib/iwidgets.rb' + +module Tk + module Iwidgets + class Optionmenu < Tk::Iwidgets::Labeledwidget + end + end +end + +class Tk::Iwidgets::Optionmenu + TkCommandNames = ['::iwidgets::optionmenu'.freeze].freeze + WidgetClassName = 'Optionmenu'.freeze + WidgetClassNames[WidgetClassName] = self + + def delete(first, last=nil) + if last + tk_call(@path, 'delete', first, last) + else + tk_call(@path, 'delete', first) + end + self + end + + def disable(idx) + tk_call(@path, 'disable', idx) + self + end + + def enable(idx) + tk_call(@path, 'enable', idx) + self + end + + def get(first=nil, last=nil) + if last + simplelist(tk_call(@path, 'get', first, last)) + elsif first + tk_call(@path, 'get', first) + else + tk_call(@path, 'get') + end + end + def get_range(first, last) + get(first, last) + end + def get_selected + get() + end + + def index(idx) + number(tk_call(@path, 'index', idx)) + end + + def insert(idx, *args) + tk_call(@path, 'insert', idx, *args) + self + end + + def select(idx) + tk_call(@path, 'select', idx) + self + end + + def sort(*params, &b) + # see 'lsort' man page about params + if b + tk_call(@path, 'sort', '-command', proc(&b), *params) + else + tk_call(@path, 'sort', *params) + end + self + end + def sort_ascending + tk_call(@path, 'sort', 'ascending') + self + end + def sort_descending + tk_call(@path, 'sort', 'descending') + self + end +end diff --git a/ext/tk/lib/tkextlib/iwidgets/panedwindow.rb b/ext/tk/lib/tkextlib/iwidgets/panedwindow.rb new file mode 100644 index 0000000000..a205036239 --- /dev/null +++ b/ext/tk/lib/tkextlib/iwidgets/panedwindow.rb @@ -0,0 +1,127 @@ +# +# tkextlib/iwidgets/panedwindow.rb +# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) +# + +require 'tk' +require 'tkextlib/iwidgets.rb' + +module Tk + module Iwidgets + class Panedwindow < Tk::Itk::Widget + end + end +end + +class Tk::Iwidgets::Panedwindow + TkCommandNames = ['::iwidgets::panedwindow'.freeze].freeze + WidgetClassName = 'Panedwindow'.freeze + WidgetClassNames[WidgetClassName] = self + + #################################### + + include TkItemConfigMethod + + def __item_cget_cmd(id) + [self.path, 'panecget', id] + end + private :__item_cget_cmd + + def __item_config_cmd(id) + [self.path, 'paneconfigure', id] + end + private :__item_config_cmd + + def tagid(tagOrId) + if tagOrId.kind_of?(Tk::Itk::Component) + tagOrId.name + else + #_get_eval_string(tagOrId) + tagOrId + end + end + + alias panecget itemcget + alias paneconfigure itemconfigure + alias paneconfiginfo itemconfiginfo + alias current_paneconfiginfo current_itemconfiginfo + + private :itemcget, :itemconfigure + private :itemconfiginfo, :current_itemconfiginfo + + #################################### + + def add(tag=nil, keys={}) + if tag.kind_of?(Hash) + keys = tag + tag = nil + end + if tag + tag = Tk::Itk::Component.new(self, tagid(tag)) + else + tag = Tk::Itk::Component.new(self) + end + window(tk_call(@path, 'add', tagid(tag), *hash_kv(keys))) + tag + end + + def child_site_list + list(tk_call(@path, 'childsite')) + end + + def child_site(idx) + window(tk_call(@path, 'childsite', index(idx))) + end + + def delete(idx) + tk_call(@path, 'delete', index(idx)) + self + end + + def fraction(*percentages) + tk_call(@path, 'fraction', *percentages) + self + end + + def hide(idx) + tk_call(@path, 'hide', index(idx)) + self + end + + def index(idx) + number(tk_call(@path, 'index', tagid(idx))) + end + + def insert(idx, tag=nil, keys={}) + if tag.kind_of?(Hash) + keys = tag + tag = nil + end + if tag + tag = Tk::Itk::Component.new(self, tagid(tag)) + else + tag = Tk::Itk::Component.new(self) + end + window(tk_call(@path, 'insert', index(idx), tagid(tag), *hash_kv(keys))) + tag + end + + def invoke(idx=nil) + if idx + tk_call(@path, 'invoke', index(idx)) + else + tk_call(@path, 'invoke') + end + self + end + + def reset + tk_call(@path, 'reset') + self + end + + def show(idx) + tk_call(@path, 'show', index(idx)) + self + end +end diff --git a/ext/tk/lib/tkextlib/iwidgets/promptdialog.rb b/ext/tk/lib/tkextlib/iwidgets/promptdialog.rb new file mode 100644 index 0000000000..ec18647511 --- /dev/null +++ b/ext/tk/lib/tkextlib/iwidgets/promptdialog.rb @@ -0,0 +1,131 @@ +# +# tkextlib/iwidgets/promptdialog.rb +# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) +# + +require 'tk' +require 'tkextlib/iwidgets.rb' + +module Tk + module Iwidgets + class Promptdialog < Tk::Iwidgets::Dialog + end + end +end + +class Tk::Iwidgets::Promptdialog + TkCommandNames = ['::iwidgets::promptdialog'.freeze].freeze + WidgetClassName = 'Promptdialog'.freeze + WidgetClassNames[WidgetClassName] = self + + # index method is not available, because it shows index of the entry field + def default(name) + tk_call(@path, 'default', tagid(name)) + self + end + + def hide(name) + tk_call(@path, 'hide', tagid(name)) + self + end + + def invoke(name=nil) + if name + tk_call(@path, 'invoke', tagid(name)) + else + tk_call(@path, 'invoke') + end + self + end + + def show(name) + tk_call(@path, 'show', tagid(name)) + self + end + + + # based on Tk::Iwidgets::Entryfield + def clear + tk_call(@path, 'clear') + self + end + + def delete(first, last=None) + tk_send_without_enc('delete', first, last) + self + end + + def value + _fromUTF8(tk_send_without_enc('get')) + end + def value= (val) + tk_send_without_enc('delete', 0, 'end') + tk_send_without_enc('insert', 0, _get_eval_enc_str(val)) + val + end + alias get value + alias set value= + + def cursor=(index) + tk_send_without_enc('icursor', index) + #self + index + end + alias icursor cursor= + + def index(index) + number(tk_send_without_enc('index', index)) + end + + def insert(pos,text) + tk_send_without_enc('insert', pos, _get_eval_enc_str(text)) + self + end + + def mark(pos) + tk_send_without_enc('scan', 'mark', pos) + self + end + def dragto(pos) + tk_send_without_enc('scan', 'dragto', pos) + self + end + def selection_adjust(index) + tk_send_without_enc('selection', 'adjust', index) + self + end + def selection_clear + tk_send_without_enc('selection', 'clear') + self + end + def selection_from(index) + tk_send_without_enc('selection', 'from', index) + self + end + def selection_present() + bool(tk_send_without_enc('selection', 'present')) + end + def selection_range(s, e) + tk_send_without_enc('selection', 'range', s, e) + self + end + def selection_to(index) + tk_send_without_enc('selection', 'to', index) + self + end + + def xview(*index) + if index.size == 0 + list(tk_send_without_enc('xview')) + else + tk_send_without_enc('xview', *index) + self + end + end + def xview_moveto(*index) + xview('moveto', *index) + end + def xview_scroll(*index) + xview('scroll', *index) + end +end diff --git a/ext/tk/lib/tkextlib/iwidgets/pushbutton.rb b/ext/tk/lib/tkextlib/iwidgets/pushbutton.rb new file mode 100644 index 0000000000..25d3633507 --- /dev/null +++ b/ext/tk/lib/tkextlib/iwidgets/pushbutton.rb @@ -0,0 +1,30 @@ +# +# tkextlib/iwidgets/pushbutton.rb +# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) +# + +require 'tk' +require 'tkextlib/iwidgets.rb' + +module Tk + module Iwidgets + class Pushbutton < Tk::Itk::Widget + end + end +end + +class Tk::Iwidgets::Pushbutton + TkCommandNames = ['::iwidgets::pushbutton'.freeze].freeze + WidgetClassName = 'Pushbutton'.freeze + WidgetClassNames[WidgetClassName] = self + + def invoke + tk_call_without_enc(@path, 'invoke') + self + end + + def flash + tk_call_without_enc(@path, 'flash') + self + end +end diff --git a/ext/tk/lib/tkextlib/iwidgets/radiobox.rb b/ext/tk/lib/tkextlib/iwidgets/radiobox.rb index dd96089ffa..84c15082d6 100644 --- a/ext/tk/lib/tkextlib/iwidgets/radiobox.rb +++ b/ext/tk/lib/tkextlib/iwidgets/radiobox.rb @@ -56,7 +56,9 @@ class Tk::Iwidgets::Radiobox keys = tag tag = nil end - unless tag + if tag + tag = Tk::Itk::Component.new(self, tagid(tag)) + else tag = Tk::Itk::Component.new(self) end tk_call(@path, 'add', tagid(tag), *hash_kv(keys)) @@ -93,7 +95,9 @@ class Tk::Iwidgets::Radiobox keys = tag tag = nil end - unless tag + if tag + tag = Tk::Itk::Component.new(self, tagid(tag)) + else tag = Tk::Itk::Component.new(self) end tk_call(@path, 'insert', index(idx), tagid(tag), *hash_kv(keys)) diff --git a/ext/tk/lib/tkextlib/iwidgets/scopedobject.rb b/ext/tk/lib/tkextlib/iwidgets/scopedobject.rb new file mode 100644 index 0000000000..bddef50841 --- /dev/null +++ b/ext/tk/lib/tkextlib/iwidgets/scopedobject.rb @@ -0,0 +1,24 @@ +# +# tkextlib/iwidgets/buttonbox.rb +# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) +# + +require 'tk' +require 'tkextlib/iwidgets.rb' + +module Tk + module Iwidgets + class Scopedobject < TkObject + end + end +end + +class Tk::Iwidgets::Scopedobject + TkCommandNames = ['::iwidgets::scopedobject'.freeze].freeze + WidgetClassName = 'Scopedobject'.freeze + WidgetClassNames[WidgetClassName] = self + + def initialize(obj_name, keys={}) + @path = tk_call(self.class::TkCommandNames[0], obj_name, *hash_kv(keys)) + end +end diff --git a/ext/tk/lib/tkextlib/iwidgets/scrolledcanvas.rb b/ext/tk/lib/tkextlib/iwidgets/scrolledcanvas.rb new file mode 100644 index 0000000000..c5ed19c1f1 --- /dev/null +++ b/ext/tk/lib/tkextlib/iwidgets/scrolledcanvas.rb @@ -0,0 +1,315 @@ +# +# tkextlib/iwidgets/scrolledcanvas.rb +# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) +# + +require 'tk' +require 'tk/canvas' +require 'tkextlib/iwidgets.rb' + +module Tk + module Iwidgets + class Scrolledcanvas < Tk::Iwidgets::Scrolledwidget + end + end +end + +class Tk::Iwidgets::Scrolledcanvas + TkCommandNames = ['::iwidgets::scrolledcanvas'.freeze].freeze + WidgetClassName = 'Scrolledcanvas'.freeze + WidgetClassNames[WidgetClassName] = self + + ################################ + + def initialize(*args) + super(*args) + @canvas = component_widget('canvas') + end + + def method_missing(id, *args) + if @canvas.methods.include?(id.id2name) + @canvas.__send__(id, *args) + else + super(id, *args) + end + end + + ################################ + + def child_site + window(tk_call(@path, 'childsite')) + end + + def justify(dir) + tk_call(@path, 'justify', dir) + self + end + + ########################## + include TkCanvasItemConfig + + def tagid(tag) + if tag.kind_of?(TkcItem) || tag.kind_of?(TkcTag) + tag.id + elsif tag.kind_of?(Tk::Itk::Component) + tag.name + else + tag # maybe an Array of configure paramters + end + end + private :tagid + + # create a canvas item without creating a TkcItem object + def create(type, *args) + type.create(self, *args) + end + + ####################### + + def addtag(tag, mode, *args) + tk_send_without_enc('addtag', tagid(tag), mode, *args) + self + end + def addtag_above(tagOrId, target) + addtag(tagOrId, 'above', tagid(target)) + end + def addtag_all(tagOrId) + addtag(tagOrId, 'all') + end + def addtag_below(tagOrId, target) + addtag(tagOrId, 'below', tagid(target)) + end + def addtag_closest(tagOrId, x, y, halo=None, start=None) + addtag(tagOrId, 'closest', x, y, halo, start) + end + def addtag_enclosed(tagOrId, x1, y1, x2, y2) + addtag(tagOrId, 'enclosed', x1, y1, x2, y2) + end + def addtag_overlapping(tagOrId, x1, y1, x2, y2) + addtag(tagOrId, 'overlapping', x1, y1, x2, y2) + end + def addtag_withtag(tagOrId, tag) + addtag(tagOrId, 'withtag', tagid(tag)) + end + + def bbox(tagOrId, *tags) + list(tk_send_without_enc('bbox', tagid(tagOrId), + *tags.collect{|t| tagid(t)})) + end + + def itembind(tag, context, cmd=Proc.new, args=nil) + _bind([path, "bind", tagid(tag)], context, cmd, args) + self + end + + def itembind_append(tag, context, cmd=Proc.new, args=nil) + _bind_append([path, "bind", tagid(tag)], context, cmd, args) + self + end + + def itembind_remove(tag, context) + _bind_remove([path, "bind", tagid(tag)], context) + self + end + + def itembindinfo(tag, context=nil) + _bindinfo([path, "bind", tagid(tag)], context) + end + + def canvasx(screen_x, *args) + #tk_tcl2ruby(tk_send_without_enc('canvasx', screen_x, *args)) + number(tk_send_without_enc('canvasx', screen_x, *args)) + end + def canvasy(screen_y, *args) + #tk_tcl2ruby(tk_send_without_enc('canvasy', screen_y, *args)) + number(tk_send_without_enc('canvasy', screen_y, *args)) + end + + def coords(tag, *args) + if args == [] + tk_split_list(tk_send_without_enc('coords', tagid(tag))) + else + tk_send_without_enc('coords', tagid(tag), *(args.flatten)) + self + end + end + + def dchars(tag, first, last=None) + tk_send_without_enc('dchars', tagid(tag), + _get_eval_enc_str(first), _get_eval_enc_str(last)) + self + end + + def delete(*args) + if TkcItem::CItemID_TBL[self.path] + find('withtag', *args).each{|item| + TkcItem::CItemID_TBL[self.path].delete(item.id) + } + end + tk_send_without_enc('delete', *args.collect{|t| tagid(t)}) + self + end + alias remove delete + + def dtag(tag, tag_to_del=None) + tk_send_without_enc('dtag', tagid(tag), tag_to_del) + self + end + + def find(mode, *args) + list(tk_send_without_enc('find', mode, *args)).collect!{|id| + TkcItem.id2obj(self, id) + } + end + def find_above(target) + find('above', tagid(target)) + end + def find_all + find('all') + end + def find_below(target) + find('below', tagid(target)) + end + def find_closest(x, y, halo=None, start=None) + find('closest', x, y, halo, start) + end + def find_enclosed(x1, y1, x2, y2) + find('enclosed', x1, y1, x2, y2) + end + def find_overlapping(x1, y1, x2, y2) + find('overlapping', x1, y1, x2, y2) + end + def find_withtag(tag) + find('withtag', tag) + end + + def itemfocus(tagOrId=nil) + if tagOrId + tk_send_without_enc('focus', tagid(tagOrId)) + self + else + ret = tk_send_without_enc('focus') + if ret == "" + nil + else + TkcItem.id2obj(self, ret) + end + end + end + + def gettags(tagOrId) + list(tk_send_without_enc('gettags', tagid(tagOrId))).collect{|tag| + TkcTag.id2obj(self, tag) + } + end + + def icursor(tagOrId, index) + tk_send_without_enc('icursor', tagid(tagOrId), index) + self + end + + def index(tagOrId, index) + number(tk_send_without_enc('index', tagid(tagOrId), index)) + end + + def insert(tagOrId, index, string) + tk_send_without_enc('insert', tagid(tagOrId), index, + _get_eval_enc_str(string)) + self + end + + def lower(tag, below=nil) + if below + tk_send_without_enc('lower', tagid(tag), tagid(below)) + else + tk_send_without_enc('lower', tagid(tag)) + end + self + end + + def move(tag, x, y) + tk_send_without_enc('move', tagid(tag), x, y) + self + end + + def postscript(keys) + tk_send("postscript", *hash_kv(keys)) + end + + def raise(tag, above=nil) + if above + tk_send_without_enc('raise', tagid(tag), tagid(above)) + else + tk_send_without_enc('raise', tagid(tag)) + end + self + end + + def scale(tag, x, y, xs, ys) + tk_send_without_enc('scale', tagid(tag), x, y, xs, ys) + self + end + + def scan_mark(x, y) + tk_send_without_enc('scan', 'mark', x, y) + self + end + def scan_dragto(x, y) + tk_send_without_enc('scan', 'dragto', x, y) + self + end + + def select(mode, *args) + r = tk_send_without_enc('select', mode, *args) + (mode == 'item')? TkcItem.id2obj(self, r): self + end + def select_adjust(tagOrId, index) + select('adjust', tagid(tagOrId), index) + end + def select_clear + select('clear') + end + def select_from(tagOrId, index) + select('from', tagid(tagOrId), index) + end + def select_item + select('item') + end + def select_to(tagOrId, index) + select('to', tagid(tagOrId), index) + end + + def itemtype(tag) + TkcItem.type2class(tk_send('type', tagid(tag))) + end + + def xview(*index) + if index.size == 0 + list(tk_send_without_enc('xview')) + else + tk_send_without_enc('xview', *index) + self + end + end + def xview_moveto(*index) + xview('moveto', *index) + end + def xview_scroll(*index) + xview('scroll', *index) + end + + def yview(*index) + if index.size == 0 + list(tk_send_without_enc('yview')) + else + tk_send_without_enc('yview', *index) + self + end + end + def yview_moveto(*index) + yview('moveto', *index) + end + def yview_scroll(*index) + yview('scroll', *index) + end +end diff --git a/ext/tk/lib/tkextlib/iwidgets/scrolledframe.rb b/ext/tk/lib/tkextlib/iwidgets/scrolledframe.rb new file mode 100644 index 0000000000..8b47460357 --- /dev/null +++ b/ext/tk/lib/tkextlib/iwidgets/scrolledframe.rb @@ -0,0 +1,59 @@ +# +# tkextlib/iwidgets/scrolledframe.rb +# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) +# + +require 'tk' +require 'tkextlib/iwidgets.rb' + +module Tk + module Iwidgets + class Scrolledframe < Tk::Iwidgets::Scrolledwidget + end + end +end + +class Tk::Iwidgets::Scrolledframe + TkCommandNames = ['::iwidgets::scrolledframe'.freeze].freeze + WidgetClassName = 'Scrolledframe'.freeze + WidgetClassNames[WidgetClassName] = self + + def child_site + window(tk_call(@path, 'childsite')) + end + + def justify(dir) + tk_call(@path, 'justify', dir) + self + end + + def xview(*index) + if index.size == 0 + list(tk_send_without_enc('xview')) + else + tk_send_without_enc('xview', *index) + self + end + end + def xview_moveto(*index) + xview('moveto', *index) + end + def xview_scroll(*index) + xview('scroll', *index) + end + + def yview(*index) + if index.size == 0 + list(tk_send_without_enc('yview')) + else + tk_send_without_enc('yview', *index) + self + end + end + def yview_moveto(*index) + yview('moveto', *index) + end + def yview_scroll(*index) + yview('scroll', *index) + end +end diff --git a/ext/tk/lib/tkextlib/iwidgets/scrolledhtml.rb b/ext/tk/lib/tkextlib/iwidgets/scrolledhtml.rb new file mode 100644 index 0000000000..7023d889d1 --- /dev/null +++ b/ext/tk/lib/tkextlib/iwidgets/scrolledhtml.rb @@ -0,0 +1,43 @@ +# +# tkextlib/iwidgets/scrolledhtml.rb +# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) +# + +require 'tk' +require 'tkextlib/iwidgets.rb' + +module Tk + module Iwidgets + class Scrolledhtml < Tk::Iwidgets::Scrolledtext + end + end +end + +class Tk::Iwidgets::Scrolledhtml + TkCommandNames = ['::iwidgets::scrolledhtml'.freeze].freeze + WidgetClassName = 'Scrolledhtml'.freeze + WidgetClassNames[WidgetClassName] = self + + def import(href) + tk_call(@path, 'import', href) + self + end + + def import_link(href) + tk_call(@path, 'import', '-link', href) + self + end + + def pwd + tk_call(@path, 'pwd') + end + + def render(htmltext, workdir=None) + tk_call(@path, 'render', htmltext, workdir) + self + end + + def title + tk_call(@path, 'title') + end +end diff --git a/ext/tk/lib/tkextlib/iwidgets/scrolledlistbox.rb b/ext/tk/lib/tkextlib/iwidgets/scrolledlistbox.rb new file mode 100644 index 0000000000..9fe23b4edc --- /dev/null +++ b/ext/tk/lib/tkextlib/iwidgets/scrolledlistbox.rb @@ -0,0 +1,190 @@ +# +# tkextlib/iwidgets/scrolledlistbox.rb +# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) +# + +require 'tk' +require 'tk/listbox' +require 'tkextlib/iwidgets.rb' + +module Tk + module Iwidgets + class Scrolledlistbox < Tk::Iwidgets::Scrolledwidget + end + end +end + +class Tk::Iwidgets::Scrolledlistbox + TkCommandNames = ['::iwidgets::scrolledlistbox'.freeze].freeze + WidgetClassName = 'Scrolledlistbox'.freeze + WidgetClassNames[WidgetClassName] = self + + ################################ + + def initialize(*args) + super(*args) + @listbox = component_widget('listbox') + end + + def method_missing(id, *args) + if @listbox.methods.include?(id.id2name) + @listbox.__send__(id, *args) + else + super(id, *args) + end + end + + ################################ + + def clear + tk_call(@path, 'clear') + self + end + + def get_curselection + tk_call(@path, 'getcurselection') + end + + def justify(dir) + tk_call(@path, 'justify', dir) + self + end + + def selected_item_count + number(tk_call(@path, 'selecteditemcount')) + end + + def sort(*params, &b) + # see 'lsort' man page about params + if b + tk_call(@path, 'sort', '-command', proc(&b), *params) + else + tk_call(@path, 'sort', *params) + end + self + end + def sort_ascending + tk_call(@path, 'sort', 'ascending') + self + end + def sort_descending + tk_call(@path, 'sort', 'descending') + self + end + + ##################################### + + def bbox(index) + list(tk_send_without_enc('bbox', index)) + end + def delete(first, last=None) + tk_send_without_enc('delete', first, last) + self + end + def get(*index) + _fromUTF8(tk_send_without_enc('get', *index)) + end + def insert(index, *args) + tk_send('insert', index, *args) + self + end + def scan_mark(x, y) + tk_send_without_enc('scan', 'mark', x, y) + self + end + def scan_dragto(x, y) + tk_send_without_enc('scan', 'dragto', x, y) + self + end + def see(index) + tk_send_without_enc('see', index) + self + end + + ##################################### + + include TkListItemConfig + + def tagid(tag) + if tag.kind_of?(Tk::Itk::Component) + tag.name + else + super(tag) + end + end + private :tagid + + ##################################### + + def activate(y) + tk_send_without_enc('activate', y) + self + end + def curselection + list(tk_send_without_enc('curselection')) + end + def get(first, last=nil) + if last + tk_split_simplelist(_fromUTF8(tk_send_without_enc('get', first, last))) + else + _fromUTF8(tk_send_without_enc('get', first)) + end + end + def nearest(y) + tk_send_without_enc('nearest', y).to_i + end + def size + tk_send_without_enc('size').to_i + end + def selection_anchor(index) + tk_send_without_enc('selection', 'anchor', index) + self + end + def selection_clear(first, last=None) + tk_send_without_enc('selection', 'clear', first, last) + self + end + def selection_includes(index) + bool(tk_send_without_enc('selection', 'includes', index)) + end + def selection_set(first, last=None) + tk_send_without_enc('selection', 'set', first, last) + self + end + + def index(index) + tk_send_without_enc('index', index).to_i + end + + ##################################### + + def xview(*index) + if index.size == 0 + list(tk_send_without_enc('xview')) + else + tk_send_without_enc('xview', *index) + self + end + end + def xview_moveto(*index) + xview('moveto', *index) + end + def xview_scroll(*index) + xview('scroll', *index) + end + + def yview(*index) + if index.size == 0 + list(tk_send_without_enc('yview')) + else + tk_send_without_enc('yview', *index) + self + end + end + def yview_moveto(*index) + yview('moveto', *index) + end + def yview_scroll(*index) + yview('scroll', *index) + end +end diff --git a/ext/tk/lib/tkextlib/iwidgets/scrolledtext.rb b/ext/tk/lib/tkextlib/iwidgets/scrolledtext.rb new file mode 100644 index 0000000000..95d1034f16 --- /dev/null +++ b/ext/tk/lib/tkextlib/iwidgets/scrolledtext.rb @@ -0,0 +1,518 @@ +# +# tkextlib/iwidgets/scrolledtext.rb +# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) +# + +require 'tk' +require 'tk/text' +require 'tkextlib/iwidgets.rb' + +module Tk + module Iwidgets + class Scrolledtext < Tk::Iwidgets::Scrolledwidget + end + end +end + +class Tk::Iwidgets::Scrolledtext + TkCommandNames = ['::iwidgets::scrolledtext'.freeze].freeze + WidgetClassName = 'Scrolledtext'.freeze + WidgetClassNames[WidgetClassName] = self + + ################################ + + def initialize(*args) + super(*args) + @text = component_widget('text') + end + + def method_missing(id, *args) + if @text.methods.include?(id.id2name) + @text.__send__(id, *args) + else + super(id, *args) + end + end + + ################################ + + def child_site + window(tk_call(@path, 'childsite')) + end + + def clear + tk_call(@path, 'clear') + self + end + + def import(file, idx=nil) + if idx + tk_call(@path, 'import', file, index(idx)) + else + tk_call(@path, 'import', file) + end + self + end + + def export(file) + tk_call(@path, 'export', file) + self + end + + ##################################### + + include TkTextTagConfig + + def tagid(tag) + if tag.kind_of?(Tk::Itk::Component) + tag.name + else + super(tag) + end + end + private :tagid + + def bbox(index) + list(tk_send('bbox', index)) + end + def compare(idx1, op, idx2) + bool(tk_send_without_enc('compare', _get_eval_enc_str(idx1), + op, _get_eval_enc_str(idx2))) + end + + def debug + bool(tk_send_without_enc('debug')) + end + def debug=(boolean) + tk_send_without_enc('debug', boolean) + #self + boolean + end + + def delete(first, last=None) + tk_send_without_enc('delete', first, last) + self + end + + def dlineinfo(index) + list(tk_send_without_enc('dlineinfo', _get_eval_enc_str(index))) + end + + def get(*index) + _fromUTF8(tk_send_without_enc('get', *index)) + end + def get_displaychars(*index) + # Tk8.5 feature + get('-displaychars', *index) + end + + def image_cget(index, slot) + case slot.to_s + when 'text', 'label', 'show', 'data', 'file' + _fromUTF8(tk_send_without_enc('image', 'cget', + _get_eval_enc_str(index), "-#{slot}")) + else + tk_tcl2ruby(_fromUTF8(tk_send_without_enc('image', 'cget', + _get_eval_enc_str(index), + "-#{slot}"))) + end + end + + def image_configure(index, slot, value=None) + if slot.kind_of? Hash + _fromUTF8(tk_send_without_enc('image', 'configure', + _get_eval_enc_str(index), + *hash_kv(slot, true))) + else + _fromUTF8(tk_send_without_enc('image', 'configure', + _get_eval_enc_str(index), + "-#{slot}", + _get_eval_enc_str(value))) + end + self + end + + def image_configinfo(index, slot = nil) + if TkComm::GET_CONFIGINFO_AS_ARRAY + if slot + case slot.to_s + when 'text', 'label', 'show', 'data', 'file' + conf = tk_split_simplelist(_fromUTF8(tk_send_without_enc('image', 'configure', _get_eval_enc_str(index), "-#{slot}"))) + else + conf = tk_split_list(_fromUTF8(tk_send_without_enc('image', 'configure', _get_eval_enc_str(index), "-#{slot}"))) + end + conf[0] = conf[0][1..-1] + conf + else + tk_split_simplelist(_fromUTF8(tk_send_without_enc('image', 'configure', _get_eval_enc_str(index)))).collect{|conflist| + conf = tk_split_simplelist(conflist) + conf[0] = conf[0][1..-1] + case conf[0] + when 'text', 'label', 'show', 'data', 'file' + else + if conf[3] + if conf[3].index('{') + conf[3] = tk_split_list(conf[3]) + else + conf[3] = tk_tcl2ruby(conf[3]) + end + end + if conf[4] + if conf[4].index('{') + conf[4] = tk_split_list(conf[4]) + else + conf[4] = tk_tcl2ruby(conf[4]) + end + end + end + conf[1] = conf[1][1..-1] if conf.size == 2 # alias info + conf + } + end + else # ! TkComm::GET_CONFIGINFO_AS_ARRAY + if slot + case slot.to_s + when 'text', 'label', 'show', 'data', 'file' + conf = tk_split_simplelist(_fromUTF8(tk_send_without_enc('image', 'configure', _get_eval_enc_str(index), "-#{slot}"))) + else + conf = tk_split_list(_fromUTF8(tk_send_without_enc('image', 'configure', _get_eval_enc_str(index), "-#{slot}"))) + end + key = conf.shift[1..-1] + { key => conf } + else + ret = {} + tk_split_simplelist(_fromUTF8(tk_send_without_enc('image', 'configure', _get_eval_enc_str(index)))).each{|conflist| + conf = tk_split_simplelist(conflist) + key = conf.shift[1..-1] + case key + when 'text', 'label', 'show', 'data', 'file' + else + if conf[2] + if conf[2].index('{') + conf[2] = tk_split_list(conf[2]) + else + conf[2] = tk_tcl2ruby(conf[2]) + end + end + if conf[3] + if conf[3].index('{') + conf[3] = tk_split_list(conf[3]) + else + conf[3] = tk_tcl2ruby(conf[3]) + end + end + end + if conf.size == 1 + ret[key] = conf[0][1..-1] # alias info + else + ret[key] = conf + end + } + ret + end + end + end + + def current_image_configinfo(index, slot = nil) + if TkComm::GET_CONFIGINFO_AS_ARRAY + if slot + conf = image_configinfo(index, slot) + {conf[0] => conf[4]} + else + ret = {} + image_configinfo(index).each{|conf| + ret[conf[0]] = conf[4] if conf.size > 2 + } + ret + end + else # ! TkComm::GET_CONFIGINFO_AS_ARRAY + ret = {} + image_configinfo(index, slot).each{|k, conf| + ret[k] = conf[-1] if conf.kind_of?(Array) + } + ret + end + end + + def image_names + tk_split_simplelist(_fromUTF8(tk_send_without_enc('image', 'names'))).collect{|elt| + tagid2obj(elt) + } + end + + def index(index) + tk_send_without_enc('index', _get_eval_enc_str(index)) + end + + def insert(index, *args) + tk_send('insert', index, *args) + self + end + + def mark_names + tk_split_simplelist(_fromUTF8(tk_send_without_enc('mark', 'names'))).collect{|elt| + tagid2obj(elt) + } + end + + def mark_gravity(mark, direction=nil) + if direction + tk_send_without_enc('mark', 'gravity', + _get_eval_enc_str(mark), direction) + self + else + tk_send_without_enc('mark', 'gravity', _get_eval_enc_str(mark)) + end + end + + def mark_set(mark, index) + tk_send_without_enc('mark', 'set', _get_eval_enc_str(mark), + _get_eval_enc_str(index)) + self + end + alias set_mark mark_set + + def mark_unset(*marks) + tk_send_without_enc('mark', 'unset', + *(marks.collect{|mark| _get_eval_enc_str(mark)})) + self + end + alias unset_mark mark_unset + + def mark_next(index) + tagid2obj(_fromUTF8(tk_send_without_enc('mark', 'next', + _get_eval_enc_str(index)))) + end + alias next_mark mark_next + + def mark_previous(index) + tagid2obj(_fromUTF8(tk_send_without_enc('mark', 'previous', + _get_eval_enc_str(index)))) + end + alias previous_mark mark_previous + + def scan_mark(x, y) + tk_send_without_enc('scan', 'mark', x, y) + self + end + def scan_dragto(x, y) + tk_send_without_enc('scan', 'dragto', x, y) + self + end + + + def _ktext_length(txt) + if $KCODE !~ /n/i + return txt.gsub(/[^\Wa-zA-Z_\d]/, ' ').length + end + + # $KCODE == 'NONE' + if JAPANIZED_TK + tk_call_without_enc('kstring', 'length', + _get_eval_enc_str(txt)).to_i + else + begin + tk_call_without_enc('encoding', 'convertto', 'ascii', + _get_eval_enc_str(txt)).length + rescue StandardError, NameError + # sorry, I have no plan + txt.length + end + end + end + private :_ktext_length + + def tksearch(*args) + # call 'search' subcommand of text widget + # args ::= [] [] + # If is regexp, then it must be a regular expression of Tcl + if args[0].kind_of?(Array) + opts = args.shift.collect{|opt| '-' + opt.to_s } + else + opts = [] + end + + opts << '--' + + ret = tk_send('search', *(opts + args)) + if ret == "" + nil + else + ret + end + end + + def tksearch_with_count(*args) + # call 'search' subcommand of text widget + # args ::= [] [] + # If is regexp, then it must be a regular expression of Tcl + if args[0].kind_of?(Array) + opts = args.shift.collect{|opt| '-' + opt.to_s } + else + opts = [] + end + + opts << '-count' << args.shift << '--' + + ret = tk_send('search', *(opts + args)) + if ret == "" + nil + else + ret + end + end + + def search_with_length(pat,start,stop=None) + pat = pat.chr if pat.kind_of? Integer + if stop != None + return ["", 0] if compare(start,'>=',stop) + txt = get(start,stop) + if (pos = txt.index(pat)) + match = $& + #pos = txt[0..(pos-1)].split('').length if pos > 0 + pos = _ktext_length(txt[0..(pos-1)]) if pos > 0 + if pat.kind_of? String + #return [index(start + " + #{pos} chars"), pat.split('').length] + return [index(start + " + #{pos} chars"), + _ktext_length(pat), pat.dup] + else + #return [index(start + " + #{pos} chars"), $&.split('').length] + return [index(start + " + #{pos} chars"), + _ktext_length(match), match] + end + else + return ["", 0] + end + else + txt = get(start,'end - 1 char') + if (pos = txt.index(pat)) + match = $& + #pos = txt[0..(pos-1)].split('').length if pos > 0 + pos = _ktext_length(txt[0..(pos-1)]) if pos > 0 + if pat.kind_of? String + #return [index(start + " + #{pos} chars"), pat.split('').length] + return [index(start + " + #{pos} chars"), + _ktext_length(pat), pat.dup] + else + #return [index(start + " + #{pos} chars"), $&.split('').length] + return [index(start + " + #{pos} chars"), + _ktext_length(match), match] + end + else + txt = get('1.0','end - 1 char') + if (pos = txt.index(pat)) + match = $& + #pos = txt[0..(pos-1)].split('').length if pos > 0 + pos = _ktext_length(txt[0..(pos-1)]) if pos > 0 + if pat.kind_of? String + #return [index("1.0 + #{pos} chars"), pat.split('').length] + return [index("1.0 + #{pos} chars"), + _ktext_length(pat), pat.dup] + else + #return [index("1.0 + #{pos} chars"), $&.split('').length] + return [index("1.0 + #{pos} chars"), _ktext_length(match), match] + end + else + return ["", 0] + end + end + end + end + + def search(pat,start,stop=None) + search_with_length(pat,start,stop)[0] + end + + def rsearch_with_length(pat,start,stop=None) + pat = pat.chr if pat.kind_of? Integer + if stop != None + return ["", 0] if compare(start,'<=',stop) + txt = get(stop,start) + if (pos = txt.rindex(pat)) + match = $& + #pos = txt[0..(pos-1)].split('').length if pos > 0 + pos = _ktext_length(txt[0..(pos-1)]) if pos > 0 + if pat.kind_of? String + #return [index(stop + " + #{pos} chars"), pat.split('').length] + return [index(stop + " + #{pos} chars"), _ktext_length(pat), pat.dup] + else + #return [index(stop + " + #{pos} chars"), $&.split('').length] + return [index(stop + " + #{pos} chars"), _ktext_length(match), match] + end + else + return ["", 0] + end + else + txt = get('1.0',start) + if (pos = txt.rindex(pat)) + match = $& + #pos = txt[0..(pos-1)].split('').length if pos > 0 + pos = _ktext_length(txt[0..(pos-1)]) if pos > 0 + if pat.kind_of? String + #return [index("1.0 + #{pos} chars"), pat.split('').length] + return [index("1.0 + #{pos} chars"), _ktext_length(pat), pat.dup] + else + #return [index("1.0 + #{pos} chars"), $&.split('').length] + return [index("1.0 + #{pos} chars"), _ktext_length(match), match] + end + else + txt = get('1.0','end - 1 char') + if (pos = txt.rindex(pat)) + match = $& + #pos = txt[0..(pos-1)].split('').length if pos > 0 + pos = _ktext_length(txt[0..(pos-1)]) if pos > 0 + if pat.kind_of? String + #return [index("1.0 + #{pos} chars"), pat.split('').length] + return [index("1.0 + #{pos} chars"), _ktext_length(pat), pat.dup] + else + #return [index("1.0 + #{pos} chars"), $&.split('').length] + return [index("1.0 + #{pos} chars"), _ktext_length(match), match] + end + else + return ["", 0] + end + end + end + end + + def rsearch(pat,start,stop=None) + rsearch_with_length(pat,start,stop)[0] + end + + def see(index) + tk_send_without_enc('see', index) + self + end + + ############################### + + def xview(*index) + if index.size == 0 + list(tk_send_without_enc('xview')) + else + tk_send_without_enc('xview', *index) + self + end + end + def xview_moveto(*index) + xview('moveto', *index) + end + def xview_scroll(*index) + xview('scroll', *index) + end + + def yview(*index) + if index.size == 0 + list(tk_send_without_enc('yview')) + else + tk_send_without_enc('yview', *index) + self + end + end + def yview_moveto(*index) + yview('moveto', *index) + end + def yview_scroll(*index) + yview('scroll', *index) + end +end diff --git a/ext/tk/lib/tkextlib/iwidgets/selectionbox.rb b/ext/tk/lib/tkextlib/iwidgets/selectionbox.rb new file mode 100644 index 0000000000..91ba9248e1 --- /dev/null +++ b/ext/tk/lib/tkextlib/iwidgets/selectionbox.rb @@ -0,0 +1,92 @@ +# +# tkextlib/iwidgets/selectionbox.rb +# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) +# + +require 'tk' +require 'tkextlib/iwidgets.rb' + +module Tk + module Iwidgets + class Selectionbox < Tk::Itk::Widget + end + end +end + +class Tk::Iwidgets::Selectionbox + TkCommandNames = ['::iwidgets::selectionbox'.freeze].freeze + WidgetClassName = 'Selectionbox'.freeze + WidgetClassNames[WidgetClassName] = self + + def child_site + window(tk_call(@path, 'childsite')) + end + + def clear_items + tk_call(@path, 'clear', 'items') + self + end + + def clear_selection + tk_call(@path, 'clear', 'selection') + self + end + + def get + tk_call(@path, 'get') + end + + def insert_items(idx, *args) + tk_call(@path, 'insert', 'items', idx, *args) + end + + def insert_selection(pos, text) + tk_call(@path, 'insert', 'selection', pos, text) + end + + def select_item + tk_call(@path, 'selectitem') + self + end + + # based on TkListbox ( and TkTextWin ) + def curselection + list(tk_send_without_enc('curselection')) + end + def delete(first, last=None) + tk_send_without_enc('delete', first, last) + self + end + def index(index) + tk_send_without_enc('index', index).to_i + end + def nearest(y) + tk_send_without_enc('nearest', y).to_i + end + def scan_mark(x, y) + tk_send_without_enc('scan', 'mark', x, y) + self + end + def scan_dragto(x, y) + tk_send_without_enc('scan', 'dragto', x, y) + self + end + def selection_anchor(index) + tk_send_without_enc('selection', 'anchor', index) + self + end + def selection_clear(first, last=None) + tk_send_without_enc('selection', 'clear', first, last) + self + end + def selection_includes(index) + bool(tk_send_without_enc('selection', 'includes', index)) + end + def selection_set(first, last=None) + tk_send_without_enc('selection', 'set', first, last) + self + end + def size + tk_send_without_enc('size').to_i + end +end diff --git a/ext/tk/lib/tkextlib/iwidgets/selectiondialog.rb b/ext/tk/lib/tkextlib/iwidgets/selectiondialog.rb new file mode 100644 index 0000000000..794da5d61c --- /dev/null +++ b/ext/tk/lib/tkextlib/iwidgets/selectiondialog.rb @@ -0,0 +1,92 @@ +# +# tkextlib/iwidgets/selectiondialog.rb +# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) +# + +require 'tk' +require 'tkextlib/iwidgets.rb' + +module Tk + module Iwidgets + class Selectiondialog < Tk::Iwidgets::Dialog + end + end +end + +class Tk::Iwidgets::Selectiondialog + TkCommandNames = ['::iwidgets::selectiondialog'.freeze].freeze + WidgetClassName = 'Selectiondialog'.freeze + WidgetClassNames[WidgetClassName] = self + + def child_site + window(tk_call(@path, 'childsite')) + end + + def clear_items + tk_call(@path, 'clear', 'items') + self + end + + def clear_selection + tk_call(@path, 'clear', 'selection') + self + end + + def get + tk_call(@path, 'get') + end + + def insert_items(idx, *args) + tk_call(@path, 'insert', 'items', idx, *args) + end + + def insert_selection(pos, text) + tk_call(@path, 'insert', 'selection', pos, text) + end + + def select_item + tk_call(@path, 'selectitem') + self + end + + # based on TkListbox ( and TkTextWin ) + def curselection + list(tk_send_without_enc('curselection')) + end + def delete(first, last=None) + tk_send_without_enc('delete', first, last) + self + end + def index(index) + tk_send_without_enc('index', index).to_i + end + def nearest(y) + tk_send_without_enc('nearest', y).to_i + end + def scan_mark(x, y) + tk_send_without_enc('scan', 'mark', x, y) + self + end + def scan_dragto(x, y) + tk_send_without_enc('scan', 'dragto', x, y) + self + end + def selection_anchor(index) + tk_send_without_enc('selection', 'anchor', index) + self + end + def selection_clear(first, last=None) + tk_send_without_enc('selection', 'clear', first, last) + self + end + def selection_includes(index) + bool(tk_send_without_enc('selection', 'includes', index)) + end + def selection_set(first, last=None) + tk_send_without_enc('selection', 'set', first, last) + self + end + def size + tk_send_without_enc('size').to_i + end +end diff --git a/ext/tk/lib/tkextlib/iwidgets/spindate.rb b/ext/tk/lib/tkextlib/iwidgets/spindate.rb new file mode 100644 index 0000000000..6099ba77b9 --- /dev/null +++ b/ext/tk/lib/tkextlib/iwidgets/spindate.rb @@ -0,0 +1,38 @@ +# +# tkextlib/iwidgets/spindate.rb +# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) +# + +require 'tk' +require 'tkextlib/iwidgets.rb' + +module Tk + module Iwidgets + class Spindate < Tk::Itk::Widget + end + end +end + +class Tk::Iwidgets::Spindate + TkCommandNames = ['::iwidgets::spindate'.freeze].freeze + WidgetClassName = 'Spindate'.freeze + WidgetClassNames[WidgetClassName] = self + + def get_string + tk_call(@path, 'get', '-string') + end + alias get get_string + + def get_clicks + number(tk_call(@path, 'get', '-clicks')) + end + + def show(date=None) + tk_call(@path, 'show', date) + self + end + def show_now + tk_call(@path, 'show', 'now') + self + end +end diff --git a/ext/tk/lib/tkextlib/iwidgets/spinint.rb b/ext/tk/lib/tkextlib/iwidgets/spinint.rb new file mode 100644 index 0000000000..071b6ab8f7 --- /dev/null +++ b/ext/tk/lib/tkextlib/iwidgets/spinint.rb @@ -0,0 +1,20 @@ +# +# tkextlib/iwidgets/spinint.rb +# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) +# + +require 'tk' +require 'tkextlib/iwidgets.rb' + +module Tk + module Iwidgets + class Spinint < Tk::Iwidgets::Spinner + end + end +end + +class Tk::Iwidgets::Spinint + TkCommandNames = ['::iwidgets::spinint'.freeze].freeze + WidgetClassName = 'Spinint'.freeze + WidgetClassNames[WidgetClassName] = self +end diff --git a/ext/tk/lib/tkextlib/iwidgets/spinner.rb b/ext/tk/lib/tkextlib/iwidgets/spinner.rb new file mode 100644 index 0000000000..f4f0eb46c8 --- /dev/null +++ b/ext/tk/lib/tkextlib/iwidgets/spinner.rb @@ -0,0 +1,150 @@ +# +# tkextlib/iwidgets/spinner.rb +# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) +# + +require 'tk' +require 'tkextlib/iwidgets.rb' + +module Tk + module Iwidgets + class Spinner < Tk::Iwidgets::Labeledwidget + end + end +end + +class Tk::Iwidgets::Spinner + TkCommandNames = ['::iwidgets::spinner'.freeze].freeze + WidgetClassName = 'Spinner'.freeze + WidgetClassNames[WidgetClassName] = self + + #################################### + + include Tk::ValidateConfigure + + class EntryfieldValidate < TkValidateCommand + #class CalCmdArgs < TkUtil::CallbackSubst + class ValidateArgs < TkUtil::CallbackSubst + KEY_TBL = [ + [ ?c, ?s, :char ], + [ ?P, ?s, :post ], + [ ?S, ?s, :current ], + [ ?W, ?w, :widget ], + nil + ] + PROC_TBL = [ + [ ?s, TkComm.method(:string) ], + [ ?w, TkComm.method(:window) ], + nil + ] + _setup_subst_table(KEY_TBL, PROC_TBL); + end + + def self._config_keys + ['validate', 'invalid'] + end + end + + def __validation_class_list + super << EntryfieldValidate + end + + Tk::ValidateConfigure.__def_validcmd(binding, EntryfieldValidate) + + #################################### + + def up + tk_call_without_enc(@path, 'up') + self + end + + def down + tk_call_without_enc(@path, 'down') + self + end + + def clear + tk_call_without_enc(@path, 'clear') + self + end + + def delete(first, last=None) + tk_send_without_enc('delete', first, last) + self + end + + def value + _fromUTF8(tk_send_without_enc('get')) + end + def value= (val) + tk_send_without_enc('delete', 0, 'end') + tk_send_without_enc('insert', 0, _get_eval_enc_str(val)) + val + end + alias get value + alias set value= + + def cursor=(index) + tk_send_without_enc('icursor', index) + #self + index + end + alias icursor cursor= + + def index(index) + number(tk_send_without_enc('index', index)) + end + + def insert(pos,text) + tk_send_without_enc('insert', pos, _get_eval_enc_str(text)) + self + end + + def mark(pos) + tk_send_without_enc('scan', 'mark', pos) + self + end + def dragto(pos) + tk_send_without_enc('scan', 'dragto', pos) + self + end + def selection_adjust(index) + tk_send_without_enc('selection', 'adjust', index) + self + end + def selection_clear + tk_send_without_enc('selection', 'clear') + self + end + def selection_from(index) + tk_send_without_enc('selection', 'from', index) + self + end + def selection_present() + bool(tk_send_without_enc('selection', 'present')) + end + def selection_range(s, e) + tk_send_without_enc('selection', 'range', s, e) + self + end + def selection_to(index) + tk_send_without_enc('selection', 'to', index) + self + end + + # based on tk/scrollable.rb + def xview(*index) + if index.size == 0 + list(tk_send_without_enc('xview')) + else + tk_send_without_enc('xview', *index) + self + end + end + def xview_moveto(*index) + xview('moveto', *index) + end + def xview_scroll(*index) + xview('scroll', *index) + end +end diff --git a/ext/tk/lib/tkextlib/iwidgets/spintime.rb b/ext/tk/lib/tkextlib/iwidgets/spintime.rb new file mode 100644 index 0000000000..c1e1f5e5f1 --- /dev/null +++ b/ext/tk/lib/tkextlib/iwidgets/spintime.rb @@ -0,0 +1,38 @@ +# +# tkextlib/iwidgets/spintime.rb +# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) +# + +require 'tk' +require 'tkextlib/iwidgets.rb' + +module Tk + module Iwidgets + class Spintime < Tk::Itk::Widget + end + end +end + +class Tk::Iwidgets::Spintime + TkCommandNames = ['::iwidgets::spintime'.freeze].freeze + WidgetClassName = 'Spintime'.freeze + WidgetClassNames[WidgetClassName] = self + + def get_string + tk_call(@path, 'get', '-string') + end + alias get get_string + + def get_clicks + number(tk_call(@path, 'get', '-clicks')) + end + + def show(date=None) + tk_call(@path, 'show', date) + self + end + def show_now + tk_call(@path, 'show', 'now') + self + end +end diff --git a/ext/tk/lib/tkextlib/iwidgets/tabnotebook.rb b/ext/tk/lib/tkextlib/iwidgets/tabnotebook.rb new file mode 100644 index 0000000000..5321331551 --- /dev/null +++ b/ext/tk/lib/tkextlib/iwidgets/tabnotebook.rb @@ -0,0 +1,154 @@ +# +# tkextlib/iwidgets/tabnotebook.rb +# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) +# + +require 'tk' +require 'tkextlib/iwidgets.rb' + +module Tk + module Iwidgets + class Tabnotebook < Tk::Itk::Widget + end + end +end + +class Tk::Iwidgets::Tabnotebook + TkCommandNames = ['::iwidgets::tabnotebook'.freeze].freeze + WidgetClassName = 'Tabnotebook'.freeze + WidgetClassNames[WidgetClassName] = self + + #################################### + + include TkItemConfigMethod + + def __item_cget_cmd(id) + [self.path, 'tabcget', id] + end + private :__item_cget_cmd + + def __item_config_cmd(id) + [self.path, 'tabconfigure', id] + end + private :__item_config_cmd + + def tagid(tagOrId) + if tagOrId.kind_of?(Tk::Itk::Component) + tagOrId.name + else + #_get_eval_string(tagOrId) + tagOrId + end + end + + alias pagecget itemcget + alias pageconfigure itemconfigure + alias pageconfiginfo itemconfiginfo + alias current_pageconfiginfo current_itemconfiginfo + + private :itemcget, :itemconfigure + private :itemconfiginfo, :current_itemconfiginfo + + #################################### + + def initialize(*args) + super(*args) + @tabset = self.component_widget('tabset') + end + + def add(keys={}) + window(tk_call(@path, 'add', *hash_kv(keys))) + end + + def child_site_list + list(tk_call(@path, 'childsite')) + end + + def child_site(idx) + window(tk_call(@path, 'childsite', index(idx))) + end + + def delete(idx1, idx2=nil) + if idx2 + tk_call(@path, 'delete', index(idx1), index(idx2)) + else + tk_call(@path, 'delete', index(idx1)) + end + self + end + + def index(idx) + #number(tk_call(@path, 'index', tagid(idx))) + @tabset.index(tagid(idx)) + end + + def insert(idx, keys={}) + window(tk_call(@path, 'insert', index(idx), *hash_kv(keys))) + end + + def next + tk_call(@path, 'next') + self + end + + def prev + tk_call(@path, 'prev') + self + end + + def select(idx) + tk_call(@path, 'select', index(idx)) + self + end + + def scrollcommand(cmd=Proc.new) + configure_cmd 'scrollcommand', cmd + self + end + alias xscrollcommand scrollcommand + alias yscrollcommand scrollcommand + + def xscrollbar(bar=nil) + if bar + @scrollbar = bar + @scrollbar.orient 'horizontal' + self.scrollcommand {|*arg| @scrollbar.set(*arg)} + @scrollbar.command {|*arg| self.xview(*arg)} + Tk.update # avoid scrollbar trouble + end + @scrollbar + end + def yscrollbar(bar=nil) + if bar + @scrollbar = bar + @scrollbar.orient 'vertical' + self.scrollcommand {|*arg| @scrollbar.set(*arg)} + @scrollbar.command {|*arg| self.yview(*arg)} + Tk.update # avoid scrollbar trouble + end + @scrollbar + end + alias scrollbar yscrollbar + + def view(*index) + if index.size == 0 + window(tk_send_without_enc('view')) + else + tk_send_without_enc('view', *index) + self + end + end + alias xview view + alias yview view + + def view_moveto(*index) + view('moveto', *index) + end + alias xview_moveto view_moveto + alias yview_moveto view_moveto + def view_scroll(*index) + view('scroll', *index) + end + alias xview_scroll view_scroll + alias yview_scroll view_scroll +end diff --git a/ext/tk/lib/tkextlib/iwidgets/tabset.rb b/ext/tk/lib/tkextlib/iwidgets/tabset.rb new file mode 100644 index 0000000000..1b76916ab7 --- /dev/null +++ b/ext/tk/lib/tkextlib/iwidgets/tabset.rb @@ -0,0 +1,89 @@ +# +# tkextlib/iwidgets/tabset.rb +# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) +# + +require 'tk' +require 'tkextlib/iwidgets.rb' + +module Tk + module Iwidgets + class Tabset < Tk::Itk::Widget + end + end +end + +class Tk::Iwidgets::Tabset + TkCommandNames = ['::iwidgets::tabset'.freeze].freeze + WidgetClassName = 'Tabset'.freeze + WidgetClassNames[WidgetClassName] = self + + #################################### + + include TkItemConfigMethod + + def __item_cget_cmd(id) + [self.path, 'tabcget', id] + end + private :__item_cget_cmd + + def __item_config_cmd(id) + [self.path, 'tabconfigure', id] + end + private :__item_config_cmd + + def tagid(tagOrId) + if tagOrId.kind_of?(Tk::Itk::Component) + tagOrId.name + else + #_get_eval_string(tagOrId) + tagOrId + end + end + + alias tabcget itemcget + alias tabconfigure itemconfigure + alias tabconfiginfo itemconfiginfo + alias current_tabconfiginfo current_itemconfiginfo + + private :itemcget, :itemconfigure + private :itemconfiginfo, :current_itemconfiginfo + + #################################### + + def add(keys={}) + window(tk_call(@path, 'add', *hash_kv(keys))) + end + + def delete(idx1, idx2=nil) + if idx2 + tk_call(@path, 'delete', index(idx1), index(idx2)) + else + tk_call(@path, 'delete', index(idx1)) + end + self + end + + def index(idx) + number(tk_call(@path, 'index', tagid(idx))) + end + + def insert(idx, keys={}) + window(tk_call(@path, 'insert', index(idx), *hash_kv(keys))) + end + + def next + tk_call(@path, 'next') + self + end + + def prev + tk_call(@path, 'prev') + self + end + + def select(idx) + tk_call(@path, 'select', index(idx)) + self + end +end diff --git a/ext/tk/lib/tkextlib/iwidgets/toolbar.rb b/ext/tk/lib/tkextlib/iwidgets/toolbar.rb index 81239f9b97..fffd5b388c 100644 --- a/ext/tk/lib/tkextlib/iwidgets/toolbar.rb +++ b/ext/tk/lib/tkextlib/iwidgets/toolbar.rb @@ -22,6 +22,16 @@ class Tk::Iwidgets::Toolbar include TkItemConfigMethod + def __item_cget_cmd(id) + [self.path, 'itemcget', self.index(id)] + end + private :__item_cget_cmd + + def __item_config_cmd(id) + [self.path, 'itemconfigure', self.index(id)] + end + private :__item_config_cmd + def tagid(tagOrId) if tagOrId.kind_of?(Tk::Itk::Component) tagOrId.name @@ -38,10 +48,12 @@ class Tk::Iwidgets::Toolbar keys = tag tag = nil end - unless tag + if tag + tag = Tk::Itk::Component.new(self, tagid(tag)) + else tag = Tk::Itk::Component.new(self) end - tk_call(@path, 'add', type, tagid(tag), *hash_kv(keys)) + window(tk_call(@path, 'add', type, tagid(tag), *hash_kv(keys))) tag end @@ -63,24 +75,13 @@ class Tk::Iwidgets::Toolbar keys = tag tag = nil end - unless tag + if tag + tag = Tk::Itk::Component.new(self, tagid(tag)) + else tag = Tk::Itk::Component.new(self) end - tk_call(@path, 'insert', index(idx), type, tagid(tag), *hash_kv(keys)) + window(tk_call(@path, 'insert', index(idx), type, + tagid(tag), *hash_kv(keys))) tag end - - def invoke(idx=nil) - if idx - tk_call(@path, 'invoke', index(idx)) - else - tk_call(@path, 'invoke') - end - self - end - - def show(idx) - tk_call(@path, 'show', index(idx)) - self - end end diff --git a/ext/tk/lib/tkextlib/tcllib.rb b/ext/tk/lib/tkextlib/tcllib.rb index 831cc5a327..8810943b5b 100644 --- a/ext/tk/lib/tkextlib/tcllib.rb +++ b/ext/tk/lib/tkextlib/tcllib.rb @@ -29,7 +29,7 @@ rescue => e err << "\n ['" << target << "'] " << e.class.name << ' : ' << e.message end -# package:: style +# package:: cursor target = 'tkextlib/tcllib/style' begin require target @@ -40,6 +40,8 @@ end # autoload module Tk module Tcllib + TkComm::TkExtlibAutoloadModule.unshift(self) + # package:: ctext autoload :CText, 'tkextlib/tcllib/ctext' @@ -49,6 +51,7 @@ module Tk # package:: ipentry autoload :IP_Entry, 'tkextlib/tcllib/ip_entry' + autoload :IPEntry, 'tkextlib/tcllib/ip_entry' # package:: Plotchart autoload :Plotchart, 'tkextlib/tcllib/plotchart' @@ -58,7 +61,6 @@ module Tk end end -unless err.empty? +if $VERBOSE && !err.empty? warn("Warning: some sub-packages are failed to require : " + err) end - diff --git a/ext/tk/lib/tkextlib/tcllib/autoscroll.rb b/ext/tk/lib/tkextlib/tcllib/autoscroll.rb index 117ed8d98a..d0cb2812cb 100644 --- a/ext/tk/lib/tkextlib/tcllib/autoscroll.rb +++ b/ext/tk/lib/tkextlib/tcllib/autoscroll.rb @@ -38,31 +38,40 @@ module Tk '' end end + + def self.not_available + fail RuntimeError, "'tkextlib/tcllib/autoscroll' extension is not available on your current environment." + end + + def self.autoscroll(win) + Tk::Tcllib::Autoscroll.not_available + end + + def self.unautoscroll(win) + Tk::Tcllib::Autoscroll.not_available + end end end end -# TkPackage.require('autoscroll', '1.0') -TkPackage.require('autoscroll') - module Tk module Scrollable def autoscroll(mode = nil) case mode when :x, 'x' if @xscrollbar - tk_send_without_enc('::autoscroll::autoscroll', @xscrollbar) + Tk::Tcllib::Autoscroll.autoscroll(@xscrollbar) end when :y, 'y' if @yscrollbar - tk_send_without_enc('::autoscroll::autoscroll', @yscrollbar) + Tk::Tcllib::Autoscroll.autoscroll(@yscrollbar) end when nil, :both, 'both' if @xscrollbar - tk_send_without_enc('::autoscroll::autoscroll', @xscrollbar) + Tk::Tcllib::Autoscroll.autoscroll(@xscrollbar) end if @yscrollbar - tk_send_without_enc('::autoscroll::autoscroll', @yscrollbar) + Tk::Tcllib::Autoscroll.autoscroll(@yscrollbar) end else fail ArgumentError, "'x', 'y' or 'both' (String or Symbol) is expected" @@ -73,18 +82,18 @@ module Tk case mode when :x, 'x' if @xscrollbar - tk_send_without_enc('::autoscroll::unautoscroll', @xscrollbar) + Tk::Tcllib::Autoscroll.unautoscroll(@xscrollbar) end when :y, 'y' if @yscrollbar - tk_send_without_enc('::autoscroll::unautoscroll', @yscrollbar) + Tk::Tcllib::Autoscroll.unautoscroll(@yscrollbar) end when nil, :both, 'both' if @xscrollbar - tk_send_without_enc('::autoscroll::unautoscroll', @xscrollbar) + Tk::Tcllib::Autoscroll.unautoscroll(@xscrollbar) end if @yscrollbar - tk_send_without_enc('::autoscroll::unautoscroll', @yscrollbar) + Tk::Tcllib::Autoscroll.unautoscroll(@yscrollbar) end else fail ArgumentError, "'x', 'y' or 'both' (String or Symbol) is expected" @@ -98,12 +107,36 @@ class TkScrollbar def autoscroll # Arranges for the already existing scrollbar to be mapped # and unmapped as needed. - tk_send_without_enc('::autoscroll::autoscroll', @path) + #tk_call_without_enc('::autoscroll::autoscroll', @path) + Tk::Tcllib::Autoscroll.autoscroll(self) self end def unautoscroll # Returns the scrollbar to its original static state. - tk_send_without_enc('::autoscroll::unautoscroll', @path) + #tk_call_without_enc('::autoscroll::unautoscroll', @path) + Tk::Tcllib::Autoscroll.unautoscroll(self) self end end + +# TkPackage.require('autoscroll', '1.0') +TkPackage.require('autoscroll') + +module Tk + module Tcllib + class << Autoscroll + undef not_available + end + + module Autoscroll + def self.autoscroll(win) + tk_call_without_enc('::autoscroll::autoscroll', win.path) + end + + def self.unautoscroll(win) + tk_call_without_enc('::autoscroll::unautoscroll', win.path) + end + end + end +end + diff --git a/ext/tk/lib/tkextlib/tcllib/cursor.rb b/ext/tk/lib/tkextlib/tcllib/cursor.rb index 119b8a143f..8813aa05dd 100644 --- a/ext/tk/lib/tkextlib/tcllib/cursor.rb +++ b/ext/tk/lib/tkextlib/tcllib/cursor.rb @@ -9,19 +9,32 @@ require 'tk' require 'tkextlib/tcllib.rb' -# TkPackage.require('cursor', '0.1') -TkPackage.require('cursor') - module Tk module Tcllib module Cursor def self.package_version begin - TkPackage.require('ipentry') + TkPackage.require('cursor') rescue '' end end + + def self.not_available + fail RuntimeError, "'tkextlib/tcllib/cursor' extension is not available on your current environment." + end + + def self.cursor_display(win=None) + Tk::Tcllib::Cursor.not_available + end + + def self.cursor_propagate(win, cursor) + Tk::Tcllib::Cursor.not_available + end + + def self.cursor_restore(win, cursor = None) + Tk::Tcllib::Cursor.not_available + end end end @@ -29,20 +42,48 @@ module Tk # Pops up a dialog with a listbox containing all the cursor names. # Selecting a cursor name will display it in that dialog. # This is simply for viewing any available cursors on the platform . - tk_call_without_enc('::cursor::display', parent) + #tk_call_without_enc('::cursor::display', parent) + Tk::Tcllib::Cursor.cursor_display(parent) end end class TkWindow def cursor_propagate(cursor) # Sets the cursor for self and all its descendants to cursor. - tk_send_without_enc('::cursor::propagate', @path, cursor) + #tk_call_without_enc('::cursor::propagate', @path, cursor) + Tk::Tcllib::Cursor.cursor_propagate(cursor) end def cursor_restore(cursor = None) # Restore the original or previously set cursor for self and all its # descendants. If cursor is specified, that will be used if on any # widget that did not have a preset cursor (set by a previous call # to TkWindow#cursor_propagate). - tk_send_without_enc('::cursor::restore', @path, cursor) + #tk_call_without_enc('::cursor::restore', @path, cursor) + Tk::Tcllib::Cursor.cursor_restore(cursor) + end +end + +# TkPackage.require('cursor', '0.1') +TkPackage.require('cursor') + +module Tk + module Tcllib + class << Cursor + undef not_available + end + + module Cursor + def self.cursor_display(win=None) + tk_call_without_enc('::cursor::display', win) + end + + def self.cursor_propagate(win, cursor) + tk_call_without_enc('::cursor::propagate', win.path, cursor) + end + + def self.cursor_restore(win, cursor = None) + tk_call_without_enc('::cursor::restore', win.path, cursor) + end + end end end diff --git a/ext/tk/lib/tkextlib/tcllib/ip_entry.rb b/ext/tk/lib/tkextlib/tcllib/ip_entry.rb index 748478a322..977ef4e5c8 100644 --- a/ext/tk/lib/tkextlib/tcllib/ip_entry.rb +++ b/ext/tk/lib/tkextlib/tcllib/ip_entry.rb @@ -27,6 +27,7 @@ module Tk end end end + IPEntry = IP_Entry end end diff --git a/ext/tk/lib/tkextlib/tcllib/plotchart.rb b/ext/tk/lib/tkextlib/tcllib/plotchart.rb index b22a4ebbdf..65451a27a9 100644 --- a/ext/tk/lib/tkextlib/tcllib/plotchart.rb +++ b/ext/tk/lib/tkextlib/tcllib/plotchart.rb @@ -221,7 +221,10 @@ module Tk::Tcllib::Plotchart class XYPlot < TkCanvas include ChartMethod - TkCommandNames = ['::Plotchart::createXYPlot'.freeze].freeze + TkCommandNames = [ + 'canvas'.freeze, + '::Plotchart::createXYPlot'.freeze + ].freeze def initialize(*args) # args := ([parent,] xaxis, yaxis [, keys]) # xaxis := Array of [minimum, maximum, stepsize] @@ -248,12 +251,16 @@ module Tk::Tcllib::Plotchart end def _create_chart - p self.class::TkCommandNames[0] if $DEBUG - tk_call_without_enc(self.class::TkCommandNames[0], @path, + p self.class::TkCommandNames[1] if $DEBUG + tk_call_without_enc(self.class::TkCommandNames[1], @path, array2tk_list(@xaxis), array2tk_list(@yaxis)) end private :_create_chart + def __destroy_hook__ + Tk::Tcllib::Plotchart::PlotSeries::SeriesID_TBL.delete(@path) + end + def plot(series, x, y) tk_call_without_enc(@chart, 'plot', _get_eval_enc_str(series), x, y) self @@ -271,14 +278,20 @@ module Tk::Tcllib::Plotchart ############################ class Stripchart < XYPlot - TkCommandNames = ['::Plotchart::createStripchart'.freeze].freeze + TkCommandNames = [ + 'canvas'.freeze, + '::Plotchart::createStripchart'.freeze + ].freeze end ############################ class PolarPlot < TkCanvas include ChartMethod - TkCommandNames = ['::Plotchart::createPolarplot'.freeze].freeze + TkCommandNames = [ + 'canvas'.freeze, + '::Plotchart::createPolarplot'.freeze + ].freeze def initialize(*args) # args := ([parent,] radius_data [, keys]) # radius_data := Array of [maximum_radius, stepsize] @@ -302,12 +315,16 @@ module Tk::Tcllib::Plotchart end def _create_chart - p self.class::TkCommandNames[0] if $DEBUG - tk_call_without_enc(self.class::TkCommandNames[0], @path, + p self.class::TkCommandNames[1] if $DEBUG + tk_call_without_enc(self.class::TkCommandNames[1], @path, array2tk_list(@radius_data)) end private :_create_chart + def __destroy_hook__ + Tk::Tcllib::Plotchart::PlotSeries::SeriesID_TBL.delete(@path) + end + def plot(series, radius, angle) tk_call_without_enc(@chart, 'plot', _get_eval_enc_str(series), radius, angle) @@ -329,7 +346,10 @@ module Tk::Tcllib::Plotchart class IsometricPlot < TkCanvas include ChartMethod - TkCommandNames = ['::Plotchart::createIsometricPlot'.freeze].freeze + TkCommandNames = [ + 'canvas'.freeze, + '::Plotchart::createIsometricPlot'.freeze + ].freeze def initialize(*args) # args := ([parent,] xaxis, yaxis, [, step] [, keys]) # xaxis := Array of [minimum, maximum] @@ -369,8 +389,8 @@ module Tk::Tcllib::Plotchart end def _create_chart - p self.class::TkCommandNames[0] if $DEBUG - tk_call_without_enc(self.class::TkCommandNames[0], @path, + p self.class::TkCommandNames[1] if $DEBUG + tk_call_without_enc(self.class::TkCommandNames[1], @path, array2tk_list(@xaxis), array2tk_list(@yaxis), @stepsize) end @@ -406,7 +426,10 @@ module Tk::Tcllib::Plotchart class Plot3D < TkCanvas include ChartMethod - TkCommandNames = ['::Plotchart::create3DPlot'.freeze].freeze + TkCommandNames = [ + 'canvas'.freeze, + '::Plotchart::create3DPlot'.freeze + ].freeze def initialize(*args) # args := ([parent,] xaxis, yaxis, zaxis [, keys]) # xaxis := Array of [minimum, maximum, stepsize] @@ -436,8 +459,8 @@ module Tk::Tcllib::Plotchart end def _create_chart - p self.class::TkCommandNames[0] if $DEBUG - tk_call_without_enc(self.class::TkCommandNames[0], @path, + p self.class::TkCommandNames[1] if $DEBUG + tk_call_without_enc(self.class::TkCommandNames[1], @path, array2tk_list(@xaxis), array2tk_list(@yaxis), array2tk_list(@zaxis)) @@ -478,7 +501,10 @@ module Tk::Tcllib::Plotchart class Piechart < TkCanvas include ChartMethod - TkCommandNames = ['::Plotchart::createPiechart'.freeze].freeze + TkCommandNames = [ + 'canvas'.freeze, + '::Plotchart::createPiechart'.freeze + ].freeze def initialize(*args) # args := ([parent] [, keys]) if args[0].kind_of?(TkCanvas) @@ -491,8 +517,8 @@ module Tk::Tcllib::Plotchart end def _create_chart - p self.class::TkCommandNames[0] if $DEBUG - tk_call_without_enc(self.class::TkCommandNames[0], @path) + p self.class::TkCommandNames[1] if $DEBUG + tk_call_without_enc(self.class::TkCommandNames[1], @path) end private :_create_chart @@ -506,7 +532,10 @@ module Tk::Tcllib::Plotchart class Barchart < TkCanvas include ChartMethod - TkCommandNames = ['::Plotchart::createBarchart'.freeze].freeze + TkCommandNames = [ + 'canvas'.freeze, + '::Plotchart::createBarchart'.freeze + ].freeze def initialize(*args) # args := ([parent,] xlabels, ylabels [, series] [, keys]) @@ -549,13 +578,17 @@ module Tk::Tcllib::Plotchart end def _create_chart - p self.class::TkCommandNames[0] if $DEBUG - tk_call_without_enc(self.class::TkCommandNames[0], @path, + p self.class::TkCommandNames[1] if $DEBUG + tk_call_without_enc(self.class::TkCommandNames[1], @path, array2tk_list(@xlabels), array2tk_list(@ylabels), @series_size) end private :_create_chart + def __destroy_hook__ + Tk::Tcllib::Plotchart::PlotSeries::SeriesID_TBL.delete(@path) + end + def plot(series, dat, col=None) tk_call_without_enc(@chart, 'plot', series, dat, col) self @@ -573,14 +606,20 @@ module Tk::Tcllib::Plotchart ############################ class HorizontalBarchart < Barchart - TkCommandNames = ['::Plotchart::createHorizontalBarchart'.freeze].freeze + TkCommandNames = [ + 'canvas'.freeze, + '::Plotchart::createHorizontalBarchart'.freeze + ].freeze end ############################ class Timechart < TkCanvas include ChartMethod - TkCommandNames = ['::Plotchart::createTimechart'.freeze].freeze + TkCommandNames = [ + 'canvas'.freeze, + '::Plotchart::createTimechart'.freeze + ].freeze def initialize(*args) # args := ([parent,] time_begin, time_end, items [, keys]) @@ -612,8 +651,8 @@ module Tk::Tcllib::Plotchart end def _create_chart - p self.class::TkCommandNames[0] if $DEBUG - tk_call_without_enc(self.class::TkCommandNames[0], @path, + p self.class::TkCommandNames[1] if $DEBUG + tk_call_without_enc(self.class::TkCommandNames[1], @path, @time_begin, @time_end, @items) end private :_create_chart @@ -650,7 +689,7 @@ module Tk::Tcllib::Plotchart @parent = @chart_obj = chart @ppath = @chart_obj.path @path = @series = @id = Series_ID.join(TkCore::INTERP._ip_id_) - SeriesID_TBL[@id] = self + # SeriesID_TBL[@id] = self SeriesID_TBL[@ppath] = {} unless SeriesID_TBL[@ppath] SeriesID_TBL[@ppath][@id] = self Series_ID[1].succ! diff --git a/ext/tk/lib/tkextlib/tcllib/style.rb b/ext/tk/lib/tkextlib/tcllib/style.rb index dea2962b7f..17fc834ccb 100644 --- a/ext/tk/lib/tkextlib/tcllib/style.rb +++ b/ext/tk/lib/tkextlib/tcllib/style.rb @@ -9,10 +9,7 @@ require 'tk' require 'tkextlib/tcllib.rb' -# TkPackage.require('style', '0.1') -TkPackage.require('style') - -module Tk +module Tk::Tcllib module Style def self.package_version begin @@ -22,6 +19,29 @@ module Tk end end + def self.not_available + fail RuntimeError, "'tkextlib/tcllib/style' extension is not available on your current environment." + end + + def self.names + Tk::Tcllib::Style.not_available + end + + def self.use(style) + Tk::Tcllib::Style.not_available + end + end +end + +# TkPackage.require('style', '0.1') +TkPackage.require('style') + +module Tk::Tcllib + class << Style + undef not_available + end + + module Style def self.names tk_split_simplelist(tk_call('style::names')) end diff --git a/ext/tk/lib/tkextlib/tile.rb b/ext/tk/lib/tkextlib/tile.rb index 7633981559..91c01ca736 100644 --- a/ext/tk/lib/tkextlib/tile.rb +++ b/ext/tk/lib/tkextlib/tile.rb @@ -18,6 +18,8 @@ TkPackage.require('tile') # autoload module Tk module Tile + TkComm::TkExtlibAutoloadModule.unshift(self) + def self.package_version begin TkPackage.require('tile') diff --git a/ext/tk/lib/tkextlib/tktable.rb b/ext/tk/lib/tkextlib/tktable.rb new file mode 100644 index 0000000000..385eb13497 --- /dev/null +++ b/ext/tk/lib/tkextlib/tktable.rb @@ -0,0 +1,14 @@ +# +# TkTable support +# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) +# +require 'tk' + +# call setup script for general 'tkextlib' libraries +require 'tkextlib/setup.rb' + +# call setup script +require 'tkextlib/tktable/setup.rb' + +# load library +require 'tkextlib/tktable/tktable' diff --git a/ext/tk/lib/tkextlib/tktable/setup.rb b/ext/tk/lib/tkextlib/tktable/setup.rb new file mode 100644 index 0000000000..ce0f0bd4d4 --- /dev/null +++ b/ext/tk/lib/tkextlib/tktable/setup.rb @@ -0,0 +1,8 @@ +# +# setup.rb -- setup script before calling TkPackage.require() +# +# If you need some setup operations (for example, add a library path +# to the library search path) before using Tcl/Tk library packages +# wrapped by Ruby scripts in this directory, please write the setup +# operations in this file. +# diff --git a/ext/tk/lib/tkextlib/tktable/tktable.rb b/ext/tk/lib/tkextlib/tktable/tktable.rb new file mode 100644 index 0000000000..18751fca6c --- /dev/null +++ b/ext/tk/lib/tkextlib/tktable/tktable.rb @@ -0,0 +1,796 @@ +# +# tkextlib/tktable/tktable.rb +# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) +# + +require 'tk' +require 'tk/validation' + +# call setup script for general 'tkextlib' libraries +require 'tkextlib/setup.rb' + +# call setup script +require 'tkextlib/tktable/setup.rb' + +# TkPackage.require('Tktable', '2.8') +TkPackage.require('Tktable') + +module Tk + class TkTable < TkWindow + def self.package_version + begin + TkPackage.require('Tktable') + rescue + '' + end + end + + class CellTag < TkObject + end + + module ConfigMethod + end + end +end + +module Tk::TkTable::ConfigMethod + include TkItemConfigMethod + + def __item_cget_cmd(id) # id := [ type, tagOrId ] + [self.path, id[0], 'cget', id[1]] + end + private :__item_cget_cmd + + def __item_config_cmd(id) # id := [ type, tagOrId ] + [self.path, id[0], 'configure', id[1]] + end + private :__item_config_cmd + + def __item_pathname(id) + if id.kind_of?(Array) + id = tagid(id[1]) + end + [self.path, id].join(';') + end + private :__item_pathname + + def tag_cget(tagOrId, option) + itemcget(['tag', tagid(tagOrId)], option) + end + def tag_configure(tagOrId, slot, value=None) + itemconfigure(['tag', tagid(tagOrId)], slot, value) + end + def tag_configinfo(tagOrId, slot=nil) + itemconfigure(['tag', tagid(tagOrId)], slot) + end + def current_tag_configinfo(tagOrId, slot=nil) + itemconfigure(['tag', tagid(tagOrId)], slot) + end + + def window_cget(tagOrId, option) + itemcget(['window', tagid(tagOrId)], option) + end + def window_configure(tagOrId, slot, value=None) + itemconfigure(['window', tagid(tagOrId)], slot, value) + end + def window_configinfo(tagOrId, slot=nil) + itemconfigure(['window', tagid(tagOrId)], slot) + end + def current_window_configinfo(tagOrId, slot=nil) + itemconfigure(['window', tagid(tagOrId)], slot) + end + + private :itemcget, :itemconfigure + private :itemconfiginfo, :current_itemconfiginfo +end + +##################################################### + +class Tk::TkTable::CellTag + include TkTreatTagFont + + CellTagID_TBL = TkCore::INTERP.create_table + CellTag_ID = ['tktbl:celltag'.freeze, '00000'.taint].freeze + + TkCore::INTERP.init_ip_env{ CellTagID_TBL.clear } + + def self.id2obj(table, id) + tpath = table.path + return id unless CellTagID_TBL[tpath] + CellTagID_TBL[tpath][id]? CellTagID_TBL[tpath][id] : id + end + + def initialize(parent, keys=nil) + @parent = @t = parent + @tpath - parent.path + @path = @id = CellTag_ID.join(TkCore::INTERP._ip_id_) + CellTagID_TBL[@tpath] = {} unless CellTagID_TBL[@tpath] + CellTagID_TBL[@tpath][@id] = self + CellTag_ID[1].succ! + configure(keys) if keys + end + + def id + @id + end + + def destroy + tk_call(@tpath, 'tag', 'delete', @id) + CellTagID_TBL[@tpath].delete(@id) if CellTagID_TBL[@tpath] + self + end + alias delete destroy + + def exist? + @t.tag_exist?(@id) + end + def include?(idx) + @t.tag_include?(@id, idx) + end + + def add_cell(*args) + @t.tag_cell(@id, *args) + end + def add_col(*args) + @t.tag_col(@id, *args) + end + def add_row(*args) + @t.tag_row(@id, *args) + end + + def raise(target=None) + @t.tag_raise(@id, target) + end + def lower(target=None) + @t.tag_lower(@id, target) + end + + def cget(key) + @t.tag_cget(@id, key) + end + def configure(key, val=None) + @t.tag_configure(@id, key, val) + end + def configinfo(key=nil) + @t.tag_configinfo(@id, key) + end + def current_configinfo(key=nil) + @t.current_tag_configinfo(@id, key) + end +end + +class Tk::TkTable::NamedCellTag < Tk::TkTable::CellTag + def self.new(parent, name, keys=nil) + if CellTagID_TBL[parent.path] && CellTagID_TBL[parent.path][name] + cell = CellTagID_TBL[parent.path][name] + cell.configure(keys) if keys + return cell + else + super(parent, name, keys) + end + end + + def initialize(parent, name, keys=nil) + @parent = @t = parent + @tpath - parent.path + @path = @id = name + CellTagID_TBL[@tpath] = {} unless CellTagID_TBL[@tpath] + CellTagID_TBL[@tpath][@id] = self + configure(keys) if keys + end +end + +##################################################### + +class Tk::TkTable + TkCommandNames = ['table'.freeze].freeze + WidgetClassName = 'Table'.freeze + WidgetClassNames[WidgetClassName] = self + + include Scrollable + include Tk::TkTable::ConfigMethod + include Tk::ValidateConfigure + + def __destroy_hook__ + Tk::TkTable::CelTag::CellTagID_TBL.delete(@path) + end + + ################################# + + class BrowseCommand < TkValidateCommand + class ValidateArgs < TkUtil::CallbackSubst + KEY_TBL = [ + [ ?c, ?n, :column ], + [ ?C, ?s, :index ], + [ ?i, ?x, :cursor ], + [ ?r, ?n, :row ], + [ ?s, ?s, :last_index ], + [ ?S, ?s, :new_index ], + [ ?W, ?w, :widget ], + nil + ] + + PROC_TBL = [ + [ ?n, TkComm.method(:number) ], + [ ?x, TkComm.method(:num_or_str) ], + [ ?s, TkComm.method(:string) ], + [ ?w, TkComm.method(:window) ], + nil + ] + + _setup_subst_table(KEY_TBL, PROC_TBL); + + def self.ret_val(val) + val + end + end + + def self._config_keys + ['browsecommand', 'browsecmd'] + end + end + #-------------------------------- + class CellCommand < TkValidateCommand + class ValidateArgs < TkUtil::CallbackSubst + KEY_TBL = [ + [ ?c, ?n, :column ], + [ ?C, ?s, :index ], + [ ?i, ?m, :rw_mode ], + [ ?r, ?n, :row ], + [ ?s, ?v, :value ], + [ ?W, ?w, :widget ], + nil + ] + + PROC_TBL = [ + [ ?n, TkComm.method(:number) ], + [ ?s, TkComm.method(:string) ], + [ ?w, TkComm.method(:window) ], + [ ?m, proc{|val| (val == '0')? (:r) : (:w)} ], + [ ?v, proc{|val| TkComm.tk_tcl2ruby(val, true, false)} ], + nil + ] + + _setup_subst_table(KEY_TBL, PROC_TBL); + + def self.ret_val(val) + TkComm._get_eval_string(val) + end + end + + def self._config_keys + ['command'] + end + end + #-------------------------------- + class SelectionCommand < TkValidateCommand + class ValidateArgs < TkUtil::CallbackSubst + KEY_TBL = [ + [ ?c, ?n, :sel_columns ], + [ ?C, ?s, :sel_area ], + [ ?i, ?n, :total ], + [ ?r, ?n, :sel_rows ], + [ ?s, ?s, :value ], + [ ?W, ?w, :widget ], + nil + ] + + PROC_TBL = [ + [ ?n, TkComm.method(:number) ], + [ ?s, TkComm.method(:string) ], + [ ?w, TkComm.method(:window) ], + nil + ] + + _setup_subst_table(KEY_TBL, PROC_TBL); + + def self.ret_val(val) + val.to_s + end + end + + def self._config_keys + ['selectioncommand', 'selcmd'] + end + end + #-------------------------------- + class ValidateCommand < TkValidateCommand + class ValidateArgs < TkUtil::CallbackSubst + KEY_TBL = [ + [ ?c, ?n, :column ], + [ ?C, ?s, :index ], + [ ?i, ?x, :cursor ], + [ ?r, ?n, :row ], + [ ?s, ?v, :current_value ], + [ ?S, ?v, :new_value ], + [ ?W, ?w, :widget ], + nil + ] + + PROC_TBL = [ + [ ?n, TkComm.method(:number) ], + [ ?x, TkComm.method(:num_or_str) ], + [ ?s, TkComm.method(:string) ], + [ ?w, TkComm.method(:window) ], + [ ?v, proc{|val| TkComm.tk_tcl2ruby(val, true, false)} ], + nil + ] + + _setup_subst_table(KEY_TBL, PROC_TBL); + end + + def self._config_keys + ['vcmd', 'validatecommand'] + end + end + + ################################# + + def __validation_class_list + super << + BrowseCommand << CellCommand << SelectionCommand << ValidateCommand + end + + Tk::ValidateConfigure.__def_validcmd(binding, BrowseCommand) + Tk::ValidateConfigure.__def_validcmd(binding, CellCommand) + Tk::ValidateConfigure.__def_validcmd(binding, SelectionCommand) + Tk::ValidateConfigure.__def_validcmd(binding, ValidateCommand) + + ################################# + + def activate(idx) + tk_send('activate', tagid(idx)) + end + + def bbox(idx) + list(tk_send('bbox', tagid(idx))) + end + + def border_mark(x, y) + simplelist(tk_send('scan', 'mark', x, y)) + end + def border_mark_row(x, y) + tk_send('scan', 'mark', x, y, 'row') + end + def border_mark_col(x, y) + tk_send('scan', 'mark', x, y, 'col') + end + def border_dragto(x, y) + tk_send('scan', 'dragto', x, y) + end + + def clear_cache(first=None, last=None) + tk_send('clear', 'cache', tagid(first), tagid(last)) + self + end + def clear_sizes(first=None, last=None) + tk_send('clear', 'sizes', tagid(first), tagid(last)) + self + end + def clear_tags(first=None, last=None) + tk_send('clear', 'tags', tagid(first), tagid(last)) + self + end + def clear_all(first=None, last=None) + tk_send('clear', 'all', tagid(first), tagid(last)) + self + end + + def curselection + simplelist(tk_send('curselection')) + end + def curselection=(val) + tk_send('curselection', val) + val + end + + def curvalue + tk_tcl2ruby(tk_send('curvalue'), true, false) + end + def curvalue=(val) + tk_send('curvalue', val) + val + end + + def delete_active(idx1, idx2=None) + tk_send('delete', 'active', tagid(idx1), tagid(idx2)) + self + end + def delete_cols(*args) # ?switches_array?, index, ?count? + params = [] + if args[0].kind_of?(Array) + switches = args.shift + switches.each{|k| params << "-#{k}"} + end + params << '--' + params << tagid(args.shift) + params.concat(args) + tk_send('delete', 'cols', *params) + self + end + def delete_rows(*args) # ?switches_array?, index, ?count? + params = [] + if args[0].kind_of?(Array) + switches = args.shift + switches.each{|k| params << "-#{k}"} + end + params << '--' + params << tagid(args.shift) + params.concat(args) + tk_send('delete', 'rows', *params) + self + end + + def get(idx) + tk_tcl2ruby(tk_send('get', tagid(idx)), true, false) + end + def get_area(idx1, idx2) + simplelist(tk_send('get', tagid(idx1), tagid(idx2))).collect{|v| + tk_tcl2ruby(v, true, false) + } + end + + def height_list + list(tk_send('height')) + end + def height(row) + number(tk_send('height', row)) + end + def set_height(*pairs) + tk_send('height', *(pairs.flatten)) + self + end + + def hidden_list + simplelist(tk_send('hidden')) + end + def hidden?(idx, *args) + if args.empty? + if (ret = tk_send('hidden', tagid(idx))) == '' + false + else + ret + end + else + bool(tk_send('hidden', tagid(idx), *(args.collect{|i| tagid(i)}))) + end + end + + def icursor + number(tk_send('icursor')) + end + def icursor_set(idx) + number(tk_send('icursor', tagid(idx))) + end + + def index(idx) + tk_send('index', tagid(idx)) + end + def row_index(idx) + number(tk_send('index', tagid(idx), 'row')) + end + def col_index(idx) + number(tk_send('index', tagid(idx), 'col')) + end + + def insert_active(idx, val) + tk_send('insert', 'active', tagid(idx), val) + self + end + def insert_cols(*args) # ?switches_array?, index, ?count? + params = [] + if args[0].kind_of?(Array) + switches = args.shift + switches.each{|k| params << "-#{k}"} + end + params << '--' + params.concat(args) + params << tagid(args.shift) + tk_send('insert', 'cols', *params) + self + end + def insert_rows(*args) # ?switches_array?, index, ?count? + params = [] + if args[0].kind_of?(Array) + switches = args.shift + switches.each{|k| params << "-#{k}"} + end + params << '--' + params << tagid(args.shift) + params.concat(args) + tk_send('insert', 'rows', *params) + self + end + + # def postscript(*args) + # tk_send('postscript', *args) + # end + + def reread + tk_send('reread') + self + end + + def scan_mark(x, y) + tk_send('scan', 'mark', x, y) + self + end + def scan_dragto(x, y) + tk_send('scan', 'dragto', x, y) + self + end + + def see(idx) + tk_send('see', tagid(idx)) + self + end + + def selection_anchor(idx) + tk_send('selection', 'anchor', tagid(idx)) + self + end + def selection_clear(first, last=None) + tk_send('selection', 'clear', tagid(first), tagid(last)) + self + end + def selection_clear_all + selection_clear('all') + end + def selection_include?(idx) + bool(tk_send('selection', 'includes', tagid(idx))) + end + def selection_set(first, last=None) + tk_send('selection', 'set', tagid(first), tagid(last)) + self + end + + def set(*pairs) # idx, val, idx, val, ... + args = [] + 0.step(pairs.size-1, 2){|i| + args << tagid(pairs[i]) + args << pairs[i+1] + } + tk_send('set', *args) + self + end + def set_row(*pairs) # idx, val, idx, val, ... + args = [] + 0.step(pairs.size-1, 2){|i| + args << tagid(pairs[i]) + args << pairs[i+1] + } + tk_send('set', 'row', *args) + self + end + def set_col(*pairs) # idx, val, idx, val, ... + args = [] + 0.step(pairs.size-1, 2){|i| + args << tagid(pairs[i]) + args << pairs[i+1] + } + tk_send('set', 'col', *args) + self + end +=begin + def set(*pairs) # idx, val, idx, val, ... OR [idx, val], [idx, val], ... + if pairs[0].kind_of?(Array) + # [idx, val], [idx, val], ... + args = [] + pairs.each{|idx, val| args << tagid(idx) << val } + tk_send('set', *args) + else + # idx, val, idx, val, ... + args = [] + 0.step(pairs.size-1, 2){|i| + args << tagid(pairs[i]) + args << pairs[i+1] + } + tk_send('set', *args) + end + self + end + def set_row(*pairs) + if pairs[0].kind_of?(Array) + # [idx, val], [idx, val], ... + args = [] + pairs.each{|idx, val| args << tagid(idx) << val } + tk_send('set', 'row', *args) + else + # idx, val, idx, val, ... + args = [] + 0.step(pairs.size-1, 2){|i| + args << tagid(pairs[i]) + args << pairs[i+1] + } + tk_send('set', 'row', *args) + end + self + end + def set_col(*pairs) + if pairs[0].kind_of?(Array) + # [idx, val], [idx, val], ... + args = [] + pairs.each{|idx, val| args << idx << val } + tk_send('set', 'col', *args) + else + # idx, val, idx, val, ... + args = [] + 0.step(pairs.size-1, 2){|i| + args << tagid(pairs[i]) + args << pairs[i+1] + } + tk_send('set', 'col', *args) + end + self + end +=end + + def spans + simplelist(tk_send('spans')).collect{|inf| + lst = simplelist(inf) + idx = lst[0] + rows, cols = lst[1].split(',').map!{|n| Integer(n)} + [idx [rows, cols]] + } + end + alias span_list spans + def span(idx) + lst = simplelist(tk_send('spans', tagid(idx))) + idx = lst[0] + rows, cols = lst[1].split(',').map!{|n| Integer(n)} + [idx [rows, cols]] + end + def set_spans(*pairs) + # idx, val, idx, val, ... + args = [] + 0.step(pairs.size-1, 2){|i| + args << tagid(pairs[i]) + val = pairs[i+1] + if val.kind_of?(Array) + args << val.join(',') + else + args << val + end + } + tk_send('spans', *args) + self + end +=begin + def set_spans(*pairs) + if pairs[0].kind_of?(Array) + # [idx, val], [idx, val], ... + args = [] + pairs.each{|idx, val| + args << tagid(idx) + if val.kind_of?(Array) + args << val.join(',') + else + args << val + end + } + tk_send('spans', *args) + else + # idx, val, idx, val, ... + args = [] + 0.step(pairs.size-1, 2){|i| + args << tagid(pairs[i]) + val = pairs[i+1] + if val.kind_of?(Array) + args << val.join(',') + else + args << val + end + } + tk_send('spans', *args) + end + self + end +=end + + def tagid(tag) + if tag.kind_of?(Tk::TkTable::CellTag) + tag.id + elsif tag.kind_of?(Array) + if tag[0].kind_of?(Integer) && tag[1].kind_of?(Integer) + # [row, col] + tag.join(',') + else + tag + end + else + tag + end + end + + def tagid2obj(tagid) + if Tk::TkTable::CellTag::CellTagID_TBL.key?(@path) + if Tk::TkTable::CellTag::CellTagID_TBL[@path].key?(tagid) + Tk::TkTable::CellTag::CellTagID_TBL[@path][tagid] + else + tagid + end + else + tagid + end + end + + def tag_cell(tag, *cells) + tk_send('tag', 'cell', tagid(tag), *(cells.collect{|idx| tagid(idx)})) + self + end + def tag_reset(*cells) + tk_send('tag', 'cell', '', *(cells.collect{|idx| tagid(idx)})) + self + end + def tag_col(tag, *cols) + tk_send('tag', 'col', tagid(tag), *cols) + self + end + def tag_col_reset(*cols) + tk_send('tag', 'col', '', *cols) + self + end + def tag_delete(tag) + tk_send('tag', 'delete', tagid(tag)) + if Tk::TkTable::CellTag::CellTagID_TBL[@path] + if tag.kind_of? Tk::TkTable::CellTag + Tk::TkTable::CellTag::CellTagID_TBL[@path].delete(tag.id) + else + Tk::TkTable::CellTag::CellTagID_TBL[@path].delete(tag) + end + end + self + end + def tag_exist?(tag) + bool(tk_send('tag', 'exists', tagid(tag))) + end + def tag_include?(tag, idx) + bool(tk_send('tag', 'includes', tagid(tag), tagid(idx))) + end + def tag_lower(tag, target=None) + tk_send('tag', 'lower', tagid(tag), tagid(target)) + self + end + def tag_names(pat=None) + simplelist(tk_send('tag', 'names', pat)).collect{|tag| tagid2obj(tag)} + end + def tag_raise(tag, target=None) + tk_send('tag', 'raise', tagid(tag), tagid(target)) + self + end + def tag_row(tag, *rows) + tk_send('tag', 'row', tagid(tag), *rows) + self + end + def tag_row_reset(*rows) + tk_send('tag', 'row', '', *rows) + self + end + + def validate(idx) + bool(tk_send('validate', tagid(idx))) + end + + def width_list + list(tk_send('width')) + end + def width(row) + number(tk_send('width', row)) + end + def set_width(*pairs) + tk_send('width', *(pairs.flatten)) + self + end + + def window_delete(*args) + tk_send('window', 'delete', *(args.collect{|idx| tagid(idx)})) + self + end + def window_move(from_idx, to_idx) + tk_send('window', 'move', tagid(from_idx), tagid(to_idx)) + self + end + def window_names(pat=None) + simplelist(tk_send('window', 'names', pat)) + end +end diff --git a/ext/tk/lib/tkextlib/vu.rb b/ext/tk/lib/tkextlib/vu.rb index 4d61243340..d3809f05b7 100644 --- a/ext/tk/lib/tkextlib/vu.rb +++ b/ext/tk/lib/tkextlib/vu.rb @@ -18,6 +18,8 @@ TkPackage.require('vu') # autoload module Tk module Vu + TkComm::TkExtlibAutoloadModule.unshift(self) + def self.package_version begin TkPackage.require('vu') diff --git a/ext/tk/lib/tkextlib/vu/pie.rb b/ext/tk/lib/tkextlib/vu/pie.rb index b4506e10b5..dc676ad765 100644 --- a/ext/tk/lib/tkextlib/vu/pie.rb +++ b/ext/tk/lib/tkextlib/vu/pie.rb @@ -39,6 +39,10 @@ class Tk::Vu::Pie < TkWindow WidgetClassName = 'Pie'.freeze WidgetClassNames[WidgetClassName] = self + def __destroy_hook__ + Tk::Vu::PieSlice::SliceID_TBL.delete(@path) + end + ############################### include Tk::Vu::PieSliceConfigMethod @@ -112,7 +116,7 @@ end class Tk::Vu::PieSlice SliceID_TBL = TkCore::INTERP.create_table - Pie_Slice_ID = ['vu_pie'.freeze, '00000'.taint].freeze + Pie_Slice_ID = ['vu:pie'.freeze, '00000'.taint].freeze TkCore::INTERP.init_ip_env{ SliceID_TBL.clear } def self.id2obj(pie, id) diff --git a/ext/tk/sample/tkextlib/ICONS/LICENSE.orig b/ext/tk/sample/tkextlib/ICONS/LICENSE.orig index 1a03ced2d8..71e359559a 100644 --- a/ext/tk/sample/tkextlib/ICONS/LICENSE.orig +++ b/ext/tk/sample/tkextlib/ICONS/LICENSE.orig @@ -2,7 +2,7 @@ ######################################################################### ### The following text is the original file of the Tcl/Tk extension. ### ### Icon data files ( those are 'tkIcons', 'tkIcons-sample.kde', and ### - ### 'tkIcons.kde' ) are refered from the source archive of ICONS ### + ### 'tkIcons.kde' ) are quoted from the source archive of ICONS ### ### extension. As the following document describes, those icon images ### ### are not applied the license. ### ######################################################################### diff --git a/ext/tk/sample/tkextlib/ICONS/viewIcons.rb b/ext/tk/sample/tkextlib/ICONS/viewIcons.rb index 84b3d0f63c..fa8741f415 100644 --- a/ext/tk/sample/tkextlib/ICONS/viewIcons.rb +++ b/ext/tk/sample/tkextlib/ICONS/viewIcons.rb @@ -228,7 +228,7 @@ class ViewIcons name = @icon_name[item] data_width = 60 - cmd = "#{name} = TkPhotoImage.new(:date=><<'EOD')\n" + cmd = "#{name} = TkPhotoImage.new(:data=><<'EOD')\n" icon_data = Tk::ICONS.query(name, :file=>@library.value, :items=>'d')[0][0] diff --git a/ext/tk/sample/tkextlib/bwidget/LICENSE.orig b/ext/tk/sample/tkextlib/bwidget/LICENSE.orig index 4238e43877..0c4c16fe47 100644 --- a/ext/tk/sample/tkextlib/bwidget/LICENSE.orig +++ b/ext/tk/sample/tkextlib/bwidget/LICENSE.orig @@ -5,7 +5,7 @@ ### Original Tcl source files are not include in this directry, ### ### because of all of them are rewrited to Ruby files. ### ### However, the bitmap data files ('bwidgtet.xbm' and 'x1.xbm') ### - ### included in this directory are referd from BWidget source ### + ### included in this directory are quoted from BWidget source ### ### archive. So, those bitmaps are under the following license. ### ###################################################################### diff --git a/ext/tk/sample/tkextlib/bwidget/basic.rb b/ext/tk/sample/tkextlib/bwidget/basic.rb index 09a29b99a5..f622c142e4 100644 --- a/ext/tk/sample/tkextlib/bwidget/basic.rb +++ b/ext/tk/sample/tkextlib/bwidget/basic.rb @@ -1,6 +1,9 @@ # # basic demo --- called from demo.rb # +unless Object.const_defined?('DemoVar') + fail RuntimeError, "This is NOT a stand alone script. This script is called from 'demo.rb'. " +end module DemoBasic @@var = TkVariable.new_hash diff --git a/ext/tk/sample/tkextlib/bwidget/dnd.rb b/ext/tk/sample/tkextlib/bwidget/dnd.rb index 9938b4b099..fd6cc40dda 100644 --- a/ext/tk/sample/tkextlib/bwidget/dnd.rb +++ b/ext/tk/sample/tkextlib/bwidget/dnd.rb @@ -1,6 +1,9 @@ # # dnd demo --- called from demo.rb # +unless Object.const_defined?('DemoVar') + fail RuntimeError, "This is NOT a stand alone script. This script is called from 'demo.rb'. " +end module DemoDnD def self.create(nb) diff --git a/ext/tk/sample/tkextlib/bwidget/manager.rb b/ext/tk/sample/tkextlib/bwidget/manager.rb index 2935a26513..65bbe0f9e6 100644 --- a/ext/tk/sample/tkextlib/bwidget/manager.rb +++ b/ext/tk/sample/tkextlib/bwidget/manager.rb @@ -1,6 +1,9 @@ # # manager demo --- called from demo.rb # +unless Object.const_defined?('DemoVar') + fail RuntimeError, "This is NOT a stand alone script. This script is called from 'demo.rb'. " +end module DemoManager @@progress = TkVariable.new(false) diff --git a/ext/tk/sample/tkextlib/bwidget/select.rb b/ext/tk/sample/tkextlib/bwidget/select.rb index e25ab5c354..a04d8da482 100644 --- a/ext/tk/sample/tkextlib/bwidget/select.rb +++ b/ext/tk/sample/tkextlib/bwidget/select.rb @@ -1,6 +1,9 @@ # # select demo --- called from demo.rb # +unless Object.const_defined?('DemoVar') + fail RuntimeError, "This is NOT a stand alone script. This script is called from 'demo.rb'. " +end module DemoSelect @@var = TkVariable.new_hash diff --git a/ext/tk/sample/tkextlib/bwidget/tmpldlg.rb b/ext/tk/sample/tkextlib/bwidget/tmpldlg.rb index 7589249516..1ed84e21aa 100644 --- a/ext/tk/sample/tkextlib/bwidget/tmpldlg.rb +++ b/ext/tk/sample/tkextlib/bwidget/tmpldlg.rb @@ -1,6 +1,9 @@ # # templdlg demo --- called from demo.rb # +unless Object.const_defined?('DemoVar') + fail RuntimeError, "This is NOT a stand alone script. This script is called from 'demo.rb'. " +end module DemoDialog @@tmpl = TkVariable.new_hash diff --git a/ext/tk/sample/tkextlib/bwidget/tree.rb b/ext/tk/sample/tkextlib/bwidget/tree.rb index 0d9fc38050..9bfa4f3ccf 100644 --- a/ext/tk/sample/tkextlib/bwidget/tree.rb +++ b/ext/tk/sample/tkextlib/bwidget/tree.rb @@ -1,6 +1,9 @@ # # templdlg demo --- called from demo.rb # +unless Object.const_defined?('DemoVar') + fail RuntimeError, "This is NOT a stand alone script. This script is called from 'demo.rb'. " +end module DemoTree @@count = 0 diff --git a/ext/tk/sample/tkextlib/iwidgets/catalog_demo/LICENSE.orig b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/LICENSE.orig new file mode 100644 index 0000000000..22f787609d --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/LICENSE.orig @@ -0,0 +1,42 @@ + + ####################################################################### + ### The following text is the original 'license.terms' of iwidges ### + ### extension. ### + ### Original Tcl source files are not include in this directry, ### + ### because of all of them are rewrited to Ruby files. ### + ### However, the image data files in the 'images' directory are ### + ### quoted from iwidgets source archive. ### + ####################################################################### + + +This software is copyrighted by DSC Technologies and private individual +contributors. The copyright holder is specifically listed in the header +of each file. The following terms apply to all files associated with the +software unless explicitly disclaimed in individual files by private +contributors. + +Copyright 1997 DSC Technologies Corporation + +Permission to use, copy, modify, distribute and license this software and +its documentation for any purpose, and without fee or written agreement +with DSC, is hereby granted, provided that the above copyright notice +appears in all copies and that both the copyright notice and warranty +disclaimer below appear in supporting documentation, and that the names of +DSC Technologies Corporation or DSC Communications Corporation not be used +in advertising or publicity pertaining to the software without specific, +written prior permission. + +DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-INFRINGEMENT. +THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND +DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, +ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL DSC BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +RESTRICTED RIGHTS: Use, duplication or disclosure by the government +is subject to the restrictions as set forth in subparagraph (c) (1) (ii) +of the Rights in Technical Data and Computer Software Clause as DFARS +252.227-7013 and FAR 52.227-19. diff --git a/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/box.xbm b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/box.xbm new file mode 100644 index 0000000000..7498e15de2 --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/box.xbm @@ -0,0 +1,14 @@ +#define Tool_32_box_width 32 +#define Tool_32_box_height 32 +static unsigned char Tool_32_box_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x0f, 0x20, 0x00, 0x00, 0x08, + 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, + 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, + 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, + 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, + 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, + 0xe0, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; diff --git a/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/close.gif b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/close.gif new file mode 100644 index 0000000000..f91b9e9d1e Binary files /dev/null and b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/close.gif differ diff --git a/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/copy.gif b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/copy.gif new file mode 100644 index 0000000000..7319f1dcb0 Binary files /dev/null and b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/copy.gif differ diff --git a/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/cut.gif b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/cut.gif new file mode 100644 index 0000000000..4258b17591 Binary files /dev/null and b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/cut.gif differ diff --git a/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/exit.gif b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/exit.gif new file mode 100644 index 0000000000..e462be033f Binary files /dev/null and b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/exit.gif differ diff --git a/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/find.gif b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/find.gif new file mode 100644 index 0000000000..dddcb8044b Binary files /dev/null and b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/find.gif differ diff --git a/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/help.gif b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/help.gif new file mode 100644 index 0000000000..bc8f18c00d Binary files /dev/null and b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/help.gif differ diff --git a/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/line.xbm b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/line.xbm new file mode 100644 index 0000000000..4622ae978b --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/line.xbm @@ -0,0 +1,14 @@ +#define lineOp_width 32 +#define lineOp_height 32 +static unsigned char lineOp_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, + 0x80, 0x07, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, + 0x00, 0x3c, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0xe0, 0x01, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x80, 0x07, 0x00, + 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xe0, 0x01, + 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x0f, + 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/mag.gif b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/mag.gif new file mode 100644 index 0000000000..4a5be66e76 Binary files /dev/null and b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/mag.gif differ diff --git a/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/new.gif b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/new.gif new file mode 100644 index 0000000000..9c68ad35f5 Binary files /dev/null and b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/new.gif differ diff --git a/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/open.gif b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/open.gif new file mode 100644 index 0000000000..bed862c8c4 Binary files /dev/null and b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/open.gif differ diff --git a/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/oval.xbm b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/oval.xbm new file mode 100644 index 0000000000..856bd43785 --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/oval.xbm @@ -0,0 +1,14 @@ +#define ovalOp_width 32 +#define ovalOp_height 32 +static unsigned char ovalOp_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x0f, 0x00, + 0x00, 0x1c, 0x70, 0x00, 0x00, 0x03, 0x80, 0x01, 0x80, 0x00, 0x00, 0x02, + 0x40, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, + 0x10, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x20, + 0x08, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x20, 0x10, 0x00, 0x00, 0x10, + 0x10, 0x00, 0x00, 0x10, 0x20, 0x00, 0x00, 0x08, 0x40, 0x00, 0x00, 0x04, + 0x80, 0x00, 0x00, 0x02, 0x00, 0x03, 0x80, 0x01, 0x00, 0x1c, 0x70, 0x00, + 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/paste.gif b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/paste.gif new file mode 100644 index 0000000000..9974f23bf5 Binary files /dev/null and b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/paste.gif differ diff --git a/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/points.xbm b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/points.xbm new file mode 100644 index 0000000000..c50aa4c5f3 --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/points.xbm @@ -0,0 +1,14 @@ +#define dotPencilOp_width 32 +#define dotPencilOp_height 32 +static unsigned char dotPencilOp_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x12, 0x00, + 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x80, 0x04, 0x00, + 0x00, 0x80, 0x04, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, + 0x00, 0x20, 0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x90, 0x00, 0x00, + 0x00, 0x90, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, + 0x00, 0x24, 0x00, 0x18, 0x00, 0x24, 0x00, 0x18, 0x00, 0x12, 0x00, 0x00, + 0x00, 0x12, 0x00, 0x30, 0x00, 0x0e, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, + 0x00, 0x06, 0x0c, 0x30, 0x00, 0x00, 0x0c, 0x30, 0x00, 0x30, 0xa0, 0x01, + 0x00, 0x60, 0xb0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; diff --git a/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/poly.gif b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/poly.gif new file mode 100644 index 0000000000..2b595bb9b7 Binary files /dev/null and b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/poly.gif differ diff --git a/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/print.gif b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/print.gif new file mode 100644 index 0000000000..d321f17457 Binary files /dev/null and b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/print.gif differ diff --git a/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/ruler.gif b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/ruler.gif new file mode 100644 index 0000000000..00d26febf6 Binary files /dev/null and b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/ruler.gif differ diff --git a/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/save.gif b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/save.gif new file mode 100644 index 0000000000..d1ceb1a5c4 Binary files /dev/null and b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/save.gif differ diff --git a/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/select.gif b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/select.gif new file mode 100644 index 0000000000..f885c9ca5f Binary files /dev/null and b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/select.gif differ diff --git a/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/text.xbm b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/text.xbm new file mode 100644 index 0000000000..ffb0686303 --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/text.xbm @@ -0,0 +1,14 @@ +#define font_edit_width 32 +#define font_edit_height 32 +static unsigned char font_edit_bits[] = { + 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x80, 0x7b, + 0x00, 0x00, 0x80, 0x7e, 0x00, 0x00, 0xc0, 0xfd, 0x00, 0x00, 0x60, 0xfb, + 0x00, 0x00, 0xb0, 0xf7, 0x00, 0x00, 0xd0, 0xef, 0x00, 0x00, 0xf8, 0xdf, + 0x00, 0x00, 0xd4, 0x7f, 0x00, 0x00, 0xaa, 0x1f, 0x00, 0x00, 0x15, 0x0f, + 0x00, 0x80, 0x82, 0x06, 0x03, 0x40, 0x01, 0x01, 0x07, 0xa0, 0x80, 0x00, + 0x0f, 0x10, 0x40, 0x00, 0x1f, 0x08, 0x20, 0x00, 0x3b, 0xe4, 0x1f, 0x00, + 0x73, 0x1a, 0x00, 0x00, 0xe3, 0x07, 0x00, 0x00, 0xc3, 0x01, 0x00, 0x00, + 0xe3, 0x03, 0x00, 0x00, 0x7b, 0x07, 0x00, 0x00, 0x1f, 0x06, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/feedback.rb b/ext/tk/sample/tkextlib/iwidgets/sample/feedback.rb index c39ebd9d22..7b87a029ed 100644 --- a/ext/tk/sample/tkextlib/iwidgets/sample/feedback.rb +++ b/ext/tk/sample/tkextlib/iwidgets/sample/feedback.rb @@ -4,7 +4,7 @@ require 'tkextlib/iwidgets' Tk::Iwidgets::Feedback.new(:labeltext=>'Status', :steps=>20){|fb| pack(:padx=>10, :pady=>10, :fill=>:both, :expand=>true) - TkTimer.new(500, 20, proc{fb.step}).start(5000) + TkTimer.new(500, 20, proc{fb.step}).start(2500) } Tk.mainloop diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/finddialog.rb b/ext/tk/sample/tkextlib/iwidgets/sample/finddialog.rb new file mode 100644 index 0000000000..110efb9b96 --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/finddialog.rb @@ -0,0 +1,15 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +mainloop = Thread.new{Tk.mainloop} + +st = Tk::Iwidgets::Scrolledtext.new.pack +st.insert('end', "Now is the time for all good men\n") +st.insert('end', "to come to the aid of their country") + +fd = Tk::Iwidgets::Finddialog.new(:textwidget=>st) +fd.center(st) +fd.activate + +mainloop.join diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/labeledframe.rb b/ext/tk/sample/tkextlib/iwidgets/sample/labeledframe.rb new file mode 100644 index 0000000000..4e2e21e727 --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/labeledframe.rb @@ -0,0 +1,14 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +lf = Tk::Iwidgets::Labeledframe.new(:labeltext=>'Entry Frame', :labelpos=>:n) +lf.pack(:fill=>:both, :expand=>true, :padx=>10, :pady=>10) + +cs = lf.child_site + +Tk::Iwidgets::Entryfield.new(cs, :labeltext=>'Name:').pack(:side=>:top, :fill=>:x) +Tk::Iwidgets::Spinint.new(cs, :labeltext=>'Number:').pack(:side=>:top, :fill=>:x) +Tk::Iwidgets::Pushbutton.new(cs, :text=>'Details:').pack(:side=>:top, :fill=>:x) + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/mainwindow.rb b/ext/tk/sample/tkextlib/iwidgets/sample/mainwindow.rb new file mode 100644 index 0000000000..85b28b45e7 --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/mainwindow.rb @@ -0,0 +1,64 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +mw = Tk::Iwidgets::Mainwindow.new + +mw.menubar.add(:menubutton, 'file', :text=>'File', :underline=>0, + :padx=>8, :pady=>2, :menu=>[ + [:options, {:tearoff=>false}], + + [:command, 'new', { + :label=>'New', :underline=>0, + :helpstr=>'Create a new file' + } + ], + + [:command, 'open', { + :label=>'Open ...', :underline=>0, + :helpstr=>'Open an existing file' + } + ], + + [:command, 'save', { + :label=>'Save', :underline=>0, + :helpstr=>'Save the current file' + } + ], + + [:command, 'saveas', { + :label=>'Save As', :underline=>5, + :helpstr=>'Save the file as a different name' + } + ], + + [:command, 'print', { + :label=>'Print', :underline=>0, + :helpstr=>'Print the file' + } + ], + + [:separator, 'sep1'], + + [:command, 'close', { + :label=>'Close', :underline=>0, + :helpstr=>'Close the file' + } + ], + + [:separator, 'sep2'], + + [:command, 'exit', { + :label=>'Exit', :underline=>1, + :helpstr=>'Exit this application' + } + ], + + nil + ]) + +Tk::Iwidgets::Scrolledtext.new(mw.child_site).pack(:fill=>:both, :expand=>true) + +mw.activate + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/menubar.rb b/ext/tk/sample/tkextlib/iwidgets/sample/menubar.rb new file mode 100644 index 0000000000..c61071470f --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/menubar.rb @@ -0,0 +1,124 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +helpvar = TkVariable.new +viewmode = TkVariable.new + +menu_spec = [ + [:menubutton, 'file', { + :text=>'File', :menu=>[ + [:options, {:tearoff=>false}], + + [:command, 'new', { + :label=>'New', :helpstr=>'Open new document', + :command=>proc{puts 'NEW'} + } + ], + + [:command, 'close', { + :label=>'Close', :helpstr=>'Close current document', + :command=>proc{puts 'CLOSE'} + } + ], + + [:separator, 'sep1'], + + [:command, 'exit', { + :label=>'Exit', :helpstr=>'Exit application', + :command=>proc{exit} + } + ] + ] + } + ], + + [:menubutton, 'edit', { + :text=>'Edit', :menu=>[ + [:options, {:tearoff=>false}], + + [:command, 'undo', { + :label=>'Undo', :underline=>0, + :helpstr=>'Undo last command', + :command=>proc{puts 'UNDO'} + } + ], + + [:separator, 'sep2'], + + [:command, 'cut', { + :label=>'Cut', :underline=>1, + :helpstr=>'Cut selection to clipboard', + :command=>proc{puts 'CUT'} + } + ], + + [:command, 'copy', { + :label=>'Copy', :underline=>1, + :helpstr=>'Copy selection to clipboard', + :command=>proc{puts 'COPY'} + } + ], + + [:command, 'paste', { + :label=>'Paste', :underline=>0, + :helpstr=>'Paste clipboard contents', + :command=>proc{puts 'PASTE'} + } + ] + ] + } + ], + + [:menubutton, 'options', { + :text=>'Options', :menu=>[ + [:options, {:tearoff=>false, :selectcolor=>'blue'}], + + [:radiobutton, 'byName', { + :variable=>viewmode, :value=>'NAME', + :label=>'by Name', :helpstr=>'View files by name order', + :command=>proc{puts 'NAME'} + } + ], + + [:radiobutton, 'byDate', { + :variable=>viewmode, :value=>'DATE', + :label=>'by Date', :helpstr=>'View files by date order', + :command=>proc{puts 'DATE'} + } + ], + + [:cascade, 'prefs', { + :label=>'Preferences', :menu=>[ + [:command, 'colors', { + :label=>'Colors...', :helpstr=>'Change text colors', + :command=>proc{puts 'COLORS'} + } + ], + + [:command, 'fonts', { + :label=>'Fonts...', :helpstr=>'Change text font', + :command=>proc{puts 'COLORS'} + } + ] + ] + } + ] + ] + } + ] +] + +#mb = Tk::Iwidgets::Menubar.new(:helpvariable=>helpvar, +# :menubuttons=>menu_spec) +mb = Tk::Iwidgets::Menubar.new(:helpvariable=>helpvar) +mb.configure(:menubuttons=>menu_spec) + +fr = TkFrame.new(:width=>300, :height=>300) +ef = TkEntry.new(:textvariable=>helpvar) + +mb.pack(:anchor=>:nw, :fill=>:x, :expand=>true) +fr.pack(:fill=>:both, :expand=>true) +ef.pack(:anchor=>:sw, :fill=>:x, :expand=>true) + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/menubar2.rb b/ext/tk/sample/tkextlib/iwidgets/sample/menubar2.rb new file mode 100644 index 0000000000..eec4928afb --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/menubar2.rb @@ -0,0 +1,44 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +helpvar = TkVariable.new +viewmode = TkVariable.new + +mb = Tk::Iwidgets::Menubar.new +mb.menubuttons = [ + [:menubutton, 'file', { + :text=>'File', :menu=>[ + [:command, 'new', {:label=>'New'}], + [:command, 'close', {:label=>'Close'}], + [:separator, 'sep1'], + [:command, 'quit', {:label=>'Quit'}] + ] + } + ], + [:menubutton, 'edit', {:text=>'Edit'}] +] + +mb.add(:command, '.edit.undo', :label=>'Undo', :underline=>0) +mb.add(:separator, '.edit.sep2') +mb.add(:command, '.edit.cut', :label=>'Cut', :underline=>1) +mb.add(:command, '.edit.copy', :label=>'Copy', :underline=>1) +mb.add(:command, '.edit.paste', :label=>'Paste', :underline=>0) + +mb.add(:menubutton, '.options', :text=>'Options', :menu=>[ + [:radiobutton, 'byName', { + :variable=>viewmode, :value=>'NAME', :label=>'by Name'} + ], + [:radiobutton, 'byDate', { + :variable=>viewmode, :value=>'DATE', :label=>'by Date'} + ] + ]) + +mb.add(:cascade, '.options.prefs', :label=>'Preferences', :menu=>[ + [:command, 'colors', {:label=>'Colors...'}], + [:command, 'fonts', {:label=>'Fonts...'}] + ]) + +mb.pack(:side=>:left, :anchor=>:nw, :fill=>:x, :expand=>true) + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/notebook.rb b/ext/tk/sample/tkextlib/iwidgets/sample/notebook.rb new file mode 100644 index 0000000000..77f1c1dc63 --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/notebook.rb @@ -0,0 +1,30 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +# Create the tabnotebook widget and pack it. +nb = Tk::Iwidgets::Notebook.new(:width=>100, :height=>100) +nb.pack(:anchor=>:nw, :fill=>:both, :expand=>true, + :side=>:left, :padx=>10, :pady=>10) + +# Add two pages to the tabnotebook, +# labelled "Page One" and "Page Two" +nb.add(:label=>'Page One') +nb.add(:label=>'Page Two') + +# Get the child site frames of these two pages. +page1CS = nb.child_site(0) +page2CS = nb.child_site('Page Two') + +# Create buttons on each page of the tabnotebook. +TkButton.new(page1CS, :text=>'Button One').pack +TkButton.new(page2CS, :text=>'Button Two').pack + +# Select the first page of the tabnotebook. +nb.select(0) + +# Create the scrollbar and associate teh scrollbar +# and the notebook together, then pack the scrollbar +nb.scrollbar(TkScrollbar.new).pack(:fill=>:y, :expand=>true, :pady=>10) + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/notebook2.rb b/ext/tk/sample/tkextlib/iwidgets/sample/notebook2.rb new file mode 100644 index 0000000000..e14e1207a5 --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/notebook2.rb @@ -0,0 +1,30 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +# Create the tabnotebook widget and pack it. +nb = Tk::Iwidgets::Notebook.new(:width=>100, :height=>100) +nb.pack(:anchor=>:nw, :fill=>:both, :expand=>true, + :side=>:top, :padx=>10, :pady=>0) + +# Add two pages to the tabnotebook, +# labelled "Page One" and "Page Two" +nb.add(:label=>'Page One') +nb.add(:label=>'Page Two') + +# Get the child site frames of these two pages. +page1CS = nb.child_site(0) +page2CS = nb.child_site('Page Two') + +# Create buttons on each page of the tabnotebook. +TkButton.new(page1CS, :text=>'Button One').pack +TkButton.new(page2CS, :text=>'Button Two').pack + +# Select the first page of the tabnotebook. +nb.select(0) + +# Create the scrollbar and associate teh scrollbar +# and the notebook together, then pack the scrollbar +nb.xscrollbar(TkScrollbar.new).pack(:fill=>:x, :expand=>true, :padx=>10) + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/optionmenu.rb b/ext/tk/sample/tkextlib/iwidgets/sample/optionmenu.rb new file mode 100644 index 0000000000..bdeafb691e --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/optionmenu.rb @@ -0,0 +1,14 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +om = Tk::Iwidgets::Optionmenu.new(:labelmargin=>5, :labelpos=>:w, + :labeltext=>"Operating System :") + +om.insert('end', 'Unix', 'VMS', 'Linux', 'OS/2', 'Windows NT', 'DOS') +om.sort_ascending +om.select('Linux') + +om.pack(:padx=>10, :pady=>10) + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/panedwindow.rb b/ext/tk/sample/tkextlib/iwidgets/sample/panedwindow.rb new file mode 100644 index 0000000000..902b2c4bcb --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/panedwindow.rb @@ -0,0 +1,22 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +pw = Tk::Iwidgets::Panedwindow.new(:width=>300, :height=>300) + +pw.add('top') +pw.add('middle', :margin=>10) +pw.add('bottom', :margin=>10, :minimum=>10) + +pw.pack(:fill=>:both, :expand=>true) + +pw.child_site_list.each{|pane| + TkButton.new(pane, :text=>pane.path, :relief=>:raised, + :borderwidth=>2).pack(:fill=>:both, :expand=>true) +} + +pw.fraction(50,30,20) +pw.paneconfigure(0, :minimum=>20) +pw.paneconfigure('bottom', :margin=>15) + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/panedwindow2.rb b/ext/tk/sample/tkextlib/iwidgets/sample/panedwindow2.rb new file mode 100644 index 0000000000..8928393a8b --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/panedwindow2.rb @@ -0,0 +1,22 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +pw = Tk::Iwidgets::Panedwindow.new(:width=>300, :height=>300) + +top = pw.add +middle = pw.add(:margin=>10) +bottom = pw.add(:margin=>10, :minimum=>10) + +pw.pack(:fill=>:both, :expand=>true) + +pw.child_site_list.each{|pane| + TkButton.new(pane, :text=>pane.path, :relief=>:raised, + :borderwidth=>2).pack(:fill=>:both, :expand=>true) +} + +pw.fraction(50,30,20) +pw.paneconfigure(0, :minimum=>20) # 0 == pw.index(top) +pw.paneconfigure(bottom, :margin=>15) + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/promptdialog.rb b/ext/tk/sample/tkextlib/iwidgets/sample/promptdialog.rb new file mode 100644 index 0000000000..7dbecc6dc0 --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/promptdialog.rb @@ -0,0 +1,17 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +mainloop = Thread.new{Tk.mainloop} + +TkOption.add('*textBackground', 'white') + +pd = Tk::Iwidgets::Promptdialog.new(:modality=>:global, :title=>'Password', + :labeltext=>'Password:', :show=>'*') +pd.hide('Apply') + +if TkComm.bool(pd.activate) + puts "Password entered: #{pd.get}" +else + puts "Password prompt cancelled" +end diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/pushbutton.rb b/ext/tk/sample/tkextlib/iwidgets/sample/pushbutton.rb new file mode 100644 index 0000000000..b1f4d7d118 --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/pushbutton.rb @@ -0,0 +1,9 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +Tk::Iwidgets::Pushbutton.new(:text=>'Hello', + :command=>proc{puts 'Hello World'}, + :defaultring=>true).pack(:padx=>10, :pady=>10) + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/scrolledcanvas.rb b/ext/tk/sample/tkextlib/iwidgets/sample/scrolledcanvas.rb new file mode 100644 index 0000000000..92c94b96bb --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/scrolledcanvas.rb @@ -0,0 +1,13 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +sc = Tk::Iwidgets::Scrolledcanvas.new + +sc.create(TkcRectangle, 100, 100, 400, 400, :fill=>'red') +TkcRectangle.new(sc, 300, 300, 600, 600, :fill=>'green') +TkcRectangle.new(sc, [[200, 200], [500, 500]], :fill=>'blue') + +sc.pack(:expand=>true, :fill=>:both, :padx=>10, :pady=>10) + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/scrolledframe.rb b/ext/tk/sample/tkextlib/iwidgets/sample/scrolledframe.rb new file mode 100644 index 0000000000..c12b664482 --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/scrolledframe.rb @@ -0,0 +1,18 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +sf = Tk::Iwidgets::Scrolledframe.new(:width=>150, :height=>180, + :labeltext=>'scrolledframe') +cs = sf.child_site + +TkButton.new(cs, :text=>'Hello').pack(:pady=>10) +TkButton.new(cs, :text=>'World').pack(:pady=>10) +TkButton.new(cs, :text=>'This is a test').pack(:pady=>10) +TkButton.new(cs, :text=>'This is a really big button').pack(:pady=>10) +TkButton.new(cs, :text=>'This is another really big button').pack(:pady=>10) +TkButton.new(cs, :text=>'This is the last really big button').pack(:pady=>10) + +sf.pack(:expand=>true, :fill=>:both, :padx=>10, :pady=>10) + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/scrolledhtml.rb b/ext/tk/sample/tkextlib/iwidgets/sample/scrolledhtml.rb new file mode 100644 index 0000000000..6b0827ec89 --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/scrolledhtml.rb @@ -0,0 +1,15 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +TkOption.add('*textBackground', 'white') + +sh = Tk::Iwidgets::Scrolledhtml.new(:fontname=>'helvetica', + :linkcommand=>proc{|href| + sh.import_link(href) + }) +sh.pack(:expand=>true, :fill=>:both, :padx=>10, :pady=>10) + +sh.import(Tk.getOpenFile(:title=>'select HTML document')) + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/scrolledlistbox.rb b/ext/tk/sample/tkextlib/iwidgets/sample/scrolledlistbox.rb new file mode 100644 index 0000000000..98f932d058 --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/scrolledlistbox.rb @@ -0,0 +1,22 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +TkOption.add('*textBackground', 'white') + +slb = Tk::Iwidgets::Scrolledlistbox.new(:selectmode=>:single, + :vscrollmode=>:static, + :hscrollmode=>:dynamic, + :labeltext=>'List', + :selectioncommand=>proc{ + puts(slb.get_curselection) + }, + :dblclickcommand=>proc{ + puts('Double Click') + puts(slb.get_curselection) + }) +slb.pack(:expand=>true, :fill=>:both, :padx=>10, :pady=>10) + +slb.insert('end', *['Hello', 'Out There', 'World']) + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/scrolledtext.rb b/ext/tk/sample/tkextlib/iwidgets/sample/scrolledtext.rb new file mode 100644 index 0000000000..59a96fb9f6 --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/scrolledtext.rb @@ -0,0 +1,11 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +st = Tk::Iwidgets::Scrolledtext.new(:hscrollmode=>:dynamic, :wrap=>:none, + :labeltext=>'Password File') +st.pack(:expand=>true, :fill=>:both, :padx=>10, :pady=>10) + +st.import('/etc/passwd') + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/selectionbox.rb b/ext/tk/sample/tkextlib/iwidgets/sample/selectionbox.rb new file mode 100644 index 0000000000..d19970fac9 --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/selectionbox.rb @@ -0,0 +1,19 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +TkOption.add('*textBackground', 'white') + +sb = Tk::Iwidgets::Selectionbox.new.pack(:padx=>10, :pady=>10, + :fill=>:both, :expand=>true) + +sb.insert_items('end', *['Hello', 'Out There', 'World']) + +TkLabel.new(sb.child_site, + :text=>'Child Site is Here').pack(:fill=>:x, :padx=>10, :pady=>10) + +sb.insert_items(2, 'Cruel Cruel') + +sb.selection_set(1) + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/selectiondialog.rb b/ext/tk/sample/tkextlib/iwidgets/sample/selectiondialog.rb new file mode 100644 index 0000000000..4fbb2aa378 --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/selectiondialog.rb @@ -0,0 +1,12 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +mainloop = Thread.new{Tk.mainloop} + +TkButton.new(:text=>'QUIT', + :command=>proc{Tk.root.destroy}).pack(:padx=>10, :pady=>10) + +Tk::Iwidgets::Selectiondialog.new.activate + +mainloop.join diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/spindate.rb b/ext/tk/sample/tkextlib/iwidgets/sample/spindate.rb new file mode 100644 index 0000000000..17197a66b7 --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/spindate.rb @@ -0,0 +1,7 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +Tk::Iwidgets::Spindate.new.pack(:padx=>10, :pady=>10) + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/spinint.rb b/ext/tk/sample/tkextlib/iwidgets/sample/spinint.rb new file mode 100644 index 0000000000..4064081740 --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/spinint.rb @@ -0,0 +1,10 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +TkOption.add('*textBackground', 'white') + +Tk::Iwidgets::Spinint.new(:labeltext=>'Temperature', :labelpos=>:w, :width=>5, + :fixed=>true, :range=>[32, 212]).pack(:pady=>10) + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/spinner.rb b/ext/tk/sample/tkextlib/iwidgets/sample/spinner.rb new file mode 100644 index 0000000000..44e8ec3034 --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/spinner.rb @@ -0,0 +1,33 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +class Spinner_demo < TkWindow + Months = %w(January February March April May June July August September October November December) + + def block_input(c) + false + end + + def spin_month(step) + index = Months.index(@spinner.get) + step + index = 11 if index < 0 + index = 0 if index > 11 + + @spinner.value = Months[index] + end + + def initialize(parent=nil) + @spinner = Tk::Iwidgets::Spinner.new(parent, :labeltext=>'Month : ', + :width=>10, :fixed=>10, + :validate=>proc{|c| block_input}, + :decrement=>proc{spin_month -1}, + :increment=>proc{spin_month 1}) + @path = @spinner + @spinner.insert(0, Months[0]) + end +end + +Spinner_demo.new.pack(:padx=>10, :pady=>10) + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/spintime.rb b/ext/tk/sample/tkextlib/iwidgets/sample/spintime.rb new file mode 100644 index 0000000000..2c13884b94 --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/spintime.rb @@ -0,0 +1,7 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +Tk::Iwidgets::Spintime.new.pack(:padx=>10, :pady=>10) + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/tabnotebook.rb b/ext/tk/sample/tkextlib/iwidgets/sample/tabnotebook.rb new file mode 100644 index 0000000000..5a9897845f --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/tabnotebook.rb @@ -0,0 +1,26 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +# Create the tabnotebook widget and pack it. +tn = Tk::Iwidgets::Tabnotebook.new(:width=>300, :height=>100) +tn.pack(:anchor=>:nw, :fill=>:both, :expand=>true, + :side=>:left, :padx=>10, :pady=>10) + +# Add two pages to the tabnotebook, +# labelled "Page One" and "Page Two" +tn.add(:label=>'Page One') +tn.add(:label=>'Page Two') + +# Get the child site frames of these two pages. +page1CS = tn.child_site(0) +page2CS = tn.child_site('Page Two') + +# Create buttons on each page of the tabnotebook. +TkButton.new(page1CS, :text=>'Button One').pack +TkButton.new(page2CS, :text=>'Button Two').pack + +# Select the first page of the tabnotebook. +tn.select(0) + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/tabnotebook2.rb b/ext/tk/sample/tkextlib/iwidgets/sample/tabnotebook2.rb new file mode 100644 index 0000000000..c08603f899 --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/tabnotebook2.rb @@ -0,0 +1,30 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +# Create the tabnotebook widget and pack it. +tn = Tk::Iwidgets::Tabnotebook.new(:width=>300, :height=>100) +tn.pack(:anchor=>:nw, :fill=>:both, :expand=>true, + :side=>:top, :padx=>10, :pady=>0) + +# Add two pages to the tabnotebook, +# labelled "Page One" and "Page Two" +tn.add(:label=>'Page One') +tn.add(:label=>'Page Two') + +# Get the child site frames of these two pages. +page1CS = tn.child_site(0) +page2CS = tn.child_site('Page Two') + +# Create buttons on each page of the tabnotebook. +TkButton.new(page1CS, :text=>'Button One').pack +TkButton.new(page2CS, :text=>'Button Two').pack + +# Select the first page of the tabnotebook. +tn.select(0) + +# Create the scrollbar +# and the notebook together, then pack the scrollbar +tn.xscrollbar(TkScrollbar.new).pack(:fill=>:x, :expand=>true, :padx=>10) + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/tabset.rb b/ext/tk/sample/tkextlib/iwidgets/sample/tabset.rb new file mode 100644 index 0000000000..90be46b40b --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/tabset.rb @@ -0,0 +1,34 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +# Create a listbox with two items (one and two) +l = TkListbox.new(:selectmode=>:single, :exportselection=>false).pack +l.insert('end', 'one') +l.insert('end', 'two') +l.selection_set(0) + +# Define a proc that knows how to select an item +# from a list given an index from the tabset -command callback. +selectItem = proc{|item| + l.selection_clear(l.curselection) + l.selection_set(item) + l.see(item) +} + +# Create a tabset, set its -command to call selectItem +# Add two labels to the tabset (one and two). +ts = Tk::Iwidgets::Tabset.new(:command=>selectItem) +ts.add(:label=>1) +ts.add(:label=>2) +ts.select(0) +ts.pack(:fill=>:x, :expand=>true) + +# Define a proc that knows how to select a tab +# given a y pixel coordinate from the list.. +selectTab = proc{|y| ts.select(l.nearest(y)) } + +# bind button 1 press to the selectTab procedure. +l.bind('ButtonPress-1', proc{|y| selectTab.call(y) }, '%y') + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/iwidgets/sample/toolbar.rb b/ext/tk/sample/tkextlib/iwidgets/sample/toolbar.rb new file mode 100644 index 0000000000..eba52ba5db --- /dev/null +++ b/ext/tk/sample/tkextlib/iwidgets/sample/toolbar.rb @@ -0,0 +1,152 @@ +#!/usr/bin/env ruby +require 'tk' +require 'tkextlib/iwidgets' + +########################################## +# icon images +editcopy22 = TkPhotoImage.new(:data=><<'EOD') + R0lGODlhFgAWAIUAAPwCBBQSFPz+/DQyNISChDw6PMzKzMTGxERGRIyKjFxa + XMTCvKSmpHR2dPz6/Pz29PTq3MS2rPz69MTCxFxWVHx6dJyWjNzSzPz27Pzy + 7Pzu5PTm3NTKvIR+fJyGfHxuZHxqXNTCtPTq5PTi1PTezNS+rExOTFRORMyy + lPTaxOzWxOzSvNze3NTOxMy2nMyulMyqjAQCBAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAWABYAAAbY + QIBwSCwahYGkUnk0BgTQ6IAQaBKfUWhBYKhaAU+CgXAQIAyChLeJzSIQhcH6 + GFaM0QtGY5kstqEODw8QEQELAhJTc08KBBMEFBUWDRcBE1pca20SGBkaEBsc + AY5maFRIAgoLHRQRHh8gIQFlZnByqA8ZGSIQIyQjJQEmYgJ5p2ACrK4gJx4g + KIZZAgdeAQ4ZI9kjKSor0AwEjeAs1S0cHAslLi4vMDDRWeRIfEsxMeET4ATy + VoYLC5fizXEiAR84BeMG+pEm8EsAFhAjSlR4hR6fLxiF0AkCACH+aENyZWF0 + ZWQgYnkgQk1QVG9HSUYgUHJvIHZlcnNpb24gMi41DQqpIERldmVsQ29yIDE5 + OTcsMTk5OC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCmh0dHA6Ly93d3cuZGV2 + ZWxjb3IuY29tADs= +EOD + +editcut22 = TkPhotoImage.new(:data=><<'EOD') + R0lGODlhFgAWAIMAAPwCBAQCBAwCBPz+/OTi5JyanOzq7DQyNGxqbAAAAAAA + AAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAWABYAAARbEMhJq704gxBE + 0Bf3cZo4kRJqBQNRfBucyudgvJS6VaxLzyMa6/bLiWA9HOg4VIIkL5vzuRkc + pkvRIIAorphJLzBW84WEuRZWp6uaT7J2Sh1Hit3OY/ZO7WvsEQAh/mhDcmVh + dGVkIGJ5IEJNUFRvR0lGIFBybyB2ZXJzaW9uIDIuNQ0KqSBEZXZlbENvciAx + OTk3LDE5OTguIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQpodHRwOi8vd3d3LmRl + dmVsY29yLmNvbQA7 +EOD + +editpaste22 = TkPhotoImage.new(:data=><<'EOD') + R0lGODlhFgAWAIYAAPwCBBQWFDw6FHRuFGRaBFxSBAQCBAQKBCQiBIx6HPz6 + /NTOfKyiXDQuFOTm5Pz+/Ozu7PTq5Pz63PTyxNTOjKSeRExGLMTGxMzKzNTS + 1NTW1Dw2NKSmpKyqrKSipJyanNzWlLy6ZLSuVIx6FISChIyKhJSSlCQiJLS2 + tDw6NDQyNCQiFCQmHBQSDGRiZHRydGxubHx6dGxqbFxeXGRmZFxaXCwuLOzq + 7KyurHx+fDwmFEQuFCweFCQWDBQODBwaHBweHKSinJSWlOTi5JyepHR2dDw6 + PBQSFNze3ERGRIyKjIyOjISGhPz29Pzy7MS2rMzOzFRWVHx2dHxybDQiFPz2 + 7Pzu5PTq3PTm1NTCtJyGdHxuZHxqXPzq3PTaxNS6pFxWVFRKRNS2nPTi1PTS + tNSulNzOxNSynMymhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAA + LAAAAAAWABYAAAf/gACCgwABAgMEBYSLggaOjgcICQoLDA2Pj4MGDg8QEZ4F + DxITFBUWFxcYGRobjQ8cHR4fCQ8gCyEiFSMWJCUkJieNEB4dKB4pKissK8wr + LS4vMDHBAAYQHx8dFx0fJDIzNDU0M+IyHzaNNyg43Ng5Ojs7Ojw9Pj9AMkCN + DiZB/h9CSOx4QLCgihItqBkYgqIDESElitAYWJCgkQcXjjRCgi1Ihw4BB5LA + QOLCgyQYHihpUU3DBw5ElpAgAYNixSRJjKjQaECDCRPZPDB5IbIGSQwKLnh4 + wbInLA4kmJB4oaPiAwVNnER40hRK1BIAaVatUZJEFCkmpmjgCeWDCalFe4q4 + oFKwSRUrEa5gycLzwq8lUnPQ4PEgSpYcUZ5o2cIlS1O/JHLEDdfjQZMIVrpg + weLFy5e+M6WSmBGlxYMYYBRzCaOFi5imHWBIfOEiShLTVjaP6eyFTBmN1TA5 + OvLDjJksWb58OVMGDRqWjAYdmU79SIvpjqJr104nEAAh/mhDcmVhdGVkIGJ5 + IEJNUFRvR0lGIFBybyB2ZXJzaW9uIDIuNQ0KqSBEZXZlbENvciAxOTk3LDE5 + OTguIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQpodHRwOi8vd3d3LmRldmVsY29y + LmNvbQA7 +EOD + +editdelete22 = TkPhotoImage.new(:data=><<'EOD') + R0lGODlhFgAWAIYAAASC/FRSVExKTERCRDw6PDQyNCwuLBweHBwaHAwODAwK + DAQCBExOTNze3NTW1MTGxLS2tJyanPz+/Ozu7BQSFCwqLDw+POTi5PTu7MzK + xIR+fCQmJPz6/Oze1NTGvPz69Pzy7Pz29LyyrPy+vPyupPTm1BQWFIQCBPwC + BMS6rPzSzNTOxPTi1NS+rPTezNzOxPTizOzWxMy2pOzaxMy2nPTaxOzOtMyy + nOzSvMyqjPx+fOzGpMSihPTq3OzKrOTCpNzKxNTCtAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAA + LAAAAAAWABYAAAf8gACCAQIDBAUGBwgJCgsLgpCRAAwNlZYODxALEY+SkAMN + EqKjEw0UD5yegqCjrRMVEqidkgWhraMWF7GptLa3EgEWFRSOnhW+vxgZEBqz + kBvItxwdHryRCNGjHyAhHSLOgtgSI60c2yQjJd+eJqEnKK0hJCgnJSngAO0S + F+8qEvL0VrBogW+BLX4oVKgIyMIFQU8KfDV4R+8FDBcxZBREthAFiRIsOsyg + sVEUh4Un3pGoUcPGjZInK65QicPlxg8oX5RwqNJGjo0hdJwQ6EIkjRM6dvDY + CKIHSBc1Ztjw4eOH0oIrsgIJEqSFDBo0cuTgsdSTo7No0xYTZCcQACH+aENy + ZWF0ZWQgYnkgQk1QVG9HSUYgUHJvIHZlcnNpb24gMi41DQqpIERldmVsQ29y + IDE5OTcsMTk5OC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCmh0dHA6Ly93d3cu + ZGV2ZWxjb3IuY29tADs= +EOD + +text22 = TkPhotoImage.new(:data=><<'EOD') + R0lGODlhFgAWAIQAAPwCBAQCBBwaHAwKDBQSFLy+vLS2tJSWlBQWFKyqrFRS + VCwqLDQyNNTS1GxqbFxaXJyanIyOjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAWABYAAAVcICCOZGmK + QSoMaZsShBsQBdAapHvgaIDUqUPJlRjSbAoT0fRDKgODRbF0PLUYjZO2F2Bs + t9evNix+dsvDlGKK5jraudQb7qbX6a2HEJ+ycyF+LRE8ZTI+fX5oGCEAIf5o + Q3JlYXRlZCBieSBCTVBUb0dJRiBQcm8gdmVyc2lvbiAyLjUNCqkgRGV2ZWxD + b3IgMTk5NywxOTk4LiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KaHR0cDovL3d3 + dy5kZXZlbGNvci5jb20AOw== +EOD + +########################################## + +bmp_dir = File.join(File.dirname(File.expand_path(__FILE__)), + '../catalog_demo/images') + +########################################## + +status_var = TkVariable.new +radio_var = TkVariable.new +check_var1 = TkVariable.new +check_var2 = TkVariable.new + +tb = Tk::Iwidgets::Toolbar.new(:helpvariable=>status_var) + +########################################## + +tb.add(:button, :helpstr=>'Copy It', :image=>editcopy22, + :balloonstr=>'Copy', :command=>proc{puts 'Copy It'}) + +tb.add(:button, :helpstr=>'Cut It', :image=>editcut22, + :balloonstr=>'Cut', :command=>proc{puts 'Cut It'}) + +tb.add(:button, :helpstr=>'Paste It', :image=>editpaste22, + :balloonstr=>'Paste', :command=>proc{puts 'Paste It'}) + +tb.add(:button, :helpstr=>'Delete It', :image=>editdelete22, + :balloonstr=>'Delete', :command=>proc{puts 'Delete It'}) + +#-------------------------------- + +tb.add(:frame, :borderwidth=>1, :width=>10, :height=>10) + +#-------------------------------- + +tb.add(:radiobutton, :variable=>radio_var, :value=>'Box', + :bitmap=>"@#{bmp_dir}/box.xbm", + :helpstr=>'Radio Button #1', :balloonstr=>'Radio', + :command=>proc{puts 'Radio Button "Box"'}) + +tb.add(:radiobutton, :variable=>radio_var, :value=>'Line', + :bitmap=>"@#{bmp_dir}/line.xbm", + :helpstr=>'Radio Button #2', :balloonstr=>'Radio', + :command=>proc{puts 'Radio Button "Line"'}) + +tb.add(:radiobutton, :variable=>radio_var, :value=>'Oval', + :bitmap=>"@#{bmp_dir}/oval.xbm", + :helpstr=>'Radio Button #3', :balloonstr=>'Radio', + :command=>proc{puts 'Radio Button "Oval"'}) + +#-------------------------------- + +tb.add(:frame, :borderwidth=>1, :width=>10, :height=>10) + +#-------------------------------- + +tb.add(:checkbutton, :variable=>check_var1, :onvalue=>'yes', :offvalue=>'no', + :image=>text22, :command=>proc{puts 'Checkbutton 1'}) + +tb.add(:checkbutton, :variable=>check_var2, :onvalue=>'yes', :offvalue=>'no', + :bitmap=>"@#{bmp_dir}/points.xbm", :command=>proc{puts 'Checkbutton 2'}) + +tb.pack(:side=>:top, :anchor=>:nw) + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/tkHTML/COPYRIGHT.orig b/ext/tk/sample/tkextlib/tkHTML/COPYRIGHT.orig new file mode 100644 index 0000000000..2b3757bb23 --- /dev/null +++ b/ext/tk/sample/tkextlib/tkHTML/COPYRIGHT.orig @@ -0,0 +1,12 @@ + +The following text is the original 'COPYRIGHT' file of tkHTML. + +----------------------------------------------------------------------- +Most of the source code for the Tk Html widget has been place in the +public domain. You can do with it whatever you want. However, some +files have been copied from other sources and contain copyrights. +A copyright notice appears separately at the top of each source file. +----------------------------------------------------------------------- + +In this sample, HTML documents are quoted in the 'tests' directory of +tkHTML source tree. There were no copyright notice in the directory. diff --git a/ext/tk/sample/tkextlib/tktable/LICENSE.orig b/ext/tk/sample/tkextlib/tktable/LICENSE.orig new file mode 100644 index 0000000000..dd176a7ccf --- /dev/null +++ b/ext/tk/sample/tkextlib/tktable/LICENSE.orig @@ -0,0 +1,52 @@ + + ####################################################################### + ### The following text is the original 'license.txt' of tktable ### + ### extension. ### + ### Original Tcl source files are not include in this directry, ### + ### because of all of them are rewrited to Ruby files. ### + ### However, the image data file is quoted from iwidgets source ### + ### archive. ### + ####################################################################### + + + * COPYRIGHT AND LICENSE TERMS * + +(This file blatantly stolen from Tcl/Tk license and adapted - thus assume +it falls under similar license terms). + +This software is copyrighted by Jeffrey Hobbs . The +following terms apply to all files associated with the software unless +explicitly disclaimed in individual files. + +The authors hereby grant permission to use, copy, modify, distribute, and +license this software and its documentation for any purpose, provided that +existing copyright notices are retained in all copies and that this notice +is included verbatim in any distributions. No written agreement, license, +or royalty fee is required for any of the authorized uses. + +IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT +OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY DERIVATIVES THEREOF, +EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE IS +PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO +OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +MODIFICATIONS. + +RESTRICTED RIGHTS: Use, duplication or disclosure by the U.S. government +is subject to the restrictions as set forth in subparagraph (c) (1) (ii) +of the Rights in Technical Data and Computer Software Clause as DFARS +252.227-7013 and FAR 52.227-19. + +SPECIAL NOTES: + +This software also falls under the bourbon_ware clause: + + Should you find this software useful in your daily work, you should + feel obliged to take the author out for a drink if the opportunity + presents itself. The user may feel exempt from this clause if they + are under 21 or think the author has already partaken of too many + drinks. diff --git a/ext/tk/sample/tkextlib/tktable/basic.rb b/ext/tk/sample/tkextlib/tktable/basic.rb new file mode 100644 index 0000000000..a7dfe2a789 --- /dev/null +++ b/ext/tk/sample/tkextlib/tktable/basic.rb @@ -0,0 +1,60 @@ +#!/usr/bin/env ruby +## +## basic.rb +## +## This demo shows the basic use of the table widget +## +## ( based on 'basic.tcl' included source archive of tktable extension ) +## +require 'tk' +require 'tkextlib/tktable' + +ary = TkVariable.new_hash +rows = 8 +cols = 8 + +# fill table variable +((-(rows))..rows).each{|x| + ((-(cols))..cols).each{|y| + ary[x,y] = "r#{x},c#{y}" + } +} + +lbl = TkLabel.new(:text=>"TkTable v1 Example") + +table = Tk::TkTable.new(:rows=>rows, :cols=>cols, :variable=>ary, + :width=>6, :height=>6, + :titlerows=>1, :titlecols=>2, + :roworigin=>-1, :colorigin=>-2, + :rowstretchmode=>:last, :colstretchmode=>:last, + :rowtagcommand=>proc{|row| + row = Integer(row) + return 'OddRow' if row>0 && row%2 == 1 + }, + :coltagcommand=>proc{|col| + col = Integer(col) + return 'OddCol' if col>0 && col%2 == 1 + }, + :selectmode=>:extended, :sparsearray=>false) + +sx = table.xscrollbar(TkScrollbar.new) +sy = table.yscrollbar(TkScrollbar.new) + +btn = TkButton.new(:text=>'Exit', :command=>proc{exit}) + +Tk.grid(lbl, '-', :sticky=>:ew) +Tk.grid(table, sy, :sticky=>:news) +Tk.grid(sx, :sticky=>:ew) +Tk.grid(btn, :sticky=>:ew, :columnspan=>2) + +Tk.root.grid_columnconfig(0, :weight=>1) +Tk.root.grid_rowconfig(1, :weight=>1) + +table.tag_configure('OddRow', :bg=>'orange', :fg=>'purple') +table.tag_configure('OddCol', :bg=>'brown', :fg=>'pink') + +table.set_width([-2, 7], [-1, 7], [1, 5], [2, 8], [4, 14]) + +puts "Table is #{table.path} with array #{(table['variable'])}" + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/tktable/buttons.rb b/ext/tk/sample/tkextlib/tktable/buttons.rb new file mode 100644 index 0000000000..b6995bb54b --- /dev/null +++ b/ext/tk/sample/tkextlib/tktable/buttons.rb @@ -0,0 +1,76 @@ +#!/usr/bin/env ruby +## +## buttons.rb +## +## demonstrates the simulation of a button array +## +## ( based on 'buttons.tcl' included source archive of tktable extension ) +## +require 'tk' +require 'tkextlib/tktable' + +# create the table +tab = TkVariable.new_hash +rows = 20 +cols = 20 + +table = Tk::TkTable.new(:rows=>rows + 1, :cols=>cols + 1, + :variable=>tab, :titlerows=>1, :titlecols=>1, + :roworigin=>-1, :colorigin=>-1, + :colwidth=>4, :width=>8, :height=>8, + :cursor=>'top_left_arrow', :borderwidth=>2, + :flashmode=>false, :state=>:disabled) + +sx = table.xscrollbar(TkScrollbar.new) +sy = table.yscrollbar(TkScrollbar.new) + +Tk.grid(table, sy, :sticky=>:news) +Tk.grid(sx, :sticky=>:ew) + +Tk.root.grid_columnconfig(0, :weight=>1) +Tk.root.grid_rowconfig(0, :weight=>1) + +# set up tags for the various states of the buttons +table.tag_configure('OFF', :bg=>'red', :relief=>:raised) +table.tag_configure('ON', :bg=>'green', :relief=>:sunken) +table.tag_configure('sel', :bg=>'gray75', :relief=>:flat) + +# clean up if mouse leaves the widget +table.bind('Leave', proc{|w| w.selection_clear_all}, '%W') + +# highlight the cell under the mouse +table.bind('Motion', proc{|w, x, y| + Tk.callback_break if w.selection_include?(TkComm._at(x,y)) + w.selection_clear_all + w.selection_set(TkComm._at(x,y)) + Tk.callback_break + ## "break" prevents the call to tkTableCheckBorder + }, '%W %x %y') + +# mousebutton 1 toggles the value of the cell +# use of "selection includes" would work here +table.bind('1', proc{|w, x, y| + #rc = w.curselection[0] + rc = w.index(TkComm._at(x,y)) + if tab[rc] == 'ON' + tab[rc] = 'OFF' + w.tag_cell('OFF', rc) + else + tab[rc] = 'ON' + w.tag_cell('ON', rc) + end}, '%W %x %y') + + +# inititialize the array, titles, and celltags +0.step(rows){|i| + tab[i,-1] = i + 0.step(cols){|j| + if i == 0 + tab[-1,j] = j + end + tab[i,j] = "OFF" + table.tag_cell('OFF', "#{i},#{j}") + } +} + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/tktable/command.rb b/ext/tk/sample/tkextlib/tktable/command.rb new file mode 100644 index 0000000000..950bc0ccb1 --- /dev/null +++ b/ext/tk/sample/tkextlib/tktable/command.rb @@ -0,0 +1,89 @@ +#!/usr/bin/env ruby +## +## command.rb +## +## This demo shows the use of the table widget's -command options +## +## ( based on 'command.tcl' included source archive of tktable extension ) +## +require 'tk' +require 'tkextlib/tktable' + +# create the table +data = TkVariable.new_hash +rows = 10 +cols = 10 + +# fill table variable +((-(rows))..rows).each{|x| + ((-(cols))..cols).each{|y| + data[x,y] = "#{x} x #{y}" + } +} + +lbl = TkLabel.new(:text=>"TkTable :command Example") +cur_var = TkVariable.new +current = TkLabel.new(:textvariable=>cur_var, :width=>5) +ent_var = TkVariable.new +entry = TkEntry.new(:textvariable=>ent_var) + +table = Tk::TkTable.new(:rows=>rows, :cols=>cols, + :command=>[proc{|mode, cell, val| + if (mode == :w) + data[cell] = val + else + begin + data[cell] # exist + rescue + '' # not exist + end + end + }, '%i %C %s'], + :width=>6, :height=>6, + :titlerows=>1, :titlecols=>1, + :roworigin=>-1, :colorigin=>-1, + :rowstretchmode=>:last, :colstretchmode=>:last, + :rowtagcommand=>proc{|row| + row = Integer(row) + return 'OddRow' if row>0 && row%2 == 1 + }, + :coltagcommand=>proc{|col| + col = Integer(col) + return 'OddCol' if col>0 && col%2 == 1 + }, + :selectmode=>:extended, :flashmode=>true, + :rowstretch=>:unset, :colstretch=>:unset, + :browsecommand=>[proc{|w, s| + cur_var.value = s + ent_var.value = w.get(s) + }, '%W %S'], + :validate=>true, + :validatecommand=>proc{|e| + ent_var.value = e.new_value; true + }) +=begin + :validatecommand=>[ + proc{|s| + ent_var.value = s; true + }, '%S']) +=end + +sx = table.xscrollbar(TkScrollbar.new) +sy = table.yscrollbar(TkScrollbar.new) + +entry.bind('Return', proc{|w| table.curvalue = w.value}, '%W') + +Tk.grid(lbl, '-', '-', :sticky=>:ew) +Tk.grid(current, entry, '-', :sticky=>:ew) +Tk.grid(table, '-', sy, :sticky=>:news) +Tk.grid(sx, '-', :sticky=>:ew) + +Tk.root.grid_columnconfig(1, :weight=>1) +Tk.root.grid_rowconfig(2, :weight=>1) + +table.tag_configure('OddRow', :bg=>'orange', :fg=>'purple') +table.tag_configure('OddCol', :bg=>'brown', :fg=>'pink') + +puts "Table is #{table.path}" + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/tktable/debug.rb b/ext/tk/sample/tkextlib/tktable/debug.rb new file mode 100644 index 0000000000..30508acea6 --- /dev/null +++ b/ext/tk/sample/tkextlib/tktable/debug.rb @@ -0,0 +1,101 @@ +#!/usr/bin/env ruby +## +## debug.rb +## +## This demo uses most features of the table widget +## +## ( based on 'debug.tcl' included source archive of tktable extension ) +## +require 'tk' +require 'tkextlib/tktable' + +# create the table +ary = TkVariable.new_hash +rows = 25 +cols = 20 + +# fill table variable +((-(rows))..rows).each{|x| + ((-(cols))..cols).each{|y| + ary[x,y] = "r#{x},c#{y}" + } +} + +lbl = TkLabel.new(:text=>"TkTable v2 Example") + +table = Tk::TkTable.new(:rows=>rows, :cols=>cols, :variable=>ary, + :width=>6, :height=>6, + :titlerows=>1, :titlecols=>2, + :roworigin=>-5, :colorigin=>-2, + :coltagcommand=>proc{|col| + col = Integer(col) + return 'OddCol' if col>0 && col%2 == 1 + }, + :selectmode=>:extended, :flashmode=>true, + :rowstretch=>:unset, :colstretch=>:unset, + :selecttitles=>false, :drawmode=>:single) + +sx = table.xscrollbar(TkScrollbar.new) +sy = table.yscrollbar(TkScrollbar.new) + +btn = TkButton.new(:text=>'Exit', :command=>proc{exit}) + +Tk.grid(lbl, '-', :sticky=>:ew) +Tk.grid(table, sy, :sticky=>:news) +Tk.grid(sx, :sticky=>:ew) +Tk.grid(btn, :sticky=>:ew, :columnspan=>2) + +Tk.root.grid_columnconfig(0, :weight=>1) +Tk.root.grid_rowconfig(1, :weight=>1) + +table.tag_configure('OddCol', :bg=>'brown', :fg=>'pink') +table.tag_configure('title', :bg=>'red', :fg=>'green', :relief=>:sunken) +table.tag_configure('dis', :state=>:disabled) + +first = table[:colorigin] +%w(n s e w nw ne sw se c).each_with_index{|anchor, idx| + table.tag_configure(anchor, :anchor=>anchor) + table.tag_row(anchor, idx) + table.set([idx,first], anchor) +} +courier = TkFont.new(:family=>'Courier', :size=>10) +table.tag_configure('s', :font=>courier, :justify=>:center) + +logo = TkPhotoImage.new(:file=>File.join(File.dirname(File.expand_path(__FILE__)), 'tcllogo.gif')) +table.tag_configure('logo', :image=>logo, :showtext=>true) +table.tag_cell('logo', [1,2], [2,3], [4,1]) +table.tag_cell('dis', [2,1], [1,-1], [3,0]) +table.set_width([-2,8], [-1,9], [0, 12], [4, 14]) + +table.set([1,1], "multi-line\ntext\nmight be\ninteresting", + [3,2], "more\nmulti-line\nplaying\n", + [2,2], "null\0byte") + +# This is in the row span +l = TkLabel.new(table, :text=>'Window s', :bg=>'yellow') +table.window_configure([6,0], :sticky=>:s, :window=>l) + +# This is in the row titles +l = TkLabel.new(table, :text=>'Window ne', :bg=>'yellow') +table.window_configure([4,-1], :sticky=>:ne, :window=>l) + +# This will get swallowed by a span +l = TkLabel.new(table, :text=>'Window ew', :bg=>'yellow') +table.window_configure([5,3], :sticky=>:ew, :window=>l) + +# This is in the col titles +l = TkLabel.new(table, :text=>'Window news', :bg=>'yellow') +table.window_configure([-5,1], :sticky=>:news, :window=>l) + +l = TkLabel.new(table.winfo_parent, :text=>'Sibling l', :bg=>'orange') +table.window_configure([5,1], :sticky=>:news, :window=>l) + +if table.span_list.empty? + table.set_spans([-1,-2], [0,3], [1,2], [0,5], [3,2], [2,2], [6,0], [4,0]) +end + +puts "Table is #{table.path} with array #{(table['variable'])}" + +# table.postscript(:file=>'out.ps', :first=>:origin, :last=>[2,2]) + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/tktable/dynarows.rb b/ext/tk/sample/tkextlib/tktable/dynarows.rb new file mode 100644 index 0000000000..35359046f7 --- /dev/null +++ b/ext/tk/sample/tkextlib/tktable/dynarows.rb @@ -0,0 +1,99 @@ +#!/usr/bin/env ruby +## +## dynarows.rb +## +## This demos shows the use of the validation mechanism of the table +## and uses the table's cache (no -command or -variable) with a cute +## dynamic row routine. +## +## ( based on 'dynarows.tcl' included source archive of tktable extension ) +## +require 'tk' +require 'tkextlib/tktable' + +def table_validate(w, idx) + return unless idx =~ /^(\d+),(\d+)$/ + row = Integer($1) + col = Integer($2) + val = w.get(idx) + + [w, idx] + nrows = w[:rows] + return if row == nrows - 1 && val == '' + + begin + time = Tk.tk_call('clock', 'scan', val) + date = [] + Tk.tk_call('clock', 'format', time, + :format=>'%m %d %Y').split(' ').each{|item| + date << item.sub(/^\s*0*/,'') + } + w.set(idx, date.join('/')) + if row == nrows - 1 + if w.get([row,1]) != '' && w.get([row,2]) != '' + w.tag_row_reset(row) + w.set([row,0], row) + nrows += 1 + row += 1 + w.configure(:rows=>nrows) + w.tag_row('unset', row) + w.set([row,0], '*') + w.see([row,1]) + w.activate([row,1]) + end + end + rescue + Tk.bell + w.activate(idx) + w.selection_clear_all + w.selection_set(:active) + w.see(:active) + end +end + + +lbl = TkLabel.new(:text=>"Dynamic Date Validated Rows") + +table = Tk::TkTable.new(:rows=>2, :cols=>3, :cache=>1, :selecttype=>:row, + :titlerows=>1, :titlecols=>1, :height=>5, + :colstretch=>:unset, :rowstretch=>:unset, + :autoclear=>true, + :browsecommand=>[ + proc{|w,s| table_validate(w, s)}, + '%W %s' + ]) +table.set([0,1], 'Begin', [0,2], 'End', [1,0], '*') +table.tag_configure('unset', :fg=>'#008811') +table.tag_configure('title', :fg=>'red') +table.tag_row('unset', 1) +table.set_width(0,3) + +sx = table.xscrollbar(TkScrollbar.new) +sy = table.yscrollbar(TkScrollbar.new) + +Tk.grid(lbl, '-', :sticky=>:ew) +Tk.grid(table, sy, :sticky=>:news) +Tk.grid(sx, :sticky=>:ew) + +Tk.root.grid_columnconfig(0, :weight=>1) +Tk.root.grid_rowconfig(1, :weight=>1) + +rtn_proc = proc{|w| + r = w.row_index(:active) + c = w.col_index(:active) + + if c == 2 + r += 1 + w.activate([r,1]) + else + c += 1 + w.activate([r,c]) + end + w.see(:active) + Tk.callback_break +} + +table.bind('Return', rtn_proc, '%W') +table.bind('KP_Enter', rtn_proc, '%W') + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/tktable/maxsize.rb b/ext/tk/sample/tkextlib/tktable/maxsize.rb new file mode 100644 index 0000000000..a2c5f606a8 --- /dev/null +++ b/ext/tk/sample/tkextlib/tktable/maxsize.rb @@ -0,0 +1,67 @@ +#!/usr/bin/env ruby +## +## maxsize.rb +## +## This demo uses a really big table. The big startup time is in +## filling the table's Tcl array var. +## +## ( based on 'maxsize.tcl' included source archive of tktable extension ) +## +require 'tk' +require 'tkextlib/tktable' + +ary = TkVariable.new_hash +rows = 40000 +cols = 10 + +# fill table variable +((-(rows))..rows).each{|x| + ((-(cols))..cols).each{|y| + ary[x,y] = "#{x},#{y}" + } +} + +lbl = TkLabel.new(:text=>"TkTable v2 Example") + +table = Tk::TkTable.new(:rows=>rows, :cols=>cols, :variable=>ary, + :width=>6, :height=>8, + :titlerows=>1, :titlecols=>1, + :coltagcommand=>proc{|col| + col = Integer(col) + return 'OddCol' if col>0 && col%2 == 1 + }, + :selectmode=>:extended, + :colstretch=>:unset, :rowstretch=>:unset, + :selecttitles=>false, :drawmode=>:slow) + +sx = table.xscrollbar(TkScrollbar.new) +sy = table.yscrollbar(TkScrollbar.new) + +btn = TkButton.new(:text=>'Exit', :command=>proc{exit}) + +Tk.grid(lbl, '-', :sticky=>:ew) +Tk.grid(table, sy, :sticky=>:news) +Tk.grid(sx, :sticky=>:ew) +Tk.grid(btn, :sticky=>:ew, :columnspan=>2) + +Tk.root.grid_columnconfig(0, :weight=>1) +Tk.root.grid_rowconfig(1, :weight=>1) + +table.tag_configure('OddCol', :bg=>'brown', :fg=>'pink') +table.tag_configure('title', :bg=>'red', :fg=>'blue', :relief=>:sunken) +table.tag_configure('dis', :state=>:disabled) + +first = table[:colorigin] +%w(n s e w nw ne sw se c).each_with_index{|anchor, idx| + table.tag_configure(anchor, :anchor=>anchor) + table.tag_row(anchor, idx) + table.set([idx,first], anchor) +} +courier = TkFont.new(:family=>'Courier', :size=>10) +table.tag_configure('s', :font=>courier, :justify=>:center) + +table.set_width([-2, 8], [-1, 9], [0, 12], [4, 14]) + +puts "Table is #{table.path} with array #{(table['variable'])}" + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/tktable/tcllogo.gif b/ext/tk/sample/tkextlib/tktable/tcllogo.gif new file mode 100755 index 0000000000..4603d4ff41 Binary files /dev/null and b/ext/tk/sample/tkextlib/tktable/tcllogo.gif differ diff --git a/ext/tk/sample/tkextlib/tktable/valid.rb b/ext/tk/sample/tkextlib/tktable/valid.rb new file mode 100644 index 0000000000..4570441667 --- /dev/null +++ b/ext/tk/sample/tkextlib/tktable/valid.rb @@ -0,0 +1,88 @@ +#!/usr/bin/env ruby +## +## valid.rb +## +## This demos shows the use of the validation mechanism of the table +## and uses the table's cache (no -command or -variable) +## +## ( based on 'valid.tcl' included source archive of tktable extension ) +## +require 'tk' +require 'tkextlib/tktable' + +rows = 10 +cols = 10 + +def colorize(num) + num = Integer(num) + return 'colored' if (num > 0 && num % 2 == 1) +end + +def fill_headers(w, r=10, c=10) + (1..(r-1)).each{|i| w.set([i,0], i.to_s)} + + (1..(c-1)).each{|j| + if j % 3 == 1 + w.set([0,j], 'AlphaNum') + elsif j % 2 == 1 + w.set([0,j], 'Alpha') + elsif j != 0 + w.set([0,j], 'Real') + end + } +end + +def validate_proc(c, val) + if c % 3 == 1 + # AlphaNum + regexp = /^[A-Za-z0-9 ]*$/ + elsif c % 2 == 1 + # Alpha + regexp = /^[A-Za-z ]*$/ + elsif c != 0 + # 'Real' + regexp = /^[-+]?[0-9]*\.?[0-9]*([0-9]\.?e[-+]?[0-9]*)?$/ + end + if val =~ regexp + return true + else + Tk.bell + return false + end +end + +lbl = TkLabel.new(:text=>"TkTable v1 Validated Table Example") + +table = Tk::TkTable.new(:rows=>rows, :cols=>cols, :cache=>1, + :width=>5, :height=>5, :titlerows=>1, :titlecols=>1, + :coltagcommand=>proc{|n| colorize(n)}, + :flashmode=>true, :selectmode=>:extended, + :colstretch=>:unset, :rowstretch=>:unset, + :validate=>true, + :validatecommand=>proc{|e| + unless e.widget.tag_include?('title', e.index) + validate_proc(e.column, e.new_value) + end } ) + +fill_headers(table) + +table.tag_configure('colored', :bg=>'lightblue') +table.tag_configure('title', :fg=>'red') +table.set_width(0,3) + +sx = table.xscrollbar(TkScrollbar.new) +sy = table.yscrollbar(TkScrollbar.new) + +btn = TkButton.new(:text=>'Exit', :command=>proc{exit}) + +Tk.grid(lbl, '-', :sticky=>:ew) +Tk.grid(table, sy, :sticky=>:news) +Tk.grid(sx, :sticky=>:ew) +Tk.grid(btn, '-', :sticky=>:ew) + +Tk.root.grid_columnconfig(0, :weight=>1) +Tk.root.grid_rowconfig(1, :weight=>1) + +puts "Table is #{table.path}" + +Tk.mainloop diff --git a/ext/tk/sample/tkextlib/vu/LICENSE.orig b/ext/tk/sample/tkextlib/vu/LICENSE.orig index 475f5affae..f5f2f770cf 100644 --- a/ext/tk/sample/tkextlib/vu/LICENSE.orig +++ b/ext/tk/sample/tkextlib/vu/LICENSE.orig @@ -4,7 +4,7 @@ >>> Original Tcl source files are not include in this directry, <<< >>> because of all of them are rewrited to Ruby files. <<< >>> However, the bitmap data file included in this directory is the <<< - >>> same file of vu extension. , the bitmap data file is under the <<< + >>> same file of vu extension. So, the bitmap data file is under the <<< >>> following license. <<< >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< diff --git a/ext/tk/sample/tktree.rb b/ext/tk/sample/tktree.rb index 6379635a5d..bcb94d3601 100644 --- a/ext/tk/sample/tktree.rb +++ b/ext/tk/sample/tktree.rb @@ -18,8 +18,10 @@ class TkTree < TkCanvas args = [@path] if keys.kind_of?(Hash) font = keys.delete('itemfont') +# font = hash_kv(font) if font.kind_of?(Hash) keys['font'] = font if font - args.concat(hash_kv(keys)) +# args.concat(hash_kv(keys)) + args << keys end begin tk_call('::tktree::treecreate', *args) @@ -33,8 +35,10 @@ class TkTree < TkCanvas if keys.kind_of?(Hash) keys = _symbolkey2str(keys) font = keys.delete('itemfont') +# font = hash_kv(font) if font.kind_of?(Hash) keys['font'] = font if font - tk_call('::tktree::newitem', @path, itempath, *hash_kv(keys)) +# tk_call('::tktree::newitem', @path, itempath, *hash_kv(keys)) + tk_call('::tktree::newitem', @path, itempath, keys) else tk_call('::tktree::newitem', @path, itempath) end @@ -80,7 +84,7 @@ EOL } f = TkFrame.new.pack(:expand=>true, :fill=>:both) - tr2 = TkTree.new(f, :bg=>'black', :itemfont=>{:family=>'Times', :size=>14}, + tr2 = TkTree.new(f, :bg=>'black', #:itemfont=>{:family=>'Times', :size=>14}, :textcolor=>'red', :bd=>4, :relief=>:ridge, :selectbackground=>'darkBlue', :selectforeground=>'yellow', :selectborderwidth=>3, :linecolor=>'yellow') { diff --git a/ext/tk/tkutil.c b/ext/tk/tkutil.c index 4654619169..37af36b049 100644 --- a/ext/tk/tkutil.c +++ b/ext/tk/tkutil.c @@ -436,11 +436,13 @@ assoc2kv_enc(assoc, ary, self) } static int -push_kv(key, val, ary) +push_kv(key, val, args) VALUE key; VALUE val; - VALUE ary; + VALUE args; { + volatile VALUE ary = RARRAY(args)->ptr[0]; + if (key == Qundef) return ST_CONTINUE; #if 0 rb_ary_push(ary, key2keyname(key)); @@ -448,7 +450,10 @@ push_kv(key, val, ary) #endif RARRAY(ary)->ptr[RARRAY(ary)->len++] = key2keyname(key); - if (val != TK_None) RARRAY(ary)->ptr[RARRAY(ary)->len++] = val; + if (val == TK_None) return ST_CONTINUE; + + RARRAY(ary)->ptr[RARRAY(ary)->len++] + = get_eval_string_core(val, Qnil, RARRAY(args)->ptr[1]); return ST_CONTINUE; } @@ -459,16 +464,20 @@ hash2kv(hash, ary, self) VALUE ary; VALUE self; { + volatile VALUE args = rb_ary_new2(2); volatile VALUE dst = rb_ary_new2(2 * RHASH(hash)->tbl->num_entries); RARRAY(dst)->len = 0; - st_foreach(RHASH(hash)->tbl, push_kv, dst); + RARRAY(args)->ptr[0] = dst; + RARRAY(args)->ptr[1] = self; + RARRAY(args)->len = 2; + st_foreach(RHASH(hash)->tbl, push_kv, args); if (NIL_P(ary)) { return dst; } else { - return rb_ary_plus(ary, dst); + return rb_ary_concat(ary, dst); } } @@ -517,7 +526,7 @@ hash2kv_enc(hash, ary, self) if (NIL_P(ary)) { return dst; } else { - return rb_ary_plus(ary, dst); + return rb_ary_concat(ary, dst); } } @@ -773,6 +782,10 @@ tcl2rb_bool(self, value) } } + if (TYPE(value) == T_TRUE || TYPE(value) == T_FALSE) { + return value; + } + rb_check_type(value, T_STRING); value = rb_funcall(value, ID_downcase, 0); @@ -1040,6 +1053,7 @@ cbsubst_table_setup(self, key_inf, proc_inf) struct cbsubst_info *subst_inf; int idx; int len = RARRAY(key_inf)->len; + int real_len = 0; char *key = ALLOC_N(char, len + 1); char *type = ALLOC_N(char, len + 1); ID *ivar = ALLOC_N(ID, len + 1); @@ -1048,7 +1062,7 @@ cbsubst_table_setup(self, key_inf, proc_inf) /* init */ subst_inf = ALLOC(struct cbsubst_info); - subst_inf->size = len; + /* subst_inf->size = len; */ subst_inf->key = key; subst_inf->type = type; subst_inf->ivar = ivar; @@ -1063,10 +1077,10 @@ cbsubst_table_setup(self, key_inf, proc_inf) for(idx = 0; idx < len; idx++) { inf = RARRAY(key_inf)->ptr[idx]; if (TYPE(inf) != T_ARRAY) continue; - *(key + idx) = (char)NUM2INT(RARRAY(inf)->ptr[0]); - *(type + idx) = (char)NUM2INT(RARRAY(inf)->ptr[1]); + *(key + real_len) = (char)NUM2INT(RARRAY(inf)->ptr[0]); + *(type + real_len) = (char)NUM2INT(RARRAY(inf)->ptr[1]); - *(ivar + idx) + *(ivar + real_len) = rb_intern( RSTRING( rb_str_cat2(rb_str_new2("@"), @@ -1075,9 +1089,11 @@ cbsubst_table_setup(self, key_inf, proc_inf) ); rb_attr(self, SYM2ID(RARRAY(inf)->ptr[2]), 1, 0, Qtrue); + real_len++; } - *(key + len) = '\0'; - *(type + len) = '\0'; + *(key + real_len) = '\0'; + *(type + real_len) = '\0'; + subst_inf->size = real_len; /* * procs : array of [type, proc] -- cgit v1.2.3