fxruby 1.6.19-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 (497) hide show
  1. data/LICENSE +456 -0
  2. data/README +39 -0
  3. data/doc/apes02.html +21 -0
  4. data/doc/apes03.html +39 -0
  5. data/doc/book.html +3 -0
  6. data/doc/build.html +132 -0
  7. data/doc/ch03s02.html +23 -0
  8. data/doc/ch03s03.html +52 -0
  9. data/doc/ch03s04.html +36 -0
  10. data/doc/ch03s05.html +60 -0
  11. data/doc/ch04s02.html +71 -0
  12. data/doc/ch04s03.html +37 -0
  13. data/doc/ch04s04.html +72 -0
  14. data/doc/ch05s02.html +260 -0
  15. data/doc/ch05s03.html +127 -0
  16. data/doc/changes.html +777 -0
  17. data/doc/clipboardtut.html +67 -0
  18. data/doc/differences.html +190 -0
  19. data/doc/dragdroptut.html +263 -0
  20. data/doc/events.html +36 -0
  21. data/doc/examples.html +104 -0
  22. data/doc/gems.html +73 -0
  23. data/doc/goals.html +41 -0
  24. data/doc/images/babelfish.png +0 -0
  25. data/doc/images/browser.png +0 -0
  26. data/doc/images/button.png +0 -0
  27. data/doc/images/call-chain-example.png +0 -0
  28. data/doc/images/colordialog.png +0 -0
  29. data/doc/images/datatarget.png +0 -0
  30. data/doc/images/dialog.png +0 -0
  31. data/doc/images/dilbert.png +0 -0
  32. data/doc/images/dirlist.png +0 -0
  33. data/doc/images/dropsite-droprejected.png +0 -0
  34. data/doc/images/foursplit.png +0 -0
  35. data/doc/images/gltest.png +0 -0
  36. data/doc/images/glviewer.png +0 -0
  37. data/doc/images/groupbox.png +0 -0
  38. data/doc/images/header.png +0 -0
  39. data/doc/images/hello-with-button.png +0 -0
  40. data/doc/images/hello-with-icon-1.png +0 -0
  41. data/doc/images/hello-with-icon-2.png +0 -0
  42. data/doc/images/hello-with-icon-3.png +0 -0
  43. data/doc/images/hello-with-tooltip.png +0 -0
  44. data/doc/images/hello-without-button.png +0 -0
  45. data/doc/images/hello.png +0 -0
  46. data/doc/images/hello2.png +0 -0
  47. data/doc/images/iconlist-bigicons.png +0 -0
  48. data/doc/images/iconlist-details.png +0 -0
  49. data/doc/images/image.png +0 -0
  50. data/doc/images/imageviewer.png +0 -0
  51. data/doc/images/inheritance.png +0 -0
  52. data/doc/images/mditest.png +0 -0
  53. data/doc/images/raabrowser.png +0 -0
  54. data/doc/images/scribble.png +0 -0
  55. data/doc/images/shutter.png +0 -0
  56. data/doc/images/splitter.png +0 -0
  57. data/doc/images/tabbook.png +0 -0
  58. data/doc/images/table.png +0 -0
  59. data/doc/images/tutorial1.png +0 -0
  60. data/doc/implementation.html +16 -0
  61. data/doc/infosources.html +33 -0
  62. data/doc/library.html +30 -0
  63. data/doc/opengl.html +73 -0
  64. data/doc/pt01.html +3 -0
  65. data/doc/pt02.html +3 -0
  66. data/doc/scintilla.html +36 -0
  67. data/doc/style.css +247 -0
  68. data/doc/subversion.html +21 -0
  69. data/doc/tutorial1.html +90 -0
  70. data/doc/unicode.html +56 -0
  71. data/examples/RAA.rb +25 -0
  72. data/examples/README +53 -0
  73. data/examples/babelfish.rb +72 -0
  74. data/examples/bounce.rb +159 -0
  75. data/examples/browser.rb +191 -0
  76. data/examples/button.rb +168 -0
  77. data/examples/charts.rb +35 -0
  78. data/examples/custom_table_item.rb +170 -0
  79. data/examples/datatarget.rb +223 -0
  80. data/examples/dctest.rb +696 -0
  81. data/examples/dialog.rb +143 -0
  82. data/examples/dilbert.rb +66 -0
  83. data/examples/dirlist.rb +63 -0
  84. data/examples/dragdrop.rb +97 -0
  85. data/examples/dragsource.rb +80 -0
  86. data/examples/dropsite.rb +59 -0
  87. data/examples/foursplit.rb +97 -0
  88. data/examples/gltest.rb +330 -0
  89. data/examples/glviewer.rb +576 -0
  90. data/examples/groupbox.rb +392 -0
  91. data/examples/header.rb +149 -0
  92. data/examples/hello.rb +12 -0
  93. data/examples/hello2.rb +51 -0
  94. data/examples/iRAA.rb +153 -0
  95. data/examples/iconlist.rb +92 -0
  96. data/examples/icons/AngryGuyInBunnySuit.ico +0 -0
  97. data/examples/icons/FatBot.ico +0 -0
  98. data/examples/icons/FlippedySwitch.ico +0 -0
  99. data/examples/icons/LeGoon.ico +0 -0
  100. data/examples/icons/Net.ico +0 -0
  101. data/examples/icons/RedMacOS.ico +0 -0
  102. data/examples/icons/SawBlade.ico +0 -0
  103. data/examples/icons/backview.png +0 -0
  104. data/examples/icons/big.png +0 -0
  105. data/examples/icons/bigfolder.png +0 -0
  106. data/examples/icons/bigpenguin.png +0 -0
  107. data/examples/icons/bottomview.png +0 -0
  108. data/examples/icons/camera.png +0 -0
  109. data/examples/icons/capbutt.png +0 -0
  110. data/examples/icons/capnotlast.png +0 -0
  111. data/examples/icons/capproj.png +0 -0
  112. data/examples/icons/capround.png +0 -0
  113. data/examples/icons/colorpal.png +0 -0
  114. data/examples/icons/copy.png +0 -0
  115. data/examples/icons/cut.png +0 -0
  116. data/examples/icons/delimit.png +0 -0
  117. data/examples/icons/dippy.png +0 -0
  118. data/examples/icons/double_dash.png +0 -0
  119. data/examples/icons/filenew.png +0 -0
  120. data/examples/icons/fileopen.png +0 -0
  121. data/examples/icons/filesave.png +0 -0
  122. data/examples/icons/filesaveas.png +0 -0
  123. data/examples/icons/fonts.png +0 -0
  124. data/examples/icons/fox.png +0 -0
  125. data/examples/icons/foxicon.png +0 -0
  126. data/examples/icons/frontview.png +0 -0
  127. data/examples/icons/gem_big.png +0 -0
  128. data/examples/icons/gem_small.png +0 -0
  129. data/examples/icons/hello2.png +0 -0
  130. data/examples/icons/help.png +0 -0
  131. data/examples/icons/indent.png +0 -0
  132. data/examples/icons/jbevel.png +0 -0
  133. data/examples/icons/jmiter.png +0 -0
  134. data/examples/icons/jround.png +0 -0
  135. data/examples/icons/kill.png +0 -0
  136. data/examples/icons/leftview.png +0 -0
  137. data/examples/icons/light.png +0 -0
  138. data/examples/icons/minidoc.png +0 -0
  139. data/examples/icons/minifolder.png +0 -0
  140. data/examples/icons/minifolderopen.png +0 -0
  141. data/examples/icons/newfolder.png +0 -0
  142. data/examples/icons/nolight.png +0 -0
  143. data/examples/icons/onoff_dash.png +0 -0
  144. data/examples/icons/palette.png +0 -0
  145. data/examples/icons/parallel.png +0 -0
  146. data/examples/icons/paste.png +0 -0
  147. data/examples/icons/pattern.png +0 -0
  148. data/examples/icons/penguin.png +0 -0
  149. data/examples/icons/perspective.png +0 -0
  150. data/examples/icons/printicon.png +0 -0
  151. data/examples/icons/prop.png +0 -0
  152. data/examples/icons/redo.png +0 -0
  153. data/examples/icons/rightview.png +0 -0
  154. data/examples/icons/saveas.png +0 -0
  155. data/examples/icons/shutter1.png +0 -0
  156. data/examples/icons/shutter2.png +0 -0
  157. data/examples/icons/small.png +0 -0
  158. data/examples/icons/smoothlight.png +0 -0
  159. data/examples/icons/solid_line.png +0 -0
  160. data/examples/icons/tbuplevel.png +0 -0
  161. data/examples/icons/topview.png +0 -0
  162. data/examples/icons/undo.png +0 -0
  163. data/examples/icons/winapp.png +0 -0
  164. data/examples/icons/zoom.png +0 -0
  165. data/examples/image.rb +279 -0
  166. data/examples/imageviewer.rb +509 -0
  167. data/examples/inputs.rb +83 -0
  168. data/examples/mditest.rb +180 -0
  169. data/examples/pig.rb +77 -0
  170. data/examples/raabrowser.rb +122 -0
  171. data/examples/ratio.rb +80 -0
  172. data/examples/rulerview.rb +27 -0
  173. data/examples/scintilla-test.rb +81 -0
  174. data/examples/scribble-orig.rb +186 -0
  175. data/examples/scribble.rb +162 -0
  176. data/examples/shutter.rb +158 -0
  177. data/examples/splitter.rb +211 -0
  178. data/examples/styledtext.rb +82 -0
  179. data/examples/tabbook.rb +165 -0
  180. data/examples/table.rb +182 -0
  181. data/examples/textedit/commands.rb +114 -0
  182. data/examples/textedit/helpwindow.rb +299 -0
  183. data/examples/textedit/prefdialog.rb +239 -0
  184. data/examples/textedit/textedit.rb +1763 -0
  185. data/examples/unicode.rb +36 -0
  186. data/ext/fox16/fox16.so +0 -0
  187. data/index.html +14 -0
  188. data/lib/fox16/accel_table.rb +70 -0
  189. data/lib/fox16/aliases.rb +5611 -0
  190. data/lib/fox16/calendar.rb +217 -0
  191. data/lib/fox16/chore.rb +105 -0
  192. data/lib/fox16/colors.rb +280 -0
  193. data/lib/fox16/core.rb +700 -0
  194. data/lib/fox16/dict.rb +35 -0
  195. data/lib/fox16/exceptions_for_fxerror.rb +17 -0
  196. data/lib/fox16/execute_nonmodal.rb +70 -0
  197. data/lib/fox16/glgroup.rb +166 -0
  198. data/lib/fox16/glshapes.rb +456 -0
  199. data/lib/fox16/input.rb +59 -0
  200. data/lib/fox16/irb.rb +178 -0
  201. data/lib/fox16/iterators.rb +420 -0
  202. data/lib/fox16/keys.rb +1374 -0
  203. data/lib/fox16/kwargs.rb +2740 -0
  204. data/lib/fox16/missingdep.rb +14 -0
  205. data/lib/fox16/pseudokeyboard.rb +40 -0
  206. data/lib/fox16/pseudomouse.rb +87 -0
  207. data/lib/fox16/responder.rb +70 -0
  208. data/lib/fox16/responder2.rb +132 -0
  209. data/lib/fox16/scintilla.rb +3641 -0
  210. data/lib/fox16/settings.rb +18 -0
  211. data/lib/fox16/signal.rb +71 -0
  212. data/lib/fox16/splashscreen.rb +82 -0
  213. data/lib/fox16/timeout.rb +136 -0
  214. data/lib/fox16/undolist.rb +455 -0
  215. data/lib/fox16/version.rb +9 -0
  216. data/rdoc-sources/FX4Splitter.rb +156 -0
  217. data/rdoc-sources/FX7Segment.rb +54 -0
  218. data/rdoc-sources/FXAccelTable.rb +84 -0
  219. data/rdoc-sources/FXApp.rb +545 -0
  220. data/rdoc-sources/FXArrowButton.rb +69 -0
  221. data/rdoc-sources/FXBMPIcon.rb +67 -0
  222. data/rdoc-sources/FXBMPImage.rb +30 -0
  223. data/rdoc-sources/FXBitmap.rb +115 -0
  224. data/rdoc-sources/FXBitmapFrame.rb +31 -0
  225. data/rdoc-sources/FXBitmapView.rb +44 -0
  226. data/rdoc-sources/FXButton.rb +59 -0
  227. data/rdoc-sources/FXCURCursor.rb +13 -0
  228. data/rdoc-sources/FXCanvas.rb +18 -0
  229. data/rdoc-sources/FXCheckButton.rb +58 -0
  230. data/rdoc-sources/FXChoiceBox.rb +49 -0
  231. data/rdoc-sources/FXColorBar.rb +48 -0
  232. data/rdoc-sources/FXColorDialog.rb +37 -0
  233. data/rdoc-sources/FXColorList.rb +55 -0
  234. data/rdoc-sources/FXColorRing.rb +49 -0
  235. data/rdoc-sources/FXColorSelector.rb +65 -0
  236. data/rdoc-sources/FXColorWell.rb +65 -0
  237. data/rdoc-sources/FXColorWheel.rb +57 -0
  238. data/rdoc-sources/FXComboBox.rb +214 -0
  239. data/rdoc-sources/FXComposite.rb +34 -0
  240. data/rdoc-sources/FXCursor.rb +67 -0
  241. data/rdoc-sources/FXDC.rb +720 -0
  242. data/rdoc-sources/FXDCPrint.rb +127 -0
  243. data/rdoc-sources/FXDCWindow.rb +33 -0
  244. data/rdoc-sources/FXDataTarget.rb +66 -0
  245. data/rdoc-sources/FXDebugTarget.rb +25 -0
  246. data/rdoc-sources/FXDelegator.rb +23 -0
  247. data/rdoc-sources/FXDial.rb +107 -0
  248. data/rdoc-sources/FXDialogBox.rb +32 -0
  249. data/rdoc-sources/FXDict.rb +79 -0
  250. data/rdoc-sources/FXDirBox.rb +55 -0
  251. data/rdoc-sources/FXDirDialog.rb +47 -0
  252. data/rdoc-sources/FXDirList.rb +149 -0
  253. data/rdoc-sources/FXDirSelector.rb +64 -0
  254. data/rdoc-sources/FXDockBar.rb +151 -0
  255. data/rdoc-sources/FXDockHandler.rb +26 -0
  256. data/rdoc-sources/FXDockSite.rb +104 -0
  257. data/rdoc-sources/FXDockTitle.rb +26 -0
  258. data/rdoc-sources/FXDocument.rb +29 -0
  259. data/rdoc-sources/FXDragCorner.rb +19 -0
  260. data/rdoc-sources/FXDrawable.rb +27 -0
  261. data/rdoc-sources/FXDriveBox.rb +46 -0
  262. data/rdoc-sources/FXExtentd.rb +85 -0
  263. data/rdoc-sources/FXExtentf.rb +85 -0
  264. data/rdoc-sources/FXFileDialog.rb +217 -0
  265. data/rdoc-sources/FXFileDict.rb +131 -0
  266. data/rdoc-sources/FXFileList.rb +208 -0
  267. data/rdoc-sources/FXFileSelector.rb +184 -0
  268. data/rdoc-sources/FXFileStream.rb +27 -0
  269. data/rdoc-sources/FXFoldingList.rb +504 -0
  270. data/rdoc-sources/FXFont.rb +361 -0
  271. data/rdoc-sources/FXFontDialog.rb +14 -0
  272. data/rdoc-sources/FXFontSelector.rb +37 -0
  273. data/rdoc-sources/FXFrame.rb +53 -0
  274. data/rdoc-sources/FXGIFCursor.rb +50 -0
  275. data/rdoc-sources/FXGIFIcon.rb +31 -0
  276. data/rdoc-sources/FXGIFImage.rb +29 -0
  277. data/rdoc-sources/FXGLCanvas.rb +45 -0
  278. data/rdoc-sources/FXGLContext.rb +40 -0
  279. data/rdoc-sources/FXGLObject.rb +75 -0
  280. data/rdoc-sources/FXGLShape.rb +69 -0
  281. data/rdoc-sources/FXGLViewer.rb +332 -0
  282. data/rdoc-sources/FXGLVisual.rb +94 -0
  283. data/rdoc-sources/FXGradientBar.rb +301 -0
  284. data/rdoc-sources/FXGroupBox.rb +36 -0
  285. data/rdoc-sources/FXHeader.rb +411 -0
  286. data/rdoc-sources/FXHorizontalFrame.rb +29 -0
  287. data/rdoc-sources/FXICOIcon.rb +65 -0
  288. data/rdoc-sources/FXICOImage.rb +31 -0
  289. data/rdoc-sources/FXIcon.rb +38 -0
  290. data/rdoc-sources/FXIconDict.rb +48 -0
  291. data/rdoc-sources/FXIconList.rb +450 -0
  292. data/rdoc-sources/FXIconSource.rb +100 -0
  293. data/rdoc-sources/FXId.rb +34 -0
  294. data/rdoc-sources/FXImage.rb +292 -0
  295. data/rdoc-sources/FXImageFrame.rb +36 -0
  296. data/rdoc-sources/FXImageView.rb +35 -0
  297. data/rdoc-sources/FXInputDialog.rb +80 -0
  298. data/rdoc-sources/FXJPGIcon.rb +70 -0
  299. data/rdoc-sources/FXJPGImage.rb +38 -0
  300. data/rdoc-sources/FXKnob.rb +76 -0
  301. data/rdoc-sources/FXLabel.rb +72 -0
  302. data/rdoc-sources/FXList.rb +443 -0
  303. data/rdoc-sources/FXListBox.rb +191 -0
  304. data/rdoc-sources/FXMDIButton.rb +67 -0
  305. data/rdoc-sources/FXMDIChild.rb +155 -0
  306. data/rdoc-sources/FXMDIClient.rb +65 -0
  307. data/rdoc-sources/FXMainWindow.rb +26 -0
  308. data/rdoc-sources/FXMatrix.rb +57 -0
  309. data/rdoc-sources/FXMemoryBuffer.rb +28 -0
  310. data/rdoc-sources/FXMemoryStream.rb +50 -0
  311. data/rdoc-sources/FXMenuBar.rb +23 -0
  312. data/rdoc-sources/FXMenuButton.rb +84 -0
  313. data/rdoc-sources/FXMenuCaption.rb +53 -0
  314. data/rdoc-sources/FXMenuCascade.rb +18 -0
  315. data/rdoc-sources/FXMenuCheck.rb +30 -0
  316. data/rdoc-sources/FXMenuCommand.rb +26 -0
  317. data/rdoc-sources/FXMenuPane.rb +13 -0
  318. data/rdoc-sources/FXMenuRadio.rb +33 -0
  319. data/rdoc-sources/FXMenuSeparator.rb +21 -0
  320. data/rdoc-sources/FXMenuTitle.rb +27 -0
  321. data/rdoc-sources/FXMessageBox.rb +73 -0
  322. data/rdoc-sources/FXObject.rb +28 -0
  323. data/rdoc-sources/FXOptionMenu.rb +83 -0
  324. data/rdoc-sources/FXPCXIcon.rb +63 -0
  325. data/rdoc-sources/FXPCXImage.rb +31 -0
  326. data/rdoc-sources/FXPNGIcon.rb +66 -0
  327. data/rdoc-sources/FXPNGImage.rb +34 -0
  328. data/rdoc-sources/FXPPMIcon.rb +36 -0
  329. data/rdoc-sources/FXPPMImage.rb +31 -0
  330. data/rdoc-sources/FXPacker.rb +63 -0
  331. data/rdoc-sources/FXPicker.rb +27 -0
  332. data/rdoc-sources/FXPopup.rb +53 -0
  333. data/rdoc-sources/FXPrintDialog.rb +36 -0
  334. data/rdoc-sources/FXProgressBar.rb +57 -0
  335. data/rdoc-sources/FXProgressDialog.rb +36 -0
  336. data/rdoc-sources/FXQuatd.rb +164 -0
  337. data/rdoc-sources/FXQuatf.rb +173 -0
  338. data/rdoc-sources/FXRGBIcon.rb +64 -0
  339. data/rdoc-sources/FXRGBImage.rb +31 -0
  340. data/rdoc-sources/FXRadioButton.rb +70 -0
  341. data/rdoc-sources/FXRanged.rb +100 -0
  342. data/rdoc-sources/FXRangef.rb +100 -0
  343. data/rdoc-sources/FXRealSlider.rb +101 -0
  344. data/rdoc-sources/FXRealSpinner.rb +140 -0
  345. data/rdoc-sources/FXRecentFiles.rb +77 -0
  346. data/rdoc-sources/FXRectangle.rb +149 -0
  347. data/rdoc-sources/FXRegion.rb +64 -0
  348. data/rdoc-sources/FXRegistry.rb +56 -0
  349. data/rdoc-sources/FXReplaceDialog.rb +56 -0
  350. data/rdoc-sources/FXRootWindow.rb +17 -0
  351. data/rdoc-sources/FXRuler.rb +130 -0
  352. data/rdoc-sources/FXRulerView.rb +225 -0
  353. data/rdoc-sources/FXScintilla.rb +121 -0
  354. data/rdoc-sources/FXScrollArea.rb +86 -0
  355. data/rdoc-sources/FXScrollBar.rb +107 -0
  356. data/rdoc-sources/FXScrollPane.rb +28 -0
  357. data/rdoc-sources/FXScrollWindow.rb +38 -0
  358. data/rdoc-sources/FXSearchDialog.rb +24 -0
  359. data/rdoc-sources/FXSeparator.rb +74 -0
  360. data/rdoc-sources/FXSettings.rb +248 -0
  361. data/rdoc-sources/FXShell.rb +8 -0
  362. data/rdoc-sources/FXShutter.rb +102 -0
  363. data/rdoc-sources/FXSize.rb +95 -0
  364. data/rdoc-sources/FXSlider.rb +98 -0
  365. data/rdoc-sources/FXSphered.rb +80 -0
  366. data/rdoc-sources/FXSpheref.rb +80 -0
  367. data/rdoc-sources/FXSpinner.rb +136 -0
  368. data/rdoc-sources/FXSplashWindow.rb +27 -0
  369. data/rdoc-sources/FXSplitter.rb +89 -0
  370. data/rdoc-sources/FXSpring.rb +61 -0
  371. data/rdoc-sources/FXStatusBar.rb +42 -0
  372. data/rdoc-sources/FXStatusLine.rb +60 -0
  373. data/rdoc-sources/FXStream.rb +142 -0
  374. data/rdoc-sources/FXStringDict.rb +38 -0
  375. data/rdoc-sources/FXSwitcher.rb +78 -0
  376. data/rdoc-sources/FXTGAIcon.rb +63 -0
  377. data/rdoc-sources/FXTGAImage.rb +31 -0
  378. data/rdoc-sources/FXTIFIcon.rb +70 -0
  379. data/rdoc-sources/FXTIFImage.rb +37 -0
  380. data/rdoc-sources/FXTabBar.rb +80 -0
  381. data/rdoc-sources/FXTabBook.rb +41 -0
  382. data/rdoc-sources/FXTabItem.rb +58 -0
  383. data/rdoc-sources/FXTable.rb +975 -0
  384. data/rdoc-sources/FXText.rb +581 -0
  385. data/rdoc-sources/FXTextField.rb +151 -0
  386. data/rdoc-sources/FXToggleButton.rb +70 -0
  387. data/rdoc-sources/FXToolBar.rb +61 -0
  388. data/rdoc-sources/FXToolBarGrip.rb +50 -0
  389. data/rdoc-sources/FXToolBarShell.rb +44 -0
  390. data/rdoc-sources/FXToolBarTab.rb +74 -0
  391. data/rdoc-sources/FXToolTip.rb +39 -0
  392. data/rdoc-sources/FXTopWindow.rb +163 -0
  393. data/rdoc-sources/FXTranslator.rb +32 -0
  394. data/rdoc-sources/FXTreeList.rb +514 -0
  395. data/rdoc-sources/FXTreeListBox.rb +219 -0
  396. data/rdoc-sources/FXTriStateButton.rb +49 -0
  397. data/rdoc-sources/FXVec2d.rb +96 -0
  398. data/rdoc-sources/FXVec2f.rb +96 -0
  399. data/rdoc-sources/FXVec3d.rb +118 -0
  400. data/rdoc-sources/FXVec3f.rb +118 -0
  401. data/rdoc-sources/FXVec4d.rb +139 -0
  402. data/rdoc-sources/FXVec4f.rb +139 -0
  403. data/rdoc-sources/FXVerticalFrame.rb +29 -0
  404. data/rdoc-sources/FXVisual.rb +79 -0
  405. data/rdoc-sources/FXWindow.rb +725 -0
  406. data/rdoc-sources/FXWizard.rb +59 -0
  407. data/rdoc-sources/FXXBMIcon.rb +37 -0
  408. data/rdoc-sources/FXXBMImage.rb +32 -0
  409. data/rdoc-sources/FXXPMIcon.rb +65 -0
  410. data/rdoc-sources/FXXPMImage.rb +31 -0
  411. data/rdoc-sources/README.rdoc +53 -0
  412. data/rdoc-sources/fxdefs.rb +90 -0
  413. data/tests/README +19 -0
  414. data/tests/TC_FXAccelTable.rb +57 -0
  415. data/tests/TC_FXApp.rb +16 -0
  416. data/tests/TC_FXArc.rb +26 -0
  417. data/tests/TC_FXBMPIcon.rb +15 -0
  418. data/tests/TC_FXBMPImage.rb +15 -0
  419. data/tests/TC_FXButton.rb +78 -0
  420. data/tests/TC_FXCheckButton.rb +57 -0
  421. data/tests/TC_FXComboBox.rb +63 -0
  422. data/tests/TC_FXDC.rb +372 -0
  423. data/tests/TC_FXDCPrint.rb +101 -0
  424. data/tests/TC_FXDCWindow.rb +23 -0
  425. data/tests/TC_FXDataTarget.rb +24 -0
  426. data/tests/TC_FXDialogBox.rb +12 -0
  427. data/tests/TC_FXDirList.rb +30 -0
  428. data/tests/TC_FXExtentd.rb +21 -0
  429. data/tests/TC_FXExtentf.rb +21 -0
  430. data/tests/TC_FXFileAssoc.rb +62 -0
  431. data/tests/TC_FXFileStream.rb +89 -0
  432. data/tests/TC_FXFoldingList.rb +32 -0
  433. data/tests/TC_FXFont.rb +69 -0
  434. data/tests/TC_FXFontDesc.rb +58 -0
  435. data/tests/TC_FXGLGroup.rb +32 -0
  436. data/tests/TC_FXGLShape.rb +28 -0
  437. data/tests/TC_FXGLViewer.rb +20 -0
  438. data/tests/TC_FXGradientBar.rb +89 -0
  439. data/tests/TC_FXHeader.rb +82 -0
  440. data/tests/TC_FXHiliteStyle.rb +23 -0
  441. data/tests/TC_FXIconDict.rb +52 -0
  442. data/tests/TC_FXIconList.rb +192 -0
  443. data/tests/TC_FXId.rb +19 -0
  444. data/tests/TC_FXImage.rb +155 -0
  445. data/tests/TC_FXLight.rb +33 -0
  446. data/tests/TC_FXList.rb +116 -0
  447. data/tests/TC_FXListBox.rb +49 -0
  448. data/tests/TC_FXMainWindow.rb +19 -0
  449. data/tests/TC_FXMat4f.rb +228 -0
  450. data/tests/TC_FXMaterial.rb +89 -0
  451. data/tests/TC_FXMemoryStream.rb +97 -0
  452. data/tests/TC_FXMenuCheck.rb +57 -0
  453. data/tests/TC_FXMenuCommand.rb +12 -0
  454. data/tests/TC_FXMenuRadio.rb +57 -0
  455. data/tests/TC_FXMessageBox.rb +25 -0
  456. data/tests/TC_FXPoint.rb +57 -0
  457. data/tests/TC_FXQuatf.rb +93 -0
  458. data/tests/TC_FXRadioButton.rb +57 -0
  459. data/tests/TC_FXRanged.rb +42 -0
  460. data/tests/TC_FXRangef.rb +42 -0
  461. data/tests/TC_FXRectangle.rb +88 -0
  462. data/tests/TC_FXRegion.rb +54 -0
  463. data/tests/TC_FXRegistry.rb +27 -0
  464. data/tests/TC_FXScrollArea.rb +28 -0
  465. data/tests/TC_FXScrollWindow.rb +28 -0
  466. data/tests/TC_FXSegment.rb +22 -0
  467. data/tests/TC_FXSettings.rb +34 -0
  468. data/tests/TC_FXShell.rb +26 -0
  469. data/tests/TC_FXSize.rb +54 -0
  470. data/tests/TC_FXStream.rb +11 -0
  471. data/tests/TC_FXTable.rb +561 -0
  472. data/tests/TC_FXTableItem.rb +48 -0
  473. data/tests/TC_FXText.rb +96 -0
  474. data/tests/TC_FXTopWindow.rb +32 -0
  475. data/tests/TC_FXTreeList.rb +100 -0
  476. data/tests/TC_FXTreeListBox.rb +41 -0
  477. data/tests/TC_FXUndoList.rb +43 -0
  478. data/tests/TC_FXVec2d.rb +142 -0
  479. data/tests/TC_FXVec2f.rb +137 -0
  480. data/tests/TC_FXVec3d.rb +150 -0
  481. data/tests/TC_FXVec3f.rb +150 -0
  482. data/tests/TC_FXVec4f.rb +158 -0
  483. data/tests/TC_FXViewport.rb +30 -0
  484. data/tests/TC_FXXBMIcon.rb +15 -0
  485. data/tests/TC_FXXBMImage.rb +15 -0
  486. data/tests/TC_FXXPMIcon.rb +15 -0
  487. data/tests/TC_FXXPMImage.rb +15 -0
  488. data/tests/TC_Misc.rb +157 -0
  489. data/tests/TC_downcast.rb +15 -0
  490. data/tests/TS_All.rb +25 -0
  491. data/tests/blankpage.ps +166 -0
  492. data/tests/howdypage.ps +181 -0
  493. data/tests/stress1.rb +92 -0
  494. data/tests/stress2.rb +51 -0
  495. data/tests/stress3.rb +117 -0
  496. data/tests/testcase.rb +37 -0
  497. metadata +556 -0
@@ -0,0 +1,18 @@
1
+ #
2
+ # Adds some methods to FOX's FXSettings class
3
+ #
4
+ module Fox
5
+ class FXSettings
6
+ #
7
+ # Iterate over sections (where each section is a dictionary).
8
+ #
9
+ def each_section
10
+ pos = first
11
+ while pos < getTotalSize()
12
+ yield data(pos)
13
+ pos = self.next(pos)
14
+ end
15
+ end
16
+ end
17
+ end
18
+
@@ -0,0 +1,71 @@
1
+ module Fox
2
+
3
+ class FXApp
4
+
5
+ alias addSignalOrig addSignal # :nodoc:
6
+
7
+ #
8
+ # Register a signal processing message to be sent to target object when
9
+ # the specified signal is raised.
10
+ #
11
+ # There are several forms for #addSignal; the original form (from FOX)
12
+ # takes (up to) five arguments:
13
+ #
14
+ # anApp.addSignal(aSignal, anObject, aMessageId, sendImmediately=false, flags=0)
15
+ #
16
+ # Here, _aSignal_ is a string indicating the operating system signal of interest
17
+ # (such as "SIGINT").
18
+ # The second and third arguments are the target object and message identifier for
19
+ # the message to be sent when this signal is raised.
20
+ # If _sendImmediately_ is +true+, the message will be sent to the target right away;
21
+ # this should be used with extreme care as the application is interrupted
22
+ # at an unknown point in its execution.
23
+ # The _flags_ are to be set as per POSIX definitions.
24
+ #
25
+ # A second form of #addSignal takes a Method instance as its second argument:
26
+ #
27
+ # anApp.addSignal(aSignal, aMethod, sendImmediately=false, flags=0)
28
+ #
29
+ # For this form, the method should have the standard argument list
30
+ # for a FOX message handler. That is, the method should take three
31
+ # arguments, for the message _sender_ (an FXObject), the message _selector_,
32
+ # and the message _data_ (if any).
33
+ #
34
+ # The last form of #addSignal takes a block:
35
+ #
36
+ # anApp.addSignal(aSignal, sendImmediately=false, flags=0) { |sender, sel, data|
37
+ # ... handle the signal ...
38
+ # }
39
+ #
40
+
41
+ def addSignal(sig, *args, &block)
42
+ params = {}
43
+ params = args.pop if args.last.is_a? Hash
44
+ tgt, sel, immediate, flags = nil, 0, false, 0
45
+ if args.length > 0
46
+ if args[0].respond_to? :call
47
+ tgt = FXPseudoTarget.new
48
+ tgt.pconnect(SEL_SIGNAL, args[0], params)
49
+ immediate = (args.length > 1) ? args[1] : false
50
+ flags = (args.length > 2) ? args[2] : 0
51
+ elsif (args[0].kind_of? TrueClass) || (args[0].kind_of? FalseClass)
52
+ tgt = FXPseudoTarget.new
53
+ tgt.pconnect(SEL_SIGNAL, block, params)
54
+ immediate = args[0]
55
+ flags = (args.length > 1) ? args[1] : 0
56
+ else # it's some other kind of object
57
+ tgt = args[0]
58
+ sel = (args.length > 1) ? args[1] : 0
59
+ immediate = (args.length > 2) ? args[2] : false
60
+ flags = (args.length > 3) ? args[3] : 0
61
+ end
62
+ else
63
+ tgt = FXPseudoTarget.new
64
+ tgt.pconnect(SEL_SIGNAL, block, params)
65
+ end
66
+ addSignalOrig(sig, tgt, sel, immediate, flags)
67
+ end
68
+
69
+ end # class FXApp
70
+
71
+ end # module Fox
@@ -0,0 +1,82 @@
1
+ #
2
+ # Splashscreen component, contributed by David Naseby.
3
+ #
4
+
5
+ require 'fox16/colors'
6
+
7
+ module Fox
8
+ #
9
+ # The FXSplashScreen window...
10
+ #
11
+ class FXSplashScreen < FXDialogBox
12
+
13
+ #
14
+ # Return an initialized FXSplashScreen instance.
15
+ #
16
+ # ==== Parameters:
17
+ #
18
+ # +owner+:: Owner window for this dialog box [FXWindow]
19
+ # +title+:: Title string for this dialog box [String]
20
+ # +text+:: Message text for this dialog box [String]
21
+ # +action+:: The action
22
+ #
23
+ def initialize( owner, title, text, action )
24
+ # Initialize the base class first
25
+ super(owner, title)
26
+
27
+ # Store the action block
28
+ @action = action
29
+
30
+ # Construct the window contents
31
+ FXVerticalFrame.new( self ) do |frame|
32
+ text.each_line do |line|
33
+ FXLabel.new( frame, line.strip )
34
+ end
35
+ FXLabel.new( frame, "Click OK to continue (this may take a few moments)...." )
36
+ @status = FXLabel.new( frame, " " )
37
+ @accept = FXButton.new( frame, "&OK", nil, self, ID_ACCEPT,
38
+ FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT|LAYOUT_CENTER_Y)
39
+ @accept.enabled = false
40
+ end
41
+ end
42
+
43
+ def execute(placement = PLACEMENT_OWNER)
44
+ Thread.new do
45
+ sleep 1
46
+ @action.call method( :update_status )
47
+ update_status "Completed"
48
+ @accept.enabled = true
49
+ end
50
+ super
51
+ end
52
+
53
+ def update_status(msg)
54
+ @status.text = msg
55
+ end
56
+ end
57
+ end
58
+
59
+ if $0 == __FILE__
60
+ class FakeSite # :nodoc:
61
+ def open( &status )
62
+ yield ">>>>> Opening Site" if block_given?
63
+ sleep 5
64
+ yield "site open" if block_given?
65
+ end
66
+ end
67
+ fake_site = FakeSite.new
68
+
69
+ include Fox
70
+
71
+ FXApp.new( "Test SplashScreen" ) do |theApp|
72
+ FXMainWindow.new( theApp, "Hello" ) do |mainWin|
73
+ FXButton.new( mainWin, "Show Splash" ).connect( SEL_COMMAND ) do
74
+ lv = FXSplashScreen.new( mainWin, "Opening Site", "Welcome to Sitebuilder!\nOpening the site.\n", lambda{ |proc| fake_site.open( &proc ) } )
75
+ lv.execute
76
+ end
77
+ mainWin.show
78
+ end
79
+ theApp.create
80
+ theApp.run
81
+ end
82
+ end
@@ -0,0 +1,136 @@
1
+ module Fox
2
+
3
+ class FXApp
4
+
5
+ alias addTimeoutOrig addTimeout # :nodoc:
6
+ alias removeTimeoutOrig removeTimeout # :nodoc:
7
+ alias hasTimeoutOrig? hasTimeout? # :nodoc:
8
+ alias remainingTimeoutOrig remainingTimeout # :nodoc:
9
+
10
+ #
11
+ # Add a timeout message to be sent to target object in _ms_ milliseconds.
12
+ # By default, the timer fires only once after the interval expires. The last argument
13
+ # is optional user data which will be passed along as the _ptr_ argument of
14
+ # the message handler. If a timer with the same target and message already exists,
15
+ # it will be rescheduled.
16
+ #
17
+ # There are several forms for #addTimeout; the original form (from FOX)
18
+ # takes three arguments:
19
+ #
20
+ # timeout = app.addTimeout(delay, tgt, sel)
21
+ #
22
+ # Here, _delay_ is the time interval (in milliseconds) to wait
23
+ # before firing this timeout. The second and third arguments are the
24
+ # target object and message identifier for the message to be sent when
25
+ # this timeout fires.
26
+ #
27
+ # A second form of #addTimeout takes a Method instance as its single argument:
28
+ #
29
+ # timeout = app.addTimeout(delay, mthd)
30
+ #
31
+ # For this form, the method should have the standard argument list
32
+ # for a FOX message handler. That is, the method should take three
33
+ # arguments, for the message _sender_ (an FXObject), the message _selector_,
34
+ # and the message _data_ (if any).
35
+ #
36
+ # The last form of #addTimeout takes a block:
37
+ #
38
+ # timeout = app.addTimeout(delay) do |sender, sel, data|
39
+ # ... handle the timeout ...
40
+ # end
41
+ #
42
+ # All of these return a reference to an opaque object (actually, a hash) that
43
+ # can be passed to #removeTimeout if it is necessary to remove the timeout
44
+ # before it fires.
45
+ #
46
+ # For the last two forms, you can pass in the optional +:repeat+ parameter to
47
+ # cause the timeout to be re-registered after it fires, e.g.
48
+ #
49
+ # timeout = app.addTimeout(delay, :repeat => true) do |sender, sel, data|
50
+ # ... handle the timeout ...
51
+ # ... re-add the timeout with the same delay ...
52
+ # end
53
+ #
54
+ def addTimeout(ms, *args, &block)
55
+ params = {}
56
+ params = args.pop if args.last.is_a? Hash
57
+ params[:delay] = ms
58
+ tgt, sel = nil, 0
59
+ if args.length > 0
60
+ if args[0].respond_to? :call
61
+ tgt = params[:target] || FXPseudoTarget.new
62
+ tgt.pconnect(SEL_TIMEOUT, args[0], params)
63
+ else # it's some other kind of object
64
+ tgt = args[0]
65
+ sel = args[1]
66
+ end
67
+ else
68
+ tgt = params[:target] || FXPseudoTarget.new
69
+ tgt.pconnect(SEL_TIMEOUT, block, params)
70
+ end
71
+ addTimeoutOrig(tgt, sel, ms)
72
+ params[:target] = tgt
73
+ params[:selector] = sel
74
+ params
75
+ end
76
+
77
+ #
78
+ # Remove timeout previously registered using #addTimeout; returns +nil+.
79
+ # For an example of how to use #removeTimeout, see the documentation for
80
+ # the #hasTimeout? method.
81
+ #
82
+ def removeTimeout(*args)
83
+ if args.length == 2
84
+ removeTimeoutOrig(args[0], args[1])
85
+ else
86
+ params = args[0]
87
+ removeTimeoutOrig(params[:target], params[:selector])
88
+ end
89
+ end
90
+
91
+ #
92
+ # Return +true+ if given timeout has been set, otherwise return +false+.
93
+ #
94
+ # For example, suppose you set up a timeout event to run ten seconds from
95
+ # now:
96
+ #
97
+ # timeout = app.addTimeout(10*1000, ...)
98
+ #
99
+ # but in the meantime, you decide that you want to cancel it if it hasn't
100
+ # run yet:
101
+ #
102
+ # if app.hasTimeout?(timeout)
103
+ # app.removeTimeout(timeout)
104
+ # end
105
+ #
106
+ def hasTimeout?(*args)
107
+ if args.length == 2
108
+ hasTimeoutOrig?(args[0], args[1])
109
+ else
110
+ hsh = args[0]
111
+ hasTimeoutOrig?(hsh[:target], hsh[:selector])
112
+ end
113
+ end
114
+
115
+ #
116
+ # Return the time remaining (in milliseconds) until the given timer fires.
117
+ # If the timer is past due, zero is returned. If there is no such
118
+ # timer, infinity (UINT_MAX) is returned.
119
+ #
120
+ # For example:
121
+ #
122
+ # timeout = app.addTimeout(ms, ...)
123
+ # time_left = app.remainingTimeout(timeout)
124
+ #
125
+ def remainingTimeout(*args)
126
+ if args.length == 2
127
+ remainingTimeoutOrig(args[0], args[1])
128
+ else
129
+ hsh = args[0]
130
+ remainingTimeoutOrig(hsh[:target], hsh[:selector])
131
+ end
132
+ end
133
+
134
+ end # class FXApp
135
+
136
+ end # module Fox
@@ -0,0 +1,455 @@
1
+ #
2
+ # This is a "pure Ruby" implementation of the FXUndoList and
3
+ # FXCommand classes from the standard FOX distribution. Since those
4
+ # classes are independent of the rest of FOX this is a simpler (and probably
5
+ # more efficient) approach than trying to wrap the original C++ classes.
6
+ #
7
+ # Notes (by Jeroen, lifted from FXUndoList.cpp):
8
+ #
9
+ # * When a command is undone, it's moved to the redo list.
10
+ # * When a command is redone, it's moved back to the undo list.
11
+ # * Whenever adding a new command, the redo list is deleted.
12
+ # * At any time, you can trim down the undo list down to a given
13
+ # maximum size or a given number of undo records. This should
14
+ # keep the memory overhead within sensible bounds.
15
+ # * To keep track of when we get back to an "unmodified" state, a mark
16
+ # can be set. The <em>mark</em> is basically a counter which is incremented
17
+ # with every undo record added, and decremented when undoing a command.
18
+ # When we get back to 0, we are back to the unmodified state.
19
+ #
20
+ # If, after setting the mark, we have called FXUndoList#undo, then
21
+ # the mark can be reached by calling FXUndoList#redo.
22
+ #
23
+ # If the marked position is in the redo-list, then adding a new undo
24
+ # record will cause the redo-list to be deleted, and the marked position
25
+ # will become unreachable.
26
+ #
27
+ # The marked state may also become unreachable when the undo list is trimmed.
28
+ #
29
+ # * You can call also kill the redo list without adding a new command
30
+ # to the undo list, although this may cause the marked position to
31
+ # become unreachable.
32
+ # * We measure the size of the undo-records in the undo-list; when the
33
+ # records are moved to the redo-list, they usually contain different
34
+ # information!
35
+
36
+ require 'fox16/responder'
37
+
38
+ module Fox
39
+
40
+ #
41
+ # The undo list manages a list of undoable (and redoable) commands for a FOX
42
+ # application; it works hand-in-hand with subclasses of FXCommand and is
43
+ # an application of the well-known <em>Command</em> pattern. Your application
44
+ # code should implement any number of command classes and then add then to an
45
+ # FXUndoList instance. For an example of how this works, see the textedit
46
+ # example program from the FXRuby distribution.
47
+ #
48
+ # == Class Constants
49
+ #
50
+ # [FXUndoList::ID_UNDO] Message identifier for the undo method.
51
+ # When a +SEL_COMMAND+ message with this identifier
52
+ # is sent to an undo list, it undoes the last command.
53
+ # FXUndoList also provides a +SEL_UPDATE+ handler for this
54
+ # identifier, that enables or disables the sender
55
+ # depending on whether it's possible to undo.
56
+ #
57
+ # [FXUndoList::ID\_UNDO\_ALL] Message identifier for the "undo all" method. FXUndoList handles both
58
+ # the +SEL_COMMAND+ and +SEL_UPDATE+ messages for this message
59
+ # identifier.
60
+ #
61
+ # [FXUndoList::ID_REDO] Message identifier for the redo method. When a +SEL_COMMAND+ message
62
+ # with this identifier is sent to an undo list, it redoes the last command.
63
+ # FXUndoList also provides a +SEL_UPDATE+ handler for this identifier,
64
+ # that enables or disables the sender depending on whether it's possible to
65
+ # redo.
66
+ #
67
+ # [FXUndoList::ID\_REDO\_ALL] Message identifier for the "redo all" method. FXUndoList handles both
68
+ # the +SEL_COMMAND+ and +SEL_UPDATE+ messages for this message
69
+ # identifier.
70
+ #
71
+ # [FXUndoList::ID_CLEAR] Message identifier for the "clear" method. FXUndoList handles both
72
+ # the +SEL_COMMAND+ and +SEL_UPDATE+ messages for this message
73
+ # identifier.
74
+ #
75
+ # [FXUndoList::ID_REVERT] Message identifier for the "revert" method. FXUndoList handles both
76
+ # the +SEL_COMMAND+ and +SEL_UPDATE+ messages for this message
77
+ # identifier.
78
+ #
79
+ class FXUndoList < FXObject
80
+
81
+ include Responder
82
+
83
+ ID_CLEAR,
84
+ ID_REVERT,
85
+ ID_UNDO,
86
+ ID_REDO,
87
+ ID_UNDO_ALL,
88
+ ID_REDO_ALL,
89
+ ID_LAST = enum(0, 7)
90
+
91
+ #
92
+ # Returns an initialized FXUndoList instance.
93
+ #
94
+ def initialize
95
+ # Be sure to call base class initialize
96
+ super
97
+
98
+ # Set up the message map for this instance
99
+ FXMAPFUNC(SEL_COMMAND, ID_CLEAR, "onCmdClear")
100
+ FXMAPFUNC(SEL_UPDATE, ID_CLEAR, "onUpdClear")
101
+ FXMAPFUNC(SEL_COMMAND, ID_REVERT, "onCmdRevert")
102
+ FXMAPFUNC(SEL_UPDATE, ID_REVERT, "onUpdRevert")
103
+ FXMAPFUNC(SEL_COMMAND, ID_UNDO, "onCmdUndo")
104
+ FXMAPFUNC(SEL_UPDATE, ID_UNDO, "onUpdUndo")
105
+ FXMAPFUNC(SEL_COMMAND, ID_REDO, "onCmdRedo")
106
+ FXMAPFUNC(SEL_UPDATE, ID_REDO, "onUpdRedo")
107
+ FXMAPFUNC(SEL_COMMAND, ID_UNDO_ALL, "onCmdUndoAll")
108
+ FXMAPFUNC(SEL_UPDATE, ID_UNDO_ALL, "onUpdUndo")
109
+ FXMAPFUNC(SEL_COMMAND, ID_REDO_ALL, "onCmdRedoAll")
110
+ FXMAPFUNC(SEL_UPDATE, ID_REDO_ALL, "onUpdRedo")
111
+
112
+ # Instance variables
113
+ @undolist = []
114
+ @redolist = []
115
+ @marker = nil
116
+ @size = 0
117
+ end
118
+
119
+ #
120
+ # Cut the redo list
121
+ #
122
+ def cut
123
+ @redolist.clear
124
+ unless @marker.nil?
125
+ @marker = nil if @marker < 0
126
+ end
127
+ end
128
+
129
+ #
130
+ # Add new _command_ (an FXCommand instance) to the list.
131
+ # If _doit_ is +true+, the command is also executed.
132
+ #
133
+ def add(command, doit=false)
134
+ # Cut redo list
135
+ cut
136
+
137
+ # No command given?
138
+ return true if command.nil?
139
+
140
+ # Add it to the end of the undo list
141
+ @undolist.push(command)
142
+
143
+ # Execute it right now?
144
+ command.redo if doit
145
+
146
+ # Update size
147
+ @size += command.size # measured after redo
148
+
149
+ # Update the mark distance
150
+ @marker = @marker + 1 unless @marker.nil?
151
+
152
+ # Done
153
+ return true
154
+ end
155
+
156
+ #
157
+ # Undo last command.
158
+ #
159
+ def undo
160
+ unless @undolist.empty?
161
+ command = @undolist.pop
162
+ @size -= command.size
163
+ command.undo
164
+ @redolist.push(command)
165
+ @marker = @marker - 1 unless @marker.nil?
166
+ return true
167
+ end
168
+ return false
169
+ end
170
+
171
+ #
172
+ # Redo next command
173
+ #
174
+ def redo
175
+ unless @redolist.empty?
176
+ command = @redolist.pop
177
+ command.redo
178
+ @undolist.push(command)
179
+ @size += command.size
180
+ @marker = @marker + 1 unless @marker.nil?
181
+ return true
182
+ end
183
+ return false
184
+ end
185
+
186
+ #
187
+ # Undo all commands
188
+ #
189
+ def undoAll
190
+ undo while canUndo?
191
+ end
192
+
193
+ #
194
+ # Redo all commands
195
+ #
196
+ def redoAll
197
+ redo while canRedo?
198
+ end
199
+
200
+ #
201
+ # Revert to marked
202
+ #
203
+ def revert
204
+ unless @marker.nil?
205
+ undo while (@marker > 0)
206
+ redo while (@marker < 0)
207
+ return true
208
+ end
209
+ return false
210
+ end
211
+
212
+ #
213
+ # Return +true+ if we can still undo some commands
214
+ # (i.e. the undo list is not empty).
215
+ #
216
+ def canUndo?
217
+ (@undolist.empty? == false)
218
+ end
219
+
220
+ #
221
+ # Return +true+ if we can still redo some commands
222
+ # (i.e. the redo list is not empty).
223
+ #
224
+ def canRedo?
225
+ (@redolist.empty? == false)
226
+ end
227
+
228
+ #
229
+ # Return +true+ if there is a previously marked
230
+ # state that we can revert to.
231
+ #
232
+ def canRevert?
233
+ (@marker != nil) && (@marker != 0)
234
+ end
235
+
236
+ #
237
+ # Returns the current undo command.
238
+ #
239
+ def current
240
+ @undolist.last
241
+ end
242
+
243
+ #
244
+ # Return the name of the first available undo command.
245
+ # If no undo command is available, returns +nil+.
246
+ #
247
+ def undoName
248
+ if canUndo?
249
+ current.undoName
250
+ else
251
+ nil
252
+ end
253
+ end
254
+
255
+ #
256
+ # Return the name of the first available redo command.
257
+ # If no redo command is available, returns +nil+.
258
+ #
259
+ def redoName
260
+ if canRedo?
261
+ @redolist.last.redoName
262
+ else
263
+ nil
264
+ end
265
+ end
266
+
267
+ #
268
+ # Returns the number of undo records.
269
+ #
270
+ def undoCount
271
+ @undolist.size
272
+ end
273
+
274
+ #
275
+ # Returns the total size of undo information.
276
+ #
277
+ def undoSize
278
+ @size
279
+ end
280
+
281
+ #
282
+ # Clear the list
283
+ #
284
+ def clear
285
+ @undolist.clear
286
+ @redolist.clear
287
+ @marker = nil
288
+ @size = 0
289
+ end
290
+
291
+ #
292
+ # Trim undo list down to at most _nc_ commands.
293
+ #
294
+ def trimCount(nc)
295
+ if @undolist.size > nc
296
+ numRemoved = @undolist.size - nc
297
+ @undolist[0, numRemoved].each { |command| @size -= command.size }
298
+ @undolist[0, numRemoved] = nil
299
+ @marker = nil if (@marker != nil && @marker > @undolist.size)
300
+ end
301
+ end
302
+
303
+ #
304
+ # Trim undo list down to at most _size_.
305
+ #
306
+ def trimSize(sz)
307
+ if @size > sz
308
+ s = 0
309
+ @undolist.reverse.each_index { |i|
310
+ j = @undolist.size - (i + 1)
311
+ s += @undolist[j].size
312
+ @undolist[j] = nil if (s > sz)
313
+ }
314
+ @undolist.compact!
315
+ @marker = nil if (@marker != nil && @marker > @undolist.size)
316
+ end
317
+ end
318
+
319
+ #
320
+ # Mark current state
321
+ #
322
+ def mark
323
+ @marker = 0
324
+ end
325
+
326
+ #
327
+ # Unmark undo list
328
+ #
329
+ def unmark
330
+ @marker = nil
331
+ end
332
+
333
+ #
334
+ # Return +true+ if the undo list is marked.
335
+ #
336
+ def marked?
337
+ @marker == 0
338
+ end
339
+
340
+ def onCmdUndo(sender, sel, ptr) # :nodoc:
341
+ undo
342
+ return 1
343
+ end
344
+
345
+ def onUpdUndo(sender, sel, ptr) # :nodoc:
346
+ if canUndo?
347
+ sender.handle(self, MKUINT(FXWindow::ID_ENABLE, SEL_COMMAND), nil)
348
+ else
349
+ sender.handle(self, MKUINT(FXWindow::ID_DISABLE, SEL_COMMAND), nil)
350
+ end
351
+ return 1
352
+ end
353
+
354
+ def onCmdRedo(sender, sel, ptr) # :nodoc:
355
+ self.redo
356
+ return 1
357
+ end
358
+
359
+ def onUpdRedo(sender, sel, ptr) # :nodoc:
360
+ if canRedo?
361
+ sender.handle(self, MKUINT(FXWindow::ID_ENABLE, SEL_COMMAND), nil)
362
+ else
363
+ sender.handle(self, MKUINT(FXWindow::ID_DISABLE, SEL_COMMAND), nil)
364
+ end
365
+ return 1
366
+ end
367
+
368
+ def onCmdClear(sender, sel, ptr) # :nodoc:
369
+ clear
370
+ return 1
371
+ end
372
+
373
+ def onUpdClear(sender, sel, ptr) # :nodoc:
374
+ if canUndo? || canRedo?
375
+ sender.handle(self, MKUINT(FXWindow::ID_ENABLE, SEL_COMMAND), nil)
376
+ else
377
+ sender.handle(self, MKUINT(FXWindow::ID_DISABLE, SEL_COMMAND), nil)
378
+ end
379
+ return 1
380
+ end
381
+
382
+ def onCmdRevert(sender, sel, ptr) # :nodoc:
383
+ revert
384
+ return 1
385
+ end
386
+
387
+ def onUpdRevert(sender, sel, ptr) # :nodoc:
388
+ if canRevert?
389
+ sender.handle(self, MKUINT(FXWindow::ID_ENABLE, SEL_COMMAND), nil)
390
+ else
391
+ sender.handle(self, MKUINT(FXWindow::ID_DISABLE, SEL_COMMAND), nil)
392
+ end
393
+ return 1
394
+ end
395
+
396
+ def onCmdUndoAll(sender, sel, ptr) # :nodoc:
397
+ undoAll
398
+ return 1
399
+ end
400
+
401
+ def onCmdRedoAll(sender, sel, ptr) # :nodoc:
402
+ redoAll
403
+ return 1
404
+ end
405
+ end
406
+
407
+ #
408
+ # FXCommand is an "abstract" base class for your application's commands. At a
409
+ # minimum, your concrete subclasses of FXCommand should implement the
410
+ # #undo, #redo, #undoName, and #redoName methods.
411
+ #
412
+ class FXCommand
413
+ #
414
+ # Undo this command; this should save enough information for a
415
+ # subsequent redo.
416
+ #
417
+ def undo
418
+ raise NotImpError
419
+ end
420
+
421
+ #
422
+ # Redo this command; this should save enough information for a
423
+ # subsequent undo.
424
+ #
425
+ def redo
426
+ raise NotImpError
427
+ end
428
+
429
+ #
430
+ # Name of the undo command to be shown on a button or menu command;
431
+ # for example, "Undo Delete".
432
+ #
433
+ def undoName
434
+ raise NotImpError
435
+ end
436
+
437
+ #
438
+ # Name of the redo command to be shown on a button or menu command;
439
+ # for example, "Redo Delete".
440
+ #
441
+ def redoName
442
+ raise NotImpError
443
+ end
444
+
445
+ #
446
+ # Returns the size of the information in the undo record, i.e. the
447
+ # number of bytes required to store it in memory. This is only used
448
+ # by the FXUndoList#trimSize method, which can be called to reduce
449
+ # the memory use of the undo list to a certain size.
450
+ #
451
+ def size
452
+ 0
453
+ end
454
+ end
455
+ end