fxruby 1.6.13-mswin32

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 (496) 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 +133 -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 +685 -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/datatarget.rb +223 -0
  78. data/examples/dctest.rb +696 -0
  79. data/examples/dialog.rb +143 -0
  80. data/examples/dilbert.rb +67 -0
  81. data/examples/dirlist.rb +63 -0
  82. data/examples/dragdrop.rb +97 -0
  83. data/examples/dragsource.rb +80 -0
  84. data/examples/dropsite.rb +59 -0
  85. data/examples/foursplit.rb +97 -0
  86. data/examples/gltest.rb +330 -0
  87. data/examples/glviewer.rb +576 -0
  88. data/examples/groupbox.rb +392 -0
  89. data/examples/header.rb +149 -0
  90. data/examples/hello.rb +12 -0
  91. data/examples/hello2.rb +51 -0
  92. data/examples/iRAA.rb +153 -0
  93. data/examples/iconlist.rb +92 -0
  94. data/examples/icons/AngryGuyInBunnySuit.ico +0 -0
  95. data/examples/icons/FatBot.ico +0 -0
  96. data/examples/icons/FlippedySwitch.ico +0 -0
  97. data/examples/icons/LeGoon.ico +0 -0
  98. data/examples/icons/Net.ico +0 -0
  99. data/examples/icons/RedMacOS.ico +0 -0
  100. data/examples/icons/SawBlade.ico +0 -0
  101. data/examples/icons/backview.png +0 -0
  102. data/examples/icons/big.png +0 -0
  103. data/examples/icons/bigfolder.png +0 -0
  104. data/examples/icons/bigpenguin.png +0 -0
  105. data/examples/icons/bottomview.png +0 -0
  106. data/examples/icons/camera.png +0 -0
  107. data/examples/icons/capbutt.png +0 -0
  108. data/examples/icons/capnotlast.png +0 -0
  109. data/examples/icons/capproj.png +0 -0
  110. data/examples/icons/capround.png +0 -0
  111. data/examples/icons/colorpal.png +0 -0
  112. data/examples/icons/copy.png +0 -0
  113. data/examples/icons/cut.png +0 -0
  114. data/examples/icons/delimit.png +0 -0
  115. data/examples/icons/dippy.png +0 -0
  116. data/examples/icons/double_dash.png +0 -0
  117. data/examples/icons/filenew.png +0 -0
  118. data/examples/icons/fileopen.png +0 -0
  119. data/examples/icons/filesave.png +0 -0
  120. data/examples/icons/filesaveas.png +0 -0
  121. data/examples/icons/fonts.png +0 -0
  122. data/examples/icons/fox.png +0 -0
  123. data/examples/icons/foxicon.png +0 -0
  124. data/examples/icons/frontview.png +0 -0
  125. data/examples/icons/gem_big.png +0 -0
  126. data/examples/icons/gem_small.png +0 -0
  127. data/examples/icons/hello2.png +0 -0
  128. data/examples/icons/help.png +0 -0
  129. data/examples/icons/indent.png +0 -0
  130. data/examples/icons/jbevel.png +0 -0
  131. data/examples/icons/jmiter.png +0 -0
  132. data/examples/icons/jround.png +0 -0
  133. data/examples/icons/kill.png +0 -0
  134. data/examples/icons/leftview.png +0 -0
  135. data/examples/icons/light.png +0 -0
  136. data/examples/icons/minidoc.png +0 -0
  137. data/examples/icons/minifolder.png +0 -0
  138. data/examples/icons/minifolderopen.png +0 -0
  139. data/examples/icons/newfolder.png +0 -0
  140. data/examples/icons/nolight.png +0 -0
  141. data/examples/icons/onoff_dash.png +0 -0
  142. data/examples/icons/palette.png +0 -0
  143. data/examples/icons/parallel.png +0 -0
  144. data/examples/icons/paste.png +0 -0
  145. data/examples/icons/pattern.png +0 -0
  146. data/examples/icons/penguin.png +0 -0
  147. data/examples/icons/perspective.png +0 -0
  148. data/examples/icons/printicon.png +0 -0
  149. data/examples/icons/prop.png +0 -0
  150. data/examples/icons/redo.png +0 -0
  151. data/examples/icons/rightview.png +0 -0
  152. data/examples/icons/saveas.png +0 -0
  153. data/examples/icons/shutter1.png +0 -0
  154. data/examples/icons/shutter2.png +0 -0
  155. data/examples/icons/small.png +0 -0
  156. data/examples/icons/smoothlight.png +0 -0
  157. data/examples/icons/solid_line.png +0 -0
  158. data/examples/icons/tbuplevel.png +0 -0
  159. data/examples/icons/topview.png +0 -0
  160. data/examples/icons/undo.png +0 -0
  161. data/examples/icons/winapp.png +0 -0
  162. data/examples/icons/zoom.png +0 -0
  163. data/examples/image.rb +279 -0
  164. data/examples/imageviewer.rb +509 -0
  165. data/examples/inputs.rb +83 -0
  166. data/examples/mditest.rb +180 -0
  167. data/examples/pig.rb +77 -0
  168. data/examples/raabrowser.rb +122 -0
  169. data/examples/ratio.rb +80 -0
  170. data/examples/rulerview.rb +27 -0
  171. data/examples/scintilla-test.rb +81 -0
  172. data/examples/scribble-orig.rb +186 -0
  173. data/examples/scribble.rb +162 -0
  174. data/examples/shutter.rb +158 -0
  175. data/examples/splitter.rb +211 -0
  176. data/examples/styledtext.rb +82 -0
  177. data/examples/tabbook.rb +165 -0
  178. data/examples/table.rb +187 -0
  179. data/examples/textedit/commands.rb +114 -0
  180. data/examples/textedit/helpwindow.rb +299 -0
  181. data/examples/textedit/prefdialog.rb +239 -0
  182. data/examples/textedit/textedit.rb +1763 -0
  183. data/examples/unicode.rb +36 -0
  184. data/ext/fox16/fox16.so +0 -0
  185. data/index.html +14 -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 +2725 -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 +286 -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 +69 -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/stress1.rb +94 -0
  483. data/tests/stress2.rb +51 -0
  484. data/tests/stress3.rb +117 -0
  485. data/tests/testcase.rb +37 -0
  486. data/web/art/fxrubylogo.png +0 -0
  487. data/web/art/fxrubylogo_small.png +0 -0
  488. data/web/art/line.gif +0 -0
  489. data/web/art/oul_grey.gif +0 -0
  490. data/web/art/our.gif +0 -0
  491. data/web/downloads.html +93 -0
  492. data/web/home.html +113 -0
  493. data/web/menu.html +50 -0
  494. data/web/styles.css +167 -0
  495. data/web/top.html +15 -0
  496. metadata +548 -0
@@ -0,0 +1,67 @@
1
+ <html><head>
2
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3
+ <title>Chapter&nbsp;4.&nbsp;Working With 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="pt01.html" title="Part&nbsp;I.&nbsp;The Basics"><link rel="prev" href="ch03s05.html" title="Adding an icon"><link rel="next" href="ch04s02.html" title="Acquiring 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">Chapter&nbsp;4.&nbsp;Working With the Clipboard</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s05.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="ch04s02.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="clipboardtut"></a>Chapter&nbsp;4.&nbsp;Working With the Clipboard</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="section"><a href="clipboardtut.html#d0e1003">Basic Application</a></span></dt><dt><span class="section"><a href="ch04s02.html">Acquiring the Clipboard</a></span></dt><dt><span class="section"><a href="ch04s03.html">Sending Data to the Clipboard</a></span></dt><dt><span class="section"><a href="ch04s04.html">Pasting Data from the Clipboard</a></span></dt></dl></div><p>Two of the standard FOX widgets, <code class="classname">FXText</code> and
4
+ <code class="classname">FXTextField</code>, provide clipboard support out of the
5
+ box. For example, you can select some text in an
6
+ <code class="classname">FXTextField</code> and then press Ctrl+C to copy that text
7
+ to the system clipboard. You can also press Ctrl+X to "cut" the selected
8
+ text to the clipboard, or Ctrl+V to paste text from the clipboard into an
9
+ <code class="classname">FXText</code> or <code class="classname">FXTextField</code> widget.
10
+ The purpose of this tutorial is to demonstrate how to interact with the
11
+ clipboard programmatically, so that you can integrate additional clipboard
12
+ support into your FXRuby applications.</p><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e1003"></a>Basic Application</h2></div></div></div><p>In order to illustrate how to integrate cut and paste operations
13
+ into your application, we'll start from a simple FXRuby application that
14
+ doesn't yet provide any clipboard support. This application simply
15
+ presents a list of customers (from some external source).</p><pre class="programlisting">require 'fox16'
16
+ require 'customer'
17
+
18
+ include Fox
19
+
20
+ class ClipMainWindow &lt; FXMainWindow
21
+ def initialize(anApp)
22
+ # Initialize base class first
23
+ super(anApp, "Clipboard Example", :opts =&gt; DECOR_ALL, :width =&gt; 400, :height =&gt; 300)
24
+
25
+ # Place the list in a sunken frame
26
+ sunkenFrame = FXVerticalFrame.new(self,
27
+ LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK, :padding =&gt; 0)
28
+
29
+ # Customer list
30
+ customerList = FXList.new(sunkenFrame, :opts =&gt; LIST_BROWSESELECT|LAYOUT_FILL_X|LAYOUT_FILL_Y)
31
+ $customers.each do |customer|
32
+ customerList.appendItem(customer.name, nil, customer)
33
+ end
34
+ end
35
+
36
+ def create
37
+ super
38
+ show(PLACEMENT_SCREEN)
39
+ end
40
+ end
41
+
42
+ if __FILE__ == $0
43
+ FXApp.new("ClipboardExample", "FXRuby") do |theApp|
44
+ ClipMainWindow.new(theApp)
45
+ theApp.create
46
+ theApp.run
47
+ end
48
+ end
49
+ </pre><p>We're assuming that the "customer" module defines a
50
+ <code class="classname">Customer</code> class and a global array
51
+ <code class="varname">$customers</code> that contains the list of customers. For a
52
+ real world application, you might access this information from a database
53
+ or some other source, but for this example we'll just use a hard-coded
54
+ array:</p><pre class="programlisting"># customer.rb
55
+
56
+ Customer = Struct.new("Customer", :name, :address, :zip)
57
+
58
+ $customers = []
59
+ $customers &lt;&lt; Customer.new("Reed Richards", "123 Maple, Central City, NY", 010111)
60
+ $customers &lt;&lt; Customer.new("Sue Storm", "123 Maple, Anytown, NC", 12345)
61
+ $customers &lt;&lt; Customer.new("Benjamin J. Grimm", "123 Maple, Anytown, NC", 12345)
62
+ $customers &lt;&lt; Customer.new("Johnny Storm", "123 Maple, Anytown, NC", 12345)
63
+ </pre><p>The goals for the next few sections are to extend this application
64
+ so that users can select a customer from the list and copy that customer's
65
+ information to the clipboard, and subsequently paste that information into
66
+ another copy of the program (or some other clipboard-aware
67
+ application).</p></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch03s05.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="ch04s02.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Adding an icon&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="book.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;Acquiring the Clipboard</td></tr></table></div></body></html>
@@ -0,0 +1,190 @@
1
+ <html><head>
2
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3
+ <title>Appendix&nbsp;C.&nbsp;Differences between FOX and FXRuby</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="pt02.html" title="Part&nbsp;II.&nbsp;Appendices"><link rel="prev" href="scintilla.html" title="Appendix&nbsp;B.&nbsp;Using Scintilla with FXRuby"><link rel="next" href="library.html" title="Appendix&nbsp;D.&nbsp;The FXRuby Standard Library"></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">Appendix&nbsp;C.&nbsp;Differences between FOX and FXRuby</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="scintilla.html">Prev</a>&nbsp;</td><th width="60%" align="center">Part&nbsp;II.&nbsp;Appendices</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="library.html">Next</a></td></tr></table><hr></div><div class="appendix" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="differences"></a>Appendix&nbsp;C.&nbsp;Differences between FOX and FXRuby</h2></div></div></div><p>The FXRuby API follows the FOX API very closely and for the most part,
4
+ you should be able to use the standard FOX class documentation as a
5
+ reference. In some cases, however, fundamental differences between Ruby and
6
+ C++ necessitated slight changes in the API. For some other cases, FOX
7
+ classes were enhanced to take advantage of Ruby language features (such as
8
+ iterators). The purpose of this chapter is to identify some of the
9
+ differences between the C++ and Ruby interfaces to FOX.</p><p>One difference that should be easy to cope with is the substitution of
10
+ Ruby Strings for FXStrings. Any function that would normally expect an
11
+ <span class="type">FXString</span> input argument insteads takes a Ruby String.
12
+ Similarly, functions that would return an <span class="type">FXString</span> will instead
13
+ return a Ruby string. For functions that would normally accept a
14
+ <code class="constant">NULL</code> or empty string argument, just pass
15
+ <code class="constant">nil</code> or an empty string ("").</p><div class="simplesect" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e4683"></a>Functions that expect arrays of objects</h2></div></div></div><p>One common pattern in FOX member function argument lists is to
16
+ expect a pointer to an array of values, followed by an integer indicating
17
+ the number of values in the array. This of course isn't necessary in Ruby,
18
+ where <code class="classname">Array</code> objects "know" their lengths. As a
19
+ result, functions such as
20
+ <code class="methodname">FXWindow::acquireClipboard()</code>, whose C++
21
+ declaration looks like this:</p><pre class="programlisting">FXbool acquireClipboard(const FXDragType *types, FXuint numTypes);</pre><p>are called from Ruby code by passing in a single
22
+ <code class="classname">Array</code> argument, e.g.</p><pre class="programlisting">myWindow.acquireClipboard(typesArray)</pre></div><div class="simplesect" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e4703"></a>Functions that return values by reference</h2></div></div></div><p>Many FOX methods take advantage of the C++ language feature of
23
+ returning values by reference. For example, the
24
+ <code class="methodname">getCursorPos()</code> member function for class
25
+ <code class="classname">FXWindow</code> has the declaration:</p><pre class="programlisting">FXint getCursorPos(FXint&amp; x, FXint&amp; y, FXint&amp; buttons) const;</pre><p>which indicates that the function takes references to three integers
26
+ (x, y and buttons). To call this function from a C++ program, you'd write
27
+ code like this:</p><pre class="programlisting">FXint x, y;
28
+ FXuint buttons;
29
+
30
+ if (window-&gt;getCursorPosition(x, y, buttons))
31
+ fprintf(stderr, "Current position is (%d, %d)\n", x, y);</pre><p>Since this idiom doesn't translate well to Ruby, some functions'
32
+ interfaces have been slightly modified. For example, the FXRuby
33
+ implementation of <code class="methodname">getCursorPos()</code> returns the
34
+ three values as an <code class="classname">Array</code>, e.g.:</p><pre class="programlisting">x, y, buttons = aWindow.getCursorPos()</pre><p>The following table shows how these kinds of functions are
35
+ implemented in FXRuby:</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><thead><tr><th align="center">Instance Method</th><th align="center">Return Value</th></tr></thead><tbody><tr><td><code class="methodname">FXDial#range</code></td><td>Returns a <code class="classname">Range</code> instance.</td></tr><tr><td><code class="methodname">FXDial#range=(aRange)</code></td><td>Accepts a <code class="classname">Range</code> instance as its
36
+ input.</td></tr><tr><td><code class="methodname">FXFontDialog#fontSelection</code></td><td>Returns the <code class="classname">FXFontDesc</code>
37
+ instance</td></tr><tr><td><code class="methodname">FXFontSelector#fontSelection</code></td><td>Returns the <code class="classname">FXFontDesc</code>
38
+ instance</td></tr><tr><td><code class="methodname">FXGLObject#bounds(range)</code></td><td>Takes an <code class="classname">FXRange</code> instance as its
39
+ input and returns a (possibly modified)
40
+ <code class="classname">FXRange</code> instance.</td></tr><tr><td><code class="methodname">FXGLViewer#eyeToScreen(eye)</code></td><td>Takes an array of eye coordinates (floats) as its input and
41
+ returns the screen point coordinate as an array of integers [sx,
42
+ sy]</td></tr><tr><td><code class="methodname">FXGLViewer#getBoreVector(sx,
43
+ sy)</code></td><td>Returns the endpoint and direction vector as an array of
44
+ arrays [point, dir]</td></tr><tr><td><code class="methodname">FXGLViewer#light</code></td><td>Returns a <code class="classname">FXLight</code> instance</td></tr><tr><td><code class="methodname">FXGLViewer#viewport</code></td><td>Returns an <code class="classname">FXViewport</code>
45
+ instance.</td></tr><tr><td><code class="methodname">FXPrinterDialog#printer</code></td><td>Returns the <code class="classname">FXPrinter</code>
46
+ instance</td></tr><tr><td><code class="methodname">FXScrollArea#position</code></td><td>Returns the position as an array of integers [x, y]</td></tr><tr><td><code class="methodname">FXSlider#range</code></td><td>Returns a <code class="classname">Range</code> instance.</td></tr><tr><td><code class="methodname">FXSlider#range=(aRange)</code></td><td>Accepts a <code class="classname">Range</code> instance as its
47
+ input.</td></tr><tr><td><code class="methodname">FXSpinner#range</code></td><td>Returns a <code class="classname">Range</code> instance.</td></tr><tr><td><code class="methodname">FXSpinner#range=(aRange)</code></td><td>Accepts a <code class="classname">Range</code> instance as its
48
+ input.</td></tr><tr><td><code class="methodname">FXText#appendText(text,
49
+ notify=false)</code></td><td>Append text to the end of the buffer.</td></tr><tr><td><code class="methodname">FXText#appendStyledText(text, style=0,
50
+ notify=false)</code></td><td>Append styled text to the end of the buffer.</td></tr><tr><td><code class="methodname">FXText#extractText(pos, n)</code></td><td>Extracts <span class="emphasis"><em>n</em></span> characters from the buffer
51
+ beginning at position <span class="emphasis"><em>pos</em></span> and returns the
52
+ result as a String.</td></tr><tr><td><code class="methodname">FXText#extractStyle(pos,
53
+ n)</code></td><td>Extracts <span class="emphasis"><em>n</em></span> style characters from the
54
+ buffer beginning at position <span class="emphasis"><em>pos</em></span> and returns
55
+ the result as a String.</td></tr><tr><td><code class="methodname">FXText#insertText(pos, text,
56
+ notify=false)</code></td><td>Insert <span class="emphasis"><em>text</em></span> at position
57
+ <span class="emphasis"><em>pos</em></span> in the buffer.</td></tr><tr><td><code class="methodname">FXText#insertStyledText(pos, text, style=0,
58
+ notify=false)</code></td><td>Insert <span class="emphasis"><em>text</em></span> at position
59
+ <span class="emphasis"><em>pos</em></span> in the buffer.</td></tr><tr><td><code class="methodname">FXText#replaceText(pos, m, text,
60
+ notify=false)</code></td><td>Replace <span class="emphasis"><em>m</em></span> characters at
61
+ <span class="emphasis"><em>pos</em></span> by <span class="emphasis"><em>text</em></span>.</td></tr><tr><td><code class="methodname">FXText#replaceStyledText(pos, m, text, style=0,
62
+ notify=false)</code></td><td>Replace <span class="emphasis"><em>m</em></span> characters at
63
+ <span class="emphasis"><em>pos</em></span> by <span class="emphasis"><em>text</em></span>.</td></tr><tr><td><code class="methodname">FXText#setDelimiters(delimiters)</code></td><td>Change delimiters of words (<span class="emphasis"><em>delimiters</em></span>
64
+ is a string).</td></tr><tr><td><code class="methodname">FXText#getDelimiters()</code></td><td>Return word delimiters as a string.</td></tr><tr><td><code class="methodname">FXWindow#cursorPosition</code></td><td>Returns an array of integers [x, y, buttons]</td></tr><tr><td><code class="methodname">FXWindow#translateCoordinatesFrom(window, x,
65
+ y)</code></td><td>Returns the translated coordinates as an array [x,
66
+ y]</td></tr><tr><td><code class="methodname">FXWindow#translateCoordinatesTo(window, x,
67
+ y)</code></td><td>Returns the translated coordinates as an array [x,
68
+ y]</td></tr></tbody></table></div></div><div class="simplesect" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e4993"></a>Iterators</h2></div></div></div><p>Several classes have been extended with an
69
+ <code class="methodname">each</code> method to provide Ruby-style iterators.
70
+ These classes include <code class="classname">FXComboBox</code>,
71
+ <code class="classname">FXGLGroup</code>, <code class="classname">FXHeader</code>,
72
+ <code class="classname">FXIconList</code>, <code class="classname">FXList</code>,
73
+ <code class="classname">FXListBox</code>, <code class="classname">FXTreeItem</code>,
74
+ <code class="classname">FXTreeList</code> and
75
+ <code class="classname">FXTreeListBox</code>. These classes also mix-in Ruby's
76
+ <code class="classname">Enumerable</code> module so that you can take full
77
+ advantage of the iterators.</p><p>The block parameters passed to your code block vary depending on the
78
+ class. For example, iterating over an <code class="classname">FXList</code>
79
+ instance yields <code class="classname">FXListItem</code> parameters:</p><pre class="programlisting">aList.each { |aListItem|
80
+ puts "text for this item = #{aListItem.getText()}"
81
+ }</pre><p>whereas iterating over an <code class="classname">FXComboBox</code> instance
82
+ yields two parameters, the item text (a string) and the item data:</p><pre class="programlisting">aComboBox.each { |itemText, itemData|
83
+ puts "text for this item = #{itemText}"
84
+ }</pre><p>The following table shows the block parameters for each of these
85
+ classes' iterators:</p><div class="informaltable"><table border="1"><colgroup><col><col></colgroup><thead><tr><th align="center">Class</th><th align="center">Block Parameters</th></tr></thead><tbody><tr><td><code class="classname">FXComboBox</code></td><td>the item text (a string) and user data</td></tr><tr><td><code class="classname">FXGLGroup</code></td><td>an <code class="classname">FXGLObject</code> instance</td></tr><tr><td><code class="classname">FXHeader</code></td><td>an <code class="classname">FXHeaderItem</code> instance</td></tr><tr><td><code class="classname">FXIconList</code></td><td>an <code class="classname">FXIconItem</code> instance</td></tr><tr><td><code class="classname">FXList</code></td><td>an <code class="classname">FXListItem</code> instance</td></tr><tr><td><code class="classname">FXListBox</code></td><td>the item text (a string), icon (an
86
+ <code class="classname">FXIcon</code> instance) and user data</td></tr><tr><td><code class="classname">FXTreeItem</code></td><td>an <code class="classname">FXTreeItem</code> instance</td></tr><tr><td><code class="classname">FXTreeList</code></td><td>an <code class="classname">FXTreeItem</code> instance</td></tr><tr><td><code class="classname">FXTreeListBox</code></td><td>an <code class="classname">FXTreeItem</code> instance</td></tr></tbody></table></div></div><div class="simplesect" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e5137"></a>Attribute Accessors</h2></div></div></div><p>FOX strictly handles access to all object attributes through member
87
+ functions, e.g. <code class="methodname">setBackgroundColor</code> and
88
+ <code class="methodname">getBackgroundColor</code> or
89
+ <code class="methodname">setText</code> and <code class="methodname">getText</code>.
90
+ FXRuby exposes all of these functions but also provides aliases that look
91
+ more like regular Ruby attribute accessors. The names for these accessors
92
+ are based on the FOX method names; for example,
93
+ <code class="methodname">setBackgroundColor</code> and
94
+ <code class="methodname">getBackgroundColor</code> are aliased to
95
+ <code class="methodname">backgroundColor=</code> and
96
+ <code class="methodname">backgroundColor</code>, respectively.</p><p>In many cases these aliases allow you to write more compact and
97
+ legible code. For example, consider this code snippet:</p><pre class="programlisting">aLabel.setText(aLabel.getText() + " (modified)")</pre><p>Now consider a different code snippet, using the aliased accessor
98
+ method names:</p><pre class="programlisting">aLabel.text += " (modified)"</pre><p>While these two are functionally equivalent, the latter is a bit
99
+ easier to read and understand at first glance.</p></div><div class="simplesect" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e5176"></a>Message Passing</h2></div></div></div><p>FOX message maps are implemented as static C++ class members. With
100
+ FXRuby, you just associate messages with message handlers in the class
101
+ <code class="methodname">initialize</code> method using the
102
+ <code class="methodname">FXMAPFUNC()</code>,
103
+ <code class="methodname">FXMAPTYPE()</code>,
104
+ <code class="methodname">FXMAPTYPES()</code> or
105
+ <code class="methodname">FXMAPFUNCS()</code> methods. See almost any of the
106
+ example programs for examples of how this is done.</p><p>As in C++ FOX, the last argument passed to your message handler
107
+ functions contains message-specific data. For instance, all
108
+ <code class="constant">SEL_PAINT</code> messages pass an
109
+ <code class="classname">FXEvent</code> object through this argument to give you
110
+ some information about the size of the exposed rectangle. On the other
111
+ hand, a <code class="constant">SEL_COMMAND</code> message from an
112
+ <code class="classname">FXHeader</code> object passes the index of the selected
113
+ header item through this argument. Instead of guessing what's in this last
114
+ argument, your best bet is to instead invoke a member function on the
115
+ sending object to find out what you need, instead of relying on the data
116
+ passed through this pointer. For example, if you get a
117
+ <code class="constant">SEL_COMMAND</code> message from an
118
+ <code class="classname">FXColorWell</code> object, the data passed through that
119
+ last argument is supposed to be the new RGB color value. Instead of trying
120
+ to interpret the argument's contents, just turn around and call the color
121
+ well's <code class="methodname">getRGBA()</code> member function to retrieve its
122
+ color. Similarly, if you get a <code class="constant">SEL_COMMAND</code> message
123
+ from a tree list, call its <code class="methodname">getCurrentItem()</code>
124
+ method to find out which item was selected.</p></div><div class="simplesect" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e5225"></a>Catching Operating System Signals</h2></div></div></div><p>The <code class="methodname">FXApp#addSignal</code> and
125
+ <code class="methodname">FXApp#removeSignal</code> methods have been enhanced to
126
+ accept either a string or integer as their first argument. If it's a
127
+ string (e.g. "SIGINT" or just "INT") the code will determine the
128
+ corresponding signal number for you (similar to the standard Ruby
129
+ library's <code class="methodname">Process.kill</code> module method). For
130
+ examples of how to use this, see the <code class="filename">datatarget.rb</code> or
131
+ <code class="filename">imageviewer.rb</code> example programs.</p></div><div class="simplesect" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e5245"></a>Support for Multithreaded Applications</h2></div></div></div><p>There is some support for multithreaded FXRuby applications, but
132
+ it's not wonderful. The current implementation does what is also done in
133
+ Ruby/GTK; it turns over some idle processing time to the Ruby thread
134
+ scheduler to let other threads do their thing. As I learn more about
135
+ Ruby's threading implementation I may try something different, but this
136
+ seems to work OK for now. For a simple example, see the
137
+ <code class="filename">groupbox.rb</code> example program, in which the clock label
138
+ that appears in the lower right-hand corner is continuously updated (by a
139
+ separate thread).</p><p>If you suspect that FXRuby's threads support is interfering with
140
+ your application's performance, you may want to try tweaking the amount of
141
+ time that the main application thread "sleeps" during idle processing; do
142
+ this by setting the <code class="classname">FXApp</code> object's
143
+ <em class="structfield"><code>sleepTime</code></em> attribute. The default value for
144
+ <em class="structfield"><code>FXApp#sleepTime</code></em> is 100 milliseconds. You can
145
+ also disable the threads support completely by calling
146
+ <code class="methodname">FXApp#threadsEnabled=false</code> (and subsequently
147
+ re-enable it with
148
+ <code class="methodname">FXApp#threadsEnabled=true</code>).</p></div><div class="simplesect" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e5270"></a>Keyword-Style Arguments</h2></div></div></div><p>FXRuby 1.6.5 introduced preliminary, experimental support for using
149
+ keyword-style arguments in FXRuby method calls. The current implementation
150
+ of this feature only works for class constructors (i.e. the "new" class
151
+ methods), but the intent is to gradually extend this feature so that it
152
+ covers all FXRuby methods.</p><p>What this means in practice is that for calls to methods that have
153
+ one or more optional arguments, you can replace all of the optional
154
+ arguments with a hash that sets only the values for which the default
155
+ isn't appropriate. So, for example, consider a typical call to
156
+ <code class="methodname">FXMainWindow.new</code>:</p><pre class="programlisting">main = FXMainWindow.new(app, "Title Goes Here", nil, nil, DECOR_ALL, 0, 0, 800, 600)</pre><p>In this case, the programmer wants to set the initial window width
157
+ and height to 800 and 600. In order to do that (with the current release
158
+ of FXRuby), however, she's required to fill in all of the optional
159
+ arguments in between the window title string and the width and height
160
+ values. As anyone who's worked with FXRuby for any amount of time will
161
+ tell you, it's easy to accidentally leave out one of those intermediate
162
+ arguments and it can be difficult to figure out what's wrong
163
+ afterwards.</p><p>Now consider how this method call could be written using the new
164
+ keyword arguments support. First, the programmer would need to require the
165
+ keyword arguments library:</p><pre class="programlisting">require 'fox16/kwargs'</pre><p>Then she would look up the API documentation for the
166
+ <code class="methodname">FXMainWindow#initialize</code> method (e.g. <a xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.fxruby.org/doc/api/classes/Fox/FXMainWindow.html" target="_top">here</a>)
167
+ and see that the names of the width and height arguments are, in fact,
168
+ "width" and "height". Armed with that information, she would be able to
169
+ rewrite the previous code as:</p><pre class="programlisting">main = FXMainWindow.new(app, "Title Goes Here", :width =&gt; 800, :height =&gt; 600)</pre><p>Here, the programmer has omitted the intermediate optional arguments
170
+ (thus accepting their default values) and specified only the width and
171
+ height values. This code is obviously a lot more readable and
172
+ maintainable.</p><p>It is important to observe the difference between required and
173
+ optional arguments when using this feature. If the API documentation for a
174
+ particular method doesn't indicate that an argument has a default value,
175
+ then it is by definition not an optional argument. So one could
176
+ <span class="emphasis"><em>not</em></span> write the example as, e.g.</p><pre class="programlisting">main = FXMainWindow.new(app, :width =&gt; 800, :title =&gt; "Title Goes Here", :height =&gt; 600)</pre><p>This example is incorrect because the title argument is required,
177
+ and it must be the second argument in the call. Obviously, this means that
178
+ the optional arguments in a method call (if they're specified) will always
179
+ follow all of the required arguments.</p><p>Finally, note that the keyword arguments feature has been
180
+ implemented so that it's backwards-compatible with the original positional
181
+ arguments scheme (or it's intended to be, at any rate). What that means is
182
+ that you can immediately start making use of this feature in your existing
183
+ code, even if you don't have time to update all of the method calls to use
184
+ keyword arguments.</p></div><div class="simplesect" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e5311"></a>Debugging Tricks</h2></div></div></div><p>As a debugging tool, you can optionally catch exceptions raised in
185
+ message handlers. To turn on this feature, call the
186
+ <code class="methodname">setIgnoreExceptions(true)</code> module method. When
187
+ this is enabled, any exceptions raised in message handler functions will
188
+ cause a standard stack trace to be dumped to the standard output, but then
189
+ your application will, for better or worse, proceed normally. Thanks to
190
+ Ted Meng for this suggestion.</p></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="scintilla.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="pt02.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="library.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Appendix&nbsp;B.&nbsp;Using Scintilla with FXRuby&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="book.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;Appendix&nbsp;D.&nbsp;The FXRuby Standard Library</td></tr></table></div></body></html>
@@ -0,0 +1,263 @@
1
+ <html><head>
2
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3
+ <title>Chapter&nbsp;5.&nbsp;Drag and Drop</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="ch04s04.html" title="Pasting Data from the Clipboard"><link rel="next" href="ch05s02.html" title="Drag Sources"></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;5.&nbsp;Drag and Drop</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch04s04.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="ch05s02.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="dragdroptut"></a>Chapter&nbsp;5.&nbsp;Drag and Drop</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="section"><a href="dragdroptut.html#d0e1218">Drop Sites</a></span></dt><dt><span class="section"><a href="ch05s02.html">Drag Sources</a></span></dt><dt><span class="section"><a href="ch05s03.html">Putting It All Together</a></span></dt></dl></div><p>One of the more powerful features available to FOX applications is
4
+ drag-and-drop. It's also one of the more complicated to understand. For more
5
+ background, see the standard FOX documentation on <a xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.fox-toolkit.com/draganddrop.html" target="_top">Drag and
6
+ Drop</a>.</p><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e1218"></a>Drop Sites</h2></div></div></div><p>We're going to start by presenting a skeleton application consisting
7
+ of a main window widget (a <code class="classname">DropSite</code> instance) that
8
+ parents an <code class="classname">FXCanvas</code> widget:</p><pre class="programlisting">require 'fox16'
9
+
10
+ include Fox
11
+
12
+ class DropSite &lt; FXMainWindow
13
+ def initialize(anApp)
14
+ # Initialize base class
15
+ super(anApp, "Drop Site", :opts =&gt; DECOR_ALL, :width =&gt; 400, :height =&gt; 300)
16
+
17
+ # Fill main window with canvas
18
+ @canvas = FXCanvas.new(self, :opts =&gt; LAYOUT_FILL_X|LAYOUT_FILL_Y)
19
+ end
20
+
21
+ def create
22
+ # Create the main window and canvas
23
+ super
24
+
25
+ # Show the main window
26
+ show(PLACEMENT_SCREEN)
27
+ end
28
+ end
29
+
30
+ if __FILE__ == $0
31
+ FXApp.new("DropSite", "FXRuby") do |theApp|
32
+ DropSite.new(theApp)
33
+ theApp.create
34
+ theApp.run
35
+ end
36
+ end
37
+ </pre><p>Since the main program (i.e. the part at the end) won't change for
38
+ the rest of the tutorial, I won't show that code anymore. Since an
39
+ <code class="classname">FXCanvas</code> widget relies on some other object (its
40
+ message target) to draw its contents, we need to handle
41
+ <code class="constant">SEL_PAINT</code> messages generated by the canvas. We'll do
42
+ that by adding a handler that clears the canvas to its current background
43
+ color:</p><pre class="programlisting">require 'fox16'
44
+
45
+ include Fox
46
+
47
+ class DropSite &lt; FXMainWindow
48
+ def initialize(anApp)
49
+ # Initialize base class
50
+ super(anApp, "Drop Site", :opts =&gt; DECOR_ALL, :width =&gt; 400, :height =&gt; 300)
51
+
52
+ # Fill main window with canvas
53
+ @canvas = FXCanvas.new(self, :opts =&gt; LAYOUT_FILL_X|LAYOUT_FILL_Y)
54
+
55
+ <span class="bold"><strong> # Handle expose events on the canvas
56
+ @canvas.connect(SEL_PAINT) do |sender, sel, event|
57
+ FXDCWindow.new(@canvas, event) do |dc|
58
+ dc.foreground = @canvas.backColor
59
+ dc.fillRectangle(event.rect.x, event.rect.y, event.rect.w, event.rect.h)
60
+ end
61
+ end</strong></span>
62
+ end
63
+
64
+ def create
65
+ # Create the main window and canvas
66
+ super
67
+
68
+ # Show the main window
69
+ show(PLACEMENT_SCREEN)
70
+ end
71
+ end
72
+ </pre><p>Run this basic version of the program to be sure that it's working
73
+ properly so far. You should simply see an empty window with a white
74
+ background.</p><p>Now, on to the fun stuff. Our goal is to be able to drag color data
75
+ from some other window, such as an <code class="classname">FXColorWell</code>
76
+ widget, and drop it onto the canvas in order to change the canvas'
77
+ background color. In order for a FOX widget to be able to accept drops at
78
+ all, we need to first call its <code class="methodname">dropEnable</code>
79
+ method:</p><pre class="programlisting">def initialize(anApp)
80
+ # Initialize base class
81
+ super(anApp, "Drop Site", :opts =&gt; DECOR_ALL, :width =&gt; 400, :height =&gt; 300)
82
+
83
+ # Fill main window with canvas
84
+ @canvas = FXCanvas.new(self, :opts =&gt; LAYOUT_FILL_X|LAYOUT_FILL_Y)
85
+
86
+ # Handle expose events on the canvas
87
+ @canvas.connect(SEL_PAINT) do |sender, sel, event|
88
+ FXDCWindow.new(@canvas, event) do |dc|
89
+ dc.foreground = @canvas.backColor
90
+ dc.fillRectangle(event.rect.x, event.rect.y, event.rect.w, event.rect.h)
91
+ end
92
+ end
93
+
94
+ <span class="bold"><strong> # Enable canvas for drag-and-drop messages
95
+ @canvas.dropEnable
96
+ </strong></span>end
97
+ </pre><p>At this point, let's try a little test to see if the program does
98
+ anything interesting yet. Start by running some other FOX or FXRuby
99
+ program to use as a drag source for the color data. You should be able to
100
+ use any program that displays an FXColorWell widget, and this includes the
101
+ standard color dialog box shown here:</p><div class="screenshot"><div class="mediaobject" align="center"><img src="images/colordialog.png" align="middle"></div></div><p>Each of the small colored boxes near the bottom of the color dialog
102
+ box are color wells, and the large box on the left-hand side of the color
103
+ dialog box is also a color well. Now start your drag-and-drop test program
104
+ and try to drag a color from one of these color wells onto this window. At
105
+ this point, the mouse pointer should turn into a stop sign, indicating
106
+ that the canvas isn't accepting drops of color data yet.</p><p>To correct this problem, we need to use the canvas'
107
+ <code class="methodname">acceptDrop</code> method to indicate whether or not
108
+ we'll accept certain kinds of drops. You can call
109
+ <code class="methodname">acceptDrop</code> any time after receiving the initial
110
+ <code class="constant">SEL_DND_ENTER</code> message, but it's usually done in
111
+ response to a <code class="constant">SEL_DND_MOTION</code> message. Let's add a
112
+ handler for <code class="constant">SEL_DND_MOTION</code> messages from the canvas
113
+ in DropSite's <code class="methodname">initialize</code> method. For now, we'll unconditionally accept
114
+ drops from any drag source, regardless of what kind of data they're
115
+ offering:</p><pre class="programlisting">def initialize(anApp)
116
+ # Initialize base class
117
+ super(anApp, "Drop Site", :opts =&gt; DECOR_ALL, :width =&gt; 400, :height =&gt; 300)
118
+
119
+ # Fill main window with canvas
120
+ @canvas = FXCanvas.new(self, :opts =&gt; LAYOUT_FILL_X|LAYOUT_FILL_Y)
121
+
122
+ # Handle expose events on the canvas
123
+ @canvas.connect(SEL_PAINT) do |sender, sel, event|
124
+ FXDCWindow.new(@canvas, event) do |dc|
125
+ dc.foreground = @canvas.backColor
126
+ dc.fillRectangle(event.rect.x, event.rect.y, event.rect.w, event.rect.h)
127
+ end
128
+ end
129
+
130
+ # Enable canvas for drag-and-drop messages
131
+ @canvas.dropEnable
132
+
133
+ <span class="bold"><strong> # Handle SEL_DND_MOTION messages from the canvas
134
+ @canvas.connect(SEL_DND_MOTION) do
135
+ # Accept drops unconditionally (for now)
136
+ @canvas.acceptDrop
137
+ end
138
+ </strong></span>end
139
+ </pre><p>Now try the previous test again. This time, when you try to drag
140
+ from a color well to the drop-enabled canvas, you should see the mouse
141
+ pointer turn into a small filled square. This is a visual cue to the user
142
+ indicating that the canvas will accept a drop of the drag-and-drop
143
+ data.</p><p>Now it's time to get more specific about what kind of data is being
144
+ dragged between these applications, and how to process that data. So far,
145
+ our drop-enabled canvas merely knows that you're dragging some kind of
146
+ data from a drag source, but it doesn't know what kind of data it is. We
147
+ really need to be more exclusive about what kinds of data are acceptable.
148
+ FOX uses unique drag types to distinguish between different kinds of
149
+ "draggable" data. As you'll see later, you have the freedom to define drag
150
+ types for any kind of application-specific data that you need; but for
151
+ now, we're going to use FOX's built-in drag type for color data.</p><p>Drag types (even the standard ones) must be registered before they
152
+ can be used, and so we'll start by adding a few lines to
153
+ <code class="classname">DropSite</code>'s <code class="methodname">create</code> method
154
+ to register the drag type for color data:</p><pre class="programlisting">def create
155
+ # Create the main window and canvas
156
+ super
157
+
158
+ <span class="bold"><strong> # Register the drag type for colors
159
+ FXWindow.colorType = getApp().registerDragType(FXWindow.colorTypeName)
160
+
161
+ </strong></span> # Show the main window
162
+ show(PLACEMENT_SCREEN)
163
+ end
164
+ </pre><p>Note that the first time that
165
+ <code class="methodname">registerDragType</code> is called for a particular
166
+ drag type name (such as <code class="methodname">FXWindow.colorTypeName</code>)
167
+ it will generate a unique identifier for that drag type. Subsequent calls
168
+ to <code class="methodname">registerDragType</code> for the same drag type name
169
+ will just return the previously-generated drag type. Now, we want to
170
+ modify our <code class="constant">SEL_DND_MOTION</code> handler so that it's a
171
+ little more picky about which kinds of drops it will accept:</p><pre class="programlisting"># Handle SEL_DND_MOTION messages from the canvas
172
+ @canvas.connect(SEL_DND_MOTION) do
173
+ <span class="bold"><strong> if @canvas.offeredDNDType?(FROM_DRAGNDROP, FXWindow.colorType)
174
+ @canvas.acceptDrop
175
+ end
176
+ </strong></span>end
177
+ </pre><p>Here, we call the canvas' <code class="methodname">offeredDNDType?</code>
178
+ method to ask if the drag source can provide its data in the requested
179
+ format. Only if <code class="methodname">offeredDNDType?</code> returns true will
180
+ we call <code class="methodname">acceptDrop</code> as before.</p><p>The last step is to actually handle the drop, and for that we add a
181
+ handler for the <code class="constant">SEL_DND_DROP</code> message:</p><pre class="programlisting"><span class="bold"><strong># Handle SEL_DND_DROP message from the canvas
182
+ @canvas.connect(SEL_DND_DROP) do
183
+ # Try to obtain the data as color values first
184
+ data = @canvas.getDNDData(FROM_DRAGNDROP, FXWindow.colorType)
185
+ unless data.nil?
186
+ # Update canvas background color
187
+ @canvas.backColor = Fox.fxdecodeColorData(data)
188
+ end
189
+ end</strong></span></pre><p>Assuming that the drag source is able to provide its data in the
190
+ requested format, the <code class="methodname">getDNDData</code> method will
191
+ return a string (which for our purposes is just a byte buffer). If you've
192
+ defined your own application-specific drag types, this data can of course
193
+ be anything, and we'll see examples of this in a later tutorial. But the
194
+ data for standard drag types like
195
+ <code class="methodname">FXWindow.colorType</code> can be decoded using the
196
+ appropriate built-in library functions. In this case, we use the
197
+ <code class="methodname">fxdecodeColorData</code> method to convert the bytes
198
+ into a color value that we can use.</p><p>Now comes the moment of truth. Try running your test program again
199
+ (one that displays a color well). Now, when you drag a color from a color
200
+ well and drop it onto the <code class="classname">DropSite</code> window, the
201
+ canvas should change its background color accordingly.</p><p>The complete program is listed below, and is included in the
202
+ <code class="filename">examples</code> directory under the file
203
+ name <code class="filename">dropsite.rb</code>.</p><pre class="programlisting">require 'fox16'
204
+
205
+ include Fox
206
+
207
+ class DropSite &lt; FXMainWindow
208
+ def initialize(anApp)
209
+ # Initialize base class
210
+ super(anApp, "Drop Site", :opts =&gt; DECOR_ALL, :width =&gt; 400, :height =&gt; 300)
211
+
212
+ # Fill main window with canvas
213
+ @canvas = FXCanvas.new(self, :opts =&gt; LAYOUT_FILL_X|LAYOUT_FILL_Y)
214
+
215
+ # Handle expose events on the canvas
216
+ @canvas.connect(SEL_PAINT) do |sender, sel, event|
217
+ FXDCWindow.new(@canvas, event) do |dc|
218
+ dc.foreground = @canvas.backColor
219
+ dc.fillRectangle(event.rect.x, event.rect.y, event.rect.w, event.rect.h)
220
+ end
221
+ end
222
+
223
+ # Enable canvas for drag-and-drop messages
224
+ @canvas.dropEnable
225
+
226
+ # Handle SEL_DND_MOTION messages from the canvas
227
+ @canvas.connect(SEL_DND_MOTION) do
228
+ if @canvas.offeredDNDType?(FROM_DRAGNDROP, FXWindow.colorType)
229
+ @canvas.acceptDrop
230
+ end
231
+ end
232
+
233
+ # Handle SEL_DND_DROP message from the canvas
234
+ @canvas.connect(SEL_DND_DROP) do
235
+ # Try to obtain the data as color values first
236
+ data = @canvas.getDNDData(FROM_DRAGNDROP, FXWindow.colorType)
237
+ unless data.nil?
238
+ # Update canvas background color
239
+ @canvas.backColor = Fox.fxdecodeColorData(data)
240
+ end
241
+ end
242
+ end
243
+
244
+ def create
245
+ # Create the main window and canvas
246
+ super
247
+
248
+ # Register the drag type for colors
249
+ FXWindow.colorType = getApp().registerDragType(FXWindow.colorTypeName)
250
+
251
+ # Show the main window
252
+ show(PLACEMENT_SCREEN)
253
+ end
254
+ end
255
+
256
+ if __FILE__ == $0
257
+ FXApp.new("DropSite", "FXRuby") do |theApp|
258
+ DropSite.new(theApp)
259
+ theApp.create
260
+ theApp.run
261
+ end
262
+ end
263
+ </pre></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch04s04.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="ch05s02.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Pasting Data from 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;Drag Sources</td></tr></table></div></body></html>