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,137 @@
1
+ #
2
+ # tk/menubar.rb
3
+ #
4
+ # Original version:
5
+ # Copyright (C) 1998 maeda shugo. All rights reserved.
6
+ # This file can be distributed under the terms of the Ruby.
7
+
8
+ # Usage:
9
+ #
10
+ # menu_spec = [
11
+ # [['File', 0],
12
+ # ['Open', proc{puts('Open clicked')}, 0],
13
+ # '---',
14
+ # ['Quit', proc{exit}, 0]],
15
+ # [['Edit', 0],
16
+ # ['Cut', proc{puts('Cut clicked')}, 2],
17
+ # ['Copy', proc{puts('Copy clicked')}, 0],
18
+ # ['Paste', proc{puts('Paste clicked')}, 0]]
19
+ # ]
20
+ # menubar = TkMenubar.new(nil, menu_spec,
21
+ # 'tearoff'=>false,
22
+ # 'foreground'=>'grey40',
23
+ # 'activeforeground'=>'red',
24
+ # 'font'=>'-adobe-helvetica-bold-r-*--12-*-iso8859-1')
25
+ # menubar.pack('side'=>'top', 'fill'=>'x')
26
+ #
27
+ #
28
+ # OR
29
+ #
30
+ #
31
+ # menubar = TkMenubar.new
32
+ # menubar.add_menu([['File', 0],
33
+ # ['Open', proc{puts('Open clicked')}, 0],
34
+ # '---',
35
+ # ['Quit', proc{exit}, 0]])
36
+ # menubar.add_menu([['Edit', 0],
37
+ # ['Cut', proc{puts('Cut clicked')}, 2],
38
+ # ['Copy', proc{puts('Copy clicked')}, 0],
39
+ # ['Paste', proc{puts('Paste clicked')}, 0]])
40
+ # menubar.configure('tearoff', false)
41
+ # menubar.configure('foreground', 'grey40')
42
+ # menubar.configure('activeforeground', 'red')
43
+ # menubar.configure('font', '-adobe-helvetica-bold-r-*--12-*-iso8859-1')
44
+ # menubar.pack('side'=>'top', 'fill'=>'x')
45
+ #
46
+ #
47
+ # OR
48
+ #
49
+ # radio_var = TkVariable.new('y')
50
+ # menu_spec = [
51
+ # [['File', 0],
52
+ # {:label=>'Open', :command=>proc{puts('Open clicked')}, :underline=>0},
53
+ # '---',
54
+ # ['Check_A', TkVariable.new(true), 6],
55
+ # {:type=>'checkbutton', :label=>'Check_B',
56
+ # :variable=>TkVariable.new, :underline=>6},
57
+ # '---',
58
+ # ['Radio_X', [radio_var, 'x'], 6],
59
+ # ['Radio_Y', [radio_var, 'y'], 6],
60
+ # ['Radio_Z', [radio_var, 'z'], 6],
61
+ # '---',
62
+ # ['cascade', [
63
+ # ['sss', proc{p 'sss'}, 0],
64
+ # ['ttt', proc{p 'ttt'}, 0],
65
+ # ['uuu', proc{p 'uuu'}, 0],
66
+ # ['vvv', proc{p 'vvv'}, 0],
67
+ # ], 0],
68
+ # '---',
69
+ # ['Quit', proc{exit}, 0]],
70
+ # [['Edit', 0],
71
+ # ['Cut', proc{puts('Cut clicked')}, 2],
72
+ # ['Copy', proc{puts('Copy clicked')}, 0],
73
+ # ['Paste', proc{puts('Paste clicked')}, 0]]
74
+ # ]
75
+ # menubar = TkMenubar.new(nil, menu_spec,
76
+ # 'tearoff'=>false,
77
+ # 'foreground'=>'grey40',
78
+ # 'activeforeground'=>'red',
79
+ # 'font'=>'Helvetia 12 bold')
80
+ # menubar.pack('side'=>'top', 'fill'=>'x')
81
+
82
+ # See tk/menuspce.rb about the format of the menu_spec
83
+
84
+ # To use add_menu, configuration must be done by calling configure after
85
+ # adding all menus by add_menu, not by the constructor arguments.
86
+
87
+ require 'tk'
88
+ require 'tk/frame'
89
+ require 'tk/composite'
90
+ require 'tk/menuspec'
91
+
92
+ class TkMenubar<Tk::Frame
93
+ include TkComposite
94
+ include TkMenuSpec
95
+
96
+ def initialize(parent = nil, spec = nil, options = {})
97
+ if parent.kind_of? Hash
98
+ options = parent
99
+ parent = nil
100
+ spec = (options.has_key?('spec'))? options.delete('spec'): nil
101
+ end
102
+
103
+ _symbolkey2str(options)
104
+ menuspec_opt = {}
105
+ TkMenuSpec::MENUSPEC_OPTKEYS.each{|key|
106
+ menuspec_opt[key] = options.delete(key) if options.has_key?(key)
107
+ }
108
+
109
+ super(parent, options)
110
+
111
+ @menus = []
112
+
113
+ spec.each{|info| add_menu(info, menuspec_opt)} if spec
114
+
115
+ options.each{|key, value| configure(key, value)} if options
116
+ end
117
+
118
+ def add_menu(menu_info, menuspec_opt={})
119
+ mbtn, menu = _create_menubutton(@frame, menu_info, menuspec_opt)
120
+
121
+ submenus = _get_cascade_menus(menu).flatten
122
+
123
+ @menus.push([mbtn, menu])
124
+ delegate('tearoff', menu, *submenus)
125
+ delegate('foreground', mbtn, menu, *submenus)
126
+ delegate('background', mbtn, menu, *submenus)
127
+ delegate('disabledforeground', mbtn, menu, *submenus)
128
+ delegate('activeforeground', mbtn, menu, *submenus)
129
+ delegate('activebackground', mbtn, menu, *submenus)
130
+ delegate('font', mbtn, menu, *submenus)
131
+ delegate('kanjifont', mbtn, menu, *submenus)
132
+ end
133
+
134
+ def [](index)
135
+ return @menus[index]
136
+ end
137
+ end
@@ -0,0 +1,456 @@
1
+ #
2
+ # tk/menuspec.rb
3
+ # Hidethoshi NAGAI (nagai@ai.kyutech.ac.jp)
4
+ #
5
+ # based on tkmenubar.rb :
6
+ # Copyright (C) 1998 maeda shugo. All rights reserved.
7
+ # This file can be distributed under the terms of the Ruby.
8
+ #
9
+ # The format of the menu_spec is:
10
+ # [ menubutton_info, menubutton_info, ... ]
11
+ #
12
+ # The format of the menubutton_info is:
13
+ # [ menubutton_info, entry_info, entry_info, ... ]
14
+ #
15
+ # And each format of *_info is:
16
+ # [
17
+ # [text, underline, configs], # menu button/entry (*1)
18
+ # [label, command, underline, accelerator, configs], # command entry
19
+ # [label, TkVar_obj, underline, accelerator, configs], # checkbutton entry
20
+ # [label, [TkVar_obj, value],
21
+ # underline, accelerator, configs], # radiobutton entry
22
+ # [label, [[...menu_info...], [...menu_info...], ...],
23
+ # underline, accelerator, configs], # cascade entry (*2)
24
+ # '---', # separator
25
+ # ...
26
+ # ]
27
+ #
28
+ # A menu_info is an array of menu entries:
29
+ # [ entry_info, entry_info, ... ]
30
+ #
31
+ #
32
+ # underline, accelerator, and configs are optional pearameters.
33
+ # Hashes are OK instead of Arrays. Then the entry type ('command',
34
+ # 'checkbutton', 'radiobutton' or 'cascade') is given by 'type' key
35
+ # (e.g. :type=>'cascade'). When type is 'cascade', an array of menu_info
36
+ # is acceptable for 'menu' key (then, create sub-menu).
37
+ #
38
+ # If the value of underline is true instead of an integer,
39
+ # check whether the text/label string contains a '&' character.
40
+ # When includes, the first '&' is removed and its following character is
41
+ # converted the corresponding 'underline' option (first '&' is removed).
42
+ # Else if the value of underline is a String or a Regexp,
43
+ # use the result of label.index(underline) as the index of underline
44
+ # (don't remove matched substring).
45
+ #
46
+ # NOTE: (*1)
47
+ # If you want to make special menus (*.help for UNIX, *.system for Win,
48
+ # and *.apple for Mac), append 'menu_name'=>name (name is 'help' for UNIX,
49
+ # 'system' for Win, and 'apple' for Mac) option to the configs hash of
50
+ # menu button/entry information.
51
+ #
52
+ # NOTE: (*2)
53
+ # If you want to configure a cascade menu, add :menu_config=>{...configs..}
54
+ # to the configs of the cascade entry.
55
+
56
+ module TkMenuSpec
57
+ extend TkMenuSpec
58
+
59
+ MENUSPEC_OPTKEYS = [ 'layout_proc' ]
60
+
61
+ def _create_menu(parent, menu_info, menu_name = nil,
62
+ tearoff = false, default_opts = nil)
63
+ if tearoff.kind_of?(Hash)
64
+ default_opts = tearoff
65
+ tearoff = false
66
+ end
67
+
68
+ if menu_name.kind_of?(Hash)
69
+ default_opts = menu_name
70
+ menu_name = nil
71
+ tearoff = false
72
+ end
73
+
74
+ if default_opts.kind_of?(Hash)
75
+ orig_opts = _symbolkey2str(default_opts)
76
+ else
77
+ orig_opts = {}
78
+ end
79
+
80
+ tearoff = orig_opts.delete('tearoff') if orig_opts.key?('tearoff')
81
+ tearoff = false unless tearoff # nil --> false
82
+
83
+ if menu_name
84
+ #menu = Tk::Menu.new(parent, :widgetname=>menu_name, :tearoff=>tearoff)
85
+ # --> use current TkMenu class
86
+ menu = TkMenu.new(parent, :widgetname=>menu_name, :tearoff=>tearoff)
87
+ else
88
+ #menu = Tk::Menu.new(parent, :tearoff=>tearoff)
89
+ # --> use current TkMenu class
90
+ menu = TkMenu.new(parent, :tearoff=>tearoff)
91
+ end
92
+
93
+ for item_info in menu_info
94
+ if item_info.kind_of?(Hash)
95
+ options = orig_opts.dup
96
+ options.update(_symbolkey2str(item_info))
97
+ item_type = (options.delete('type') || 'command').to_s
98
+ menu_name = options.delete('menu_name')
99
+ menu_opts = orig_opts.dup
100
+ menu_opts.update(_symbolkey2str(options.delete('menu_config') || {}))
101
+ if item_type == 'cascade' && options['menu'].kind_of?(Array)
102
+ # create cascade menu
103
+ submenu = _create_menu(menu, options['menu'], menu_name,
104
+ tearoff, menu_opts)
105
+ options['menu'] = submenu
106
+ end
107
+ case options['underline']
108
+ when String, Regexp
109
+ if options['label'] &&
110
+ (idx = options['label'].index(options['underline']))
111
+ options['underline'] = idx
112
+ else
113
+ options['underline'] = -1
114
+ end
115
+ when true
116
+ if options['label'] && (idx = options['label'].index('&'))
117
+ options['label'] = options['label'].dup
118
+ options['label'][idx] = ''
119
+ options['underline'] = idx
120
+ else
121
+ options['underline'] = -1
122
+ end
123
+ end
124
+ menu.add(item_type, options)
125
+
126
+ elsif item_info.kind_of?(Array)
127
+ options = orig_opts.dup
128
+
129
+ options['label'] = item_info[0] if item_info[0]
130
+
131
+ case item_info[1]
132
+ when TkVariable
133
+ # checkbutton
134
+ item_type = 'checkbutton'
135
+ options['variable'] = item_info[1]
136
+ options['onvalue'] = true
137
+ options['offvalue'] = false
138
+
139
+ when Array
140
+ # radiobutton or cascade
141
+ if item_info[1][0].kind_of?(TkVariable)
142
+ # radiobutton
143
+ item_type = 'radiobutton'
144
+ options['variable'] = item_info[1][0]
145
+ options['value'] = item_info[1][1] if item_info[1][1]
146
+
147
+ else
148
+ # cascade
149
+ item_type = 'cascade'
150
+ menu_opts = orig_opts.dup
151
+ if item_info[4] && item_info[4].kind_of?(Hash)
152
+ opts = _symbolkey2str(item_info[4])
153
+ menu_name = opts.delete('menu_name')
154
+ menu_config = opts.delete('menu_config') || {}
155
+ menu_opts.update(_symbolkey2str(menu_config))
156
+ end
157
+ submenu = _create_menu(menu, item_info[1], menu_name,
158
+ tearoff, menu_opts)
159
+ options['menu'] = submenu
160
+ end
161
+
162
+ else
163
+ # command
164
+ item_type = 'command'
165
+ options['command'] = item_info[1] if item_info[1]
166
+ end
167
+
168
+ options['underline'] = item_info[2] if item_info[2]
169
+ options['accelerator'] = item_info[3] if item_info[3]
170
+ if item_info[4] && item_info[4].kind_of?(Hash)
171
+ opts = _symbolkey2str(item_info[4])
172
+ if item_type == 'cascade'
173
+ opts.delete('menu_name')
174
+ opts.delete('menu_config')
175
+ end
176
+ options.update(opts)
177
+ end
178
+
179
+ case options['underline']
180
+ when String, Regexp
181
+ if options['label'] &&
182
+ (idx = options['label'].index(options['underline']))
183
+ options['underline'] = idx
184
+ else
185
+ options['underline'] = -1
186
+ end
187
+ when true
188
+ if options['label'] && (idx = options['label'].index('&'))
189
+ options['label'] = options['label'].dup
190
+ options['label'][idx] = ''
191
+ options['underline'] = idx
192
+ else
193
+ options['underline'] = -1
194
+ end
195
+ end
196
+
197
+ menu.add(item_type, options)
198
+
199
+ elsif /^-+$/ =~ item_info
200
+ menu.add('separator')
201
+
202
+ else
203
+ menu.add('command', 'label' => item_info)
204
+ end
205
+ end
206
+
207
+ menu
208
+ end
209
+ private :_create_menu
210
+
211
+ def _use_menubar?(parent)
212
+ use_menubar = false
213
+ if parent.kind_of?(Tk::Root) || parent.kind_of?(Tk::Toplevel)
214
+ true
215
+ elsif parent.current_configinfo.has_key?('menu')
216
+ true
217
+ else
218
+ false
219
+ end
220
+ end
221
+ private :_use_menubar?
222
+
223
+ def _create_menu_for_menubar(parent)
224
+ #unless (mbar = parent.menu).kind_of?(TkMenu)
225
+ # --> use current TkMenu class
226
+ mbar = parent.menu
227
+ unless mbar.kind_of?(Tk::Menu) || mbar.kind_of?(TkMenu)
228
+ #mbar = Tk::Menu.new(parent, :tearoff=>false)
229
+ mbar = TkMenu.new(parent, :tearoff=>false)
230
+ parent.menu(mbar)
231
+ end
232
+ mbar
233
+ end
234
+ private :_create_menu_for_menubar
235
+
236
+ def _create_menubutton(parent, menu_info, tearoff=false, default_opts = {})
237
+ btn_info = menu_info[0]
238
+
239
+ if tearoff.kind_of?(Hash)
240
+ default_opts = tearoff
241
+ tearoff = false
242
+ end
243
+
244
+ if default_opts.kind_of?(Hash)
245
+ default_opts = _symbolkey2str(default_opts)
246
+
247
+ if default_opts.has_key?('layout_proc')
248
+ layout_proc = default_opts.delete('layout_proc')
249
+ end
250
+
251
+ _vertical_mbar_bind_proc = proc{|m, dir|
252
+ Tk::Menu::TkInternalFunction.next_menu(m, dir) rescue nil
253
+ # ignore error when the internal function doesn't exist
254
+ }
255
+
256
+ case layout_proc
257
+ when :vertical, 'vertical', :vertical_left, 'vertical_left'
258
+ layout_proc = proc{|_parent, _mbtn|
259
+ _mbtn.direction :right
260
+ _mbtn.pack(:side=>:top, :fill=>:x)
261
+
262
+ menu = _mbtn.menu
263
+ menu.bind('Tab', _vertical_mbar_bind_proc, :widget, 'forward')
264
+ menu.bind('Alt-Tab', _vertical_mbar_bind_proc, :widget, 'backward')
265
+ }
266
+ when :vertical_right, 'vertical_right'
267
+ layout_proc = proc{|_parent, _mbtn|
268
+ _mbtn.direction :left
269
+ _mbtn.pack(:side=>:top, :fill=>:x)
270
+
271
+ menu = _mbtn.menu
272
+ menu.bind('Tab', _vertical_mbar_bind_proc, :widget, 'forward')
273
+ menu.bind('Alt-Tab', _vertical_mbar_bind_proc, :widget, 'backward')
274
+ }
275
+ when :horizontal, 'horizontal'
276
+ layout_proc = proc{|_parent, _mbtn| _mbtn.pack(:side=>:left)}
277
+ else
278
+ # do nothing
279
+ end
280
+ end
281
+
282
+ keys = (default_opts)? default_opts.dup: {}
283
+
284
+ tearoff = keys.delete('tearoff') if keys.key?('tearoff')
285
+ tearoff = false unless tearoff # nil --> false
286
+
287
+ if _use_menubar?(parent) && ! layout_proc
288
+ # menubar by menu entries
289
+ mbar = _create_menu_for_menubar(parent)
290
+
291
+ menu_name = nil
292
+
293
+ if btn_info.kind_of?(Hash)
294
+ keys.update(_symbolkey2str(btn_info))
295
+ menu_name = keys.delete('menu_name')
296
+ keys['label'] = keys.delete('text') || ''
297
+
298
+ case keys['underline']
299
+ when String, Regexp
300
+ if idx = keys['label'].index(keys['underline'])
301
+ keys['underline'] = idx
302
+ else
303
+ keys['underline'] = -1
304
+ end
305
+ when true
306
+ if idx = keys['label'].index('&')
307
+ keys['label'] = keys['label'].dup
308
+ keys['label'][idx] = ''
309
+ keys['underline'] = idx
310
+ else
311
+ keys['underline'] = -1
312
+ end
313
+ end
314
+
315
+ elsif btn_info.kind_of?(Array)
316
+ keys['label'] = btn_info[0] if btn_info[0]
317
+
318
+ case btn_info[1]
319
+ when Integer
320
+ keys['underline'] = btn_info[1]
321
+ when String, Regexp
322
+ if idx = keys['label'].index(btn_info[1])
323
+ keys['underline'] = idx
324
+ else
325
+ keys['underline'] = -1
326
+ end
327
+ when true
328
+ if idx = keys['label'].index('&')
329
+ keys['label'] = keys['label'].dup
330
+ keys['label'][idx] = ''
331
+ keys['underline'] = idx
332
+ else
333
+ keys['underline'] = -1
334
+ end
335
+ end
336
+
337
+ if btn_info[2]&&btn_info[2].kind_of?(Hash)
338
+ keys.update(_symbolkey2str(btn_info[2]))
339
+ menu_name = keys.delete('menu_name')
340
+ end
341
+
342
+ else
343
+ keys = {:label=>btn_info}
344
+ end
345
+
346
+ menu = _create_menu(mbar, menu_info[1..-1], menu_name,
347
+ tearoff, default_opts)
348
+ menu.tearoff(tearoff)
349
+
350
+ keys['menu'] = menu
351
+ mbar.add('cascade', keys)
352
+
353
+ [mbar, menu]
354
+
355
+ else
356
+ # menubar by menubuttons
357
+ #mbtn = Tk::Menubutton.new(parent)
358
+ # --> use current TkMenubutton class
359
+ mbtn = TkMenubutton.new(parent)
360
+
361
+ menu_name = nil
362
+
363
+ if btn_info.kind_of?(Hash)
364
+ keys.update(_symbolkey2str(btn_info))
365
+ menu_name = keys.delete('menu_name')
366
+ keys['text'] = keys.delete('label') || ''
367
+ case keys['underline']
368
+ when String, Regexp
369
+ if idx = keys['text'].index(keys['underline'])
370
+ keys['underline'] = idx
371
+ else
372
+ keys['underline'] = -1
373
+ end
374
+ when true
375
+ if idx = keys['text'].index('&')
376
+ keys['text'] = keys['text'].dup
377
+ keys['text'][idx] = ''
378
+ keys['underline'] = idx
379
+ else
380
+ keys['underline'] = -1
381
+ end
382
+ end
383
+ mbtn.configure(keys)
384
+
385
+ elsif btn_info.kind_of?(Array)
386
+ case btn_info[1]
387
+ when String, Regexp
388
+ if btn_info[0] && (idx = btn_info[0].index(btn_info[1]))
389
+ btn_info[1] = idx
390
+ else
391
+ btn_info[1] = -1
392
+ end
393
+ when true
394
+ if btn_info[0] && (idx = btn_info[0].index('&'))
395
+ btn_info[0] = btn_info[0].dup
396
+ btn_info[0][idx] = ''
397
+ btn_info[1] = idx
398
+ else
399
+ btn_info[1] = -1
400
+ end
401
+ end
402
+ mbtn.configure('text', btn_info[0]) if btn_info[0]
403
+ mbtn.configure('underline', btn_info[1]) if btn_info[1]
404
+ # mbtn.configure('accelerator', btn_info[2]) if btn_info[2]
405
+ if btn_info[2]&&btn_info[2].kind_of?(Hash)
406
+ keys.update(_symbolkey2str(btn_info[2]))
407
+ menu_name = keys.delete('menu_name')
408
+ mbtn.configure(keys)
409
+ end
410
+
411
+ else
412
+ mbtn.configure('text', btn_info)
413
+ end
414
+
415
+ menu = _create_menu(mbtn, menu_info[1..-1], menu_name,
416
+ tearoff, default_opts)
417
+ mbtn.menu(menu)
418
+
419
+ if layout_proc.kind_of?(Proc) || layout_proc.kind_of?(Method)
420
+ # e.g. make a vertical menubar
421
+ # :layout_proc => proc{|parent, btn| btn.pack(:side=>:top, :fill=>:x)}
422
+ layout_proc.call(parent, mbtn)
423
+ else
424
+ mbtn.pack('side' => 'left')
425
+ end
426
+
427
+ [mbtn, menu]
428
+ end
429
+ end
430
+ private :_create_menubutton
431
+
432
+ def _create_menubar(parent, menu_spec, tearoff = false, opts = nil)
433
+ if tearoff.kind_of?(Hash)
434
+ opts = tearoff
435
+ tearoff = false
436
+ end
437
+ tearoff = false unless tearoff # nil --> false
438
+ menu_spec.each{|menu_info|
439
+ _create_menubutton(parent, menu_info, tearoff, opts)
440
+ }
441
+ parent
442
+ end
443
+ private :_create_menubar
444
+
445
+ def _get_cascade_menus(menu)
446
+ menus = []
447
+ (0..(menu.index('last'))).each{|idx|
448
+ if menu.menutype(idx) == 'cascade'
449
+ submenu = menu.entrycget(idx, 'menu')
450
+ menus << [submenu, _get_cascade_menus(submenu)]
451
+ end
452
+ }
453
+ menus
454
+ end
455
+ private :_get_cascade_menus
456
+ end