fxruby 1.6.22-x86-mingw32 → 1.6.23-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +14 -0
- data/.yardopts +8 -0
- data/History.txt +6 -0
- data/Manifest.txt +317 -24
- data/README.git +3 -0
- data/README.rdoc +537 -0
- data/Rakefile +62 -46
- data/Rakefile.cross +397 -0
- data/doap.rdf +3 -3
- data/doap.rdf.erb +87 -0
- data/examples/WhatAQuietStiff.rb +356 -0
- data/examples/canvasdemo.rb +88 -0
- data/examples/gdchart.rb +76 -0
- data/examples/gembrowser.rb +289 -0
- data/examples/rmagick.rb +44 -0
- data/lib/1.8/fox16.so +0 -0
- data/lib/1.9/fox16.so +0 -0
- data/lib/fox16/canvas.rb +606 -0
- data/lib/fox16/irb.rb +1 -0
- data/lib/fox16/splashscreen.rb +1 -0
- data/lib/fox16/tkcompat.rb +56 -0
- data/lib/fox16/version.rb +1 -1
- data/rdoc-sources/FX4Splitter.rb +44 -44
- data/rdoc-sources/FX7Segment.rb +3 -3
- data/rdoc-sources/FXAccelTable.rb +1 -1
- data/rdoc-sources/FXApp.rb +51 -51
- data/rdoc-sources/FXArrowButton.rb +6 -6
- data/rdoc-sources/FXBMPIcon.rb +12 -12
- data/rdoc-sources/FXBMPImage.rb +6 -6
- data/rdoc-sources/FXBitmap.rb +9 -9
- data/rdoc-sources/FXBitmapFrame.rb +3 -3
- data/rdoc-sources/FXBitmapView.rb +12 -12
- data/rdoc-sources/FXButton.rb +5 -5
- data/rdoc-sources/FXCanvas.rb +4 -4
- data/rdoc-sources/FXCheckButton.rb +7 -7
- data/rdoc-sources/FXChoiceBox.rb +16 -16
- data/rdoc-sources/FXColorBar.rb +9 -9
- data/rdoc-sources/FXColorDialog.rb +4 -4
- data/rdoc-sources/FXColorList.rb +1 -1
- data/rdoc-sources/FXColorRing.rb +4 -4
- data/rdoc-sources/FXColorSelector.rb +38 -38
- data/rdoc-sources/FXColorWell.rb +15 -15
- data/rdoc-sources/FXColorWheel.rb +8 -8
- data/rdoc-sources/FXComboBox.rb +24 -24
- data/rdoc-sources/FXCursor.rb +12 -12
- data/rdoc-sources/FXDC.rb +176 -176
- data/rdoc-sources/FXDCPrint.rb +20 -20
- data/rdoc-sources/FXDCWindow.rb +2 -2
- data/rdoc-sources/FXDataTarget.rb +1 -1
- data/rdoc-sources/FXDebugTarget.rb +1 -1
- data/rdoc-sources/FXDelegator.rb +2 -2
- data/rdoc-sources/FXDial.rb +9 -9
- data/rdoc-sources/FXDialogBox.rb +3 -3
- data/rdoc-sources/FXDict.rb +2 -3
- data/rdoc-sources/FXDirBox.rb +2 -2
- data/rdoc-sources/FXDirList.rb +14 -14
- data/rdoc-sources/FXDirSelector.rb +14 -14
- data/rdoc-sources/FXDockBar.rb +35 -35
- data/rdoc-sources/FXDockHandler.rb +2 -2
- data/rdoc-sources/FXDockSite.rb +11 -11
- data/rdoc-sources/FXDockTitle.rb +2 -2
- data/rdoc-sources/FXDocument.rb +2 -2
- data/rdoc-sources/FXDragCorner.rb +2 -2
- data/rdoc-sources/FXDrawable.rb +5 -5
- data/rdoc-sources/FXDriveBox.rb +3 -3
- data/rdoc-sources/FXFileDialog.rb +24 -24
- data/rdoc-sources/FXFileDict.rb +11 -11
- data/rdoc-sources/FXFileList.rb +25 -25
- data/rdoc-sources/FXFileSelector.rb +31 -31
- data/rdoc-sources/FXFileStream.rb +3 -3
- data/rdoc-sources/FXFoldingList.rb +76 -76
- data/rdoc-sources/FXFont.rb +133 -133
- data/rdoc-sources/FXFontDialog.rb +1 -1
- data/rdoc-sources/FXFontSelector.rb +14 -14
- data/rdoc-sources/FXFrame.rb +5 -5
- data/rdoc-sources/FXGIFCursor.rb +6 -6
- data/rdoc-sources/FXGIFIcon.rb +6 -6
- data/rdoc-sources/FXGIFImage.rb +5 -5
- data/rdoc-sources/FXGLContext.rb +1 -1
- data/rdoc-sources/FXGLObject.rb +8 -8
- data/rdoc-sources/FXGLShape.rb +23 -23
- data/rdoc-sources/FXGLViewer.rb +51 -51
- data/rdoc-sources/FXGLVisual.rb +1 -0
- data/rdoc-sources/FXGradientBar.rb +31 -31
- data/rdoc-sources/FXGroupBox.rb +6 -6
- data/rdoc-sources/FXHeader.rb +30 -33
- data/rdoc-sources/FXHorizontalFrame.rb +12 -12
- data/rdoc-sources/FXICOIcon.rb +14 -14
- data/rdoc-sources/FXICOImage.rb +5 -5
- data/rdoc-sources/FXIcon.rb +7 -7
- data/rdoc-sources/FXIconDict.rb +1 -0
- data/rdoc-sources/FXIconList.rb +60 -60
- data/rdoc-sources/FXId.rb +1 -1
- data/rdoc-sources/FXImage.rb +49 -49
- data/rdoc-sources/FXImageFrame.rb +12 -12
- data/rdoc-sources/FXImageView.rb +10 -10
- data/rdoc-sources/FXInputDialog.rb +4 -4
- data/rdoc-sources/FXJPGIcon.rb +13 -13
- data/rdoc-sources/FXJPGImage.rb +5 -5
- data/rdoc-sources/FXKnob.rb +12 -12
- data/rdoc-sources/FXLabel.rb +3 -3
- data/rdoc-sources/FXList.rb +31 -31
- data/rdoc-sources/FXListBox.rb +7 -7
- data/rdoc-sources/FXMDIChild.rb +24 -24
- data/rdoc-sources/FXMDIClient.rb +1 -1
- data/rdoc-sources/FXMatrix.rb +2 -2
- data/rdoc-sources/FXMemoryBuffer.rb +1 -1
- data/rdoc-sources/FXMemoryStream.rb +1 -1
- data/rdoc-sources/FXMenuButton.rb +20 -19
- data/rdoc-sources/FXMenuCaption.rb +9 -9
- data/rdoc-sources/FXMenuCascade.rb +1 -1
- data/rdoc-sources/FXMenuCheck.rb +2 -2
- data/rdoc-sources/FXMenuCommand.rb +1 -1
- data/rdoc-sources/FXMenuRadio.rb +2 -2
- data/rdoc-sources/FXMenuSeparator.rb +2 -2
- data/rdoc-sources/FXMenuTitle.rb +5 -5
- data/rdoc-sources/FXMessageBox.rb +16 -16
- data/rdoc-sources/FXOptionMenu.rb +14 -14
- data/rdoc-sources/FXPCXIcon.rb +12 -12
- data/rdoc-sources/FXPCXImage.rb +5 -5
- data/rdoc-sources/FXPNGIcon.rb +12 -12
- data/rdoc-sources/FXPNGImage.rb +5 -5
- data/rdoc-sources/FXPPMIcon.rb +6 -6
- data/rdoc-sources/FXPPMImage.rb +5 -5
- data/rdoc-sources/FXPacker.rb +4 -4
- data/rdoc-sources/FXPopup.rb +5 -5
- data/rdoc-sources/FXPrintDialog.rb +21 -21
- data/rdoc-sources/FXProgressBar.rb +10 -10
- data/rdoc-sources/FXProgressDialog.rb +3 -3
- data/rdoc-sources/FXQuatd.rb +19 -19
- data/rdoc-sources/FXQuatf.rb +23 -23
- data/rdoc-sources/FXRGBIcon.rb +13 -13
- data/rdoc-sources/FXRGBImage.rb +5 -5
- data/rdoc-sources/FXRadioButton.rb +10 -10
- data/rdoc-sources/FXRanged.rb +2 -2
- data/rdoc-sources/FXRangef.rb +2 -2
- data/rdoc-sources/FXRealSlider.rb +33 -33
- data/rdoc-sources/FXRealSpinner.rb +31 -31
- data/rdoc-sources/FXRecentFiles.rb +14 -14
- data/rdoc-sources/FXRectangle.rb +22 -22
- data/rdoc-sources/FXRegistry.rb +3 -3
- data/rdoc-sources/FXReplaceDialog.rb +20 -20
- data/rdoc-sources/FXRootWindow.rb +2 -2
- data/rdoc-sources/FXRuler.rb +28 -28
- data/rdoc-sources/FXRulerView.rb +5 -5
- data/rdoc-sources/FXScrollArea.rb +27 -27
- data/rdoc-sources/FXScrollBar.rb +26 -26
- data/rdoc-sources/FXScrollPane.rb +3 -3
- data/rdoc-sources/FXScrollWindow.rb +6 -6
- data/rdoc-sources/FXSearchDialog.rb +8 -8
- data/rdoc-sources/FXSeparator.rb +24 -24
- data/rdoc-sources/FXSettings.rb +44 -44
- data/rdoc-sources/FXShutter.rb +35 -35
- data/rdoc-sources/FXSize.rb +14 -14
- data/rdoc-sources/FXSlider.rb +33 -33
- data/rdoc-sources/FXSphered.rb +2 -2
- data/rdoc-sources/FXSpheref.rb +2 -2
- data/rdoc-sources/FXSpinner.rb +30 -30
- data/rdoc-sources/FXSplashWindow.rb +5 -5
- data/rdoc-sources/FXSplitter.rb +18 -18
- data/rdoc-sources/FXSpring.rb +15 -15
- data/rdoc-sources/FXStatusBar.rb +14 -14
- data/rdoc-sources/FXStatusLine.rb +7 -7
- data/rdoc-sources/FXStream.rb +20 -20
- data/rdoc-sources/FXSwitcher.rb +23 -23
- data/rdoc-sources/FXTGAIcon.rb +12 -12
- data/rdoc-sources/FXTGAImage.rb +5 -5
- data/rdoc-sources/FXTIFIcon.rb +13 -13
- data/rdoc-sources/FXTIFImage.rb +5 -5
- data/rdoc-sources/FXTabBar.rb +31 -31
- data/rdoc-sources/FXTabBook.rb +13 -13
- data/rdoc-sources/FXTabItem.rb +22 -22
- data/rdoc-sources/FXTable.rb +148 -148
- data/rdoc-sources/FXText.rb +91 -91
- data/rdoc-sources/FXTextField.rb +39 -39
- data/rdoc-sources/FXToggleButton.rb +32 -32
- data/rdoc-sources/FXToolBar.rb +25 -25
- data/rdoc-sources/FXToolBarGrip.rb +12 -12
- data/rdoc-sources/FXToolBarShell.rb +13 -13
- data/rdoc-sources/FXToolBarTab.rb +16 -16
- data/rdoc-sources/FXTopWindow.rb +18 -18
- data/rdoc-sources/FXTranslator.rb +1 -1
- data/rdoc-sources/FXTreeList.rb +66 -66
- data/rdoc-sources/FXTreeListBox.rb +20 -20
- data/rdoc-sources/FXTriStateButton.rb +23 -23
- data/rdoc-sources/FXVec2d.rb +1 -1
- data/rdoc-sources/FXVec2f.rb +1 -1
- data/rdoc-sources/FXVec3d.rb +1 -1
- data/rdoc-sources/FXVec3f.rb +1 -1
- data/rdoc-sources/FXVec4d.rb +1 -1
- data/rdoc-sources/FXVec4f.rb +1 -1
- data/rdoc-sources/FXVerticalFrame.rb +12 -12
- data/rdoc-sources/FXVisual.rb +19 -19
- data/rdoc-sources/FXWindow.rb +96 -96
- data/rdoc-sources/FXWizard.rb +9 -9
- data/rdoc-sources/FXXBMIcon.rb +7 -7
- data/rdoc-sources/FXXBMImage.rb +6 -6
- data/rdoc-sources/FXXPMIcon.rb +13 -13
- data/rdoc-sources/FXXPMImage.rb +5 -5
- data/rdoc-sources/Makefile +3 -3
- metadata +44 -31
- data/README +0 -39
- data/README.txt +0 -483
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'fox16'
|
2
|
+
require '../lib/fox16/canvas'
|
3
|
+
|
4
|
+
include Fox
|
5
|
+
include Canvas
|
6
|
+
|
7
|
+
class CanvasDemo < FXMainWindow
|
8
|
+
def initialize(app)
|
9
|
+
# Initialize base class first
|
10
|
+
super(app, "Canvas Demo", nil, nil, DECOR_ALL, 0, 0, 800, 600)
|
11
|
+
|
12
|
+
# Menu bar
|
13
|
+
menu_bar = FXMenubar.new(self, LAYOUT_SIDE_TOP|LAYOUT_FILL_X)
|
14
|
+
|
15
|
+
# File menu
|
16
|
+
file_menu = FXMenuPane.new(self)
|
17
|
+
FXMenuCommand.new(file_menu, "&New...")
|
18
|
+
FXMenuCommand.new(file_menu, "&Open...")
|
19
|
+
FXMenuCommand.new(file_menu, "&Close")
|
20
|
+
FXMenuCommand.new(file_menu, "&Save")
|
21
|
+
FXMenuCommand.new(file_menu, "Save &As...")
|
22
|
+
FXMenuSeparator.new(file_menu)
|
23
|
+
FXMenuCommand.new(file_menu, "&Print...")
|
24
|
+
FXMenuCommand.new(file_menu, "Print &Setup...")
|
25
|
+
FXMenuCommand.new(file_menu, "Print Pre&view")
|
26
|
+
FXMenuSeparator.new(file_menu)
|
27
|
+
FXMenuCommand.new(file_menu, "E&xit", nil, app, FXApp::ID_QUIT)
|
28
|
+
|
29
|
+
# Edit menu
|
30
|
+
edit_menu = FXMenuPane.new(self)
|
31
|
+
FXMenuCommand.new(edit_menu, "&Undo")
|
32
|
+
FXMenuCommand.new(edit_menu, "&Redo")
|
33
|
+
FXMenuSeparator.new(edit_menu)
|
34
|
+
FXMenuCommand.new(edit_menu, "&Cut")
|
35
|
+
FXMenuSeparator.new(edit_menu)
|
36
|
+
FXMenuCommand.new(edit_menu, "Change &background color")
|
37
|
+
FXMenuCommand.new(edit_menu, "Edit &label")
|
38
|
+
|
39
|
+
# Recently used files
|
40
|
+
@mru_files = FXRecentFiles.new
|
41
|
+
|
42
|
+
# Help menu
|
43
|
+
help_menu = FXMenuPane.new(self)
|
44
|
+
aboutBox = FXMenuCommand.new(help_menu, "&About...")
|
45
|
+
aboutBox.connect(SEL_COMMAND) do |sender, sel, ptr|
|
46
|
+
FXMessageBox.information(self, MBOX_OK, "About Canvas",
|
47
|
+
"Canvas Demo\nTo draw a shape, select a shape on the toolbar and left-click on the canvas.\nTo draw a line, right-drag between shapes.")
|
48
|
+
end
|
49
|
+
|
50
|
+
# Attach menus to menu bar titles
|
51
|
+
FXMenuTitle.new(menu_bar, "&File", nil, file_menu)
|
52
|
+
FXMenuTitle.new(menu_bar, "&Edit", nil, edit_menu)
|
53
|
+
FXMenuTitle.new(menu_bar, "&Help", nil, help_menu)
|
54
|
+
|
55
|
+
# Status bar
|
56
|
+
FXStatusbar.new(self,
|
57
|
+
LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|STATUSBAR_WITH_DRAGCORNER)
|
58
|
+
|
59
|
+
# Shapes canvas fills the remainder
|
60
|
+
frame = FXHorizontalFrame.new(self,
|
61
|
+
LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK,
|
62
|
+
0, 0, 0, 0, 0, 0, 0, 0)
|
63
|
+
canvas = ShapeCanvas.new(frame, nil, 0, LAYOUT_FILL_X|LAYOUT_FILL_Y)
|
64
|
+
canvas.scene = get_scene(canvas)
|
65
|
+
end
|
66
|
+
|
67
|
+
def get_scene(canvas)
|
68
|
+
scene = ShapeGroup.new
|
69
|
+
scene.addShape(CircleShape.new(5, 5, 10))
|
70
|
+
scene.addShape(CircleShape.new(50, 50, 20))
|
71
|
+
scene.addShape(LineShape.new(10, 10, 70, 70))
|
72
|
+
scene.addShape(RectangleShape.new(90, 90, 30, 40))
|
73
|
+
scene.addShape(TextShape.new(60, 60, 30, 40, "Hello!"))
|
74
|
+
scene
|
75
|
+
end
|
76
|
+
|
77
|
+
def create
|
78
|
+
super
|
79
|
+
show(PLACEMENT_SCREEN)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
if __FILE__ == $0
|
84
|
+
app = FXApp.new("CanvasDemo", "FXRuby")
|
85
|
+
CanvasDemo.new(app)
|
86
|
+
app.create
|
87
|
+
app.run
|
88
|
+
end
|
data/examples/gdchart.rb
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'fox16'
|
2
|
+
require 'tempfile'
|
3
|
+
begin
|
4
|
+
require 'GDChart'
|
5
|
+
rescue LoadError
|
6
|
+
require 'fox16/missingdep'
|
7
|
+
MSG = <<EOM
|
8
|
+
Sorry, this example depends on the GDChart extension. Please
|
9
|
+
check the Ruby Application Archives for an appropriate
|
10
|
+
download site.
|
11
|
+
EOM
|
12
|
+
missingDependency(MSG)
|
13
|
+
end
|
14
|
+
|
15
|
+
include Fox
|
16
|
+
|
17
|
+
class GDChartViewer < FXMainWindow
|
18
|
+
def initialize(app)
|
19
|
+
# Invoke base class initialize first
|
20
|
+
super(app, "GDChart Viewer", :opts => DECOR_ALL, :width => 850, :height => 600)
|
21
|
+
|
22
|
+
# Sunken border for image widget
|
23
|
+
imagebox = FXHorizontalFrame.new(self,
|
24
|
+
FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y)
|
25
|
+
|
26
|
+
# Make image widget
|
27
|
+
@imageview = FXImageView.new(imagebox,
|
28
|
+
:opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|HSCROLLER_NEVER|VSCROLLER_NEVER)
|
29
|
+
|
30
|
+
# Construct a PNG image and store it in the image viewer
|
31
|
+
@imageview.image = createChart
|
32
|
+
|
33
|
+
# Resize main window client area to fit image size
|
34
|
+
resize(@imageview.contentWidth, @imageview.contentHeight)
|
35
|
+
end
|
36
|
+
|
37
|
+
def createChart
|
38
|
+
# Create a simple chart
|
39
|
+
GDChart.title = "A Chart"
|
40
|
+
GDChart.xtitle = "X-axis"
|
41
|
+
GDChart.ytitle = "Y-axis"
|
42
|
+
data = [1, 2, 3, 4, 5, 6]
|
43
|
+
labels = ["label 1", "label 2", "label 3", "label 4", "label 5", "label 6"]
|
44
|
+
|
45
|
+
# Write chart data out as GIF to a temporary file
|
46
|
+
File.open('gdchart.gif', 'w') do |f|
|
47
|
+
GDChart.out_graph(200, 200, f, GDChart::LINE, labels.length, labels, 1, data)
|
48
|
+
end
|
49
|
+
|
50
|
+
# Reopen it and construct image
|
51
|
+
img = nil
|
52
|
+
File.open('gdchart.gif', 'rb') do |f|
|
53
|
+
img = FXGIFIcon.new(getApp(), f.read)
|
54
|
+
end
|
55
|
+
img
|
56
|
+
end
|
57
|
+
|
58
|
+
def create
|
59
|
+
super
|
60
|
+
show(PLACEMENT_SCREEN)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
if __FILE__ == $0
|
65
|
+
# Make application
|
66
|
+
application = FXApp.new("GDChart Viewer", "FoxTest")
|
67
|
+
|
68
|
+
# Make window
|
69
|
+
window = GDChartViewer.new(application)
|
70
|
+
|
71
|
+
# Create it
|
72
|
+
application.create
|
73
|
+
|
74
|
+
# Run
|
75
|
+
application.run
|
76
|
+
end
|
@@ -0,0 +1,289 @@
|
|
1
|
+
require 'fox16'
|
2
|
+
|
3
|
+
include Fox
|
4
|
+
|
5
|
+
class GemBrowser
|
6
|
+
|
7
|
+
#
|
8
|
+
# A reference to the currently selected Gem specification, or +nil+
|
9
|
+
# if none is selected.
|
10
|
+
#
|
11
|
+
attr_accessor :currentSpec
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@currentSpec = nil
|
15
|
+
end
|
16
|
+
|
17
|
+
#
|
18
|
+
# Install the Gem described by the named spec file, and return the
|
19
|
+
# Specification for this Gem.
|
20
|
+
#
|
21
|
+
def install(filename)
|
22
|
+
Gem::Installer.new(filename).install
|
23
|
+
spec = nil
|
24
|
+
cache.each do |n, s|
|
25
|
+
spec = s if (File.basename(filename, ".gem") == s.full_name)
|
26
|
+
end
|
27
|
+
spec
|
28
|
+
end
|
29
|
+
|
30
|
+
#
|
31
|
+
# Uninstall the Gem described by this specification.
|
32
|
+
#
|
33
|
+
def uninstall(spec)
|
34
|
+
Gem::Uninstaller.new(spec.name).uninstall
|
35
|
+
end
|
36
|
+
|
37
|
+
# Return an array of the installed specifications.
|
38
|
+
def cache
|
39
|
+
# Gem.cache
|
40
|
+
Gem::Cache.from_installed_gems
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class GemInfoPanel < FXVerticalFrame
|
45
|
+
|
46
|
+
attr_reader :browser
|
47
|
+
|
48
|
+
def initialize(p, b, opts)
|
49
|
+
# Initialize base class
|
50
|
+
super(p, opts)
|
51
|
+
|
52
|
+
@browser = b
|
53
|
+
|
54
|
+
self.backColor = FXRGB(255, 255, 255)
|
55
|
+
|
56
|
+
File.open(File.join("icons", "gem_big.png"), "rb") do |f|
|
57
|
+
@bigIcon = FXPNGIcon.new(getApp(), f.read)
|
58
|
+
end
|
59
|
+
|
60
|
+
nameLabel = FXLabel.new(self, "", @bigIcon, JUSTIFY_LEFT|JUSTIFY_TOP|ICON_BEFORE_TEXT|LAYOUT_FILL_X)
|
61
|
+
nameLabel.backColor = FXRGB(255, 255, 255)
|
62
|
+
nameLabel.connect(SEL_UPDATE) { |nameLabel, sel, ptr|
|
63
|
+
if currentSpec
|
64
|
+
nameLabel.text = specDescription(currentSpec)
|
65
|
+
nameLabel.show
|
66
|
+
else
|
67
|
+
nameLabel.text = ""
|
68
|
+
nameLabel.hide
|
69
|
+
end
|
70
|
+
}
|
71
|
+
|
72
|
+
summaryText = FXText.new(self, nil, 0, TEXT_READONLY|TEXT_WORDWRAP|LAYOUT_FILL_X|LAYOUT_FILL_Y)
|
73
|
+
summaryText.backColor = FXRGB(255, 255, 255)
|
74
|
+
summaryText.connect(SEL_UPDATE) { |summaryText, sel, ptr|
|
75
|
+
theText = currentSpec ? currentSpec.summary : nil
|
76
|
+
summaryText.text = theText unless (summaryText.text == theText)
|
77
|
+
}
|
78
|
+
end
|
79
|
+
|
80
|
+
#
|
81
|
+
# Return a reference to the currently selected Gem specification,
|
82
|
+
# or +nil+ if none is selected.
|
83
|
+
#
|
84
|
+
def currentSpec
|
85
|
+
browser.currentSpec
|
86
|
+
end
|
87
|
+
|
88
|
+
# Return a multiline string (suitable for use with an FXLabel) describing this spec.
|
89
|
+
def specDescription(spec)
|
90
|
+
[spec.name, "version #{spec.version}", spec.author, spec.email, spec.homepage].join("\n")
|
91
|
+
end
|
92
|
+
|
93
|
+
def create
|
94
|
+
super
|
95
|
+
@bigIcon.create
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
class GemsPanel < FXVerticalFrame
|
100
|
+
|
101
|
+
attr_reader :browser
|
102
|
+
|
103
|
+
def initialize(p, br, opts)
|
104
|
+
# Initialize base class
|
105
|
+
super(p, opts)
|
106
|
+
|
107
|
+
# Save a reference to the browser
|
108
|
+
@browser = br
|
109
|
+
|
110
|
+
File.open(File.join("icons", "gem_big.png"), "rb") do |f|
|
111
|
+
@bigIcon = FXPNGIcon.new(getApp(), f.read)
|
112
|
+
end
|
113
|
+
File.open(File.join("icons", "gem_small.png"), "rb") do |f|
|
114
|
+
@smallIcon = FXPNGIcon.new(getApp(), f.read)
|
115
|
+
end
|
116
|
+
|
117
|
+
@iconList = FXIconList.new(self, nil, 0, LAYOUT_FILL_X|LAYOUT_FILL_Y|ICONLIST_MINI_ICONS|ICONLIST_BROWSESELECT)
|
118
|
+
@iconList.connect(SEL_SELECTED) { |sender, sel, ptr|
|
119
|
+
browser.currentSpec = itemSpec(ptr)
|
120
|
+
}
|
121
|
+
|
122
|
+
# Fill the list with installed specifications.
|
123
|
+
browser.cache.each { |name, spec| appendItem(spec) }
|
124
|
+
if numItems > 0
|
125
|
+
selectItem(0)
|
126
|
+
browser.currentSpec = itemSpec(0)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def appendItem(spec)
|
131
|
+
@iconList.appendItem(spec.name, @bigIcon, @smallIcon, spec)
|
132
|
+
if numItems == 1
|
133
|
+
selectItem(0)
|
134
|
+
browser.currentSpec = itemSpec(0)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def currentItem
|
139
|
+
@iconList.currentItem
|
140
|
+
end
|
141
|
+
|
142
|
+
#
|
143
|
+
# Return the specification associated with the item at _index_, or
|
144
|
+
# +nil+ if no such item.
|
145
|
+
#
|
146
|
+
def itemSpec(index)
|
147
|
+
(index >= 0) ? getItem(index).data : nil
|
148
|
+
end
|
149
|
+
|
150
|
+
def currentItemSpec
|
151
|
+
itemSpec(currentItem)
|
152
|
+
end
|
153
|
+
|
154
|
+
def getItem(*args)
|
155
|
+
@iconList.getItem(*args)
|
156
|
+
end
|
157
|
+
|
158
|
+
def selectItem(index)
|
159
|
+
@iconList.selectItem(index, true)
|
160
|
+
end
|
161
|
+
|
162
|
+
def numItems
|
163
|
+
@iconList.numItems
|
164
|
+
end
|
165
|
+
|
166
|
+
def create
|
167
|
+
super
|
168
|
+
@bigIcon.create
|
169
|
+
@smallIcon.create
|
170
|
+
self.width = @iconList.font.getTextWidth("MMMMMMMMMMMMM")
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
class GemBrowserWindow < FXMainWindow
|
175
|
+
|
176
|
+
attr_reader :browser
|
177
|
+
|
178
|
+
def initialize(anApp)
|
179
|
+
# Initialize base class first
|
180
|
+
super(anApp, "Gem Browser", nil, nil, DECOR_ALL)
|
181
|
+
|
182
|
+
# Menu bar
|
183
|
+
menubar = FXMenuBar.new(self, LAYOUT_SIDE_TOP|LAYOUT_FILL_X)
|
184
|
+
|
185
|
+
# File menu
|
186
|
+
filemenu = FXMenuPane.new(self)
|
187
|
+
FXMenuTitle.new(menubar, "&File", nil, filemenu)
|
188
|
+
|
189
|
+
installCmd = FXMenuCommand.new(filemenu, "Install a Gem...")
|
190
|
+
installCmd.connect(SEL_COMMAND) { install }
|
191
|
+
|
192
|
+
uninstallCmd = FXMenuCommand.new(filemenu, "Uninstall this Gem")
|
193
|
+
uninstallCmd.connect(SEL_COMMAND) { uninstall }
|
194
|
+
uninstallCmd.connect(SEL_UPDATE) do |sender, sel, ptr|
|
195
|
+
spec = browser.currentSpec
|
196
|
+
if spec
|
197
|
+
sender.text = "Uninstall #{spec.name}"
|
198
|
+
sender.enable
|
199
|
+
else
|
200
|
+
sender.text = "Uninstall this Gem"
|
201
|
+
sender.disable
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
FXMenuCommand.new(filemenu, "&Quit\tCtl-Q").connect(SEL_COMMAND) { quit }
|
206
|
+
|
207
|
+
# Main window interior
|
208
|
+
contents = FXVerticalFrame.new(self, LAYOUT_FILL_X|LAYOUT_FILL_Y)
|
209
|
+
|
210
|
+
@browser = GemBrowser.new
|
211
|
+
|
212
|
+
# Horizontal splitter with info pane on the left, icon list on the right
|
213
|
+
@splitter = FXSplitter.new(contents, LAYOUT_FILL_X|LAYOUT_FILL_Y|SPLITTER_HORIZONTAL|SPLITTER_REVERSED) do |splitter|
|
214
|
+
infoPanel = GemInfoPanel.new(splitter, @browser, LAYOUT_FILL_X|LAYOUT_FILL_X|FRAME_SUNKEN|FRAME_THICK)
|
215
|
+
@gemsPanel = GemsPanel.new(splitter, @browser, LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK)
|
216
|
+
end
|
217
|
+
|
218
|
+
# Catch these too
|
219
|
+
self.connect(SEL_CLOSE) { quit }
|
220
|
+
anApp.addSignal("SIGINT") { quit }
|
221
|
+
end
|
222
|
+
|
223
|
+
def install
|
224
|
+
FXFileDialog.new(self, "Install Gem") { |dlg|
|
225
|
+
dlg.directory = @directory unless @directory.empty?
|
226
|
+
dlg.patternList = ["Gem Files (*.gem)", "All Files (*)"]
|
227
|
+
if dlg.execute != 0
|
228
|
+
@directory = dlg.directory
|
229
|
+
begin
|
230
|
+
spec = browser.install(dlg.filename)
|
231
|
+
@gemsPanel.appendItem(spec)
|
232
|
+
rescue => ex
|
233
|
+
FXMessageBox.error(self, MBOX_OK, "Installation Failed", ex.to_s)
|
234
|
+
end
|
235
|
+
end
|
236
|
+
}
|
237
|
+
end
|
238
|
+
|
239
|
+
def uninstall
|
240
|
+
begin
|
241
|
+
browser.uninstall(browser.currentSpec)
|
242
|
+
rescue => ex
|
243
|
+
FXMessageBox.error(self, MBOX_OK, "Uninstall Failed", ex.to_s)
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
def quit
|
248
|
+
getApp().reg().writeIntEntry("SETTINGS", "x", x)
|
249
|
+
getApp().reg().writeIntEntry("SETTINGS", "y", y)
|
250
|
+
getApp().reg().writeIntEntry("SETTINGS", "width", width)
|
251
|
+
getApp().reg().writeIntEntry("SETTINGS", "height", height)
|
252
|
+
getApp().reg().writeIntEntry("SETTINGS", "listWidth", @splitter.first.next.width)
|
253
|
+
getApp().reg().writeStringEntry("SETTINGS", "directory", @directory) if @directory
|
254
|
+
getApp().exit(0)
|
255
|
+
end
|
256
|
+
|
257
|
+
def create
|
258
|
+
# Do base class create
|
259
|
+
super
|
260
|
+
|
261
|
+
# Get size, etc. from registry
|
262
|
+
xx = getApp().reg().readIntEntry("SETTINGS", "x", 0)
|
263
|
+
yy = getApp().reg().readIntEntry("SETTINGS", "y", 0)
|
264
|
+
ww = getApp().reg().readIntEntry("SETTINGS", "width", 450)
|
265
|
+
hh = getApp().reg().readIntEntry("SETTINGS", "height", 300)
|
266
|
+
position(xx, yy, ww, hh)
|
267
|
+
|
268
|
+
# Splitter child sizes
|
269
|
+
rightPaneSize = getApp().reg().readIntEntry("SETTINGS", "listWidth", -1)
|
270
|
+
if rightPaneSize >= 0
|
271
|
+
@splitter.first.next.width = rightPaneSize
|
272
|
+
end
|
273
|
+
|
274
|
+
# Last directory for Gem files
|
275
|
+
@directory = getApp().reg().readStringEntry("SETTINGS", "directory", "")
|
276
|
+
|
277
|
+
# Show it
|
278
|
+
show
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
282
|
+
if __FILE__ == $0
|
283
|
+
FXApp.new("GemBrowser", "FXRuby") do |theApp|
|
284
|
+
GemBrowserWindow.new(theApp)
|
285
|
+
theApp.create
|
286
|
+
theApp.run
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|