fxruby 1.6.14-universal-darwin-9

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 (491) 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 +697 -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 +93 -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/custom_table_item.rb +170 -0
  78. data/examples/datatarget.rb +223 -0
  79. data/examples/dctest.rb +696 -0
  80. data/examples/dialog.rb +143 -0
  81. data/examples/dilbert.rb +66 -0
  82. data/examples/dirlist.rb +63 -0
  83. data/examples/dragdrop.rb +97 -0
  84. data/examples/dragsource.rb +80 -0
  85. data/examples/dropsite.rb +59 -0
  86. data/examples/foursplit.rb +97 -0
  87. data/examples/gltest.rb +330 -0
  88. data/examples/glviewer.rb +576 -0
  89. data/examples/groupbox.rb +392 -0
  90. data/examples/header.rb +149 -0
  91. data/examples/hello.rb +12 -0
  92. data/examples/hello2.rb +51 -0
  93. data/examples/iRAA.rb +153 -0
  94. data/examples/iconlist.rb +92 -0
  95. data/examples/icons/AngryGuyInBunnySuit.ico +0 -0
  96. data/examples/icons/FatBot.ico +0 -0
  97. data/examples/icons/FlippedySwitch.ico +0 -0
  98. data/examples/icons/LeGoon.ico +0 -0
  99. data/examples/icons/Net.ico +0 -0
  100. data/examples/icons/RedMacOS.ico +0 -0
  101. data/examples/icons/SawBlade.ico +0 -0
  102. data/examples/icons/backview.png +0 -0
  103. data/examples/icons/big.png +0 -0
  104. data/examples/icons/bigfolder.png +0 -0
  105. data/examples/icons/bigpenguin.png +0 -0
  106. data/examples/icons/bottomview.png +0 -0
  107. data/examples/icons/camera.png +0 -0
  108. data/examples/icons/capbutt.png +0 -0
  109. data/examples/icons/capnotlast.png +0 -0
  110. data/examples/icons/capproj.png +0 -0
  111. data/examples/icons/capround.png +0 -0
  112. data/examples/icons/colorpal.png +0 -0
  113. data/examples/icons/copy.png +0 -0
  114. data/examples/icons/cut.png +0 -0
  115. data/examples/icons/delimit.png +0 -0
  116. data/examples/icons/dippy.png +0 -0
  117. data/examples/icons/double_dash.png +0 -0
  118. data/examples/icons/filenew.png +0 -0
  119. data/examples/icons/fileopen.png +0 -0
  120. data/examples/icons/filesave.png +0 -0
  121. data/examples/icons/filesaveas.png +0 -0
  122. data/examples/icons/fonts.png +0 -0
  123. data/examples/icons/fox.png +0 -0
  124. data/examples/icons/foxicon.png +0 -0
  125. data/examples/icons/frontview.png +0 -0
  126. data/examples/icons/gem_big.png +0 -0
  127. data/examples/icons/gem_small.png +0 -0
  128. data/examples/icons/hello2.png +0 -0
  129. data/examples/icons/help.png +0 -0
  130. data/examples/icons/indent.png +0 -0
  131. data/examples/icons/jbevel.png +0 -0
  132. data/examples/icons/jmiter.png +0 -0
  133. data/examples/icons/jround.png +0 -0
  134. data/examples/icons/kill.png +0 -0
  135. data/examples/icons/leftview.png +0 -0
  136. data/examples/icons/light.png +0 -0
  137. data/examples/icons/minidoc.png +0 -0
  138. data/examples/icons/minifolder.png +0 -0
  139. data/examples/icons/minifolderopen.png +0 -0
  140. data/examples/icons/newfolder.png +0 -0
  141. data/examples/icons/nolight.png +0 -0
  142. data/examples/icons/onoff_dash.png +0 -0
  143. data/examples/icons/palette.png +0 -0
  144. data/examples/icons/parallel.png +0 -0
  145. data/examples/icons/paste.png +0 -0
  146. data/examples/icons/pattern.png +0 -0
  147. data/examples/icons/penguin.png +0 -0
  148. data/examples/icons/perspective.png +0 -0
  149. data/examples/icons/printicon.png +0 -0
  150. data/examples/icons/prop.png +0 -0
  151. data/examples/icons/redo.png +0 -0
  152. data/examples/icons/rightview.png +0 -0
  153. data/examples/icons/saveas.png +0 -0
  154. data/examples/icons/shutter1.png +0 -0
  155. data/examples/icons/shutter2.png +0 -0
  156. data/examples/icons/small.png +0 -0
  157. data/examples/icons/smoothlight.png +0 -0
  158. data/examples/icons/solid_line.png +0 -0
  159. data/examples/icons/tbuplevel.png +0 -0
  160. data/examples/icons/topview.png +0 -0
  161. data/examples/icons/undo.png +0 -0
  162. data/examples/icons/winapp.png +0 -0
  163. data/examples/icons/zoom.png +0 -0
  164. data/examples/image.rb +279 -0
  165. data/examples/imageviewer.rb +509 -0
  166. data/examples/inputs.rb +83 -0
  167. data/examples/mditest.rb +180 -0
  168. data/examples/pig.rb +77 -0
  169. data/examples/raabrowser.rb +122 -0
  170. data/examples/ratio.rb +80 -0
  171. data/examples/rulerview.rb +27 -0
  172. data/examples/scintilla-test.rb +81 -0
  173. data/examples/scribble-orig.rb +186 -0
  174. data/examples/scribble.rb +162 -0
  175. data/examples/shutter.rb +158 -0
  176. data/examples/splitter.rb +211 -0
  177. data/examples/styledtext.rb +82 -0
  178. data/examples/tabbook.rb +165 -0
  179. data/examples/table.rb +182 -0
  180. data/examples/textedit/commands.rb +114 -0
  181. data/examples/textedit/helpwindow.rb +299 -0
  182. data/examples/textedit/prefdialog.rb +239 -0
  183. data/examples/textedit/textedit.rb +1763 -0
  184. data/examples/unicode.rb +36 -0
  185. data/ext/fox16/fox16.bundle +0 -0
  186. data/lib/fox16/aliases.rb +5598 -0
  187. data/lib/fox16/calendar.rb +217 -0
  188. data/lib/fox16/chore.rb +105 -0
  189. data/lib/fox16/colors.rb +280 -0
  190. data/lib/fox16/core.rb +681 -0
  191. data/lib/fox16/dict.rb +35 -0
  192. data/lib/fox16/execute_nonmodal.rb +70 -0
  193. data/lib/fox16/glgroup.rb +166 -0
  194. data/lib/fox16/glshapes.rb +456 -0
  195. data/lib/fox16/input.rb +59 -0
  196. data/lib/fox16/irb.rb +178 -0
  197. data/lib/fox16/iterators.rb +371 -0
  198. data/lib/fox16/keys.rb +1374 -0
  199. data/lib/fox16/kwargs.rb +2736 -0
  200. data/lib/fox16/missingdep.rb +14 -0
  201. data/lib/fox16/pseudokeyboard.rb +40 -0
  202. data/lib/fox16/pseudomouse.rb +87 -0
  203. data/lib/fox16/responder.rb +70 -0
  204. data/lib/fox16/responder2.rb +131 -0
  205. data/lib/fox16/scintilla.rb +3641 -0
  206. data/lib/fox16/settings.rb +18 -0
  207. data/lib/fox16/signal.rb +71 -0
  208. data/lib/fox16/splashscreen.rb +82 -0
  209. data/lib/fox16/timeout.rb +136 -0
  210. data/lib/fox16/undolist.rb +455 -0
  211. data/lib/fox16/version.rb +9 -0
  212. data/rdoc-sources/FX4Splitter.rb +156 -0
  213. data/rdoc-sources/FX7Segment.rb +54 -0
  214. data/rdoc-sources/FXAccelTable.rb +102 -0
  215. data/rdoc-sources/FXApp.rb +545 -0
  216. data/rdoc-sources/FXArrowButton.rb +69 -0
  217. data/rdoc-sources/FXBMPIcon.rb +67 -0
  218. data/rdoc-sources/FXBMPImage.rb +30 -0
  219. data/rdoc-sources/FXBitmap.rb +115 -0
  220. data/rdoc-sources/FXBitmapFrame.rb +31 -0
  221. data/rdoc-sources/FXBitmapView.rb +44 -0
  222. data/rdoc-sources/FXButton.rb +59 -0
  223. data/rdoc-sources/FXCURCursor.rb +13 -0
  224. data/rdoc-sources/FXCanvas.rb +18 -0
  225. data/rdoc-sources/FXCheckButton.rb +58 -0
  226. data/rdoc-sources/FXChoiceBox.rb +49 -0
  227. data/rdoc-sources/FXColorBar.rb +48 -0
  228. data/rdoc-sources/FXColorDialog.rb +37 -0
  229. data/rdoc-sources/FXColorList.rb +55 -0
  230. data/rdoc-sources/FXColorRing.rb +49 -0
  231. data/rdoc-sources/FXColorSelector.rb +65 -0
  232. data/rdoc-sources/FXColorWell.rb +65 -0
  233. data/rdoc-sources/FXColorWheel.rb +57 -0
  234. data/rdoc-sources/FXComboBox.rb +211 -0
  235. data/rdoc-sources/FXComposite.rb +34 -0
  236. data/rdoc-sources/FXCursor.rb +67 -0
  237. data/rdoc-sources/FXDC.rb +720 -0
  238. data/rdoc-sources/FXDCPrint.rb +127 -0
  239. data/rdoc-sources/FXDCWindow.rb +33 -0
  240. data/rdoc-sources/FXDataTarget.rb +66 -0
  241. data/rdoc-sources/FXDebugTarget.rb +25 -0
  242. data/rdoc-sources/FXDelegator.rb +23 -0
  243. data/rdoc-sources/FXDial.rb +107 -0
  244. data/rdoc-sources/FXDialogBox.rb +32 -0
  245. data/rdoc-sources/FXDict.rb +79 -0
  246. data/rdoc-sources/FXDirBox.rb +55 -0
  247. data/rdoc-sources/FXDirDialog.rb +47 -0
  248. data/rdoc-sources/FXDirList.rb +149 -0
  249. data/rdoc-sources/FXDirSelector.rb +64 -0
  250. data/rdoc-sources/FXDockBar.rb +151 -0
  251. data/rdoc-sources/FXDockHandler.rb +26 -0
  252. data/rdoc-sources/FXDockSite.rb +104 -0
  253. data/rdoc-sources/FXDockTitle.rb +26 -0
  254. data/rdoc-sources/FXDocument.rb +29 -0
  255. data/rdoc-sources/FXDragCorner.rb +19 -0
  256. data/rdoc-sources/FXDrawable.rb +27 -0
  257. data/rdoc-sources/FXDriveBox.rb +46 -0
  258. data/rdoc-sources/FXExtentd.rb +85 -0
  259. data/rdoc-sources/FXExtentf.rb +85 -0
  260. data/rdoc-sources/FXFileDialog.rb +217 -0
  261. data/rdoc-sources/FXFileDict.rb +131 -0
  262. data/rdoc-sources/FXFileList.rb +208 -0
  263. data/rdoc-sources/FXFileSelector.rb +184 -0
  264. data/rdoc-sources/FXFileStream.rb +27 -0
  265. data/rdoc-sources/FXFoldingList.rb +504 -0
  266. data/rdoc-sources/FXFont.rb +361 -0
  267. data/rdoc-sources/FXFontDialog.rb +14 -0
  268. data/rdoc-sources/FXFontSelector.rb +37 -0
  269. data/rdoc-sources/FXFrame.rb +53 -0
  270. data/rdoc-sources/FXGIFCursor.rb +50 -0
  271. data/rdoc-sources/FXGIFIcon.rb +31 -0
  272. data/rdoc-sources/FXGIFImage.rb +29 -0
  273. data/rdoc-sources/FXGLCanvas.rb +45 -0
  274. data/rdoc-sources/FXGLContext.rb +40 -0
  275. data/rdoc-sources/FXGLObject.rb +75 -0
  276. data/rdoc-sources/FXGLShape.rb +69 -0
  277. data/rdoc-sources/FXGLViewer.rb +332 -0
  278. data/rdoc-sources/FXGLVisual.rb +94 -0
  279. data/rdoc-sources/FXGradientBar.rb +301 -0
  280. data/rdoc-sources/FXGroupBox.rb +33 -0
  281. data/rdoc-sources/FXHeader.rb +408 -0
  282. data/rdoc-sources/FXHorizontalFrame.rb +29 -0
  283. data/rdoc-sources/FXICOIcon.rb +65 -0
  284. data/rdoc-sources/FXICOImage.rb +31 -0
  285. data/rdoc-sources/FXIcon.rb +38 -0
  286. data/rdoc-sources/FXIconDict.rb +48 -0
  287. data/rdoc-sources/FXIconList.rb +447 -0
  288. data/rdoc-sources/FXIconSource.rb +100 -0
  289. data/rdoc-sources/FXId.rb +34 -0
  290. data/rdoc-sources/FXImage.rb +292 -0
  291. data/rdoc-sources/FXImageFrame.rb +36 -0
  292. data/rdoc-sources/FXImageView.rb +35 -0
  293. data/rdoc-sources/FXInputDialog.rb +77 -0
  294. data/rdoc-sources/FXJPGIcon.rb +70 -0
  295. data/rdoc-sources/FXJPGImage.rb +38 -0
  296. data/rdoc-sources/FXKnob.rb +76 -0
  297. data/rdoc-sources/FXLabel.rb +69 -0
  298. data/rdoc-sources/FXList.rb +440 -0
  299. data/rdoc-sources/FXListBox.rb +191 -0
  300. data/rdoc-sources/FXMDIButton.rb +67 -0
  301. data/rdoc-sources/FXMDIChild.rb +155 -0
  302. data/rdoc-sources/FXMDIClient.rb +65 -0
  303. data/rdoc-sources/FXMainWindow.rb +26 -0
  304. data/rdoc-sources/FXMatrix.rb +57 -0
  305. data/rdoc-sources/FXMemoryBuffer.rb +28 -0
  306. data/rdoc-sources/FXMemoryStream.rb +50 -0
  307. data/rdoc-sources/FXMenuBar.rb +23 -0
  308. data/rdoc-sources/FXMenuButton.rb +84 -0
  309. data/rdoc-sources/FXMenuCaption.rb +50 -0
  310. data/rdoc-sources/FXMenuCascade.rb +18 -0
  311. data/rdoc-sources/FXMenuCheck.rb +30 -0
  312. data/rdoc-sources/FXMenuCommand.rb +26 -0
  313. data/rdoc-sources/FXMenuPane.rb +13 -0
  314. data/rdoc-sources/FXMenuRadio.rb +33 -0
  315. data/rdoc-sources/FXMenuSeparator.rb +21 -0
  316. data/rdoc-sources/FXMenuTitle.rb +27 -0
  317. data/rdoc-sources/FXMessageBox.rb +72 -0
  318. data/rdoc-sources/FXObject.rb +28 -0
  319. data/rdoc-sources/FXOptionMenu.rb +83 -0
  320. data/rdoc-sources/FXPCXIcon.rb +63 -0
  321. data/rdoc-sources/FXPCXImage.rb +31 -0
  322. data/rdoc-sources/FXPNGIcon.rb +66 -0
  323. data/rdoc-sources/FXPNGImage.rb +34 -0
  324. data/rdoc-sources/FXPPMIcon.rb +36 -0
  325. data/rdoc-sources/FXPPMImage.rb +31 -0
  326. data/rdoc-sources/FXPacker.rb +63 -0
  327. data/rdoc-sources/FXPicker.rb +27 -0
  328. data/rdoc-sources/FXPopup.rb +53 -0
  329. data/rdoc-sources/FXPrintDialog.rb +36 -0
  330. data/rdoc-sources/FXProgressBar.rb +57 -0
  331. data/rdoc-sources/FXProgressDialog.rb +36 -0
  332. data/rdoc-sources/FXQuatd.rb +164 -0
  333. data/rdoc-sources/FXQuatf.rb +173 -0
  334. data/rdoc-sources/FXRGBIcon.rb +64 -0
  335. data/rdoc-sources/FXRGBImage.rb +31 -0
  336. data/rdoc-sources/FXRadioButton.rb +70 -0
  337. data/rdoc-sources/FXRanged.rb +100 -0
  338. data/rdoc-sources/FXRangef.rb +100 -0
  339. data/rdoc-sources/FXRealSlider.rb +101 -0
  340. data/rdoc-sources/FXRealSpinner.rb +140 -0
  341. data/rdoc-sources/FXRecentFiles.rb +77 -0
  342. data/rdoc-sources/FXRectangle.rb +149 -0
  343. data/rdoc-sources/FXRegion.rb +64 -0
  344. data/rdoc-sources/FXRegistry.rb +56 -0
  345. data/rdoc-sources/FXReplaceDialog.rb +56 -0
  346. data/rdoc-sources/FXRootWindow.rb +17 -0
  347. data/rdoc-sources/FXRuler.rb +130 -0
  348. data/rdoc-sources/FXRulerView.rb +225 -0
  349. data/rdoc-sources/FXScintilla.rb +121 -0
  350. data/rdoc-sources/FXScrollArea.rb +86 -0
  351. data/rdoc-sources/FXScrollBar.rb +107 -0
  352. data/rdoc-sources/FXScrollPane.rb +28 -0
  353. data/rdoc-sources/FXScrollWindow.rb +38 -0
  354. data/rdoc-sources/FXSearchDialog.rb +24 -0
  355. data/rdoc-sources/FXSeparator.rb +74 -0
  356. data/rdoc-sources/FXSettings.rb +248 -0
  357. data/rdoc-sources/FXShell.rb +8 -0
  358. data/rdoc-sources/FXShutter.rb +102 -0
  359. data/rdoc-sources/FXSize.rb +95 -0
  360. data/rdoc-sources/FXSlider.rb +98 -0
  361. data/rdoc-sources/FXSphered.rb +80 -0
  362. data/rdoc-sources/FXSpheref.rb +80 -0
  363. data/rdoc-sources/FXSpinner.rb +136 -0
  364. data/rdoc-sources/FXSplashWindow.rb +27 -0
  365. data/rdoc-sources/FXSplitter.rb +89 -0
  366. data/rdoc-sources/FXSpring.rb +61 -0
  367. data/rdoc-sources/FXStatusBar.rb +42 -0
  368. data/rdoc-sources/FXStatusLine.rb +60 -0
  369. data/rdoc-sources/FXStream.rb +142 -0
  370. data/rdoc-sources/FXStringDict.rb +38 -0
  371. data/rdoc-sources/FXSwitcher.rb +78 -0
  372. data/rdoc-sources/FXTGAIcon.rb +63 -0
  373. data/rdoc-sources/FXTGAImage.rb +31 -0
  374. data/rdoc-sources/FXTIFIcon.rb +70 -0
  375. data/rdoc-sources/FXTIFImage.rb +37 -0
  376. data/rdoc-sources/FXTabBar.rb +80 -0
  377. data/rdoc-sources/FXTabBook.rb +41 -0
  378. data/rdoc-sources/FXTabItem.rb +58 -0
  379. data/rdoc-sources/FXTable.rb +967 -0
  380. data/rdoc-sources/FXText.rb +578 -0
  381. data/rdoc-sources/FXTextField.rb +151 -0
  382. data/rdoc-sources/FXToggleButton.rb +70 -0
  383. data/rdoc-sources/FXToolBar.rb +61 -0
  384. data/rdoc-sources/FXToolBarGrip.rb +50 -0
  385. data/rdoc-sources/FXToolBarShell.rb +44 -0
  386. data/rdoc-sources/FXToolBarTab.rb +74 -0
  387. data/rdoc-sources/FXToolTip.rb +36 -0
  388. data/rdoc-sources/FXTopWindow.rb +163 -0
  389. data/rdoc-sources/FXTranslator.rb +32 -0
  390. data/rdoc-sources/FXTreeList.rb +514 -0
  391. data/rdoc-sources/FXTreeListBox.rb +219 -0
  392. data/rdoc-sources/FXTriStateButton.rb +49 -0
  393. data/rdoc-sources/FXVec2d.rb +96 -0
  394. data/rdoc-sources/FXVec2f.rb +96 -0
  395. data/rdoc-sources/FXVec3d.rb +113 -0
  396. data/rdoc-sources/FXVec3f.rb +113 -0
  397. data/rdoc-sources/FXVec4d.rb +129 -0
  398. data/rdoc-sources/FXVec4f.rb +129 -0
  399. data/rdoc-sources/FXVerticalFrame.rb +29 -0
  400. data/rdoc-sources/FXVisual.rb +79 -0
  401. data/rdoc-sources/FXWindow.rb +725 -0
  402. data/rdoc-sources/FXWizard.rb +59 -0
  403. data/rdoc-sources/FXXBMIcon.rb +37 -0
  404. data/rdoc-sources/FXXBMImage.rb +32 -0
  405. data/rdoc-sources/FXXPMIcon.rb +65 -0
  406. data/rdoc-sources/FXXPMImage.rb +31 -0
  407. data/rdoc-sources/README.rdoc +53 -0
  408. data/rdoc-sources/fxdefs.rb +90 -0
  409. data/tests/README +19 -0
  410. data/tests/TC_FXAccelTable.rb +43 -0
  411. data/tests/TC_FXApp.rb +15 -0
  412. data/tests/TC_FXArc.rb +26 -0
  413. data/tests/TC_FXBMPIcon.rb +15 -0
  414. data/tests/TC_FXBMPImage.rb +15 -0
  415. data/tests/TC_FXButton.rb +72 -0
  416. data/tests/TC_FXCheckButton.rb +57 -0
  417. data/tests/TC_FXComboBox.rb +52 -0
  418. data/tests/TC_FXDC.rb +372 -0
  419. data/tests/TC_FXDCPrint.rb +102 -0
  420. data/tests/TC_FXDCWindow.rb +23 -0
  421. data/tests/TC_FXDataTarget.rb +24 -0
  422. data/tests/TC_FXDirList.rb +30 -0
  423. data/tests/TC_FXFileAssoc.rb +62 -0
  424. data/tests/TC_FXFileStream.rb +90 -0
  425. data/tests/TC_FXFoldingList.rb +32 -0
  426. data/tests/TC_FXFont.rb +69 -0
  427. data/tests/TC_FXFontDesc.rb +58 -0
  428. data/tests/TC_FXGLGroup.rb +32 -0
  429. data/tests/TC_FXGLShape.rb +28 -0
  430. data/tests/TC_FXGLViewer.rb +20 -0
  431. data/tests/TC_FXGradientBar.rb +89 -0
  432. data/tests/TC_FXHeader.rb +82 -0
  433. data/tests/TC_FXIconDict.rb +52 -0
  434. data/tests/TC_FXIconList.rb +192 -0
  435. data/tests/TC_FXId.rb +19 -0
  436. data/tests/TC_FXImage.rb +155 -0
  437. data/tests/TC_FXLight.rb +33 -0
  438. data/tests/TC_FXList.rb +116 -0
  439. data/tests/TC_FXListBox.rb +49 -0
  440. data/tests/TC_FXMat4f.rb +228 -0
  441. data/tests/TC_FXMaterial.rb +89 -0
  442. data/tests/TC_FXMemoryStream.rb +97 -0
  443. data/tests/TC_FXMenuCheck.rb +57 -0
  444. data/tests/TC_FXMenuCommand.rb +12 -0
  445. data/tests/TC_FXMenuRadio.rb +57 -0
  446. data/tests/TC_FXPoint.rb +57 -0
  447. data/tests/TC_FXQuatf.rb +77 -0
  448. data/tests/TC_FXRadioButton.rb +57 -0
  449. data/tests/TC_FXRangef.rb +48 -0
  450. data/tests/TC_FXRectangle.rb +88 -0
  451. data/tests/TC_FXRegion.rb +54 -0
  452. data/tests/TC_FXRegistry.rb +27 -0
  453. data/tests/TC_FXScrollArea.rb +28 -0
  454. data/tests/TC_FXScrollWindow.rb +28 -0
  455. data/tests/TC_FXSegment.rb +22 -0
  456. data/tests/TC_FXSettings.rb +34 -0
  457. data/tests/TC_FXShell.rb +26 -0
  458. data/tests/TC_FXSize.rb +54 -0
  459. data/tests/TC_FXStream.rb +11 -0
  460. data/tests/TC_FXTable.rb +368 -0
  461. data/tests/TC_FXTableItem.rb +48 -0
  462. data/tests/TC_FXText.rb +96 -0
  463. data/tests/TC_FXTopWindow.rb +32 -0
  464. data/tests/TC_FXTreeList.rb +100 -0
  465. data/tests/TC_FXTreeListBox.rb +41 -0
  466. data/tests/TC_FXUndoList.rb +43 -0
  467. data/tests/TC_FXVec2d.rb +142 -0
  468. data/tests/TC_FXVec2f.rb +137 -0
  469. data/tests/TC_FXVec3d.rb +150 -0
  470. data/tests/TC_FXVec3f.rb +150 -0
  471. data/tests/TC_FXVec4f.rb +158 -0
  472. data/tests/TC_FXViewport.rb +30 -0
  473. data/tests/TC_FXXBMIcon.rb +15 -0
  474. data/tests/TC_FXXBMImage.rb +15 -0
  475. data/tests/TC_FXXPMIcon.rb +15 -0
  476. data/tests/TC_FXXPMImage.rb +15 -0
  477. data/tests/TC_Misc.rb +157 -0
  478. data/tests/TC_downcast.rb +15 -0
  479. data/tests/TS_All.rb +25 -0
  480. data/tests/blankpage.ps +166 -0
  481. data/tests/howdypage.ps +181 -0
  482. data/tests/output.ps +166 -0
  483. data/tests/stress1.rb +92 -0
  484. data/tests/stress2.rb +51 -0
  485. data/tests/stress3.rb +117 -0
  486. data/tests/testcase.rb +37 -0
  487. data/web/community.html +94 -0
  488. data/web/documentation.html +100 -0
  489. data/web/downloads.html +114 -0
  490. data/web/index.html +96 -0
  491. metadata +550 -0
@@ -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
+
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'fox16'
4
+
5
+ include Fox
6
+
7
+ class InputHandlerWindow < FXMainWindow
8
+
9
+ def initialize(app)
10
+ # Initialize base class first
11
+ super(app, "Input Handlers Test", :opts => DECOR_ALL, :width => 400, :height => 300)
12
+
13
+ # Text area plus a button
14
+ commands = FXHorizontalFrame.new(self, LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X)
15
+ FXLabel.new(commands, "Command:")
16
+ @cmdInput = FXTextField.new(commands, 30, :opts => FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X)
17
+ @cmdInput.connect(SEL_COMMAND, method(:onCmdText))
18
+ FXHorizontalSeparator.new(self, LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X)
19
+ textFrame = FXVerticalFrame.new(self,
20
+ FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y)
21
+
22
+ # Output will be displayed in a multiline text area
23
+ @cmdOutput = FXText.new(textFrame, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y)
24
+
25
+ # Initialize the pipe
26
+ @pipe = nil
27
+ end
28
+
29
+ # Create and show the main window
30
+ def create
31
+ super
32
+ show(PLACEMENT_SCREEN)
33
+ end
34
+
35
+ # Remove previous input (if any)
36
+ def closePipe
37
+ if @pipe
38
+ getApp().removeInput(@pipe, INPUT_READ|INPUT_EXCEPT)
39
+ @pipe = nil
40
+ end
41
+ end
42
+
43
+ def onCmdText(sender, sel, ptr)
44
+ # Stop previous command
45
+ closePipe
46
+
47
+ # Clean up the output window
48
+ @cmdOutput.text = ""
49
+
50
+ # Open a new pipe
51
+ @pipe = IO.popen(@cmdInput.text)
52
+
53
+ # Register input callbacks and return
54
+ getApp().addInput(@pipe, INPUT_READ|INPUT_EXCEPT) do |sender, sel, ptr|
55
+ case FXSELTYPE(sel)
56
+ when SEL_IO_READ
57
+ text = @pipe.read_nonblock(256)
58
+ if text && text.length > 0
59
+ @cmdOutput.appendText(text)
60
+ else
61
+ closePipe
62
+ end
63
+ when SEL_IO_EXCEPT
64
+ # puts 'onPipeExcept'
65
+ end
66
+ end
67
+ return 1
68
+ end
69
+ end
70
+
71
+ if $0 == __FILE__
72
+ # Construct an application
73
+ application = FXApp.new('InputHandler', 'FoxTest')
74
+
75
+ # Construct the main window
76
+ InputHandlerWindow.new(application)
77
+
78
+ # Create and show the application windows
79
+ application.create
80
+
81
+ # Run the application
82
+ application.run
83
+ end