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
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
data/examples/image.rb ADDED
@@ -0,0 +1,279 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'fox16'
4
+ require 'fox16/colors'
5
+
6
+ include Fox
7
+
8
+ class ImageWindow < FXMainWindow
9
+
10
+ def initialize(app)
11
+ # Invoke base class initializer first
12
+ super(app, "Image Application", :opts => DECOR_ALL, :width => 800, :height => 600)
13
+
14
+ # Create a color dialog for later use
15
+ colordlg = FXColorDialog.new(self, "Color Dialog")
16
+
17
+ contents = FXHorizontalFrame.new(self,
18
+ LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y,
19
+ :padLeft => 0, :padRight => 0, :padTop => 0, :padBottom => 0)
20
+
21
+ # LEFT pane to contain the canvas
22
+ canvasFrame = FXVerticalFrame.new(contents,
23
+ FRAME_SUNKEN|LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT,
24
+ :padLeft => 10, :padRight => 10, :padTop => 10, :padBottom => 10)
25
+
26
+ # Label above the canvas
27
+ FXLabel.new(canvasFrame, "Canvas Frame", :opts => JUSTIFY_CENTER_X|LAYOUT_FILL_X)
28
+
29
+ # Horizontal divider line
30
+ FXHorizontalSeparator.new(canvasFrame, SEPARATOR_GROOVE|LAYOUT_FILL_X)
31
+
32
+ # Drawing canvas
33
+ @canvas = FXCanvas.new(canvasFrame, :opts => (FRAME_SUNKEN|
34
+ FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT))
35
+ @canvas.connect(SEL_PAINT, method(:onCanvasRepaint))
36
+
37
+ # RIGHT pane for the buttons
38
+ buttonFrame = FXVerticalFrame.new(contents,
39
+ :opts => FRAME_SUNKEN|LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT,
40
+ :padLeft => 10, :padRight => 10, :padTop => 10, :padBottom => 10)
41
+
42
+
43
+ # Label above the buttons
44
+ FXLabel.new(buttonFrame, "Button Frame", nil,
45
+ JUSTIFY_CENTER_X|LAYOUT_FILL_X);
46
+
47
+ # Horizontal divider line
48
+ FXHorizontalSeparator.new(buttonFrame, SEPARATOR_RIDGE|LAYOUT_FILL_X)
49
+
50
+ FXLabel.new(buttonFrame, "&Background\nColor well", :opts => JUSTIFY_CENTER_X|LAYOUT_FILL_X)
51
+ @backwell = FXColorWell.new(buttonFrame, FXColor::White,
52
+ :opts => LAYOUT_CENTER_X|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT,
53
+ :width => 100, :height => 30)
54
+ @backwell.connect(SEL_COMMAND, method(:onCmdWell))
55
+
56
+ FXLabel.new(buttonFrame, "B&order\nColor well", :opts => JUSTIFY_CENTER_X|LAYOUT_FILL_X)
57
+ @borderwell = FXColorWell.new(buttonFrame, FXColor::Black,
58
+ :opts => LAYOUT_CENTER_X|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT,
59
+ :width => 100, :height => 30)
60
+ @borderwell.connect(SEL_COMMAND, method(:onCmdWell))
61
+
62
+ FXLabel.new(buttonFrame, "&Text\nColor well", :opts => JUSTIFY_CENTER_X|LAYOUT_FILL_X)
63
+ @textwell = FXColorWell.new(buttonFrame, FXColor::Black,
64
+ :opts => LAYOUT_CENTER_X|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT,
65
+ :width => 100, :height => 30)
66
+ @textwell.connect(SEL_COMMAND, method(:onCmdWell))
67
+
68
+ # Button to draw
69
+ FXButton.new(buttonFrame, "&Colors...\tPop the color dialog", nil,
70
+ colordlg, FXWindow::ID_SHOW,
71
+ :opts => FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT,
72
+ :padLeft => 10, :padRight => 10, :padTop => 5, :padBottom => 5)
73
+
74
+ # Button to draw
75
+ saveBtn = FXButton.new(buttonFrame,
76
+ "Save Image...\tRead back image and save to file",
77
+ :opts => FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT,
78
+ :padLeft => 10, :padRight => 10, :padTop => 5, :padBottom => 5)
79
+ saveBtn.connect(SEL_COMMAND, method(:onCmdRestore))
80
+
81
+ # Exit button
82
+ FXButton.new(buttonFrame, "E&xit\tQuit ImageApp", nil,
83
+ getApp(), FXApp::ID_QUIT,
84
+ :opts => FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT,
85
+ :padLeft => 10, :padRight => 10, :padTop => 5, :padBottom => 5)
86
+
87
+ # Allocate the color arrays
88
+ imgWidth = 512
89
+ imgHeight = 50
90
+
91
+ # Create images with dithering
92
+ @grey = FXImage.new(getApp(), nil,
93
+ IMAGE_OWNED|IMAGE_DITHER|IMAGE_SHMI|IMAGE_SHMP, imgWidth, imgHeight)
94
+ @red = FXImage.new(getApp(), nil,
95
+ IMAGE_OWNED|IMAGE_DITHER|IMAGE_SHMI|IMAGE_SHMP, imgWidth, imgHeight)
96
+ @green = FXImage.new(getApp(), nil,
97
+ IMAGE_OWNED|IMAGE_DITHER|IMAGE_SHMI|IMAGE_SHMP, imgWidth, imgHeight)
98
+ @blue = FXImage.new(getApp(), nil,
99
+ IMAGE_OWNED|IMAGE_DITHER|IMAGE_SHMI|IMAGE_SHMP, imgWidth, imgHeight)
100
+
101
+ # Create image with nearest color instead of dithering
102
+ @grey_nodither = FXImage.new(getApp(), nil,
103
+ IMAGE_OWNED|IMAGE_NEAREST|IMAGE_SHMI|IMAGE_SHMP, imgWidth, imgHeight)
104
+ @red_nodither = FXImage.new(getApp(), nil,
105
+ IMAGE_OWNED|IMAGE_NEAREST|IMAGE_SHMI|IMAGE_SHMP, imgWidth, imgHeight)
106
+ @green_nodither = FXImage.new(getApp(), nil,
107
+ IMAGE_OWNED|IMAGE_NEAREST|IMAGE_SHMI|IMAGE_SHMP, imgWidth, imgHeight)
108
+ @blue_nodither = FXImage.new(getApp(), nil,
109
+ IMAGE_OWNED|IMAGE_NEAREST|IMAGE_SHMI|IMAGE_SHMP, imgWidth, imgHeight)
110
+
111
+ # Result image
112
+ @picture = FXBMPImage.new(getApp(), nil, IMAGE_SHMI|IMAGE_SHMP, 850, 600)
113
+
114
+ # Fill up the color-ramp byte arrays (strings)
115
+ grey_data = @grey.data
116
+ grey_nodither_data = @grey_nodither.data
117
+ red_data = @red.data
118
+ red_nodither_data = @red_nodither.data
119
+ green_data = @green.data
120
+ green_nodither_data = @green_nodither.data
121
+ blue_data = @blue.data
122
+ blue_nodither_data = @blue_nodither.data
123
+ (0...512).each { |x|
124
+ halfX = x >> 1
125
+ (0...50).each { |y|
126
+ z = (y << 9) + x
127
+ grey_data[z] = FXRGB(halfX, halfX, halfX)
128
+ grey_nodither_data[z] = grey_data[z]
129
+ red_data[z] = FXRGB(halfX, 0, 0)
130
+ red_nodither_data[z] = red_data[z]
131
+ green_data[z] = FXRGB(0, halfX, 0)
132
+ green_nodither_data[z] = green_data[z]
133
+ blue_data[z] = FXRGB(0, 0, halfX)
134
+ blue_nodither_data[z] = blue_data[z]
135
+ }
136
+ }
137
+
138
+ # Make font
139
+ @font = FXFont.new(getApp(), "times", 36, FONTWEIGHT_BOLD)
140
+
141
+ # Make a tip
142
+ FXToolTip.new(getApp())
143
+ end
144
+
145
+ # Create and initialize
146
+ def create
147
+ # Create the windows
148
+ super
149
+
150
+ # Create images
151
+ @grey.create
152
+ @red.create
153
+ @green.create
154
+ @blue.create
155
+ @grey_nodither.create
156
+ @red_nodither.create
157
+ @green_nodither.create
158
+ @blue_nodither.create
159
+ @picture.create
160
+
161
+ # Create the font, too
162
+ @font.create
163
+
164
+ # Make the main window appear
165
+ show(PLACEMENT_SCREEN)
166
+
167
+ # Initial repaint
168
+ @canvas.update
169
+ end
170
+
171
+ def onCanvasRepaint(sender, sel, event)
172
+ if event.synthetic?
173
+ dc = FXDCWindow.new(@picture)
174
+
175
+ # Erase the canvas, color comes from well
176
+ dc.foreground = @backwell.rgba
177
+
178
+ dc.fillRectangle(0, 0, @picture.width, @picture.height)
179
+
180
+ # Draw images
181
+ dc.drawImage(@grey, 10, 10)
182
+ dc.drawImage(@grey_nodither, 10, 60)
183
+ dc.drawImage(@red, 10, 130)
184
+ dc.drawImage(@red_nodither, 10, 180)
185
+ dc.drawImage(@green, 10, 250)
186
+ dc.drawImage(@green_nodither, 10, 300)
187
+ dc.drawImage(@blue, 10, 370)
188
+ dc.drawImage(@blue_nodither, 10, 420)
189
+
190
+ # Draw patterns
191
+ dc.fillStyle = FILL_OPAQUESTIPPLED
192
+ dc.foreground = FXColor::Black
193
+ dc.background = FXColor::White
194
+ (STIPPLE_0..STIPPLE_16).each do |pat|
195
+ dc.stipple = pat
196
+ dc.fillRectangle(10 + (512*pat)/17, 490, 31, 50)
197
+ end
198
+ dc.fillStyle = FILL_SOLID
199
+
200
+ # Draw borders
201
+ dc.foreground = @borderwell.rgba
202
+ dc.drawRectangle(10, 10, 512, 50)
203
+ dc.drawRectangle(10, 60, 512, 50)
204
+
205
+ dc.drawRectangle(10, 130, 512, 50)
206
+ dc.drawRectangle(10, 180, 512, 50)
207
+
208
+ dc.drawRectangle(10, 250, 512, 50)
209
+ dc.drawRectangle(10, 300, 512, 50)
210
+
211
+ dc.drawRectangle(10, 370, 512, 50)
212
+ dc.drawRectangle(10, 420, 512, 50)
213
+
214
+ dc.drawRectangle(10, 490, 512, 50)
215
+
216
+ # Draw text
217
+ dc.font = @font
218
+ dc.foreground = @textwell.rgba
219
+ dc.drawText(540, 60, "Grey")
220
+ dc.drawText(540, 180, "Red")
221
+ dc.drawText(540, 300, "Green")
222
+ dc.drawText(540, 420, "Blue")
223
+ dc.drawText(540, 540, "Patterns")
224
+
225
+ #
226
+ # Call end() to unlock the drawing surface and flush out
227
+ # the pending drawing commands.
228
+ #
229
+ dc.end
230
+ end
231
+
232
+ # Now repaint the screen
233
+ sdc = FXDCWindow.new(@canvas, event)
234
+
235
+ # Clear whole thing
236
+ sdc.foreground = @backwell.rgba
237
+ sdc.fillRectangle(0, 0, @canvas.width, @canvas.height)
238
+
239
+ # Paint image
240
+ sdc.drawImage(@picture, 0, 0)
241
+
242
+ #
243
+ # Call end() to unlock the drawing surface and flush out
244
+ # the pending drawing commands.
245
+ #
246
+ sdc.end
247
+ end
248
+
249
+ # Color well got changed
250
+ def onCmdWell(sender, sel, ptr)
251
+ @canvas.update
252
+ end
253
+
254
+ # Restore image from offscreen pixmap
255
+ def onCmdRestore(sender, sel, ptr)
256
+ saveDialog = FXFileDialog.new(self, "Save as BMP")
257
+ if saveDialog.execute != 0
258
+ FXFileStream.open(saveDialog.filename, FXStreamSave) do |outfile|
259
+ @picture.restore
260
+ @picture.savePixels(outfile)
261
+ end
262
+ end
263
+ return 1
264
+ end
265
+ end
266
+
267
+ if __FILE__ == $0
268
+ # Make application
269
+ application = FXApp.new("Image", "FoxTest")
270
+
271
+ # Make the main window
272
+ ImageWindow.new(application)
273
+
274
+ # Create the application window and resources
275
+ application.create
276
+
277
+ # Run the application
278
+ application.run
279
+ end
@@ -0,0 +1,509 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'fox16'
4
+
5
+ include Fox
6
+
7
+ class ImageWindow < FXMainWindow
8
+
9
+ include Responder
10
+
11
+ def initialize(app)
12
+ # Invoke base class initialize first
13
+ super(app, "FOX Image Viewer: - untitled", :opts => DECOR_ALL, :width => 850, :height => 600)
14
+
15
+ # Recently used files list
16
+ @mrufiles = FXRecentFiles.new
17
+
18
+ # Make some icons
19
+ fileopenicon = getIcon("fileopen.png")
20
+ filesaveicon = getIcon("filesave.png")
21
+ cuticon = getIcon("cut.png")
22
+ copyicon = getIcon("copy.png")
23
+ pasteicon = getIcon("paste.png")
24
+ uplevelicon = getIcon("tbuplevel.png")
25
+ paletteicon = getIcon("colorpal.png")
26
+
27
+ # Make color dialog
28
+ colordlg = FXColorDialog.new(self, "Color Dialog")
29
+
30
+ # Make menu bar
31
+ menubar = FXMenuBar.new(self, LAYOUT_SIDE_TOP|LAYOUT_FILL_X|FRAME_RAISED)
32
+
33
+ # Status bar
34
+ statusbar = FXStatusBar.new(self,
35
+ LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|STATUSBAR_WITH_DRAGCORNER)
36
+
37
+ # Docking sites
38
+ topDockSite = FXDockSite.new(self, LAYOUT_SIDE_TOP|LAYOUT_FILL_X)
39
+ FXDockSite.new(self, LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X)
40
+ FXDockSite.new(self, LAYOUT_SIDE_LEFT|LAYOUT_FILL_Y)
41
+ FXDockSite.new(self, LAYOUT_SIDE_RIGHT|LAYOUT_FILL_Y)
42
+
43
+ # Splitter
44
+ splitter = FXSplitter.new(self, (LAYOUT_SIDE_TOP|LAYOUT_FILL_X|
45
+ LAYOUT_FILL_Y| SPLITTER_TRACKING|SPLITTER_VERTICAL|SPLITTER_REVERSED))
46
+
47
+ # Tool bar is docked inside the top one for starters
48
+ toolbarShell = FXToolBarShell.new(self)
49
+ toolbar = FXToolBar.new(topDockSite, toolbarShell,
50
+ PACK_UNIFORM_WIDTH|PACK_UNIFORM_HEIGHT|FRAME_RAISED|LAYOUT_FILL_X)
51
+ FXToolBarGrip.new(toolbar, toolbar, FXToolBar::ID_TOOLBARGRIP, TOOLBARGRIP_DOUBLE)
52
+
53
+ # File menu
54
+ filemenu = FXMenuPane.new(self)
55
+ FXMenuTitle.new(menubar, "&File", nil, filemenu)
56
+
57
+ # Edit Menu
58
+ editmenu = FXMenuPane.new(self)
59
+ FXMenuTitle.new(menubar, "&Edit", nil, editmenu)
60
+
61
+ # Manipulation Menu
62
+ manipmenu = FXMenuPane.new(self)
63
+ FXMenuTitle.new(menubar,"&Manipulation", nil, manipmenu)
64
+
65
+ # View menu
66
+ viewmenu = FXMenuPane.new(self)
67
+ FXMenuTitle.new(menubar, "&View", nil, viewmenu)
68
+
69
+ # Help menu
70
+ helpmenu = FXMenuPane.new(self)
71
+ FXMenuTitle.new(menubar, "&Help", nil, helpmenu, LAYOUT_RIGHT)
72
+
73
+ # Sunken border for image widget
74
+ imagebox = FXHorizontalFrame.new(splitter,
75
+ FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y,
76
+ :padLeft => 0, :padRight => 0, :padTop => 0, :padBottom => 0)
77
+
78
+ # Make image widget
79
+ @imageview = FXImageView.new(imagebox, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y)
80
+
81
+ # Sunken border for file list
82
+ @filebox = FXHorizontalFrame.new(splitter,
83
+ LAYOUT_FILL_X|LAYOUT_FILL_Y,
84
+ :padLeft => 0, :padRight => 0, :padTop => 0, :padBottom => 0)
85
+
86
+ # Make file list
87
+ fileframe = FXHorizontalFrame.new(@filebox,
88
+ FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y,
89
+ :padLeft => 0, :padRight => 0, :padTop => 0, :padBottom => 0, :hSpacing => 0, :vSpacing => 0)
90
+ @filelist = FXFileList.new(fileframe,
91
+ :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|ICONLIST_MINI_ICONS|ICONLIST_AUTOSIZE)
92
+ @filelist.connect(SEL_DOUBLECLICKED, method(:onCmdFileList))
93
+ FXButton.new(@filebox, "\tUp one level\tGo up to higher directory.",
94
+ uplevelicon, @filelist, FXFileList::ID_DIRECTORY_UP,
95
+ BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_FILL_Y)
96
+
97
+ # Toobar buttons: File manipulation
98
+ openBtn = FXButton.new(toolbar, "&Open\tOpen Image\tOpen image file.", fileopenicon,
99
+ :opts => ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED)
100
+ openBtn.connect(SEL_COMMAND, method(:onCmdOpen))
101
+ saveBtn = FXButton.new(toolbar, "&Save\tSave Image\tSave image file.", filesaveicon,
102
+ :opts => ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED)
103
+ saveBtn.connect(SEL_COMMAND, method(:onCmdSave))
104
+
105
+ # Toobar buttons: Editing
106
+ FXButton.new(toolbar, "Cut\tCut", cuticon,
107
+ :opts => ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED)
108
+ FXButton.new(toolbar, "Copy\tCopy", copyicon,
109
+ :opts => ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED)
110
+ FXButton.new(toolbar, "Paste\tPaste", pasteicon,
111
+ :opts => ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED)
112
+
113
+ # Color
114
+ FXButton.new(toolbar, "&Colors\tColors\tDisplay color dialog.", paletteicon,
115
+ colordlg, FXWindow::ID_SHOW,
116
+ ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_RIGHT)
117
+
118
+ # File Menu entries
119
+ FXMenuCommand.new(filemenu, "&Open...\tCtl-O\tOpen image file.", fileopenicon).connect(SEL_COMMAND, method(:onCmdOpen))
120
+ FXMenuCommand.new(filemenu, "&Save...\tCtl-S\tSave image file.", filesaveicon).connect(SEL_COMMAND, method(:onCmdSave))
121
+ FXMenuCommand.new(filemenu, "Dump", nil, getApp(), FXApp::ID_DUMP)
122
+
123
+ # Recent file menu; this automatically hides if there are no files
124
+ sep1 = FXMenuSeparator.new(filemenu)
125
+ sep1.target = @mrufiles
126
+ sep1.selector = FXRecentFiles::ID_ANYFILES
127
+ FXMenuCommand.new(filemenu, nil, nil, @mrufiles, FXRecentFiles::ID_FILE_1)
128
+ FXMenuCommand.new(filemenu, nil, nil, @mrufiles, FXRecentFiles::ID_FILE_2)
129
+ FXMenuCommand.new(filemenu, nil, nil, @mrufiles, FXRecentFiles::ID_FILE_3)
130
+ FXMenuCommand.new(filemenu, nil, nil, @mrufiles, FXRecentFiles::ID_FILE_4)
131
+ FXMenuCommand.new(filemenu, nil, nil, @mrufiles, FXRecentFiles::ID_FILE_5)
132
+ FXMenuCommand.new(filemenu, nil, nil, @mrufiles, FXRecentFiles::ID_FILE_6)
133
+ FXMenuCommand.new(filemenu, nil, nil, @mrufiles, FXRecentFiles::ID_FILE_7)
134
+ FXMenuCommand.new(filemenu, nil, nil, @mrufiles, FXRecentFiles::ID_FILE_8)
135
+ FXMenuCommand.new(filemenu, nil, nil, @mrufiles, FXRecentFiles::ID_FILE_9)
136
+ FXMenuCommand.new(filemenu, nil, nil, @mrufiles, FXRecentFiles::ID_FILE_10)
137
+ FXMenuCommand.new(filemenu, "&Clear Recent Files", nil,
138
+ @mrufiles, FXRecentFiles::ID_CLEAR)
139
+ sep2 = FXMenuSeparator.new(filemenu)
140
+ sep2.target = @mrufiles
141
+ sep2.selector = FXRecentFiles::ID_ANYFILES
142
+ FXMenuCommand.new(filemenu, "&Quit\tCtl-Q").connect(SEL_COMMAND, method(:onCmdQuit))
143
+
144
+ # Edit Menu entries
145
+ FXMenuCommand.new(editmenu, "&Undo\tCtl-Z\tUndo last change.")
146
+ FXMenuCommand.new(editmenu, "&Redo\tCtl-R\tRedo last undo.")
147
+ FXMenuCommand.new(editmenu, "&Copy\tCtl-C\tCopy selection to clipboard.", copyicon)
148
+ FXMenuCommand.new(editmenu, "C&ut\tCtl-X\tCut selection to clipboard.", cuticon)
149
+ FXMenuCommand.new(editmenu, "&Paste\tCtl-V\tPaste from clipboard.", pasteicon)
150
+ FXMenuCommand.new(editmenu, "&Delete\t\tDelete selection.")
151
+
152
+ # Manipulation Menu entries
153
+ rotate90Cmd = FXMenuCommand.new(manipmenu, "Rotate 90\t\tRotate 90 degrees.")
154
+ rotate90Cmd.connect(SEL_COMMAND) { @imageview.image.rotate(90) }
155
+ rotate90Cmd.connect(SEL_UPDATE, method(:onUpdImage))
156
+
157
+ rotate180Cmd = FXMenuCommand.new(manipmenu, "Rotate 180\t\tRotate 180 degrees.")
158
+ rotate180Cmd.connect(SEL_COMMAND) { @imageview.image.rotate(180) }
159
+ rotate180Cmd.connect(SEL_UPDATE, method(:onUpdImage))
160
+
161
+ rotate270Cmd = FXMenuCommand.new(manipmenu, "Rotate -90\t\tRotate -90 degrees.")
162
+ rotate270Cmd.connect(SEL_COMMAND) { @imageview.image.rotate(270) }
163
+ rotate270Cmd.connect(SEL_UPDATE, method(:onUpdImage))
164
+
165
+ mirrorHorCmd = FXMenuCommand.new(manipmenu, "Mirror Hor.\t\tMirror Horizontally.")
166
+ mirrorHorCmd.connect(SEL_COMMAND) { @imageview.image.mirror(true, false) }
167
+ mirrorHorCmd.connect(SEL_UPDATE, method(:onUpdImage))
168
+
169
+ mirrorVerCmd = FXMenuCommand.new(manipmenu, "Mirror Ver.\t\tMirror Vertically.")
170
+ mirrorVerCmd.connect(SEL_COMMAND) { @imageview.image.mirror(false, true) }
171
+ mirrorVerCmd.connect(SEL_UPDATE, method(:onUpdImage))
172
+
173
+ scaleCmd = FXMenuCommand.new(manipmenu, "Scale...\t\tScale image.")
174
+ scaleCmd.connect(SEL_COMMAND, method(:onCmdScale))
175
+ scaleCmd.connect(SEL_UPDATE, method(:onUpdImage))
176
+
177
+ cropCmd = FXMenuCommand.new(manipmenu, "Crop...\t\tCrop image.")
178
+ cropCmd.connect(SEL_COMMAND, method(:onCmdCrop))
179
+ cropCmd.connect(SEL_UPDATE, method(:onUpdImage))
180
+
181
+ # View Menu entries
182
+ FXMenuCheck.new(viewmenu, "File list\t\tDisplay file list.",
183
+ @filebox, FXWindow::ID_TOGGLESHOWN)
184
+ FXMenuCheck.new(viewmenu,
185
+ "Show hidden files\t\tShow hidden files and directories.",
186
+ @filelist, FXFileList::ID_TOGGLE_HIDDEN)
187
+ FXMenuSeparator.new(viewmenu)
188
+ FXMenuRadio.new(viewmenu,
189
+ "Show small icons\t\tDisplay directory with small icons.",
190
+ @filelist, FXFileList::ID_SHOW_MINI_ICONS)
191
+ FXMenuRadio.new(viewmenu,
192
+ "Show big icons\t\tDisplay directory with big icons.",
193
+ @filelist, FXFileList::ID_SHOW_BIG_ICONS)
194
+ FXMenuRadio.new(viewmenu,
195
+ "Show details view\t\tDisplay detailed directory listing.",
196
+ @filelist, FXFileList::ID_SHOW_DETAILS)
197
+ FXMenuSeparator.new(viewmenu)
198
+ FXMenuRadio.new(viewmenu, "Rows of icons\t\tView row-wise.",
199
+ @filelist, FXFileList::ID_ARRANGE_BY_ROWS)
200
+ FXMenuRadio.new(viewmenu, "Columns of icons\t\tView column-wise.",
201
+ @filelist,FXFileList::ID_ARRANGE_BY_COLUMNS)
202
+ FXMenuSeparator.new(viewmenu)
203
+ FXMenuCheck.new(viewmenu, "Toolbar\t\tDisplay toolbar.",
204
+ toolbar, FXWindow::ID_TOGGLESHOWN)
205
+
206
+ FXMenuCommand.new(viewmenu, "Float toolbar\t\tUndock the toolbar.", nil, toolbar, FXToolBar::ID_DOCK_FLOAT)
207
+ FXMenuCommand.new(viewmenu, "Dock toolbar top\t\tDock the toolbar on the top.", nil, toolbar, FXToolBar::ID_DOCK_TOP)
208
+ FXMenuCommand.new(viewmenu, "Dock toolbar left\t\tDock the toolbar on the left.", nil, toolbar, FXToolBar::ID_DOCK_LEFT)
209
+ FXMenuCommand.new(viewmenu, "Dock toolbar right\t\tDock the toolbar on the right.", nil, toolbar, FXToolBar::ID_DOCK_RIGHT)
210
+ FXMenuCommand.new(viewmenu, "Dock toolbar bottom\t\tDock the toolbar on the bottom.", nil, toolbar, FXToolBar::ID_DOCK_BOTTOM)
211
+
212
+ FXMenuSeparator.new(viewmenu)
213
+
214
+ FXMenuCheck.new(viewmenu, "Status line\t\tDisplay status line.",
215
+ statusbar, FXWindow::ID_TOGGLESHOWN)
216
+
217
+ # Help Menu entries
218
+ FXMenuCommand.new(helpmenu, "&About FOX...").connect(SEL_COMMAND) {
219
+ FXMessageBox.new(self, "About Image Viewer",
220
+ "Image Viewer demonstrates the FOX ImageView widget.\n\n" +
221
+ "Using the FOX C++ GUI Library (http://www.fox-toolkit.org)\n\n" +
222
+ "Copyright (C) 2000 Jeroen van der Zijp (jeroen@fox-toolkit.org)", nil,
223
+ MBOX_OK|DECOR_TITLE|DECOR_BORDER).execute
224
+ }
225
+
226
+ # Make a tool tip
227
+ FXToolTip.new(getApp(), TOOLTIP_NORMAL)
228
+
229
+ # Recent files
230
+ @mrufiles.connect(SEL_COMMAND) do |sender, sel, filename|
231
+ @filename = filename
232
+ @filelist.currentFile = @filename
233
+ loadImage(@filename)
234
+ end
235
+
236
+ # Initialize file name and pattern for file dialog
237
+ @filename = "untitled"
238
+ @preferredFileFilter = 0
239
+ end
240
+
241
+ # Convenience function to construct a PNG icon
242
+ def getIcon(filename)
243
+ begin
244
+ filename = File.join("icons", filename)
245
+ icon = nil
246
+ File.open(filename, "rb") do |f|
247
+ icon = FXPNGIcon.new(getApp(), f.read)
248
+ end
249
+ icon
250
+ rescue
251
+ raise RuntimeError, "Couldn't load icon: #{filename}"
252
+ end
253
+ end
254
+
255
+ def hasExtension?(filename, ext)
256
+ File.basename(filename, ext) != File.basename(filename)
257
+ end
258
+
259
+ # Load the named image file
260
+ def loadImage(file)
261
+ img = nil
262
+ if hasExtension?(file, ".gif")
263
+ img = FXGIFImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
264
+ elsif hasExtension?(file, ".bmp")
265
+ img = FXBMPImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
266
+ elsif hasExtension?(file, ".xpm")
267
+ img = FXXPMImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
268
+ elsif hasExtension?(file, ".png")
269
+ img = FXPNGImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
270
+ elsif hasExtension?(file, ".jpg")
271
+ img = FXJPGImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
272
+ elsif hasExtension?(file, ".pcx")
273
+ img = FXPCXImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
274
+ elsif hasExtension?(file, ".tif")
275
+ img = FXTIFImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
276
+ elsif hasExtension?(file, ".tga")
277
+ img = FXTGAImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
278
+ elsif hasExtension?(file, ".ico")
279
+ img = FXICOImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
280
+ end
281
+
282
+ # Perhaps failed?
283
+ if img.nil?
284
+ FXMessageBox.error(self, MBOX_OK, "Error loading image",
285
+ "Unsupported image type: #{file}")
286
+ return
287
+ end
288
+
289
+ # Load it...
290
+ getApp().beginWaitCursor do
291
+ FXFileStream.open(file, FXStreamLoad) { |stream| img.loadPixels(stream) }
292
+ img.create
293
+ @imageview.image = img
294
+ end
295
+ end
296
+
297
+ # Save image to named file
298
+ def saveImage(file)
299
+ getApp().beginWaitCursor do
300
+ FXFileStream.open(file, FXStreamSave) { |stream| @imageview.image.savePixels(stream) }
301
+ end
302
+ end
303
+
304
+ # Open a new file
305
+ def onCmdOpen(sender, sel, ptr)
306
+ openDialog = FXFileDialog.new(self, "Open Image")
307
+ openDialog.filename = @filename
308
+ patterns = ["All Files (*)",
309
+ "GIF Image (*.gif)",
310
+ "BMP Image (*.bmp)",
311
+ "XPM Image (*.xpm)",
312
+ "PCX Image (*.pcx)",
313
+ "ICO Image (*.ico)",
314
+ "PNG Image (*.png)",
315
+ "JPEG Image (*.jpg)",
316
+ "TIFF Image (*.tif)",
317
+ "TARGA Image (*.tga)"
318
+ ]
319
+ openDialog.patternList = patterns
320
+ openDialog.currentPattern = @preferredFileFilter
321
+ if openDialog.execute != 0
322
+ @preferredFileFilter = openDialog.currentPattern
323
+ @filename = openDialog.filename
324
+ @filelist.currentFile = @filename
325
+ @mrufiles.appendFile(@filename)
326
+ loadImage(@filename)
327
+ end
328
+ return 1
329
+ end
330
+
331
+ # Save this file
332
+ def onCmdSave(sender, sel, ptr)
333
+ saveDialog = FXFileDialog.new(self, "Save Image")
334
+ if saveDialog.execute != 0
335
+ if File.exists? saveDialog.filename
336
+ if MBOX_CLICKED_NO == FXMessageBox.question(self, MBOX_YES_NO,
337
+ "Overwrite Image", "Overwrite existing image?")
338
+ return 1
339
+ end
340
+ end
341
+ @filename = saveDialog.filename
342
+ @filelist.currentFile = @filename
343
+ @mrufiles.appendFile(@filename)
344
+ saveImage(@filename)
345
+ end
346
+ return 1
347
+ end
348
+
349
+ # Quit the application
350
+ def onCmdQuit(sender, sel, ptr)
351
+ # Write new window size back to registry
352
+ getApp().reg().writeIntEntry("SETTINGS", "x", x)
353
+ getApp().reg().writeIntEntry("SETTINGS", "y", y)
354
+ getApp().reg().writeIntEntry("SETTINGS", "width", width)
355
+ getApp().reg().writeIntEntry("SETTINGS", "height", height)
356
+
357
+ # Height of file list
358
+ getApp().reg().writeIntEntry("SETTINGS", "fileheight", @filebox.height)
359
+
360
+ # Was file box shown?
361
+ getApp().reg().writeBoolEntry("SETTINGS", "filesshown", @filebox.shown)
362
+
363
+ # Current directory
364
+ getApp().reg().writeStringEntry("SETTINGS", "directory", @filelist.directory)
365
+
366
+ # Quit
367
+ getApp().exit(0)
368
+ end
369
+
370
+ # Command message from the file list
371
+ def onCmdFileList(sender, sel, index)
372
+ if index >= 0
373
+ if @filelist.isItemDirectory(index)
374
+ @filelist.directory = @filelist.getItemPathname(index)
375
+ elsif @filelist.isItemFile(index)
376
+ @filename = @filelist.getItemPathname(index)
377
+ @mrufiles.appendFile(@filename)
378
+ loadImage(@filename)
379
+ end
380
+ end
381
+ return 1
382
+ end
383
+
384
+ # Scale
385
+ def onCmdScale(sender, sel, ptr)
386
+ image = @imageview.image
387
+ sx = FXDataTarget.new(image.width)
388
+ sy = FXDataTarget.new(image.height)
389
+ scalepanel = FXDialogBox.new(self, "Scale Image To Size")
390
+ frame = FXHorizontalFrame.new(scalepanel,
391
+ LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y)
392
+ FXLabel.new(frame, "W:", nil, LAYOUT_CENTER_Y)
393
+ FXTextField.new(frame, 5, sx, FXDataTarget::ID_VALUE,
394
+ LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK|JUSTIFY_RIGHT)
395
+ FXLabel.new(frame, "H:", nil, LAYOUT_CENTER_Y)
396
+ FXTextField.new(frame, 5, sy, FXDataTarget::ID_VALUE,
397
+ LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK|JUSTIFY_RIGHT)
398
+ FXButton.new(frame, "Cancel", nil, scalepanel, FXDialogBox::ID_CANCEL,
399
+ LAYOUT_CENTER_Y|FRAME_RAISED|FRAME_THICK,
400
+ :padLeft => 20, :padRight => 20, :padTop => 4, :padBottom => 4)
401
+ FXButton.new(frame, "OK", nil, scalepanel, FXDialogBox::ID_ACCEPT,
402
+ LAYOUT_CENTER_Y|FRAME_RAISED|FRAME_THICK,
403
+ :padLeft => 30, :padRight => 30, :padTop => 4, :padBottom => 4)
404
+ return 1 if (scalepanel.execute == 0)
405
+ return 1 if (sx.value < 1 || sy.value < 1)
406
+ image.scale(sx.value, sy.value)
407
+ @imageview.image = image
408
+ end
409
+
410
+ # Crop
411
+ def onCmdCrop(sender, sel, ptr)
412
+ image = @imageview.image
413
+ cx = FXDataTarget.new(0)
414
+ cy = FXDataTarget.new(0)
415
+ cw = FXDataTarget.new(image.width)
416
+ ch = FXDataTarget.new(image.height)
417
+ croppanel = FXDialogBox.new(self, "Crop image")
418
+ frame = FXHorizontalFrame.new(croppanel,
419
+ LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y)
420
+ FXLabel.new(frame, "X:", nil, LAYOUT_CENTER_Y)
421
+ FXTextField.new(frame, 5, cx, FXDataTarget::ID_VALUE,
422
+ LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK|JUSTIFY_RIGHT)
423
+ FXLabel.new(frame, "Y:", nil, LAYOUT_CENTER_Y)
424
+ FXTextField.new(frame, 5, cy, FXDataTarget::ID_VALUE,
425
+ LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK|JUSTIFY_RIGHT)
426
+ FXLabel.new(frame, "W:", nil, LAYOUT_CENTER_Y)
427
+ FXTextField.new(frame, 5, cw, FXDataTarget::ID_VALUE,
428
+ LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK|JUSTIFY_RIGHT)
429
+ FXLabel.new(frame, "H:", nil, LAYOUT_CENTER_Y)
430
+ FXTextField.new(frame, 5, ch, FXDataTarget::ID_VALUE,
431
+ LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK|JUSTIFY_RIGHT)
432
+ FXButton.new(frame, "Cancel", nil, croppanel, FXDialogBox::ID_CANCEL,
433
+ LAYOUT_CENTER_Y|FRAME_RAISED|FRAME_THICK,
434
+ :padLeft => 20, :padRight => 20, :padTop => 4, :padBottom => 4)
435
+ FXButton.new(frame, "OK", nil, croppanel, FXDialogBox::ID_ACCEPT,
436
+ LAYOUT_CENTER_Y|FRAME_RAISED|FRAME_THICK,
437
+ :padLeft => 30, :padRight => 30, :padTop => 4, :padBottom => 4)
438
+ return 1 if (croppanel.execute == 0)
439
+ return 1 if (cx.value < 0 || cy.value < 0 ||
440
+ cx.value+cw.value > image.width ||
441
+ cy.value+ch.value > image.height)
442
+ image.crop(cx.value, cy.value, cw.value, ch.value)
443
+ @imageview.image = image
444
+ end
445
+
446
+ # Update image
447
+ def onUpdImage(sender, sel, ptr)
448
+ if @imageview.image
449
+ sender.handle(self, FXSEL(SEL_COMMAND, FXWindow::ID_ENABLE), nil)
450
+ else
451
+ sender.handle(self, FXSEL(SEL_COMMAND, FXWindow::ID_DISABLE), nil)
452
+ end
453
+ end
454
+
455
+ # Create and show window
456
+ def create
457
+ # Get size, etc. from registry
458
+ xx = getApp().reg().readIntEntry("SETTINGS", "x", 0)
459
+ yy = getApp().reg().readIntEntry("SETTINGS", "y", 0)
460
+ ww = getApp().reg().readIntEntry("SETTINGS", "width", 850)
461
+ hh = getApp().reg().readIntEntry("SETTINGS", "height", 600)
462
+
463
+ fh = getApp().reg().readIntEntry("SETTINGS", "fileheight", 100)
464
+ fs = getApp().reg().readBoolEntry("SETTINGS", "filesshown", true)
465
+
466
+ dir = getApp().reg().readStringEntry("SETTINGS", "directory", "~")
467
+
468
+ # Starting directory for the files list
469
+ @filelist.directory = dir
470
+
471
+ # Height of files list
472
+ @filebox.height = fh
473
+
474
+ # Is it visible right now?
475
+ if !fs
476
+ @filebox.hide
477
+ end
478
+
479
+ # Reposition window to specified x, y, w and h
480
+ position(xx, yy, ww, hh)
481
+
482
+ # Create and show
483
+ super # i.e. FXMainWindow::create()
484
+ show(PLACEMENT_SCREEN)
485
+ end
486
+ end
487
+
488
+ if __FILE__ == $0
489
+ # Make application
490
+ application = FXApp.new("ImageViewer", "FoxTest")
491
+
492
+ # Make window
493
+ window = ImageWindow.new(application)
494
+
495
+ # Handle interrupts to terminate program gracefully
496
+ application.addSignal("SIGINT", window.method(:onCmdQuit))
497
+
498
+ # Create it
499
+ application.create
500
+
501
+ # Passed image file?
502
+ if ARGV.length > 0
503
+ window.loadImage(ARGV[0])
504
+ end
505
+
506
+ # Run
507
+ application.run
508
+ end
509
+