fxruby 1.6.15-x86-mswin32-60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +733 -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 +72 -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.so +0 -0
- data/lib/fox16/aliases.rb +5611 -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 +420 -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 +214 -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 +36 -0
- data/rdoc-sources/FXHeader.rb +411 -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 +450 -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 +80 -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 +72 -0
- data/rdoc-sources/FXList.rb +443 -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 +53 -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 +73 -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 +581 -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 +39 -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 +16 -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 +63 -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_FXDialogBox.rb +12 -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_FXHiliteStyle.rb +23 -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_FXMainWindow.rb +12 -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_FXMessageBox.rb +25 -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/stress1.rb +92 -0
- data/tests/stress2.rb +51 -0
- data/tests/stress3.rb +117 -0
- data/tests/testcase.rb +37 -0
- metadata +549 -0
@@ -0,0 +1,18 @@
|
|
1
|
+
#
|
2
|
+
# Adds some methods to FOX's FXSettings class
|
3
|
+
#
|
4
|
+
module Fox
|
5
|
+
class FXSettings
|
6
|
+
#
|
7
|
+
# Iterate over sections (where each section is a dictionary).
|
8
|
+
#
|
9
|
+
def each_section
|
10
|
+
pos = first
|
11
|
+
while pos < getTotalSize()
|
12
|
+
yield data(pos)
|
13
|
+
pos = self.next(pos)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
data/lib/fox16/signal.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
module Fox
|
2
|
+
|
3
|
+
class FXApp
|
4
|
+
|
5
|
+
alias addSignalOrig addSignal # :nodoc:
|
6
|
+
|
7
|
+
#
|
8
|
+
# Register a signal processing message to be sent to target object when
|
9
|
+
# the specified signal is raised.
|
10
|
+
#
|
11
|
+
# There are several forms for #addSignal; the original form (from FOX)
|
12
|
+
# takes (up to) five arguments:
|
13
|
+
#
|
14
|
+
# anApp.addSignal(aSignal, anObject, aMessageId, sendImmediately=false, flags=0)
|
15
|
+
#
|
16
|
+
# Here, _aSignal_ is a string indicating the operating system signal of interest
|
17
|
+
# (such as "SIGINT").
|
18
|
+
# The second and third arguments are the target object and message identifier for
|
19
|
+
# the message to be sent when this signal is raised.
|
20
|
+
# If _sendImmediately_ is +true+, the message will be sent to the target right away;
|
21
|
+
# this should be used with extreme care as the application is interrupted
|
22
|
+
# at an unknown point in its execution.
|
23
|
+
# The _flags_ are to be set as per POSIX definitions.
|
24
|
+
#
|
25
|
+
# A second form of #addSignal takes a Method instance as its second argument:
|
26
|
+
#
|
27
|
+
# anApp.addSignal(aSignal, aMethod, sendImmediately=false, flags=0)
|
28
|
+
#
|
29
|
+
# For this form, the method should have the standard argument list
|
30
|
+
# for a FOX message handler. That is, the method should take three
|
31
|
+
# arguments, for the message _sender_ (an FXObject), the message _selector_,
|
32
|
+
# and the message _data_ (if any).
|
33
|
+
#
|
34
|
+
# The last form of #addSignal takes a block:
|
35
|
+
#
|
36
|
+
# anApp.addSignal(aSignal, sendImmediately=false, flags=0) { |sender, sel, data|
|
37
|
+
# ... handle the signal ...
|
38
|
+
# }
|
39
|
+
#
|
40
|
+
|
41
|
+
def addSignal(sig, *args, &block)
|
42
|
+
params = {}
|
43
|
+
params = args.pop if args.last.is_a? Hash
|
44
|
+
tgt, sel, immediate, flags = nil, 0, false, 0
|
45
|
+
if args.length > 0
|
46
|
+
if args[0].respond_to? :call
|
47
|
+
tgt = FXPseudoTarget.new
|
48
|
+
tgt.pconnect(SEL_SIGNAL, args[0], params)
|
49
|
+
immediate = (args.length > 1) ? args[1] : false
|
50
|
+
flags = (args.length > 2) ? args[2] : 0
|
51
|
+
elsif (args[0].kind_of? TrueClass) || (args[0].kind_of? FalseClass)
|
52
|
+
tgt = FXPseudoTarget.new
|
53
|
+
tgt.pconnect(SEL_SIGNAL, block, params)
|
54
|
+
immediate = args[0]
|
55
|
+
flags = (args.length > 1) ? args[1] : 0
|
56
|
+
else # it's some other kind of object
|
57
|
+
tgt = args[0]
|
58
|
+
sel = (args.length > 1) ? args[1] : 0
|
59
|
+
immediate = (args.length > 2) ? args[2] : false
|
60
|
+
flags = (args.length > 3) ? args[3] : 0
|
61
|
+
end
|
62
|
+
else
|
63
|
+
tgt = FXPseudoTarget.new
|
64
|
+
tgt.pconnect(SEL_SIGNAL, block, params)
|
65
|
+
end
|
66
|
+
addSignalOrig(sig, tgt, sel, immediate, flags)
|
67
|
+
end
|
68
|
+
|
69
|
+
end # class FXApp
|
70
|
+
|
71
|
+
end # module Fox
|
@@ -0,0 +1,82 @@
|
|
1
|
+
#
|
2
|
+
# Splashscreen component, contributed by David Naseby.
|
3
|
+
#
|
4
|
+
|
5
|
+
require 'fox16/colors'
|
6
|
+
|
7
|
+
module Fox
|
8
|
+
#
|
9
|
+
# The FXSplashScreen window...
|
10
|
+
#
|
11
|
+
class FXSplashScreen < FXDialogBox
|
12
|
+
|
13
|
+
#
|
14
|
+
# Return an initialized FXSplashScreen instance.
|
15
|
+
#
|
16
|
+
# ==== Parameters:
|
17
|
+
#
|
18
|
+
# +owner+:: Owner window for this dialog box [FXWindow]
|
19
|
+
# +title+:: Title string for this dialog box [String]
|
20
|
+
# +text+:: Message text for this dialog box [String]
|
21
|
+
# +action+:: The action
|
22
|
+
#
|
23
|
+
def initialize( owner, title, text, action )
|
24
|
+
# Initialize the base class first
|
25
|
+
super(owner, title)
|
26
|
+
|
27
|
+
# Store the action block
|
28
|
+
@action = action
|
29
|
+
|
30
|
+
# Construct the window contents
|
31
|
+
FXVerticalFrame.new( self ) do |frame|
|
32
|
+
text.each_line do |line|
|
33
|
+
FXLabel.new( frame, line.strip )
|
34
|
+
end
|
35
|
+
FXLabel.new( frame, "Click OK to continue (this may take a few moments)...." )
|
36
|
+
@status = FXLabel.new( frame, " " )
|
37
|
+
@accept = FXButton.new( frame, "&OK", nil, self, ID_ACCEPT,
|
38
|
+
FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT|LAYOUT_CENTER_Y)
|
39
|
+
@accept.enabled = false
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def execute(placement = PLACEMENT_OWNER)
|
44
|
+
Thread.new do
|
45
|
+
sleep 1
|
46
|
+
@action.call method( :update_status )
|
47
|
+
update_status "Completed"
|
48
|
+
@accept.enabled = true
|
49
|
+
end
|
50
|
+
super
|
51
|
+
end
|
52
|
+
|
53
|
+
def update_status(msg)
|
54
|
+
@status.text = msg
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
if $0 == __FILE__
|
60
|
+
class FakeSite # :nodoc:
|
61
|
+
def open( &status )
|
62
|
+
yield ">>>>> Opening Site" if block_given?
|
63
|
+
sleep 5
|
64
|
+
yield "site open" if block_given?
|
65
|
+
end
|
66
|
+
end
|
67
|
+
fake_site = FakeSite.new
|
68
|
+
|
69
|
+
include Fox
|
70
|
+
|
71
|
+
FXApp.new( "Test SplashScreen" ) do |theApp|
|
72
|
+
FXMainWindow.new( theApp, "Hello" ) do |mainWin|
|
73
|
+
FXButton.new( mainWin, "Show Splash" ).connect( SEL_COMMAND ) do
|
74
|
+
lv = FXSplashScreen.new( mainWin, "Opening Site", "Welcome to Sitebuilder!\nOpening the site.\n", lambda{ |proc| fake_site.open( &proc ) } )
|
75
|
+
lv.execute
|
76
|
+
end
|
77
|
+
mainWin.show
|
78
|
+
end
|
79
|
+
theApp.create
|
80
|
+
theApp.run
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,136 @@
|
|
1
|
+
module Fox
|
2
|
+
|
3
|
+
class FXApp
|
4
|
+
|
5
|
+
alias addTimeoutOrig addTimeout # :nodoc:
|
6
|
+
alias removeTimeoutOrig removeTimeout # :nodoc:
|
7
|
+
alias hasTimeoutOrig? hasTimeout? # :nodoc:
|
8
|
+
alias remainingTimeoutOrig remainingTimeout # :nodoc:
|
9
|
+
|
10
|
+
#
|
11
|
+
# Add a timeout message to be sent to target object in _ms_ milliseconds.
|
12
|
+
# By default, the timer fires only once after the interval expires. The last argument
|
13
|
+
# is optional user data which will be passed along as the _ptr_ argument of
|
14
|
+
# the message handler. If a timer with the same target and message already exists,
|
15
|
+
# it will be rescheduled.
|
16
|
+
#
|
17
|
+
# There are several forms for #addTimeout; the original form (from FOX)
|
18
|
+
# takes three arguments:
|
19
|
+
#
|
20
|
+
# timeout = app.addTimeout(delay, tgt, sel)
|
21
|
+
#
|
22
|
+
# Here, _delay_ is the time interval (in milliseconds) to wait
|
23
|
+
# before firing this timeout. The second and third arguments are the
|
24
|
+
# target object and message identifier for the message to be sent when
|
25
|
+
# this timeout fires.
|
26
|
+
#
|
27
|
+
# A second form of #addTimeout takes a Method instance as its single argument:
|
28
|
+
#
|
29
|
+
# timeout = app.addTimeout(delay, mthd)
|
30
|
+
#
|
31
|
+
# For this form, the method should have the standard argument list
|
32
|
+
# for a FOX message handler. That is, the method should take three
|
33
|
+
# arguments, for the message _sender_ (an FXObject), the message _selector_,
|
34
|
+
# and the message _data_ (if any).
|
35
|
+
#
|
36
|
+
# The last form of #addTimeout takes a block:
|
37
|
+
#
|
38
|
+
# timeout = app.addTimeout(delay) do |sender, sel, data|
|
39
|
+
# ... handle the timeout ...
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
# All of these return a reference to an opaque object (actually, a hash) that
|
43
|
+
# can be passed to #removeTimeout if it is necessary to remove the timeout
|
44
|
+
# before it fires.
|
45
|
+
#
|
46
|
+
# For the last two forms, you can pass in the optional +:repeat+ parameter to
|
47
|
+
# cause the timeout to be re-registered after it fires, e.g.
|
48
|
+
#
|
49
|
+
# timeout = app.addTimeout(delay, :repeat => true) do |sender, sel, data|
|
50
|
+
# ... handle the timeout ...
|
51
|
+
# ... re-add the timeout with the same delay ...
|
52
|
+
# end
|
53
|
+
#
|
54
|
+
def addTimeout(ms, *args, &block)
|
55
|
+
params = {}
|
56
|
+
params = args.pop if args.last.is_a? Hash
|
57
|
+
params[:delay] = ms
|
58
|
+
tgt, sel = nil, 0
|
59
|
+
if args.length > 0
|
60
|
+
if args[0].respond_to? :call
|
61
|
+
tgt = params[:target] || FXPseudoTarget.new
|
62
|
+
tgt.pconnect(SEL_TIMEOUT, args[0], params)
|
63
|
+
else # it's some other kind of object
|
64
|
+
tgt = args[0]
|
65
|
+
sel = args[1]
|
66
|
+
end
|
67
|
+
else
|
68
|
+
tgt = params[:target] || FXPseudoTarget.new
|
69
|
+
tgt.pconnect(SEL_TIMEOUT, block, params)
|
70
|
+
end
|
71
|
+
addTimeoutOrig(tgt, sel, ms)
|
72
|
+
params[:target] = tgt
|
73
|
+
params[:selector] = sel
|
74
|
+
params
|
75
|
+
end
|
76
|
+
|
77
|
+
#
|
78
|
+
# Remove timeout previously registered using #addTimeout; returns +nil+.
|
79
|
+
# For an example of how to use #removeTimeout, see the documentation for
|
80
|
+
# the #hasTimeout? method.
|
81
|
+
#
|
82
|
+
def removeTimeout(*args)
|
83
|
+
if args.length == 2
|
84
|
+
removeTimeoutOrig(args[0], args[1])
|
85
|
+
else
|
86
|
+
params = args[0]
|
87
|
+
removeTimeoutOrig(params[:target], params[:selector])
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
#
|
92
|
+
# Return +true+ if given timeout has been set, otherwise return +false+.
|
93
|
+
#
|
94
|
+
# For example, suppose you set up a timeout event to run ten seconds from
|
95
|
+
# now:
|
96
|
+
#
|
97
|
+
# timeout = app.addTimeout(10*1000, ...)
|
98
|
+
#
|
99
|
+
# but in the meantime, you decide that you want to cancel it if it hasn't
|
100
|
+
# run yet:
|
101
|
+
#
|
102
|
+
# if app.hasTimeout?(timeout)
|
103
|
+
# app.removeTimeout(timeout)
|
104
|
+
# end
|
105
|
+
#
|
106
|
+
def hasTimeout?(*args)
|
107
|
+
if args.length == 2
|
108
|
+
hasTimeoutOrig?(args[0], args[1])
|
109
|
+
else
|
110
|
+
hsh = args[0]
|
111
|
+
hasTimeoutOrig?(hsh[:target], hsh[:selector])
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
#
|
116
|
+
# Return the time remaining (in milliseconds) until the given timer fires.
|
117
|
+
# If the timer is past due, zero is returned. If there is no such
|
118
|
+
# timer, infinity (UINT_MAX) is returned.
|
119
|
+
#
|
120
|
+
# For example:
|
121
|
+
#
|
122
|
+
# timeout = app.addTimeout(ms, ...)
|
123
|
+
# time_left = app.remainingTimeout(timeout)
|
124
|
+
#
|
125
|
+
def remainingTimeout(*args)
|
126
|
+
if args.length == 2
|
127
|
+
remainingTimeoutOrig(args[0], args[1])
|
128
|
+
else
|
129
|
+
hsh = args[0]
|
130
|
+
remainingTimeoutOrig(hsh[:target], hsh[:selector])
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
end # class FXApp
|
135
|
+
|
136
|
+
end # module Fox
|
@@ -0,0 +1,455 @@
|
|
1
|
+
#
|
2
|
+
# This is a "pure Ruby" implementation of the FXUndoList and
|
3
|
+
# FXCommand classes from the standard FOX distribution. Since those
|
4
|
+
# classes are independent of the rest of FOX this is a simpler (and probably
|
5
|
+
# more efficient) approach than trying to wrap the original C++ classes.
|
6
|
+
#
|
7
|
+
# Notes (by Jeroen, lifted from FXUndoList.cpp):
|
8
|
+
#
|
9
|
+
# * When a command is undone, it's moved to the redo list.
|
10
|
+
# * When a command is redone, it's moved back to the undo list.
|
11
|
+
# * Whenever adding a new command, the redo list is deleted.
|
12
|
+
# * At any time, you can trim down the undo list down to a given
|
13
|
+
# maximum size or a given number of undo records. This should
|
14
|
+
# keep the memory overhead within sensible bounds.
|
15
|
+
# * To keep track of when we get back to an "unmodified" state, a mark
|
16
|
+
# can be set. The <em>mark</em> is basically a counter which is incremented
|
17
|
+
# with every undo record added, and decremented when undoing a command.
|
18
|
+
# When we get back to 0, we are back to the unmodified state.
|
19
|
+
#
|
20
|
+
# If, after setting the mark, we have called FXUndoList#undo, then
|
21
|
+
# the mark can be reached by calling FXUndoList#redo.
|
22
|
+
#
|
23
|
+
# If the marked position is in the redo-list, then adding a new undo
|
24
|
+
# record will cause the redo-list to be deleted, and the marked position
|
25
|
+
# will become unreachable.
|
26
|
+
#
|
27
|
+
# The marked state may also become unreachable when the undo list is trimmed.
|
28
|
+
#
|
29
|
+
# * You can call also kill the redo list without adding a new command
|
30
|
+
# to the undo list, although this may cause the marked position to
|
31
|
+
# become unreachable.
|
32
|
+
# * We measure the size of the undo-records in the undo-list; when the
|
33
|
+
# records are moved to the redo-list, they usually contain different
|
34
|
+
# information!
|
35
|
+
|
36
|
+
require 'fox16/responder'
|
37
|
+
|
38
|
+
module Fox
|
39
|
+
|
40
|
+
#
|
41
|
+
# The undo list manages a list of undoable (and redoable) commands for a FOX
|
42
|
+
# application; it works hand-in-hand with subclasses of FXCommand and is
|
43
|
+
# an application of the well-known <em>Command</em> pattern. Your application
|
44
|
+
# code should implement any number of command classes and then add then to an
|
45
|
+
# FXUndoList instance. For an example of how this works, see the textedit
|
46
|
+
# example program from the FXRuby distribution.
|
47
|
+
#
|
48
|
+
# == Class Constants
|
49
|
+
#
|
50
|
+
# [FXUndoList::ID_UNDO] Message identifier for the undo method.
|
51
|
+
# When a +SEL_COMMAND+ message with this identifier
|
52
|
+
# is sent to an undo list, it undoes the last command.
|
53
|
+
# FXUndoList also provides a +SEL_UPDATE+ handler for this
|
54
|
+
# identifier, that enables or disables the sender
|
55
|
+
# depending on whether it's possible to undo.
|
56
|
+
#
|
57
|
+
# [FXUndoList::ID\_UNDO\_ALL] Message identifier for the "undo all" method. FXUndoList handles both
|
58
|
+
# the +SEL_COMMAND+ and +SEL_UPDATE+ messages for this message
|
59
|
+
# identifier.
|
60
|
+
#
|
61
|
+
# [FXUndoList::ID_REDO] Message identifier for the redo method. When a +SEL_COMMAND+ message
|
62
|
+
# with this identifier is sent to an undo list, it redoes the last command.
|
63
|
+
# FXUndoList also provides a +SEL_UPDATE+ handler for this identifier,
|
64
|
+
# that enables or disables the sender depending on whether it's possible to
|
65
|
+
# redo.
|
66
|
+
#
|
67
|
+
# [FXUndoList::ID\_REDO\_ALL] Message identifier for the "redo all" method. FXUndoList handles both
|
68
|
+
# the +SEL_COMMAND+ and +SEL_UPDATE+ messages for this message
|
69
|
+
# identifier.
|
70
|
+
#
|
71
|
+
# [FXUndoList::ID_CLEAR] Message identifier for the "clear" method. FXUndoList handles both
|
72
|
+
# the +SEL_COMMAND+ and +SEL_UPDATE+ messages for this message
|
73
|
+
# identifier.
|
74
|
+
#
|
75
|
+
# [FXUndoList::ID_REVERT] Message identifier for the "revert" method. FXUndoList handles both
|
76
|
+
# the +SEL_COMMAND+ and +SEL_UPDATE+ messages for this message
|
77
|
+
# identifier.
|
78
|
+
#
|
79
|
+
class FXUndoList < FXObject
|
80
|
+
|
81
|
+
include Responder
|
82
|
+
|
83
|
+
ID_CLEAR,
|
84
|
+
ID_REVERT,
|
85
|
+
ID_UNDO,
|
86
|
+
ID_REDO,
|
87
|
+
ID_UNDO_ALL,
|
88
|
+
ID_REDO_ALL,
|
89
|
+
ID_LAST = enum(0, 7)
|
90
|
+
|
91
|
+
#
|
92
|
+
# Returns an initialized FXUndoList instance.
|
93
|
+
#
|
94
|
+
def initialize
|
95
|
+
# Be sure to call base class initialize
|
96
|
+
super
|
97
|
+
|
98
|
+
# Set up the message map for this instance
|
99
|
+
FXMAPFUNC(SEL_COMMAND, ID_CLEAR, "onCmdClear")
|
100
|
+
FXMAPFUNC(SEL_UPDATE, ID_CLEAR, "onUpdClear")
|
101
|
+
FXMAPFUNC(SEL_COMMAND, ID_REVERT, "onCmdRevert")
|
102
|
+
FXMAPFUNC(SEL_UPDATE, ID_REVERT, "onUpdRevert")
|
103
|
+
FXMAPFUNC(SEL_COMMAND, ID_UNDO, "onCmdUndo")
|
104
|
+
FXMAPFUNC(SEL_UPDATE, ID_UNDO, "onUpdUndo")
|
105
|
+
FXMAPFUNC(SEL_COMMAND, ID_REDO, "onCmdRedo")
|
106
|
+
FXMAPFUNC(SEL_UPDATE, ID_REDO, "onUpdRedo")
|
107
|
+
FXMAPFUNC(SEL_COMMAND, ID_UNDO_ALL, "onCmdUndoAll")
|
108
|
+
FXMAPFUNC(SEL_UPDATE, ID_UNDO_ALL, "onUpdUndo")
|
109
|
+
FXMAPFUNC(SEL_COMMAND, ID_REDO_ALL, "onCmdRedoAll")
|
110
|
+
FXMAPFUNC(SEL_UPDATE, ID_REDO_ALL, "onUpdRedo")
|
111
|
+
|
112
|
+
# Instance variables
|
113
|
+
@undolist = []
|
114
|
+
@redolist = []
|
115
|
+
@marker = nil
|
116
|
+
@size = 0
|
117
|
+
end
|
118
|
+
|
119
|
+
#
|
120
|
+
# Cut the redo list
|
121
|
+
#
|
122
|
+
def cut
|
123
|
+
@redolist.clear
|
124
|
+
unless @marker.nil?
|
125
|
+
@marker = nil if @marker < 0
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
#
|
130
|
+
# Add new _command_ (an FXCommand instance) to the list.
|
131
|
+
# If _doit_ is +true+, the command is also executed.
|
132
|
+
#
|
133
|
+
def add(command, doit=false)
|
134
|
+
# Cut redo list
|
135
|
+
cut
|
136
|
+
|
137
|
+
# No command given?
|
138
|
+
return true if command.nil?
|
139
|
+
|
140
|
+
# Add it to the end of the undo list
|
141
|
+
@undolist.push(command)
|
142
|
+
|
143
|
+
# Execute it right now?
|
144
|
+
command.redo if doit
|
145
|
+
|
146
|
+
# Update size
|
147
|
+
@size += command.size # measured after redo
|
148
|
+
|
149
|
+
# Update the mark distance
|
150
|
+
@marker = @marker + 1 unless @marker.nil?
|
151
|
+
|
152
|
+
# Done
|
153
|
+
return true
|
154
|
+
end
|
155
|
+
|
156
|
+
#
|
157
|
+
# Undo last command.
|
158
|
+
#
|
159
|
+
def undo
|
160
|
+
unless @undolist.empty?
|
161
|
+
command = @undolist.pop
|
162
|
+
@size -= command.size
|
163
|
+
command.undo
|
164
|
+
@redolist.push(command)
|
165
|
+
@marker = @marker - 1 unless @marker.nil?
|
166
|
+
return true
|
167
|
+
end
|
168
|
+
return false
|
169
|
+
end
|
170
|
+
|
171
|
+
#
|
172
|
+
# Redo next command
|
173
|
+
#
|
174
|
+
def redo
|
175
|
+
unless @redolist.empty?
|
176
|
+
command = @redolist.pop
|
177
|
+
command.redo
|
178
|
+
@undolist.push(command)
|
179
|
+
@size += command.size
|
180
|
+
@marker = @marker + 1 unless @marker.nil?
|
181
|
+
return true
|
182
|
+
end
|
183
|
+
return false
|
184
|
+
end
|
185
|
+
|
186
|
+
#
|
187
|
+
# Undo all commands
|
188
|
+
#
|
189
|
+
def undoAll
|
190
|
+
undo while canUndo?
|
191
|
+
end
|
192
|
+
|
193
|
+
#
|
194
|
+
# Redo all commands
|
195
|
+
#
|
196
|
+
def redoAll
|
197
|
+
redo while canRedo?
|
198
|
+
end
|
199
|
+
|
200
|
+
#
|
201
|
+
# Revert to marked
|
202
|
+
#
|
203
|
+
def revert
|
204
|
+
unless @marker.nil?
|
205
|
+
undo while (@marker > 0)
|
206
|
+
redo while (@marker < 0)
|
207
|
+
return true
|
208
|
+
end
|
209
|
+
return false
|
210
|
+
end
|
211
|
+
|
212
|
+
#
|
213
|
+
# Return +true+ if we can still undo some commands
|
214
|
+
# (i.e. the undo list is not empty).
|
215
|
+
#
|
216
|
+
def canUndo?
|
217
|
+
(@undolist.empty? == false)
|
218
|
+
end
|
219
|
+
|
220
|
+
#
|
221
|
+
# Return +true+ if we can still redo some commands
|
222
|
+
# (i.e. the redo list is not empty).
|
223
|
+
#
|
224
|
+
def canRedo?
|
225
|
+
(@redolist.empty? == false)
|
226
|
+
end
|
227
|
+
|
228
|
+
#
|
229
|
+
# Return +true+ if there is a previously marked
|
230
|
+
# state that we can revert to.
|
231
|
+
#
|
232
|
+
def canRevert?
|
233
|
+
(@marker != nil) && (@marker != 0)
|
234
|
+
end
|
235
|
+
|
236
|
+
#
|
237
|
+
# Returns the current undo command.
|
238
|
+
#
|
239
|
+
def current
|
240
|
+
@undolist.last
|
241
|
+
end
|
242
|
+
|
243
|
+
#
|
244
|
+
# Return the name of the first available undo command.
|
245
|
+
# If no undo command is available, returns +nil+.
|
246
|
+
#
|
247
|
+
def undoName
|
248
|
+
if canUndo?
|
249
|
+
current.undoName
|
250
|
+
else
|
251
|
+
nil
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
#
|
256
|
+
# Return the name of the first available redo command.
|
257
|
+
# If no redo command is available, returns +nil+.
|
258
|
+
#
|
259
|
+
def redoName
|
260
|
+
if canRedo?
|
261
|
+
@redolist.last.redoName
|
262
|
+
else
|
263
|
+
nil
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
#
|
268
|
+
# Returns the number of undo records.
|
269
|
+
#
|
270
|
+
def undoCount
|
271
|
+
@undolist.size
|
272
|
+
end
|
273
|
+
|
274
|
+
#
|
275
|
+
# Returns the total size of undo information.
|
276
|
+
#
|
277
|
+
def undoSize
|
278
|
+
@size
|
279
|
+
end
|
280
|
+
|
281
|
+
#
|
282
|
+
# Clear the list
|
283
|
+
#
|
284
|
+
def clear
|
285
|
+
@undolist.clear
|
286
|
+
@redolist.clear
|
287
|
+
@marker = nil
|
288
|
+
@size = 0
|
289
|
+
end
|
290
|
+
|
291
|
+
#
|
292
|
+
# Trim undo list down to at most _nc_ commands.
|
293
|
+
#
|
294
|
+
def trimCount(nc)
|
295
|
+
if @undolist.size > nc
|
296
|
+
numRemoved = @undolist.size - nc
|
297
|
+
@undolist[0, numRemoved].each { |command| @size -= command.size }
|
298
|
+
@undolist[0, numRemoved] = nil
|
299
|
+
@marker = nil if (@marker != nil && @marker > @undolist.size)
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
#
|
304
|
+
# Trim undo list down to at most _size_.
|
305
|
+
#
|
306
|
+
def trimSize(sz)
|
307
|
+
if @size > sz
|
308
|
+
s = 0
|
309
|
+
@undolist.reverse.each_index { |i|
|
310
|
+
j = @undolist.size - (i + 1)
|
311
|
+
s += @undolist[j].size
|
312
|
+
@undolist[j] = nil if (s > sz)
|
313
|
+
}
|
314
|
+
@undolist.compact!
|
315
|
+
@marker = nil if (@marker != nil && @marker > @undolist.size)
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
319
|
+
#
|
320
|
+
# Mark current state
|
321
|
+
#
|
322
|
+
def mark
|
323
|
+
@marker = 0
|
324
|
+
end
|
325
|
+
|
326
|
+
#
|
327
|
+
# Unmark undo list
|
328
|
+
#
|
329
|
+
def unmark
|
330
|
+
@marker = nil
|
331
|
+
end
|
332
|
+
|
333
|
+
#
|
334
|
+
# Return +true+ if the undo list is marked.
|
335
|
+
#
|
336
|
+
def marked?
|
337
|
+
@marker == 0
|
338
|
+
end
|
339
|
+
|
340
|
+
def onCmdUndo(sender, sel, ptr) # :nodoc:
|
341
|
+
undo
|
342
|
+
return 1
|
343
|
+
end
|
344
|
+
|
345
|
+
def onUpdUndo(sender, sel, ptr) # :nodoc:
|
346
|
+
if canUndo?
|
347
|
+
sender.handle(self, MKUINT(FXWindow::ID_ENABLE, SEL_COMMAND), nil)
|
348
|
+
else
|
349
|
+
sender.handle(self, MKUINT(FXWindow::ID_DISABLE, SEL_COMMAND), nil)
|
350
|
+
end
|
351
|
+
return 1
|
352
|
+
end
|
353
|
+
|
354
|
+
def onCmdRedo(sender, sel, ptr) # :nodoc:
|
355
|
+
self.redo
|
356
|
+
return 1
|
357
|
+
end
|
358
|
+
|
359
|
+
def onUpdRedo(sender, sel, ptr) # :nodoc:
|
360
|
+
if canRedo?
|
361
|
+
sender.handle(self, MKUINT(FXWindow::ID_ENABLE, SEL_COMMAND), nil)
|
362
|
+
else
|
363
|
+
sender.handle(self, MKUINT(FXWindow::ID_DISABLE, SEL_COMMAND), nil)
|
364
|
+
end
|
365
|
+
return 1
|
366
|
+
end
|
367
|
+
|
368
|
+
def onCmdClear(sender, sel, ptr) # :nodoc:
|
369
|
+
clear
|
370
|
+
return 1
|
371
|
+
end
|
372
|
+
|
373
|
+
def onUpdClear(sender, sel, ptr) # :nodoc:
|
374
|
+
if canUndo? || canRedo?
|
375
|
+
sender.handle(self, MKUINT(FXWindow::ID_ENABLE, SEL_COMMAND), nil)
|
376
|
+
else
|
377
|
+
sender.handle(self, MKUINT(FXWindow::ID_DISABLE, SEL_COMMAND), nil)
|
378
|
+
end
|
379
|
+
return 1
|
380
|
+
end
|
381
|
+
|
382
|
+
def onCmdRevert(sender, sel, ptr) # :nodoc:
|
383
|
+
revert
|
384
|
+
return 1
|
385
|
+
end
|
386
|
+
|
387
|
+
def onUpdRevert(sender, sel, ptr) # :nodoc:
|
388
|
+
if canRevert?
|
389
|
+
sender.handle(self, MKUINT(FXWindow::ID_ENABLE, SEL_COMMAND), nil)
|
390
|
+
else
|
391
|
+
sender.handle(self, MKUINT(FXWindow::ID_DISABLE, SEL_COMMAND), nil)
|
392
|
+
end
|
393
|
+
return 1
|
394
|
+
end
|
395
|
+
|
396
|
+
def onCmdUndoAll(sender, sel, ptr) # :nodoc:
|
397
|
+
undoAll
|
398
|
+
return 1
|
399
|
+
end
|
400
|
+
|
401
|
+
def onCmdRedoAll(sender, sel, ptr) # :nodoc:
|
402
|
+
redoAll
|
403
|
+
return 1
|
404
|
+
end
|
405
|
+
end
|
406
|
+
|
407
|
+
#
|
408
|
+
# FXCommand is an "abstract" base class for your application's commands. At a
|
409
|
+
# minimum, your concrete subclasses of FXCommand should implement the
|
410
|
+
# #undo, #redo, #undoName, and #redoName methods.
|
411
|
+
#
|
412
|
+
class FXCommand
|
413
|
+
#
|
414
|
+
# Undo this command; this should save enough information for a
|
415
|
+
# subsequent redo.
|
416
|
+
#
|
417
|
+
def undo
|
418
|
+
raise NotImpError
|
419
|
+
end
|
420
|
+
|
421
|
+
#
|
422
|
+
# Redo this command; this should save enough information for a
|
423
|
+
# subsequent undo.
|
424
|
+
#
|
425
|
+
def redo
|
426
|
+
raise NotImpError
|
427
|
+
end
|
428
|
+
|
429
|
+
#
|
430
|
+
# Name of the undo command to be shown on a button or menu command;
|
431
|
+
# for example, "Undo Delete".
|
432
|
+
#
|
433
|
+
def undoName
|
434
|
+
raise NotImpError
|
435
|
+
end
|
436
|
+
|
437
|
+
#
|
438
|
+
# Name of the redo command to be shown on a button or menu command;
|
439
|
+
# for example, "Redo Delete".
|
440
|
+
#
|
441
|
+
def redoName
|
442
|
+
raise NotImpError
|
443
|
+
end
|
444
|
+
|
445
|
+
#
|
446
|
+
# Returns the size of the information in the undo record, i.e. the
|
447
|
+
# number of bytes required to store it in memory. This is only used
|
448
|
+
# by the FXUndoList#trimSize method, which can be called to reduce
|
449
|
+
# the memory use of the undo list to a certain size.
|
450
|
+
#
|
451
|
+
def size
|
452
|
+
0
|
453
|
+
end
|
454
|
+
end
|
455
|
+
end
|