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,377 @@
1
+ #
2
+ # tk/optiondb.rb : treat option database
3
+ #
4
+ require 'tk'
5
+
6
+ module TkOptionDB
7
+ include Tk
8
+ extend Tk
9
+
10
+ TkCommandNames = ['option'.freeze].freeze
11
+ (CmdClassID = ['CMD_CLASS'.freeze, TkUtil.untrust('00000')]).instance_eval{
12
+ @mutex = Mutex.new
13
+ def mutex; @mutex; end
14
+ freeze
15
+ }
16
+
17
+ module Priority
18
+ WidgetDefault = 20
19
+ StartupFile = 40
20
+ UserDefault = 60
21
+ Interactive = 80
22
+ end
23
+
24
+ def add(pat, value, pri=None)
25
+ # if $SAFE >= 4
26
+ # fail SecurityError, "can't call 'TkOptionDB.add' at $SAFE >= 4"
27
+ # end
28
+ tk_call('option', 'add', pat, value, pri)
29
+ end
30
+ def clear
31
+ # if $SAFE >= 4
32
+ # fail SecurityError, "can't call 'TkOptionDB.crear' at $SAFE >= 4"
33
+ # end
34
+ tk_call_without_enc('option', 'clear')
35
+ end
36
+ def get(win, name, klass)
37
+ tk_call('option', 'get', win ,name, klass)
38
+ end
39
+ def readfile(file, pri=None)
40
+ tk_call('option', 'readfile', file, pri)
41
+ end
42
+ alias read_file readfile
43
+ module_function :add, :clear, :get, :readfile, :read_file
44
+
45
+ def read_entries(file, f_enc=nil)
46
+ if TkCore::INTERP.safe?
47
+ fail SecurityError,
48
+ "can't call 'TkOptionDB.read_entries' on a safe interpreter"
49
+ end
50
+
51
+ i_enc = ((Tk.encoding)? Tk.encoding : Tk.encoding_system)
52
+
53
+ unless f_enc
54
+ f_enc = i_enc
55
+ end
56
+
57
+ ent = []
58
+ cline = ''
59
+ open(file, 'r') {|f|
60
+ while line = f.gets
61
+ #cline += line.chomp!
62
+ cline.concat(line.chomp!)
63
+ case cline
64
+ when /\\$/ # continue
65
+ cline.chop!
66
+ next
67
+ when /^\s*(!|#)/ # coment
68
+ cline = ''
69
+ next
70
+ when /^([^:]+):(.*)$/
71
+ pat = $1.strip
72
+ val = $2.lstrip
73
+ p "ResourceDB: #{[pat, val].inspect}" if $DEBUG
74
+ pat = TkCore::INTERP._toUTF8(pat, f_enc)
75
+ pat = TkCore::INTERP._fromUTF8(pat, i_enc)
76
+ val = TkCore::INTERP._toUTF8(val, f_enc)
77
+ val = TkCore::INTERP._fromUTF8(val, i_enc)
78
+ ent << [pat, val]
79
+ cline = ''
80
+ else # unknown --> ignore
81
+ cline = ''
82
+ next
83
+ end
84
+ end
85
+ }
86
+ ent
87
+ end
88
+ module_function :read_entries
89
+
90
+ def read_with_encoding(file, f_enc=nil, pri=None)
91
+ # try to read the file as an OptionDB file
92
+ read_entries(file, f_enc).each{|pat, val|
93
+ add(pat, val, pri)
94
+ }
95
+
96
+ =begin
97
+ i_enc = Tk.encoding()
98
+
99
+ unless f_enc
100
+ f_enc = i_enc
101
+ end
102
+
103
+ cline = ''
104
+ open(file, 'r') {|f|
105
+ while line = f.gets
106
+ cline += line.chomp!
107
+ case cline
108
+ when /\\$/ # continue
109
+ cline.chop!
110
+ next
111
+ when /^\s*!/ # coment
112
+ cline = ''
113
+ next
114
+ when /^([^:]+):\s(.*)$/
115
+ pat = $1
116
+ val = $2
117
+ p "ResourceDB: #{[pat, val].inspect}" if $DEBUG
118
+ pat = TkCore::INTERP._toUTF8(pat, f_enc)
119
+ pat = TkCore::INTERP._fromUTF8(pat, i_enc)
120
+ val = TkCore::INTERP._toUTF8(val, f_enc)
121
+ val = TkCore::INTERP._fromUTF8(val, i_enc)
122
+ add(pat, val, pri)
123
+ cline = ''
124
+ else # unknown --> ignore
125
+ cline = ''
126
+ next
127
+ end
128
+ end
129
+ }
130
+ =end
131
+ end
132
+ module_function :read_with_encoding
133
+
134
+ # support procs on the resource database
135
+ @@resource_proc_class = Class.new
136
+
137
+ @@resource_proc_class.const_set(:CARRIER, '.'.freeze)
138
+
139
+ @@resource_proc_class.instance_variable_set('@method_tbl',
140
+ TkCore::INTERP.create_table)
141
+ @@resource_proc_class.instance_variable_set('@add_method', false)
142
+ @@resource_proc_class.instance_variable_set('@safe_mode', 4)
143
+
144
+ class << @@resource_proc_class
145
+ private :new
146
+
147
+ =begin
148
+ CARRIER = '.'.freeze
149
+ METHOD_TBL = TkCore::INTERP.create_table
150
+ ADD_METHOD = false
151
+ SAFE_MODE = 4
152
+ =end
153
+
154
+ =begin
155
+ def __closed_block_check__(str)
156
+ depth = 0
157
+ str.scan(/[{}]/){|x|
158
+ if x == "{"
159
+ depth += 1
160
+ elsif x == "}"
161
+ depth -= 1
162
+ end
163
+ if depth <= 0 && !($' =~ /\A\s*\Z/)
164
+ fail RuntimeError, "bad string for procedure : #{str.inspect}"
165
+ end
166
+ }
167
+ str
168
+ end
169
+ private :__closed_block_check__
170
+ =end
171
+
172
+ def __check_proc_string__(str)
173
+ # If you want to check the proc_string, do it in this method.
174
+ # Please define this in the block given to 'new_proc_class' method.
175
+ str
176
+ end
177
+
178
+ def method_missing(id, *args)
179
+ #res_proc, proc_str = self::METHOD_TBL[id]
180
+ res_proc, proc_str = @method_tbl[id]
181
+
182
+ proc_source = TkOptionDB.get(self::CARRIER, id.id2name, '').strip
183
+ res_proc = nil if proc_str != proc_source # resource is changed
184
+
185
+ # unless res_proc.kind_of?(Proc)
186
+ unless TkComm._callback_entry?(res_proc)
187
+ #if id == :new || !(self::METHOD_TBL.has_key?(id) || self::ADD_METHOD)
188
+ if id == :new || !(@method_tbl.has_key?(id) || @add_method)
189
+ raise NoMethodError,
190
+ "not support resource-proc '#{id.id2name}' for #{self.name}"
191
+ end
192
+ proc_str = proc_source
193
+ proc_str = '{' + proc_str + '}' unless /\A\{.*\}\Z/ =~ proc_str
194
+ #proc_str = __closed_block_check__(proc_str)
195
+ proc_str = __check_proc_string__(proc_str)
196
+ res_proc = proc{
197
+ begin
198
+ #eval("$SAFE = #{self::SAFE_MODE};\nProc.new" + proc_str)
199
+ eval("$SAFE = #{@safe_mode};\nProc.new" + proc_str)
200
+ rescue SyntaxError=>err
201
+ raise SyntaxError,
202
+ TkCore::INTERP._toUTF8(err.message.gsub(/\(eval\):\d:/,
203
+ "(#{id.id2name}):"))
204
+ end
205
+ }.call
206
+ #self::METHOD_TBL[id] = [res_proc, proc_source]
207
+ @method_tbl[id] = [res_proc, proc_source]
208
+ end
209
+ res_proc.call(*args)
210
+ end
211
+
212
+ private :__check_proc_string__, :method_missing
213
+ end
214
+ @@resource_proc_class.freeze
215
+
216
+ =begin
217
+ def __create_new_class(klass, func, safe = 4, add = false, parent = nil)
218
+ klass = klass.to_s if klass.kind_of? Symbol
219
+ unless (?A..?Z) === klass[0]
220
+ fail ArgumentError, "bad string '#{klass}' for class name"
221
+ end
222
+ unless func.kind_of? Array
223
+ fail ArgumentError, "method-list must be Array"
224
+ end
225
+ func_str = func.join(' ')
226
+ if parent == nil
227
+ install_win(parent)
228
+ elsif parent <= @@resource_proc_class
229
+ install_win(parent::CARRIER)
230
+ else
231
+ fail ArgumentError, "parent must be Resource-Proc class"
232
+ end
233
+ carrier = Tk.tk_call_without_enc('frame', @path, '-class', klass)
234
+
235
+ body = <<-"EOD"
236
+ class #{klass} < TkOptionDB.module_eval('@@resource_proc_class')
237
+ CARRIER = '#{carrier}'.freeze
238
+ METHOD_TBL = TkCore::INTERP.create_table
239
+ ADD_METHOD = #{add}
240
+ SAFE_MODE = #{safe}
241
+ %w(#{func_str}).each{|f| METHOD_TBL[f.intern] = nil }
242
+ end
243
+ EOD
244
+
245
+ if parent.kind_of?(Class) && parent <= @@resource_proc_class
246
+ parent.class_eval(body)
247
+ eval(parent.name + '::' + klass)
248
+ else
249
+ eval(body)
250
+ eval('TkOptionDB::' + klass)
251
+ end
252
+ end
253
+ =end
254
+ def __create_new_class(klass, func, safe = 4, add = false, parent = nil)
255
+ if klass.kind_of?(TkWindow)
256
+ carrier = klass.path
257
+ CmdClassID.mutex.synchronize{
258
+ klass = CmdClassID.join(TkCore::INTERP._ip_id_)
259
+ CmdClassID[1].succ!
260
+ }
261
+ parent = nil # ignore parent
262
+ else
263
+ klass = klass.to_s if klass.kind_of?(Symbol)
264
+ unless (?A..?Z) === klass[0]
265
+ fail ArgumentError, "bad string '#{klass}' for class name"
266
+ end
267
+ if parent == nil
268
+ install_win(nil)
269
+ elsif parent.kind_of?(TkWindow)
270
+ install_win(parent.path)
271
+ elsif parent <= @@resource_proc_class
272
+ install_win(parent::CARRIER)
273
+ else
274
+ fail ArgumentError, "parent must be Resource-Proc class"
275
+ end
276
+ carrier = Tk.tk_call_without_enc('frame', @path, '-class', klass)
277
+ end
278
+
279
+ unless func.kind_of?(Array)
280
+ fail ArgumentError, "method-list must be Array"
281
+ end
282
+ func_str = func.join(' ')
283
+
284
+ if parent.kind_of?(Class) && parent <= @@resource_proc_class
285
+ cmd_klass = Class.new(parent)
286
+ else
287
+ cmd_klass = Class.new(TkOptionDB.module_eval('@@resource_proc_class'))
288
+ end
289
+ cmd_klass.const_set(:CARRIER, carrier.dup.freeze)
290
+
291
+ cmd_klass.instance_variable_set('@method_tbl', TkCore::INTERP.create_table)
292
+ cmd_klass.instance_variable_set('@add_method', add)
293
+ cmd_klass.instance_variable_set('@safe_mode', safe)
294
+ func.each{|f|
295
+ cmd_klass.instance_variable_get('@method_tbl')[f.to_s.intern] = nil
296
+ }
297
+ =begin
298
+ cmd_klass.const_set(:METHOD_TBL, TkCore::INTERP.create_table)
299
+ cmd_klass.const_set(:ADD_METHOD, add)
300
+ cmd_klass.const_set(:SAFE_MODE, safe)
301
+ func.each{|f| cmd_klass::METHOD_TBL[f.to_s.intern] = nil }
302
+ =end
303
+
304
+ cmd_klass
305
+ end
306
+ module_function :__create_new_class
307
+ private_class_method :__create_new_class
308
+
309
+ def __remove_methods_of_proc_class(klass)
310
+ # for security, make these methods invalid
311
+ class << klass
312
+ def __null_method(*args); nil; end
313
+ [ :class_eval, :name, :superclass, :clone, :dup, :autoload, :autoload?,
314
+ :ancestors, :const_defined?, :const_get, :const_set, :const_missing,
315
+ :class_variables, :constants, :included_modules, :instance_methods,
316
+ :method_defined?, :module_eval, :private_instance_methods,
317
+ :protected_instance_methods, :public_instance_methods,
318
+ :singleton_methods, :remove_const, :remove_method, :undef_method,
319
+ :to_s, :inspect, :display, :method, :methods, :respond_to?,
320
+ :instance_variable_get, :instance_variable_set, :instance_method,
321
+ :instance_eval, :instance_exec, :instance_variables, :kind_of?, :is_a?,
322
+ :private_methods, :protected_methods, :public_methods ].each{|m|
323
+ alias_method(m, :__null_method)
324
+ }
325
+ end
326
+ end
327
+ module_function :__remove_methods_of_proc_class
328
+ private_class_method :__remove_methods_of_proc_class
329
+
330
+ RAND_BASE_CNT = [0]
331
+ RAND_BASE_HEAD = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
332
+ RAND_BASE_CHAR = RAND_BASE_HEAD + 'abcdefghijklmnopqrstuvwxyz0123456789_'
333
+ def __get_random_basename
334
+ name = '%s%03d' % [RAND_BASE_HEAD[rand(RAND_BASE_HEAD.size),1],
335
+ RAND_BASE_CNT[0]]
336
+ len = RAND_BASE_CHAR.size
337
+ (6+rand(10)).times{
338
+ name << RAND_BASE_CHAR[rand(len),1]
339
+ }
340
+ RAND_BASE_CNT[0] = RAND_BASE_CNT[0] + 1
341
+ name
342
+ end
343
+ module_function :__get_random_basename
344
+ private_class_method :__get_random_basename
345
+
346
+ # define new proc class :
347
+ # If you want to modify the new class or create a new subclass,
348
+ # you must do such operation in the block parameter.
349
+ # Because the created class is flozen after evaluating the block.
350
+ def new_proc_class(klass, func, safe = 4, add = false, parent = nil, &b)
351
+ new_klass = __create_new_class(klass, func, safe, add, parent)
352
+ new_klass.class_eval(&b) if block_given?
353
+ __remove_methods_of_proc_class(new_klass)
354
+ new_klass.freeze
355
+ new_klass
356
+ end
357
+ module_function :new_proc_class
358
+
359
+ def eval_under_random_base(parent = nil, &b)
360
+ new_klass = __create_new_class(__get_random_basename(),
361
+ [], 4, false, parent)
362
+ ret = new_klass.class_eval(&b) if block_given?
363
+ __remove_methods_of_proc_class(new_klass)
364
+ new_klass.freeze
365
+ ret
366
+ end
367
+ module_function :eval_under_random_base
368
+
369
+ def new_proc_class_random(klass, func, safe = 4, add = false, &b)
370
+ eval_under_random_base(){
371
+ TkOptionDB.new_proc_class(klass, func, safe, add, self, &b)
372
+ }
373
+ end
374
+ module_function :new_proc_class_random
375
+ end
376
+ TkOption = TkOptionDB
377
+ TkResourceDB = TkOptionDB
@@ -0,0 +1,212 @@
1
+ #
2
+ # tk/optionobj.rb : control options for a group of widgets
3
+ #
4
+ # NOTE: If you want to use key-only option (no value),
5
+ # use Tk::None for the value of the key-only option.
6
+ #
7
+ # e.g. hash_kv({'aaa'=>1, 'bbb'=>Tk::None, 'ccc'=>3})
8
+ # => ["-aaa", 1, "-bbb", "-ccc", 3]
9
+ #
10
+ require 'tk'
11
+
12
+ module Tk
13
+ class OptionObj < Hash
14
+ include TkUtil
15
+
16
+ def initialize(hash = nil)
17
+ super()
18
+ @observ = []
19
+ update_without_notify(_symbolkey2str(hash)) if hash
20
+ end
21
+
22
+ def observ_info
23
+ @observ.dup
24
+ end
25
+
26
+ def observs
27
+ @observ.collect{|win|
28
+ if win.kind_of?(Array)
29
+ win[0]
30
+ else
31
+ win
32
+ end
33
+ }
34
+ end
35
+
36
+ def _remove_win(win)
37
+ if win.kind_of?(Array)
38
+ widget, method = win
39
+ @observ.delete_if{|x|
40
+ if x.kind_of?(Array)
41
+ x[0] == widget
42
+ else
43
+ x == widget
44
+ end
45
+ }
46
+ else
47
+ @observ.delete_if{|x|
48
+ if x.kind_of?(Array)
49
+ x[0] == win
50
+ else
51
+ x == win
52
+ end
53
+ }
54
+ end
55
+ end
56
+ private :_remove_win
57
+
58
+ def assign(*wins)
59
+ # win :=
60
+ # widget #==> call widget.configure(hash)
61
+ # [widget] #==> call widget.configure(hash)
62
+ # [widget, nil, {src=>target, ... }]
63
+ # #==> call widget.configure(hash)
64
+ # with converting hash-key
65
+ # [widget, method] #==> call widget.method(hash)
66
+ # [widget, method, {src=>target, ... }]
67
+ # #==> call widget.method(hash)
68
+ # with converting hash-key
69
+ # [widget [receiver, method, arg, ... ]]
70
+ # #==> call receiver.method(arg, ... , hash)
71
+ # [widget [receiver, method, arg, ... ], {src=>target, ... }]
72
+ # #==> call receiver.method(arg, ... , hash)
73
+ # with onverting hash-key
74
+ #
75
+ # src := option_name_on_optobj
76
+ #
77
+ # target :=
78
+ # nil #==> not use the src
79
+ # option_name_on_target_widget
80
+ # [ option_name_on_target_widget, ... ]
81
+ # #==> set all of them
82
+ #
83
+ wins.each{|win|
84
+ _remove_win(win)
85
+ @observ << win
86
+ notify(win)
87
+ }
88
+ self
89
+ end
90
+
91
+ def unassign(*wins)
92
+ wins.each{|win|
93
+ _remove_win(win)
94
+ }
95
+ self
96
+ end
97
+
98
+ def notify(target = nil)
99
+ if target
100
+ targets = [target]
101
+ elsif @observ.empty?
102
+ return self
103
+ else
104
+ targets = @observ.dup
105
+ end
106
+
107
+ return self if empty?
108
+
109
+ org_hash = _symbolkey2str(self)
110
+
111
+ targets.each{|win|
112
+ widget = receiver = win
113
+ hash = org_hash
114
+ begin
115
+ if win.kind_of?(Array)
116
+ widget, method, conv_tbl = win
117
+ receiver = widget
118
+
119
+ if conv_tbl
120
+ hash = {}
121
+ org_hash.each{|key, val|
122
+ key = conv_tbl[key] if conv_tbl.key?(key)
123
+ next unless key
124
+ if key.kind_of?(Array)
125
+ key.each{|k| hash[k] = val}
126
+ else
127
+ hash[key] = val
128
+ end
129
+ }
130
+ end
131
+
132
+ if method.kind_of?(Array)
133
+ receiver, method, *args = method
134
+ receiver.__send__(method, *(args << hash))
135
+ elsif method
136
+ widget.__send__(method, hash)
137
+ else
138
+ widget.configure(hash)
139
+ end
140
+
141
+ else
142
+ widget.configure(self)
143
+ end
144
+ rescue => e
145
+ if ( ( widget.kind_of?(TkObject) \
146
+ && widget.respond_to?('exist?') \
147
+ && ! receiver.exist? ) \
148
+ || ( receiver.kind_of?(TkObject) \
149
+ && receiver.respond_to?('exist?') \
150
+ && ! receiver.exist? ) )
151
+ @observ.delete(win)
152
+ else
153
+ fail e
154
+ end
155
+ end
156
+ }
157
+
158
+ self
159
+ end
160
+ alias apply notify
161
+
162
+ def +(hash)
163
+ unless hash.kind_of?(Hash)
164
+ fail ArgumentError, "expect a Hash"
165
+ end
166
+ new_obj = self.dup
167
+ new_obj.update_without_notify(_symbolkey2str(hash))
168
+ new_obj
169
+ end
170
+
171
+ alias update_without_notify update
172
+
173
+ def update(hash)
174
+ update_without_notify(_symbolkey2str(hash))
175
+ notify
176
+ end
177
+
178
+ def configure(key, value=nil)
179
+ if key.kind_of?(Hash)
180
+ update(key)
181
+ else
182
+ store(key,value)
183
+ end
184
+ end
185
+
186
+ def [](key)
187
+ super(key.to_s)
188
+ end
189
+ alias cget []
190
+
191
+ def store(key, val)
192
+ key = key.to_s
193
+ super(key, val)
194
+ notify
195
+ end
196
+ def []=(key, val)
197
+ store(key,val)
198
+ end
199
+
200
+ def replace(hash)
201
+ super(_symbolkey2str(hash))
202
+ notify
203
+ end
204
+
205
+ def default(opt)
206
+ fail RuntimeError, "unknown option `#{opt}'"
207
+ end
208
+ private :default
209
+
210
+ undef :default=
211
+ end
212
+ end