tk-win 0.2.0-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. data/.document +5 -0
  2. data/.gitignore +21 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +17 -0
  5. data/Rakefile +46 -0
  6. data/VERSION +1 -0
  7. data/lib/tcltk.rb +367 -0
  8. data/lib/tk.rb +5682 -0
  9. data/lib/tk/after.rb +6 -0
  10. data/lib/tk/autoload.rb +760 -0
  11. data/lib/tk/bgerror.rb +29 -0
  12. data/lib/tk/bindtag.rb +138 -0
  13. data/lib/tk/button.rb +31 -0
  14. data/lib/tk/canvas.rb +816 -0
  15. data/lib/tk/canvastag.rb +459 -0
  16. data/lib/tk/checkbutton.rb +32 -0
  17. data/lib/tk/clipboard.rb +75 -0
  18. data/lib/tk/clock.rb +71 -0
  19. data/lib/tk/composite.rb +484 -0
  20. data/lib/tk/console.rb +52 -0
  21. data/lib/tk/dialog.rb +326 -0
  22. data/lib/tk/encodedstr.rb +187 -0
  23. data/lib/tk/entry.rb +120 -0
  24. data/lib/tk/event.rb +562 -0
  25. data/lib/tk/font.rb +2351 -0
  26. data/lib/tk/frame.rb +132 -0
  27. data/lib/tk/grid.rb +279 -0
  28. data/lib/tk/image.rb +275 -0
  29. data/lib/tk/itemconfig.rb +1222 -0
  30. data/lib/tk/itemfont.rb +327 -0
  31. data/lib/tk/kinput.rb +71 -0
  32. data/lib/tk/label.rb +22 -0
  33. data/lib/tk/labelframe.rb +31 -0
  34. data/lib/tk/listbox.rb +284 -0
  35. data/lib/tk/macpkg.rb +80 -0
  36. data/lib/tk/menu.rb +718 -0
  37. data/lib/tk/menubar.rb +137 -0
  38. data/lib/tk/menuspec.rb +456 -0
  39. data/lib/tk/message.rb +24 -0
  40. data/lib/tk/mngfocus.rb +33 -0
  41. data/lib/tk/msgcat.rb +296 -0
  42. data/lib/tk/namespace.rb +551 -0
  43. data/lib/tk/optiondb.rb +377 -0
  44. data/lib/tk/optionobj.rb +212 -0
  45. data/lib/tk/pack.rb +107 -0
  46. data/lib/tk/package.rb +143 -0
  47. data/lib/tk/palette.rb +55 -0
  48. data/lib/tk/panedwindow.rb +260 -0
  49. data/lib/tk/place.rb +128 -0
  50. data/lib/tk/radiobutton.rb +73 -0
  51. data/lib/tk/root.rb +95 -0
  52. data/lib/tk/scale.rb +112 -0
  53. data/lib/tk/scrollable.rb +82 -0
  54. data/lib/tk/scrollbar.rb +183 -0
  55. data/lib/tk/scrollbox.rb +39 -0
  56. data/lib/tk/selection.rb +86 -0
  57. data/lib/tk/spinbox.rb +144 -0
  58. data/lib/tk/tagfont.rb +43 -0
  59. data/lib/tk/text.rb +1604 -0
  60. data/lib/tk/textimage.rb +88 -0
  61. data/lib/tk/textmark.rb +204 -0
  62. data/lib/tk/texttag.rb +321 -0
  63. data/lib/tk/textwindow.rb +154 -0
  64. data/lib/tk/timer.rb +669 -0
  65. data/lib/tk/toplevel.rb +264 -0
  66. data/lib/tk/ttk_selector.rb +98 -0
  67. data/lib/tk/txtwin_abst.rb +39 -0
  68. data/lib/tk/validation.rb +397 -0
  69. data/lib/tk/variable.rb +1799 -0
  70. data/lib/tk/virtevent.rb +139 -0
  71. data/lib/tk/winfo.rb +392 -0
  72. data/lib/tk/winpkg.rb +156 -0
  73. data/lib/tk/wm.rb +552 -0
  74. data/lib/tk/xim.rb +122 -0
  75. data/lib/tkafter.rb +4 -0
  76. data/lib/tkbgerror.rb +4 -0
  77. data/lib/tkcanvas.rb +4 -0
  78. data/lib/tkclass.rb +47 -0
  79. data/lib/tkconsole.rb +4 -0
  80. data/lib/tkdialog.rb +4 -0
  81. data/lib/tkentry.rb +4 -0
  82. data/lib/tkextlib/ICONS.rb +13 -0
  83. data/lib/tkextlib/ICONS/icons.rb +129 -0
  84. data/lib/tkextlib/ICONS/setup.rb +8 -0
  85. data/lib/tkextlib/SUPPORT_STATUS +198 -0
  86. data/lib/tkextlib/blt.rb +189 -0
  87. data/lib/tkextlib/blt/barchart.rb +79 -0
  88. data/lib/tkextlib/blt/bitmap.rb +112 -0
  89. data/lib/tkextlib/blt/busy.rb +83 -0
  90. data/lib/tkextlib/blt/component.rb +2218 -0
  91. data/lib/tkextlib/blt/container.rb +28 -0
  92. data/lib/tkextlib/blt/cutbuffer.rb +23 -0
  93. data/lib/tkextlib/blt/dragdrop.rb +269 -0
  94. data/lib/tkextlib/blt/eps.rb +32 -0
  95. data/lib/tkextlib/blt/graph.rb +67 -0
  96. data/lib/tkextlib/blt/htext.rb +112 -0
  97. data/lib/tkextlib/blt/setup.rb +8 -0
  98. data/lib/tkextlib/blt/spline.rb +23 -0
  99. data/lib/tkextlib/blt/stripchart.rb +74 -0
  100. data/lib/tkextlib/blt/table.rb +412 -0
  101. data/lib/tkextlib/blt/tabnotebook.rb +110 -0
  102. data/lib/tkextlib/blt/tabset.rb +504 -0
  103. data/lib/tkextlib/blt/ted.rb +68 -0
  104. data/lib/tkextlib/blt/tile.rb +25 -0
  105. data/lib/tkextlib/blt/tile/button.rb +16 -0
  106. data/lib/tkextlib/blt/tile/checkbutton.rb +17 -0
  107. data/lib/tkextlib/blt/tile/frame.rb +16 -0
  108. data/lib/tkextlib/blt/tile/label.rb +16 -0
  109. data/lib/tkextlib/blt/tile/radiobutton.rb +17 -0
  110. data/lib/tkextlib/blt/tile/scrollbar.rb +16 -0
  111. data/lib/tkextlib/blt/tile/toplevel.rb +16 -0
  112. data/lib/tkextlib/blt/tree.rb +1058 -0
  113. data/lib/tkextlib/blt/treeview.rb +1287 -0
  114. data/lib/tkextlib/blt/unix_dnd.rb +141 -0
  115. data/lib/tkextlib/blt/vector.rb +256 -0
  116. data/lib/tkextlib/blt/watch.rb +175 -0
  117. data/lib/tkextlib/blt/win_printer.rb +61 -0
  118. data/lib/tkextlib/blt/winop.rb +107 -0
  119. data/lib/tkextlib/bwidget.rb +153 -0
  120. data/lib/tkextlib/bwidget/arrowbutton.rb +21 -0
  121. data/lib/tkextlib/bwidget/bitmap.rb +21 -0
  122. data/lib/tkextlib/bwidget/button.rb +31 -0
  123. data/lib/tkextlib/bwidget/buttonbox.rb +90 -0
  124. data/lib/tkextlib/bwidget/combobox.rb +62 -0
  125. data/lib/tkextlib/bwidget/dialog.rb +194 -0
  126. data/lib/tkextlib/bwidget/dragsite.rb +31 -0
  127. data/lib/tkextlib/bwidget/dropsite.rb +39 -0
  128. data/lib/tkextlib/bwidget/dynamichelp.rb +63 -0
  129. data/lib/tkextlib/bwidget/entry.rb +43 -0
  130. data/lib/tkextlib/bwidget/label.rb +41 -0
  131. data/lib/tkextlib/bwidget/labelentry.rb +80 -0
  132. data/lib/tkextlib/bwidget/labelframe.rb +52 -0
  133. data/lib/tkextlib/bwidget/listbox.rb +361 -0
  134. data/lib/tkextlib/bwidget/mainframe.rb +132 -0
  135. data/lib/tkextlib/bwidget/messagedlg.rb +192 -0
  136. data/lib/tkextlib/bwidget/notebook.rb +166 -0
  137. data/lib/tkextlib/bwidget/pagesmanager.rb +73 -0
  138. data/lib/tkextlib/bwidget/panedwindow.rb +42 -0
  139. data/lib/tkextlib/bwidget/panelframe.rb +67 -0
  140. data/lib/tkextlib/bwidget/passwddlg.rb +44 -0
  141. data/lib/tkextlib/bwidget/progressbar.rb +20 -0
  142. data/lib/tkextlib/bwidget/progressdlg.rb +58 -0
  143. data/lib/tkextlib/bwidget/scrollableframe.rb +40 -0
  144. data/lib/tkextlib/bwidget/scrolledwindow.rb +48 -0
  145. data/lib/tkextlib/bwidget/scrollview.rb +25 -0
  146. data/lib/tkextlib/bwidget/selectcolor.rb +73 -0
  147. data/lib/tkextlib/bwidget/selectfont.rb +91 -0
  148. data/lib/tkextlib/bwidget/separator.rb +20 -0
  149. data/lib/tkextlib/bwidget/setup.rb +8 -0
  150. data/lib/tkextlib/bwidget/spinbox.rb +98 -0
  151. data/lib/tkextlib/bwidget/statusbar.rb +62 -0
  152. data/lib/tkextlib/bwidget/titleframe.rb +33 -0
  153. data/lib/tkextlib/bwidget/tree.rb +500 -0
  154. data/lib/tkextlib/bwidget/widget.rb +129 -0
  155. data/lib/tkextlib/itcl.rb +13 -0
  156. data/lib/tkextlib/itcl/incr_tcl.rb +178 -0
  157. data/lib/tkextlib/itcl/setup.rb +13 -0
  158. data/lib/tkextlib/itk.rb +13 -0
  159. data/lib/tkextlib/itk/incr_tk.rb +446 -0
  160. data/lib/tkextlib/itk/setup.rb +13 -0
  161. data/lib/tkextlib/iwidgets.rb +94 -0
  162. data/lib/tkextlib/iwidgets/buttonbox.rb +121 -0
  163. data/lib/tkextlib/iwidgets/calendar.rb +125 -0
  164. data/lib/tkextlib/iwidgets/canvasprintbox.rb +53 -0
  165. data/lib/tkextlib/iwidgets/canvasprintdialog.rb +38 -0
  166. data/lib/tkextlib/iwidgets/checkbox.rb +130 -0
  167. data/lib/tkextlib/iwidgets/combobox.rb +104 -0
  168. data/lib/tkextlib/iwidgets/dateentry.rb +20 -0
  169. data/lib/tkextlib/iwidgets/datefield.rb +58 -0
  170. data/lib/tkextlib/iwidgets/dialog.rb +20 -0
  171. data/lib/tkextlib/iwidgets/dialogshell.rb +121 -0
  172. data/lib/tkextlib/iwidgets/disjointlistbox.rb +50 -0
  173. data/lib/tkextlib/iwidgets/entryfield.rb +185 -0
  174. data/lib/tkextlib/iwidgets/extbutton.rb +40 -0
  175. data/lib/tkextlib/iwidgets/extfileselectionbox.rb +46 -0
  176. data/lib/tkextlib/iwidgets/extfileselectiondialog.rb +33 -0
  177. data/lib/tkextlib/iwidgets/feedback.rb +35 -0
  178. data/lib/tkextlib/iwidgets/fileselectionbox.rb +46 -0
  179. data/lib/tkextlib/iwidgets/fileselectiondialog.rb +33 -0
  180. data/lib/tkextlib/iwidgets/finddialog.rb +42 -0
  181. data/lib/tkextlib/iwidgets/hierarchy.rb +365 -0
  182. data/lib/tkextlib/iwidgets/hyperhelp.rb +50 -0
  183. data/lib/tkextlib/iwidgets/labeledframe.rb +39 -0
  184. data/lib/tkextlib/iwidgets/labeledwidget.rb +45 -0
  185. data/lib/tkextlib/iwidgets/mainwindow.rb +67 -0
  186. data/lib/tkextlib/iwidgets/menubar.rb +212 -0
  187. data/lib/tkextlib/iwidgets/messagebox.rb +93 -0
  188. data/lib/tkextlib/iwidgets/messagedialog.rb +20 -0
  189. data/lib/tkextlib/iwidgets/notebook.rb +175 -0
  190. data/lib/tkextlib/iwidgets/optionmenu.rb +92 -0
  191. data/lib/tkextlib/iwidgets/panedwindow.rb +134 -0
  192. data/lib/tkextlib/iwidgets/promptdialog.rb +131 -0
  193. data/lib/tkextlib/iwidgets/pushbutton.rb +35 -0
  194. data/lib/tkextlib/iwidgets/radiobox.rb +121 -0
  195. data/lib/tkextlib/iwidgets/scopedobject.rb +24 -0
  196. data/lib/tkextlib/iwidgets/scrolledcanvas.rb +353 -0
  197. data/lib/tkextlib/iwidgets/scrolledframe.rb +59 -0
  198. data/lib/tkextlib/iwidgets/scrolledhtml.rb +58 -0
  199. data/lib/tkextlib/iwidgets/scrolledlistbox.rb +207 -0
  200. data/lib/tkextlib/iwidgets/scrolledtext.rb +568 -0
  201. data/lib/tkextlib/iwidgets/scrolledwidget.rb +20 -0
  202. data/lib/tkextlib/iwidgets/selectionbox.rb +102 -0
  203. data/lib/tkextlib/iwidgets/selectiondialog.rb +92 -0
  204. data/lib/tkextlib/iwidgets/setup.rb +8 -0
  205. data/lib/tkextlib/iwidgets/shell.rb +38 -0
  206. data/lib/tkextlib/iwidgets/spindate.rb +48 -0
  207. data/lib/tkextlib/iwidgets/spinint.rb +30 -0
  208. data/lib/tkextlib/iwidgets/spinner.rb +169 -0
  209. data/lib/tkextlib/iwidgets/spintime.rb +48 -0
  210. data/lib/tkextlib/iwidgets/tabnotebook.rb +181 -0
  211. data/lib/tkextlib/iwidgets/tabset.rb +145 -0
  212. data/lib/tkextlib/iwidgets/timeentry.rb +25 -0
  213. data/lib/tkextlib/iwidgets/timefield.rb +58 -0
  214. data/lib/tkextlib/iwidgets/toolbar.rb +112 -0
  215. data/lib/tkextlib/iwidgets/watch.rb +56 -0
  216. data/lib/tkextlib/pkg_checker.rb +184 -0
  217. data/lib/tkextlib/setup.rb +8 -0
  218. data/lib/tkextlib/tcllib.rb +105 -0
  219. data/lib/tkextlib/tcllib/autoscroll.rb +158 -0
  220. data/lib/tkextlib/tcllib/ctext.rb +160 -0
  221. data/lib/tkextlib/tcllib/cursor.rb +97 -0
  222. data/lib/tkextlib/tcllib/datefield.rb +57 -0
  223. data/lib/tkextlib/tcllib/dialog.rb +84 -0
  224. data/lib/tkextlib/tcllib/getstring.rb +134 -0
  225. data/lib/tkextlib/tcllib/history.rb +73 -0
  226. data/lib/tkextlib/tcllib/ico.rb +146 -0
  227. data/lib/tkextlib/tcllib/ip_entry.rb +75 -0
  228. data/lib/tkextlib/tcllib/panelframe.rb +78 -0
  229. data/lib/tkextlib/tcllib/plotchart.rb +1404 -0
  230. data/lib/tkextlib/tcllib/ruler.rb +65 -0
  231. data/lib/tkextlib/tcllib/screenruler.rb +68 -0
  232. data/lib/tkextlib/tcllib/scrollwin.rb +61 -0
  233. data/lib/tkextlib/tcllib/setup.rb +8 -0
  234. data/lib/tkextlib/tcllib/style.rb +61 -0
  235. data/lib/tkextlib/tcllib/superframe.rb +51 -0
  236. data/lib/tkextlib/tcllib/swaplist.rb +150 -0
  237. data/lib/tkextlib/tcllib/tablelist.rb +28 -0
  238. data/lib/tkextlib/tcllib/tablelist_core.rb +1072 -0
  239. data/lib/tkextlib/tcllib/tablelist_tile.rb +43 -0
  240. data/lib/tkextlib/tcllib/tkpiechart.rb +314 -0
  241. data/lib/tkextlib/tcllib/tooltip.rb +104 -0
  242. data/lib/tkextlib/tcllib/widget.rb +82 -0
  243. data/lib/tkextlib/tclx.rb +13 -0
  244. data/lib/tkextlib/tclx/setup.rb +8 -0
  245. data/lib/tkextlib/tclx/tclx.rb +74 -0
  246. data/lib/tkextlib/tile.rb +449 -0
  247. data/lib/tkextlib/tile/dialog.rb +102 -0
  248. data/lib/tkextlib/tile/setup.rb +8 -0
  249. data/lib/tkextlib/tile/sizegrip.rb +32 -0
  250. data/lib/tkextlib/tile/style.rb +336 -0
  251. data/lib/tkextlib/tile/tbutton.rb +34 -0
  252. data/lib/tkextlib/tile/tcheckbutton.rb +38 -0
  253. data/lib/tkextlib/tile/tcombobox.rb +55 -0
  254. data/lib/tkextlib/tile/tentry.rb +49 -0
  255. data/lib/tkextlib/tile/tframe.rb +34 -0
  256. data/lib/tkextlib/tile/tlabel.rb +34 -0
  257. data/lib/tkextlib/tile/tlabelframe.rb +38 -0
  258. data/lib/tkextlib/tile/tmenubutton.rb +38 -0
  259. data/lib/tkextlib/tile/tnotebook.rb +147 -0
  260. data/lib/tkextlib/tile/tpaned.rb +245 -0
  261. data/lib/tkextlib/tile/tprogressbar.rb +57 -0
  262. data/lib/tkextlib/tile/tradiobutton.rb +38 -0
  263. data/lib/tkextlib/tile/treeview.rb +1306 -0
  264. data/lib/tkextlib/tile/tscale.rb +56 -0
  265. data/lib/tkextlib/tile/tscrollbar.rb +63 -0
  266. data/lib/tkextlib/tile/tseparator.rb +34 -0
  267. data/lib/tkextlib/tile/tsquare.rb +30 -0
  268. data/lib/tkextlib/tkDND.rb +18 -0
  269. data/lib/tkextlib/tkDND/setup.rb +8 -0
  270. data/lib/tkextlib/tkDND/shape.rb +125 -0
  271. data/lib/tkextlib/tkDND/tkdnd.rb +182 -0
  272. data/lib/tkextlib/tkHTML.rb +13 -0
  273. data/lib/tkextlib/tkHTML/htmlwidget.rb +453 -0
  274. data/lib/tkextlib/tkHTML/setup.rb +8 -0
  275. data/lib/tkextlib/tkimg.rb +36 -0
  276. data/lib/tkextlib/tkimg/bmp.rb +33 -0
  277. data/lib/tkextlib/tkimg/gif.rb +33 -0
  278. data/lib/tkextlib/tkimg/ico.rb +33 -0
  279. data/lib/tkextlib/tkimg/jpeg.rb +33 -0
  280. data/lib/tkextlib/tkimg/pcx.rb +33 -0
  281. data/lib/tkextlib/tkimg/pixmap.rb +44 -0
  282. data/lib/tkextlib/tkimg/png.rb +33 -0
  283. data/lib/tkextlib/tkimg/ppm.rb +33 -0
  284. data/lib/tkextlib/tkimg/ps.rb +33 -0
  285. data/lib/tkextlib/tkimg/setup.rb +8 -0
  286. data/lib/tkextlib/tkimg/sgi.rb +33 -0
  287. data/lib/tkextlib/tkimg/sun.rb +33 -0
  288. data/lib/tkextlib/tkimg/tga.rb +33 -0
  289. data/lib/tkextlib/tkimg/tiff.rb +33 -0
  290. data/lib/tkextlib/tkimg/window.rb +33 -0
  291. data/lib/tkextlib/tkimg/xbm.rb +33 -0
  292. data/lib/tkextlib/tkimg/xpm.rb +33 -0
  293. data/lib/tkextlib/tktable.rb +14 -0
  294. data/lib/tkextlib/tktable/setup.rb +8 -0
  295. data/lib/tkextlib/tktable/tktable.rb +966 -0
  296. data/lib/tkextlib/tktrans.rb +14 -0
  297. data/lib/tkextlib/tktrans/setup.rb +8 -0
  298. data/lib/tkextlib/tktrans/tktrans.rb +64 -0
  299. data/lib/tkextlib/treectrl.rb +13 -0
  300. data/lib/tkextlib/treectrl/setup.rb +8 -0
  301. data/lib/tkextlib/treectrl/tktreectrl.rb +2522 -0
  302. data/lib/tkextlib/trofs.rb +13 -0
  303. data/lib/tkextlib/trofs/setup.rb +8 -0
  304. data/lib/tkextlib/trofs/trofs.rb +51 -0
  305. data/lib/tkextlib/version.rb +6 -0
  306. data/lib/tkextlib/vu.rb +48 -0
  307. data/lib/tkextlib/vu/bargraph.rb +61 -0
  308. data/lib/tkextlib/vu/charts.rb +53 -0
  309. data/lib/tkextlib/vu/dial.rb +102 -0
  310. data/lib/tkextlib/vu/pie.rb +286 -0
  311. data/lib/tkextlib/vu/setup.rb +8 -0
  312. data/lib/tkextlib/vu/spinbox.rb +22 -0
  313. data/lib/tkextlib/winico.rb +14 -0
  314. data/lib/tkextlib/winico/setup.rb +8 -0
  315. data/lib/tkextlib/winico/winico.rb +224 -0
  316. data/lib/tkfont.rb +4 -0
  317. data/lib/tkmacpkg.rb +4 -0
  318. data/lib/tkmenubar.rb +4 -0
  319. data/lib/tkmngfocus.rb +4 -0
  320. data/lib/tkpalette.rb +4 -0
  321. data/lib/tkscrollbox.rb +4 -0
  322. data/lib/tktext.rb +4 -0
  323. data/lib/tkvirtevent.rb +4 -0
  324. data/lib/tkwinpkg.rb +4 -0
  325. data/spec/spec.opts +1 -0
  326. data/spec/spec_helper.rb +9 -0
  327. data/spec/tk-win_spec.rb +7 -0
  328. data/tk-win.gemspec +373 -0
  329. metadata +412 -0
@@ -0,0 +1,154 @@
1
+ #
2
+ # tk/textwindow.rb - treat Tk text window object
3
+ #
4
+ require 'tk'
5
+ require 'tk/text'
6
+
7
+ class TkTextWindow<TkObject
8
+ include Tk::Text::IndexModMethods
9
+
10
+ def initialize(parent, index, keys = {})
11
+ #unless parent.kind_of?(Tk::Text)
12
+ # fail ArgumentError, "expect Tk::Text for 1st argument"
13
+ #end
14
+ @t = parent
15
+ if index == 'end' || index == :end
16
+ @path = TkTextMark.new(@t, tk_call_without_enc(@t.path, 'index',
17
+ 'end - 1 chars'))
18
+ elsif index.kind_of?(TkTextMark)
19
+ if tk_call_without_enc(@t.path,'index',index.path) == tk_call_without_enc(@t.path,'index','end')
20
+ @path = TkTextMark.new(@t, tk_call_without_enc(@t.path, 'index',
21
+ 'end - 1 chars'))
22
+ else
23
+ @path = TkTextMark.new(@t, tk_call_without_enc(@t.path, 'index',
24
+ index.path))
25
+ end
26
+ else
27
+ @path = TkTextMark.new(@t, tk_call_without_enc(@t.path, 'index', _get_eval_enc_str(index)))
28
+ end
29
+ @path.gravity = 'left'
30
+ @index = @path.path
31
+ keys = _symbolkey2str(keys)
32
+ @id = keys['window']
33
+ # keys['window'] = @id.epath if @id.kind_of?(TkWindow)
34
+ keys['window'] = _epath(@id) if @id
35
+ if keys['create']
36
+ @p_create = keys['create']
37
+ # if @p_create.kind_of?(Proc)
38
+ if TkComm._callback_entry?(@p_create)
39
+ =begin
40
+ keys['create'] = install_cmd(proc{
41
+ @id = @p_create.call
42
+ if @id.kind_of?(TkWindow)
43
+ @id.epath
44
+ else
45
+ @id
46
+ end
47
+ })
48
+ =end
49
+ keys['create'] = install_cmd(proc{@id = @p_create.call; _epath(@id)})
50
+ end
51
+ end
52
+ tk_call_without_enc(@t.path, 'window', 'create', @index,
53
+ *hash_kv(keys, true))
54
+ @path.gravity = 'right'
55
+ end
56
+
57
+ def id
58
+ Tk::Text::IndexString.new(_epath(@id))
59
+ end
60
+ def mark
61
+ @path
62
+ end
63
+
64
+ def [](slot)
65
+ cget(slot)
66
+ end
67
+ def []=(slot, value)
68
+ configure(slot, value)
69
+ value
70
+ end
71
+
72
+ def cget(slot)
73
+ @t.window_cget(@index, slot)
74
+ end
75
+ def cget_strict(slot)
76
+ @t.window_cget_strict(@index, slot)
77
+ end
78
+
79
+ def configure(slot, value=None)
80
+ if slot.kind_of?(Hash)
81
+ slot = _symbolkey2str(slot)
82
+ if slot['window']
83
+ @id = slot['window']
84
+ # slot['window'] = @id.epath if @id.kind_of?(TkWindow)
85
+ slot['window'] = _epath(@id) if @id
86
+ end
87
+ if slot['create']
88
+ self.create=slot.delete('create')
89
+ end
90
+ if slot.size > 0
91
+ tk_call_without_enc(@t.path, 'window', 'configure', @index,
92
+ *hash_kv(slot, true))
93
+ end
94
+ else
95
+ if slot == 'window' || slot == :window
96
+ @id = value
97
+ # value = @id.epath if @id.kind_of?(TkWindow)
98
+ value = _epath(@id) if @id
99
+ end
100
+ if slot == 'create' || slot == :create
101
+ self.create=value
102
+ else
103
+ tk_call_without_enc(@t.path, 'window', 'configure', @index,
104
+ "-#{slot}", _get_eval_enc_str(value))
105
+ end
106
+ end
107
+ self
108
+ end
109
+
110
+ def configinfo(slot = nil)
111
+ @t.window_configinfo(@index, slot)
112
+ end
113
+
114
+ def current_configinfo(slot = nil)
115
+ @t.current_window_configinfo(@index, slot)
116
+ end
117
+
118
+ def window
119
+ @id
120
+ end
121
+
122
+ def window=(value)
123
+ @id = value
124
+ # value = @id.epath if @id.kind_of?(TkWindow)
125
+ value = _epath(@id) if @id
126
+ tk_call_without_enc(@t.path, 'window', 'configure', @index,
127
+ '-window', _get_eval_enc_str(value))
128
+ value
129
+ end
130
+
131
+ def create
132
+ @p_create
133
+ end
134
+
135
+ def create=(value)
136
+ @p_create = value
137
+ # if @p_create.kind_of?(Proc)
138
+ if TkComm._callback_entry?(@p_create)
139
+ value = install_cmd(proc{
140
+ @id = @p_create.call
141
+ if @id.kind_of?(TkWindow)
142
+ @id.epath
143
+ else
144
+ @id
145
+ end
146
+ })
147
+ end
148
+ tk_call_without_enc(@t.path, 'window', 'configure', @index,
149
+ '-create', _get_eval_enc_str(value))
150
+ value
151
+ end
152
+ end
153
+
154
+ TktWindow = TkTextWindow
@@ -0,0 +1,669 @@
1
+ #
2
+ # tk/timer.rb : methods for Tcl/Tk after command
3
+ #
4
+ # $Id: timer.rb 25189 2009-10-02 12:04:37Z akr $
5
+ #
6
+ require 'tk'
7
+
8
+ class TkTimer
9
+ include TkCore
10
+ extend TkCore
11
+
12
+ TkCommandNames = ['after'.freeze].freeze
13
+
14
+ (Tk_CBID = ['a'.freeze, TkUtil.untrust('00000')]).instance_eval{
15
+ @mutex = Mutex.new
16
+ def mutex; @mutex; end
17
+ freeze
18
+ }
19
+
20
+ Tk_CBTBL = TkUtil.untrust({})
21
+
22
+ TkCore::INTERP.add_tk_procs('rb_after', 'id', <<-'EOL')
23
+ if {[set st [catch {eval {ruby_cmd TkTimer callback} $id} ret]] != 0} {
24
+ return -code $st $ret
25
+ } {
26
+ return $ret
27
+ }
28
+ EOL
29
+
30
+ DEFAULT_IGNORE_EXCEPTIONS = [ NameError, RuntimeError ].freeze
31
+
32
+ ###############################
33
+ # class methods
34
+ ###############################
35
+ def self.start(*args, &b)
36
+ self.new(*args, &b).start
37
+ end
38
+
39
+ def self.callback(obj_id)
40
+ ex_obj = Tk_CBTBL[obj_id]
41
+ return "" if ex_obj == nil; # canceled
42
+ ex_obj.cb_call
43
+ end
44
+
45
+ def self.info(obj = nil)
46
+ if obj
47
+ if obj.kind_of?(TkTimer)
48
+ if obj.after_id
49
+ inf = tk_split_list(tk_call_without_enc('after','info',obj.after_id))
50
+ [Tk_CBTBL[inf[0][1]], inf[1]]
51
+ else
52
+ nil
53
+ end
54
+ else
55
+ fail ArgumentError, "TkTimer object is expected"
56
+ end
57
+ else
58
+ tk_call_without_enc('after', 'info').split(' ').collect!{|id|
59
+ ret = Tk_CBTBL.find{|key,val| val.after_id == id}
60
+ (ret == nil)? id: ret[1]
61
+ }
62
+ end
63
+ end
64
+
65
+
66
+ ###############################
67
+ # instance methods
68
+ ###############################
69
+ def do_callback
70
+ @in_callback = true
71
+ @after_id = nil
72
+ begin
73
+ @return_value = @current_proc.call(self)
74
+ rescue SystemExit
75
+ exit(0)
76
+ rescue Interrupt
77
+ exit!(1)
78
+ rescue Exception => e
79
+ if @cancel_on_exception &&
80
+ @cancel_on_exception.find{|exc| e.kind_of?(exc)}
81
+ cancel
82
+ @return_value = e
83
+ @in_callback = false
84
+ return e
85
+ else
86
+ fail e
87
+ end
88
+ end
89
+ if @set_next
90
+ set_next_callback(@current_args)
91
+ else
92
+ @set_next = true
93
+ end
94
+ @in_callback = false
95
+ @return_value
96
+ end
97
+
98
+ def set_callback(sleep, args=nil)
99
+ if TkCore::INTERP.deleted?
100
+ self.cancel
101
+ return self
102
+ end
103
+ @after_script = "rb_after #{@id}"
104
+ @current_args = args
105
+ @current_script = [sleep, @after_script]
106
+ @after_id = tk_call_without_enc('after', sleep, @after_script)
107
+ self
108
+ end
109
+
110
+ def set_next_callback(args)
111
+ if @running == false || @proc_max == 0 || @do_loop == 0
112
+ Tk_CBTBL.delete(@id) ;# for GC
113
+ @running = false
114
+ # @wait_var.value = 0
115
+ __at_end__
116
+ return
117
+ end
118
+ if @current_pos >= @proc_max
119
+ if @do_loop < 0 || (@do_loop -= 1) > 0
120
+ @current_pos = 0
121
+ else
122
+ Tk_CBTBL.delete(@id) ;# for GC
123
+ @running = false
124
+ # @wait_var.value = 0
125
+ __at_end__
126
+ return
127
+ end
128
+ end
129
+
130
+ @current_args = args
131
+
132
+ # if @sleep_time.kind_of?(Proc)
133
+ if TkComm._callback_entry?(@sleep_time)
134
+ sleep = @sleep_time.call(self)
135
+ else
136
+ sleep = @sleep_time
137
+ end
138
+ @current_sleep = sleep
139
+
140
+ cmd, *cmd_args = @loop_proc[@current_pos]
141
+ @current_pos += 1
142
+ @current_proc = cmd
143
+
144
+ set_callback(sleep, cmd_args)
145
+ end
146
+
147
+ def initialize(*args, &b)
148
+ Tk_CBID.mutex.synchronize{
149
+ # @id = Tk_CBID.join('')
150
+ @id = Tk_CBID.join(TkCore::INTERP._ip_id_)
151
+ Tk_CBID[1].succ!
152
+ }
153
+
154
+ @wait_var = TkVariable.new(0)
155
+
156
+ @at_end_proc = nil
157
+
158
+ @cb_cmd = TkCore::INTERP.get_cb_entry(self.method(:do_callback))
159
+
160
+ @set_next = true
161
+
162
+ @init_sleep = 0
163
+ @init_proc = nil
164
+ @init_args = []
165
+
166
+ @current_script = []
167
+ @current_proc = nil
168
+ @current_args = nil
169
+ @return_value = nil
170
+
171
+ @sleep_time = 0
172
+ @current_sleep = 0
173
+ @loop_exec = 0
174
+ @do_loop = 0
175
+ @loop_proc = []
176
+ @proc_max = 0
177
+ @current_pos = 0
178
+
179
+ @after_id = nil
180
+ @after_script = nil
181
+
182
+ @cancel_on_exception = DEFAULT_IGNORE_EXCEPTIONS
183
+ # Unless @cancel_on_exception, Ruby/Tk shows an error dialog box when
184
+ # an excepsion is raised on TkTimer callback procedure.
185
+ # If @cancel_on_exception is an array of exception classes and the raised
186
+ # exception is included in the array, Ruby/Tk cancels executing TkTimer
187
+ # callback procedures silently (TkTimer#cancel is called and no dialog is
188
+ # shown).
189
+
190
+ if b
191
+ case args.size
192
+ when 0
193
+ add_procs(b)
194
+ when 1
195
+ args << -1 << b
196
+ else
197
+ args << b
198
+ end
199
+ end
200
+
201
+ set_procs(*args) if args != []
202
+
203
+ @running = false
204
+ @in_callback = false
205
+ end
206
+
207
+ attr :after_id
208
+ attr :after_script
209
+ attr :current_proc
210
+ attr :current_args
211
+ attr :current_sleep
212
+ alias :current_interval :current_sleep
213
+ attr :return_value
214
+
215
+ attr_accessor :loop_exec
216
+
217
+ def __at_end__
218
+ @at_end_proc.call(self) if @at_end_proc
219
+ @wait_var.value = 0 # for wait
220
+ end
221
+ private :__at_end__
222
+
223
+ def cb_call
224
+ @cb_cmd.call
225
+ end
226
+
227
+ def get_procs
228
+ [@init_sleep, @init_proc, @init_args, @sleep_time, @loop_exec, @loop_proc]
229
+ end
230
+
231
+ def current_status
232
+ [@running, @current_sleep, @current_proc, @current_args,
233
+ @do_loop, @cancel_on_exception]
234
+ end
235
+
236
+ def cancel_on_exception?
237
+ @cancel_on_exception
238
+ end
239
+
240
+ def cancel_on_exception=(mode)
241
+ if mode.kind_of?(Array)
242
+ @cancel_on_exception = mode
243
+ elsif mode
244
+ @cancel_on_exception = DEFAULT_IGNORE_EXCEPTIONS
245
+ else
246
+ @cancel_on_exception = false
247
+ end
248
+ #self
249
+ end
250
+
251
+ def running?
252
+ @running
253
+ end
254
+
255
+ def loop_rest
256
+ @do_loop
257
+ end
258
+
259
+ def loop_rest=(rest)
260
+ @do_loop = rest
261
+ #self
262
+ end
263
+
264
+ def set_interval(interval)
265
+ #if interval != 'idle' && interval != :idle \
266
+ # && !interval.kind_of?(Integer) && !interval.kind_of?(Proc)
267
+ if interval != 'idle' && interval != :idle \
268
+ && !interval.kind_of?(Integer) && !TkComm._callback_entry?(interval)
269
+ fail ArgumentError, "expect Integer or Proc"
270
+ end
271
+ @sleep_time = interval
272
+ end
273
+
274
+ def set_procs(interval, loop_exec, *procs)
275
+ #if interval != 'idle' && interval != :idle \
276
+ # && !interval.kind_of?(Integer) && !interval.kind_of?(Proc)
277
+ if interval != 'idle' && interval != :idle \
278
+ && !interval.kind_of?(Integer) && !TkComm._callback_entry?(interval)
279
+ fail ArgumentError, "expect Integer or Proc for 1st argument"
280
+ end
281
+ @sleep_time = interval
282
+
283
+ @loop_proc = []
284
+ procs.each{|e|
285
+ # if e.kind_of?(Proc)
286
+ if TkComm._callback_entry?(e)
287
+ @loop_proc.push([e])
288
+ else
289
+ @loop_proc.push(e)
290
+ end
291
+ }
292
+ @proc_max = @loop_proc.size
293
+ @current_pos = 0
294
+
295
+ if loop_exec.kind_of?(Integer) && loop_exec < 0
296
+ @loop_exec = -1
297
+ elsif loop_exec == true
298
+ @loop_exec = -1
299
+ elsif loop_exec == nil || loop_exec == false || loop_exec == 0
300
+ @loop_exec = 0
301
+ else
302
+ if not loop_exec.kind_of?(Integer)
303
+ fail ArgumentError, "expect Integer for 2nd argument"
304
+ end
305
+ @loop_exec = loop_exec
306
+ end
307
+ @do_loop = @loop_exec
308
+
309
+ self
310
+ end
311
+
312
+ def add_procs(*procs)
313
+ procs.each{|e|
314
+ # if e.kind_of?(Proc)
315
+ if TkComm._callback_entry?(e)
316
+ @loop_proc.push([e])
317
+ else
318
+ @loop_proc.push(e)
319
+ end
320
+ }
321
+ @proc_max = @loop_proc.size
322
+
323
+ self
324
+ end
325
+
326
+ def delete_procs(*procs)
327
+ procs.each{|e|
328
+ # if e.kind_of?(Proc)
329
+ if TkComm._callback_entry?(e)
330
+ @loop_proc.delete([e])
331
+ else
332
+ @loop_proc.delete(e)
333
+ end
334
+ }
335
+ @proc_max = @loop_proc.size
336
+
337
+ cancel if @proc_max == 0
338
+
339
+ self
340
+ end
341
+
342
+ def delete_at(n)
343
+ @loop_proc.delete_at(n)
344
+ @proc_max = @loop_proc.size
345
+ cancel if @proc_max == 0
346
+ self
347
+ end
348
+
349
+ def set_start_proc(sleep=nil, init_proc=nil, *init_args, &b)
350
+ # set parameters for 'restart'
351
+ sleep = @init_sleep unless sleep
352
+
353
+ if sleep != 'idle' && sleep != :idle && !sleep.kind_of?(Integer)
354
+ fail ArgumentError, "expect Integer or 'idle' for 1st argument"
355
+ end
356
+
357
+ @init_sleep = sleep
358
+ @init_proc = init_proc
359
+ @init_args = init_args
360
+
361
+ @init_proc = b if !@init_proc && b
362
+ @init_proc = proc{|*args| } if @init_sleep > 0 && !@init_proc
363
+
364
+ self
365
+ end
366
+
367
+ def start(*init_args, &b)
368
+ return nil if @running
369
+
370
+ Tk_CBTBL[@id] = self
371
+ @do_loop = @loop_exec
372
+ @current_pos = 0
373
+ @return_value = nil
374
+ @after_id = nil
375
+
376
+ @init_sleep = 0
377
+ @init_proc = nil
378
+ @init_args = nil
379
+
380
+ argc = init_args.size
381
+ if argc > 0
382
+ sleep = init_args.shift
383
+ if sleep != 'idle' && sleep != :idle && !sleep.kind_of?(Integer)
384
+ fail ArgumentError, "expect Integer or 'idle' for 1st argument"
385
+ end
386
+ @init_sleep = sleep
387
+ end
388
+ @init_proc = init_args.shift if argc > 1
389
+ @init_args = init_args if argc > 2
390
+
391
+ @init_proc = b if !@init_proc && b
392
+ @init_proc = proc{|*args| } if @init_sleep > 0 && !@init_proc
393
+
394
+ @current_sleep = @init_sleep
395
+ @running = true
396
+ if @init_proc
397
+ # if not @init_proc.kind_of?(Proc)
398
+ if !TkComm._callback_entry?(@init_proc)
399
+ fail ArgumentError, "Argument '#{@init_proc}' need to be Proc"
400
+ end
401
+ @current_proc = @init_proc
402
+ set_callback(@init_sleep, @init_args)
403
+ @set_next = false if @in_callback
404
+ else
405
+ set_next_callback(@init_args)
406
+ end
407
+
408
+ self
409
+ end
410
+
411
+ def reset(*reset_args)
412
+ restart() if @running
413
+
414
+ if @init_proc
415
+ @return_value = @init_proc.call(self)
416
+ else
417
+ @return_value = nil
418
+ end
419
+
420
+ @current_pos = 0
421
+ @current_args = @init_args
422
+ @current_script = []
423
+
424
+ @set_next = false if @in_callback
425
+
426
+ self
427
+ end
428
+
429
+ def restart(*restart_args, &b)
430
+ cancel if @running
431
+ if restart_args.empty? && !b
432
+ start(@init_sleep, @init_proc, *@init_args)
433
+ else
434
+ start(*restart_args, &b)
435
+ end
436
+ end
437
+
438
+ def cancel
439
+ @running = false
440
+ # @wait_var.value = 0
441
+ __at_end__
442
+ tk_call 'after', 'cancel', @after_id if @after_id
443
+ @after_id = nil
444
+
445
+ Tk_CBTBL.delete(@id) ;# for GC
446
+ self
447
+ end
448
+ alias stop cancel
449
+
450
+ def continue(wait=nil)
451
+ fail RuntimeError, "is already running" if @running
452
+ return restart() if @current_script.empty?
453
+ sleep, cmd = @current_script
454
+ fail RuntimeError, "no procedure to continue" unless cmd
455
+ if wait
456
+ unless wait.kind_of?(Integer)
457
+ fail ArgumentError, "expect Integer for 1st argument"
458
+ end
459
+ sleep = wait
460
+ end
461
+ Tk_CBTBL[@id] = self
462
+ @running = true
463
+ @after_id = tk_call_without_enc('after', sleep, cmd)
464
+ self
465
+ end
466
+
467
+ def skip
468
+ fail RuntimeError, "is not running now" unless @running
469
+ cancel
470
+ Tk_CBTBL[@id] = self
471
+ @running = true
472
+ set_next_callback(@current_args)
473
+ self
474
+ end
475
+
476
+ def info
477
+ if @after_id
478
+ inf = tk_split_list(tk_call_without_enc('after', 'info', @after_id))
479
+ [Tk_CBTBL[inf[0][1]], inf[1]]
480
+ else
481
+ nil
482
+ end
483
+ end
484
+
485
+ def at_end(*arg, &b)
486
+ if arg.empty?
487
+ if b
488
+ @at_end_proc = b
489
+ else
490
+ # no proc
491
+ return @at_end_proc
492
+ end
493
+ else
494
+ fail ArgumentError, "wrong number of arguments" if arg.length != 1 || b
495
+ @at_end_proc = arg[0]
496
+ end
497
+ self
498
+ end
499
+
500
+ def wait(on_thread = true, check_root = false)
501
+ if $SAFE >= 4
502
+ fail SecurityError, "can't wait timer at $SAFE >= 4"
503
+ end
504
+
505
+ unless @running
506
+ if @return_value.kind_of?(Exception)
507
+ fail @return_value
508
+ else
509
+ return @return_value
510
+ end
511
+ end
512
+
513
+ @wait_var.wait(on_thread, check_root)
514
+ if @return_value.kind_of?(Exception)
515
+ fail @return_value
516
+ else
517
+ @return_value
518
+ end
519
+ end
520
+ def eventloop_wait(check_root = false)
521
+ wait(false, check_root)
522
+ end
523
+ def thread_wait(check_root = false)
524
+ wait(true, check_root)
525
+ end
526
+ def tkwait(on_thread = true)
527
+ wait(on_thread, true)
528
+ end
529
+ def eventloop_tkwait
530
+ wait(false, true)
531
+ end
532
+ def thread_tkwait
533
+ wait(true, true)
534
+ end
535
+ end
536
+
537
+ TkAfter = TkTimer
538
+
539
+
540
+ class TkRTTimer < TkTimer
541
+ DEFAULT_OFFSET_LIST_SIZE = 5
542
+
543
+ def initialize(*args, &b)
544
+ super(*args, &b)
545
+
546
+ @offset_list = Array.new(DEFAULT_OFFSET_LIST_SIZE){ [0, 0] }
547
+ @offset_s = 0
548
+ @offset_u = 0
549
+ @est_time = nil
550
+ end
551
+
552
+ def start(*args, &b)
553
+ return nil if @running
554
+ @est_time = nil
555
+ @cb_start_time = Time.now
556
+ super(*args, &b)
557
+ end
558
+
559
+ def cancel
560
+ super()
561
+ @est_time = nil
562
+ @cb_start_time = Time.now
563
+ self
564
+ end
565
+ alias stop cancel
566
+
567
+ def continue(wait=nil)
568
+ fail RuntimeError, "is already running" if @running
569
+ @cb_start_time = Time.now
570
+ super(wait)
571
+ end
572
+
573
+ def set_interval(interval)
574
+ super(interval)
575
+ @est_time = nil
576
+ end
577
+
578
+ def _offset_ave
579
+ size = 0
580
+ d_sec = 0; d_usec = 0
581
+ @offset_list.each_with_index{|offset, idx|
582
+ # weight = 1
583
+ weight = idx + 1
584
+ size += weight
585
+ d_sec += offset[0] * weight
586
+ d_usec += offset[1] * weight
587
+ }
588
+ offset_s, mod = d_sec.divmod(size)
589
+ offset_u = ((mod * 1000000 + d_usec) / size.to_f).round
590
+ [offset_s, offset_u]
591
+ end
592
+ private :_offset_ave
593
+
594
+ def set_next_callback(args)
595
+ if @running == false || @proc_max == 0 || @do_loop == 0
596
+ Tk_CBTBL.delete(@id) ;# for GC
597
+ @running = false
598
+ # @wait_var.value = 0
599
+ __at_end__
600
+ return
601
+ end
602
+ if @current_pos >= @proc_max
603
+ if @do_loop < 0 || (@do_loop -= 1) > 0
604
+ @current_pos = 0
605
+ else
606
+ Tk_CBTBL.delete(@id) ;# for GC
607
+ @running = false
608
+ # @wait_var.value = 0
609
+ __at_end__
610
+ return
611
+ end
612
+ end
613
+
614
+ @current_args = args
615
+
616
+ cmd, *cmd_args = @loop_proc[@current_pos]
617
+ @current_pos += 1
618
+ @current_proc = cmd
619
+
620
+ @offset_s, @offset_u = _offset_ave
621
+
622
+ if TkComm._callback_entry?(@sleep_time)
623
+ sleep = @sleep_time.call(self)
624
+ else
625
+ sleep = @sleep_time
626
+ end
627
+
628
+ if @est_time
629
+ @est_time = Time.at(@est_time.to_i, @est_time.usec + sleep*1000)
630
+ else
631
+ @est_time = Time.at(@cb_start_time.to_i,
632
+ @cb_start_time.usec + sleep*1000)
633
+ end
634
+
635
+ now = Time.now
636
+ real_sleep = ((@est_time.to_i - now.to_i + @offset_s)*1000.0 +
637
+ (@est_time.usec - now.usec + @offset_u)/1000.0).round
638
+ if real_sleep <= 0
639
+ real_sleep = 0
640
+ @offset_s = now.to_i
641
+ @offset_u = now.usec
642
+ end
643
+ @current_sleep = real_sleep
644
+
645
+ set_callback(real_sleep, cmd_args)
646
+ end
647
+
648
+ def cb_call
649
+ if @est_time
650
+ @offset_list.shift
651
+
652
+ @cb_start_time = Time.now
653
+
654
+ if @current_sleep == 0
655
+ @offset_list.push([
656
+ @offset_s - @cb_start_time.to_i,
657
+ @offset_u - @cb_start_time.usec
658
+ ])
659
+ else
660
+ @offset_list.push([
661
+ @offset_s + (@est_time.to_i - @cb_start_time.to_i),
662
+ @offset_u + (@est_time.usec - @cb_start_time.usec)
663
+ ])
664
+ end
665
+ end
666
+
667
+ @cb_cmd.call
668
+ end
669
+ end