Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
require 'fox16'
require 'cgi'
require 'soap/wsdlDriver'
include Fox
class RAABrowserWindow < FXMainWindow
def initialize(app)
# Initialize base class
super(app, "Ruby Application Archive", :opts => DECOR_ALL, :width => 600, :height => 600)
# Contents
contents = FXHorizontalFrame.new(self, LAYOUT_FILL_X|LAYOUT_FILL_Y)
# Horizontal splitter
splitter = FXSplitter.new(contents, (LAYOUT_SIDE_TOP|LAYOUT_FILL_X|
LAYOUT_FILL_Y|SPLITTER_TRACKING|SPLITTER_HORIZONTAL))
# Create a sunken frame to hold the tree list
groupbox = FXGroupBox.new(splitter, "Contents",
LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_GROOVE)
frame = FXHorizontalFrame.new(groupbox,
LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK)
# Create the empty tree list
@treeList = FXTreeList.new(frame,
:opts => TREELIST_BROWSESELECT|TREELIST_SHOWS_LINES|TREELIST_SHOWS_BOXES|TREELIST_ROOT_BOXES|LAYOUT_FILL_X|LAYOUT_FILL_Y)
@treeList.connect(SEL_COMMAND) do |sender, sel, item|
if @treeList.isItemLeaf(item)
getApp().beginWaitCursor do
begin
gem = @raa.gem(item.text)
@category.value = gem.category.major + "/" + gem.category.minor
@projectName.value = gem.project.name
@version.value = gem.project.version
@status.value = gem.project.status
@lastUpdate.value = gem.updated.strftime("%F %T GMT")
@owner.value = "#{gem.owner.name} (#{gem.owner.email.to_s})"
@homepage.value = gem.project.url.to_s
@download.value = gem.project.download.to_s
@license.value = gem.project.license
@description.value = CGI::unescapeHTML(gem.project.description).gsub(/\r\n/, "\n")
rescue SOAP::PostUnavailableError => ex
getApp().endWaitCursor
FXMessageBox.error(self, MBOX_OK, "SOAP Error", ex.message)
end
end
end
end
# Set up data targets for the product-specific information
@category = FXDataTarget.new("")
@projectName = FXDataTarget.new("")
@version = FXDataTarget.new("")
@status = FXDataTarget.new("")
@lastUpdate = FXDataTarget.new("")
@owner = FXDataTarget.new("")
@homepage = FXDataTarget.new("")
@download = FXDataTarget.new("")
@license = FXDataTarget.new("")
@description = FXDataTarget.new("")
# Information appears on the right-hand side
infoFrame = FXVerticalFrame.new(splitter, LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_RIGHT|FRAME_SUNKEN|FRAME_THICK)
infoBox = FXGroupBox.new(infoFrame, "Info", GROUPBOX_NORMAL|LAYOUT_FILL_X|FRAME_GROOVE)
infoMatrix = FXMatrix.new(infoBox, 2, MATRIX_BY_COLUMNS|LAYOUT_FILL_X|LAYOUT_FILL_Y)
FXLabel.new(infoMatrix, "Category:")
FXTextField.new(infoMatrix, 20, @category, FXDataTarget::ID_VALUE, TEXTFIELD_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
FXLabel.new(infoMatrix, "Project name:")
FXTextField.new(infoMatrix, 20, @projectName, FXDataTarget::ID_VALUE, TEXTFIELD_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
FXLabel.new(infoMatrix, "Version:")
FXTextField.new(infoMatrix, 20, @version, FXDataTarget::ID_VALUE, TEXTFIELD_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
FXLabel.new(infoMatrix, "Status:")
FXTextField.new(infoMatrix, 20, @status, FXDataTarget::ID_VALUE, TEXTFIELD_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
FXLabel.new(infoMatrix, "Last update:")
FXTextField.new(infoMatrix, 20, @lastUpdate, FXDataTarget::ID_VALUE, TEXTFIELD_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
FXLabel.new(infoMatrix, "Owner:")
FXTextField.new(infoMatrix, 20, @owner, FXDataTarget::ID_VALUE, TEXTFIELD_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
FXLabel.new(infoMatrix, "Homepage:")
FXTextField.new(infoMatrix, 20, @homepage, FXDataTarget::ID_VALUE, TEXTFIELD_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
FXLabel.new(infoMatrix, "Download:")
FXTextField.new(infoMatrix, 20, @download, FXDataTarget::ID_VALUE, TEXTFIELD_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
FXLabel.new(infoMatrix, "License:")
FXTextField.new(infoMatrix, 20, @license, FXDataTarget::ID_VALUE, TEXTFIELD_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
descriptionBox = FXGroupBox.new(infoFrame, "Description", GROUPBOX_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_GROOVE)
descriptionFrame = FXHorizontalFrame.new(descriptionBox, FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y)
FXText.new(descriptionFrame, @description, FXDataTarget::ID_VALUE, TEXT_READONLY|TEXT_WORDWRAP|LAYOUT_FILL_X|LAYOUT_FILL_Y)
# Initialize the service
@raa = SOAP::WSDLDriverFactory.new("http://www2.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/").create_rpc_driver
# Set up the product tree list
@productTree = @raa.tree_by_category
@productTree.keys.sort.each do |sectionName|
sectionHash = @productTree[sectionName]
sectionItem = @treeList.appendItem(nil, sectionName)
sectionHash.keys.sort.each do |categoryName|
categoryArray = sectionHash[categoryName]
categoryItem = @treeList.appendItem(sectionItem, categoryName)
categoryArray.each do |productName|
productItem = @treeList.appendItem(categoryItem, productName)
end
end
end
end
def create
super
@treeList.parent.parent.setWidth(@treeList.font.getTextWidth('M'*24))
show(PLACEMENT_SCREEN)
end
end
if __FILE__ == $0
app = FXApp.new("RAABrowser", "FoxTest")
RAABrowserWindow.new(app)
app.create
app.run
end