Newer
Older
#!/usr/bin/env ruby
require 'fox16'
include Fox
class GroupWindow < FXMainWindow
# Convenience function to load & construct an icon
def getIcon(filename)
filename = File.expand_path("../icons/#{filename}", __FILE__)
File.open(filename, "rb") do |f|
FXPNGIcon.new(getApp(), f.read)
end
end
def initialize(app)
# Call the base class version of initialize
super(app, "Group Box Test", :opts => DECOR_ALL)
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
# Some icons we'll use here and there
doc = getIcon("minidoc.png")
folder_open = getIcon("minifolderopen.png")
folder_closed = getIcon("minifolder.png")
# Menubar
menubar = FXMenuBar.new(self, LAYOUT_SIDE_TOP|LAYOUT_FILL_X)
filemenu = FXMenuPane.new(self)
FXMenuCommand.new(filemenu, "Open any", folder_open).connect(SEL_COMMAND) {
file = FXFileDialog.getSaveFilename(self, "Save file",
"../examples/groupbox.rb", @sourcefiles, 1)
}
FXMenuCommand.new(filemenu, "Open existing", folder_open).connect(SEL_COMMAND) {
file = FXFileDialog.getOpenFilename(self, "Open file",
"../examples/groupbox.rb", @sourcefiles, 3)
}
FXMenuCommand.new(filemenu, "Open multiple", folder_open).connect(SEL_COMMAND) do
files = FXFileDialog.getOpenFilenames(self, "Open file",
"../examples/groupbox.rb", @sourcefiles)
FXMessageBox.information(self, MBOX_OK, "Selected Files", files.join("\n"))
end
FXMenuCommand.new(filemenu, "Open directory", folder_open).connect(SEL_COMMAND) {
dir = FXFileDialog.getOpenDirectory(self, "Open directory", "../examples")
}
FXMenuCommand.new(filemenu, "Open directory dialog", folder_open).connect(SEL_COMMAND) {
dirDialog = FXDirDialog.new(self, "Choose a directory")
if dirDialog.execute != 0
FXMessageBox.information(self, MBOX_OK, "Selected Directory", dirDialog.directory)
end
}
radio1 = FXMenuRadio.new(filemenu, "Radio&1")
radio1.connect(SEL_COMMAND, method(:onCmdRadio))
radio1.connect(SEL_UPDATE, method(:onUpdRadio))
radio2 = FXMenuRadio.new(filemenu, "Radio&2")
radio2.connect(SEL_COMMAND, method(:onCmdRadio))
radio2.connect(SEL_UPDATE, method(:onUpdRadio))
radio3 = FXMenuRadio.new(filemenu, "Radio&3")
radio3.connect(SEL_COMMAND, method(:onCmdRadio))
radio3.connect(SEL_UPDATE, method(:onUpdRadio))
FXMenuCommand.new(filemenu, "Delete\tCtl-X").connect(SEL_COMMAND) {
@group2 = nil
}
FXMenuCommand.new(filemenu,
"Downsize\tF5\tResize to minimum").connect(SEL_COMMAND) {
resize(getDefaultWidth(), getDefaultHeight())
}
FXMenuCommand.new(filemenu, "&Size").connect(SEL_COMMAND) {
resize(getDefaultWidth(), getDefaultHeight())
}
FXMenuCommand.new(filemenu, "Dump Widgets", nil, getApp(), FXApp::ID_DUMP)
# Make edit popup menu
editmenu = FXMenuPane.new(self)
FXMenuCommand.new(editmenu, "Undo")
FXMenuCommand.new(editmenu, "Cut")
submenu1 = FXMenuPane.new(self)
FXMenuCommand.new(submenu1, "&One")
FXMenuCommand.new(submenu1, "&Two")
FXMenuCommand.new(submenu1, "Th&ree")
FXMenuCommand.new(submenu1, "&Four")
FXMenuCascade.new(editmenu, "&Submenu1", nil, submenu1)
FXMenuCascade.new(filemenu, "&Edit", nil, editmenu)
FXMenuCommand.new(filemenu, "&Quit\tCtl-Q", nil, getApp(), FXApp::ID_QUIT)
FXMenuTitle.new(menubar, "&File", nil, filemenu)
helpmenu = FXMenuPane.new(self)
FXMenuCommand.new(helpmenu, "&About FOX...").connect(SEL_COMMAND) {
FXMessageBox.information(self, MBOX_OK,
"About FOX:- An intentionally long title",
"FOX is a really, really cool C++ library!\nExample written by Jeroen")
}
FXMenuTitle.new(menubar, "&Help", nil, helpmenu, LAYOUT_RIGHT)
poptext = FXTextField.new(@popupmenu, 10, :opts => FRAME_SUNKEN|FRAME_THICK|LAYOUT_SIDE_TOP)
# Status bar
status = FXStatusBar.new(self,
LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|STATUSBAR_WITH_DRAGCORNER)
@clockLabel = FXLabel.new(status, Time.now().strftime("%I:%M:%S %p"), nil,
LAYOUT_FILL_Y|LAYOUT_RIGHT|FRAME_SUNKEN)
# Content
contents = FXHorizontalFrame.new(self,
LAYOUT_SIDE_TOP|FRAME_NONE|LAYOUT_FILL_X|LAYOUT_FILL_Y)
group1 = FXGroupBox.new(contents, "Title Left",
GROUPBOX_TITLE_LEFT|FRAME_RIDGE|LAYOUT_FILL_X|LAYOUT_FILL_Y)
group2 = FXGroupBox.new(contents, "Slider Tests",
GROUPBOX_TITLE_CENTER|FRAME_RIDGE|LAYOUT_FILL_X|LAYOUT_FILL_Y)
group3 = FXGroupBox.new(contents, "Title Right",
GROUPBOX_TITLE_RIGHT|FRAME_RIDGE|LAYOUT_FILL_X|LAYOUT_FILL_Y)
testlabel = FXLabel.new(group1,
"&This is a multi-line\nlabel widget\nwith a big font", nil,
LAYOUT_CENTER_X|JUSTIFY_CENTER_X)
testlabel.setFont(FXFont.new(getApp(), "helvetica", 24, FONTWEIGHT_BOLD,
FONTSLANT_ITALIC, FONTENCODING_DEFAULT))
FXButton.new(group1, "Small &Button", nil, nil, 0, FRAME_RAISED|FRAME_THICK)
FXButton.new(group1, "Big Fat Wide Button\nComprising\nthree lines", :opts => FRAME_RAISED|FRAME_THICK)
FXToggleButton.new(group1,
"C&losed\tTooltip for closed\tHelp for closed",
"O&pen\nState\tTooltip for open\tHelp for open",
folder_closed, folder_open, nil, 0,
ICON_BEFORE_TEXT|JUSTIFY_LEFT|FRAME_RAISED|FRAME_THICK)
numbers =%w{first second third fourth}
0.upto(3) do |idx|
FXOption.new(pop, "#{numbers[idx].capitalize}\tTip #{idx+1}\tHelp #{numbers[idx]}", :opts => JUSTIFY_HZ_APART|ICON_AFTER_TEXT).connect(SEL_COMMAND) {
FXMessageBox.information(self, MBOX_OK, "Option Menu", "Chose option #{idx+1}")
}
end
FXOptionMenu.new(group1, pop,
LAYOUT_TOP|FRAME_RAISED|FRAME_THICK|JUSTIFY_HZ_APART|ICON_AFTER_TEXT)
FXLabel.new(group1, "Te&kstje", nil, LAYOUT_TOP|JUSTIFY_LEFT)
FXButton.new(group1,
"Add an `&&' by doubling\tTooltip\tHelp text for status", :opts => LAYOUT_TOP|FRAME_RAISED|FRAME_THICK)
FXButton.new(group1, "Te&kstje", :opts => LAYOUT_TOP|FRAME_RAISED|FRAME_THICK).connect(SEL_COMMAND) {
x, y, buttons = getRoot().getCursorPosition()
@popupmenu.popup(nil, x, y)
}
FXMenuButton.new(group1, "&Menu", :opts => MENUBUTTON_ATTACH_BOTH|MENUBUTTON_DOWN|JUSTIFY_HZ_APART|LAYOUT_TOP|FRAME_RAISED|FRAME_THICK|ICON_AFTER_TEXT)
FXMenuButton.new(group1, "&Menu", nil, filemenu, MENUBUTTON_UP|LAYOUT_TOP|FRAME_RAISED|FRAME_THICK|ICON_AFTER_TEXT)
coolpop = FXPopup.new(self, POPUP_HORIZONTAL)
FXButton.new(coolpop, "A\tTipA",
:opts => FRAME_THICK|FRAME_RAISED|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT, :width => 30, :height => 30)
FXButton.new(coolpop, "B\tTipB",
:opts => FRAME_THICK|FRAME_RAISED|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT, :width => 30, :height => 30)
FXButton.new(coolpop, "C\tTipC",
:opts => FRAME_THICK|FRAME_RAISED|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT, :width => 30, :height => 30)
FXButton.new(coolpop, "D\tTipD",
:opts => FRAME_THICK|FRAME_RAISED|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT, :width => 30, :height => 30)
FXMenuButton.new(group1, "&S\tSideways", nil, coolpop,
(MENUBUTTON_ATTACH_BOTH|MENUBUTTON_LEFT|MENUBUTTON_NOARROWS|LAYOUT_TOP|
FRAME_RAISED|FRAME_THICK|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT), :width => 30, :height => 30)
matrix = FXMatrix.new(group1, 3,
FRAME_RAISED|LAYOUT_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y)
FXButton.new(matrix, "A", :opts => FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_FILL_ROW)
FXButton.new(matrix, "&Wide button", :opts => FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_X)
FXButton.new(matrix, "A", :opts => FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_X)
FXButton.new(matrix, "BBBB", :opts => FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_FILL_ROW|LAYOUT_FILL_COLUMN)
FXButton.new(matrix, "B", :opts => FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
FXButton.new(matrix, "BB", :opts => FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
FXButton.new(matrix, "C", :opts => FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_CENTER_X|LAYOUT_FILL_ROW)
FXButton.new(matrix, "&wide", :opts => FRAME_RAISED|FRAME_THICK)
FXButton.new(matrix, "CC", :opts => FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT)
FXSlider.new(group2, :opts => LAYOUT_TOP|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|SLIDER_HORIZONTAL, :width => 200, :height => 30)
FXSlider.new(group2, :opts => LAYOUT_TOP|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|SLIDER_HORIZONTAL|SLIDER_ARROW_UP, :width => 200, :height => 30)
FXSlider.new(group2, :opts => LAYOUT_TOP|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|SLIDER_HORIZONTAL|SLIDER_ARROW_DOWN, :width => 200, :height => 30)
slider = FXSlider.new(group2, :opts => LAYOUT_TOP|LAYOUT_FILL_X|LAYOUT_FIX_HEIGHT|SLIDER_HORIZONTAL|SLIDER_INSIDE_BAR, :width => 200, :height => 20)
frame = FXHorizontalFrame.new(group2, LAYOUT_FILL_X|LAYOUT_FILL_Y)
FXSlider.new(frame, nil, 0,
LAYOUT_FIX_HEIGHT|SLIDER_VERTICAL, 0, 0, 30, 200)
FXSlider.new(frame, nil, 0,
LAYOUT_FIX_HEIGHT|SLIDER_VERTICAL|SLIDER_ARROW_RIGHT, 0, 0, 30, 200)
FXSlider.new(frame, nil, 0,
LAYOUT_FIX_HEIGHT|SLIDER_VERTICAL|SLIDER_ARROW_LEFT, 0, 0, 30, 200)
FXSlider.new(frame, nil, 0,
LAYOUT_FIX_HEIGHT|SLIDER_VERTICAL|SLIDER_INSIDE_BAR, 0, 0, 20, 200)
FXScrollBar.new(frame, nil, 0,
SCROLLBAR_VERTICAL|LAYOUT_FIX_HEIGHT|LAYOUT_FIX_WIDTH, 0, 0, 20, 300)
vframe1 = FXVerticalFrame.new(frame, LAYOUT_FILL_X|LAYOUT_FILL_Y)
FXArrowButton.new(vframe1, nil, 0,
LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_RAISED|FRAME_THICK|ARROW_UP)
FXArrowButton.new(vframe1, nil, 0,
LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_RAISED|FRAME_THICK|ARROW_DOWN)
FXArrowButton.new(vframe1, nil, 0,
LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_RAISED|FRAME_THICK|ARROW_LEFT)
FXArrowButton.new(vframe1, nil, 0,
LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_RAISED|FRAME_THICK|ARROW_RIGHT)
vframe2 = FXVerticalFrame.new(frame, LAYOUT_FILL_X|LAYOUT_FILL_Y)
FXArrowButton.new(vframe2, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_RAISED|FRAME_THICK|ARROW_UP|ARROW_TOOLBAR)
FXArrowButton.new(vframe2, nil, 0, (LAYOUT_FILL_X|LAYOUT_FILL_Y|
FRAME_RAISED|FRAME_THICK|ARROW_DOWN|ARROW_TOOLBAR))
FXArrowButton.new(vframe2, nil, 0, (LAYOUT_FILL_X|LAYOUT_FILL_Y|
FRAME_RAISED|FRAME_THICK|ARROW_LEFT|ARROW_TOOLBAR))
FXArrowButton.new(vframe2, nil, 0, (LAYOUT_FILL_X|LAYOUT_FILL_Y|
FRAME_RAISED|FRAME_THICK|ARROW_RIGHT|ARROW_TOOLBAR))
gp_datatarget = FXDataTarget.new(0)
gp = FXGroupBox.new(group3, "Group Box",
LAYOUT_SIDE_TOP|FRAME_GROOVE|LAYOUT_FILL_X, 0, 0, 0, 0)
FXRadioButton.new(gp, "Hilversum &1", gp_datatarget, FXDataTarget::ID_OPTION+0,
ICON_BEFORE_TEXT|LAYOUT_SIDE_TOP)
FXRadioButton.new(gp, "Hilversum &2", gp_datatarget, FXDataTarget::ID_OPTION+1,
ICON_BEFORE_TEXT|LAYOUT_SIDE_TOP)
FXRadioButton.new(gp, "One multi-line\nRadiobox Widget", gp_datatarget, FXDataTarget::ID_OPTION+2,
JUSTIFY_LEFT|JUSTIFY_TOP|ICON_BEFORE_TEXT|LAYOUT_SIDE_TOP)
FXRadioButton.new(gp, "Radio Stad Amsterdam", gp_datatarget, FXDataTarget::ID_OPTION+3,
ICON_BEFORE_TEXT|LAYOUT_SIDE_TOP)
vv = FXGroupBox.new(group3, "Group Box",
LAYOUT_SIDE_TOP|FRAME_GROOVE|LAYOUT_FILL_X, 0, 0, 0, 0)
FXCheckButton.new(vv, "Hilversum 1", nil, 0,
ICON_BEFORE_TEXT|LAYOUT_SIDE_TOP)
FXCheckButton.new(vv, "Hilversum 2", nil, 0,
ICON_BEFORE_TEXT|LAYOUT_SIDE_TOP)
FXCheckButton.new(vv, "One multi-line\nCheckbox Widget", nil, 0,
JUSTIFY_LEFT|JUSTIFY_TOP|ICON_BEFORE_TEXT|LAYOUT_SIDE_TOP)
FXCheckButton.new(vv, "Radio Stad Amsterdam", nil, 0,
ICON_BEFORE_TEXT|LAYOUT_SIDE_TOP)
spinner = FXSpinner.new(group3, 20, nil, 0,
SPIN_NORMAL|FRAME_SUNKEN|FRAME_THICK|LAYOUT_SIDE_TOP)
spinner.range = 1..20
combobox = FXComboBox.new(group3, 5, nil, 0,
COMBOBOX_INSERT_LAST|FRAME_SUNKEN|FRAME_THICK|LAYOUT_SIDE_TOP)
combobox.appendItem("Very Wide Item")
for i in 0...3
combobox.appendItem("%04d" % i)
end
treebox = FXTreeListBox.new(group3, nil, 0,
FRAME_SUNKEN|FRAME_THICK|LAYOUT_SIDE_TOP, 0, 0, 200, 0)
topmost = treebox.appendItem(nil, "Top", folder_open, folder_closed)
topmost2 = treebox.appendItem(nil, "Top2", folder_open, folder_closed)
treebox.appendItem(topmost2, "First", doc, doc)
treebox.appendItem(topmost, "First", doc, doc)
treebox.appendItem(topmost, "Second", doc, doc)
treebox.appendItem(topmost, "Third", doc, doc)
branch = treebox.appendItem(topmost, "Fourth", folder_open, folder_closed)
treebox.appendItem(branch, "Fourth-First", doc, doc)
treebox.appendItem(branch, "Fourth-Second", doc, doc)
twig = treebox.appendItem(branch, "Fourth-Third", folder_open, folder_closed)
treebox.appendItem(twig, "Fourth-Third-First", doc, doc)
treebox.appendItem(twig, "Fourth-Third-Second", doc, doc)
treebox.appendItem(twig, "Fourth-Third-Third", doc, doc)
leaf = treebox.appendItem(twig, "Fourth-Third-Fourth", folder_open, folder_closed)
treebox.appendItem(leaf, "Fourth-Third-Fourth-First", doc, doc)
treebox.appendItem(leaf, "Fourth-Third-Fourth-Second", doc, doc)
treebox.appendItem(leaf, "Fourth-Third-Fourth-Third", doc, doc)
twig = treebox.appendItem(branch, "Fourth-Fourth", folder_open, folder_closed)
treebox.appendItem(twig, "Fourth-Fourth-First", doc, doc)
treebox.appendItem(twig, "Fourth-Fourth-Second", doc, doc)
treebox.appendItem(twig, "Fourth-Fourth-Third", doc, doc)
FXLabel.new(group3, "H&it the hotkey", nil,
LAYOUT_CENTER_X|JUSTIFY_CENTER_X|FRAME_RAISED)
textfield1 = FXTextField.new(group3, 20, nil, 0,
JUSTIFY_RIGHT|FRAME_SUNKEN|FRAME_THICK|LAYOUT_SIDE_TOP)
textfield1.text = "Normal Text Field"
textfield2 = FXTextField.new(group3, 20, nil, 0,
JUSTIFY_RIGHT|TEXTFIELD_PASSWD|FRAME_SUNKEN|FRAME_THICK|LAYOUT_SIDE_TOP)
textfield2.text = "Password"
textfield3 = FXTextField.new(group3, 20, nil, 0,
TEXTFIELD_READONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_SIDE_TOP)
textfield3.text = "Read Only"
textfield4 = FXTextField.new(group3, 20, nil, 0,
TEXTFIELD_READONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_SIDE_TOP)
textfield4.text = "Grayed out"
textfield4.disable
realnumber = FXTextField.new(group3, 20, nil, 0,
TEXTFIELD_REAL|FRAME_SUNKEN|FRAME_THICK|LAYOUT_SIDE_TOP|LAYOUT_FIX_HEIGHT,
0, 0, 0, 30)
realnumber.text = "1.0E+3"
intnumber = FXTextField.new(group3, 20, nil, 0,
TEXTFIELD_INTEGER|FRAME_SUNKEN|FRAME_THICK|LAYOUT_SIDE_TOP|LAYOUT_FIX_HEIGHT,
0, 0, 0, 30)
intnumber.text = "1000"
dial2 = FXDial.new(group3, nil, 0, (DIAL_CYCLIC|DIAL_HAS_NOTCH|
DIAL_HORIZONTAL|LAYOUT_FILL_X|FRAME_RAISED|FRAME_THICK), 0, 0, 120, 0)
FXScrollBar.new(group3, nil, 0,
SCROLLBAR_HORIZONTAL|LAYOUT_FIX_HEIGHT|LAYOUT_FIX_WIDTH, 0, 0, 300, 20)
pbar = FXProgressBar.new(group3, nil, 0,
LAYOUT_FILL_X|FRAME_SUNKEN|FRAME_THICK|PROGRESSBAR_PERCENTAGE)
pbar.progress = 48
pbar.total = 360
pbar2 = FXProgressBar.new(group3, nil, 0, (LAYOUT_FILL_Y|FRAME_SUNKEN|
FRAME_THICK|PROGRESSBAR_VERTICAL|PROGRESSBAR_PERCENTAGE|LAYOUT_SIDE_LEFT))
pbar2.total = 360
dial1 = FXDial.new(group3, nil, 0, (DIAL_CYCLIC|DIAL_HAS_NOTCH|
DIAL_VERTICAL|FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_Y|LAYOUT_SIDE_LEFT))
pbar2.progress = 48
dial1.target = pbar2
dial1.selector = FXWindow::ID_SETVALUE
dial2.target = pbar
dial2.selector = FXWindow::ID_SETVALUE
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
# Currently selected choice from the radio buttons
@choice = 0
# File filter for file dialogs
@sourcefiles = "All Files (*)\n" +
"C++ Source Files (*.cpp,*.cxx,*.cc)\n" +
"C Source Files (*.c)\n" +
"C++ Header Files (*.hpp,*.hxx,*.hh,*.h)\n" +
"*.o\n" +
"Any Extension (*.*)\n" +
"Three Letter (*.???)\n" +
"README*"
end
# Set choice
def onCmdRadio(sender, sel, ptr)
@choice = FXSELID(sel)
return 1
end
# Update menu based on choice
def onUpdRadio(sender, sel, ptr)
sender.check = (FXSELID(sel) == @choice)
return 1
end
# Create the main window and show it
def create
super
show(PLACEMENT_SCREEN)
# Create a thread to update the clock
@clockThread = Thread.new(@clockLabel) do |clockLabel|
runOnUiThread do
clockLabel.text = Time.now.strftime("%I:%M:%S %p")
end
end
end
end
if __FILE__ == $0
# Make application
application = FXApp.new("Groupbox", "FoxTest")
# Make window
GroupWindow.new(application)
# Run
application.run
end