fxruby 1.2.2

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 (692) hide show
  1. data/ANNOUNCE +25 -0
  2. data/ChangeLog +10606 -0
  3. data/INSTALL +50 -0
  4. data/LICENSE +456 -0
  5. data/README +39 -0
  6. data/doc/apes02.html +21 -0
  7. data/doc/apes03.html +39 -0
  8. data/doc/book.html +3 -0
  9. data/doc/build.html +144 -0
  10. data/doc/ch03s02.html +24 -0
  11. data/doc/ch03s03.html +53 -0
  12. data/doc/ch03s04.html +37 -0
  13. data/doc/ch03s05.html +61 -0
  14. data/doc/ch04s02.html +72 -0
  15. data/doc/ch04s03.html +37 -0
  16. data/doc/ch04s04.html +72 -0
  17. data/doc/ch05s02.html +262 -0
  18. data/doc/ch05s03.html +128 -0
  19. data/doc/changes.html +75 -0
  20. data/doc/clipboardtut.html +68 -0
  21. data/doc/cvs.html +35 -0
  22. data/doc/differences.html +11 -0
  23. data/doc/dragdroptut.html +266 -0
  24. data/doc/events.html +36 -0
  25. data/doc/examples.html +104 -0
  26. data/doc/gems.html +73 -0
  27. data/doc/goals.html +39 -0
  28. data/doc/images/babelfish.png +0 -0
  29. data/doc/images/browser.png +0 -0
  30. data/doc/images/button.png +0 -0
  31. data/doc/images/call-chain-example.png +0 -0
  32. data/doc/images/colordialog.png +0 -0
  33. data/doc/images/datatarget.png +0 -0
  34. data/doc/images/dialog.png +0 -0
  35. data/doc/images/dilbert.png +0 -0
  36. data/doc/images/dirlist.png +0 -0
  37. data/doc/images/dropsite-droprejected.png +0 -0
  38. data/doc/images/foursplit.png +0 -0
  39. data/doc/images/gltest.png +0 -0
  40. data/doc/images/glviewer.png +0 -0
  41. data/doc/images/groupbox.png +0 -0
  42. data/doc/images/header.png +0 -0
  43. data/doc/images/hello-with-button.png +0 -0
  44. data/doc/images/hello-with-icon-1.png +0 -0
  45. data/doc/images/hello-with-icon-2.png +0 -0
  46. data/doc/images/hello-with-icon-3.png +0 -0
  47. data/doc/images/hello-with-tooltip.png +0 -0
  48. data/doc/images/hello-without-button.png +0 -0
  49. data/doc/images/hello.png +0 -0
  50. data/doc/images/hello2.png +0 -0
  51. data/doc/images/iconlist-bigicons.png +0 -0
  52. data/doc/images/iconlist-details.png +0 -0
  53. data/doc/images/image.png +0 -0
  54. data/doc/images/imageviewer.png +0 -0
  55. data/doc/images/inheritance.png +0 -0
  56. data/doc/images/mditest.png +0 -0
  57. data/doc/images/raabrowser.png +0 -0
  58. data/doc/images/scribble.png +0 -0
  59. data/doc/images/shutter.png +0 -0
  60. data/doc/images/splitter.png +0 -0
  61. data/doc/images/tabbook.png +0 -0
  62. data/doc/images/table.png +0 -0
  63. data/doc/images/tutorial1.png +0 -0
  64. data/doc/implementation.html +16 -0
  65. data/doc/infosources.html +33 -0
  66. data/doc/library.html +30 -0
  67. data/doc/opengl.html +73 -0
  68. data/doc/pt01.html +3 -0
  69. data/doc/pt02.html +3 -0
  70. data/doc/scintilla.html +36 -0
  71. data/doc/todo.html +40 -0
  72. data/doc/tutorial1.html +97 -0
  73. data/examples/RAA.rb +25 -0
  74. data/examples/README +53 -0
  75. data/examples/babelfish.rb +107 -0
  76. data/examples/bounce.rb +159 -0
  77. data/examples/browser.rb +191 -0
  78. data/examples/button.rb +160 -0
  79. data/examples/datatarget.rb +223 -0
  80. data/examples/dctest.rb +702 -0
  81. data/examples/dialog.rb +148 -0
  82. data/examples/dilbert.rb +105 -0
  83. data/examples/dirlist.rb +63 -0
  84. data/examples/dragdrop.rb +101 -0
  85. data/examples/dragsource.rb +81 -0
  86. data/examples/dropsite.rb +61 -0
  87. data/examples/foursplit.rb +103 -0
  88. data/examples/gltest.rb +342 -0
  89. data/examples/glviewer.rb +579 -0
  90. data/examples/groupbox.rb +422 -0
  91. data/examples/header.rb +150 -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 +104 -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 +281 -0
  166. data/examples/imageviewer.rb +513 -0
  167. data/examples/inputs.rb +84 -0
  168. data/examples/mditest.rb +180 -0
  169. data/examples/pig.rb +77 -0
  170. data/examples/raabrowser.rb +132 -0
  171. data/examples/scintilla-test.rb +81 -0
  172. data/examples/scribble-orig.rb +186 -0
  173. data/examples/scribble.rb +166 -0
  174. data/examples/shutter.rb +158 -0
  175. data/examples/splitter.rb +211 -0
  176. data/examples/styledtext.rb +92 -0
  177. data/examples/tabbook.rb +124 -0
  178. data/examples/table.rb +187 -0
  179. data/examples/textedit/commands.rb +117 -0
  180. data/examples/textedit/helpwindow.rb +295 -0
  181. data/examples/textedit/prefdialog.rb +235 -0
  182. data/examples/textedit/textedit.rb +1767 -0
  183. data/ext/fox12/FXRbApp.cpp +127 -0
  184. data/ext/fox12/FXRbDataTarget.cpp +106 -0
  185. data/ext/fox12/FXRbGLViewer.cpp +89 -0
  186. data/ext/fox12/FXRuby.cpp +1818 -0
  187. data/ext/fox12/MANIFEST +189 -0
  188. data/ext/fox12/core_wrap.cpp +10119 -0
  189. data/ext/fox12/dc_wrap.cpp +2638 -0
  190. data/ext/fox12/dialogs_wrap.cpp +6244 -0
  191. data/ext/fox12/extconf.rb +176 -0
  192. data/ext/fox12/frames_wrap.cpp +8274 -0
  193. data/ext/fox12/fx3d_wrap.cpp +9315 -0
  194. data/ext/fox12/iconlist_wrap.cpp +3742 -0
  195. data/ext/fox12/icons_wrap.cpp +4040 -0
  196. data/ext/fox12/image_wrap.cpp +4026 -0
  197. data/ext/fox12/impl.cpp +1064 -0
  198. data/ext/fox12/include/FXMemoryBuffer.h +52 -0
  199. data/ext/fox12/include/FXRb4Splitter.h +54 -0
  200. data/ext/fox12/include/FXRbAccelTable.h +46 -0
  201. data/ext/fox12/include/FXRbApp.h +137 -0
  202. data/ext/fox12/include/FXRbAppVirtuals.h +15 -0
  203. data/ext/fox12/include/FXRbArrowButton.h +51 -0
  204. data/ext/fox12/include/FXRbBMPIcon.h +54 -0
  205. data/ext/fox12/include/FXRbBMPImage.h +54 -0
  206. data/ext/fox12/include/FXRbBitmap.h +115 -0
  207. data/ext/fox12/include/FXRbBitmapFrame.h +56 -0
  208. data/ext/fox12/include/FXRbBitmapView.h +52 -0
  209. data/ext/fox12/include/FXRbBitmapVirtuals.h +27 -0
  210. data/ext/fox12/include/FXRbButton.h +51 -0
  211. data/ext/fox12/include/FXRbCURCursor.h +60 -0
  212. data/ext/fox12/include/FXRbCanvas.h +51 -0
  213. data/ext/fox12/include/FXRbCheckButton.h +51 -0
  214. data/ext/fox12/include/FXRbColorBar.h +51 -0
  215. data/ext/fox12/include/FXRbColorDialog.h +53 -0
  216. data/ext/fox12/include/FXRbColorSelector.h +51 -0
  217. data/ext/fox12/include/FXRbColorWell.h +51 -0
  218. data/ext/fox12/include/FXRbColorWheel.h +51 -0
  219. data/ext/fox12/include/FXRbComboBox.h +56 -0
  220. data/ext/fox12/include/FXRbCommon.h +86 -0
  221. data/ext/fox12/include/FXRbComposite.h +51 -0
  222. data/ext/fox12/include/FXRbCursor.h +87 -0
  223. data/ext/fox12/include/FXRbCursorVirtuals.h +6 -0
  224. data/ext/fox12/include/FXRbDC.h +385 -0
  225. data/ext/fox12/include/FXRbDCPrint.h +49 -0
  226. data/ext/fox12/include/FXRbDCVirtuals.h +166 -0
  227. data/ext/fox12/include/FXRbDCWindow.h +64 -0
  228. data/ext/fox12/include/FXRbDataTarget.h +65 -0
  229. data/ext/fox12/include/FXRbDebugTarget.h +46 -0
  230. data/ext/fox12/include/FXRbDelegator.h +46 -0
  231. data/ext/fox12/include/FXRbDial.h +51 -0
  232. data/ext/fox12/include/FXRbDialogBox.h +68 -0
  233. data/ext/fox12/include/FXRbDialogBoxVirtuals.h +3 -0
  234. data/ext/fox12/include/FXRbDict.h +46 -0
  235. data/ext/fox12/include/FXRbDirBox.h +51 -0
  236. data/ext/fox12/include/FXRbDirDialog.h +53 -0
  237. data/ext/fox12/include/FXRbDirList.h +79 -0
  238. data/ext/fox12/include/FXRbDirSelector.h +51 -0
  239. data/ext/fox12/include/FXRbDocument.h +46 -0
  240. data/ext/fox12/include/FXRbDragCorner.h +51 -0
  241. data/ext/fox12/include/FXRbDrawable.h +64 -0
  242. data/ext/fox12/include/FXRbDrawableVirtuals.h +3 -0
  243. data/ext/fox12/include/FXRbDriveBox.h +51 -0
  244. data/ext/fox12/include/FXRbFileDialog.h +56 -0
  245. data/ext/fox12/include/FXRbFileDict.h +104 -0
  246. data/ext/fox12/include/FXRbFileDictVirtuals.h +9 -0
  247. data/ext/fox12/include/FXRbFileList.h +81 -0
  248. data/ext/fox12/include/FXRbFileSelector.h +51 -0
  249. data/ext/fox12/include/FXRbFoldingItemVirtuals.h +45 -0
  250. data/ext/fox12/include/FXRbFoldingList.h +183 -0
  251. data/ext/fox12/include/FXRbFont.h +70 -0
  252. data/ext/fox12/include/FXRbFontDialog.h +53 -0
  253. data/ext/fox12/include/FXRbFontSelector.h +51 -0
  254. data/ext/fox12/include/FXRbFrame.h +51 -0
  255. data/ext/fox12/include/FXRbGIFCursor.h +60 -0
  256. data/ext/fox12/include/FXRbGIFIcon.h +54 -0
  257. data/ext/fox12/include/FXRbGIFImage.h +54 -0
  258. data/ext/fox12/include/FXRbGLCanvas.h +92 -0
  259. data/ext/fox12/include/FXRbGLCanvasVirtuals.h +13 -0
  260. data/ext/fox12/include/FXRbGLContext.h +58 -0
  261. data/ext/fox12/include/FXRbGLObject.h +103 -0
  262. data/ext/fox12/include/FXRbGLObjectVirtuals.h +22 -0
  263. data/ext/fox12/include/FXRbGLShape.h +81 -0
  264. data/ext/fox12/include/FXRbGLShapeVirtuals.h +8 -0
  265. data/ext/fox12/include/FXRbGLViewer.h +83 -0
  266. data/ext/fox12/include/FXRbGLViewerVirtuals.h +6 -0
  267. data/ext/fox12/include/FXRbGLVisual.h +56 -0
  268. data/ext/fox12/include/FXRbGradientBar.h +55 -0
  269. data/ext/fox12/include/FXRbGroupBox.h +51 -0
  270. data/ext/fox12/include/FXRbHeader.h +125 -0
  271. data/ext/fox12/include/FXRbHeaderItemVirtuals.h +22 -0
  272. data/ext/fox12/include/FXRbHorizontalFrame.h +51 -0
  273. data/ext/fox12/include/FXRbICOIcon.h +54 -0
  274. data/ext/fox12/include/FXRbICOImage.h +54 -0
  275. data/ext/fox12/include/FXRbIcon.h +57 -0
  276. data/ext/fox12/include/FXRbIconItemVirtuals.h +71 -0
  277. data/ext/fox12/include/FXRbIconList.h +266 -0
  278. data/ext/fox12/include/FXRbIconListVirtuals.h +21 -0
  279. data/ext/fox12/include/FXRbId.h +74 -0
  280. data/ext/fox12/include/FXRbIdVirtuals.h +9 -0
  281. data/ext/fox12/include/FXRbImage.h +162 -0
  282. data/ext/fox12/include/FXRbImageFrame.h +56 -0
  283. data/ext/fox12/include/FXRbImageView.h +52 -0
  284. data/ext/fox12/include/FXRbImageVirtuals.h +51 -0
  285. data/ext/fox12/include/FXRbInputDialog.h +53 -0
  286. data/ext/fox12/include/FXRbJPGIcon.h +54 -0
  287. data/ext/fox12/include/FXRbJPGImage.h +54 -0
  288. data/ext/fox12/include/FXRbLabel.h +51 -0
  289. data/ext/fox12/include/FXRbList.h +204 -0
  290. data/ext/fox12/include/FXRbListBox.h +56 -0
  291. data/ext/fox12/include/FXRbListItemVirtuals.h +36 -0
  292. data/ext/fox12/include/FXRbListVirtuals.h +18 -0
  293. data/ext/fox12/include/FXRbMDIButton.h +162 -0
  294. data/ext/fox12/include/FXRbMDIChild.h +82 -0
  295. data/ext/fox12/include/FXRbMDIChildVirtuals.h +12 -0
  296. data/ext/fox12/include/FXRbMDIClient.h +80 -0
  297. data/ext/fox12/include/FXRbMDIClientVirtuals.h +12 -0
  298. data/ext/fox12/include/FXRbMainWindow.h +54 -0
  299. data/ext/fox12/include/FXRbMatrix.h +51 -0
  300. data/ext/fox12/include/FXRbMenuBar.h +63 -0
  301. data/ext/fox12/include/FXRbMenuButton.h +51 -0
  302. data/ext/fox12/include/FXRbMenuCaption.h +51 -0
  303. data/ext/fox12/include/FXRbMenuCascade.h +51 -0
  304. data/ext/fox12/include/FXRbMenuCheck.h +49 -0
  305. data/ext/fox12/include/FXRbMenuCommand.h +49 -0
  306. data/ext/fox12/include/FXRbMenuPane.h +52 -0
  307. data/ext/fox12/include/FXRbMenuRadio.h +49 -0
  308. data/ext/fox12/include/FXRbMenuSeparator.h +51 -0
  309. data/ext/fox12/include/FXRbMenuTitle.h +51 -0
  310. data/ext/fox12/include/FXRbMessageBox.h +56 -0
  311. data/ext/fox12/include/FXRbObject.h +67 -0
  312. data/ext/fox12/include/FXRbObjectVirtuals.h +9 -0
  313. data/ext/fox12/include/FXRbOptionMenu.h +73 -0
  314. data/ext/fox12/include/FXRbPCXIcon.h +54 -0
  315. data/ext/fox12/include/FXRbPCXImage.h +54 -0
  316. data/ext/fox12/include/FXRbPNGIcon.h +54 -0
  317. data/ext/fox12/include/FXRbPNGImage.h +54 -0
  318. data/ext/fox12/include/FXRbPPMIcon.h +54 -0
  319. data/ext/fox12/include/FXRbPPMImage.h +54 -0
  320. data/ext/fox12/include/FXRbPacker.h +51 -0
  321. data/ext/fox12/include/FXRbPicker.h +51 -0
  322. data/ext/fox12/include/FXRbPopup.h +70 -0
  323. data/ext/fox12/include/FXRbPopupVirtuals.h +6 -0
  324. data/ext/fox12/include/FXRbPrintDialog.h +53 -0
  325. data/ext/fox12/include/FXRbProgressBar.h +51 -0
  326. data/ext/fox12/include/FXRbProgressDialog.h +53 -0
  327. data/ext/fox12/include/FXRbRGBIcon.h +54 -0
  328. data/ext/fox12/include/FXRbRGBImage.h +54 -0
  329. data/ext/fox12/include/FXRbRadioButton.h +51 -0
  330. data/ext/fox12/include/FXRbRealSlider.h +51 -0
  331. data/ext/fox12/include/FXRbRealSpinner.h +64 -0
  332. data/ext/fox12/include/FXRbRealSpinnerVirtuals.h +3 -0
  333. data/ext/fox12/include/FXRbRecentFiles.h +49 -0
  334. data/ext/fox12/include/FXRbRegistry.h +46 -0
  335. data/ext/fox12/include/FXRbReplaceDialog.h +53 -0
  336. data/ext/fox12/include/FXRbRootWindow.h +51 -0
  337. data/ext/fox12/include/FXRbRuler.h +56 -0
  338. data/ext/fox12/include/FXRbScintilla.h +52 -0
  339. data/ext/fox12/include/FXRbScrollArea.h +82 -0
  340. data/ext/fox12/include/FXRbScrollAreaVirtuals.h +13 -0
  341. data/ext/fox12/include/FXRbScrollBar.h +73 -0
  342. data/ext/fox12/include/FXRbScrollPane.h +52 -0
  343. data/ext/fox12/include/FXRbScrollWindow.h +52 -0
  344. data/ext/fox12/include/FXRbSearchDialog.h +53 -0
  345. data/ext/fox12/include/FXRbSeparator.h +95 -0
  346. data/ext/fox12/include/FXRbSettings.h +46 -0
  347. data/ext/fox12/include/FXRbShell.h +56 -0
  348. data/ext/fox12/include/FXRbShutter.h +86 -0
  349. data/ext/fox12/include/FXRbShutterVirtuals.h +3 -0
  350. data/ext/fox12/include/FXRbSlider.h +51 -0
  351. data/ext/fox12/include/FXRbSpinner.h +64 -0
  352. data/ext/fox12/include/FXRbSpinnerVirtuals.h +3 -0
  353. data/ext/fox12/include/FXRbSplitter.h +54 -0
  354. data/ext/fox12/include/FXRbSpring.h +51 -0
  355. data/ext/fox12/include/FXRbStatusBar.h +51 -0
  356. data/ext/fox12/include/FXRbStatusLine.h +51 -0
  357. data/ext/fox12/include/FXRbStream.h +101 -0
  358. data/ext/fox12/include/FXRbStreamVirtuals.h +9 -0
  359. data/ext/fox12/include/FXRbStringDict.h +46 -0
  360. data/ext/fox12/include/FXRbSwitcher.h +51 -0
  361. data/ext/fox12/include/FXRbTGAIcon.h +54 -0
  362. data/ext/fox12/include/FXRbTGAImage.h +54 -0
  363. data/ext/fox12/include/FXRbTIFIcon.h +54 -0
  364. data/ext/fox12/include/FXRbTIFImage.h +54 -0
  365. data/ext/fox12/include/FXRbTabBar.h +64 -0
  366. data/ext/fox12/include/FXRbTabBarVirtuals.h +3 -0
  367. data/ext/fox12/include/FXRbTabBook.h +52 -0
  368. data/ext/fox12/include/FXRbTabItem.h +51 -0
  369. data/ext/fox12/include/FXRbTable.h +416 -0
  370. data/ext/fox12/include/FXRbTableItemVirtuals.h +68 -0
  371. data/ext/fox12/include/FXRbTableVirtuals.h +73 -0
  372. data/ext/fox12/include/FXRbText.h +89 -0
  373. data/ext/fox12/include/FXRbTextField.h +51 -0
  374. data/ext/fox12/include/FXRbTextVirtuals.h +9 -0
  375. data/ext/fox12/include/FXRbToggleButton.h +51 -0
  376. data/ext/fox12/include/FXRbToolBar.h +80 -0
  377. data/ext/fox12/include/FXRbToolBarGrip.h +51 -0
  378. data/ext/fox12/include/FXRbToolBarShell.h +52 -0
  379. data/ext/fox12/include/FXRbToolBarTab.h +51 -0
  380. data/ext/fox12/include/FXRbToolBarVirtuals.h +6 -0
  381. data/ext/fox12/include/FXRbToolTip.h +51 -0
  382. data/ext/fox12/include/FXRbTopWindow.h +91 -0
  383. data/ext/fox12/include/FXRbTopWindowVirtuals.h +15 -0
  384. data/ext/fox12/include/FXRbTreeItemVirtuals.h +42 -0
  385. data/ext/fox12/include/FXRbTreeList.h +249 -0
  386. data/ext/fox12/include/FXRbTreeListBox.h +53 -0
  387. data/ext/fox12/include/FXRbTreeListVirtuals.h +30 -0
  388. data/ext/fox12/include/FXRbTriStateButton.h +51 -0
  389. data/ext/fox12/include/FXRbVerticalFrame.h +51 -0
  390. data/ext/fox12/include/FXRbVisual.h +56 -0
  391. data/ext/fox12/include/FXRbWindow.h +200 -0
  392. data/ext/fox12/include/FXRbWindowVirtuals.h +69 -0
  393. data/ext/fox12/include/FXRbWizard.h +60 -0
  394. data/ext/fox12/include/FXRbXBMIcon.h +54 -0
  395. data/ext/fox12/include/FXRbXBMImage.h +54 -0
  396. data/ext/fox12/include/FXRbXPMIcon.h +54 -0
  397. data/ext/fox12/include/FXRbXPMImage.h +54 -0
  398. data/ext/fox12/include/FXRuby.h +728 -0
  399. data/ext/fox12/include/impl.h +201 -0
  400. data/ext/fox12/include/inlinestubs.h +1063 -0
  401. data/ext/fox12/label_wrap.cpp +4945 -0
  402. data/ext/fox12/layout_wrap.cpp +5061 -0
  403. data/ext/fox12/librb.c +636 -0
  404. data/ext/fox12/list_wrap.cpp +2212 -0
  405. data/ext/fox12/markfuncs.cpp +1568 -0
  406. data/ext/fox12/mdi_wrap.cpp +4521 -0
  407. data/ext/fox12/menu_wrap.cpp +4673 -0
  408. data/ext/fox12/scintilla_wrap.cpp +2245 -0
  409. data/ext/fox12/table_wrap.cpp +3581 -0
  410. data/ext/fox12/text_wrap.cpp +3539 -0
  411. data/ext/fox12/treelist_wrap.cpp +5609 -0
  412. data/ext/fox12/ui_wrap.cpp +10017 -0
  413. data/index.html +14 -0
  414. data/lib/fox12/aliases.rb +5211 -0
  415. data/lib/fox12/calendar.rb +218 -0
  416. data/lib/fox12/chore.rb +51 -0
  417. data/lib/fox12/colors.rb +282 -0
  418. data/lib/fox12/core.rb +249 -0
  419. data/lib/fox12/dict.rb +35 -0
  420. data/lib/fox12/glgroup.rb +165 -0
  421. data/lib/fox12/glshapes.rb +457 -0
  422. data/lib/fox12/input.rb +56 -0
  423. data/lib/fox12/irb.rb +179 -0
  424. data/lib/fox12/iterators.rb +331 -0
  425. data/lib/fox12/keys.rb +1376 -0
  426. data/lib/fox12/missingdep.rb +16 -0
  427. data/lib/fox12/pseudokeyboard.rb +36 -0
  428. data/lib/fox12/pseudomouse.rb +84 -0
  429. data/lib/fox12/responder.rb +72 -0
  430. data/lib/fox12/responder2.rb +122 -0
  431. data/lib/fox12/scintilla.rb +2629 -0
  432. data/lib/fox12/settings.rb +18 -0
  433. data/lib/fox12/signal.rb +68 -0
  434. data/lib/fox12/timeout.rb +58 -0
  435. data/lib/fox12/undolist.rb +456 -0
  436. data/lib/fox12/version.rb +11 -0
  437. data/rdoc-sources/FX4Splitter.rb +138 -0
  438. data/rdoc-sources/FXAccelTable.rb +67 -0
  439. data/rdoc-sources/FXApp.rb +557 -0
  440. data/rdoc-sources/FXArrowButton.rb +69 -0
  441. data/rdoc-sources/FXBMPIcon.rb +45 -0
  442. data/rdoc-sources/FXBMPImage.rb +20 -0
  443. data/rdoc-sources/FXBitmap.rb +78 -0
  444. data/rdoc-sources/FXBitmapFrame.rb +29 -0
  445. data/rdoc-sources/FXBitmapView.rb +41 -0
  446. data/rdoc-sources/FXButton.rb +43 -0
  447. data/rdoc-sources/FXCURCursor.rb +13 -0
  448. data/rdoc-sources/FXCanvas.rb +18 -0
  449. data/rdoc-sources/FXCheckButton.rb +57 -0
  450. data/rdoc-sources/FXColorBar.rb +43 -0
  451. data/rdoc-sources/FXColorDialog.rb +36 -0
  452. data/rdoc-sources/FXColorSelector.rb +65 -0
  453. data/rdoc-sources/FXColorWell.rb +57 -0
  454. data/rdoc-sources/FXColorWheel.rb +35 -0
  455. data/rdoc-sources/FXComboBox.rb +153 -0
  456. data/rdoc-sources/FXComposite.rb +34 -0
  457. data/rdoc-sources/FXCursor.rb +67 -0
  458. data/rdoc-sources/FXDC.rb +667 -0
  459. data/rdoc-sources/FXDCPrint.rb +127 -0
  460. data/rdoc-sources/FXDCWindow.rb +37 -0
  461. data/rdoc-sources/FXDataTarget.rb +41 -0
  462. data/rdoc-sources/FXDebugTarget.rb +25 -0
  463. data/rdoc-sources/FXDelegator.rb +23 -0
  464. data/rdoc-sources/FXDial.rb +68 -0
  465. data/rdoc-sources/FXDialogBox.rb +36 -0
  466. data/rdoc-sources/FXDict.rb +79 -0
  467. data/rdoc-sources/FXDirBox.rb +49 -0
  468. data/rdoc-sources/FXDirDialog.rb +18 -0
  469. data/rdoc-sources/FXDirList.rb +143 -0
  470. data/rdoc-sources/FXDirSelector.rb +30 -0
  471. data/rdoc-sources/FXDocument.rb +29 -0
  472. data/rdoc-sources/FXDragCorner.rb +19 -0
  473. data/rdoc-sources/FXDrawable.rb +27 -0
  474. data/rdoc-sources/FXDriveBox.rb +46 -0
  475. data/rdoc-sources/FXFileDialog.rb +132 -0
  476. data/rdoc-sources/FXFileDict.rb +168 -0
  477. data/rdoc-sources/FXFileList.rb +163 -0
  478. data/rdoc-sources/FXFileSelector.rb +148 -0
  479. data/rdoc-sources/FXFileStream.rb +24 -0
  480. data/rdoc-sources/FXFoldingList.rb +453 -0
  481. data/rdoc-sources/FXFont.rb +345 -0
  482. data/rdoc-sources/FXFontDialog.rb +14 -0
  483. data/rdoc-sources/FXFontSelector.rb +37 -0
  484. data/rdoc-sources/FXFrame.rb +47 -0
  485. data/rdoc-sources/FXGIFCursor.rb +38 -0
  486. data/rdoc-sources/FXGIFIcon.rb +21 -0
  487. data/rdoc-sources/FXGIFImage.rb +19 -0
  488. data/rdoc-sources/FXGLCanvas.rb +45 -0
  489. data/rdoc-sources/FXGLContext.rb +41 -0
  490. data/rdoc-sources/FXGLObject.rb +75 -0
  491. data/rdoc-sources/FXGLShape.rb +75 -0
  492. data/rdoc-sources/FXGLViewer.rb +309 -0
  493. data/rdoc-sources/FXGLVisual.rb +94 -0
  494. data/rdoc-sources/FXGradientBar.rb +291 -0
  495. data/rdoc-sources/FXGroupBox.rb +33 -0
  496. data/rdoc-sources/FXHeader.rb +377 -0
  497. data/rdoc-sources/FXHorizontalFrame.rb +29 -0
  498. data/rdoc-sources/FXICOIcon.rb +50 -0
  499. data/rdoc-sources/FXICOImage.rb +21 -0
  500. data/rdoc-sources/FXIcon.rb +38 -0
  501. data/rdoc-sources/FXIconList.rb +418 -0
  502. data/rdoc-sources/FXId.rb +34 -0
  503. data/rdoc-sources/FXImage.rb +198 -0
  504. data/rdoc-sources/FXImageFrame.rb +22 -0
  505. data/rdoc-sources/FXImageView.rb +35 -0
  506. data/rdoc-sources/FXInputDialog.rb +62 -0
  507. data/rdoc-sources/FXJPGIcon.rb +52 -0
  508. data/rdoc-sources/FXJPGImage.rb +25 -0
  509. data/rdoc-sources/FXLabel.rb +66 -0
  510. data/rdoc-sources/FXList.rb +412 -0
  511. data/rdoc-sources/FXListBox.rb +158 -0
  512. data/rdoc-sources/FXMDIButton.rb +67 -0
  513. data/rdoc-sources/FXMDIChild.rb +145 -0
  514. data/rdoc-sources/FXMDIClient.rb +67 -0
  515. data/rdoc-sources/FXMainWindow.rb +20 -0
  516. data/rdoc-sources/FXMat4.rb +171 -0
  517. data/rdoc-sources/FXMatrix.rb +57 -0
  518. data/rdoc-sources/FXMemoryBuffer.rb +19 -0
  519. data/rdoc-sources/FXMemoryStream.rb +45 -0
  520. data/rdoc-sources/FXMenuBar.rb +23 -0
  521. data/rdoc-sources/FXMenuButton.rb +84 -0
  522. data/rdoc-sources/FXMenuCaption.rb +47 -0
  523. data/rdoc-sources/FXMenuCascade.rb +18 -0
  524. data/rdoc-sources/FXMenuCheck.rb +30 -0
  525. data/rdoc-sources/FXMenuCommand.rb +27 -0
  526. data/rdoc-sources/FXMenuPane.rb +13 -0
  527. data/rdoc-sources/FXMenuRadio.rb +30 -0
  528. data/rdoc-sources/FXMenuSeparator.rb +21 -0
  529. data/rdoc-sources/FXMenuTitle.rb +27 -0
  530. data/rdoc-sources/FXMessageBox.rb +77 -0
  531. data/rdoc-sources/FXObject.rb +22 -0
  532. data/rdoc-sources/FXOptionMenu.rb +76 -0
  533. data/rdoc-sources/FXPCXIcon.rb +48 -0
  534. data/rdoc-sources/FXPCXImage.rb +21 -0
  535. data/rdoc-sources/FXPNGIcon.rb +48 -0
  536. data/rdoc-sources/FXPNGImage.rb +21 -0
  537. data/rdoc-sources/FXPPMIcon.rb +21 -0
  538. data/rdoc-sources/FXPPMImage.rb +21 -0
  539. data/rdoc-sources/FXPacker.rb +62 -0
  540. data/rdoc-sources/FXPicker.rb +27 -0
  541. data/rdoc-sources/FXPopup.rb +53 -0
  542. data/rdoc-sources/FXPrintDialog.rb +36 -0
  543. data/rdoc-sources/FXProgressBar.rb +57 -0
  544. data/rdoc-sources/FXProgressDialog.rb +36 -0
  545. data/rdoc-sources/FXQuatd.rb +1 -0
  546. data/rdoc-sources/FXQuatf.rb +1 -0
  547. data/rdoc-sources/FXRGBIcon.rb +49 -0
  548. data/rdoc-sources/FXRGBImage.rb +21 -0
  549. data/rdoc-sources/FXRadioButton.rb +64 -0
  550. data/rdoc-sources/FXRanged.rb +97 -0
  551. data/rdoc-sources/FXRangef.rb +97 -0
  552. data/rdoc-sources/FXRealSlider.rb +99 -0
  553. data/rdoc-sources/FXRealSpinner.rb +133 -0
  554. data/rdoc-sources/FXRecentFiles.rb +73 -0
  555. data/rdoc-sources/FXRectangle.rb +137 -0
  556. data/rdoc-sources/FXRegion.rb +64 -0
  557. data/rdoc-sources/FXRegistry.rb +39 -0
  558. data/rdoc-sources/FXReplaceDialog.rb +56 -0
  559. data/rdoc-sources/FXRootWindow.rb +17 -0
  560. data/rdoc-sources/FXRuler.rb +60 -0
  561. data/rdoc-sources/FXScintilla.rb +121 -0
  562. data/rdoc-sources/FXScrollArea.rb +86 -0
  563. data/rdoc-sources/FXScrollBar.rb +101 -0
  564. data/rdoc-sources/FXScrollPane.rb +23 -0
  565. data/rdoc-sources/FXScrollWindow.rb +38 -0
  566. data/rdoc-sources/FXSearchDialog.rb +24 -0
  567. data/rdoc-sources/FXSeparator.rb +64 -0
  568. data/rdoc-sources/FXSettings.rb +222 -0
  569. data/rdoc-sources/FXShell.rb +7 -0
  570. data/rdoc-sources/FXShutter.rb +97 -0
  571. data/rdoc-sources/FXSize.rb +30 -0
  572. data/rdoc-sources/FXSlider.rb +96 -0
  573. data/rdoc-sources/FXSphered.rb +65 -0
  574. data/rdoc-sources/FXSpheref.rb +65 -0
  575. data/rdoc-sources/FXSpinner.rb +132 -0
  576. data/rdoc-sources/FXSplitter.rb +88 -0
  577. data/rdoc-sources/FXSpring.rb +61 -0
  578. data/rdoc-sources/FXStatusBar.rb +42 -0
  579. data/rdoc-sources/FXStatusLine.rb +60 -0
  580. data/rdoc-sources/FXStream.rb +115 -0
  581. data/rdoc-sources/FXStringDict.rb +38 -0
  582. data/rdoc-sources/FXSwitcher.rb +78 -0
  583. data/rdoc-sources/FXTGAIcon.rb +48 -0
  584. data/rdoc-sources/FXTGAImage.rb +21 -0
  585. data/rdoc-sources/FXTIFIcon.rb +52 -0
  586. data/rdoc-sources/FXTIFImage.rb +24 -0
  587. data/rdoc-sources/FXTabBar.rb +76 -0
  588. data/rdoc-sources/FXTabBook.rb +38 -0
  589. data/rdoc-sources/FXTabItem.rb +51 -0
  590. data/rdoc-sources/FXTable.rb +654 -0
  591. data/rdoc-sources/FXText.rb +533 -0
  592. data/rdoc-sources/FXTextField.rb +141 -0
  593. data/rdoc-sources/FXToggleButton.rb +69 -0
  594. data/rdoc-sources/FXToolBar.rb +121 -0
  595. data/rdoc-sources/FXToolBarGrip.rb +55 -0
  596. data/rdoc-sources/FXToolBarShell.rb +44 -0
  597. data/rdoc-sources/FXToolTip.rb +36 -0
  598. data/rdoc-sources/FXTopWindow.rb +92 -0
  599. data/rdoc-sources/FXTreeList.rb +503 -0
  600. data/rdoc-sources/FXTreeListBox.rb +182 -0
  601. data/rdoc-sources/FXTriStateButton.rb +49 -0
  602. data/rdoc-sources/FXVec.rb +97 -0
  603. data/rdoc-sources/FXVec4.rb +91 -0
  604. data/rdoc-sources/FXVerticalFrame.rb +29 -0
  605. data/rdoc-sources/FXVisual.rb +79 -0
  606. data/rdoc-sources/FXWindow.rb +633 -0
  607. data/rdoc-sources/FXWizard.rb +63 -0
  608. data/rdoc-sources/FXXBMIcon.rb +22 -0
  609. data/rdoc-sources/FXXBMImage.rb +22 -0
  610. data/rdoc-sources/FXXPMIcon.rb +50 -0
  611. data/rdoc-sources/FXXPMImage.rb +21 -0
  612. data/rdoc-sources/README.rdoc +53 -0
  613. data/rdoc-sources/fxdefs.rb +90 -0
  614. data/tests/README +19 -0
  615. data/tests/TC_FXAccelTable.rb +43 -0
  616. data/tests/TC_FXApp.rb +15 -0
  617. data/tests/TC_FXArc.rb +26 -0
  618. data/tests/TC_FXButton.rb +72 -0
  619. data/tests/TC_FXCheckButton.rb +57 -0
  620. data/tests/TC_FXComboBox.rb +36 -0
  621. data/tests/TC_FXDC.rb +372 -0
  622. data/tests/TC_FXDCPrint.rb +102 -0
  623. data/tests/TC_FXDCWindow.rb +23 -0
  624. data/tests/TC_FXDataTarget.rb +24 -0
  625. data/tests/TC_FXDirList.rb +30 -0
  626. data/tests/TC_FXFileAssoc.rb +62 -0
  627. data/tests/TC_FXFileStream.rb +90 -0
  628. data/tests/TC_FXFont.rb +59 -0
  629. data/tests/TC_FXFontDesc.rb +62 -0
  630. data/tests/TC_FXGLGroup.rb +32 -0
  631. data/tests/TC_FXGLShape.rb +28 -0
  632. data/tests/TC_FXGLViewer.rb +18 -0
  633. data/tests/TC_FXGradientBar.rb +89 -0
  634. data/tests/TC_FXHeader.rb +82 -0
  635. data/tests/TC_FXIconDict.rb +52 -0
  636. data/tests/TC_FXIconList.rb +192 -0
  637. data/tests/TC_FXId.rb +19 -0
  638. data/tests/TC_FXImage.rb +144 -0
  639. data/tests/TC_FXLight.rb +33 -0
  640. data/tests/TC_FXList.rb +116 -0
  641. data/tests/TC_FXListBox.rb +49 -0
  642. data/tests/TC_FXMat4f.rb +228 -0
  643. data/tests/TC_FXMaterial.rb +75 -0
  644. data/tests/TC_FXMemoryStream.rb +87 -0
  645. data/tests/TC_FXMenuCommand.rb +26 -0
  646. data/tests/TC_FXPoint.rb +57 -0
  647. data/tests/TC_FXQuatf.rb +77 -0
  648. data/tests/TC_FXRadioButton.rb +57 -0
  649. data/tests/TC_FXRangef.rb +48 -0
  650. data/tests/TC_FXRectangle.rb +88 -0
  651. data/tests/TC_FXRegion.rb +54 -0
  652. data/tests/TC_FXRegistry.rb +27 -0
  653. data/tests/TC_FXScrollArea.rb +28 -0
  654. data/tests/TC_FXScrollWindow.rb +28 -0
  655. data/tests/TC_FXSegment.rb +22 -0
  656. data/tests/TC_FXShell.rb +26 -0
  657. data/tests/TC_FXSize.rb +54 -0
  658. data/tests/TC_FXStream.rb +11 -0
  659. data/tests/TC_FXTable.rb +468 -0
  660. data/tests/TC_FXTableItem.rb +48 -0
  661. data/tests/TC_FXText.rb +81 -0
  662. data/tests/TC_FXTopWindow.rb +32 -0
  663. data/tests/TC_FXTreeList.rb +83 -0
  664. data/tests/TC_FXTreeListBox.rb +23 -0
  665. data/tests/TC_FXUndoList.rb +43 -0
  666. data/tests/TC_FXVec2d.rb +142 -0
  667. data/tests/TC_FXVec2f.rb +137 -0
  668. data/tests/TC_FXVec3d.rb +150 -0
  669. data/tests/TC_FXVec3f.rb +150 -0
  670. data/tests/TC_FXVec4f.rb +158 -0
  671. data/tests/TC_FXViewport.rb +30 -0
  672. data/tests/TC_Misc.rb +157 -0
  673. data/tests/TC_downcast.rb +15 -0
  674. data/tests/TS_All.rb +25 -0
  675. data/tests/blankpage.ps +166 -0
  676. data/tests/doit.rb +5 -0
  677. data/tests/howdypage.ps +181 -0
  678. data/tests/stress1.rb +94 -0
  679. data/tests/stress2.rb +51 -0
  680. data/tests/stress3.rb +117 -0
  681. data/tests/testcase.rb +38 -0
  682. data/web/art/fxrubylogo.png +0 -0
  683. data/web/art/fxrubylogo_small.png +0 -0
  684. data/web/art/line.gif +0 -0
  685. data/web/art/oul_grey.gif +0 -0
  686. data/web/art/our.gif +0 -0
  687. data/web/downloads.html +91 -0
  688. data/web/home.html +109 -0
  689. data/web/menu.html +50 -0
  690. data/web/styles.css +167 -0
  691. data/web/top.html +15 -0
  692. metadata +737 -0
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,281 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'fox12'
4
+ require 'fox12/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", nil, nil, DECOR_ALL, 0, 0, 800, 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, 0, 0, 0, 0, 0, 0, 0, 0)
19
+
20
+ # LEFT pane to contain the canvas
21
+ canvasFrame = FXVerticalFrame.new(contents,
22
+ FRAME_SUNKEN|LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT,
23
+ 0, 0, 0, 0, 10, 10, 10, 10)
24
+
25
+ # Label above the canvas
26
+ FXLabel.new(canvasFrame, "Canvas Frame", nil,
27
+ 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, nil, 0, (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, (FRAME_SUNKEN|LAYOUT_FILL_Y|
39
+ LAYOUT_TOP|LAYOUT_LEFT), 0, 0, 0, 0, 10, 10, 10, 10)
40
+
41
+ # Label above the buttons
42
+ FXLabel.new(buttonFrame, "Button Frame", nil,
43
+ JUSTIFY_CENTER_X|LAYOUT_FILL_X);
44
+
45
+ # Horizontal divider line
46
+ FXHorizontalSeparator.new(buttonFrame, SEPARATOR_RIDGE|LAYOUT_FILL_X)
47
+
48
+ FXLabel.new(buttonFrame, "&Background\nColor well", nil,
49
+ JUSTIFY_CENTER_X|LAYOUT_FILL_X)
50
+ @backwell = FXColorWell.new(buttonFrame, FXColor::White,
51
+ nil, 0, (LAYOUT_CENTER_X|LAYOUT_TOP|LAYOUT_LEFT|
52
+ LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT), 0, 0, 100, 30)
53
+ @backwell.connect(SEL_COMMAND, method(:onCmdWell))
54
+
55
+ FXLabel.new(buttonFrame, "B&order\nColor well", nil,
56
+ JUSTIFY_CENTER_X|LAYOUT_FILL_X)
57
+ @borderwell = FXColorWell.new(buttonFrame, FXColor::Black,
58
+ nil, 0, (LAYOUT_CENTER_X|LAYOUT_TOP|LAYOUT_LEFT|
59
+ LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT), 0, 0, 100, 30)
60
+ @borderwell.connect(SEL_COMMAND, method(:onCmdWell))
61
+
62
+ FXLabel.new(buttonFrame, "&Text\nColor well", nil,
63
+ JUSTIFY_CENTER_X|LAYOUT_FILL_X)
64
+ @textwell = FXColorWell.new(buttonFrame, FXColor::Black,
65
+ nil, 0, (LAYOUT_CENTER_X|LAYOUT_TOP|LAYOUT_LEFT|
66
+ LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT), 0, 0, 100, 30)
67
+ @textwell.connect(SEL_COMMAND, method(:onCmdWell))
68
+
69
+ # Button to draw
70
+ FXButton.new(buttonFrame, "&Colors...\tPop the color dialog", nil,
71
+ colordlg, FXWindow::ID_SHOW, (FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_X|
72
+ LAYOUT_TOP|LAYOUT_LEFT), 0, 0, 0, 0, 10, 10, 5, 5)
73
+
74
+ # Button to draw
75
+ saveBtn = FXButton.new(buttonFrame,
76
+ "Save Image...\tRead back image and save to file",
77
+ nil, nil, 0, (FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_X|
78
+ LAYOUT_TOP|LAYOUT_LEFT), 0, 0, 0, 0, 10, 10, 5, 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, (FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_X|
84
+ LAYOUT_TOP|LAYOUT_LEFT), 0, 0, 0, 0, 10, 10, 5, 5)
85
+
86
+ # Allocate the strings
87
+ sizeInBytes = 512*50*3
88
+ @grey_ramp = "\0" * sizeInBytes
89
+ @red_ramp = "\0" * sizeInBytes
90
+ @green_ramp = "\0" * sizeInBytes
91
+ @blue_ramp = "\0" * sizeInBytes
92
+
93
+ # Create images with dithering
94
+ @grey = FXImage.new(getApp(), @grey_ramp,
95
+ IMAGE_DITHER|IMAGE_SHMI|IMAGE_SHMP, 512, 50)
96
+ @red = FXImage.new(getApp(), @red_ramp,
97
+ IMAGE_DITHER|IMAGE_SHMI|IMAGE_SHMP, 512, 50)
98
+ @green = FXImage.new(getApp(), @green_ramp,
99
+ IMAGE_DITHER|IMAGE_SHMI|IMAGE_SHMP, 512, 50)
100
+ @blue = FXImage.new(getApp(), @blue_ramp,
101
+ IMAGE_DITHER|IMAGE_SHMI|IMAGE_SHMP, 512, 50)
102
+
103
+ # Create image with nearest color instead of dithering
104
+ @grey_nodither = FXImage.new(getApp(), @grey_ramp,
105
+ IMAGE_NEAREST|IMAGE_SHMI|IMAGE_SHMP, 512, 50)
106
+ @red_nodither = FXImage.new(getApp(), @red_ramp,
107
+ IMAGE_NEAREST|IMAGE_SHMI|IMAGE_SHMP, 512, 50)
108
+ @green_nodither = FXImage.new(getApp(), @green_ramp,
109
+ IMAGE_NEAREST|IMAGE_SHMI|IMAGE_SHMP, 512, 50)
110
+ @blue_nodither = FXImage.new(getApp(), @blue_ramp,
111
+ IMAGE_NEAREST|IMAGE_SHMI|IMAGE_SHMP, 512, 50)
112
+
113
+ # Result image
114
+ @picture = FXBMPImage.new(getApp(), nil, IMAGE_SHMI|IMAGE_SHMP, 850, 600)
115
+
116
+ # Fill up the color-ramp byte arrays (strings)
117
+ (0...512).each { |x|
118
+ (0...50).each { |y|
119
+ @grey.data[3*(y*512+x) ] = (x/2)
120
+ @grey.data[3*(y*512+x)+1] = (x/2)
121
+ @grey.data[3*(y*512+x)+2] = (x/2)
122
+ }
123
+ (0...50).each { |y|
124
+ @red.data[3*(y*512+x) ] = (x/2)
125
+ @red.data[3*(y*512+x)+1] = 0
126
+ @red.data[3*(y*512+x)+2] = 0
127
+ }
128
+ (0...50).each { |y|
129
+ @green.data[3*(y*512+x) ] = 0
130
+ @green.data[3*(y*512+x)+1] = (x/2)
131
+ @green.data[3*(y*512+x)+2] = 0
132
+ }
133
+ (0...50).each { |y|
134
+ @blue.data[3*(y*512+x) ] = 0
135
+ @blue.data[3*(y*512+x)+1] = 0
136
+ @blue.data[3*(y*512+x)+2] = (x/2)
137
+ }
138
+ }
139
+
140
+ # Make font
141
+ @font = FXFont.new(getApp(), "times", 36, FONTWEIGHT_BOLD)
142
+
143
+ # Make a tip
144
+ FXToolTip.new(getApp())
145
+ end
146
+
147
+ # Create and initialize
148
+ def create
149
+ # Create the windows
150
+ super
151
+
152
+ # Create images
153
+ @grey.create
154
+ @red.create
155
+ @green.create
156
+ @blue.create
157
+ @grey_nodither.create
158
+ @red_nodither.create
159
+ @green_nodither.create
160
+ @blue_nodither.create
161
+ @picture.create
162
+
163
+ # Create the font, too
164
+ @font.create
165
+
166
+ # Make the main window appear
167
+ show(PLACEMENT_SCREEN)
168
+
169
+ # Initial repaint
170
+ @canvas.update
171
+ end
172
+
173
+ def onCanvasRepaint(sender, sel, event)
174
+ if event.synthetic
175
+ dc = FXDCWindow.new(@picture)
176
+
177
+ # Erase the canvas, color comes from well
178
+ dc.foreground = @backwell.rgba
179
+
180
+ dc.fillRectangle(0, 0, @picture.width, @picture.height)
181
+
182
+ # Draw images
183
+ dc.drawImage(@grey, 10, 10)
184
+ dc.drawImage(@grey_nodither, 10, 60)
185
+ dc.drawImage(@red, 10, 130)
186
+ dc.drawImage(@red_nodither, 10, 180)
187
+ dc.drawImage(@green, 10, 250)
188
+ dc.drawImage(@green_nodither, 10, 300)
189
+ dc.drawImage(@blue, 10, 370)
190
+ dc.drawImage(@blue_nodither, 10, 420)
191
+
192
+ # Draw patterns
193
+ dc.fillStyle = FILL_OPAQUESTIPPLED
194
+ dc.foreground = FXColor::Black
195
+ dc.background = FXColor::White
196
+ (STIPPLE_0..STIPPLE_16).each { |pat|
197
+ dc.stipple = pat
198
+ dc.fillRectangle(10 + (512*pat)/17, 490, 31, 50)
199
+ }
200
+ dc.fillStyle = FILL_SOLID
201
+
202
+ # Draw borders
203
+ dc.foreground = @borderwell.rgba
204
+ dc.drawRectangle(10, 10, 512, 50)
205
+ dc.drawRectangle(10, 60, 512, 50)
206
+
207
+ dc.drawRectangle(10, 130, 512, 50)
208
+ dc.drawRectangle(10, 180, 512, 50)
209
+
210
+ dc.drawRectangle(10, 250, 512, 50)
211
+ dc.drawRectangle(10, 300, 512, 50)
212
+
213
+ dc.drawRectangle(10, 370, 512, 50)
214
+ dc.drawRectangle(10, 420, 512, 50)
215
+
216
+ dc.drawRectangle(10, 490, 512, 50)
217
+
218
+ # Draw text
219
+ dc.font = @font
220
+ dc.foreground = @textwell.rgba
221
+ dc.drawText(540, 60, "Grey")
222
+ dc.drawText(540, 180, "Red")
223
+ dc.drawText(540, 300, "Green")
224
+ dc.drawText(540, 420, "Blue")
225
+ dc.drawText(540, 540, "Patterns")
226
+
227
+ #
228
+ # Call end() to unlock the drawing surface and flush out
229
+ # the pending drawing commands.
230
+ #
231
+ dc.end
232
+ end
233
+
234
+ # Now repaint the screen
235
+ sdc = FXDCWindow.new(@canvas, event)
236
+
237
+ # Clear whole thing
238
+ sdc.foreground = @backwell.rgba
239
+ sdc.fillRectangle(0, 0, @canvas.width, @canvas.height)
240
+
241
+ # Paint image
242
+ sdc.drawImage(@picture, 0, 0)
243
+
244
+ #
245
+ # Call end() to unlock the drawing surface and flush out
246
+ # the pending drawing commands.
247
+ #
248
+ sdc.end
249
+ end
250
+
251
+ # Color well got changed
252
+ def onCmdWell(sender, sel, ptr)
253
+ @canvas.update
254
+ end
255
+
256
+ # Restore image from offscreen pixmap
257
+ def onCmdRestore(sender, sel, ptr)
258
+ saveDialog = FXFileDialog.new(self, "Save as BMP")
259
+ if saveDialog.execute != 0
260
+ FXFileStream.open(saveDialog.filename, FXStreamSave) do |outfile|
261
+ @picture.restore
262
+ @picture.savePixels(outfile)
263
+ end
264
+ end
265
+ return 1
266
+ end
267
+ end
268
+
269
+ if __FILE__ == $0
270
+ # Make application
271
+ application = FXApp.new("Image", "FoxTest")
272
+
273
+ # Make the main window
274
+ ImageWindow.new(application)
275
+
276
+ # Create the application window and resources
277
+ application.create
278
+
279
+ # Run the application
280
+ application.run
281
+ end
@@ -0,0 +1,513 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'fox12'
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", nil, nil, DECOR_ALL,
14
+ 0, 0, 850, 600, 0, 0)
15
+
16
+ # Recently used files list
17
+ @mrufiles = FXRecentFiles.new
18
+
19
+ # Make some icons
20
+ fileopenicon = getIcon("fileopen.png")
21
+ filesaveicon = getIcon("filesave.png")
22
+ cuticon = getIcon("cut.png")
23
+ copyicon = getIcon("copy.png")
24
+ pasteicon = getIcon("paste.png")
25
+ uplevelicon = getIcon("tbuplevel.png")
26
+ paletteicon = getIcon("colorpal.png")
27
+
28
+ # Make color dialog
29
+ colordlg = FXColorDialog.new(self, "Color Dialog")
30
+
31
+ # Make menu bar
32
+ dragshell1 = FXToolBarShell.new(self, 0)
33
+ menubar = FXMenuBar.new(self, LAYOUT_SIDE_TOP|LAYOUT_FILL_X|FRAME_RAISED)
34
+ FXToolBarGrip.new(menubar, menubar, FXMenuBar::ID_TOOLBARGRIP,
35
+ TOOLBARGRIP_DOUBLE)
36
+
37
+ # Tool bar
38
+ dragshell2 = FXToolBarShell.new(self, 0)
39
+ toolbar = FXToolBar.new(self, dragshell2, (LAYOUT_SIDE_TOP|
40
+ PACK_UNIFORM_WIDTH|PACK_UNIFORM_HEIGHT|FRAME_RAISED|LAYOUT_FILL_X))
41
+ FXToolBarGrip.new(toolbar, toolbar, FXToolBar::ID_TOOLBARGRIP,
42
+ TOOLBARGRIP_DOUBLE)
43
+
44
+ # Status bar
45
+ statusbar = FXStatusBar.new(self,
46
+ LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|STATUSBAR_WITH_DRAGCORNER)
47
+
48
+ # File menu
49
+ filemenu = FXMenuPane.new(self)
50
+ FXMenuTitle.new(menubar, "&File", nil, filemenu)
51
+
52
+ # Edit Menu
53
+ editmenu = FXMenuPane.new(self)
54
+ FXMenuTitle.new(menubar, "&Edit", nil, editmenu)
55
+
56
+ # Manipulation Menu
57
+ manipmenu = FXMenuPane.new(self)
58
+ FXMenuTitle.new(menubar,"&Manipulation", nil, manipmenu)
59
+
60
+ # View menu
61
+ viewmenu = FXMenuPane.new(self)
62
+ FXMenuTitle.new(menubar, "&View", nil, viewmenu)
63
+
64
+ # Help menu
65
+ helpmenu = FXMenuPane.new(self)
66
+ FXMenuTitle.new(menubar, "&Help", nil, helpmenu, LAYOUT_RIGHT)
67
+
68
+ # Splitter
69
+ splitter = FXSplitter.new(self, (LAYOUT_SIDE_TOP|LAYOUT_FILL_X|
70
+ LAYOUT_FILL_Y| SPLITTER_TRACKING|SPLITTER_VERTICAL|SPLITTER_REVERSED))
71
+
72
+ # Sunken border for image widget
73
+ imagebox = FXHorizontalFrame.new(splitter,
74
+ FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y,
75
+ 0, 0, 0, 0, 0, 0, 0, 0)
76
+
77
+ # Make image widget
78
+ @imageview = FXImageView.new(imagebox, nil, nil, 0,
79
+ LAYOUT_FILL_X|LAYOUT_FILL_Y)
80
+
81
+ # Sunken border for file list
82
+ @filebox = FXHorizontalFrame.new(splitter, LAYOUT_FILL_X|LAYOUT_FILL_Y,
83
+ 0, 0, 0, 0, 0, 0, 0, 0)
84
+
85
+ # Make file list
86
+ fileframe = FXHorizontalFrame.new(@filebox,
87
+ FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y,
88
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
89
+ @filelist = FXFileList.new(fileframe, nil, 0,
90
+ LAYOUT_FILL_X|LAYOUT_FILL_Y|ICONLIST_MINI_ICONS|ICONLIST_AUTOSIZE)
91
+ @filelist.connect(SEL_DOUBLECLICKED, method(:onCmdFileList))
92
+ FXButton.new(@filebox, "\tUp one level\tGo up to higher directory.",
93
+ uplevelicon, @filelist, FXFileList::ID_DIRECTORY_UP,
94
+ BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_FILL_Y)
95
+
96
+ # Toobar buttons: File manipulation
97
+ openBtn = FXButton.new(toolbar, "&Open\tOpen Image\tOpen image file.", fileopenicon,
98
+ nil, 0, ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED)
99
+ openBtn.connect(SEL_COMMAND, method(:onCmdOpen))
100
+ saveBtn = FXButton.new(toolbar, "&Save\tSave Image\tSave image file.", filesaveicon,
101
+ nil, 0, ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED)
102
+ saveBtn.connect(SEL_COMMAND, method(:onCmdSave))
103
+
104
+ # Toobar buttons: Editing
105
+ FXButton.new(toolbar, "Cut\tCut", cuticon, nil, 0,
106
+ ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED)
107
+ FXButton.new(toolbar, "Copy\tCopy", copyicon, nil, 0,
108
+ ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED)
109
+ FXButton.new(toolbar, "Paste\tPaste", pasteicon, nil, 0,
110
+ ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED)
111
+
112
+ # Color
113
+ FXButton.new(toolbar, "&Colors\tColors\tDisplay color dialog.", paletteicon,
114
+ colordlg, FXWindow::ID_SHOW,
115
+ ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_RIGHT)
116
+
117
+ # File Menu entries
118
+ FXMenuCommand.new(filemenu, "&Open...\tCtl-O\tOpen image file.", fileopenicon).connect(SEL_COMMAND, method(:onCmdOpen))
119
+ FXMenuCommand.new(filemenu, "&Save...\tCtl-S\tSave image file.", filesaveicon).connect(SEL_COMMAND, method(:onCmdSave))
120
+ FXMenuCommand.new(filemenu, "Dump", nil, getApp(), FXApp::ID_DUMP)
121
+
122
+ # Recent file menu; this automatically hides if there are no files
123
+ sep1 = FXMenuSeparator.new(filemenu)
124
+ sep1.target = @mrufiles
125
+ sep1.selector = FXRecentFiles::ID_ANYFILES
126
+ FXMenuCommand.new(filemenu, nil, nil, @mrufiles, FXRecentFiles::ID_FILE_1)
127
+ FXMenuCommand.new(filemenu, nil, nil, @mrufiles, FXRecentFiles::ID_FILE_2)
128
+ FXMenuCommand.new(filemenu, nil, nil, @mrufiles, FXRecentFiles::ID_FILE_3)
129
+ FXMenuCommand.new(filemenu, nil, nil, @mrufiles, FXRecentFiles::ID_FILE_4)
130
+ FXMenuCommand.new(filemenu, nil, nil, @mrufiles, FXRecentFiles::ID_FILE_5)
131
+ FXMenuCommand.new(filemenu, nil, nil, @mrufiles, FXRecentFiles::ID_FILE_6)
132
+ FXMenuCommand.new(filemenu, nil, nil, @mrufiles, FXRecentFiles::ID_FILE_7)
133
+ FXMenuCommand.new(filemenu, nil, nil, @mrufiles, FXRecentFiles::ID_FILE_8)
134
+ FXMenuCommand.new(filemenu, nil, nil, @mrufiles, FXRecentFiles::ID_FILE_9)
135
+ FXMenuCommand.new(filemenu, nil, nil, @mrufiles, FXRecentFiles::ID_FILE_10)
136
+ FXMenuCommand.new(filemenu, "&Clear Recent Files", nil,
137
+ @mrufiles, FXRecentFiles::ID_CLEAR)
138
+ sep2 = FXMenuSeparator.new(filemenu)
139
+ sep2.target = @mrufiles
140
+ sep2.selector = FXRecentFiles::ID_ANYFILES
141
+ FXMenuCommand.new(filemenu, "&Quit\tCtl-Q").connect(SEL_COMMAND, method(:onCmdQuit))
142
+
143
+ # Edit Menu entries
144
+ FXMenuCommand.new(editmenu, "&Undo\tCtl-Z\tUndo last change.")
145
+ FXMenuCommand.new(editmenu, "&Redo\tCtl-R\tRedo last undo.")
146
+ FXMenuCommand.new(editmenu, "&Copy\tCtl-C\tCopy selection to clipboard.",
147
+ copyicon, nil, 0)
148
+ FXMenuCommand.new(editmenu, "C&ut\tCtl-X\tCut selection to clipboard.",
149
+ cuticon, nil, 0)
150
+ FXMenuCommand.new(editmenu, "&Paste\tCtl-V\tPaste from clipboard.",
151
+ pasteicon, nil, 0)
152
+ FXMenuCommand.new(editmenu, "&Delete\t\tDelete selection.", nil, nil, 0)
153
+
154
+ # Manipulation Menu entries
155
+ rotate90Cmd = FXMenuCommand.new(manipmenu, "Rotate 90\t\tRotate 90 degrees.")
156
+ rotate90Cmd.connect(SEL_COMMAND) { @imageview.image.rotate(90) }
157
+ rotate90Cmd.connect(SEL_UPDATE, method(:onUpdImage))
158
+
159
+ rotate180Cmd = FXMenuCommand.new(manipmenu, "Rotate 180\t\tRotate 180 degrees.")
160
+ rotate180Cmd.connect(SEL_COMMAND) { @imageview.image.rotate(180) }
161
+ rotate180Cmd.connect(SEL_UPDATE, method(:onUpdImage))
162
+
163
+ rotate270Cmd = FXMenuCommand.new(manipmenu, "Rotate -90\t\tRotate -90 degrees.")
164
+ rotate270Cmd.connect(SEL_COMMAND) { @imageview.image.rotate(270) }
165
+ rotate270Cmd.connect(SEL_UPDATE, method(:onUpdImage))
166
+
167
+ mirrorHorCmd = FXMenuCommand.new(manipmenu, "Mirror Hor.\t\tMirror Horizontally.")
168
+ mirrorHorCmd.connect(SEL_COMMAND) { @imageview.image.mirror(true, false) }
169
+ mirrorHorCmd.connect(SEL_UPDATE, method(:onUpdImage))
170
+
171
+ mirrorVerCmd = FXMenuCommand.new(manipmenu, "Mirror Ver.\t\tMirror Vertically.")
172
+ mirrorVerCmd.connect(SEL_COMMAND) { @imageview.image.mirror(false, true) }
173
+ mirrorVerCmd.connect(SEL_UPDATE, method(:onUpdImage))
174
+
175
+ scaleCmd = FXMenuCommand.new(manipmenu, "Scale...\t\tScale image.")
176
+ scaleCmd.connect(SEL_COMMAND, method(:onCmdScale))
177
+ scaleCmd.connect(SEL_UPDATE, method(:onUpdImage))
178
+
179
+ cropCmd = FXMenuCommand.new(manipmenu, "Crop...\t\tCrop image.")
180
+ cropCmd.connect(SEL_COMMAND, method(:onCmdCrop))
181
+ cropCmd.connect(SEL_UPDATE, method(:onUpdImage))
182
+
183
+ # View Menu entries
184
+ FXMenuCheck.new(viewmenu, "File list\t\tDisplay file list.",
185
+ @filebox, FXWindow::ID_TOGGLESHOWN)
186
+ FXMenuCheck.new(viewmenu,
187
+ "Show hidden files\t\tShow hidden files and directories.",
188
+ @filelist, FXFileList::ID_TOGGLE_HIDDEN)
189
+ FXMenuSeparator.new(viewmenu)
190
+ FXMenuRadio.new(viewmenu,
191
+ "Show small icons\t\tDisplay directory with small icons.",
192
+ @filelist, FXFileList::ID_SHOW_MINI_ICONS)
193
+ FXMenuRadio.new(viewmenu,
194
+ "Show big icons\t\tDisplay directory with big icons.",
195
+ @filelist, FXFileList::ID_SHOW_BIG_ICONS)
196
+ FXMenuRadio.new(viewmenu,
197
+ "Show details view\t\tDisplay detailed directory listing.",
198
+ @filelist, FXFileList::ID_SHOW_DETAILS)
199
+ FXMenuSeparator.new(viewmenu)
200
+ FXMenuRadio.new(viewmenu, "Rows of icons\t\tView row-wise.",
201
+ @filelist, FXFileList::ID_ARRANGE_BY_ROWS)
202
+ FXMenuRadio.new(viewmenu, "Columns of icons\t\tView column-wise.",
203
+ @filelist,FXFileList::ID_ARRANGE_BY_COLUMNS)
204
+ FXMenuSeparator.new(viewmenu)
205
+ FXMenuCheck.new(viewmenu, "Toolbar\t\tDisplay toolbar.",
206
+ toolbar, FXWindow::ID_TOGGLESHOWN)
207
+ FXMenuRadio.new(viewmenu, "Float toolbar\t\tUndock the toolbar.",
208
+ toolbar, FXToolBar::ID_UNDOCK)
209
+ FXMenuRadio.new(viewmenu,
210
+ "Dock toolbar top\t\tDock the toolbar on the top.",
211
+ toolbar, FXToolBar::ID_DOCK_TOP)
212
+ FXMenuRadio.new(viewmenu,
213
+ "Dock toolbar left\t\tDock the toolbar on the left.",
214
+ toolbar, FXToolBar::ID_DOCK_LEFT)
215
+ FXMenuRadio.new(viewmenu,
216
+ "Dock toolbar right\t\tDock the toolbar on the right.",
217
+ toolbar, FXToolBar::ID_DOCK_RIGHT)
218
+ FXMenuRadio.new(viewmenu,
219
+ "Dock toolbar bottom\t\tDock the toolbar on the bottom.",
220
+ toolbar, FXToolBar::ID_DOCK_BOTTOM)
221
+ FXMenuSeparator.new(viewmenu)
222
+ FXMenuCheck.new(viewmenu, "Status line\t\tDisplay status line.",
223
+ statusbar, FXWindow::ID_TOGGLESHOWN)
224
+
225
+ # Help Menu entries
226
+ FXMenuCommand.new(helpmenu, "&About FOX...").connect(SEL_COMMAND) {
227
+ FXMessageBox.new(self, "About Image Viewer",
228
+ "Image Viewer demonstrates the FOX ImageView widget.\n\n" +
229
+ "Using the FOX C++ GUI Library (http://www.fox-toolkit.org)\n\n" +
230
+ "Copyright (C) 2000 Jeroen van der Zijp (jeroen@fox-toolkit.org)", nil,
231
+ MBOX_OK|DECOR_TITLE|DECOR_BORDER).execute
232
+ }
233
+
234
+ # Make a tool tip
235
+ FXToolTip.new(getApp(), TOOLTIP_NORMAL)
236
+
237
+ # Recent files
238
+ @mrufiles.connect(SEL_COMMAND) do |sender, sel, filename|
239
+ @filename = filename
240
+ @filelist.currentFile = @filename
241
+ loadImage(@filename)
242
+ end
243
+
244
+ # Initialize file name and pattern for file dialog
245
+ @filename = "untitled"
246
+ @preferredFileFilter = 0
247
+ end
248
+
249
+ # Convenience function to construct a PNG icon
250
+ def getIcon(filename)
251
+ begin
252
+ filename = File.join("icons", filename)
253
+ icon = nil
254
+ File.open(filename, "rb") { |f|
255
+ icon = FXPNGIcon.new(getApp(), f.read)
256
+ }
257
+ icon
258
+ rescue
259
+ raise RuntimeError, "Couldn't load icon: #{filename}"
260
+ end
261
+ end
262
+
263
+ def hasExtension(filename, ext)
264
+ File.basename(filename, ext) != File.basename(filename)
265
+ end
266
+
267
+ # Load the named image file
268
+ def loadImage(file)
269
+ img = nil
270
+ if hasExtension(file, ".gif")
271
+ img = FXGIFImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
272
+ elsif hasExtension(file, ".bmp")
273
+ img = FXBMPImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
274
+ elsif hasExtension(file, ".xpm")
275
+ img = FXXPMImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
276
+ elsif hasExtension(file, ".png")
277
+ img = FXPNGImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
278
+ elsif hasExtension(file, ".jpg")
279
+ img = FXJPGImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
280
+ elsif hasExtension(file, ".pcx")
281
+ img = FXPCXImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
282
+ elsif hasExtension(file, ".tif")
283
+ img = FXTIFImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
284
+ elsif hasExtension(file, ".tga")
285
+ img = FXTGAImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
286
+ elsif hasExtension(file, ".ico")
287
+ img = FXICOImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
288
+ end
289
+
290
+ # Perhaps failed?
291
+ if !img
292
+ FXMessageBox.error(self, MBOX_OK, "Error loading image",
293
+ "Unsupported image type: #{file}")
294
+ return
295
+ end
296
+
297
+ # Load it...
298
+ getApp().beginWaitCursor do
299
+ FXFileStream.open(file, FXStreamLoad) { |stream| img.loadPixels(stream) }
300
+ img.create
301
+ @imageview.image = img
302
+ end
303
+ end
304
+
305
+ # Save image to named file
306
+ def saveImage(file)
307
+ getApp().beginWaitCursor do
308
+ FXFileStream.open(file, FXStreamSave) { |stream| @imageview.image.savePixels(stream) }
309
+ end
310
+ end
311
+
312
+ # Open a new file
313
+ def onCmdOpen(sender, sel, ptr)
314
+ openDialog = FXFileDialog.new(self, "Open Image")
315
+ openDialog.filename = @filename
316
+ patterns = ["All Files (*)",
317
+ "GIF Image (*.gif)",
318
+ "BMP Image (*.bmp)",
319
+ "XPM Image (*.xpm)",
320
+ "PCX Image (*.pcx)",
321
+ "ICO Image (*.ico)",
322
+ "PNG Image (*.png)",
323
+ "JPEG Image (*.jpg)",
324
+ "TIFF Image (*.tif)",
325
+ "TARGA Image (*.tga)"
326
+ ]
327
+ openDialog.patternList = patterns
328
+ openDialog.currentPattern = @preferredFileFilter
329
+ if openDialog.execute != 0
330
+ @preferredFileFilter = openDialog.currentPattern
331
+ @filename = openDialog.filename
332
+ @filelist.currentFile = @filename
333
+ @mrufiles.appendFile(@filename)
334
+ loadImage(@filename)
335
+ end
336
+ return 1
337
+ end
338
+
339
+ # Save this file
340
+ def onCmdSave(sender, sel, ptr)
341
+ saveDialog = FXFileDialog.new(self, "Save Image")
342
+ if saveDialog.execute != 0
343
+ if File.exists? saveDialog.filename
344
+ if MBOX_CLICKED_NO == FXMessageBox.question(self, MBOX_YES_NO,
345
+ "Overwrite Image", "Overwrite existing image?")
346
+ return 1
347
+ end
348
+ end
349
+ @filename = saveDialog.filename
350
+ @filelist.currentFile = @filename
351
+ @mrufiles.appendFile(@filename)
352
+ saveImage(@filename)
353
+ end
354
+ return 1
355
+ end
356
+
357
+ # Quit the application
358
+ def onCmdQuit(sender, sel, ptr)
359
+ # Write new window size back to registry
360
+ getApp().reg().writeIntEntry("SETTINGS", "x", x)
361
+ getApp().reg().writeIntEntry("SETTINGS", "y", y)
362
+ getApp().reg().writeIntEntry("SETTINGS", "width", width)
363
+ getApp().reg().writeIntEntry("SETTINGS", "height", height)
364
+
365
+ # Height of file list
366
+ getApp().reg().writeIntEntry("SETTINGS", "fileheight", @filebox.height)
367
+
368
+ # Was file box shown?
369
+ getApp().reg().writeBoolEntry("SETTINGS", "filesshown", @filebox.shown)
370
+
371
+ # Current directory
372
+ getApp().reg().writeStringEntry("SETTINGS", "directory", @filelist.directory)
373
+
374
+ # Quit
375
+ getApp().exit(0)
376
+ end
377
+
378
+ # Command message from the file list
379
+ def onCmdFileList(sender, sel, index)
380
+ if index >= 0
381
+ if @filelist.isItemDirectory(index)
382
+ @filelist.directory = @filelist.getItemPathname(index)
383
+ elsif @filelist.isItemFile(index)
384
+ @filename = @filelist.getItemPathname(index)
385
+ @mrufiles.appendFile(@filename)
386
+ loadImage(@filename)
387
+ end
388
+ end
389
+ return 1
390
+ end
391
+
392
+ # Scale
393
+ def onCmdScale(sender, sel, ptr)
394
+ image = @imageview.image
395
+ sx = FXDataTarget.new(image.width)
396
+ sy = FXDataTarget.new(image.height)
397
+ scalepanel = FXDialogBox.new(self, "Scale Image To Size")
398
+ frame = FXHorizontalFrame.new(scalepanel,
399
+ LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y)
400
+ FXLabel.new(frame, "W:", nil, LAYOUT_CENTER_Y)
401
+ FXTextField.new(frame, 5, sx, FXDataTarget::ID_VALUE,
402
+ LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK|JUSTIFY_RIGHT)
403
+ FXLabel.new(frame, "H:", nil, LAYOUT_CENTER_Y)
404
+ FXTextField.new(frame, 5, sy, FXDataTarget::ID_VALUE,
405
+ LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK|JUSTIFY_RIGHT)
406
+ FXButton.new(frame, "Cancel", nil, scalepanel, FXDialogBox::ID_CANCEL,
407
+ LAYOUT_CENTER_Y|FRAME_RAISED|FRAME_THICK, 0, 0, 0, 0, 20, 20, 4, 4)
408
+ FXButton.new(frame, "OK", nil, scalepanel, FXDialogBox::ID_ACCEPT,
409
+ LAYOUT_CENTER_Y|FRAME_RAISED|FRAME_THICK, 0, 0, 0, 0, 30, 30, 4, 4)
410
+ return 1 if (scalepanel.execute == 0)
411
+ return 1 if (sx.value < 1 || sy.value < 1)
412
+ image.scale(sx.value, sy.value)
413
+ @imageview.image = image
414
+ end
415
+
416
+ # Crop
417
+ def onCmdCrop(sender, sel, ptr)
418
+ image = @imageview.image
419
+ cx = FXDataTarget.new(0)
420
+ cy = FXDataTarget.new(0)
421
+ cw = FXDataTarget.new(image.width)
422
+ ch = FXDataTarget.new(image.height)
423
+ croppanel = FXDialogBox.new(self, "Crop image")
424
+ frame = FXHorizontalFrame.new(croppanel,
425
+ LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y)
426
+ FXLabel.new(frame, "X:", nil, LAYOUT_CENTER_Y)
427
+ FXTextField.new(frame, 5, cx, FXDataTarget::ID_VALUE,
428
+ LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK|JUSTIFY_RIGHT)
429
+ FXLabel.new(frame, "Y:", nil, LAYOUT_CENTER_Y)
430
+ FXTextField.new(frame, 5, cy, FXDataTarget::ID_VALUE,
431
+ LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK|JUSTIFY_RIGHT)
432
+ FXLabel.new(frame, "W:", nil, LAYOUT_CENTER_Y)
433
+ FXTextField.new(frame, 5, cw, FXDataTarget::ID_VALUE,
434
+ LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK|JUSTIFY_RIGHT)
435
+ FXLabel.new(frame, "H:", nil, LAYOUT_CENTER_Y)
436
+ FXTextField.new(frame, 5, ch, FXDataTarget::ID_VALUE,
437
+ LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK|JUSTIFY_RIGHT)
438
+ FXButton.new(frame, "Cancel", nil, croppanel, FXDialogBox::ID_CANCEL,
439
+ LAYOUT_CENTER_Y|FRAME_RAISED|FRAME_THICK, 0, 0, 0, 0, 20, 20, 4, 4)
440
+ FXButton.new(frame, "OK", nil, croppanel, FXDialogBox::ID_ACCEPT,
441
+ LAYOUT_CENTER_Y|FRAME_RAISED|FRAME_THICK, 0, 0, 0, 0, 30, 30, 4, 4)
442
+ return 1 if (croppanel.execute == 0)
443
+ return 1 if (cx.value < 0 || cy.value < 0 ||
444
+ cx.value+cw.value > image.width ||
445
+ cy.value+ch.value > image.height)
446
+ image.crop(cx.value, cy.value, cw.value, ch.value)
447
+ @imageview.image = image
448
+ end
449
+
450
+ # Update image
451
+ def onUpdImage(sender, sel, ptr)
452
+ if @imageview.image
453
+ sender.handle(self, FXSEL(SEL_COMMAND, FXWindow::ID_ENABLE), nil)
454
+ else
455
+ sender.handle(self, FXSEL(SEL_COMMAND, FXWindow::ID_DISABLE), nil)
456
+ end
457
+ end
458
+
459
+ # Create and show window
460
+ def create
461
+ # Get size, etc. from registry
462
+ xx = getApp().reg().readIntEntry("SETTINGS", "x", 0)
463
+ yy = getApp().reg().readIntEntry("SETTINGS", "y", 0)
464
+ ww = getApp().reg().readIntEntry("SETTINGS", "width", 850)
465
+ hh = getApp().reg().readIntEntry("SETTINGS", "height", 600)
466
+
467
+ fh = getApp().reg().readIntEntry("SETTINGS", "fileheight", 100)
468
+ fs = getApp().reg().readBoolEntry("SETTINGS", "filesshown", true)
469
+
470
+ dir = getApp().reg().readStringEntry("SETTINGS", "directory", "~")
471
+
472
+ # Starting directory for the files list
473
+ @filelist.directory = dir
474
+
475
+ # Height of files list
476
+ @filebox.height = fh
477
+
478
+ # Is it visible right now?
479
+ if !fs
480
+ @filebox.hide
481
+ end
482
+
483
+ # Reposition window to specified x, y, w and h
484
+ position(xx, yy, ww, hh)
485
+
486
+ # Create and show
487
+ super # i.e. FXMainWindow::create()
488
+ show(PLACEMENT_SCREEN)
489
+ end
490
+ end
491
+
492
+ if __FILE__ == $0
493
+ # Make application
494
+ application = FXApp.new("ImageViewer", "FoxTest")
495
+
496
+ # Make window
497
+ window = ImageWindow.new(application)
498
+
499
+ # Handle interrupts to terminate program gracefully
500
+ application.addSignal("SIGINT", window.method(:onCmdQuit))
501
+
502
+ # Create it
503
+ application.create
504
+
505
+ # Passed image file?
506
+ if ARGV.length > 0
507
+ window.loadImage(ARGV[0])
508
+ end
509
+
510
+ # Run
511
+ application.run
512
+ end
513
+