tk-win 0.2.0-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.
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