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
data/doc/build.html ADDED
@@ -0,0 +1,132 @@
1
+ <html><head>
2
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3
+ <title>Chapter&nbsp;1.&nbsp;Building from Source Code</title><link rel="stylesheet" href="style.css" type="text/css"><meta name="generator" content="DocBook v5 XSL Stylesheets V1.72.0"><link rel="start" href="book.html" title="Developing Graphical User Interfaces with FXRuby"><link rel="up" href="pt01.html" title="Part&nbsp;I.&nbsp;The Basics"><link rel="prev" href="goals.html" title="History and Goals"><link rel="next" href="gems.html" title="Chapter&nbsp;2.&nbsp;Installing from Gems"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter&nbsp;1.&nbsp;Building from Source Code</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="goals.html">Prev</a>&nbsp;</td><th width="60%" align="center">Part&nbsp;I.&nbsp;The Basics</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="gems.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="build"></a>Chapter&nbsp;1.&nbsp;Building from Source Code</h2></div></div></div><p>This chapter provides instructions for building and installing FXRuby
4
+ directly from source, and not using some more direct means (such as
5
+ installing a gem, or via some package manager).</p><div class="itemizedlist"><ul type="disc"><li><p>If you're planning to use FXRuby on Windows, with the standard
6
+ <a xmlns:xlink="http://www.w3.org/1999/xlink" href="http://rubyinstaller.rubyforge.org" target="_top">Ruby Installer for
7
+ Windows</a>, you may wish to just download the pre-compiled binaries
8
+ from the <a xmlns:xlink="http://www.w3.org/1999/xlink" href="http://rubyforge.org/projects/fxruby" target="_top">RubyForge
9
+ project page</a> for FXRuby.</p></li><li><p>If you're already using the <a xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.macports.org/" target="_top">MacPorts</a> version of ruby, you may
10
+ wish to just install the <code class="filename">rb-fxruby</code> port.</p></li></ul></div><div class="simplesect" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e109"></a>Building From Source on Unix/Linux</h2></div></div></div><p>These instructions assume that you've already downloaded, compiled
11
+ and installed FOX. Next, you'll need to download the FXRuby source code
12
+ tarball and unpack it by typing:</p><pre class="screen">$ <span><strong class="command">tar xzf FXRuby-1.6.13.tar.gz</strong></span></pre><p>This will create a new directory called <code class="filename">FXRuby-1.6.13</code>. Change to the top-level
13
+ directory and configure the build by typing:</p><pre class="screen">$ <span><strong class="command">ruby install.rb config</strong></span></pre><p>By default, the <code class="filename">install.rb</code> script will look for
14
+ the FOX include files and library in the standard <code class="filename">/usr/local/include/fox-1.6</code> and <code class="filename">/usr/local/lib</code> directories, respectively. You
15
+ can override these locations by passing a few additional arguments to
16
+ <code class="filename">install.rb</code> during this step, e.g.</p><pre class="screen">$ <span><strong class="command">ruby install.rb config -- \
17
+ --with-fox-include=/home/lyle/fox-1.6.32/include \
18
+ --with-fox-lib=/home/lyle/fox-1.6.32/src/.libs</strong></span></pre><p>Once the build has been configured, you can start the build by
19
+ typing:</p><pre class="screen">$ <span><strong class="command">ruby install.rb setup</strong></span></pre><p>It will take quite awhile to build FXRuby, even on a fast machine,
20
+ so this might be a good time to take a coffee break. If you run into
21
+ problems during the compilation, please check the <a href="build.html#tragedies" title="Things That Can Go Wrong">list of things that can go wrong</a> for
22
+ workarounds for those problems.</p><p>Once it's finished compiling, install FXRuby by typing:</p><pre class="screen">$ <span><strong class="command">ruby install.rb install</strong></span></pre><p>As a quick sanity check, to make sure that all is well, you should
23
+ probably fire up <code class="filename">irb</code> and try to import FXRuby:</p><pre class="screen">$ <span><strong class="command">irb</strong></span>
24
+ irb(main):001:0&gt; <strong class="userinput"><code>require 'fox16'</code></strong>
25
+ true
26
+ irb(main):002:0&gt;</pre><p>If the import failed (usually with a message along the lines of
27
+ "Cannot load library"), check the <a href="build.html#tragedies" title="Things That Can Go Wrong">list of things
28
+ that can go wrong</a> for known problems. If that still doesn't solve
29
+ your problem, drop me an e-mail or ask around on the Ruby newsgroup or
30
+ mailing list; it's quite likely that someone else has run into this
31
+ problem too. Once you do have a working FXRuby installation, you're ready
32
+ to check out the example programs.</p></div><div class="simplesect" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e180"></a>Building From Source on Windows (Using Visual C++)</h2></div></div></div><p>This section describes how to compile FXRuby using Microsoft Visual
33
+ C++, for use with a Ruby that was also compiled using Visual C++.</p><p>This discussion assumes that you've built Ruby using the
34
+ instructions and build files distributed with the standard Ruby source
35
+ code. To review, you should have started by unpacking the source code
36
+ tarball, changing into the top-level source code directory (e.g. <code class="filename">C:\ruby-1.8.6</code>) and then typing:</p><pre class="screen">C:\ruby-1.8.6&gt;<span><strong class="command">win32\configure</strong></span>
37
+ type 'nmake' to make ruby for mswin32.
38
+ C:\ruby-1.8.6&gt;<span><strong class="command">nmake</strong></span></pre><p>After the compilation finished, you installed Ruby somewhere by
39
+ typing, e.g.,</p><pre class="screen">C:\ruby-1.8.6&gt;<span><strong class="command">nmake DESTDIR=C:\ruby install</strong></span></pre><p>Similarly, I'm assuming that you built the FOX library using the
40
+ Developer Studio project files distributed with the standard FOX source
41
+ code distribution.</p><p>Now you can configure the FXRuby build by typing:</p><pre class="screen">C:\FXRuby-1.6.13&gt;<span><strong class="command">ruby install.rb config --make-prog=nmake -- \
42
+ --with-fox-include=C:\fox-1.6.32\include \
43
+ --with-fox-lib=C:\fox-1.6.32\lib</strong></span></pre><p>Once the build has been configured, you can start the build by
44
+ typing:</p><pre class="screen">C:\FXRuby-1.6.13&gt; <span><strong class="command">ruby install.rb setup</strong></span></pre><p>It will take quite awhile to build FXRuby, even on a fast machine,
45
+ so this might be a good time to take a coffee break. Because Visual C++ is
46
+ such a strict compiler (usually a good thing), you will probably run into
47
+ a few problems with non-ANSI declarations in the Ruby header files. If you
48
+ do run into problems during the compilation, just check the next section
49
+ for a list of things that could go wrong, and workarounds for those
50
+ problems. None of them are showstoppers and none require you to restart
51
+ the compile from scratch (just type <span><strong class="command">ruby install.rb
52
+ setup</strong></span> to pick up where you left off).</p><p>Once it's finished compiling, install FXRuby by typing:</p><pre class="screen">C:\FXRuby-1.6.13&gt; <span><strong class="command">ruby install.rb install</strong></span></pre><p>As a quick sanity check, to make sure that all is well, you should
53
+ probably fire up <code class="filename">irb</code> and try to import FXRuby:</p><pre class="screen">C:\FXRuby-1.6.13&gt; <span><strong class="command">irb</strong></span>
54
+ irb(main):001:0&gt; <strong class="userinput"><code>require 'fox16'</code></strong>
55
+ true
56
+ irb(main):002:0&gt;</pre><p>If the import failed (usually with a message along the lines of
57
+ "Cannot load library"), check the list of things that can go wrong for
58
+ known problems. If that still doesn't solve your problem, drop me an
59
+ e-mail or ask around on the Ruby newsgroup or mailing list; it's quite
60
+ likely that someone else has run into this problem too. Once you do have a
61
+ working FXRuby installation, you're ready to check out the example
62
+ programs.</p></div><div class="simplesect" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="tragedies"></a>Things That Can Go Wrong</h2></div></div></div><p><span class="emphasis"><em>"Too many arguments to function..."</em></span></p><p>The include files for Ruby versions 1.6.7 and earlier still have
63
+ several function prototypes in the older "K &amp; R" C style, where the
64
+ function's argument list is not included; for example, the function
65
+ <code class="function">rb_thread_wait_for()</code> takes a single argument of type
66
+ <span class="type">struct timeval</span>, but its prototype in
67
+ <code class="filename">intern.h</code> is:</p><pre class="programlisting">void rb_thread_wait_for();</pre><p>Because FXRuby is written in C++, and C++ requires strict ANSI
68
+ C-style function prototypes, code that attempts to call one of these
69
+ functions will fail to compile under some compilers. For example, the
70
+ error message from gcc will look something like this:</p><pre class="screen">FXRbApp.cpp: In method `long int FXRbApp::onChoreThreads (FXObject *, unsigned int, void *)':
71
+ /usr/local/lib/ruby/1.8/i686-linux/intern.h:172: too many arguments to function `void rb_thread_wait_for ()'
72
+ FXRbApp.cpp:100: at this point in file
73
+ make: *** [FXRbApp.o] Error 1</pre><p>while the error message from Microsoft's Visual C++ compiler looks
74
+ something like this:</p><pre class="screen">FXRbApp.cpp(109): error C2660: 'rb_thread_wait_for' : function does not take 1 parameters
75
+ NMAKE : fatal error U1077: 'cl' : return code '0x2'
76
+ Stop.</pre><p>This problem with the Ruby header files has been corrected for Ruby
77
+ versions 1.6.8 (and later), but if you're building for an older version of
78
+ Ruby you can do one of two things to work around the problem:</p><div class="itemizedlist"><ul type="bullet"><li style="list-style-type: disc"><p>If you're using gcc version 2.95 or earlier, try modifying the
79
+ compiler flags (<code class="constant">CFLAGS</code>) in the FXRuby
80
+ <code class="filename">Makefile</code> to include the
81
+ <code class="option">-fno-strict-prototype</code> option; this should instruct
82
+ the compiler to allow these kinds of discrepancies. Unfortunately,
83
+ this flag is not supported in more recent versions of gcc.</p></li><li style="list-style-type: disc"><p>A more direct approach is to just fix the offending declarations
84
+ in the Ruby include file(s), i.e. change the declaration for
85
+ <code class="function">rb_thread_wait_for()</code> in
86
+ <code class="filename">intern.h</code> to read:</p><pre class="programlisting">void rb_thread_wait_for(struct timeval);</pre><p>and change the declaration for <code class="function">rb_gc_mark()</code>
87
+ in <code class="filename">intern.h</code> to read:</p><pre class="programlisting">void rb_gc_mark(VALUE);</pre></li></ul></div><p><span class="emphasis"><em>"Virtual Memory Exhausted"</em></span></p><p>For FXRuby releases earlier than version 0.99.173 it was common for
88
+ the compiler to run out of memory trying to compile
89
+ <code class="filename">core_wrap.cpp</code>, with an error message like:</p><pre class="screen">core_wrap.cpp: In function 'void Init_core()':
90
+ core_wrap.cpp:108596: virtual memory exhausted</pre><p>This failure was due to the use of optimizations by the compiler;
91
+ the FXRuby source code makes heavy use of C++ templates and some versions
92
+ of gcc require a lot of memory to process these. Starting with FXRuby
93
+ version 0.99.173, the <code class="filename">extconf.rb</code> script
94
+ <span class="emphasis"><em>should</em></span> disable compiler optimizations when it
95
+ generates the FXRuby <code class="filename">Makefile</code>. If you suspect that
96
+ it's not disabling optimizations (or can see this by watching the compile
97
+ command lines), try modifying the compiler flags
98
+ (<code class="constant">CFLAGS</code>) in the <code class="filename">Makefile</code> by hand
99
+ to do so.</p><p><span class="emphasis"><em>"Cannot load library"</em></span></p><p>On Linux and other Unix systems that support shared libraries, FOX
100
+ is typically installed as a shared library named
101
+ <code class="filename">libFOX-1.6.so</code>. After all of the source files for
102
+ FXRuby are compiled, the last step is to link all of the FXRuby object
103
+ files together with the FOX library (and possibly other system libraries)
104
+ to produce a new shared library, named <code class="filename">fox16.so</code>, that
105
+ Ruby can import as an extension module.</p><p>There are a few things that can go wrong when you try to import this
106
+ extension into Ruby. A common problem is that the operating system cannot
107
+ locate the FOX shared library (<code class="filename">libFOX-1.6.so</code>) when it
108
+ tries to dynamically load the FXRuby extension module; when this happens,
109
+ the error message will look something like:</p><pre class="screen">$ <span><strong class="command">irb</strong></span>
110
+ irb(main):001:0&gt; <strong class="userinput"><code>require 'fox16'</code></strong>
111
+ LoadError: libFOX-1.6.so: cannot open shared object file: No such file or directory - /usr/local/lib/ruby/1.8/i686-linux/fox16.so
112
+ from (irb):1:in 'require'
113
+ from (irb):1
114
+ </pre><p>One workaround for this problem is to modify the
115
+ <code class="constant">LD_LIBRARY_PATH</code> environment variable to include the
116
+ directory where <code class="filename">libFOX-1.6.so</code> is installed. For
117
+ example, if <code class="filename">libFOX-1.6.so</code> is installed in <code class="filename">/usr/local/lib</code>, try setting:</p><pre class="screen">$ <span><strong class="command">export LD_LIBRARY_PATH=/usr/local/lib</strong></span>
118
+ $ <span><strong class="command">irb</strong></span>
119
+ irb(main):001:0&gt; <strong class="userinput"><code>require 'fox16'</code></strong>
120
+ </pre><p>If this works, you can of course permanently add the
121
+ <code class="constant">LD_LIBRARY_PATH</code> setting to your login file(s) so that
122
+ you don't have to remember to type it each time. Another approach that
123
+ should work for Linux is to modify your
124
+ <code class="filename">/etc/ld.so.conf</code> file to include the installation
125
+ directory (e.g. <code class="filename">/usr/local/lib</code>). If you'd like to do
126
+ this instead, you'll need to (as root):</p><div class="orderedlist"><ol type="1" compact><li><p>Edit your <code class="filename">/etc/ld.so.conf</code> file and add the
127
+ directory where <code class="filename">libFOX-1.6.so</code> is installed;
128
+ and,</p></li><li><p>At the shell prompt, type <span><strong class="command">ldconfig</strong></span> to reload
129
+ the linker configuration.</p></li></ol></div><p><span class="emphasis"><em>"Undefined symbol..."</em></span></p><p>Another problem that has been reported by users of both Debian
130
+ GNU/Linux and NetBSD 1.5 is an error message along the lines of:</p><pre class="screen">/usr/lib/libstdc++.so.2: Undefined symbol "__vt_9exception"...</pre><p>The fix for this problem is reported to be to modify the FXRuby
131
+ <code class="filename">Makefile</code> and add <code class="option">-lgcc</code> to the
132
+ <code class="constant">LIBS</code> line.</p></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="goals.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="pt01.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="gems.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">History and Goals&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="book.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;Chapter&nbsp;2.&nbsp;Installing from Gems</td></tr></table></div></body></html>
data/doc/ch03s02.html ADDED
@@ -0,0 +1,23 @@
1
+ <html><head>
2
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3
+ <title>Better living through buttons</title><link rel="stylesheet" href="style.css" type="text/css"><meta name="generator" content="DocBook v5 XSL Stylesheets V1.72.0"><link rel="start" href="book.html" title="Developing Graphical User Interfaces with FXRuby"><link rel="up" href="tutorial1.html" title="Chapter&nbsp;3.&nbsp;Hello, World!"><link rel="prev" href="tutorial1.html" title="Chapter&nbsp;3.&nbsp;Hello, World!"><link rel="next" href="ch03s03.html" title="Messages"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Better living through buttons</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="tutorial1.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;3.&nbsp;Hello, World!</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch03s03.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e741"></a>Better living through buttons</h2></div></div></div><p>Obviously, we need to add a few things to make it more interesting.
4
+ Let's start by putting a button inside the main window. The
5
+ <code class="classname">FXButton</code> class provides a standard push-button
6
+ widget:</p><pre class="programlisting">require 'fox16'
7
+
8
+ include Fox
9
+
10
+ theApp = FXApp.new
11
+
12
+ theMainWindow = FXMainWindow.new(theApp, "Hello")
13
+ <span class="bold"><strong>FXButton.new(theMainWindow, "Hello, World!")</strong></span>
14
+ theApp.create
15
+
16
+ theMainWindow.show
17
+
18
+ theApp.run</pre><p>As you might guess, passing <em class="parameter"><code>theMainWindow</code></em> as
19
+ the first argument to <code class="methodname">FXButton.new</code> tells FXRuby
20
+ that the new button is a child of the main window. The second argument to
21
+ <code class="methodname">FXButton.new</code> is a string that will be displayed
22
+ on the button. If you run the program <span class="emphasis"><em>now</em></span>, you should
23
+ see this:</p><div class="screenshot"><div class="mediaobject" align="center"><img src="images/hello-with-button.png" align="middle"></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="tutorial1.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="tutorial1.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch03s03.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter&nbsp;3.&nbsp;Hello, World!&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="book.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;Messages</td></tr></table></div></body></html>
data/doc/ch03s03.html ADDED
@@ -0,0 +1,52 @@
1
+ <html><head>
2
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3
+ <title>Messages</title><link rel="stylesheet" href="style.css" type="text/css"><meta name="generator" content="DocBook v5 XSL Stylesheets V1.72.0"><link rel="start" href="book.html" title="Developing Graphical User Interfaces with FXRuby"><link rel="up" href="tutorial1.html" title="Chapter&nbsp;3.&nbsp;Hello, World!"><link rel="prev" href="ch03s02.html" title="Better living through buttons"><link rel="next" href="ch03s04.html" title="Adding a tool tip"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Messages</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s02.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;3.&nbsp;Hello, World!</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch03s04.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e772"></a>Messages</h2></div></div></div><p>Now we're cookin' with Crisco, but let's press on and see what other
4
+ things we can do to improve this. You may have noticed by now that the
5
+ only way to quit the program is to close the window using the window
6
+ manager's "close window" option, or to just kill the program outright. We
7
+ can do better than that. Let's add a message handler for the
8
+ <code class="classname">FXButton</code> such that when you click the button, it
9
+ causes the program to exit:</p><pre class="programlisting">require 'fox16'
10
+
11
+ include Fox
12
+
13
+ theApp = FXApp.new
14
+
15
+ theMainWindow = FXMainWindow.new(theApp, "Hello")
16
+ theButton = FXButton.new(theMainWindow, "Hello, World!")
17
+ <span class="bold"><strong>theButton.connect(SEL_COMMAND) do |sender, selector, data|
18
+ exit
19
+ end</strong></span>
20
+ theApp.create
21
+
22
+ theMainWindow.show
23
+
24
+ theApp.run</pre><p>Most FOX objects send out messages (also known as
25
+ <span class="emphasis"><em>events</em></span>) when something interesting happens. FOX
26
+ messages have four important elements:</p><div class="orderedlist"><ol type="1"><li><p>The message <span class="emphasis"><em>sender</em></span> is the object that sends
27
+ the message. In this case, the <code class="classname">FXButton</code>
28
+ instance is the sender.</p></li><li><p>The message <span class="emphasis"><em>type</em></span> is a predefined integer
29
+ constant that indicates what kind of event has occurred (i.e. why this
30
+ message is being sent). In this case, the message type is
31
+ <code class="constant">SEL_COMMAND</code>, which indicates that the command
32
+ associated with this widget should be invoked.</p></li><li><p>The message <span class="emphasis"><em>identifier</em></span> is another integer
33
+ constant that is used to distinguish between different messages of the
34
+ same type. For example, the message that tells a FOX window to make
35
+ itself visible is a <code class="constant">SEL_COMMAND</code> message with the
36
+ identifier <code class="constant">FXWindow::ID_SHOW</code> (where
37
+ <code class="constant">ID_SHOW</code> is a constant defined in the
38
+ <code class="classname">FXWindow</code> class). A different message
39
+ identifier, <code class="constant">FXWindow::ID_HIDE</code>, tells an
40
+ <code class="classname">FXWindow</code> instance to make itself
41
+ invisible.</p></li><li><p>The message <span class="emphasis"><em>data</em></span> is an object containing
42
+ message-specific information. For this case (the
43
+ <code class="classname">FXButton</code>'s <code class="constant">SEL_COMMAND</code>
44
+ message, there is no interesting message data, but we'll see other
45
+ kinds of messages where the message data is useful.</p></li></ol></div><p>For historical reasons, the message type and identifier are usually
46
+ packed into a single 32-bit unsigned integer known as the
47
+ <span class="emphasis"><em>selector</em></span>, and this is the value that is passed into
48
+ the message handler block. Since we don't actually need to use the
49
+ <em class="parameter"><code>sender</code></em>, <em class="parameter"><code>selector</code></em> or
50
+ <em class="parameter"><code>data</code></em> arguments for this particular message handler,
51
+ we can just ignore them and shorten the code to:</p><pre class="programlisting">theButton.connect(SEL_COMMAND) { exit }</pre><p>Re-run the program and push the button to convince yourself that it
52
+ works.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch03s02.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="tutorial1.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch03s04.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Better living through buttons&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="book.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;Adding a tool tip</td></tr></table></div></body></html>
data/doc/ch03s04.html ADDED
@@ -0,0 +1,36 @@
1
+ <html><head>
2
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3
+ <title>Adding a tool tip</title><link rel="stylesheet" href="style.css" type="text/css"><meta name="generator" content="DocBook v5 XSL Stylesheets V1.72.0"><link rel="start" href="book.html" title="Developing Graphical User Interfaces with FXRuby"><link rel="up" href="tutorial1.html" title="Chapter&nbsp;3.&nbsp;Hello, World!"><link rel="prev" href="ch03s03.html" title="Messages"><link rel="next" href="ch03s05.html" title="Adding an icon"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Adding a tool tip</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s03.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;3.&nbsp;Hello, World!</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch03s05.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e863"></a>Adding a tool tip</h2></div></div></div><p>To wrap up this introduction, we'd like to add a few finishing
4
+ touches to the program. The first addition is to add a tool tip to the
5
+ button, such that when the mouse cursor hovers over the button for a short
6
+ while, it will pop up a little message describing what the button
7
+ does:</p><pre class="programlisting">require 'fox16'
8
+
9
+ include Fox
10
+
11
+ theApp = FXApp.new
12
+
13
+ theMainWindow = FXMainWindow.new(theApp, "Hello")
14
+
15
+ theButton = FXButton.new(theMainWindow, "Hello, World!")
16
+ <span class="bold"><strong>theButton.tipText = "Push Me!"</strong></span>
17
+ theButton.connect(SEL_COMMAND) { exit }
18
+
19
+ <span class="bold"><strong>FXToolTip.new(theApp)</strong></span>
20
+
21
+ theApp.create
22
+
23
+ theMainWindow.show
24
+
25
+ theApp.run</pre><p>There are two changes involved here. The first is to set the tool
26
+ tip text for the button using the <code class="methodname">tipText</code>
27
+ accessor, and for this example we're setting the button's tip text to
28
+ "Push Me!". The second change is to create the (single)
29
+ <code class="classname">FXToolTip</code> instance for the application. Although
30
+ this program shows the <code class="classname">FXToolTip</code> instance being
31
+ created after the <code class="classname">FXButton</code>, it doesn't really
32
+ matter when you do it. You just want to have instantiated the
33
+ <code class="classname">FXToolTip</code> before you drop into the main event loop
34
+ by calling <code class="methodname">FXApp#run</code>. If you run this version and
35
+ hover over the button for a second or so, you should see the tooltip pop
36
+ up:</p><div class="screenshot"><div class="mediaobject" align="center"><img src="images/hello-with-tooltip.png" align="middle"></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch03s03.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="tutorial1.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch03s05.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Messages&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="book.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;Adding an icon</td></tr></table></div></body></html>
data/doc/ch03s05.html ADDED
@@ -0,0 +1,60 @@
1
+ <html><head>
2
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3
+ <title>Adding an icon</title><link rel="stylesheet" href="style.css" type="text/css"><meta name="generator" content="DocBook v5 XSL Stylesheets V1.72.0"><link rel="start" href="book.html" title="Developing Graphical User Interfaces with FXRuby"><link rel="up" href="tutorial1.html" title="Chapter&nbsp;3.&nbsp;Hello, World!"><link rel="prev" href="ch03s04.html" title="Adding a tool tip"><link rel="next" href="clipboardtut.html" title="Chapter&nbsp;4.&nbsp;Working With the Clipboard"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Adding an icon</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s04.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;3.&nbsp;Hello, World!</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="clipboardtut.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e900"></a>Adding an icon</h2></div></div></div><p>The final change is to add an icon to the button to make things a
4
+ little more festive. FOX supports all of the popular image file formats
5
+ (e.g. BMP, GIF, JPEG, PNG and TIFF) and you can use any of them as icons
6
+ on buttons and labels. For this example, we'll use the one of the "Powered
7
+ By Ruby" images created by Hal Fulton (and posted at the <a xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.rubygarden.org/ruby?PoweredByRubyButtons" target="_top">Ruby Garden
8
+ Wiki</a>):</p><pre class="programlisting">require 'fox16'
9
+
10
+ include Fox
11
+
12
+ theApp = FXApp.new
13
+
14
+ theMainWindow = FXMainWindow.new(theApp, "Hello")
15
+
16
+ theButton = FXButton.new(theMainWindow, "Hello, World!")
17
+ theButton.tipText = "Push Me!"
18
+ <span class="bold"><strong>iconFile = File.open("pbr.jpg", "rb")
19
+ theButton.icon = FXJPGIcon.new(theApp, iconFile.read)
20
+ iconFile.close</strong></span>
21
+ theButton.connect(SEL_COMMAND) { exit }
22
+
23
+ FXToolTip.new(theApp)
24
+
25
+ theApp.create
26
+
27
+ theMainWindow.show
28
+
29
+ theApp.run</pre><p>Here, <code class="filename">pbr.jpg</code> is the file name of the JPEG
30
+ image file. You want to be sure to open the file in
31
+ <span class="emphasis"><em>binary</em></span> mode (i.e. including the "b" mode flag),
32
+ because there is a difference on the Windows platform. Since it's a JPEG
33
+ image, we need to use the <code class="classname">FXJPGIcon</code> class to
34
+ instantiate this icon. The first argument to
35
+ <code class="methodname">FXJPGIcon.new</code> is just a reference to the
36
+ <code class="classname">FXApp</code> instance, and the second argument is the
37
+ contents of the image file. We associate this icon object with our button
38
+ using the button's <code class="methodname">icon</code> accessor method. If you
39
+ run this example, you should see:</p><div class="screenshot"><div class="mediaobject" align="center"><img src="images/hello-with-icon-1.png" align="middle"></div></div><p>When you have both text and an icon displayed on a button (or its
40
+ superclass, <code class="classname">FXLabel</code>) the default positioning is to
41
+ display the icon to the left of the text. For this particular example,
42
+ however, it would probably be more appropriate to display the icon
43
+ <span class="emphasis"><em>above</em></span> the text. We can achieve this using the
44
+ button's <code class="methodname">iconPosition</code> accessor method:</p><pre class="programlisting">theButton.iconPosition = ICON_ABOVE_TEXT</pre><p>If you re-run the program after adding this line, you should
45
+ see:</p><div class="screenshot"><div class="mediaobject" align="center"><img src="images/hello-with-icon-2.png" align="middle"></div></div><p>The last change we're going to make is to make the icon transparent.
46
+ FOX allows you to specify that some regions of an icon should be treated
47
+ as "transparent", meaning that whatever's underneath them shows through.
48
+ FOX distinguishes those transparent regions from the non-transparent ones
49
+ using a transparency color, and any pixels in the original image that have
50
+ that color become transparent. In most cases, FOX can determine this
51
+ transparency color automatically (indeed, for image file formats like GIF
52
+ it's part of the image information). You can also specify the transparency
53
+ color explicitly if you like.</p><p>For the icon we've chosen, it's pretty obvious that the transparency
54
+ color is white, but let's let FOX figure that out for us. We want to
55
+ activate two options for the icon:</p><div class="itemizedlist"><ul type="bullet"><li style="list-style-type: disc"><p>the <code class="constant">IMAGE_ALPHACOLOR</code> option, which tells
56
+ FOX that some regions of this image should be treated as transparent;
57
+ and,</p></li><li style="list-style-type: disc"><p>the <code class="constant">IMAGE_ALPHAGUESS</code> option, which tells
58
+ FOX to guess the appropriate transparency color using the colors used
59
+ in the four corners of the image.</p></li></ul></div><p>To set these options, add this line to the program:</p><pre class="programlisting">theButton.icon.options = IMAGE_ALPHACOLOR | IMAGE_ALPHAGUESS</pre><p>and then re-run the program after making this change to see the
60
+ final result:</p><div class="screenshot"><div class="mediaobject" align="center"><img src="images/hello-with-icon-3.png" align="middle"></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch03s04.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="tutorial1.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="clipboardtut.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Adding a tool tip&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="book.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;Chapter&nbsp;4.&nbsp;Working With the Clipboard</td></tr></table></div></body></html>
data/doc/ch04s02.html ADDED
@@ -0,0 +1,71 @@
1
+ <html><head>
2
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3
+ <title>Acquiring the Clipboard</title><link rel="stylesheet" href="style.css" type="text/css"><meta name="generator" content="DocBook v5 XSL Stylesheets V1.72.0"><link rel="start" href="book.html" title="Developing Graphical User Interfaces with FXRuby"><link rel="up" href="clipboardtut.html" title="Chapter&nbsp;4.&nbsp;Working With the Clipboard"><link rel="prev" href="clipboardtut.html" title="Chapter&nbsp;4.&nbsp;Working With the Clipboard"><link rel="next" href="ch04s03.html" title="Sending Data to the Clipboard"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Acquiring the Clipboard</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="clipboardtut.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;4.&nbsp;Working With the Clipboard</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch04s03.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e1022"></a>Acquiring the Clipboard</h2></div></div></div><p>Let's begin by augmenting the GUI to include a row of buttons along
4
+ the bottom of the main window for copying and pasting:</p><pre class="programlisting">require 'fox16'
5
+ require 'customer'
6
+
7
+ include Fox
8
+
9
+ class ClipMainWindow &lt; FXMainWindow
10
+ def initialize(anApp)
11
+ # Initialize base class first
12
+ super(anApp, "Clipboard Example", :opts =&gt; DECOR_ALL, :width =&gt; 400, :height =&gt; 300)
13
+ <span class="bold"><strong>
14
+ # Horizontal frame contains buttons
15
+ buttons = FXHorizontalFrame.new(self, LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH)
16
+ </strong></span><span class="bold"><strong>
17
+ # Cut and paste buttons
18
+ copyButton = FXButton.new(buttons, "Copy")
19
+ pasteButton = FXButton.new(buttons, "Paste")
20
+ </strong></span>
21
+ # Place the list in a sunken frame
22
+ sunkenFrame = FXVerticalFrame.new(self,
23
+ LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK, :padding =&gt; 0)
24
+
25
+ # Customer list
26
+ customerList = FXList.new(sunkenFrame, :opts =&gt; LIST_BROWSESELECT|LAYOUT_FILL_X|LAYOUT_FILL_Y)
27
+ $customers.each do |customer|
28
+ customerList.appendItem(customer.name, nil, customer)
29
+ end
30
+ end
31
+
32
+ def create
33
+ super
34
+ show(PLACEMENT_SCREEN)
35
+ end
36
+ end
37
+
38
+ if __FILE__ == $0
39
+ FXApp.new("ClipboardExample", "FXRuby") do |theApp|
40
+ ClipMainWindow.new(theApp)
41
+ theApp.create
42
+ theApp.run
43
+ end
44
+ end
45
+ </pre><p>Note that the lines which appear in bold face are those which have
46
+ been added (or changed) since the previous source code listing.</p><p>The clipboard is a kind of shared resource in the operating system.
47
+ Copying (or cutting) data to the clipboard begins with some window in your
48
+ application requesting "ownership" of the clipboard by calling the
49
+ <code class="methodname">acquireClipboard()</code> instance method. Let's add a
50
+ handler for the "Copy" button press which does just that:</p><pre class="programlisting"># User clicks Copy
51
+ copyButton.connect(SEL_COMMAND) do
52
+ customer = customerList.getItemData(customerList.currentItem)
53
+ types = [ FXWindow.stringType ]
54
+ if acquireClipboard(types)
55
+ @clippedCustomer = customer
56
+ end
57
+ end
58
+ </pre><p>The <code class="methodname">acquireClipboard()</code> method takes as its
59
+ input an array of drag types. A <span class="emphasis"><em>drag type</em></span> is just a
60
+ unique value, assigned by the window system, that identifies a particular
61
+ kind of data. In this case, we're using one of FOX's pre-registered drag
62
+ types (<code class="constant">stringType</code>) to indicate that we have some
63
+ string data to place on the clipboard. Later, we'll see how to register
64
+ customized, application-specific drag types as well.</p><p>The <code class="methodname">acquireClipboard()</code> method returns
65
+ <code class="constant">true</code> on success; since we called
66
+ <code class="methodname">acquireClipboard()</code> on the main window, this means
67
+ that the main window is now the clipboard owner. At this time, we want to
68
+ save a reference to the currently selected customer in the
69
+ <code class="varname">@clippedCustomer</code> instance variable so that if its value
70
+ is requested later, we'll be able to return the
71
+ <span class="emphasis"><em>correct</em></span> customer's information.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="clipboardtut.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="clipboardtut.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch04s03.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter&nbsp;4.&nbsp;Working With the Clipboard&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="book.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;Sending Data to the Clipboard</td></tr></table></div></body></html>
data/doc/ch04s03.html ADDED
@@ -0,0 +1,37 @@
1
+ <html><head>
2
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3
+ <title>Sending Data to the Clipboard</title><link rel="stylesheet" href="style.css" type="text/css"><meta name="generator" content="DocBook v5 XSL Stylesheets V1.72.0"><link rel="start" href="book.html" title="Developing Graphical User Interfaces with FXRuby"><link rel="up" href="clipboardtut.html" title="Chapter&nbsp;4.&nbsp;Working With the Clipboard"><link rel="prev" href="ch04s02.html" title="Acquiring the Clipboard"><link rel="next" href="ch04s04.html" title="Pasting Data from the Clipboard"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Sending Data to the Clipboard</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch04s02.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;4.&nbsp;Working With the Clipboard</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch04s04.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e1071"></a>Sending Data to the Clipboard</h2></div></div></div><p>Whenever some other window requests the clipboard's contents (e.g.
4
+ as a result of a "paste" operation) FOX will send a
5
+ <code class="constant">SEL_CLIPBOARD_REQUEST</code> message to the current
6
+ clipboard owner. Remember, the clipboard owner is the window that called
7
+ <code class="methodname">acquireClipboard()</code>. For our example, the main
8
+ window is acting as the clipboard owner and so it needs to handle the
9
+ <code class="constant">SEL_CLIPBOARD_REQUEST</code> message:</p><pre class="programlisting"># Handle clipboard request
10
+ self.connect(SEL_CLIPBOARD_REQUEST) do
11
+ setDNDData(FROM_CLIPBOARD, FXWindow.stringType, Fox.fxencodeStringData(@clippedCustomer.to_s))
12
+ end
13
+ </pre><p>The <code class="methodname">setDNDData()</code> method takes three
14
+ arguments. The first argument tells FOX which kind of data transfer we're
15
+ trying to accomplish; as it turns out, this method can be used for
16
+ drag-and-drop (<code class="constant">FROM_DRAGNDROP</code>) and X11 selection
17
+ (<code class="constant">FROM_SELECTION</code>) data transfer as well. The second
18
+ argument to <code class="methodname">setDNDData()</code> is the drag type for the
19
+ data and the last argument is the data itself, a binary string.</p><p>If you're wondering why we need to call the
20
+ <code class="methodname">fxencodeStringData()</code> module method to preprocess
21
+ the string returned by the call to <code class="methodname">Customer#to_s</code>,
22
+ that's a reasonable thing to wonder about. In order for FOX to play nice
23
+ with other clipboard-aware applications, it must be able to store string
24
+ data on the clipboard in the format expected by those applications.
25
+ Unfortunately, that expected format is platform-dependent and does not
26
+ always correspond directly to the format that Ruby uses internally to
27
+ store its string data. The <code class="methodname">fxencodeStringData()</code>
28
+ method (and the corresponding
29
+ <code class="methodname">fxdecodeStringData()</code> method) provide you with a
30
+ platform-independent way of sending (or receiving) string data with the
31
+ <code class="constant">stringType</code> drag type.</p><p>If you run the program as it currently stands, you should now be
32
+ able to select a customer from the list, click the "Copy" button and then
33
+ paste the selected customer data (as a string) into some other
34
+ application. For example, if you're trying this tutorial on a Windows
35
+ machine, try pasting into a copy of Notepad or Microsoft Word. The pasted
36
+ text should look something like:</p><pre class="programlisting">#&lt;struct Struct::Customer name="Joe Smith", address="123 Maple, Anytown, NC", zip=12345&gt;
37
+ </pre></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch04s02.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="clipboardtut.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch04s04.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Acquiring the Clipboard&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="book.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;Pasting Data from the Clipboard</td></tr></table></div></body></html>
data/doc/ch04s04.html ADDED
@@ -0,0 +1,72 @@
1
+ <html><head>
2
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3
+ <title>Pasting Data from the Clipboard</title><link rel="stylesheet" href="style.css" type="text/css"><meta name="generator" content="DocBook v5 XSL Stylesheets V1.72.0"><link rel="start" href="book.html" title="Developing Graphical User Interfaces with FXRuby"><link rel="up" href="clipboardtut.html" title="Chapter&nbsp;4.&nbsp;Working With the Clipboard"><link rel="prev" href="ch04s03.html" title="Sending Data to the Clipboard"><link rel="next" href="dragdroptut.html" title="Chapter&nbsp;5.&nbsp;Drag and Drop"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Pasting Data from the Clipboard</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch04s03.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;4.&nbsp;Working With the Clipboard</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="dragdroptut.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e1122"></a>Pasting Data from the Clipboard</h2></div></div></div><p>We've seen one side of the equation, copying string data to the
4
+ clipboard. But before we can "round-trip" that customer data and paste it
5
+ back into another copy of our customer list application, we're clearly
6
+ going to need to transfer the data in some more useful format. That is to
7
+ say, if we were to receive the customer data in the format that it's
8
+ currently stored on the clipboard:</p><pre class="programlisting">#&lt;struct Struct::Customer name="Joe Smith", address="123 Maple, Anytown, NC", zip=12345&gt;
9
+ </pre><p>We'd have to parse that string and try to extract the relevant data
10
+ from it. We can do better than that. The approach we'll use instead is to
11
+ serialize and deserialize the objects using YAML. First, make sure that
12
+ the YAML module is loaded by adding this line:</p><pre class="programlisting">require 'yaml'</pre><p>somewhere near the top of the program. Next, register a custom drag
13
+ type for <code class="classname">Customer</code> objects. We can do that by adding
14
+ one line to our main window's <code class="methodname">create</code> instance
15
+ method:</p><pre class="programlisting">def create
16
+ super
17
+ <span class="bold"><strong> @customerDragType = getApp().registerDragType("application/x-customer")
18
+ </strong></span> show(PLACEMENT_SCREEN)
19
+ end
20
+ </pre><p>Note that by convention, the name of the drag type is the MIME type
21
+ for the data, but any unique string will do. In our case, we'll use the
22
+ string "application/x-customer" to identify the drag type for our
23
+ YAML-serialized <code class="classname">Customer</code> objects.</p><p>With that in place, we can now go back and slightly change some of
24
+ our previous code. When we acquire the clipboard, we'd now like to be able
25
+ to offer the selected customer's information either as plain text (i.e.
26
+ the previous format) <span class="emphasis"><em>or</em></span> as a YAML document, so we'll
27
+ include <span class="emphasis"><em>both</em></span> of these types in the array of drag
28
+ types passed to <code class="methodname">acquireClipboard()</code>:</p><pre class="programlisting"># User clicks Copy
29
+ copyButton.connect(SEL_COMMAND) do
30
+ customer = customerList.getItemData(customerList.currentItem)
31
+ <span class="bold"><strong> types = [ FXWindow.stringType, @customerDragType ]
32
+ </strong></span> if acquireClipboard(types)
33
+ @clippedCustomer = customer
34
+ end
35
+ end
36
+ </pre><p>Similarly, when we're handling the
37
+ <code class="constant">SEL_CLIPBOARD_REQUEST</code> message, we now need to pay
38
+ attention to which drag type (i.e. which data format) the requestor
39
+ specified. We can do that by inspecting the
40
+ <code class="methodname">target</code> attribute of the
41
+ <code class="classname">FXEvent</code> instance passed along with the
42
+ <code class="constant">SEL_CLIPBOARD_REQUEST</code> message:</p><pre class="programlisting"># Handle clipboard request
43
+ self.connect(SEL_CLIPBOARD_REQUEST) do |sender, sel, event|
44
+ case event.target
45
+ when FXWindow.stringType
46
+ setDNDData(FROM_CLIPBOARD, FXWindow.stringType, Fox.fxencodeStringData(@clippedCustomer.to_s))
47
+ when @customerDragType
48
+ setDNDData(FROM_CLIPBOARD, @customerDragType, @clippedCustomer.to_yaml)
49
+ else
50
+ # Ignore requests for unrecognized drag types
51
+ end
52
+ end
53
+ </pre><p>With these changes in place, we can now add a handler for the
54
+ "Paste" button which requests the clipboard data in YAML format,
55
+ deserializes it, and then adds an item to the customer list:</p><pre class="programlisting"># User clicks Paste
56
+ pasteButton.connect(SEL_COMMAND) do
57
+ data = getDNDData(FROM_CLIPBOARD, @customerDragType)
58
+ if data
59
+ customer = YAML.load(data)
60
+ customerList.appendItem(customer.name, nil, customer)
61
+ end
62
+ end
63
+ </pre><p>The <code class="methodname">getDNDData()</code> method used here is the
64
+ inverse of the <code class="methodname">setDNDData()</code> method we used
65
+ earlier to push data to some other application requesting our clipboard
66
+ data. As with <code class="methodname">setDNDData()</code>, the arguments to
67
+ <code class="methodname">getDNDData()</code> indicate the kind of data transfer
68
+ we're performing (e.g. <code class="constant">FROM_CLIPBOARD</code>) and the drag
69
+ type for the data we're requesting. If some failure occurs (usually,
70
+ because the clipboard owner can't provide its data in the requested
71
+ format) <code class="methodname">getDNDData()</code> will simply return
72
+ <code class="constant">nil</code>.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch04s03.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="clipboardtut.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="dragdroptut.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Sending Data to the Clipboard&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="book.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;Chapter&nbsp;5.&nbsp;Drag and Drop</td></tr></table></div></body></html>