fxruby 1.6.15-x86-mswin32-60

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 (490) 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 +733 -0
  17. data/doc/clipboardtut.html +67 -0
  18. data/doc/differences.html +190 -0
  19. data/doc/dragdroptut.html +263 -0
  20. data/doc/events.html +36 -0
  21. data/doc/examples.html +104 -0
  22. data/doc/gems.html +73 -0
  23. data/doc/goals.html +41 -0
  24. data/doc/images/babelfish.png +0 -0
  25. data/doc/images/browser.png +0 -0
  26. data/doc/images/button.png +0 -0
  27. data/doc/images/call-chain-example.png +0 -0
  28. data/doc/images/colordialog.png +0 -0
  29. data/doc/images/datatarget.png +0 -0
  30. data/doc/images/dialog.png +0 -0
  31. data/doc/images/dilbert.png +0 -0
  32. data/doc/images/dirlist.png +0 -0
  33. data/doc/images/dropsite-droprejected.png +0 -0
  34. data/doc/images/foursplit.png +0 -0
  35. data/doc/images/gltest.png +0 -0
  36. data/doc/images/glviewer.png +0 -0
  37. data/doc/images/groupbox.png +0 -0
  38. data/doc/images/header.png +0 -0
  39. data/doc/images/hello-with-button.png +0 -0
  40. data/doc/images/hello-with-icon-1.png +0 -0
  41. data/doc/images/hello-with-icon-2.png +0 -0
  42. data/doc/images/hello-with-icon-3.png +0 -0
  43. data/doc/images/hello-with-tooltip.png +0 -0
  44. data/doc/images/hello-without-button.png +0 -0
  45. data/doc/images/hello.png +0 -0
  46. data/doc/images/hello2.png +0 -0
  47. data/doc/images/iconlist-bigicons.png +0 -0
  48. data/doc/images/iconlist-details.png +0 -0
  49. data/doc/images/image.png +0 -0
  50. data/doc/images/imageviewer.png +0 -0
  51. data/doc/images/inheritance.png +0 -0
  52. data/doc/images/mditest.png +0 -0
  53. data/doc/images/raabrowser.png +0 -0
  54. data/doc/images/scribble.png +0 -0
  55. data/doc/images/shutter.png +0 -0
  56. data/doc/images/splitter.png +0 -0
  57. data/doc/images/tabbook.png +0 -0
  58. data/doc/images/table.png +0 -0
  59. data/doc/images/tutorial1.png +0 -0
  60. data/doc/implementation.html +16 -0
  61. data/doc/infosources.html +33 -0
  62. data/doc/library.html +30 -0
  63. data/doc/opengl.html +73 -0
  64. data/doc/pt01.html +3 -0
  65. data/doc/pt02.html +3 -0
  66. data/doc/scintilla.html +36 -0
  67. data/doc/style.css +247 -0
  68. data/doc/subversion.html +21 -0
  69. data/doc/tutorial1.html +90 -0
  70. data/doc/unicode.html +56 -0
  71. data/examples/RAA.rb +25 -0
  72. data/examples/README +53 -0
  73. data/examples/babelfish.rb +72 -0
  74. data/examples/bounce.rb +159 -0
  75. data/examples/browser.rb +191 -0
  76. data/examples/button.rb +168 -0
  77. data/examples/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.so +0 -0
  186. data/lib/fox16/aliases.rb +5611 -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 +420 -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 +214 -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 +36 -0
  281. data/rdoc-sources/FXHeader.rb +411 -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 +450 -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 +80 -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 +72 -0
  298. data/rdoc-sources/FXList.rb +443 -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 +53 -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 +73 -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 +581 -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 +39 -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 +16 -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 +63 -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_FXDialogBox.rb +12 -0
  423. data/tests/TC_FXDirList.rb +30 -0
  424. data/tests/TC_FXFileAssoc.rb +62 -0
  425. data/tests/TC_FXFileStream.rb +90 -0
  426. data/tests/TC_FXFoldingList.rb +32 -0
  427. data/tests/TC_FXFont.rb +69 -0
  428. data/tests/TC_FXFontDesc.rb +58 -0
  429. data/tests/TC_FXGLGroup.rb +32 -0
  430. data/tests/TC_FXGLShape.rb +28 -0
  431. data/tests/TC_FXGLViewer.rb +20 -0
  432. data/tests/TC_FXGradientBar.rb +89 -0
  433. data/tests/TC_FXHeader.rb +82 -0
  434. data/tests/TC_FXHiliteStyle.rb +23 -0
  435. data/tests/TC_FXIconDict.rb +52 -0
  436. data/tests/TC_FXIconList.rb +192 -0
  437. data/tests/TC_FXId.rb +19 -0
  438. data/tests/TC_FXImage.rb +155 -0
  439. data/tests/TC_FXLight.rb +33 -0
  440. data/tests/TC_FXList.rb +116 -0
  441. data/tests/TC_FXListBox.rb +49 -0
  442. data/tests/TC_FXMainWindow.rb +12 -0
  443. data/tests/TC_FXMat4f.rb +228 -0
  444. data/tests/TC_FXMaterial.rb +89 -0
  445. data/tests/TC_FXMemoryStream.rb +97 -0
  446. data/tests/TC_FXMenuCheck.rb +57 -0
  447. data/tests/TC_FXMenuCommand.rb +12 -0
  448. data/tests/TC_FXMenuRadio.rb +57 -0
  449. data/tests/TC_FXMessageBox.rb +25 -0
  450. data/tests/TC_FXPoint.rb +57 -0
  451. data/tests/TC_FXQuatf.rb +77 -0
  452. data/tests/TC_FXRadioButton.rb +57 -0
  453. data/tests/TC_FXRangef.rb +48 -0
  454. data/tests/TC_FXRectangle.rb +88 -0
  455. data/tests/TC_FXRegion.rb +54 -0
  456. data/tests/TC_FXRegistry.rb +27 -0
  457. data/tests/TC_FXScrollArea.rb +28 -0
  458. data/tests/TC_FXScrollWindow.rb +28 -0
  459. data/tests/TC_FXSegment.rb +22 -0
  460. data/tests/TC_FXSettings.rb +34 -0
  461. data/tests/TC_FXShell.rb +26 -0
  462. data/tests/TC_FXSize.rb +54 -0
  463. data/tests/TC_FXStream.rb +11 -0
  464. data/tests/TC_FXTable.rb +368 -0
  465. data/tests/TC_FXTableItem.rb +48 -0
  466. data/tests/TC_FXText.rb +96 -0
  467. data/tests/TC_FXTopWindow.rb +32 -0
  468. data/tests/TC_FXTreeList.rb +100 -0
  469. data/tests/TC_FXTreeListBox.rb +41 -0
  470. data/tests/TC_FXUndoList.rb +43 -0
  471. data/tests/TC_FXVec2d.rb +142 -0
  472. data/tests/TC_FXVec2f.rb +137 -0
  473. data/tests/TC_FXVec3d.rb +150 -0
  474. data/tests/TC_FXVec3f.rb +150 -0
  475. data/tests/TC_FXVec4f.rb +158 -0
  476. data/tests/TC_FXViewport.rb +30 -0
  477. data/tests/TC_FXXBMIcon.rb +15 -0
  478. data/tests/TC_FXXBMImage.rb +15 -0
  479. data/tests/TC_FXXPMIcon.rb +15 -0
  480. data/tests/TC_FXXPMImage.rb +15 -0
  481. data/tests/TC_Misc.rb +157 -0
  482. data/tests/TC_downcast.rb +15 -0
  483. data/tests/TS_All.rb +25 -0
  484. data/tests/blankpage.ps +166 -0
  485. data/tests/howdypage.ps +181 -0
  486. data/tests/stress1.rb +92 -0
  487. data/tests/stress2.rb +51 -0
  488. data/tests/stress3.rb +117 -0
  489. data/tests/testcase.rb +37 -0
  490. metadata +549 -0
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>
data/doc/ch05s02.html ADDED
@@ -0,0 +1,260 @@
1
+ <html><head>
2
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3
+ <title>Drag Sources</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="dragdroptut.html" title="Chapter&nbsp;5.&nbsp;Drag and Drop"><link rel="prev" href="dragdroptut.html" title="Chapter&nbsp;5.&nbsp;Drag and Drop"><link rel="next" href="ch05s03.html" title="Putting It All Together"></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">Drag Sources</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="dragdroptut.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;5.&nbsp;Drag and Drop</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch05s03.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="d0e1373"></a>Drag Sources</h2></div></div></div><p>As before, we're going to start by presenting a skeleton application
4
+ consisting of a main window widget (a <code class="classname">DragSource</code>
5
+ instance) that parents an <code class="classname">FXCanvas</code> widget:</p><pre class="programlisting">require 'fox16'
6
+
7
+ include Fox
8
+
9
+ class DragSource &lt; FXMainWindow
10
+ def initialize(anApp)
11
+ # Initialize base class
12
+ super(anApp, "Drag Source", :opts =&gt; DECOR_ALL, :width =&gt; 400, :height =&gt; 300)
13
+
14
+ # Fill main window with canvas
15
+ @canvas = FXCanvas.new(self, :opts =&gt; LAYOUT_FILL_X|LAYOUT_FILL_Y)
16
+ @canvas.backColor = "red"
17
+
18
+ # Handle expose events on the canvas
19
+ @canvas.connect(SEL_PAINT) do |sender, sel, event|
20
+ FXDCWindow.new(@canvas, event) do |dc|
21
+ dc.foreground = @canvas.backColor
22
+ dc.fillRectangle(event.rect.x, event.rect.y, event.rect.w, event.rect.h)
23
+ end
24
+ end
25
+ end
26
+
27
+ def create
28
+ # Create the main window and canvas
29
+ super
30
+
31
+ # Register the drag type for colors
32
+ FXWindow.colorType = getApp().registerDragType(FXWindow.colorTypeName)
33
+
34
+ # Show the main window
35
+ show(PLACEMENT_SCREEN)
36
+ end
37
+ end
38
+
39
+ if __FILE__ == $0
40
+ FXApp.new("DragSource", "FXRuby") do |theApp|
41
+ DragSource.new(theApp)
42
+ theApp.create
43
+ theApp.run
44
+ end
45
+ end
46
+
47
+ </pre><p>Since the main program (i.e. the part at the end) won't change for
48
+ the rest of the tutorial, I won't show that code anymore. Furthermore, the
49
+ <code class="classname">DragSource</code> class has a few things in common with
50
+ the <code class="classname">DropSite</code> class from the previous example,
51
+ namely:</p><div class="itemizedlist"><ul type="disc"><li><p>We've defined a <code class="constant">SEL_PAINT</code> handler for the
52
+ canvas widget that just clears the canvas to its current background
53
+ color; and,</p></li><li><p>The drag type for colors
54
+ (<code class="constant">FXWindow.colorType</code>) is registered in the
55
+ <code class="classname">DragSource</code>'s <code class="methodname">create</code>
56
+ method.</p></li></ul></div><p>As before, you may want to run this basic version of the program to
57
+ be sure that it's working properly so far. You should simply see an empty
58
+ window with a red background.</p><p>Now for this application, we want a drag operation to begin when the
59
+ user presses the left mouse button inside the canvas and starts "dragging"
60
+ away from the canvas. So the first change we need to make is to add a
61
+ handler for the <code class="constant">SEL_LEFTBUTTONPRESS</code> message from the
62
+ canvas:</p><pre class="programlisting">@canvas.connect(SEL_LEFTBUTTONPRESS) do
63
+ #
64
+ # Capture (grab) the mouse when the button goes down, so that all future
65
+ # mouse events will be reported to this widget, even if those events occur
66
+ # outside of this widget.
67
+ #
68
+ @canvas.grab
69
+
70
+ # Advertise which drag types we can offer
71
+ dragTypes = [FXWindow.colorType]
72
+ @canvas.beginDrag(dragTypes)
73
+ end
74
+ </pre><p>Note that there are usually two things you're going to want to do in
75
+ the <code class="constant">SEL_LEFTBUTTONPRESS</code> handler for a drag source.
76
+ The first is to call <code class="methodname">grab</code> on the window that
77
+ acts as the drag source. Calling <code class="methodname">grab</code>
78
+ "captures" the mouse in the sense that subsequent mouse motion events will
79
+ be reported as if they occurred inside the grab window. This is important,
80
+ since in our case we're going to be dragging from this window to some
81
+ other window, possibly a window in a different application
82
+ altogether.</p><p>The second thing you'll want to do in the
83
+ <code class="constant">SEL_LEFTBUTTONPRESS</code> handler for a drag source is to
84
+ call <code class="methodname">beginDrag</code>. This not only kicks the
85
+ application into drag-and-drop mode, but also provides a way for you to
86
+ inform the system about the formats of data (i.e. the drag types) that
87
+ this drag source is able to provide. For this example, the drag source is
88
+ just going to offer one drag type.</p><p>Since releasing the left mouse button should end the drag operation,
89
+ it's important to also add a handler for the
90
+ <code class="constant">SEL_LEFTBUTTONRELEASE</code> message:</p><pre class="programlisting">@canvas.connect(SEL_LEFTBUTTONRELEASE) do
91
+ @canvas.ungrab
92
+ @canvas.endDrag
93
+ end
94
+ </pre><p>This is pretty much the mirror image of our
95
+ <code class="constant">SEL_LEFTBUTTONPRESS</code> handler. We call
96
+ <code class="methodname">ungrab</code> to release the mouse capture, and
97
+ <code class="methodname">endDrag</code> to clean up the drag-and-drop
98
+ state.</p><p>The next change is to add a <code class="constant">SEL_MOTION</code> handler,
99
+ to handle mouse motion events during the drag operation:</p><pre class="programlisting">@canvas.connect(SEL_MOTION) do |sender, sel, event|
100
+ if @canvas.dragging?
101
+ @canvas.handleDrag(event.root_x, event.root_y)
102
+ unless @canvas.didAccept == DRAG_REJECT
103
+ @canvas.dragCursor = getApp().getDefaultCursor(DEF_SWATCH_CURSOR)
104
+ else
105
+ @canvas.dragCursor = getApp().getDefaultCursor(DEF_DNDSTOP_CURSOR)
106
+ end
107
+ end
108
+ end
109
+ </pre><p>The <code class="methodname">dragging?</code> method returns true if we're
110
+ in the middle of a drag-and-drop operation for the drag source window,
111
+ i.e. after the call to <code class="methodname">beginDrag</code> but before the
112
+ call to <code class="methodname">endDrag</code>. If we're not currently
113
+ processing a drag operation, we're not really interested in mouse motion
114
+ events for the canvas.</p><p>If we <span class="emphasis"><em>are</em></span> processing a drag operation, however,
115
+ we need to call <code class="methodname">handleDrag</code> on the drag source
116
+ window. FOX uses this information to send drag-and-drop messages (such as
117
+ <code class="constant">SEL_DND_ENTER</code>, <code class="constant">SEL_DND_MOTION</code>
118
+ and <code class="constant">SEL_DND_LEAVE</code>) to the window that the mouse is
119
+ currently over. Note that the coordinates passed to
120
+ <code class="methodname">handleDrag</code> are root window coordinates, and not
121
+ window-local coordinates.</p><p>Another good thing to consider doing here is to change the shape of
122
+ the cursor depending on the drop site's response to the drag-and-drop
123
+ messages from the drag source. For this example, we change the drag cursor
124
+ to one of FOX's built-in cursor shapes
125
+ (<code class="constant">DEF_SWATCH_CURSOR</code>) if we get any response other than
126
+ <code class="constant">DRAG_REJECT</code> from the drop site. If the drop site
127
+ rejects this drag source's overtures, we instead change the drag cursor to
128
+ a cursor that resembles a stop sign
129
+ (<code class="constant">DEF_DNDSTOP_CURSOR</code>).</p><p>I've purposely avoided suggesting that you run the program for the
130
+ last couple of changes, since until now there wasn't going to be any
131
+ visual indication that anything interesting was happening. But now you
132
+ should be able to run the application in its current state and see a few
133
+ things.</p><p>A first test is to confirm that the cursor shape changes to the
134
+ "stop" sign when you attempt to drag over some window that isn't willing
135
+ to accept a drop of the <code class="constant">FXWindow.colorType</code> drag type.
136
+ Start up one of the other FXRuby example programs (such as the
137
+ <code class="filename">scribble.rb</code> example) alongside your drag source
138
+ program, and then try "dragging" from the drag source's canvas onto the
139
+ Scribble program's canvas. During the drag attempt, the cursor should
140
+ maintain its shape as a "stop" sign since the canvas in the
141
+ <code class="filename">scribble.rb</code> example isn't drop-enabled.</p><p>Your next test can confirm that the cursor shape changes to the
142
+ "swatch" cursor (a small square) when you attempt to drag over a window
143
+ that is drop-enabled, and which is willing to accepts drops of this drag
144
+ type. The obvious choice is the example from the previous section (the
145
+ dropsite.rb program), but you should have success with any FXRuby example
146
+ program that displays color wells. Start up one of these drop-enabled
147
+ programs alongside your drag source program, and then try "dragging" from
148
+ the drag source's canvas onto the drop site. While the mouse pointer is
149
+ over a drop-enabled window, the cursor should change its shape.</p><p>The last (and most important) step is to actually complete the data
150
+ transfer. At any time during a drag-and-drop operation, a drop site may
151
+ request a copy of the drag-and-drop data by calling the
152
+ <code class="methodname">getDNDData</code> method (as described in the previous
153
+ section). When this happens, FOX sends a
154
+ <code class="constant">SEL_DND_REQUEST</code> message to the current drag source
155
+ window, and so we now add a handler for that message:</p><pre class="programlisting">@canvas.connect(SEL_DND_REQUEST) do |sender, sel, event|
156
+ if event.target == FXWindow.colorType
157
+ @canvas.setDNDData(FROM_DRAGNDROP, FXWindow.colorType, Fox.fxencodeColorData(@canvas.backColor))
158
+ end
159
+ end
160
+ </pre><p>The first important thing to note here is that the
161
+ <code class="varname">target</code> field of the <code class="classname">FXEvent</code>
162
+ instance will contain the drag type requested by the drop site. If your
163
+ drag source offers its data in multiple formats, you definitely need to
164
+ check this in order to know how to package-up the data for transfer.
165
+ However, even if you're only offering the data in a single format (as in
166
+ this example) it's still a good idea to check the requested type, since a
167
+ rogue drop site could ask for the data in some unexpected format.</p><p>Assuming that the drag type is as expected, the last step is send
168
+ the data to the drop site by calling
169
+ <code class="methodname">setDNDData</code>. As with the call to
170
+ <code class="methodname">getDNDData</code> for our previous drop site program,
171
+ you want to be sure to specify the origin of the data
172
+ (<code class="constant">FROM_DRAGNDROP</code>), the drag type
173
+ (<code class="constant">FXWindow.colorType</code>) and the data itself as a binary
174
+ string.</p><p>As a final test of the completed program, try dragging from this
175
+ window to some drop-enabled window (as described earlier). Now, when you
176
+ release the left mouse button to complete the "drop", the drop site should
177
+ change its color to red.</p><p>The complete program is listed below, and is included in the
178
+ <code class="filename">examples</code> directory under the file
179
+ name <code class="filename">dragsource.rb</code>.</p><pre class="programlisting">require 'fox16'
180
+
181
+ include Fox
182
+
183
+ class DragSource &lt; FXMainWindow
184
+ def initialize(anApp)
185
+ # Initialize base class
186
+ super(anApp, "Drag Source", :opts =&gt; DECOR_ALL, :width =&gt; 400, :height =&gt; 300)
187
+
188
+ # Fill main window with canvas
189
+ @canvas = FXCanvas.new(self, :opts =&gt; LAYOUT_FILL_X|LAYOUT_FILL_Y)
190
+ @canvas.backColor = "red"
191
+
192
+ # Handle expose events on the canvas
193
+ @canvas.connect(SEL_PAINT) do |sender, sel, event|
194
+ FXDCWindow.new(@canvas, event) do |dc|
195
+ dc.foreground = @canvas.backColor
196
+ dc.fillRectangle(event.rect.x, event.rect.y, event.rect.w, event.rect.h)
197
+ end
198
+ end
199
+
200
+ # Handle left button press
201
+ @canvas.connect(SEL_LEFTBUTTONPRESS) do
202
+ #
203
+ # Capture (grab) the mouse when the button goes down, so that all future
204
+ # mouse events will be reported to this widget, even if those events occur
205
+ # outside of this widget.
206
+ #
207
+ @canvas.grab
208
+
209
+ # Advertise which drag types we can offer
210
+ dragTypes = [FXWindow.colorType]
211
+ @canvas.beginDrag(dragTypes)
212
+ end
213
+
214
+ # Handle mouse motion events
215
+ @canvas.connect(SEL_MOTION) do |sender, sel, event|
216
+ if @canvas.dragging?
217
+ @canvas.handleDrag(event.root_x, event.root_y)
218
+ unless @canvas.didAccept == DRAG_REJECT
219
+ @canvas.dragCursor = getApp().getDefaultCursor(DEF_SWATCH_CURSOR)
220
+ else
221
+ @canvas.dragCursor = getApp().getDefaultCursor(DEF_DNDSTOP_CURSOR)
222
+ end
223
+ end
224
+ end
225
+
226
+ # Handle left button release
227
+ @canvas.connect(SEL_LEFTBUTTONRELEASE) do
228
+ @canvas.ungrab
229
+ @canvas.endDrag
230
+ end
231
+
232
+ # Handle request for DND data
233
+ @canvas.connect(SEL_DND_REQUEST) do |sender, sel, event|
234
+ if event.target == FXWindow.colorType
235
+ @canvas.setDNDData(FROM_DRAGNDROP, FXWindow.colorType, Fox.fxencodeColorData(@canvas.backColor))
236
+ end
237
+ end
238
+ end
239
+
240
+ def create
241
+ # Create the main window and canvas
242
+ super
243
+
244
+ # Register the drag type for colors
245
+ FXWindow.colorType = getApp().registerDragType(FXWindow.colorTypeName)
246
+
247
+ # Show the main window
248
+ show(PLACEMENT_SCREEN)
249
+ end
250
+ end
251
+
252
+ if __FILE__ == $0
253
+ FXApp.new("DragSource", "FXRuby") do |theApp|
254
+ DragSource.new(theApp)
255
+ theApp.create
256
+ theApp.run
257
+ end
258
+ end
259
+
260
+ </pre></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="dragdroptut.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="dragdroptut.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch05s03.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter&nbsp;5.&nbsp;Drag and Drop&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="book.html">Home</a></td><td width="40%" align="right" valign="top">&nbsp;Putting It All Together</td></tr></table></div></body></html>
data/doc/ch05s03.html ADDED
@@ -0,0 +1,127 @@
1
+ <html><head>
2
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3
+ <title>Putting It All Together</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="dragdroptut.html" title="Chapter&nbsp;5.&nbsp;Drag and Drop"><link rel="prev" href="ch05s02.html" title="Drag Sources"><link rel="next" href="unicode.html" title="Chapter&nbsp;6.&nbsp;Unicode and FXRuby"></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">Putting It All Together</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch05s02.html">Prev</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;5.&nbsp;Drag and Drop</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="unicode.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="d0e1567"></a>Putting It All Together</h2></div></div></div><p>We've studied drag-and-drop enabled applications from two points of
4
+ view, that of a drag source and that of a drop site. But for most
5
+ applications, you'll want a window to act as both a drag source
6
+ <span class="emphasis"><em>and</em></span> a drop site. As it turns out, this is just a
7
+ simple combination of the techniques we've already seen in the previous
8
+ sections.</p><p>If we use our completed drag source example program from the
9
+ previous section as a starting point, and then compare it to the drop site
10
+ example from the first section, it is apparent that the only "pieces"
11
+ missing are:</p><div class="itemizedlist"><ul type="disc"><li><p>A call to <code class="methodname">dropEnable</code>, to make
12
+ <code class="classname">DragSource</code>'s canvas drop-enabled;</p></li><li><p>A handler for the <code class="constant">SEL_DND_MOTION</code> message;
13
+ and,</p></li><li><p>A handler for the <code class="constant">SEL_DND_DROP</code>
14
+ message.</p></li></ul></div><p>If you merge those three short bits of code from
15
+ <code class="filename">dropsite.rb</code> into <code class="filename">dragsource.rb</code>,
16
+ you should end up with a program that can act as both a drag source and a
17
+ drop site. To test this program, you should be able to start up two
18
+ separate copies side-by-side and then drag from one to the other. Since,
19
+ as written, both copies will start up with a red background, you might
20
+ want to modify one of them to have a different initial backgroud color.
21
+ Another interesting possibility is to start up a third program (such as an
22
+ FXRuby example that has displays a color dialog) and drag colors back and
23
+ forth between all three programs. You could spend days doing this and
24
+ never leave the house.</p><p>The complete program is listed below, and is included in the
25
+ <code class="filename">examples</code> directory under the file
26
+ name <code class="filename">dragdrop.rb</code>.</p><pre class="programlisting">require 'fox16'
27
+
28
+ include Fox
29
+
30
+ class DragDropWindow &lt; FXMainWindow
31
+ def initialize(anApp)
32
+ # Initialize base class
33
+ super(anApp, "Drag and Drop", :opts =&gt; DECOR_ALL, :width =&gt; 400, :height =&gt; 300)
34
+
35
+ # Fill main window with canvas
36
+ @canvas = FXCanvas.new(self, :opts =&gt; LAYOUT_FILL_X|LAYOUT_FILL_Y)
37
+ @canvas.backColor = "red"
38
+
39
+ # Enable canvas for drag-and-drop messages
40
+ @canvas.dropEnable
41
+
42
+ # Handle expose events on the canvas
43
+ @canvas.connect(SEL_PAINT) do |sender, sel, event|
44
+ FXDCWindow.new(@canvas, event) do |dc|
45
+ dc.foreground = @canvas.backColor
46
+ dc.fillRectangle(event.rect.x, event.rect.y, event.rect.w, event.rect.h)
47
+ end
48
+ end
49
+
50
+ # Handle left button press
51
+ @canvas.connect(SEL_LEFTBUTTONPRESS) do
52
+ #
53
+ # Capture (grab) the mouse when the button goes down, so that all future
54
+ # mouse events will be reported to this widget, even if those events occur
55
+ # outside of this widget.
56
+ #
57
+ @canvas.grab
58
+
59
+ # Advertise which drag types we can offer
60
+ dragTypes = [FXWindow.colorType]
61
+ @canvas.beginDrag(dragTypes)
62
+ end
63
+
64
+ # Handle mouse motion events
65
+ @canvas.connect(SEL_MOTION) do |sender, sel, event|
66
+ if @canvas.dragging?
67
+ @canvas.handleDrag(event.root_x, event.root_y)
68
+ unless @canvas.didAccept == DRAG_REJECT
69
+ @canvas.dragCursor = getApp().getDefaultCursor(DEF_SWATCH_CURSOR)
70
+ else
71
+ @canvas.dragCursor = getApp().getDefaultCursor(DEF_DNDSTOP_CURSOR)
72
+ end
73
+ end
74
+ end
75
+
76
+ # Handle SEL_DND_MOTION messages from the canvas
77
+ @canvas.connect(SEL_DND_MOTION) do
78
+ if @canvas.offeredDNDType?(FROM_DRAGNDROP, FXWindow.colorType)
79
+ @canvas.acceptDrop
80
+ end
81
+ end
82
+
83
+ # Handle left button release
84
+ @canvas.connect(SEL_LEFTBUTTONRELEASE) do
85
+ @canvas.ungrab
86
+ @canvas.endDrag
87
+ end
88
+
89
+ # Handle SEL_DND_DROP message from the canvas
90
+ @canvas.connect(SEL_DND_DROP) do
91
+ # Try to obtain the data as color values first
92
+ data = @canvas.getDNDData(FROM_DRAGNDROP, FXWindow.colorType)
93
+ unless data.nil?
94
+ # Update canvas background color
95
+ @canvas.backColor = Fox.fxdecodeColorData(data)
96
+ end
97
+ end
98
+
99
+ # Handle request for DND data
100
+ @canvas.connect(SEL_DND_REQUEST) do |sender, sel, event|
101
+ if event.target == FXWindow.colorType
102
+ @canvas.setDNDData(FROM_DRAGNDROP, FXWindow.colorType, Fox.fxencodeColorData(@canvas.backColor))
103
+ end
104
+ end
105
+ end
106
+
107
+ def create
108
+ # Create the main window and canvas
109
+ super
110
+
111
+ # Register the drag type for colors
112
+ FXWindow.colorType = getApp().registerDragType(FXWindow.colorTypeName)
113
+
114
+ # Show the main window
115
+ show(PLACEMENT_SCREEN)
116
+ end
117
+ end
118
+
119
+ if __FILE__ == $0
120
+ FXApp.new("DragDrop", "FXRuby") do |theApp|
121
+ DragDropWindow.new(theApp)
122
+ theApp.create
123
+ theApp.run
124
+ end
125
+ end
126
+
127
+ </pre></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch05s02.html">Prev</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="dragdroptut.html">Up</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="unicode.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Drag Sources&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;6.&nbsp;Unicode and FXRuby</td></tr></table></div></body></html>