fxruby 1.6.14-universal-darwin-9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +456 -0
- data/README +39 -0
- data/doc/apes02.html +21 -0
- data/doc/apes03.html +39 -0
- data/doc/book.html +3 -0
- data/doc/build.html +132 -0
- data/doc/ch03s02.html +23 -0
- data/doc/ch03s03.html +52 -0
- data/doc/ch03s04.html +36 -0
- data/doc/ch03s05.html +60 -0
- data/doc/ch04s02.html +71 -0
- data/doc/ch04s03.html +37 -0
- data/doc/ch04s04.html +72 -0
- data/doc/ch05s02.html +260 -0
- data/doc/ch05s03.html +127 -0
- data/doc/changes.html +697 -0
- data/doc/clipboardtut.html +67 -0
- data/doc/differences.html +190 -0
- data/doc/dragdroptut.html +263 -0
- data/doc/events.html +36 -0
- data/doc/examples.html +104 -0
- data/doc/gems.html +73 -0
- data/doc/goals.html +41 -0
- data/doc/images/babelfish.png +0 -0
- data/doc/images/browser.png +0 -0
- data/doc/images/button.png +0 -0
- data/doc/images/call-chain-example.png +0 -0
- data/doc/images/colordialog.png +0 -0
- data/doc/images/datatarget.png +0 -0
- data/doc/images/dialog.png +0 -0
- data/doc/images/dilbert.png +0 -0
- data/doc/images/dirlist.png +0 -0
- data/doc/images/dropsite-droprejected.png +0 -0
- data/doc/images/foursplit.png +0 -0
- data/doc/images/gltest.png +0 -0
- data/doc/images/glviewer.png +0 -0
- data/doc/images/groupbox.png +0 -0
- data/doc/images/header.png +0 -0
- data/doc/images/hello-with-button.png +0 -0
- data/doc/images/hello-with-icon-1.png +0 -0
- data/doc/images/hello-with-icon-2.png +0 -0
- data/doc/images/hello-with-icon-3.png +0 -0
- data/doc/images/hello-with-tooltip.png +0 -0
- data/doc/images/hello-without-button.png +0 -0
- data/doc/images/hello.png +0 -0
- data/doc/images/hello2.png +0 -0
- data/doc/images/iconlist-bigicons.png +0 -0
- data/doc/images/iconlist-details.png +0 -0
- data/doc/images/image.png +0 -0
- data/doc/images/imageviewer.png +0 -0
- data/doc/images/inheritance.png +0 -0
- data/doc/images/mditest.png +0 -0
- data/doc/images/raabrowser.png +0 -0
- data/doc/images/scribble.png +0 -0
- data/doc/images/shutter.png +0 -0
- data/doc/images/splitter.png +0 -0
- data/doc/images/tabbook.png +0 -0
- data/doc/images/table.png +0 -0
- data/doc/images/tutorial1.png +0 -0
- data/doc/implementation.html +16 -0
- data/doc/infosources.html +33 -0
- data/doc/library.html +30 -0
- data/doc/opengl.html +73 -0
- data/doc/pt01.html +3 -0
- data/doc/pt02.html +3 -0
- data/doc/scintilla.html +36 -0
- data/doc/style.css +247 -0
- data/doc/subversion.html +21 -0
- data/doc/tutorial1.html +90 -0
- data/doc/unicode.html +56 -0
- data/examples/RAA.rb +25 -0
- data/examples/README +53 -0
- data/examples/babelfish.rb +93 -0
- data/examples/bounce.rb +159 -0
- data/examples/browser.rb +191 -0
- data/examples/button.rb +168 -0
- data/examples/custom_table_item.rb +170 -0
- data/examples/datatarget.rb +223 -0
- data/examples/dctest.rb +696 -0
- data/examples/dialog.rb +143 -0
- data/examples/dilbert.rb +66 -0
- data/examples/dirlist.rb +63 -0
- data/examples/dragdrop.rb +97 -0
- data/examples/dragsource.rb +80 -0
- data/examples/dropsite.rb +59 -0
- data/examples/foursplit.rb +97 -0
- data/examples/gltest.rb +330 -0
- data/examples/glviewer.rb +576 -0
- data/examples/groupbox.rb +392 -0
- data/examples/header.rb +149 -0
- data/examples/hello.rb +12 -0
- data/examples/hello2.rb +51 -0
- data/examples/iRAA.rb +153 -0
- data/examples/iconlist.rb +92 -0
- data/examples/icons/AngryGuyInBunnySuit.ico +0 -0
- data/examples/icons/FatBot.ico +0 -0
- data/examples/icons/FlippedySwitch.ico +0 -0
- data/examples/icons/LeGoon.ico +0 -0
- data/examples/icons/Net.ico +0 -0
- data/examples/icons/RedMacOS.ico +0 -0
- data/examples/icons/SawBlade.ico +0 -0
- data/examples/icons/backview.png +0 -0
- data/examples/icons/big.png +0 -0
- data/examples/icons/bigfolder.png +0 -0
- data/examples/icons/bigpenguin.png +0 -0
- data/examples/icons/bottomview.png +0 -0
- data/examples/icons/camera.png +0 -0
- data/examples/icons/capbutt.png +0 -0
- data/examples/icons/capnotlast.png +0 -0
- data/examples/icons/capproj.png +0 -0
- data/examples/icons/capround.png +0 -0
- data/examples/icons/colorpal.png +0 -0
- data/examples/icons/copy.png +0 -0
- data/examples/icons/cut.png +0 -0
- data/examples/icons/delimit.png +0 -0
- data/examples/icons/dippy.png +0 -0
- data/examples/icons/double_dash.png +0 -0
- data/examples/icons/filenew.png +0 -0
- data/examples/icons/fileopen.png +0 -0
- data/examples/icons/filesave.png +0 -0
- data/examples/icons/filesaveas.png +0 -0
- data/examples/icons/fonts.png +0 -0
- data/examples/icons/fox.png +0 -0
- data/examples/icons/foxicon.png +0 -0
- data/examples/icons/frontview.png +0 -0
- data/examples/icons/gem_big.png +0 -0
- data/examples/icons/gem_small.png +0 -0
- data/examples/icons/hello2.png +0 -0
- data/examples/icons/help.png +0 -0
- data/examples/icons/indent.png +0 -0
- data/examples/icons/jbevel.png +0 -0
- data/examples/icons/jmiter.png +0 -0
- data/examples/icons/jround.png +0 -0
- data/examples/icons/kill.png +0 -0
- data/examples/icons/leftview.png +0 -0
- data/examples/icons/light.png +0 -0
- data/examples/icons/minidoc.png +0 -0
- data/examples/icons/minifolder.png +0 -0
- data/examples/icons/minifolderopen.png +0 -0
- data/examples/icons/newfolder.png +0 -0
- data/examples/icons/nolight.png +0 -0
- data/examples/icons/onoff_dash.png +0 -0
- data/examples/icons/palette.png +0 -0
- data/examples/icons/parallel.png +0 -0
- data/examples/icons/paste.png +0 -0
- data/examples/icons/pattern.png +0 -0
- data/examples/icons/penguin.png +0 -0
- data/examples/icons/perspective.png +0 -0
- data/examples/icons/printicon.png +0 -0
- data/examples/icons/prop.png +0 -0
- data/examples/icons/redo.png +0 -0
- data/examples/icons/rightview.png +0 -0
- data/examples/icons/saveas.png +0 -0
- data/examples/icons/shutter1.png +0 -0
- data/examples/icons/shutter2.png +0 -0
- data/examples/icons/small.png +0 -0
- data/examples/icons/smoothlight.png +0 -0
- data/examples/icons/solid_line.png +0 -0
- data/examples/icons/tbuplevel.png +0 -0
- data/examples/icons/topview.png +0 -0
- data/examples/icons/undo.png +0 -0
- data/examples/icons/winapp.png +0 -0
- data/examples/icons/zoom.png +0 -0
- data/examples/image.rb +279 -0
- data/examples/imageviewer.rb +509 -0
- data/examples/inputs.rb +83 -0
- data/examples/mditest.rb +180 -0
- data/examples/pig.rb +77 -0
- data/examples/raabrowser.rb +122 -0
- data/examples/ratio.rb +80 -0
- data/examples/rulerview.rb +27 -0
- data/examples/scintilla-test.rb +81 -0
- data/examples/scribble-orig.rb +186 -0
- data/examples/scribble.rb +162 -0
- data/examples/shutter.rb +158 -0
- data/examples/splitter.rb +211 -0
- data/examples/styledtext.rb +82 -0
- data/examples/tabbook.rb +165 -0
- data/examples/table.rb +182 -0
- data/examples/textedit/commands.rb +114 -0
- data/examples/textedit/helpwindow.rb +299 -0
- data/examples/textedit/prefdialog.rb +239 -0
- data/examples/textedit/textedit.rb +1763 -0
- data/examples/unicode.rb +36 -0
- data/ext/fox16/fox16.bundle +0 -0
- data/lib/fox16/aliases.rb +5598 -0
- data/lib/fox16/calendar.rb +217 -0
- data/lib/fox16/chore.rb +105 -0
- data/lib/fox16/colors.rb +280 -0
- data/lib/fox16/core.rb +681 -0
- data/lib/fox16/dict.rb +35 -0
- data/lib/fox16/execute_nonmodal.rb +70 -0
- data/lib/fox16/glgroup.rb +166 -0
- data/lib/fox16/glshapes.rb +456 -0
- data/lib/fox16/input.rb +59 -0
- data/lib/fox16/irb.rb +178 -0
- data/lib/fox16/iterators.rb +371 -0
- data/lib/fox16/keys.rb +1374 -0
- data/lib/fox16/kwargs.rb +2736 -0
- data/lib/fox16/missingdep.rb +14 -0
- data/lib/fox16/pseudokeyboard.rb +40 -0
- data/lib/fox16/pseudomouse.rb +87 -0
- data/lib/fox16/responder.rb +70 -0
- data/lib/fox16/responder2.rb +131 -0
- data/lib/fox16/scintilla.rb +3641 -0
- data/lib/fox16/settings.rb +18 -0
- data/lib/fox16/signal.rb +71 -0
- data/lib/fox16/splashscreen.rb +82 -0
- data/lib/fox16/timeout.rb +136 -0
- data/lib/fox16/undolist.rb +455 -0
- data/lib/fox16/version.rb +9 -0
- data/rdoc-sources/FX4Splitter.rb +156 -0
- data/rdoc-sources/FX7Segment.rb +54 -0
- data/rdoc-sources/FXAccelTable.rb +102 -0
- data/rdoc-sources/FXApp.rb +545 -0
- data/rdoc-sources/FXArrowButton.rb +69 -0
- data/rdoc-sources/FXBMPIcon.rb +67 -0
- data/rdoc-sources/FXBMPImage.rb +30 -0
- data/rdoc-sources/FXBitmap.rb +115 -0
- data/rdoc-sources/FXBitmapFrame.rb +31 -0
- data/rdoc-sources/FXBitmapView.rb +44 -0
- data/rdoc-sources/FXButton.rb +59 -0
- data/rdoc-sources/FXCURCursor.rb +13 -0
- data/rdoc-sources/FXCanvas.rb +18 -0
- data/rdoc-sources/FXCheckButton.rb +58 -0
- data/rdoc-sources/FXChoiceBox.rb +49 -0
- data/rdoc-sources/FXColorBar.rb +48 -0
- data/rdoc-sources/FXColorDialog.rb +37 -0
- data/rdoc-sources/FXColorList.rb +55 -0
- data/rdoc-sources/FXColorRing.rb +49 -0
- data/rdoc-sources/FXColorSelector.rb +65 -0
- data/rdoc-sources/FXColorWell.rb +65 -0
- data/rdoc-sources/FXColorWheel.rb +57 -0
- data/rdoc-sources/FXComboBox.rb +211 -0
- data/rdoc-sources/FXComposite.rb +34 -0
- data/rdoc-sources/FXCursor.rb +67 -0
- data/rdoc-sources/FXDC.rb +720 -0
- data/rdoc-sources/FXDCPrint.rb +127 -0
- data/rdoc-sources/FXDCWindow.rb +33 -0
- data/rdoc-sources/FXDataTarget.rb +66 -0
- data/rdoc-sources/FXDebugTarget.rb +25 -0
- data/rdoc-sources/FXDelegator.rb +23 -0
- data/rdoc-sources/FXDial.rb +107 -0
- data/rdoc-sources/FXDialogBox.rb +32 -0
- data/rdoc-sources/FXDict.rb +79 -0
- data/rdoc-sources/FXDirBox.rb +55 -0
- data/rdoc-sources/FXDirDialog.rb +47 -0
- data/rdoc-sources/FXDirList.rb +149 -0
- data/rdoc-sources/FXDirSelector.rb +64 -0
- data/rdoc-sources/FXDockBar.rb +151 -0
- data/rdoc-sources/FXDockHandler.rb +26 -0
- data/rdoc-sources/FXDockSite.rb +104 -0
- data/rdoc-sources/FXDockTitle.rb +26 -0
- data/rdoc-sources/FXDocument.rb +29 -0
- data/rdoc-sources/FXDragCorner.rb +19 -0
- data/rdoc-sources/FXDrawable.rb +27 -0
- data/rdoc-sources/FXDriveBox.rb +46 -0
- data/rdoc-sources/FXExtentd.rb +85 -0
- data/rdoc-sources/FXExtentf.rb +85 -0
- data/rdoc-sources/FXFileDialog.rb +217 -0
- data/rdoc-sources/FXFileDict.rb +131 -0
- data/rdoc-sources/FXFileList.rb +208 -0
- data/rdoc-sources/FXFileSelector.rb +184 -0
- data/rdoc-sources/FXFileStream.rb +27 -0
- data/rdoc-sources/FXFoldingList.rb +504 -0
- data/rdoc-sources/FXFont.rb +361 -0
- data/rdoc-sources/FXFontDialog.rb +14 -0
- data/rdoc-sources/FXFontSelector.rb +37 -0
- data/rdoc-sources/FXFrame.rb +53 -0
- data/rdoc-sources/FXGIFCursor.rb +50 -0
- data/rdoc-sources/FXGIFIcon.rb +31 -0
- data/rdoc-sources/FXGIFImage.rb +29 -0
- data/rdoc-sources/FXGLCanvas.rb +45 -0
- data/rdoc-sources/FXGLContext.rb +40 -0
- data/rdoc-sources/FXGLObject.rb +75 -0
- data/rdoc-sources/FXGLShape.rb +69 -0
- data/rdoc-sources/FXGLViewer.rb +332 -0
- data/rdoc-sources/FXGLVisual.rb +94 -0
- data/rdoc-sources/FXGradientBar.rb +301 -0
- data/rdoc-sources/FXGroupBox.rb +33 -0
- data/rdoc-sources/FXHeader.rb +408 -0
- data/rdoc-sources/FXHorizontalFrame.rb +29 -0
- data/rdoc-sources/FXICOIcon.rb +65 -0
- data/rdoc-sources/FXICOImage.rb +31 -0
- data/rdoc-sources/FXIcon.rb +38 -0
- data/rdoc-sources/FXIconDict.rb +48 -0
- data/rdoc-sources/FXIconList.rb +447 -0
- data/rdoc-sources/FXIconSource.rb +100 -0
- data/rdoc-sources/FXId.rb +34 -0
- data/rdoc-sources/FXImage.rb +292 -0
- data/rdoc-sources/FXImageFrame.rb +36 -0
- data/rdoc-sources/FXImageView.rb +35 -0
- data/rdoc-sources/FXInputDialog.rb +77 -0
- data/rdoc-sources/FXJPGIcon.rb +70 -0
- data/rdoc-sources/FXJPGImage.rb +38 -0
- data/rdoc-sources/FXKnob.rb +76 -0
- data/rdoc-sources/FXLabel.rb +69 -0
- data/rdoc-sources/FXList.rb +440 -0
- data/rdoc-sources/FXListBox.rb +191 -0
- data/rdoc-sources/FXMDIButton.rb +67 -0
- data/rdoc-sources/FXMDIChild.rb +155 -0
- data/rdoc-sources/FXMDIClient.rb +65 -0
- data/rdoc-sources/FXMainWindow.rb +26 -0
- data/rdoc-sources/FXMatrix.rb +57 -0
- data/rdoc-sources/FXMemoryBuffer.rb +28 -0
- data/rdoc-sources/FXMemoryStream.rb +50 -0
- data/rdoc-sources/FXMenuBar.rb +23 -0
- data/rdoc-sources/FXMenuButton.rb +84 -0
- data/rdoc-sources/FXMenuCaption.rb +50 -0
- data/rdoc-sources/FXMenuCascade.rb +18 -0
- data/rdoc-sources/FXMenuCheck.rb +30 -0
- data/rdoc-sources/FXMenuCommand.rb +26 -0
- data/rdoc-sources/FXMenuPane.rb +13 -0
- data/rdoc-sources/FXMenuRadio.rb +33 -0
- data/rdoc-sources/FXMenuSeparator.rb +21 -0
- data/rdoc-sources/FXMenuTitle.rb +27 -0
- data/rdoc-sources/FXMessageBox.rb +72 -0
- data/rdoc-sources/FXObject.rb +28 -0
- data/rdoc-sources/FXOptionMenu.rb +83 -0
- data/rdoc-sources/FXPCXIcon.rb +63 -0
- data/rdoc-sources/FXPCXImage.rb +31 -0
- data/rdoc-sources/FXPNGIcon.rb +66 -0
- data/rdoc-sources/FXPNGImage.rb +34 -0
- data/rdoc-sources/FXPPMIcon.rb +36 -0
- data/rdoc-sources/FXPPMImage.rb +31 -0
- data/rdoc-sources/FXPacker.rb +63 -0
- data/rdoc-sources/FXPicker.rb +27 -0
- data/rdoc-sources/FXPopup.rb +53 -0
- data/rdoc-sources/FXPrintDialog.rb +36 -0
- data/rdoc-sources/FXProgressBar.rb +57 -0
- data/rdoc-sources/FXProgressDialog.rb +36 -0
- data/rdoc-sources/FXQuatd.rb +164 -0
- data/rdoc-sources/FXQuatf.rb +173 -0
- data/rdoc-sources/FXRGBIcon.rb +64 -0
- data/rdoc-sources/FXRGBImage.rb +31 -0
- data/rdoc-sources/FXRadioButton.rb +70 -0
- data/rdoc-sources/FXRanged.rb +100 -0
- data/rdoc-sources/FXRangef.rb +100 -0
- data/rdoc-sources/FXRealSlider.rb +101 -0
- data/rdoc-sources/FXRealSpinner.rb +140 -0
- data/rdoc-sources/FXRecentFiles.rb +77 -0
- data/rdoc-sources/FXRectangle.rb +149 -0
- data/rdoc-sources/FXRegion.rb +64 -0
- data/rdoc-sources/FXRegistry.rb +56 -0
- data/rdoc-sources/FXReplaceDialog.rb +56 -0
- data/rdoc-sources/FXRootWindow.rb +17 -0
- data/rdoc-sources/FXRuler.rb +130 -0
- data/rdoc-sources/FXRulerView.rb +225 -0
- data/rdoc-sources/FXScintilla.rb +121 -0
- data/rdoc-sources/FXScrollArea.rb +86 -0
- data/rdoc-sources/FXScrollBar.rb +107 -0
- data/rdoc-sources/FXScrollPane.rb +28 -0
- data/rdoc-sources/FXScrollWindow.rb +38 -0
- data/rdoc-sources/FXSearchDialog.rb +24 -0
- data/rdoc-sources/FXSeparator.rb +74 -0
- data/rdoc-sources/FXSettings.rb +248 -0
- data/rdoc-sources/FXShell.rb +8 -0
- data/rdoc-sources/FXShutter.rb +102 -0
- data/rdoc-sources/FXSize.rb +95 -0
- data/rdoc-sources/FXSlider.rb +98 -0
- data/rdoc-sources/FXSphered.rb +80 -0
- data/rdoc-sources/FXSpheref.rb +80 -0
- data/rdoc-sources/FXSpinner.rb +136 -0
- data/rdoc-sources/FXSplashWindow.rb +27 -0
- data/rdoc-sources/FXSplitter.rb +89 -0
- data/rdoc-sources/FXSpring.rb +61 -0
- data/rdoc-sources/FXStatusBar.rb +42 -0
- data/rdoc-sources/FXStatusLine.rb +60 -0
- data/rdoc-sources/FXStream.rb +142 -0
- data/rdoc-sources/FXStringDict.rb +38 -0
- data/rdoc-sources/FXSwitcher.rb +78 -0
- data/rdoc-sources/FXTGAIcon.rb +63 -0
- data/rdoc-sources/FXTGAImage.rb +31 -0
- data/rdoc-sources/FXTIFIcon.rb +70 -0
- data/rdoc-sources/FXTIFImage.rb +37 -0
- data/rdoc-sources/FXTabBar.rb +80 -0
- data/rdoc-sources/FXTabBook.rb +41 -0
- data/rdoc-sources/FXTabItem.rb +58 -0
- data/rdoc-sources/FXTable.rb +967 -0
- data/rdoc-sources/FXText.rb +578 -0
- data/rdoc-sources/FXTextField.rb +151 -0
- data/rdoc-sources/FXToggleButton.rb +70 -0
- data/rdoc-sources/FXToolBar.rb +61 -0
- data/rdoc-sources/FXToolBarGrip.rb +50 -0
- data/rdoc-sources/FXToolBarShell.rb +44 -0
- data/rdoc-sources/FXToolBarTab.rb +74 -0
- data/rdoc-sources/FXToolTip.rb +36 -0
- data/rdoc-sources/FXTopWindow.rb +163 -0
- data/rdoc-sources/FXTranslator.rb +32 -0
- data/rdoc-sources/FXTreeList.rb +514 -0
- data/rdoc-sources/FXTreeListBox.rb +219 -0
- data/rdoc-sources/FXTriStateButton.rb +49 -0
- data/rdoc-sources/FXVec2d.rb +96 -0
- data/rdoc-sources/FXVec2f.rb +96 -0
- data/rdoc-sources/FXVec3d.rb +113 -0
- data/rdoc-sources/FXVec3f.rb +113 -0
- data/rdoc-sources/FXVec4d.rb +129 -0
- data/rdoc-sources/FXVec4f.rb +129 -0
- data/rdoc-sources/FXVerticalFrame.rb +29 -0
- data/rdoc-sources/FXVisual.rb +79 -0
- data/rdoc-sources/FXWindow.rb +725 -0
- data/rdoc-sources/FXWizard.rb +59 -0
- data/rdoc-sources/FXXBMIcon.rb +37 -0
- data/rdoc-sources/FXXBMImage.rb +32 -0
- data/rdoc-sources/FXXPMIcon.rb +65 -0
- data/rdoc-sources/FXXPMImage.rb +31 -0
- data/rdoc-sources/README.rdoc +53 -0
- data/rdoc-sources/fxdefs.rb +90 -0
- data/tests/README +19 -0
- data/tests/TC_FXAccelTable.rb +43 -0
- data/tests/TC_FXApp.rb +15 -0
- data/tests/TC_FXArc.rb +26 -0
- data/tests/TC_FXBMPIcon.rb +15 -0
- data/tests/TC_FXBMPImage.rb +15 -0
- data/tests/TC_FXButton.rb +72 -0
- data/tests/TC_FXCheckButton.rb +57 -0
- data/tests/TC_FXComboBox.rb +52 -0
- data/tests/TC_FXDC.rb +372 -0
- data/tests/TC_FXDCPrint.rb +102 -0
- data/tests/TC_FXDCWindow.rb +23 -0
- data/tests/TC_FXDataTarget.rb +24 -0
- data/tests/TC_FXDirList.rb +30 -0
- data/tests/TC_FXFileAssoc.rb +62 -0
- data/tests/TC_FXFileStream.rb +90 -0
- data/tests/TC_FXFoldingList.rb +32 -0
- data/tests/TC_FXFont.rb +69 -0
- data/tests/TC_FXFontDesc.rb +58 -0
- data/tests/TC_FXGLGroup.rb +32 -0
- data/tests/TC_FXGLShape.rb +28 -0
- data/tests/TC_FXGLViewer.rb +20 -0
- data/tests/TC_FXGradientBar.rb +89 -0
- data/tests/TC_FXHeader.rb +82 -0
- data/tests/TC_FXIconDict.rb +52 -0
- data/tests/TC_FXIconList.rb +192 -0
- data/tests/TC_FXId.rb +19 -0
- data/tests/TC_FXImage.rb +155 -0
- data/tests/TC_FXLight.rb +33 -0
- data/tests/TC_FXList.rb +116 -0
- data/tests/TC_FXListBox.rb +49 -0
- data/tests/TC_FXMat4f.rb +228 -0
- data/tests/TC_FXMaterial.rb +89 -0
- data/tests/TC_FXMemoryStream.rb +97 -0
- data/tests/TC_FXMenuCheck.rb +57 -0
- data/tests/TC_FXMenuCommand.rb +12 -0
- data/tests/TC_FXMenuRadio.rb +57 -0
- data/tests/TC_FXPoint.rb +57 -0
- data/tests/TC_FXQuatf.rb +77 -0
- data/tests/TC_FXRadioButton.rb +57 -0
- data/tests/TC_FXRangef.rb +48 -0
- data/tests/TC_FXRectangle.rb +88 -0
- data/tests/TC_FXRegion.rb +54 -0
- data/tests/TC_FXRegistry.rb +27 -0
- data/tests/TC_FXScrollArea.rb +28 -0
- data/tests/TC_FXScrollWindow.rb +28 -0
- data/tests/TC_FXSegment.rb +22 -0
- data/tests/TC_FXSettings.rb +34 -0
- data/tests/TC_FXShell.rb +26 -0
- data/tests/TC_FXSize.rb +54 -0
- data/tests/TC_FXStream.rb +11 -0
- data/tests/TC_FXTable.rb +368 -0
- data/tests/TC_FXTableItem.rb +48 -0
- data/tests/TC_FXText.rb +96 -0
- data/tests/TC_FXTopWindow.rb +32 -0
- data/tests/TC_FXTreeList.rb +100 -0
- data/tests/TC_FXTreeListBox.rb +41 -0
- data/tests/TC_FXUndoList.rb +43 -0
- data/tests/TC_FXVec2d.rb +142 -0
- data/tests/TC_FXVec2f.rb +137 -0
- data/tests/TC_FXVec3d.rb +150 -0
- data/tests/TC_FXVec3f.rb +150 -0
- data/tests/TC_FXVec4f.rb +158 -0
- data/tests/TC_FXViewport.rb +30 -0
- data/tests/TC_FXXBMIcon.rb +15 -0
- data/tests/TC_FXXBMImage.rb +15 -0
- data/tests/TC_FXXPMIcon.rb +15 -0
- data/tests/TC_FXXPMImage.rb +15 -0
- data/tests/TC_Misc.rb +157 -0
- data/tests/TC_downcast.rb +15 -0
- data/tests/TS_All.rb +25 -0
- data/tests/blankpage.ps +166 -0
- data/tests/howdypage.ps +181 -0
- data/tests/output.ps +166 -0
- data/tests/stress1.rb +92 -0
- data/tests/stress2.rb +51 -0
- data/tests/stress3.rb +117 -0
- data/tests/testcase.rb +37 -0
- data/web/community.html +94 -0
- data/web/documentation.html +100 -0
- data/web/downloads.html +114 -0
- data/web/index.html +96 -0
- metadata +550 -0
data/doc/build.html
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
<html><head>
|
2
|
+
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
3
|
+
<title>Chapter 1. Building from Source Code</title><link rel="stylesheet" href="style.css" type="text/css"><meta name="generator" content="DocBook v5 XSL Stylesheets V1.72.0"><link rel="start" href="book.html" title="Developing Graphical User Interfaces with FXRuby"><link rel="up" href="pt01.html" title="Part I. The Basics"><link rel="prev" href="goals.html" title="History and Goals"><link rel="next" href="gems.html" title="Chapter 2. Installing from Gems"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 1. Building from Source Code</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="goals.html">Prev</a> </td><th width="60%" align="center">Part I. The Basics</th><td width="20%" align="right"> <a accesskey="n" href="gems.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="build"></a>Chapter 1. Building from Source Code</h2></div></div></div><p>This chapter provides instructions for building and installing FXRuby
|
4
|
+
directly from source, and not using some more direct means (such as
|
5
|
+
installing a gem, or via some package manager).</p><div class="itemizedlist"><ul type="disc"><li><p>If you're planning to use FXRuby on Windows, with the standard
|
6
|
+
<a xmlns:xlink="http://www.w3.org/1999/xlink" href="http://rubyinstaller.rubyforge.org" target="_top">Ruby Installer for
|
7
|
+
Windows</a>, you may wish to just download the pre-compiled binaries
|
8
|
+
from the <a xmlns:xlink="http://www.w3.org/1999/xlink" href="http://rubyforge.org/projects/fxruby" target="_top">RubyForge
|
9
|
+
project page</a> for FXRuby.</p></li><li><p>If you're already using the <a xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.macports.org/" target="_top">MacPorts</a> version of ruby, you may
|
10
|
+
wish to just install the <code class="filename">rb-fxruby</code> port.</p></li></ul></div><div class="simplesect" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e109"></a>Building From Source on Unix/Linux</h2></div></div></div><p>These instructions assume that you've already downloaded, compiled
|
11
|
+
and installed FOX. Next, you'll need to download the FXRuby source code
|
12
|
+
tarball and unpack it by typing:</p><pre class="screen">$ <span><strong class="command">tar xzf FXRuby-1.6.13.tar.gz</strong></span></pre><p>This will create a new directory called <code class="filename">FXRuby-1.6.13</code>. Change to the top-level
|
13
|
+
directory and configure the build by typing:</p><pre class="screen">$ <span><strong class="command">ruby install.rb config</strong></span></pre><p>By default, the <code class="filename">install.rb</code> script will look for
|
14
|
+
the FOX include files and library in the standard <code class="filename">/usr/local/include/fox-1.6</code> and <code class="filename">/usr/local/lib</code> directories, respectively. You
|
15
|
+
can override these locations by passing a few additional arguments to
|
16
|
+
<code class="filename">install.rb</code> during this step, e.g.</p><pre class="screen">$ <span><strong class="command">ruby install.rb config -- \
|
17
|
+
--with-fox-include=/home/lyle/fox-1.6.32/include \
|
18
|
+
--with-fox-lib=/home/lyle/fox-1.6.32/src/.libs</strong></span></pre><p>Once the build has been configured, you can start the build by
|
19
|
+
typing:</p><pre class="screen">$ <span><strong class="command">ruby install.rb setup</strong></span></pre><p>It will take quite awhile to build FXRuby, even on a fast machine,
|
20
|
+
so this might be a good time to take a coffee break. If you run into
|
21
|
+
problems during the compilation, please check the <a href="build.html#tragedies" title="Things That Can Go Wrong">list of things that can go wrong</a> for
|
22
|
+
workarounds for those problems.</p><p>Once it's finished compiling, install FXRuby by typing:</p><pre class="screen">$ <span><strong class="command">ruby install.rb install</strong></span></pre><p>As a quick sanity check, to make sure that all is well, you should
|
23
|
+
probably fire up <code class="filename">irb</code> and try to import FXRuby:</p><pre class="screen">$ <span><strong class="command">irb</strong></span>
|
24
|
+
irb(main):001:0> <strong class="userinput"><code>require 'fox16'</code></strong>
|
25
|
+
true
|
26
|
+
irb(main):002:0></pre><p>If the import failed (usually with a message along the lines of
|
27
|
+
"Cannot load library"), check the <a href="build.html#tragedies" title="Things That Can Go Wrong">list of things
|
28
|
+
that can go wrong</a> for known problems. If that still doesn't solve
|
29
|
+
your problem, drop me an e-mail or ask around on the Ruby newsgroup or
|
30
|
+
mailing list; it's quite likely that someone else has run into this
|
31
|
+
problem too. Once you do have a working FXRuby installation, you're ready
|
32
|
+
to check out the example programs.</p></div><div class="simplesect" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e180"></a>Building From Source on Windows (Using Visual C++)</h2></div></div></div><p>This section describes how to compile FXRuby using Microsoft Visual
|
33
|
+
C++, for use with a Ruby that was also compiled using Visual C++.</p><p>This discussion assumes that you've built Ruby using the
|
34
|
+
instructions and build files distributed with the standard Ruby source
|
35
|
+
code. To review, you should have started by unpacking the source code
|
36
|
+
tarball, changing into the top-level source code directory (e.g. <code class="filename">C:\ruby-1.8.6</code>) and then typing:</p><pre class="screen">C:\ruby-1.8.6><span><strong class="command">win32\configure</strong></span>
|
37
|
+
type 'nmake' to make ruby for mswin32.
|
38
|
+
C:\ruby-1.8.6><span><strong class="command">nmake</strong></span></pre><p>After the compilation finished, you installed Ruby somewhere by
|
39
|
+
typing, e.g.,</p><pre class="screen">C:\ruby-1.8.6><span><strong class="command">nmake DESTDIR=C:\ruby install</strong></span></pre><p>Similarly, I'm assuming that you built the FOX library using the
|
40
|
+
Developer Studio project files distributed with the standard FOX source
|
41
|
+
code distribution.</p><p>Now you can configure the FXRuby build by typing:</p><pre class="screen">C:\FXRuby-1.6.13><span><strong class="command">ruby install.rb config --make-prog=nmake -- \
|
42
|
+
--with-fox-include=C:\fox-1.6.32\include \
|
43
|
+
--with-fox-lib=C:\fox-1.6.32\lib</strong></span></pre><p>Once the build has been configured, you can start the build by
|
44
|
+
typing:</p><pre class="screen">C:\FXRuby-1.6.13> <span><strong class="command">ruby install.rb setup</strong></span></pre><p>It will take quite awhile to build FXRuby, even on a fast machine,
|
45
|
+
so this might be a good time to take a coffee break. Because Visual C++ is
|
46
|
+
such a strict compiler (usually a good thing), you will probably run into
|
47
|
+
a few problems with non-ANSI declarations in the Ruby header files. If you
|
48
|
+
do run into problems during the compilation, just check the next section
|
49
|
+
for a list of things that could go wrong, and workarounds for those
|
50
|
+
problems. None of them are showstoppers and none require you to restart
|
51
|
+
the compile from scratch (just type <span><strong class="command">ruby install.rb
|
52
|
+
setup</strong></span> to pick up where you left off).</p><p>Once it's finished compiling, install FXRuby by typing:</p><pre class="screen">C:\FXRuby-1.6.13> <span><strong class="command">ruby install.rb install</strong></span></pre><p>As a quick sanity check, to make sure that all is well, you should
|
53
|
+
probably fire up <code class="filename">irb</code> and try to import FXRuby:</p><pre class="screen">C:\FXRuby-1.6.13> <span><strong class="command">irb</strong></span>
|
54
|
+
irb(main):001:0> <strong class="userinput"><code>require 'fox16'</code></strong>
|
55
|
+
true
|
56
|
+
irb(main):002:0></pre><p>If the import failed (usually with a message along the lines of
|
57
|
+
"Cannot load library"), check the list of things that can go wrong for
|
58
|
+
known problems. If that still doesn't solve your problem, drop me an
|
59
|
+
e-mail or ask around on the Ruby newsgroup or mailing list; it's quite
|
60
|
+
likely that someone else has run into this problem too. Once you do have a
|
61
|
+
working FXRuby installation, you're ready to check out the example
|
62
|
+
programs.</p></div><div class="simplesect" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="tragedies"></a>Things That Can Go Wrong</h2></div></div></div><p><span class="emphasis"><em>"Too many arguments to function..."</em></span></p><p>The include files for Ruby versions 1.6.7 and earlier still have
|
63
|
+
several function prototypes in the older "K & R" C style, where the
|
64
|
+
function's argument list is not included; for example, the function
|
65
|
+
<code class="function">rb_thread_wait_for()</code> takes a single argument of type
|
66
|
+
<span class="type">struct timeval</span>, but its prototype in
|
67
|
+
<code class="filename">intern.h</code> is:</p><pre class="programlisting">void rb_thread_wait_for();</pre><p>Because FXRuby is written in C++, and C++ requires strict ANSI
|
68
|
+
C-style function prototypes, code that attempts to call one of these
|
69
|
+
functions will fail to compile under some compilers. For example, the
|
70
|
+
error message from gcc will look something like this:</p><pre class="screen">FXRbApp.cpp: In method `long int FXRbApp::onChoreThreads (FXObject *, unsigned int, void *)':
|
71
|
+
/usr/local/lib/ruby/1.8/i686-linux/intern.h:172: too many arguments to function `void rb_thread_wait_for ()'
|
72
|
+
FXRbApp.cpp:100: at this point in file
|
73
|
+
make: *** [FXRbApp.o] Error 1</pre><p>while the error message from Microsoft's Visual C++ compiler looks
|
74
|
+
something like this:</p><pre class="screen">FXRbApp.cpp(109): error C2660: 'rb_thread_wait_for' : function does not take 1 parameters
|
75
|
+
NMAKE : fatal error U1077: 'cl' : return code '0x2'
|
76
|
+
Stop.</pre><p>This problem with the Ruby header files has been corrected for Ruby
|
77
|
+
versions 1.6.8 (and later), but if you're building for an older version of
|
78
|
+
Ruby you can do one of two things to work around the problem:</p><div class="itemizedlist"><ul type="bullet"><li style="list-style-type: disc"><p>If you're using gcc version 2.95 or earlier, try modifying the
|
79
|
+
compiler flags (<code class="constant">CFLAGS</code>) in the FXRuby
|
80
|
+
<code class="filename">Makefile</code> to include the
|
81
|
+
<code class="option">-fno-strict-prototype</code> option; this should instruct
|
82
|
+
the compiler to allow these kinds of discrepancies. Unfortunately,
|
83
|
+
this flag is not supported in more recent versions of gcc.</p></li><li style="list-style-type: disc"><p>A more direct approach is to just fix the offending declarations
|
84
|
+
in the Ruby include file(s), i.e. change the declaration for
|
85
|
+
<code class="function">rb_thread_wait_for()</code> in
|
86
|
+
<code class="filename">intern.h</code> to read:</p><pre class="programlisting">void rb_thread_wait_for(struct timeval);</pre><p>and change the declaration for <code class="function">rb_gc_mark()</code>
|
87
|
+
in <code class="filename">intern.h</code> to read:</p><pre class="programlisting">void rb_gc_mark(VALUE);</pre></li></ul></div><p><span class="emphasis"><em>"Virtual Memory Exhausted"</em></span></p><p>For FXRuby releases earlier than version 0.99.173 it was common for
|
88
|
+
the compiler to run out of memory trying to compile
|
89
|
+
<code class="filename">core_wrap.cpp</code>, with an error message like:</p><pre class="screen">core_wrap.cpp: In function 'void Init_core()':
|
90
|
+
core_wrap.cpp:108596: virtual memory exhausted</pre><p>This failure was due to the use of optimizations by the compiler;
|
91
|
+
the FXRuby source code makes heavy use of C++ templates and some versions
|
92
|
+
of gcc require a lot of memory to process these. Starting with FXRuby
|
93
|
+
version 0.99.173, the <code class="filename">extconf.rb</code> script
|
94
|
+
<span class="emphasis"><em>should</em></span> disable compiler optimizations when it
|
95
|
+
generates the FXRuby <code class="filename">Makefile</code>. If you suspect that
|
96
|
+
it's not disabling optimizations (or can see this by watching the compile
|
97
|
+
command lines), try modifying the compiler flags
|
98
|
+
(<code class="constant">CFLAGS</code>) in the <code class="filename">Makefile</code> by hand
|
99
|
+
to do so.</p><p><span class="emphasis"><em>"Cannot load library"</em></span></p><p>On Linux and other Unix systems that support shared libraries, FOX
|
100
|
+
is typically installed as a shared library named
|
101
|
+
<code class="filename">libFOX-1.6.so</code>. After all of the source files for
|
102
|
+
FXRuby are compiled, the last step is to link all of the FXRuby object
|
103
|
+
files together with the FOX library (and possibly other system libraries)
|
104
|
+
to produce a new shared library, named <code class="filename">fox16.so</code>, that
|
105
|
+
Ruby can import as an extension module.</p><p>There are a few things that can go wrong when you try to import this
|
106
|
+
extension into Ruby. A common problem is that the operating system cannot
|
107
|
+
locate the FOX shared library (<code class="filename">libFOX-1.6.so</code>) when it
|
108
|
+
tries to dynamically load the FXRuby extension module; when this happens,
|
109
|
+
the error message will look something like:</p><pre class="screen">$ <span><strong class="command">irb</strong></span>
|
110
|
+
irb(main):001:0> <strong class="userinput"><code>require 'fox16'</code></strong>
|
111
|
+
LoadError: libFOX-1.6.so: cannot open shared object file: No such file or directory - /usr/local/lib/ruby/1.8/i686-linux/fox16.so
|
112
|
+
from (irb):1:in 'require'
|
113
|
+
from (irb):1
|
114
|
+
</pre><p>One workaround for this problem is to modify the
|
115
|
+
<code class="constant">LD_LIBRARY_PATH</code> environment variable to include the
|
116
|
+
directory where <code class="filename">libFOX-1.6.so</code> is installed. For
|
117
|
+
example, if <code class="filename">libFOX-1.6.so</code> is installed in <code class="filename">/usr/local/lib</code>, try setting:</p><pre class="screen">$ <span><strong class="command">export LD_LIBRARY_PATH=/usr/local/lib</strong></span>
|
118
|
+
$ <span><strong class="command">irb</strong></span>
|
119
|
+
irb(main):001:0> <strong class="userinput"><code>require 'fox16'</code></strong>
|
120
|
+
</pre><p>If this works, you can of course permanently add the
|
121
|
+
<code class="constant">LD_LIBRARY_PATH</code> setting to your login file(s) so that
|
122
|
+
you don't have to remember to type it each time. Another approach that
|
123
|
+
should work for Linux is to modify your
|
124
|
+
<code class="filename">/etc/ld.so.conf</code> file to include the installation
|
125
|
+
directory (e.g. <code class="filename">/usr/local/lib</code>). If you'd like to do
|
126
|
+
this instead, you'll need to (as root):</p><div class="orderedlist"><ol type="1" compact><li><p>Edit your <code class="filename">/etc/ld.so.conf</code> file and add the
|
127
|
+
directory where <code class="filename">libFOX-1.6.so</code> is installed;
|
128
|
+
and,</p></li><li><p>At the shell prompt, type <span><strong class="command">ldconfig</strong></span> to reload
|
129
|
+
the linker configuration.</p></li></ol></div><p><span class="emphasis"><em>"Undefined symbol..."</em></span></p><p>Another problem that has been reported by users of both Debian
|
130
|
+
GNU/Linux and NetBSD 1.5 is an error message along the lines of:</p><pre class="screen">/usr/lib/libstdc++.so.2: Undefined symbol "__vt_9exception"...</pre><p>The fix for this problem is reported to be to modify the FXRuby
|
131
|
+
<code class="filename">Makefile</code> and add <code class="option">-lgcc</code> to the
|
132
|
+
<code class="constant">LIBS</code> line.</p></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="goals.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="pt01.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="gems.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">History and Goals </td><td width="20%" align="center"><a accesskey="h" href="book.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 2. Installing from Gems</td></tr></table></div></body></html>
|
data/doc/ch03s02.html
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
<html><head>
|
2
|
+
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
3
|
+
<title>Better living through buttons</title><link rel="stylesheet" href="style.css" type="text/css"><meta name="generator" content="DocBook v5 XSL Stylesheets V1.72.0"><link rel="start" href="book.html" title="Developing Graphical User Interfaces with FXRuby"><link rel="up" href="tutorial1.html" title="Chapter 3. Hello, World!"><link rel="prev" href="tutorial1.html" title="Chapter 3. Hello, World!"><link rel="next" href="ch03s03.html" title="Messages"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Better living through buttons</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="tutorial1.html">Prev</a> </td><th width="60%" align="center">Chapter 3. Hello, World!</th><td width="20%" align="right"> <a accesskey="n" href="ch03s03.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e741"></a>Better living through buttons</h2></div></div></div><p>Obviously, we need to add a few things to make it more interesting.
|
4
|
+
Let's start by putting a button inside the main window. The
|
5
|
+
<code class="classname">FXButton</code> class provides a standard push-button
|
6
|
+
widget:</p><pre class="programlisting">require 'fox16'
|
7
|
+
|
8
|
+
include Fox
|
9
|
+
|
10
|
+
theApp = FXApp.new
|
11
|
+
|
12
|
+
theMainWindow = FXMainWindow.new(theApp, "Hello")
|
13
|
+
<span class="bold"><strong>FXButton.new(theMainWindow, "Hello, World!")</strong></span>
|
14
|
+
theApp.create
|
15
|
+
|
16
|
+
theMainWindow.show
|
17
|
+
|
18
|
+
theApp.run</pre><p>As you might guess, passing <em class="parameter"><code>theMainWindow</code></em> as
|
19
|
+
the first argument to <code class="methodname">FXButton.new</code> tells FXRuby
|
20
|
+
that the new button is a child of the main window. The second argument to
|
21
|
+
<code class="methodname">FXButton.new</code> is a string that will be displayed
|
22
|
+
on the button. If you run the program <span class="emphasis"><em>now</em></span>, you should
|
23
|
+
see this:</p><div class="screenshot"><div class="mediaobject" align="center"><img src="images/hello-with-button.png" align="middle"></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="tutorial1.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="tutorial1.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch03s03.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 3. Hello, World! </td><td width="20%" align="center"><a accesskey="h" href="book.html">Home</a></td><td width="40%" align="right" valign="top"> Messages</td></tr></table></div></body></html>
|
data/doc/ch03s03.html
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
<html><head>
|
2
|
+
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
3
|
+
<title>Messages</title><link rel="stylesheet" href="style.css" type="text/css"><meta name="generator" content="DocBook v5 XSL Stylesheets V1.72.0"><link rel="start" href="book.html" title="Developing Graphical User Interfaces with FXRuby"><link rel="up" href="tutorial1.html" title="Chapter 3. Hello, World!"><link rel="prev" href="ch03s02.html" title="Better living through buttons"><link rel="next" href="ch03s04.html" title="Adding a tool tip"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Messages</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s02.html">Prev</a> </td><th width="60%" align="center">Chapter 3. Hello, World!</th><td width="20%" align="right"> <a accesskey="n" href="ch03s04.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e772"></a>Messages</h2></div></div></div><p>Now we're cookin' with Crisco, but let's press on and see what other
|
4
|
+
things we can do to improve this. You may have noticed by now that the
|
5
|
+
only way to quit the program is to close the window using the window
|
6
|
+
manager's "close window" option, or to just kill the program outright. We
|
7
|
+
can do better than that. Let's add a message handler for the
|
8
|
+
<code class="classname">FXButton</code> such that when you click the button, it
|
9
|
+
causes the program to exit:</p><pre class="programlisting">require 'fox16'
|
10
|
+
|
11
|
+
include Fox
|
12
|
+
|
13
|
+
theApp = FXApp.new
|
14
|
+
|
15
|
+
theMainWindow = FXMainWindow.new(theApp, "Hello")
|
16
|
+
theButton = FXButton.new(theMainWindow, "Hello, World!")
|
17
|
+
<span class="bold"><strong>theButton.connect(SEL_COMMAND) do |sender, selector, data|
|
18
|
+
exit
|
19
|
+
end</strong></span>
|
20
|
+
theApp.create
|
21
|
+
|
22
|
+
theMainWindow.show
|
23
|
+
|
24
|
+
theApp.run</pre><p>Most FOX objects send out messages (also known as
|
25
|
+
<span class="emphasis"><em>events</em></span>) when something interesting happens. FOX
|
26
|
+
messages have four important elements:</p><div class="orderedlist"><ol type="1"><li><p>The message <span class="emphasis"><em>sender</em></span> is the object that sends
|
27
|
+
the message. In this case, the <code class="classname">FXButton</code>
|
28
|
+
instance is the sender.</p></li><li><p>The message <span class="emphasis"><em>type</em></span> is a predefined integer
|
29
|
+
constant that indicates what kind of event has occurred (i.e. why this
|
30
|
+
message is being sent). In this case, the message type is
|
31
|
+
<code class="constant">SEL_COMMAND</code>, which indicates that the command
|
32
|
+
associated with this widget should be invoked.</p></li><li><p>The message <span class="emphasis"><em>identifier</em></span> is another integer
|
33
|
+
constant that is used to distinguish between different messages of the
|
34
|
+
same type. For example, the message that tells a FOX window to make
|
35
|
+
itself visible is a <code class="constant">SEL_COMMAND</code> message with the
|
36
|
+
identifier <code class="constant">FXWindow::ID_SHOW</code> (where
|
37
|
+
<code class="constant">ID_SHOW</code> is a constant defined in the
|
38
|
+
<code class="classname">FXWindow</code> class). A different message
|
39
|
+
identifier, <code class="constant">FXWindow::ID_HIDE</code>, tells an
|
40
|
+
<code class="classname">FXWindow</code> instance to make itself
|
41
|
+
invisible.</p></li><li><p>The message <span class="emphasis"><em>data</em></span> is an object containing
|
42
|
+
message-specific information. For this case (the
|
43
|
+
<code class="classname">FXButton</code>'s <code class="constant">SEL_COMMAND</code>
|
44
|
+
message, there is no interesting message data, but we'll see other
|
45
|
+
kinds of messages where the message data is useful.</p></li></ol></div><p>For historical reasons, the message type and identifier are usually
|
46
|
+
packed into a single 32-bit unsigned integer known as the
|
47
|
+
<span class="emphasis"><em>selector</em></span>, and this is the value that is passed into
|
48
|
+
the message handler block. Since we don't actually need to use the
|
49
|
+
<em class="parameter"><code>sender</code></em>, <em class="parameter"><code>selector</code></em> or
|
50
|
+
<em class="parameter"><code>data</code></em> arguments for this particular message handler,
|
51
|
+
we can just ignore them and shorten the code to:</p><pre class="programlisting">theButton.connect(SEL_COMMAND) { exit }</pre><p>Re-run the program and push the button to convince yourself that it
|
52
|
+
works.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch03s02.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="tutorial1.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch03s04.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Better living through buttons </td><td width="20%" align="center"><a accesskey="h" href="book.html">Home</a></td><td width="40%" align="right" valign="top"> Adding a tool tip</td></tr></table></div></body></html>
|
data/doc/ch03s04.html
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
<html><head>
|
2
|
+
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
3
|
+
<title>Adding a tool tip</title><link rel="stylesheet" href="style.css" type="text/css"><meta name="generator" content="DocBook v5 XSL Stylesheets V1.72.0"><link rel="start" href="book.html" title="Developing Graphical User Interfaces with FXRuby"><link rel="up" href="tutorial1.html" title="Chapter 3. Hello, World!"><link rel="prev" href="ch03s03.html" title="Messages"><link rel="next" href="ch03s05.html" title="Adding an icon"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Adding a tool tip</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s03.html">Prev</a> </td><th width="60%" align="center">Chapter 3. Hello, World!</th><td width="20%" align="right"> <a accesskey="n" href="ch03s05.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e863"></a>Adding a tool tip</h2></div></div></div><p>To wrap up this introduction, we'd like to add a few finishing
|
4
|
+
touches to the program. The first addition is to add a tool tip to the
|
5
|
+
button, such that when the mouse cursor hovers over the button for a short
|
6
|
+
while, it will pop up a little message describing what the button
|
7
|
+
does:</p><pre class="programlisting">require 'fox16'
|
8
|
+
|
9
|
+
include Fox
|
10
|
+
|
11
|
+
theApp = FXApp.new
|
12
|
+
|
13
|
+
theMainWindow = FXMainWindow.new(theApp, "Hello")
|
14
|
+
|
15
|
+
theButton = FXButton.new(theMainWindow, "Hello, World!")
|
16
|
+
<span class="bold"><strong>theButton.tipText = "Push Me!"</strong></span>
|
17
|
+
theButton.connect(SEL_COMMAND) { exit }
|
18
|
+
|
19
|
+
<span class="bold"><strong>FXToolTip.new(theApp)</strong></span>
|
20
|
+
|
21
|
+
theApp.create
|
22
|
+
|
23
|
+
theMainWindow.show
|
24
|
+
|
25
|
+
theApp.run</pre><p>There are two changes involved here. The first is to set the tool
|
26
|
+
tip text for the button using the <code class="methodname">tipText</code>
|
27
|
+
accessor, and for this example we're setting the button's tip text to
|
28
|
+
"Push Me!". The second change is to create the (single)
|
29
|
+
<code class="classname">FXToolTip</code> instance for the application. Although
|
30
|
+
this program shows the <code class="classname">FXToolTip</code> instance being
|
31
|
+
created after the <code class="classname">FXButton</code>, it doesn't really
|
32
|
+
matter when you do it. You just want to have instantiated the
|
33
|
+
<code class="classname">FXToolTip</code> before you drop into the main event loop
|
34
|
+
by calling <code class="methodname">FXApp#run</code>. If you run this version and
|
35
|
+
hover over the button for a second or so, you should see the tooltip pop
|
36
|
+
up:</p><div class="screenshot"><div class="mediaobject" align="center"><img src="images/hello-with-tooltip.png" align="middle"></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch03s03.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="tutorial1.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch03s05.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Messages </td><td width="20%" align="center"><a accesskey="h" href="book.html">Home</a></td><td width="40%" align="right" valign="top"> Adding an icon</td></tr></table></div></body></html>
|
data/doc/ch03s05.html
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
<html><head>
|
2
|
+
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
3
|
+
<title>Adding an icon</title><link rel="stylesheet" href="style.css" type="text/css"><meta name="generator" content="DocBook v5 XSL Stylesheets V1.72.0"><link rel="start" href="book.html" title="Developing Graphical User Interfaces with FXRuby"><link rel="up" href="tutorial1.html" title="Chapter 3. Hello, World!"><link rel="prev" href="ch03s04.html" title="Adding a tool tip"><link rel="next" href="clipboardtut.html" title="Chapter 4. Working With the Clipboard"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Adding an icon</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s04.html">Prev</a> </td><th width="60%" align="center">Chapter 3. Hello, World!</th><td width="20%" align="right"> <a accesskey="n" href="clipboardtut.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e900"></a>Adding an icon</h2></div></div></div><p>The final change is to add an icon to the button to make things a
|
4
|
+
little more festive. FOX supports all of the popular image file formats
|
5
|
+
(e.g. BMP, GIF, JPEG, PNG and TIFF) and you can use any of them as icons
|
6
|
+
on buttons and labels. For this example, we'll use the one of the "Powered
|
7
|
+
By Ruby" images created by Hal Fulton (and posted at the <a xmlns:xlink="http://www.w3.org/1999/xlink" href="http://www.rubygarden.org/ruby?PoweredByRubyButtons" target="_top">Ruby Garden
|
8
|
+
Wiki</a>):</p><pre class="programlisting">require 'fox16'
|
9
|
+
|
10
|
+
include Fox
|
11
|
+
|
12
|
+
theApp = FXApp.new
|
13
|
+
|
14
|
+
theMainWindow = FXMainWindow.new(theApp, "Hello")
|
15
|
+
|
16
|
+
theButton = FXButton.new(theMainWindow, "Hello, World!")
|
17
|
+
theButton.tipText = "Push Me!"
|
18
|
+
<span class="bold"><strong>iconFile = File.open("pbr.jpg", "rb")
|
19
|
+
theButton.icon = FXJPGIcon.new(theApp, iconFile.read)
|
20
|
+
iconFile.close</strong></span>
|
21
|
+
theButton.connect(SEL_COMMAND) { exit }
|
22
|
+
|
23
|
+
FXToolTip.new(theApp)
|
24
|
+
|
25
|
+
theApp.create
|
26
|
+
|
27
|
+
theMainWindow.show
|
28
|
+
|
29
|
+
theApp.run</pre><p>Here, <code class="filename">pbr.jpg</code> is the file name of the JPEG
|
30
|
+
image file. You want to be sure to open the file in
|
31
|
+
<span class="emphasis"><em>binary</em></span> mode (i.e. including the "b" mode flag),
|
32
|
+
because there is a difference on the Windows platform. Since it's a JPEG
|
33
|
+
image, we need to use the <code class="classname">FXJPGIcon</code> class to
|
34
|
+
instantiate this icon. The first argument to
|
35
|
+
<code class="methodname">FXJPGIcon.new</code> is just a reference to the
|
36
|
+
<code class="classname">FXApp</code> instance, and the second argument is the
|
37
|
+
contents of the image file. We associate this icon object with our button
|
38
|
+
using the button's <code class="methodname">icon</code> accessor method. If you
|
39
|
+
run this example, you should see:</p><div class="screenshot"><div class="mediaobject" align="center"><img src="images/hello-with-icon-1.png" align="middle"></div></div><p>When you have both text and an icon displayed on a button (or its
|
40
|
+
superclass, <code class="classname">FXLabel</code>) the default positioning is to
|
41
|
+
display the icon to the left of the text. For this particular example,
|
42
|
+
however, it would probably be more appropriate to display the icon
|
43
|
+
<span class="emphasis"><em>above</em></span> the text. We can achieve this using the
|
44
|
+
button's <code class="methodname">iconPosition</code> accessor method:</p><pre class="programlisting">theButton.iconPosition = ICON_ABOVE_TEXT</pre><p>If you re-run the program after adding this line, you should
|
45
|
+
see:</p><div class="screenshot"><div class="mediaobject" align="center"><img src="images/hello-with-icon-2.png" align="middle"></div></div><p>The last change we're going to make is to make the icon transparent.
|
46
|
+
FOX allows you to specify that some regions of an icon should be treated
|
47
|
+
as "transparent", meaning that whatever's underneath them shows through.
|
48
|
+
FOX distinguishes those transparent regions from the non-transparent ones
|
49
|
+
using a transparency color, and any pixels in the original image that have
|
50
|
+
that color become transparent. In most cases, FOX can determine this
|
51
|
+
transparency color automatically (indeed, for image file formats like GIF
|
52
|
+
it's part of the image information). You can also specify the transparency
|
53
|
+
color explicitly if you like.</p><p>For the icon we've chosen, it's pretty obvious that the transparency
|
54
|
+
color is white, but let's let FOX figure that out for us. We want to
|
55
|
+
activate two options for the icon:</p><div class="itemizedlist"><ul type="bullet"><li style="list-style-type: disc"><p>the <code class="constant">IMAGE_ALPHACOLOR</code> option, which tells
|
56
|
+
FOX that some regions of this image should be treated as transparent;
|
57
|
+
and,</p></li><li style="list-style-type: disc"><p>the <code class="constant">IMAGE_ALPHAGUESS</code> option, which tells
|
58
|
+
FOX to guess the appropriate transparency color using the colors used
|
59
|
+
in the four corners of the image.</p></li></ul></div><p>To set these options, add this line to the program:</p><pre class="programlisting">theButton.icon.options = IMAGE_ALPHACOLOR | IMAGE_ALPHAGUESS</pre><p>and then re-run the program after making this change to see the
|
60
|
+
final result:</p><div class="screenshot"><div class="mediaobject" align="center"><img src="images/hello-with-icon-3.png" align="middle"></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch03s04.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="tutorial1.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="clipboardtut.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Adding a tool tip </td><td width="20%" align="center"><a accesskey="h" href="book.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 4. Working With the Clipboard</td></tr></table></div></body></html>
|
data/doc/ch04s02.html
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
<html><head>
|
2
|
+
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
3
|
+
<title>Acquiring the Clipboard</title><link rel="stylesheet" href="style.css" type="text/css"><meta name="generator" content="DocBook v5 XSL Stylesheets V1.72.0"><link rel="start" href="book.html" title="Developing Graphical User Interfaces with FXRuby"><link rel="up" href="clipboardtut.html" title="Chapter 4. Working With the Clipboard"><link rel="prev" href="clipboardtut.html" title="Chapter 4. Working With the Clipboard"><link rel="next" href="ch04s03.html" title="Sending Data to the Clipboard"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Acquiring the Clipboard</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="clipboardtut.html">Prev</a> </td><th width="60%" align="center">Chapter 4. Working With the Clipboard</th><td width="20%" align="right"> <a accesskey="n" href="ch04s03.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e1022"></a>Acquiring the Clipboard</h2></div></div></div><p>Let's begin by augmenting the GUI to include a row of buttons along
|
4
|
+
the bottom of the main window for copying and pasting:</p><pre class="programlisting">require 'fox16'
|
5
|
+
require 'customer'
|
6
|
+
|
7
|
+
include Fox
|
8
|
+
|
9
|
+
class ClipMainWindow < FXMainWindow
|
10
|
+
def initialize(anApp)
|
11
|
+
# Initialize base class first
|
12
|
+
super(anApp, "Clipboard Example", :opts => DECOR_ALL, :width => 400, :height => 300)
|
13
|
+
<span class="bold"><strong>
|
14
|
+
# Horizontal frame contains buttons
|
15
|
+
buttons = FXHorizontalFrame.new(self, LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH)
|
16
|
+
</strong></span><span class="bold"><strong>
|
17
|
+
# Cut and paste buttons
|
18
|
+
copyButton = FXButton.new(buttons, "Copy")
|
19
|
+
pasteButton = FXButton.new(buttons, "Paste")
|
20
|
+
</strong></span>
|
21
|
+
# Place the list in a sunken frame
|
22
|
+
sunkenFrame = FXVerticalFrame.new(self,
|
23
|
+
LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK, :padding => 0)
|
24
|
+
|
25
|
+
# Customer list
|
26
|
+
customerList = FXList.new(sunkenFrame, :opts => LIST_BROWSESELECT|LAYOUT_FILL_X|LAYOUT_FILL_Y)
|
27
|
+
$customers.each do |customer|
|
28
|
+
customerList.appendItem(customer.name, nil, customer)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def create
|
33
|
+
super
|
34
|
+
show(PLACEMENT_SCREEN)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
if __FILE__ == $0
|
39
|
+
FXApp.new("ClipboardExample", "FXRuby") do |theApp|
|
40
|
+
ClipMainWindow.new(theApp)
|
41
|
+
theApp.create
|
42
|
+
theApp.run
|
43
|
+
end
|
44
|
+
end
|
45
|
+
</pre><p>Note that the lines which appear in bold face are those which have
|
46
|
+
been added (or changed) since the previous source code listing.</p><p>The clipboard is a kind of shared resource in the operating system.
|
47
|
+
Copying (or cutting) data to the clipboard begins with some window in your
|
48
|
+
application requesting "ownership" of the clipboard by calling the
|
49
|
+
<code class="methodname">acquireClipboard()</code> instance method. Let's add a
|
50
|
+
handler for the "Copy" button press which does just that:</p><pre class="programlisting"># User clicks Copy
|
51
|
+
copyButton.connect(SEL_COMMAND) do
|
52
|
+
customer = customerList.getItemData(customerList.currentItem)
|
53
|
+
types = [ FXWindow.stringType ]
|
54
|
+
if acquireClipboard(types)
|
55
|
+
@clippedCustomer = customer
|
56
|
+
end
|
57
|
+
end
|
58
|
+
</pre><p>The <code class="methodname">acquireClipboard()</code> method takes as its
|
59
|
+
input an array of drag types. A <span class="emphasis"><em>drag type</em></span> is just a
|
60
|
+
unique value, assigned by the window system, that identifies a particular
|
61
|
+
kind of data. In this case, we're using one of FOX's pre-registered drag
|
62
|
+
types (<code class="constant">stringType</code>) to indicate that we have some
|
63
|
+
string data to place on the clipboard. Later, we'll see how to register
|
64
|
+
customized, application-specific drag types as well.</p><p>The <code class="methodname">acquireClipboard()</code> method returns
|
65
|
+
<code class="constant">true</code> on success; since we called
|
66
|
+
<code class="methodname">acquireClipboard()</code> on the main window, this means
|
67
|
+
that the main window is now the clipboard owner. At this time, we want to
|
68
|
+
save a reference to the currently selected customer in the
|
69
|
+
<code class="varname">@clippedCustomer</code> instance variable so that if its value
|
70
|
+
is requested later, we'll be able to return the
|
71
|
+
<span class="emphasis"><em>correct</em></span> customer's information.</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="clipboardtut.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="clipboardtut.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch04s03.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 4. Working With the Clipboard </td><td width="20%" align="center"><a accesskey="h" href="book.html">Home</a></td><td width="40%" align="right" valign="top"> Sending Data to the Clipboard</td></tr></table></div></body></html>
|
data/doc/ch04s03.html
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
<html><head>
|
2
|
+
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
3
|
+
<title>Sending Data to the Clipboard</title><link rel="stylesheet" href="style.css" type="text/css"><meta name="generator" content="DocBook v5 XSL Stylesheets V1.72.0"><link rel="start" href="book.html" title="Developing Graphical User Interfaces with FXRuby"><link rel="up" href="clipboardtut.html" title="Chapter 4. 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> </td><th width="60%" align="center">Chapter 4. Working With the Clipboard</th><td width="20%" align="right"> <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">#<struct Struct::Customer name="Joe Smith", address="123 Maple, Anytown, NC", zip=12345>
|
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> </td><td width="20%" align="center"><a accesskey="u" href="clipboardtut.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch04s04.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Acquiring the Clipboard </td><td width="20%" align="center"><a accesskey="h" href="book.html">Home</a></td><td width="40%" align="right" valign="top"> 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 4. Working With the Clipboard"><link rel="prev" href="ch04s03.html" title="Sending Data to the Clipboard"><link rel="next" href="dragdroptut.html" title="Chapter 5. 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> </td><th width="60%" align="center">Chapter 4. Working With the Clipboard</th><td width="20%" align="right"> <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">#<struct Struct::Customer name="Joe Smith", address="123 Maple, Anytown, NC", zip=12345>
|
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> </td><td width="20%" align="center"><a accesskey="u" href="clipboardtut.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="dragdroptut.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Sending Data to the Clipboard </td><td width="20%" align="center"><a accesskey="h" href="book.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 5. Drag and Drop</td></tr></table></div></body></html>
|