fxruby 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (692) hide show
  1. data/ANNOUNCE +25 -0
  2. data/ChangeLog +10606 -0
  3. data/INSTALL +50 -0
  4. data/LICENSE +456 -0
  5. data/README +39 -0
  6. data/doc/apes02.html +21 -0
  7. data/doc/apes03.html +39 -0
  8. data/doc/book.html +3 -0
  9. data/doc/build.html +144 -0
  10. data/doc/ch03s02.html +24 -0
  11. data/doc/ch03s03.html +53 -0
  12. data/doc/ch03s04.html +37 -0
  13. data/doc/ch03s05.html +61 -0
  14. data/doc/ch04s02.html +72 -0
  15. data/doc/ch04s03.html +37 -0
  16. data/doc/ch04s04.html +72 -0
  17. data/doc/ch05s02.html +262 -0
  18. data/doc/ch05s03.html +128 -0
  19. data/doc/changes.html +75 -0
  20. data/doc/clipboardtut.html +68 -0
  21. data/doc/cvs.html +35 -0
  22. data/doc/differences.html +11 -0
  23. data/doc/dragdroptut.html +266 -0
  24. data/doc/events.html +36 -0
  25. data/doc/examples.html +104 -0
  26. data/doc/gems.html +73 -0
  27. data/doc/goals.html +39 -0
  28. data/doc/images/babelfish.png +0 -0
  29. data/doc/images/browser.png +0 -0
  30. data/doc/images/button.png +0 -0
  31. data/doc/images/call-chain-example.png +0 -0
  32. data/doc/images/colordialog.png +0 -0
  33. data/doc/images/datatarget.png +0 -0
  34. data/doc/images/dialog.png +0 -0
  35. data/doc/images/dilbert.png +0 -0
  36. data/doc/images/dirlist.png +0 -0
  37. data/doc/images/dropsite-droprejected.png +0 -0
  38. data/doc/images/foursplit.png +0 -0
  39. data/doc/images/gltest.png +0 -0
  40. data/doc/images/glviewer.png +0 -0
  41. data/doc/images/groupbox.png +0 -0
  42. data/doc/images/header.png +0 -0
  43. data/doc/images/hello-with-button.png +0 -0
  44. data/doc/images/hello-with-icon-1.png +0 -0
  45. data/doc/images/hello-with-icon-2.png +0 -0
  46. data/doc/images/hello-with-icon-3.png +0 -0
  47. data/doc/images/hello-with-tooltip.png +0 -0
  48. data/doc/images/hello-without-button.png +0 -0
  49. data/doc/images/hello.png +0 -0
  50. data/doc/images/hello2.png +0 -0
  51. data/doc/images/iconlist-bigicons.png +0 -0
  52. data/doc/images/iconlist-details.png +0 -0
  53. data/doc/images/image.png +0 -0
  54. data/doc/images/imageviewer.png +0 -0
  55. data/doc/images/inheritance.png +0 -0
  56. data/doc/images/mditest.png +0 -0
  57. data/doc/images/raabrowser.png +0 -0
  58. data/doc/images/scribble.png +0 -0
  59. data/doc/images/shutter.png +0 -0
  60. data/doc/images/splitter.png +0 -0
  61. data/doc/images/tabbook.png +0 -0
  62. data/doc/images/table.png +0 -0
  63. data/doc/images/tutorial1.png +0 -0
  64. data/doc/implementation.html +16 -0
  65. data/doc/infosources.html +33 -0
  66. data/doc/library.html +30 -0
  67. data/doc/opengl.html +73 -0
  68. data/doc/pt01.html +3 -0
  69. data/doc/pt02.html +3 -0
  70. data/doc/scintilla.html +36 -0
  71. data/doc/todo.html +40 -0
  72. data/doc/tutorial1.html +97 -0
  73. data/examples/RAA.rb +25 -0
  74. data/examples/README +53 -0
  75. data/examples/babelfish.rb +107 -0
  76. data/examples/bounce.rb +159 -0
  77. data/examples/browser.rb +191 -0
  78. data/examples/button.rb +160 -0
  79. data/examples/datatarget.rb +223 -0
  80. data/examples/dctest.rb +702 -0
  81. data/examples/dialog.rb +148 -0
  82. data/examples/dilbert.rb +105 -0
  83. data/examples/dirlist.rb +63 -0
  84. data/examples/dragdrop.rb +101 -0
  85. data/examples/dragsource.rb +81 -0
  86. data/examples/dropsite.rb +61 -0
  87. data/examples/foursplit.rb +103 -0
  88. data/examples/gltest.rb +342 -0
  89. data/examples/glviewer.rb +579 -0
  90. data/examples/groupbox.rb +422 -0
  91. data/examples/header.rb +150 -0
  92. data/examples/hello.rb +12 -0
  93. data/examples/hello2.rb +51 -0
  94. data/examples/iRAA.rb +153 -0
  95. data/examples/iconlist.rb +104 -0
  96. data/examples/icons/AngryGuyInBunnySuit.ico +0 -0
  97. data/examples/icons/FatBot.ico +0 -0
  98. data/examples/icons/FlippedySwitch.ico +0 -0
  99. data/examples/icons/LeGoon.ico +0 -0
  100. data/examples/icons/Net.ico +0 -0
  101. data/examples/icons/RedMacOS.ico +0 -0
  102. data/examples/icons/SawBlade.ico +0 -0
  103. data/examples/icons/backview.png +0 -0
  104. data/examples/icons/big.png +0 -0
  105. data/examples/icons/bigfolder.png +0 -0
  106. data/examples/icons/bigpenguin.png +0 -0
  107. data/examples/icons/bottomview.png +0 -0
  108. data/examples/icons/camera.png +0 -0
  109. data/examples/icons/capbutt.png +0 -0
  110. data/examples/icons/capnotlast.png +0 -0
  111. data/examples/icons/capproj.png +0 -0
  112. data/examples/icons/capround.png +0 -0
  113. data/examples/icons/colorpal.png +0 -0
  114. data/examples/icons/copy.png +0 -0
  115. data/examples/icons/cut.png +0 -0
  116. data/examples/icons/delimit.png +0 -0
  117. data/examples/icons/dippy.png +0 -0
  118. data/examples/icons/double_dash.png +0 -0
  119. data/examples/icons/filenew.png +0 -0
  120. data/examples/icons/fileopen.png +0 -0
  121. data/examples/icons/filesave.png +0 -0
  122. data/examples/icons/filesaveas.png +0 -0
  123. data/examples/icons/fonts.png +0 -0
  124. data/examples/icons/fox.png +0 -0
  125. data/examples/icons/foxicon.png +0 -0
  126. data/examples/icons/frontview.png +0 -0
  127. data/examples/icons/gem_big.png +0 -0
  128. data/examples/icons/gem_small.png +0 -0
  129. data/examples/icons/hello2.png +0 -0
  130. data/examples/icons/help.png +0 -0
  131. data/examples/icons/indent.png +0 -0
  132. data/examples/icons/jbevel.png +0 -0
  133. data/examples/icons/jmiter.png +0 -0
  134. data/examples/icons/jround.png +0 -0
  135. data/examples/icons/kill.png +0 -0
  136. data/examples/icons/leftview.png +0 -0
  137. data/examples/icons/light.png +0 -0
  138. data/examples/icons/minidoc.png +0 -0
  139. data/examples/icons/minifolder.png +0 -0
  140. data/examples/icons/minifolderopen.png +0 -0
  141. data/examples/icons/newfolder.png +0 -0
  142. data/examples/icons/nolight.png +0 -0
  143. data/examples/icons/onoff_dash.png +0 -0
  144. data/examples/icons/palette.png +0 -0
  145. data/examples/icons/parallel.png +0 -0
  146. data/examples/icons/paste.png +0 -0
  147. data/examples/icons/pattern.png +0 -0
  148. data/examples/icons/penguin.png +0 -0
  149. data/examples/icons/perspective.png +0 -0
  150. data/examples/icons/printicon.png +0 -0
  151. data/examples/icons/prop.png +0 -0
  152. data/examples/icons/redo.png +0 -0
  153. data/examples/icons/rightview.png +0 -0
  154. data/examples/icons/saveas.png +0 -0
  155. data/examples/icons/shutter1.png +0 -0
  156. data/examples/icons/shutter2.png +0 -0
  157. data/examples/icons/small.png +0 -0
  158. data/examples/icons/smoothlight.png +0 -0
  159. data/examples/icons/solid_line.png +0 -0
  160. data/examples/icons/tbuplevel.png +0 -0
  161. data/examples/icons/topview.png +0 -0
  162. data/examples/icons/undo.png +0 -0
  163. data/examples/icons/winapp.png +0 -0
  164. data/examples/icons/zoom.png +0 -0
  165. data/examples/image.rb +281 -0
  166. data/examples/imageviewer.rb +513 -0
  167. data/examples/inputs.rb +84 -0
  168. data/examples/mditest.rb +180 -0
  169. data/examples/pig.rb +77 -0
  170. data/examples/raabrowser.rb +132 -0
  171. data/examples/scintilla-test.rb +81 -0
  172. data/examples/scribble-orig.rb +186 -0
  173. data/examples/scribble.rb +166 -0
  174. data/examples/shutter.rb +158 -0
  175. data/examples/splitter.rb +211 -0
  176. data/examples/styledtext.rb +92 -0
  177. data/examples/tabbook.rb +124 -0
  178. data/examples/table.rb +187 -0
  179. data/examples/textedit/commands.rb +117 -0
  180. data/examples/textedit/helpwindow.rb +295 -0
  181. data/examples/textedit/prefdialog.rb +235 -0
  182. data/examples/textedit/textedit.rb +1767 -0
  183. data/ext/fox12/FXRbApp.cpp +127 -0
  184. data/ext/fox12/FXRbDataTarget.cpp +106 -0
  185. data/ext/fox12/FXRbGLViewer.cpp +89 -0
  186. data/ext/fox12/FXRuby.cpp +1818 -0
  187. data/ext/fox12/MANIFEST +189 -0
  188. data/ext/fox12/core_wrap.cpp +10119 -0
  189. data/ext/fox12/dc_wrap.cpp +2638 -0
  190. data/ext/fox12/dialogs_wrap.cpp +6244 -0
  191. data/ext/fox12/extconf.rb +176 -0
  192. data/ext/fox12/frames_wrap.cpp +8274 -0
  193. data/ext/fox12/fx3d_wrap.cpp +9315 -0
  194. data/ext/fox12/iconlist_wrap.cpp +3742 -0
  195. data/ext/fox12/icons_wrap.cpp +4040 -0
  196. data/ext/fox12/image_wrap.cpp +4026 -0
  197. data/ext/fox12/impl.cpp +1064 -0
  198. data/ext/fox12/include/FXMemoryBuffer.h +52 -0
  199. data/ext/fox12/include/FXRb4Splitter.h +54 -0
  200. data/ext/fox12/include/FXRbAccelTable.h +46 -0
  201. data/ext/fox12/include/FXRbApp.h +137 -0
  202. data/ext/fox12/include/FXRbAppVirtuals.h +15 -0
  203. data/ext/fox12/include/FXRbArrowButton.h +51 -0
  204. data/ext/fox12/include/FXRbBMPIcon.h +54 -0
  205. data/ext/fox12/include/FXRbBMPImage.h +54 -0
  206. data/ext/fox12/include/FXRbBitmap.h +115 -0
  207. data/ext/fox12/include/FXRbBitmapFrame.h +56 -0
  208. data/ext/fox12/include/FXRbBitmapView.h +52 -0
  209. data/ext/fox12/include/FXRbBitmapVirtuals.h +27 -0
  210. data/ext/fox12/include/FXRbButton.h +51 -0
  211. data/ext/fox12/include/FXRbCURCursor.h +60 -0
  212. data/ext/fox12/include/FXRbCanvas.h +51 -0
  213. data/ext/fox12/include/FXRbCheckButton.h +51 -0
  214. data/ext/fox12/include/FXRbColorBar.h +51 -0
  215. data/ext/fox12/include/FXRbColorDialog.h +53 -0
  216. data/ext/fox12/include/FXRbColorSelector.h +51 -0
  217. data/ext/fox12/include/FXRbColorWell.h +51 -0
  218. data/ext/fox12/include/FXRbColorWheel.h +51 -0
  219. data/ext/fox12/include/FXRbComboBox.h +56 -0
  220. data/ext/fox12/include/FXRbCommon.h +86 -0
  221. data/ext/fox12/include/FXRbComposite.h +51 -0
  222. data/ext/fox12/include/FXRbCursor.h +87 -0
  223. data/ext/fox12/include/FXRbCursorVirtuals.h +6 -0
  224. data/ext/fox12/include/FXRbDC.h +385 -0
  225. data/ext/fox12/include/FXRbDCPrint.h +49 -0
  226. data/ext/fox12/include/FXRbDCVirtuals.h +166 -0
  227. data/ext/fox12/include/FXRbDCWindow.h +64 -0
  228. data/ext/fox12/include/FXRbDataTarget.h +65 -0
  229. data/ext/fox12/include/FXRbDebugTarget.h +46 -0
  230. data/ext/fox12/include/FXRbDelegator.h +46 -0
  231. data/ext/fox12/include/FXRbDial.h +51 -0
  232. data/ext/fox12/include/FXRbDialogBox.h +68 -0
  233. data/ext/fox12/include/FXRbDialogBoxVirtuals.h +3 -0
  234. data/ext/fox12/include/FXRbDict.h +46 -0
  235. data/ext/fox12/include/FXRbDirBox.h +51 -0
  236. data/ext/fox12/include/FXRbDirDialog.h +53 -0
  237. data/ext/fox12/include/FXRbDirList.h +79 -0
  238. data/ext/fox12/include/FXRbDirSelector.h +51 -0
  239. data/ext/fox12/include/FXRbDocument.h +46 -0
  240. data/ext/fox12/include/FXRbDragCorner.h +51 -0
  241. data/ext/fox12/include/FXRbDrawable.h +64 -0
  242. data/ext/fox12/include/FXRbDrawableVirtuals.h +3 -0
  243. data/ext/fox12/include/FXRbDriveBox.h +51 -0
  244. data/ext/fox12/include/FXRbFileDialog.h +56 -0
  245. data/ext/fox12/include/FXRbFileDict.h +104 -0
  246. data/ext/fox12/include/FXRbFileDictVirtuals.h +9 -0
  247. data/ext/fox12/include/FXRbFileList.h +81 -0
  248. data/ext/fox12/include/FXRbFileSelector.h +51 -0
  249. data/ext/fox12/include/FXRbFoldingItemVirtuals.h +45 -0
  250. data/ext/fox12/include/FXRbFoldingList.h +183 -0
  251. data/ext/fox12/include/FXRbFont.h +70 -0
  252. data/ext/fox12/include/FXRbFontDialog.h +53 -0
  253. data/ext/fox12/include/FXRbFontSelector.h +51 -0
  254. data/ext/fox12/include/FXRbFrame.h +51 -0
  255. data/ext/fox12/include/FXRbGIFCursor.h +60 -0
  256. data/ext/fox12/include/FXRbGIFIcon.h +54 -0
  257. data/ext/fox12/include/FXRbGIFImage.h +54 -0
  258. data/ext/fox12/include/FXRbGLCanvas.h +92 -0
  259. data/ext/fox12/include/FXRbGLCanvasVirtuals.h +13 -0
  260. data/ext/fox12/include/FXRbGLContext.h +58 -0
  261. data/ext/fox12/include/FXRbGLObject.h +103 -0
  262. data/ext/fox12/include/FXRbGLObjectVirtuals.h +22 -0
  263. data/ext/fox12/include/FXRbGLShape.h +81 -0
  264. data/ext/fox12/include/FXRbGLShapeVirtuals.h +8 -0
  265. data/ext/fox12/include/FXRbGLViewer.h +83 -0
  266. data/ext/fox12/include/FXRbGLViewerVirtuals.h +6 -0
  267. data/ext/fox12/include/FXRbGLVisual.h +56 -0
  268. data/ext/fox12/include/FXRbGradientBar.h +55 -0
  269. data/ext/fox12/include/FXRbGroupBox.h +51 -0
  270. data/ext/fox12/include/FXRbHeader.h +125 -0
  271. data/ext/fox12/include/FXRbHeaderItemVirtuals.h +22 -0
  272. data/ext/fox12/include/FXRbHorizontalFrame.h +51 -0
  273. data/ext/fox12/include/FXRbICOIcon.h +54 -0
  274. data/ext/fox12/include/FXRbICOImage.h +54 -0
  275. data/ext/fox12/include/FXRbIcon.h +57 -0
  276. data/ext/fox12/include/FXRbIconItemVirtuals.h +71 -0
  277. data/ext/fox12/include/FXRbIconList.h +266 -0
  278. data/ext/fox12/include/FXRbIconListVirtuals.h +21 -0
  279. data/ext/fox12/include/FXRbId.h +74 -0
  280. data/ext/fox12/include/FXRbIdVirtuals.h +9 -0
  281. data/ext/fox12/include/FXRbImage.h +162 -0
  282. data/ext/fox12/include/FXRbImageFrame.h +56 -0
  283. data/ext/fox12/include/FXRbImageView.h +52 -0
  284. data/ext/fox12/include/FXRbImageVirtuals.h +51 -0
  285. data/ext/fox12/include/FXRbInputDialog.h +53 -0
  286. data/ext/fox12/include/FXRbJPGIcon.h +54 -0
  287. data/ext/fox12/include/FXRbJPGImage.h +54 -0
  288. data/ext/fox12/include/FXRbLabel.h +51 -0
  289. data/ext/fox12/include/FXRbList.h +204 -0
  290. data/ext/fox12/include/FXRbListBox.h +56 -0
  291. data/ext/fox12/include/FXRbListItemVirtuals.h +36 -0
  292. data/ext/fox12/include/FXRbListVirtuals.h +18 -0
  293. data/ext/fox12/include/FXRbMDIButton.h +162 -0
  294. data/ext/fox12/include/FXRbMDIChild.h +82 -0
  295. data/ext/fox12/include/FXRbMDIChildVirtuals.h +12 -0
  296. data/ext/fox12/include/FXRbMDIClient.h +80 -0
  297. data/ext/fox12/include/FXRbMDIClientVirtuals.h +12 -0
  298. data/ext/fox12/include/FXRbMainWindow.h +54 -0
  299. data/ext/fox12/include/FXRbMatrix.h +51 -0
  300. data/ext/fox12/include/FXRbMenuBar.h +63 -0
  301. data/ext/fox12/include/FXRbMenuButton.h +51 -0
  302. data/ext/fox12/include/FXRbMenuCaption.h +51 -0
  303. data/ext/fox12/include/FXRbMenuCascade.h +51 -0
  304. data/ext/fox12/include/FXRbMenuCheck.h +49 -0
  305. data/ext/fox12/include/FXRbMenuCommand.h +49 -0
  306. data/ext/fox12/include/FXRbMenuPane.h +52 -0
  307. data/ext/fox12/include/FXRbMenuRadio.h +49 -0
  308. data/ext/fox12/include/FXRbMenuSeparator.h +51 -0
  309. data/ext/fox12/include/FXRbMenuTitle.h +51 -0
  310. data/ext/fox12/include/FXRbMessageBox.h +56 -0
  311. data/ext/fox12/include/FXRbObject.h +67 -0
  312. data/ext/fox12/include/FXRbObjectVirtuals.h +9 -0
  313. data/ext/fox12/include/FXRbOptionMenu.h +73 -0
  314. data/ext/fox12/include/FXRbPCXIcon.h +54 -0
  315. data/ext/fox12/include/FXRbPCXImage.h +54 -0
  316. data/ext/fox12/include/FXRbPNGIcon.h +54 -0
  317. data/ext/fox12/include/FXRbPNGImage.h +54 -0
  318. data/ext/fox12/include/FXRbPPMIcon.h +54 -0
  319. data/ext/fox12/include/FXRbPPMImage.h +54 -0
  320. data/ext/fox12/include/FXRbPacker.h +51 -0
  321. data/ext/fox12/include/FXRbPicker.h +51 -0
  322. data/ext/fox12/include/FXRbPopup.h +70 -0
  323. data/ext/fox12/include/FXRbPopupVirtuals.h +6 -0
  324. data/ext/fox12/include/FXRbPrintDialog.h +53 -0
  325. data/ext/fox12/include/FXRbProgressBar.h +51 -0
  326. data/ext/fox12/include/FXRbProgressDialog.h +53 -0
  327. data/ext/fox12/include/FXRbRGBIcon.h +54 -0
  328. data/ext/fox12/include/FXRbRGBImage.h +54 -0
  329. data/ext/fox12/include/FXRbRadioButton.h +51 -0
  330. data/ext/fox12/include/FXRbRealSlider.h +51 -0
  331. data/ext/fox12/include/FXRbRealSpinner.h +64 -0
  332. data/ext/fox12/include/FXRbRealSpinnerVirtuals.h +3 -0
  333. data/ext/fox12/include/FXRbRecentFiles.h +49 -0
  334. data/ext/fox12/include/FXRbRegistry.h +46 -0
  335. data/ext/fox12/include/FXRbReplaceDialog.h +53 -0
  336. data/ext/fox12/include/FXRbRootWindow.h +51 -0
  337. data/ext/fox12/include/FXRbRuler.h +56 -0
  338. data/ext/fox12/include/FXRbScintilla.h +52 -0
  339. data/ext/fox12/include/FXRbScrollArea.h +82 -0
  340. data/ext/fox12/include/FXRbScrollAreaVirtuals.h +13 -0
  341. data/ext/fox12/include/FXRbScrollBar.h +73 -0
  342. data/ext/fox12/include/FXRbScrollPane.h +52 -0
  343. data/ext/fox12/include/FXRbScrollWindow.h +52 -0
  344. data/ext/fox12/include/FXRbSearchDialog.h +53 -0
  345. data/ext/fox12/include/FXRbSeparator.h +95 -0
  346. data/ext/fox12/include/FXRbSettings.h +46 -0
  347. data/ext/fox12/include/FXRbShell.h +56 -0
  348. data/ext/fox12/include/FXRbShutter.h +86 -0
  349. data/ext/fox12/include/FXRbShutterVirtuals.h +3 -0
  350. data/ext/fox12/include/FXRbSlider.h +51 -0
  351. data/ext/fox12/include/FXRbSpinner.h +64 -0
  352. data/ext/fox12/include/FXRbSpinnerVirtuals.h +3 -0
  353. data/ext/fox12/include/FXRbSplitter.h +54 -0
  354. data/ext/fox12/include/FXRbSpring.h +51 -0
  355. data/ext/fox12/include/FXRbStatusBar.h +51 -0
  356. data/ext/fox12/include/FXRbStatusLine.h +51 -0
  357. data/ext/fox12/include/FXRbStream.h +101 -0
  358. data/ext/fox12/include/FXRbStreamVirtuals.h +9 -0
  359. data/ext/fox12/include/FXRbStringDict.h +46 -0
  360. data/ext/fox12/include/FXRbSwitcher.h +51 -0
  361. data/ext/fox12/include/FXRbTGAIcon.h +54 -0
  362. data/ext/fox12/include/FXRbTGAImage.h +54 -0
  363. data/ext/fox12/include/FXRbTIFIcon.h +54 -0
  364. data/ext/fox12/include/FXRbTIFImage.h +54 -0
  365. data/ext/fox12/include/FXRbTabBar.h +64 -0
  366. data/ext/fox12/include/FXRbTabBarVirtuals.h +3 -0
  367. data/ext/fox12/include/FXRbTabBook.h +52 -0
  368. data/ext/fox12/include/FXRbTabItem.h +51 -0
  369. data/ext/fox12/include/FXRbTable.h +416 -0
  370. data/ext/fox12/include/FXRbTableItemVirtuals.h +68 -0
  371. data/ext/fox12/include/FXRbTableVirtuals.h +73 -0
  372. data/ext/fox12/include/FXRbText.h +89 -0
  373. data/ext/fox12/include/FXRbTextField.h +51 -0
  374. data/ext/fox12/include/FXRbTextVirtuals.h +9 -0
  375. data/ext/fox12/include/FXRbToggleButton.h +51 -0
  376. data/ext/fox12/include/FXRbToolBar.h +80 -0
  377. data/ext/fox12/include/FXRbToolBarGrip.h +51 -0
  378. data/ext/fox12/include/FXRbToolBarShell.h +52 -0
  379. data/ext/fox12/include/FXRbToolBarTab.h +51 -0
  380. data/ext/fox12/include/FXRbToolBarVirtuals.h +6 -0
  381. data/ext/fox12/include/FXRbToolTip.h +51 -0
  382. data/ext/fox12/include/FXRbTopWindow.h +91 -0
  383. data/ext/fox12/include/FXRbTopWindowVirtuals.h +15 -0
  384. data/ext/fox12/include/FXRbTreeItemVirtuals.h +42 -0
  385. data/ext/fox12/include/FXRbTreeList.h +249 -0
  386. data/ext/fox12/include/FXRbTreeListBox.h +53 -0
  387. data/ext/fox12/include/FXRbTreeListVirtuals.h +30 -0
  388. data/ext/fox12/include/FXRbTriStateButton.h +51 -0
  389. data/ext/fox12/include/FXRbVerticalFrame.h +51 -0
  390. data/ext/fox12/include/FXRbVisual.h +56 -0
  391. data/ext/fox12/include/FXRbWindow.h +200 -0
  392. data/ext/fox12/include/FXRbWindowVirtuals.h +69 -0
  393. data/ext/fox12/include/FXRbWizard.h +60 -0
  394. data/ext/fox12/include/FXRbXBMIcon.h +54 -0
  395. data/ext/fox12/include/FXRbXBMImage.h +54 -0
  396. data/ext/fox12/include/FXRbXPMIcon.h +54 -0
  397. data/ext/fox12/include/FXRbXPMImage.h +54 -0
  398. data/ext/fox12/include/FXRuby.h +728 -0
  399. data/ext/fox12/include/impl.h +201 -0
  400. data/ext/fox12/include/inlinestubs.h +1063 -0
  401. data/ext/fox12/label_wrap.cpp +4945 -0
  402. data/ext/fox12/layout_wrap.cpp +5061 -0
  403. data/ext/fox12/librb.c +636 -0
  404. data/ext/fox12/list_wrap.cpp +2212 -0
  405. data/ext/fox12/markfuncs.cpp +1568 -0
  406. data/ext/fox12/mdi_wrap.cpp +4521 -0
  407. data/ext/fox12/menu_wrap.cpp +4673 -0
  408. data/ext/fox12/scintilla_wrap.cpp +2245 -0
  409. data/ext/fox12/table_wrap.cpp +3581 -0
  410. data/ext/fox12/text_wrap.cpp +3539 -0
  411. data/ext/fox12/treelist_wrap.cpp +5609 -0
  412. data/ext/fox12/ui_wrap.cpp +10017 -0
  413. data/index.html +14 -0
  414. data/lib/fox12/aliases.rb +5211 -0
  415. data/lib/fox12/calendar.rb +218 -0
  416. data/lib/fox12/chore.rb +51 -0
  417. data/lib/fox12/colors.rb +282 -0
  418. data/lib/fox12/core.rb +249 -0
  419. data/lib/fox12/dict.rb +35 -0
  420. data/lib/fox12/glgroup.rb +165 -0
  421. data/lib/fox12/glshapes.rb +457 -0
  422. data/lib/fox12/input.rb +56 -0
  423. data/lib/fox12/irb.rb +179 -0
  424. data/lib/fox12/iterators.rb +331 -0
  425. data/lib/fox12/keys.rb +1376 -0
  426. data/lib/fox12/missingdep.rb +16 -0
  427. data/lib/fox12/pseudokeyboard.rb +36 -0
  428. data/lib/fox12/pseudomouse.rb +84 -0
  429. data/lib/fox12/responder.rb +72 -0
  430. data/lib/fox12/responder2.rb +122 -0
  431. data/lib/fox12/scintilla.rb +2629 -0
  432. data/lib/fox12/settings.rb +18 -0
  433. data/lib/fox12/signal.rb +68 -0
  434. data/lib/fox12/timeout.rb +58 -0
  435. data/lib/fox12/undolist.rb +456 -0
  436. data/lib/fox12/version.rb +11 -0
  437. data/rdoc-sources/FX4Splitter.rb +138 -0
  438. data/rdoc-sources/FXAccelTable.rb +67 -0
  439. data/rdoc-sources/FXApp.rb +557 -0
  440. data/rdoc-sources/FXArrowButton.rb +69 -0
  441. data/rdoc-sources/FXBMPIcon.rb +45 -0
  442. data/rdoc-sources/FXBMPImage.rb +20 -0
  443. data/rdoc-sources/FXBitmap.rb +78 -0
  444. data/rdoc-sources/FXBitmapFrame.rb +29 -0
  445. data/rdoc-sources/FXBitmapView.rb +41 -0
  446. data/rdoc-sources/FXButton.rb +43 -0
  447. data/rdoc-sources/FXCURCursor.rb +13 -0
  448. data/rdoc-sources/FXCanvas.rb +18 -0
  449. data/rdoc-sources/FXCheckButton.rb +57 -0
  450. data/rdoc-sources/FXColorBar.rb +43 -0
  451. data/rdoc-sources/FXColorDialog.rb +36 -0
  452. data/rdoc-sources/FXColorSelector.rb +65 -0
  453. data/rdoc-sources/FXColorWell.rb +57 -0
  454. data/rdoc-sources/FXColorWheel.rb +35 -0
  455. data/rdoc-sources/FXComboBox.rb +153 -0
  456. data/rdoc-sources/FXComposite.rb +34 -0
  457. data/rdoc-sources/FXCursor.rb +67 -0
  458. data/rdoc-sources/FXDC.rb +667 -0
  459. data/rdoc-sources/FXDCPrint.rb +127 -0
  460. data/rdoc-sources/FXDCWindow.rb +37 -0
  461. data/rdoc-sources/FXDataTarget.rb +41 -0
  462. data/rdoc-sources/FXDebugTarget.rb +25 -0
  463. data/rdoc-sources/FXDelegator.rb +23 -0
  464. data/rdoc-sources/FXDial.rb +68 -0
  465. data/rdoc-sources/FXDialogBox.rb +36 -0
  466. data/rdoc-sources/FXDict.rb +79 -0
  467. data/rdoc-sources/FXDirBox.rb +49 -0
  468. data/rdoc-sources/FXDirDialog.rb +18 -0
  469. data/rdoc-sources/FXDirList.rb +143 -0
  470. data/rdoc-sources/FXDirSelector.rb +30 -0
  471. data/rdoc-sources/FXDocument.rb +29 -0
  472. data/rdoc-sources/FXDragCorner.rb +19 -0
  473. data/rdoc-sources/FXDrawable.rb +27 -0
  474. data/rdoc-sources/FXDriveBox.rb +46 -0
  475. data/rdoc-sources/FXFileDialog.rb +132 -0
  476. data/rdoc-sources/FXFileDict.rb +168 -0
  477. data/rdoc-sources/FXFileList.rb +163 -0
  478. data/rdoc-sources/FXFileSelector.rb +148 -0
  479. data/rdoc-sources/FXFileStream.rb +24 -0
  480. data/rdoc-sources/FXFoldingList.rb +453 -0
  481. data/rdoc-sources/FXFont.rb +345 -0
  482. data/rdoc-sources/FXFontDialog.rb +14 -0
  483. data/rdoc-sources/FXFontSelector.rb +37 -0
  484. data/rdoc-sources/FXFrame.rb +47 -0
  485. data/rdoc-sources/FXGIFCursor.rb +38 -0
  486. data/rdoc-sources/FXGIFIcon.rb +21 -0
  487. data/rdoc-sources/FXGIFImage.rb +19 -0
  488. data/rdoc-sources/FXGLCanvas.rb +45 -0
  489. data/rdoc-sources/FXGLContext.rb +41 -0
  490. data/rdoc-sources/FXGLObject.rb +75 -0
  491. data/rdoc-sources/FXGLShape.rb +75 -0
  492. data/rdoc-sources/FXGLViewer.rb +309 -0
  493. data/rdoc-sources/FXGLVisual.rb +94 -0
  494. data/rdoc-sources/FXGradientBar.rb +291 -0
  495. data/rdoc-sources/FXGroupBox.rb +33 -0
  496. data/rdoc-sources/FXHeader.rb +377 -0
  497. data/rdoc-sources/FXHorizontalFrame.rb +29 -0
  498. data/rdoc-sources/FXICOIcon.rb +50 -0
  499. data/rdoc-sources/FXICOImage.rb +21 -0
  500. data/rdoc-sources/FXIcon.rb +38 -0
  501. data/rdoc-sources/FXIconList.rb +418 -0
  502. data/rdoc-sources/FXId.rb +34 -0
  503. data/rdoc-sources/FXImage.rb +198 -0
  504. data/rdoc-sources/FXImageFrame.rb +22 -0
  505. data/rdoc-sources/FXImageView.rb +35 -0
  506. data/rdoc-sources/FXInputDialog.rb +62 -0
  507. data/rdoc-sources/FXJPGIcon.rb +52 -0
  508. data/rdoc-sources/FXJPGImage.rb +25 -0
  509. data/rdoc-sources/FXLabel.rb +66 -0
  510. data/rdoc-sources/FXList.rb +412 -0
  511. data/rdoc-sources/FXListBox.rb +158 -0
  512. data/rdoc-sources/FXMDIButton.rb +67 -0
  513. data/rdoc-sources/FXMDIChild.rb +145 -0
  514. data/rdoc-sources/FXMDIClient.rb +67 -0
  515. data/rdoc-sources/FXMainWindow.rb +20 -0
  516. data/rdoc-sources/FXMat4.rb +171 -0
  517. data/rdoc-sources/FXMatrix.rb +57 -0
  518. data/rdoc-sources/FXMemoryBuffer.rb +19 -0
  519. data/rdoc-sources/FXMemoryStream.rb +45 -0
  520. data/rdoc-sources/FXMenuBar.rb +23 -0
  521. data/rdoc-sources/FXMenuButton.rb +84 -0
  522. data/rdoc-sources/FXMenuCaption.rb +47 -0
  523. data/rdoc-sources/FXMenuCascade.rb +18 -0
  524. data/rdoc-sources/FXMenuCheck.rb +30 -0
  525. data/rdoc-sources/FXMenuCommand.rb +27 -0
  526. data/rdoc-sources/FXMenuPane.rb +13 -0
  527. data/rdoc-sources/FXMenuRadio.rb +30 -0
  528. data/rdoc-sources/FXMenuSeparator.rb +21 -0
  529. data/rdoc-sources/FXMenuTitle.rb +27 -0
  530. data/rdoc-sources/FXMessageBox.rb +77 -0
  531. data/rdoc-sources/FXObject.rb +22 -0
  532. data/rdoc-sources/FXOptionMenu.rb +76 -0
  533. data/rdoc-sources/FXPCXIcon.rb +48 -0
  534. data/rdoc-sources/FXPCXImage.rb +21 -0
  535. data/rdoc-sources/FXPNGIcon.rb +48 -0
  536. data/rdoc-sources/FXPNGImage.rb +21 -0
  537. data/rdoc-sources/FXPPMIcon.rb +21 -0
  538. data/rdoc-sources/FXPPMImage.rb +21 -0
  539. data/rdoc-sources/FXPacker.rb +62 -0
  540. data/rdoc-sources/FXPicker.rb +27 -0
  541. data/rdoc-sources/FXPopup.rb +53 -0
  542. data/rdoc-sources/FXPrintDialog.rb +36 -0
  543. data/rdoc-sources/FXProgressBar.rb +57 -0
  544. data/rdoc-sources/FXProgressDialog.rb +36 -0
  545. data/rdoc-sources/FXQuatd.rb +1 -0
  546. data/rdoc-sources/FXQuatf.rb +1 -0
  547. data/rdoc-sources/FXRGBIcon.rb +49 -0
  548. data/rdoc-sources/FXRGBImage.rb +21 -0
  549. data/rdoc-sources/FXRadioButton.rb +64 -0
  550. data/rdoc-sources/FXRanged.rb +97 -0
  551. data/rdoc-sources/FXRangef.rb +97 -0
  552. data/rdoc-sources/FXRealSlider.rb +99 -0
  553. data/rdoc-sources/FXRealSpinner.rb +133 -0
  554. data/rdoc-sources/FXRecentFiles.rb +73 -0
  555. data/rdoc-sources/FXRectangle.rb +137 -0
  556. data/rdoc-sources/FXRegion.rb +64 -0
  557. data/rdoc-sources/FXRegistry.rb +39 -0
  558. data/rdoc-sources/FXReplaceDialog.rb +56 -0
  559. data/rdoc-sources/FXRootWindow.rb +17 -0
  560. data/rdoc-sources/FXRuler.rb +60 -0
  561. data/rdoc-sources/FXScintilla.rb +121 -0
  562. data/rdoc-sources/FXScrollArea.rb +86 -0
  563. data/rdoc-sources/FXScrollBar.rb +101 -0
  564. data/rdoc-sources/FXScrollPane.rb +23 -0
  565. data/rdoc-sources/FXScrollWindow.rb +38 -0
  566. data/rdoc-sources/FXSearchDialog.rb +24 -0
  567. data/rdoc-sources/FXSeparator.rb +64 -0
  568. data/rdoc-sources/FXSettings.rb +222 -0
  569. data/rdoc-sources/FXShell.rb +7 -0
  570. data/rdoc-sources/FXShutter.rb +97 -0
  571. data/rdoc-sources/FXSize.rb +30 -0
  572. data/rdoc-sources/FXSlider.rb +96 -0
  573. data/rdoc-sources/FXSphered.rb +65 -0
  574. data/rdoc-sources/FXSpheref.rb +65 -0
  575. data/rdoc-sources/FXSpinner.rb +132 -0
  576. data/rdoc-sources/FXSplitter.rb +88 -0
  577. data/rdoc-sources/FXSpring.rb +61 -0
  578. data/rdoc-sources/FXStatusBar.rb +42 -0
  579. data/rdoc-sources/FXStatusLine.rb +60 -0
  580. data/rdoc-sources/FXStream.rb +115 -0
  581. data/rdoc-sources/FXStringDict.rb +38 -0
  582. data/rdoc-sources/FXSwitcher.rb +78 -0
  583. data/rdoc-sources/FXTGAIcon.rb +48 -0
  584. data/rdoc-sources/FXTGAImage.rb +21 -0
  585. data/rdoc-sources/FXTIFIcon.rb +52 -0
  586. data/rdoc-sources/FXTIFImage.rb +24 -0
  587. data/rdoc-sources/FXTabBar.rb +76 -0
  588. data/rdoc-sources/FXTabBook.rb +38 -0
  589. data/rdoc-sources/FXTabItem.rb +51 -0
  590. data/rdoc-sources/FXTable.rb +654 -0
  591. data/rdoc-sources/FXText.rb +533 -0
  592. data/rdoc-sources/FXTextField.rb +141 -0
  593. data/rdoc-sources/FXToggleButton.rb +69 -0
  594. data/rdoc-sources/FXToolBar.rb +121 -0
  595. data/rdoc-sources/FXToolBarGrip.rb +55 -0
  596. data/rdoc-sources/FXToolBarShell.rb +44 -0
  597. data/rdoc-sources/FXToolTip.rb +36 -0
  598. data/rdoc-sources/FXTopWindow.rb +92 -0
  599. data/rdoc-sources/FXTreeList.rb +503 -0
  600. data/rdoc-sources/FXTreeListBox.rb +182 -0
  601. data/rdoc-sources/FXTriStateButton.rb +49 -0
  602. data/rdoc-sources/FXVec.rb +97 -0
  603. data/rdoc-sources/FXVec4.rb +91 -0
  604. data/rdoc-sources/FXVerticalFrame.rb +29 -0
  605. data/rdoc-sources/FXVisual.rb +79 -0
  606. data/rdoc-sources/FXWindow.rb +633 -0
  607. data/rdoc-sources/FXWizard.rb +63 -0
  608. data/rdoc-sources/FXXBMIcon.rb +22 -0
  609. data/rdoc-sources/FXXBMImage.rb +22 -0
  610. data/rdoc-sources/FXXPMIcon.rb +50 -0
  611. data/rdoc-sources/FXXPMImage.rb +21 -0
  612. data/rdoc-sources/README.rdoc +53 -0
  613. data/rdoc-sources/fxdefs.rb +90 -0
  614. data/tests/README +19 -0
  615. data/tests/TC_FXAccelTable.rb +43 -0
  616. data/tests/TC_FXApp.rb +15 -0
  617. data/tests/TC_FXArc.rb +26 -0
  618. data/tests/TC_FXButton.rb +72 -0
  619. data/tests/TC_FXCheckButton.rb +57 -0
  620. data/tests/TC_FXComboBox.rb +36 -0
  621. data/tests/TC_FXDC.rb +372 -0
  622. data/tests/TC_FXDCPrint.rb +102 -0
  623. data/tests/TC_FXDCWindow.rb +23 -0
  624. data/tests/TC_FXDataTarget.rb +24 -0
  625. data/tests/TC_FXDirList.rb +30 -0
  626. data/tests/TC_FXFileAssoc.rb +62 -0
  627. data/tests/TC_FXFileStream.rb +90 -0
  628. data/tests/TC_FXFont.rb +59 -0
  629. data/tests/TC_FXFontDesc.rb +62 -0
  630. data/tests/TC_FXGLGroup.rb +32 -0
  631. data/tests/TC_FXGLShape.rb +28 -0
  632. data/tests/TC_FXGLViewer.rb +18 -0
  633. data/tests/TC_FXGradientBar.rb +89 -0
  634. data/tests/TC_FXHeader.rb +82 -0
  635. data/tests/TC_FXIconDict.rb +52 -0
  636. data/tests/TC_FXIconList.rb +192 -0
  637. data/tests/TC_FXId.rb +19 -0
  638. data/tests/TC_FXImage.rb +144 -0
  639. data/tests/TC_FXLight.rb +33 -0
  640. data/tests/TC_FXList.rb +116 -0
  641. data/tests/TC_FXListBox.rb +49 -0
  642. data/tests/TC_FXMat4f.rb +228 -0
  643. data/tests/TC_FXMaterial.rb +75 -0
  644. data/tests/TC_FXMemoryStream.rb +87 -0
  645. data/tests/TC_FXMenuCommand.rb +26 -0
  646. data/tests/TC_FXPoint.rb +57 -0
  647. data/tests/TC_FXQuatf.rb +77 -0
  648. data/tests/TC_FXRadioButton.rb +57 -0
  649. data/tests/TC_FXRangef.rb +48 -0
  650. data/tests/TC_FXRectangle.rb +88 -0
  651. data/tests/TC_FXRegion.rb +54 -0
  652. data/tests/TC_FXRegistry.rb +27 -0
  653. data/tests/TC_FXScrollArea.rb +28 -0
  654. data/tests/TC_FXScrollWindow.rb +28 -0
  655. data/tests/TC_FXSegment.rb +22 -0
  656. data/tests/TC_FXShell.rb +26 -0
  657. data/tests/TC_FXSize.rb +54 -0
  658. data/tests/TC_FXStream.rb +11 -0
  659. data/tests/TC_FXTable.rb +468 -0
  660. data/tests/TC_FXTableItem.rb +48 -0
  661. data/tests/TC_FXText.rb +81 -0
  662. data/tests/TC_FXTopWindow.rb +32 -0
  663. data/tests/TC_FXTreeList.rb +83 -0
  664. data/tests/TC_FXTreeListBox.rb +23 -0
  665. data/tests/TC_FXUndoList.rb +43 -0
  666. data/tests/TC_FXVec2d.rb +142 -0
  667. data/tests/TC_FXVec2f.rb +137 -0
  668. data/tests/TC_FXVec3d.rb +150 -0
  669. data/tests/TC_FXVec3f.rb +150 -0
  670. data/tests/TC_FXVec4f.rb +158 -0
  671. data/tests/TC_FXViewport.rb +30 -0
  672. data/tests/TC_Misc.rb +157 -0
  673. data/tests/TC_downcast.rb +15 -0
  674. data/tests/TS_All.rb +25 -0
  675. data/tests/blankpage.ps +166 -0
  676. data/tests/doit.rb +5 -0
  677. data/tests/howdypage.ps +181 -0
  678. data/tests/stress1.rb +94 -0
  679. data/tests/stress2.rb +51 -0
  680. data/tests/stress3.rb +117 -0
  681. data/tests/testcase.rb +38 -0
  682. data/web/art/fxrubylogo.png +0 -0
  683. data/web/art/fxrubylogo_small.png +0 -0
  684. data/web/art/line.gif +0 -0
  685. data/web/art/oul_grey.gif +0 -0
  686. data/web/art/our.gif +0 -0
  687. data/web/downloads.html +91 -0
  688. data/web/home.html +109 -0
  689. data/web/menu.html +50 -0
  690. data/web/styles.css +167 -0
  691. data/web/top.html +15 -0
  692. metadata +737 -0
@@ -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><meta name="generator" content="DocBook XSL Stylesheets V1.61.2"><link rel="home" 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="previous" 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="d0e1076"></a>Sending Data to the Clipboard</h2></div></div><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
+ <tt class="constant">SEL_CLIPBOARD_REQUEST</tt> message to the current
6
+ clipboard owner. Remember, the clipboard owner is the window that called
7
+ <tt class="methodname">acquireClipboard()</tt>. For our example, the main
8
+ window is acting as the clipboard owner and so it needs to handle the
9
+ <tt class="constant">SEL_CLIPBOARD_REQUEST</tt> message:</p><table border="0" bgcolor="#E0E0E0" width="100%"><tr><td><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></td></tr></table><p>The <tt class="methodname">setDNDData()</tt> 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 (<tt class="constant">FROM_DRAGNDROP</tt>) and X11 selection
17
+ (<tt class="constant">FROM_SELECTION</tt>) data transfer as well. The second
18
+ argument to <tt class="methodname">setDNDData()</tt> 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
+ <tt class="methodname">fxencodeStringData()</tt> module method to preprocess
21
+ the string returned by the call to <tt class="methodname">Customer#to_s</tt>,
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 <tt class="methodname">fxencodeStringData()</tt>
28
+ method (and the corresponding
29
+ <tt class="methodname">fxdecodeStringData()</tt> method) provide you with a
30
+ platform-independent way of sending (or receiving) string data with the
31
+ <tt class="constant">stringType</tt> 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><table border="0" bgcolor="#E0E0E0" width="100%"><tr><td><pre class="programlisting">#&lt;struct Struct::Customer name="Joe Smith", address="123 Maple, Anytown, NC", zip=12345&gt;
37
+ </pre></td></tr></table></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>
@@ -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><meta name="generator" content="DocBook XSL Stylesheets V1.61.2"><link rel="home" 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="previous" 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="d0e1127"></a>Pasting Data from the Clipboard</h2></div></div><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><table border="0" bgcolor="#E0E0E0" width="100%"><tr><td><pre class="programlisting">#&lt;struct Struct::Customer name="Joe Smith", address="123 Maple, Anytown, NC", zip=12345&gt;
9
+ </pre></td></tr></table><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><table border="0" bgcolor="#E0E0E0" width="100%"><tr><td><pre class="programlisting">require 'yaml'</pre></td></tr></table><p>somewhere near the top of the program. Next, register a custom drag
13
+ type for <tt class="classname">Customer</tt> objects. We can do that by adding
14
+ one line to our main window's <tt class="methodname">create</tt> instance
15
+ method:</p><table border="0" bgcolor="#E0E0E0" width="100%"><tr><td><pre class="programlisting">def create
16
+ super
17
+ <span class="bold"><b> @customerDragType = getApp().registerDragType("application/x-customer")
18
+ </b></span> show(PLACEMENT_SCREEN)
19
+ end
20
+ </pre></td></tr></table><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 <tt class="classname">Customer</tt> 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 <tt class="methodname">acquireClipboard()</tt>:</p><table border="0" bgcolor="#E0E0E0" width="100%"><tr><td><pre class="programlisting"># User clicks Copy
29
+ copyButton.connect(SEL_COMMAND) do
30
+ customer = customerList.getItemData(customerList.currentItem)
31
+ <span class="bold"><b> types = [ FXWindow.stringType, @customerDragType ]
32
+ </b></span> if acquireClipboard(types)
33
+ @clippedCustomer = customer
34
+ end
35
+ end
36
+ </pre></td></tr></table><p>Similarly, when we're handling the
37
+ <tt class="constant">SEL_CLIPBOARD_REQUEST</tt> 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
+ <tt class="methodname">target</tt> attribute of the
41
+ <tt class="classname">FXEvent</tt> instance passed along with the
42
+ <tt class="constant">SEL_CLIPBOARD_REQUEST</tt> message:</p><table border="0" bgcolor="#E0E0E0" width="100%"><tr><td><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></td></tr></table><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><table border="0" bgcolor="#E0E0E0" width="100%"><tr><td><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></td></tr></table><p>The <tt class="methodname">getDNDData()</tt> method used here is the
64
+ inverse of the <tt class="methodname">setDNDData()</tt> method we used
65
+ earlier to push data to some other application requesting our clipboard
66
+ data. As with <tt class="methodname">setDNDData()</tt>, the arguments to
67
+ <tt class="methodname">getDNDData()</tt> indicate the kind of data transfer
68
+ we're performing (e.g. <tt class="constant">FROM_CLIPBOARD</tt>) 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) <tt class="methodname">getDNDData()</tt> will simply return
72
+ <tt class="constant">nil</tt>.</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>
@@ -0,0 +1,262 @@
1
+ <html><head>
2
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3
+ <title>Drag Sources</title><meta name="generator" content="DocBook XSL Stylesheets V1.61.2"><link rel="home" 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="previous" 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="d0e1375"></a>Drag Sources</h2></div></div><div></div></div><p>As before, we're going to start by presenting a skeleton application
4
+ consisting of a main window widget (a <tt class="classname">DragSource</tt>
5
+ instance) that parents an <tt class="classname">FXCanvas</tt> widget:</p><table border="0" bgcolor="#E0E0E0" width="100%"><tr><td><pre class="programlisting">require 'rubygems'
6
+ require_gem 'fxruby'
7
+
8
+ include Fox
9
+
10
+ class DragSource &lt; FXMainWindow
11
+ def initialize(anApp)
12
+ # Initialize base class
13
+ super(anApp, "Drag Source", nil, nil, DECOR_ALL, 0, 0, 400, 300)
14
+
15
+ # Fill main window with canvas
16
+ @canvas = FXCanvas.new(self, nil, 0, LAYOUT_FILL_X|LAYOUT_FILL_Y)
17
+ @canvas.backColor = "red"
18
+
19
+ # Handle expose events on the canvas
20
+ @canvas.connect(SEL_PAINT) { |sender, sel, event|
21
+ FXDCWindow.new(@canvas, event) { |dc|
22
+ dc.foreground = @canvas.backColor
23
+ dc.fillRectangle(event.rect.x, event.rect.y, event.rect.w, event.rect.h)
24
+ }
25
+ }
26
+ end
27
+
28
+ def create
29
+ # Create the main window and canvas
30
+ super
31
+
32
+ # Register the drag type for colors
33
+ FXWindow.colorType = getApp().registerDragType(FXWindow.colorTypeName)
34
+
35
+ # Show the main window
36
+ show(PLACEMENT_SCREEN)
37
+ end
38
+ end
39
+
40
+ if __FILE__ == $0
41
+ FXApp.new("DragSource", "FXRuby") do |theApp|
42
+ DragSource.new(theApp)
43
+ theApp.create
44
+ theApp.run
45
+ end
46
+ end
47
+
48
+ </pre></td></tr></table><p>Since the main program (i.e. the part at the end) won't change for
49
+ the rest of the tutorial, I won't show that code anymore. Furthermore, the
50
+ <tt class="classname">DragSource</tt> class has a few things in common with
51
+ the <tt class="classname">DropSite</tt> class from the previous example,
52
+ namely:</p><div class="itemizedlist"><ul type="disc"><li><p>We've defined a <tt class="constant">SEL_PAINT</tt> handler for the
53
+ canvas widget that just clears the canvas to its current background
54
+ color; and,</p></li><li><p>The drag type for colors
55
+ (<tt class="constant">FXWindow.colorType</tt>) is registered in the
56
+ <tt class="classname">DragSource</tt>'s <tt class="methodname">create()</tt>
57
+ method.</p></li></ul></div><p>As before, you may want to run this basic version of the program to
58
+ be sure that it's working properly so far. You should simply see an empty
59
+ window with a red background.</p><p>Now for this application, we want a drag operation to begin when the
60
+ user presses the left mouse button inside the canvas and starts "dragging"
61
+ away from the canvas. So the first change we need to make is to add a
62
+ handler for the <tt class="constant">SEL_LEFTBUTTONPRESS</tt> message from the
63
+ canvas:</p><table border="0" bgcolor="#E0E0E0" width="100%"><tr><td><pre class="programlisting">@canvas.connect(SEL_LEFTBUTTONPRESS) {
64
+ #
65
+ # Capture (grab) the mouse when the button goes down, so that all future
66
+ # mouse events will be reported to this widget, even if those events occur
67
+ # outside of this widget.
68
+ #
69
+ @canvas.grab
70
+
71
+ # Advertise which drag types we can offer
72
+ dragTypes = [FXWindow.colorType]
73
+ @canvas.beginDrag(dragTypes)
74
+ }
75
+ </pre></td></tr></table><p>Note that there are usually two things you're going to want to do in
76
+ the <tt class="constant">SEL_LEFTBUTTONPRESS</tt> handler for a drag source.
77
+ The first is to call <tt class="methodname">grab()</tt> on the window that
78
+ acts as the drag source. Calling <tt class="methodname">grab()</tt>
79
+ "captures" the mouse in the sense that subsequent mouse motion events will
80
+ be reported as if they occurred inside the grab window. This is important,
81
+ since in our case we're going to be dragging from this window to some
82
+ other window, possibly a window in a different application
83
+ altogether.</p><p>The second thing you'll want to do in the
84
+ <tt class="constant">SEL_LEFTBUTTONPRESS</tt> handler for a drag source is to
85
+ call <tt class="methodname">beginDrag()</tt>. This not only kicks the
86
+ application into drag-and-drop mode, but also provides a way for you to
87
+ inform the system about the formats of data (i.e. the drag types) that
88
+ this drag source is able to provide. For this example, the drag source is
89
+ just going to offer one drag type.</p><p>Since releasing the left mouse button should end the drag operation,
90
+ it's important to also add a handler for the
91
+ <tt class="constant">SEL_LEFTBUTTONRELEASE</tt> message:</p><table border="0" bgcolor="#E0E0E0" width="100%"><tr><td><pre class="programlisting">@canvas.connect(SEL_LEFTBUTTONRELEASE) {
92
+ @canvas.ungrab
93
+ @canvas.endDrag
94
+ }
95
+ </pre></td></tr></table><p>This is pretty much the mirror image of our
96
+ <tt class="constant">SEL_LEFTBUTTONPRESS</tt> handler. We call
97
+ <tt class="methodname">ungrab()</tt> to release the mouse capture, and
98
+ <tt class="methodname">endDrag()</tt> to clean up the drag-and-drop
99
+ state.</p><p>The next change is to add a <tt class="constant">SEL_MOTION</tt> handler,
100
+ to handle mouse motion events during the drag operation:</p><table border="0" bgcolor="#E0E0E0" width="100%"><tr><td><pre class="programlisting">@canvas.connect(SEL_MOTION) { |sender, sel, event|
101
+ if @canvas.dragging?
102
+ @canvas.handleDrag(event.root_x, event.root_y)
103
+ unless @canvas.didAccept == DRAG_REJECT
104
+ @canvas.dragCursor = getApp().getDefaultCursor(DEF_SWATCH_CURSOR)
105
+ else
106
+ @canvas.dragCursor = getApp().getDefaultCursor(DEF_DNDSTOP_CURSOR)
107
+ end
108
+ end
109
+ }
110
+ </pre></td></tr></table><p>The <tt class="methodname">dragging?</tt> method returns true if we're
111
+ in the middle of a drag-and-drop operation for the drag source window,
112
+ i.e. after the call to <tt class="methodname">beginDrag()</tt> but before the
113
+ call to <tt class="methodname">endDrag()</tt>. If we're not currently
114
+ processing a drag operation, we're not really interested in mouse motion
115
+ events for the canvas.</p><p>If we <span class="emphasis"><em>are</em></span> processing a drag operation, however,
116
+ we need to call <tt class="methodname">handleDrag()</tt> on the drag source
117
+ window. FOX uses this information to send drag-and-drop messages (such as
118
+ <tt class="constant">SEL_DND_ENTER</tt>, <tt class="constant">SEL_DND_MOTION</tt>
119
+ and <tt class="constant">SEL_DND_LEAVE</tt>) to the window that the mouse is
120
+ currently over. Note that the coordinates passed to
121
+ <tt class="methodname">handleDrag()</tt> are root window coordinates, and not
122
+ window-local coordinates.</p><p>Another good thing to consider doing here is to change the shape of
123
+ the cursor depending on the drop site's response to the drag-and-drop
124
+ messages from the drag source. For this example, we change the drag cursor
125
+ to one of FOX's built-in cursor shapes
126
+ (<tt class="constant">DEF_SWATCH_CURSOR</tt>) if we get any response other than
127
+ <tt class="constant">DRAG_REJECT</tt> from the drop site. If the drop site
128
+ rejects this drag source's overtures, we instead change the drag cursor to
129
+ a cursor that resembles a stop sign
130
+ (<tt class="constant">DEF_DNDSTOP_CURSOR</tt>).</p><p>I've purposely avoided suggesting that you run the program for the
131
+ last couple of changes, since until now there wasn't going to be any
132
+ visual indication that anything interesting was happening. But now you
133
+ should be able to run the application in its current state and see a few
134
+ things.</p><p>A first test is to confirm that the cursor shape changes to the
135
+ "stop" sign when you attempt to drag over some window that isn't willing
136
+ to accept a drop of the <tt class="constant">FXWindow.colorType</tt> drag type.
137
+ Start up one of the other FXRuby example programs (such as the
138
+ <tt class="filename">scribble.rb</tt> example) alongside your drag source
139
+ program, and then try "dragging" from the drag source's canvas onto the
140
+ Scribble program's canvas. During the drag attempt, the cursor should
141
+ maintain its shape as a "stop" sign since the canvas in the
142
+ <tt class="filename">scribble.rb</tt> example isn't drop-enabled.</p><p>Your next test can confirm that the cursor shape changes to the
143
+ "swatch" cursor (a small square) when you attempt to drag over a window
144
+ that is drop-enabled, and which is willing to accepts drops of this drag
145
+ type. The obvious choice is the example from the previous section (the
146
+ dropsite.rb program), but you should have success with any FXRuby example
147
+ program that displays color wells. Start up one of these drop-enabled
148
+ programs alongside your drag source program, and then try "dragging" from
149
+ the drag source's canvas onto the drop site. While the mouse pointer is
150
+ 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
151
+ transfer. At any time during a drag-and-drop operation, a drop site may
152
+ request a copy of the drag-and-drop data by calling the
153
+ <tt class="methodname">getDNDData()</tt> method (as described in the previous
154
+ section). When this happens, FOX sends a
155
+ <tt class="constant">SEL_DND_REQUEST</tt> message to the current drag source
156
+ window, and so we now add a handler for that message:</p><table border="0" bgcolor="#E0E0E0" width="100%"><tr><td><pre class="programlisting">@canvas.connect(SEL_DND_REQUEST) { |sender, sel, event|
157
+ if event.target == FXWindow.colorType
158
+ @canvas.setDNDData(FROM_DRAGNDROP, FXWindow.colorType, Fox.fxencodeColorData(@canvas.backColor))
159
+ end
160
+ }
161
+ </pre></td></tr></table><p>The first important thing to note here is that the
162
+ <tt class="varname">target</tt> field of the <tt class="classname">FXEvent</tt>
163
+ instance will contain the drag type requested by the drop site. If your
164
+ drag source offers its data in multiple formats, you definitely need to
165
+ check this in order to know how to package-up the data for transfer.
166
+ However, even if you're only offering the data in a single format (as in
167
+ this example) it's still a good idea to check the requested type, since a
168
+ 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
169
+ the data to the drop site by calling
170
+ <tt class="methodname">setDNDData()</tt>. As with the call to
171
+ <tt class="methodname">getDNDData()</tt> for our previous drop site program,
172
+ you want to be sure to specify the origin of the data
173
+ (<tt class="constant">FROM_DRAGNDROP</tt>), the drag type
174
+ (<tt class="constant">FXWindow.colorType</tt>) and the data itself as a binary
175
+ string.</p><p>As a final test of the completed program, try dragging from this
176
+ window to some drop-enabled window (as described earlier). Now, when you
177
+ release the left mouse button to complete the "drop", the drop site should
178
+ change its color to red.</p><p>The complete program is listed below, and is included in the
179
+ <tt class="filename">examples</tt> directory under the file
180
+ name <tt class="filename">dragsource.rb</tt>.</p><table border="0" bgcolor="#E0E0E0" width="100%"><tr><td><pre class="programlisting">require 'rubygems'
181
+ require_gem 'fxruby'
182
+
183
+ include Fox
184
+
185
+ class DragSource &lt; FXMainWindow
186
+ def initialize(anApp)
187
+ # Initialize base class
188
+ super(anApp, "Drag Source", nil, nil, DECOR_ALL, 0, 0, 400, 300)
189
+
190
+ # Fill main window with canvas
191
+ @canvas = FXCanvas.new(self, nil, 0, LAYOUT_FILL_X|LAYOUT_FILL_Y)
192
+ @canvas.backColor = "red"
193
+
194
+ # Handle expose events on the canvas
195
+ @canvas.connect(SEL_PAINT) { |sender, sel, event|
196
+ FXDCWindow.new(@canvas, event) { |dc|
197
+ dc.foreground = @canvas.backColor
198
+ dc.fillRectangle(event.rect.x, event.rect.y, event.rect.w, event.rect.h)
199
+ }
200
+ }
201
+
202
+ # Handle left button press
203
+ @canvas.connect(SEL_LEFTBUTTONPRESS) {
204
+ #
205
+ # Capture (grab) the mouse when the button goes down, so that all future
206
+ # mouse events will be reported to this widget, even if those events occur
207
+ # outside of this widget.
208
+ #
209
+ @canvas.grab
210
+
211
+ # Advertise which drag types we can offer
212
+ dragTypes = [FXWindow.colorType]
213
+ @canvas.beginDrag(dragTypes)
214
+ }
215
+
216
+ # Handle mouse motion events
217
+ @canvas.connect(SEL_MOTION) { |sender, sel, event|
218
+ if @canvas.dragging?
219
+ @canvas.handleDrag(event.root_x, event.root_y)
220
+ unless @canvas.didAccept == DRAG_REJECT
221
+ @canvas.dragCursor = getApp().getDefaultCursor(DEF_SWATCH_CURSOR)
222
+ else
223
+ @canvas.dragCursor = getApp().getDefaultCursor(DEF_DNDSTOP_CURSOR)
224
+ end
225
+ end
226
+ }
227
+
228
+ # Handle left button release
229
+ @canvas.connect(SEL_LEFTBUTTONRELEASE) {
230
+ @canvas.ungrab
231
+ @canvas.endDrag
232
+ }
233
+
234
+ # Handle request for DND data
235
+ @canvas.connect(SEL_DND_REQUEST) { |sender, sel, event|
236
+ if event.target == FXWindow.colorType
237
+ @canvas.setDNDData(FROM_DRAGNDROP, FXWindow.colorType, Fox.fxencodeColorData(@canvas.backColor))
238
+ end
239
+ }
240
+ end
241
+
242
+ def create
243
+ # Create the main window and canvas
244
+ super
245
+
246
+ # Register the drag type for colors
247
+ FXWindow.colorType = getApp().registerDragType(FXWindow.colorTypeName)
248
+
249
+ # Show the main window
250
+ show(PLACEMENT_SCREEN)
251
+ end
252
+ end
253
+
254
+ if __FILE__ == $0
255
+ FXApp.new("DragSource", "FXRuby") do |theApp|
256
+ DragSource.new(theApp)
257
+ theApp.create
258
+ theApp.run
259
+ end
260
+ end
261
+
262
+ </pre></td></tr></table></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>
@@ -0,0 +1,128 @@
1
+ <html><head>
2
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
3
+ <title>Putting It All Together</title><meta name="generator" content="DocBook XSL Stylesheets V1.61.2"><link rel="home" 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="previous" href="ch05s02.html" title="Drag Sources"><link rel="next" href="examples.html" title="Chapter&nbsp;6.&nbsp;Examples"></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="examples.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="d0e1569"></a>Putting It All Together</h2></div></div><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 <tt class="methodname">dropEnable()</tt>, to make
12
+ <tt class="classname">DragSource</tt>'s canvas drop-enabled;</p></li><li><p>A handler for the <tt class="constant">SEL_DND_MOTION</tt> message;
13
+ and,</p></li><li><p>A handler for the <tt class="constant">SEL_DND_DROP</tt>
14
+ message.</p></li></ul></div><p>If you merge those three short bits of code from
15
+ <tt class="filename">dropsite.rb</tt> into <tt class="filename">dragsource.rb</tt>,
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
+ <tt class="filename">examples</tt> directory under the file
26
+ name <tt class="filename">dragdrop.rb</tt>.</p><table border="0" bgcolor="#E0E0E0" width="100%"><tr><td><pre class="programlisting">require 'rubygems'
27
+ require_gem 'fxruby'
28
+
29
+ include Fox
30
+
31
+ class DragDropWindow &lt; FXMainWindow
32
+ def initialize(anApp)
33
+ # Initialize base class
34
+ super(anApp, "Drag and Drop", nil, nil, DECOR_ALL, 0, 0, 400, 300)
35
+
36
+ # Fill main window with canvas
37
+ @canvas = FXCanvas.new(self, nil, 0, LAYOUT_FILL_X|LAYOUT_FILL_Y)
38
+ @canvas.backColor = "red"
39
+
40
+ # Enable canvas for drag-and-drop messages
41
+ @canvas.dropEnable
42
+
43
+ # Handle expose events on the canvas
44
+ @canvas.connect(SEL_PAINT) { |sender, sel, event|
45
+ FXDCWindow.new(@canvas, event) { |dc|
46
+ dc.foreground = @canvas.backColor
47
+ dc.fillRectangle(event.rect.x, event.rect.y, event.rect.w, event.rect.h)
48
+ }
49
+ }
50
+
51
+ # Handle left button press
52
+ @canvas.connect(SEL_LEFTBUTTONPRESS) {
53
+ #
54
+ # Capture (grab) the mouse when the button goes down, so that all future
55
+ # mouse events will be reported to this widget, even if those events occur
56
+ # outside of this widget.
57
+ #
58
+ @canvas.grab
59
+
60
+ # Advertise which drag types we can offer
61
+ dragTypes = [FXWindow.colorType]
62
+ @canvas.beginDrag(dragTypes)
63
+ }
64
+
65
+ # Handle mouse motion events
66
+ @canvas.connect(SEL_MOTION) { |sender, sel, event|
67
+ if @canvas.dragging?
68
+ @canvas.handleDrag(event.root_x, event.root_y)
69
+ unless @canvas.didAccept == DRAG_REJECT
70
+ @canvas.dragCursor = getApp().getDefaultCursor(DEF_SWATCH_CURSOR)
71
+ else
72
+ @canvas.dragCursor = getApp().getDefaultCursor(DEF_DNDSTOP_CURSOR)
73
+ end
74
+ end
75
+ }
76
+
77
+ # Handle SEL_DND_MOTION messages from the canvas
78
+ @canvas.connect(SEL_DND_MOTION) {
79
+ if @canvas.offeredDNDType?(FROM_DRAGNDROP, FXWindow.colorType)
80
+ @canvas.acceptDrop
81
+ end
82
+ }
83
+
84
+ # Handle left button release
85
+ @canvas.connect(SEL_LEFTBUTTONRELEASE) {
86
+ @canvas.ungrab
87
+ @canvas.endDrag
88
+ }
89
+
90
+ # Handle SEL_DND_DROP message from the canvas
91
+ @canvas.connect(SEL_DND_DROP) {
92
+ # Try to obtain the data as color values first
93
+ data = @canvas.getDNDData(FROM_DRAGNDROP, FXWindow.colorType)
94
+ unless data.nil?
95
+ # Update canvas background color
96
+ @canvas.backColor = Fox.fxdecodeColorData(data)
97
+ end
98
+ }
99
+
100
+ # Handle request for DND data
101
+ @canvas.connect(SEL_DND_REQUEST) { |sender, sel, event|
102
+ if event.target == FXWindow.colorType
103
+ @canvas.setDNDData(FROM_DRAGNDROP, FXWindow.colorType, Fox.fxencodeColorData(@canvas.backColor))
104
+ end
105
+ }
106
+ end
107
+
108
+ def create
109
+ # Create the main window and canvas
110
+ super
111
+
112
+ # Register the drag type for colors
113
+ FXWindow.colorType = getApp().registerDragType(FXWindow.colorTypeName)
114
+
115
+ # Show the main window
116
+ show(PLACEMENT_SCREEN)
117
+ end
118
+ end
119
+
120
+ if __FILE__ == $0
121
+ FXApp.new("DragDrop", "FXRuby") do |theApp|
122
+ DragDropWindow.new(theApp)
123
+ theApp.create
124
+ theApp.run
125
+ end
126
+ end
127
+
128
+ </pre></td></tr></table></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="examples.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;Examples</td></tr></table></div></body></html>