wxruby 1.9.0-i386-mswin32
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/wx/classes/app.rb +25 -0
- data/lib/wx/classes/artprovider.rb +31 -0
- data/lib/wx/classes/bitmap.rb +23 -0
- data/lib/wx/classes/choice.rb +4 -0
- data/lib/wx/classes/clientdc.rb +13 -0
- data/lib/wx/classes/colour.rb +47 -0
- data/lib/wx/classes/combobox.rb +4 -0
- data/lib/wx/classes/evthandler.rb +824 -0
- data/lib/wx/classes/font.rb +118 -0
- data/lib/wx/classes/grid.rb +130 -0
- data/lib/wx/classes/helpcontroller.rb +5 -0
- data/lib/wx/classes/htmlhelpcontroller.rb +5 -0
- data/lib/wx/classes/htmlwindow.rb +6 -0
- data/lib/wx/classes/icon.rb +14 -0
- data/lib/wx/classes/image.rb +14 -0
- data/lib/wx/classes/listbox.rb +4 -0
- data/lib/wx/classes/locale.rb +28 -0
- data/lib/wx/classes/object.rb +7 -0
- data/lib/wx/classes/paintdc.rb +12 -0
- data/lib/wx/classes/point.rb +5 -0
- data/lib/wx/classes/previewframe.rb +13 -0
- data/lib/wx/classes/rect.rb +5 -0
- data/lib/wx/classes/size.rb +5 -0
- data/lib/wx/classes/texturlevent.rb +6 -0
- data/lib/wx/classes/timer.rb +69 -0
- data/lib/wx/classes/window.rb +38 -0
- data/lib/wx/classes/xmlresource.rb +16 -0
- data/lib/wx/version.rb +3 -0
- data/lib/wx.rb +35 -0
- data/lib/wxruby2.so +0 -0
- data/samples/SAMPLES-LICENSE.TXT +18 -0
- data/samples/aui/aui.rb +1352 -0
- data/samples/bigdemo/About.rbw +39 -0
- data/samples/bigdemo/ColorPanel.rbw +25 -0
- data/samples/bigdemo/GridSimple.rbw +80 -0
- data/samples/bigdemo/MDIDemo.rbw +59 -0
- data/samples/bigdemo/PopupMenu.rbw +151 -0
- data/samples/bigdemo/ShapedWindow.rbw +135 -0
- data/samples/bigdemo/Sizers.rbw +545 -0
- data/samples/bigdemo/bigdemo.rb +826 -0
- data/samples/bigdemo/demoTemplate.rbw +37 -0
- data/samples/bigdemo/helpfile.htb +0 -0
- data/samples/bigdemo/icons/Test 015.jpg +0 -0
- data/samples/bigdemo/icons/Test 015.png +0 -0
- data/samples/bigdemo/icons/choice.bmp +0 -0
- data/samples/bigdemo/icons/choice.xpm +27 -0
- data/samples/bigdemo/icons/combo.bmp +0 -0
- data/samples/bigdemo/icons/combo.xpm +27 -0
- data/samples/bigdemo/icons/copy.xpm +25 -0
- data/samples/bigdemo/icons/cut.xpm +24 -0
- data/samples/bigdemo/icons/gauge.bmp +0 -0
- data/samples/bigdemo/icons/gauge.xpm +27 -0
- data/samples/bigdemo/icons/help.xpm +25 -0
- data/samples/bigdemo/icons/list.bmp +0 -0
- data/samples/bigdemo/icons/list.xpm +27 -0
- data/samples/bigdemo/icons/mondrian.ico +0 -0
- data/samples/bigdemo/icons/mondrian.xpm +44 -0
- data/samples/bigdemo/icons/new.xpm +24 -0
- data/samples/bigdemo/icons/ogl.ico +0 -0
- data/samples/bigdemo/icons/ogl.xpm +45 -0
- data/samples/bigdemo/icons/open.xpm +26 -0
- data/samples/bigdemo/icons/paste.bmp +0 -0
- data/samples/bigdemo/icons/paste.xpm +38 -0
- data/samples/bigdemo/icons/pointy.png +0 -0
- data/samples/bigdemo/icons/preview.xpm +26 -0
- data/samples/bigdemo/icons/print.xpm +26 -0
- data/samples/bigdemo/icons/radio.bmp +0 -0
- data/samples/bigdemo/icons/radio.xpm +27 -0
- data/samples/bigdemo/icons/robert.xpm +415 -0
- data/samples/bigdemo/icons/ruby.png +0 -0
- data/samples/bigdemo/icons/sashtest.ico +0 -0
- data/samples/bigdemo/icons/save.xpm +25 -0
- data/samples/bigdemo/icons/smiles.bmp +0 -0
- data/samples/bigdemo/icons/smiles.xpm +39 -0
- data/samples/bigdemo/icons/smiley.ico +0 -0
- data/samples/bigdemo/icons/smiley.xpm +42 -0
- data/samples/bigdemo/icons/stattext.xpm +24 -0
- data/samples/bigdemo/icons/test2.bmp +0 -0
- data/samples/bigdemo/icons/test2.png +0 -0
- data/samples/bigdemo/icons/test2.xpm +79 -0
- data/samples/bigdemo/icons/text.bmp +0 -0
- data/samples/bigdemo/icons/text.xpm +27 -0
- data/samples/bigdemo/icons/tog1.bmp +0 -0
- data/samples/bigdemo/icons/tog1.xpm +38 -0
- data/samples/bigdemo/icons/tog2.bmp +0 -0
- data/samples/bigdemo/icons/tog2.xpm +38 -0
- data/samples/bigdemo/icons/wxwin.ico +0 -0
- data/samples/bigdemo/icons/wxwin16x16.png +0 -0
- data/samples/bigdemo/icons/wxwin16x16.xpm +25 -0
- data/samples/bigdemo/icons/wxwin32x32.png +0 -0
- data/samples/bigdemo/icons/wxwin48x48.png +0 -0
- data/samples/bigdemo/run.rb +94 -0
- data/samples/bigdemo/tips.txt +7 -0
- data/samples/bigdemo/utils.rb +12 -0
- data/samples/bigdemo/wxArtProvider.rbw +285 -0
- data/samples/bigdemo/wxBitmapButton.rbw +64 -0
- data/samples/bigdemo/wxButton.rbw +66 -0
- data/samples/bigdemo/wxCalendarCtrl.rbw +72 -0
- data/samples/bigdemo/wxCheckBox.rbw +52 -0
- data/samples/bigdemo/wxCheckListBox.rbw +77 -0
- data/samples/bigdemo/wxChoice.rbw +49 -0
- data/samples/bigdemo/wxChoicebook.rbw +80 -0
- data/samples/bigdemo/wxColourDialog.rbw +34 -0
- data/samples/bigdemo/wxComboBox.rbw +79 -0
- data/samples/bigdemo/wxCursor.rbw +140 -0
- data/samples/bigdemo/wxDialog.rbw +92 -0
- data/samples/bigdemo/wxDirDialog.rbw +32 -0
- data/samples/bigdemo/wxDragImage.rbw +74 -0
- data/samples/bigdemo/wxFileDialog.rbw +39 -0
- data/samples/bigdemo/wxFileDialog_Save.rbw +38 -0
- data/samples/bigdemo/wxFindReplaceDialog.rbw +85 -0
- data/samples/bigdemo/wxFontDialog.rbw +176 -0
- data/samples/bigdemo/wxFrame.rbw +55 -0
- data/samples/bigdemo/wxGauge.rbw +73 -0
- data/samples/bigdemo/wxGenericDirCtrl.rbw +78 -0
- data/samples/bigdemo/wxGrid.rbw +68 -0
- data/samples/bigdemo/wxHtmlHelpController.rbw +57 -0
- data/samples/bigdemo/wxListBox.rbw +142 -0
- data/samples/bigdemo/wxListCtrl_virtual.rbw +109 -0
- data/samples/bigdemo/wxMDIWindows.rbw +52 -0
- data/samples/bigdemo/wxMenu.rbw +238 -0
- data/samples/bigdemo/wxMessageDialog.rbw +30 -0
- data/samples/bigdemo/wxMiniFrame.rbw +74 -0
- data/samples/bigdemo/wxMultipleChoiceDialog.rbw +34 -0
- data/samples/bigdemo/wxNotebook.rbw +138 -0
- data/samples/bigdemo/wxProgressDialog.rbw +45 -0
- data/samples/bigdemo/wxRadioBox.rbw +74 -0
- data/samples/bigdemo/wxRadioButton.rbw +127 -0
- data/samples/bigdemo/wxSashWindow.rbw +155 -0
- data/samples/bigdemo/wxScrolledMessageDialog.rbw +59 -0
- data/samples/bigdemo/wxScrolledWindow.rbw +196 -0
- data/samples/bigdemo/wxSingleChoiceDialog.rbw +35 -0
- data/samples/bigdemo/wxSlider.rbw +44 -0
- data/samples/bigdemo/wxSpinButton.rbw +52 -0
- data/samples/bigdemo/wxSpinCtrl.rbw +53 -0
- data/samples/bigdemo/wxSplitterWindow.rbw +65 -0
- data/samples/bigdemo/wxStaticBitmap.rbw +53 -0
- data/samples/bigdemo/wxStaticText.rbw +57 -0
- data/samples/bigdemo/wxStatusBar.rbw +128 -0
- data/samples/bigdemo/wxTextCtrl.rbw +151 -0
- data/samples/bigdemo/wxTextEntryDialog.rbw +34 -0
- data/samples/bigdemo/wxToggleButton.rbw +51 -0
- data/samples/bigdemo/wxToolBar.rbw +133 -0
- data/samples/bigdemo/wxTreeCtrl.rbw +192 -0
- data/samples/calendar/calendar.rb +275 -0
- data/samples/caret/caret.rb +296 -0
- data/samples/caret/mondrian.xpm +44 -0
- data/samples/controls/controls.rb +1140 -0
- data/samples/controls/get_item_sample.rb +87 -0
- data/samples/controls/icons/choice.xpm +27 -0
- data/samples/controls/icons/combo.xpm +27 -0
- data/samples/controls/icons/gauge.xpm +27 -0
- data/samples/controls/icons/list.xpm +27 -0
- data/samples/controls/icons/radio.xpm +27 -0
- data/samples/controls/icons/stattext.xpm +24 -0
- data/samples/controls/icons/text.xpm +27 -0
- data/samples/controls/mondrian.ico +0 -0
- data/samples/controls/mondrian.xpm +44 -0
- data/samples/controls/test2.bmp +0 -0
- data/samples/dialogs/dialogs.rb +724 -0
- data/samples/dialogs/tips.txt +18 -0
- data/samples/etc/activation.rb +108 -0
- data/samples/etc/choice.rb +72 -0
- data/samples/etc/miniframe.rb +84 -0
- data/samples/etc/sash.rb +135 -0
- data/samples/etc/scrollwin.rb +116 -0
- data/samples/etc/system_settings.rb +258 -0
- data/samples/etc/wizard.rb +81 -0
- data/samples/grid/grid.rb +201 -0
- data/samples/html/html.rb +251 -0
- data/samples/images/Thumbs.db +0 -0
- data/samples/images/images.rb +48 -0
- data/samples/images/paperclip.png +0 -0
- data/samples/listbook/listbook.rb +183 -0
- data/samples/listbook/listbook.xrc +370 -0
- data/samples/mdi/mdi.rb +87 -0
- data/samples/minimal/minimal.rb +95 -0
- data/samples/minimal/mondrian.ico +0 -0
- data/samples/minimal/mondrian.xpm +44 -0
- data/samples/minimal/nothing.rb +46 -0
- data/samples/minimal/text.rb +35 -0
- data/samples/printing/mondrian.ico +0 -0
- data/samples/printing/mondrian.xpm +44 -0
- data/samples/printing/printing.rb +484 -0
- data/samples/text/mondrian.ico +0 -0
- data/samples/text/mondrian.xpm +44 -0
- data/samples/text/scintilla.rb +180 -0
- data/samples/text/textctrl.rb +124 -0
- data/samples/text/unicode.rb +238 -0
- data/samples/text/utf8.txt +15 -0
- data/samples/treectrl/icon1.xpm +79 -0
- data/samples/treectrl/icon2.xpm +53 -0
- data/samples/treectrl/icon3.xpm +79 -0
- data/samples/treectrl/icon4.xpm +43 -0
- data/samples/treectrl/icon5.xpm +79 -0
- data/samples/treectrl/treectrl.rb +1210 -0
- data/samples/xrc/samples.xrc +46 -0
- data/samples/xrc/xrc_sample.rb +107 -0
- metadata +263 -0
@@ -0,0 +1,45 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'wx'
|
5
|
+
rescue LoadError => no_wx_err
|
6
|
+
begin
|
7
|
+
require 'rubygems'
|
8
|
+
require 'wx'
|
9
|
+
rescue LoadError
|
10
|
+
raise no_wx_err
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
module Demo
|
15
|
+
def Demo.run(frame, nb, log)
|
16
|
+
max = 20
|
17
|
+
dlg = Wx::ProgressDialog.new("Progress dialog example", "An informative message", max, frame,
|
18
|
+
Wx::PD_CAN_ABORT | Wx::PD_APP_MODAL)
|
19
|
+
|
20
|
+
keepGoing = true
|
21
|
+
count = 0
|
22
|
+
while keepGoing and count < max
|
23
|
+
count += 1
|
24
|
+
sleep(1)
|
25
|
+
|
26
|
+
if count == max / 2
|
27
|
+
keepGoing = dlg.update(count, "Half-time!")
|
28
|
+
else
|
29
|
+
keepGoing = dlg.update(count)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
dlg.destroy()
|
33
|
+
return nil
|
34
|
+
end
|
35
|
+
|
36
|
+
def Demo.overview
|
37
|
+
return "A dialog that shows the progress of an operation"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
if __FILE__ == $0
|
42
|
+
run_solo_lib = File.join( File.dirname(__FILE__), 'run.rb')
|
43
|
+
load run_solo_lib
|
44
|
+
run File.basename($0)
|
45
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'wx'
|
5
|
+
rescue LoadError => no_wx_err
|
6
|
+
begin
|
7
|
+
require 'rubygems'
|
8
|
+
require 'wx'
|
9
|
+
rescue LoadError
|
10
|
+
raise no_wx_err
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
$RBUT1 = 5000
|
15
|
+
$RBUT2 = 5001
|
16
|
+
$RBUT3 = 5002
|
17
|
+
$RBUT4 = 5003
|
18
|
+
|
19
|
+
$RBOX1 = 5004
|
20
|
+
$RBOX2 = 5005
|
21
|
+
|
22
|
+
class TestRadioButtons < Wx::Panel
|
23
|
+
def initialize(parent, log)
|
24
|
+
@log = log
|
25
|
+
super(parent, -1)
|
26
|
+
|
27
|
+
sampleList = %w(zero one two three four five six seven eight)
|
28
|
+
|
29
|
+
sizer = Wx::BoxSizer.new(Wx::VERTICAL)
|
30
|
+
# Here is a strange thing - when I originally created this demo, I used the WxRuby constant Wx::DEFAULT_SIZE in the two
|
31
|
+
# radiobox constructors (on Windows XP Prof). When I did this, the "box" around the radio buttons would resize in a
|
32
|
+
# groesque fashion (either when I clicked on another demo first, or on the second time that I ran the demo. But when I
|
33
|
+
# used Wx::Size.new(-1,-1), this behavior disappeared. If anyone figures this out, please post it to the list :)
|
34
|
+
rb = Wx::RadioBox.new(self, $RBOX1, "Wx::RadioBox", Wx::DEFAULT_POSITION, Wx::Size.new(-1,-1), sampleList, 2, Wx::RA_SPECIFY_COLS)
|
35
|
+
evt_radiobox($RBOX1) {|event| on_evt_radiobox(event)}
|
36
|
+
rb.set_tool_tip(Wx::ToolTip.new("This is a tooltip!"))
|
37
|
+
sizer.add(rb, 0, Wx::ALL, 20)
|
38
|
+
|
39
|
+
rb = Wx::RadioBox.new(self, $RBOX2, "", Wx::DEFAULT_POSITION, Wx::Size.new(-1,-1), sampleList, 3, Wx::RA_SPECIFY_COLS | Wx::NO_BORDER)
|
40
|
+
evt_radiobox($RBOX2) {|event| on_evt_radiobox(event)}
|
41
|
+
rb.set_tool_tip(Wx::ToolTip.new("This box has no label"))
|
42
|
+
sizer.add(rb, 0, Wx::ALL, 20)
|
43
|
+
|
44
|
+
set_sizer(sizer)
|
45
|
+
sizer.fit(self)
|
46
|
+
sizer.layout()
|
47
|
+
end
|
48
|
+
|
49
|
+
def on_evt_radiobox(event)
|
50
|
+
@log.write_text("evt_radiobox: " + event.get_int().to_s())
|
51
|
+
end
|
52
|
+
|
53
|
+
def on_evt_radio_button(event)
|
54
|
+
@log.write_text("evt_radiobutton: " + event.get_id().to_s())
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
module Demo
|
59
|
+
def Demo.run(frame,nb,log)
|
60
|
+
win = TestRadioButtons.new(nb, log)
|
61
|
+
return win
|
62
|
+
end
|
63
|
+
|
64
|
+
def Demo.overview
|
65
|
+
"A radio box item is used to select one of number of mutually exclusive choices. It is displayed as a vertical column or horizontal row of labelled buttons."
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
if __FILE__ == $0
|
71
|
+
run_solo_lib = File.join( File.dirname(__FILE__), 'run.rb')
|
72
|
+
load run_solo_lib
|
73
|
+
run File.basename($0)
|
74
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'wx'
|
5
|
+
rescue LoadError => no_wx_err
|
6
|
+
begin
|
7
|
+
require 'rubygems'
|
8
|
+
require 'wx'
|
9
|
+
rescue LoadError
|
10
|
+
raise no_wx_err
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class TestPanel < Wx::Panel
|
15
|
+
def initialize(parent, log)
|
16
|
+
super(parent, -1)
|
17
|
+
@log = log
|
18
|
+
panel = Wx::Panel.new(self, -1)
|
19
|
+
|
20
|
+
# 1st group of controls
|
21
|
+
@group1_ctrls = {}
|
22
|
+
radio1 = Wx::RadioButton.new(panel, -1, "Radio1", Wx::DEFAULT_POSITION, Wx::DEFAULT_SIZE, Wx::RB_GROUP)
|
23
|
+
text1 = Wx::TextCtrl.new(panel, -1, "")
|
24
|
+
radio2 = Wx::RadioButton.new(panel, -1, "Radio2")
|
25
|
+
text2 = Wx::TextCtrl.new(panel, -1, "")
|
26
|
+
radio3 = Wx::RadioButton.new(panel, -1, "Radio3")
|
27
|
+
text3 = Wx::TextCtrl.new(panel, -1, "")
|
28
|
+
@group1_ctrls["one"] = [radio1, text1]
|
29
|
+
@group1_ctrls["two"] = [radio2, text2]
|
30
|
+
@group1_ctrls["three"] = [radio3, text3]
|
31
|
+
|
32
|
+
# 2nd group of controls
|
33
|
+
#@group2_ctrls = {}
|
34
|
+
#radio4 = Wx::RadioButton.new(panel, -1, "Radio1", Wx::DEFAULT_POSITION, Wx::DEFAULT_SIZE, Wx::RB_GROUP)
|
35
|
+
#text4 = Wx::TextCtrl.new(panel, -1, "")
|
36
|
+
#radio5 = Wx::RadioButton.new(panel, -1, "Radio2")
|
37
|
+
#text5 = Wx::TextCtrl.new(panel, -1, "")
|
38
|
+
#radio6 = Wx::RadioButton.new(panel, -1, "Radio3")
|
39
|
+
#text6 = Wx::TextCtrl.new(panel, -1, "")
|
40
|
+
#@group2_ctrls["one"] = [radio4, text4]
|
41
|
+
#@group2_ctrls["two"] = [radio5, text5]
|
42
|
+
#@group2_ctrls["three"] = [radio6, text6]
|
43
|
+
|
44
|
+
# Layout controls on panel
|
45
|
+
vs = Wx::BoxSizer.new(Wx::VERTICAL)
|
46
|
+
|
47
|
+
box1_title = Wx::StaticBox.new(panel, -1, "Group 1", Wx::DEFAULT_POSITION, Wx::Size.new(-1,-1))
|
48
|
+
box1 = Wx::StaticBoxSizer.new(box1_title, Wx::HORIZONTAL)
|
49
|
+
grid1 = Wx::FlexGridSizer.new(0,2,0,0)
|
50
|
+
|
51
|
+
@group1_ctrls.each_value do |ctrl|
|
52
|
+
grid1.add(ctrl[0], 0, Wx::ALIGN_CENTER, 5)
|
53
|
+
grid1.add(ctrl[1], 0, Wx::ALIGN_CENTER, 5)
|
54
|
+
end
|
55
|
+
box1.add(grid1, 0, Wx::ALIGN_CENTER | Wx::ALL, 5)
|
56
|
+
vs.add(box1, 0, Wx::ALL, 5)
|
57
|
+
|
58
|
+
#box2_title = Wx::StaticBox.new(panel, -1, "Group 2")
|
59
|
+
#box2 = Wx::StaticBoxSizer.new(box2_title, Wx::HORIZONTAL)
|
60
|
+
#grid2 = Wx::FlexGridSizer.new(0,2,0,0)
|
61
|
+
|
62
|
+
#@group2_ctrls.each_value do |ctrl|
|
63
|
+
#grid2.add(ctrl[0], 0, Wx::ALIGN_CENTER, 5)
|
64
|
+
#grid2.add(ctrl[1], 0, Wx::ALIGN_CENTER, 5)
|
65
|
+
#end
|
66
|
+
#box2.add(grid2, 0, Wx::ALIGN_CENTER | Wx::ALL, 5)
|
67
|
+
#vs.add(box2, 0, Wx::ALIGN_CENTER | Wx::ALL, 5)
|
68
|
+
|
69
|
+
panel.set_sizer(vs)
|
70
|
+
vs.fit(panel)
|
71
|
+
|
72
|
+
panel.move(Wx::Point.new(50,50))
|
73
|
+
@panel = panel
|
74
|
+
|
75
|
+
@group1_ctrls.each_value do |ctrl|
|
76
|
+
evt_radiobutton(ctrl[0].get_id()) {|event| on_group1_select(event)}
|
77
|
+
ctrl[0].set_value(0)
|
78
|
+
ctrl[1].enable(false)
|
79
|
+
end
|
80
|
+
#@group2_ctrls.each_value do |ctrl|
|
81
|
+
# evt_radiobutton(ctrl[0].get_id()) {|event| on_group2_select(event)}
|
82
|
+
# ctrl[0].set_value(0)
|
83
|
+
# ctrl[1].enable(false)
|
84
|
+
#end
|
85
|
+
end
|
86
|
+
|
87
|
+
def on_group1_select(event)
|
88
|
+
@group1_ctrls.each_value do |ctrl|
|
89
|
+
if ctrl[0].get_value() == true
|
90
|
+
ctrl[1].enable(true)
|
91
|
+
@log.write_text("Group 1 " + ctrl[0].get_label() + " selected")
|
92
|
+
else
|
93
|
+
ctrl[1].enable(false)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def on_group2_select(event)
|
99
|
+
@group2_ctrls.each_value do |ctrl|
|
100
|
+
if ctrl[0].get_value() == true
|
101
|
+
ctrl[1].enable(true)
|
102
|
+
@log.write_text("Group 2 " + ctrl[0].get_label() + " selected")
|
103
|
+
else
|
104
|
+
ctrl[1].enable(false)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
module Demo
|
111
|
+
def Demo.run(frame,nb,log)
|
112
|
+
win = TestPanel.new(nb, log)
|
113
|
+
return win
|
114
|
+
end
|
115
|
+
|
116
|
+
def Demo.overview
|
117
|
+
"This demo shows how individual radio buttons can be used to build more complicated selection mechanisms...\n" +
|
118
|
+
"It uses 2 groups of wxRadioButtons, where the groups are defined by instantiation. When a wxRadioButton is created with the Wx::RB_GROUP style, all subsequent wxRadioButtons created without it are implicitly added to that group by the framework."
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
|
123
|
+
if __FILE__ == $0
|
124
|
+
run_solo_lib = File.join( File.dirname(__FILE__), 'run.rb')
|
125
|
+
load run_solo_lib
|
126
|
+
run File.basename($0)
|
127
|
+
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# wxRuby2 Sample Code. Copyright (c) 2004-2006 Kevin B. Smith
|
3
|
+
# Freely reusable code: see SAMPLES-LICENSE.TXT for details
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'wx'
|
7
|
+
rescue LoadError => no_wx_err
|
8
|
+
begin
|
9
|
+
require 'rubygems'
|
10
|
+
require 'wx'
|
11
|
+
rescue LoadError
|
12
|
+
raise no_wx_err
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class TestPanel < Wx::Panel
|
17
|
+
def initialize(parent, log)
|
18
|
+
super(parent, -1, Wx::DEFAULT_POSITION, Wx::DEFAULT_SIZE, Wx::NO_FULL_REPAINT_ON_RESIZE)
|
19
|
+
@log = log
|
20
|
+
|
21
|
+
winids = []
|
22
|
+
|
23
|
+
# Create some layout windows
|
24
|
+
# A window like a toolbar
|
25
|
+
@topwin = Wx::SashLayoutWindow.new(
|
26
|
+
self, -1, Wx::DEFAULT_POSITION, Wx::Size.new(200, 30),
|
27
|
+
Wx::NO_BORDER|Wx::SW_3D
|
28
|
+
)
|
29
|
+
|
30
|
+
@topwin.set_default_size(Wx::Size.new(1000, 30))
|
31
|
+
@topwin.set_orientation(Wx::LAYOUT_HORIZONTAL)
|
32
|
+
@topwin.set_alignment(Wx::LAYOUT_TOP)
|
33
|
+
@topwin.set_background_colour(Wx::Colour.new(255, 0, 0))
|
34
|
+
@topwin.set_sash_visible(Wx::SASH_BOTTOM, true)
|
35
|
+
|
36
|
+
winids << @topwin.get_id
|
37
|
+
|
38
|
+
# A window like a statusbar
|
39
|
+
@bottomwin = Wx::SashLayoutWindow.new(
|
40
|
+
self, -1, Wx::DEFAULT_POSITION, Wx::Size.new(200, 30),
|
41
|
+
Wx::NO_BORDER|Wx::SW_3D
|
42
|
+
)
|
43
|
+
|
44
|
+
@bottomwin.set_default_size(Wx::Size.new(1000, 30))
|
45
|
+
@bottomwin.set_orientation(Wx::LAYOUT_HORIZONTAL)
|
46
|
+
@bottomwin.set_alignment(Wx::LAYOUT_BOTTOM)
|
47
|
+
@bottomwin.set_background_colour(Wx::Colour.new(0, 0, 255))
|
48
|
+
@bottomwin.set_sash_visible(Wx::SASH_TOP, true)
|
49
|
+
|
50
|
+
winids << @bottomwin.get_id
|
51
|
+
|
52
|
+
# A window to the left of the client window
|
53
|
+
@leftwin1 = Wx::SashLayoutWindow.new(
|
54
|
+
self, -1, Wx::DEFAULT_POSITION, Wx::Size.new(200, 30),
|
55
|
+
Wx::NO_BORDER|Wx::SW_3D
|
56
|
+
)
|
57
|
+
|
58
|
+
@leftwin1.set_default_size(Wx::Size.new(120, 1000))
|
59
|
+
@leftwin1.set_orientation(Wx::LAYOUT_VERTICAL)
|
60
|
+
@leftwin1.set_alignment(Wx::LAYOUT_LEFT)
|
61
|
+
@leftwin1.set_background_colour(Wx::Colour.new(0, 255, 0))
|
62
|
+
@leftwin1.set_sash_visible(Wx::SASH_RIGHT, true)
|
63
|
+
@leftwin1.set_extra_border_size(10)
|
64
|
+
text_window = Wx::TextCtrl.new(
|
65
|
+
@leftwin1, -1, "", Wx::DEFAULT_POSITION, Wx::DEFAULT_SIZE,
|
66
|
+
Wx::TE_MULTILINE|Wx::SUNKEN_BORDER
|
67
|
+
)
|
68
|
+
|
69
|
+
text_window.set_value("A sub window")
|
70
|
+
|
71
|
+
winids << @leftwin1.get_id
|
72
|
+
|
73
|
+
# Another window to the left of the client window
|
74
|
+
@leftwin2 = Wx::SashLayoutWindow.new(
|
75
|
+
self, -1, Wx::DEFAULT_POSITION, Wx::Size.new(200, 30),
|
76
|
+
Wx::NO_BORDER|Wx::SW_3D
|
77
|
+
)
|
78
|
+
|
79
|
+
@leftwin2.set_default_size(Wx::Size.new(120, 1000))
|
80
|
+
@leftwin2.set_orientation(Wx::LAYOUT_VERTICAL)
|
81
|
+
@leftwin2.set_alignment(Wx::LAYOUT_LEFT)
|
82
|
+
@leftwin2.set_background_colour(Wx::Colour.new(0, 255, 255))
|
83
|
+
@leftwin2.set_sash_visible(Wx::SASH_RIGHT, true)
|
84
|
+
|
85
|
+
winids << @leftwin2.get_id
|
86
|
+
|
87
|
+
# will occupy the space not used by the Layout Algorithm
|
88
|
+
@remaining_space = Wx::Panel.new(self, -1, Wx::DEFAULT_POSITION, Wx::DEFAULT_SIZE, Wx::SUNKEN_BORDER)
|
89
|
+
|
90
|
+
evt_sash_dragged_range(winids.min, winids.max) {|event| on_sash_drag(event) }
|
91
|
+
evt_size {|event| on_size(event) }
|
92
|
+
end
|
93
|
+
|
94
|
+
|
95
|
+
def on_sash_drag(event)
|
96
|
+
if event.get_drag_status == Wx::SASH_STATUS_OUT_OF_RANGE:
|
97
|
+
@log.write_text('drag == out of range')
|
98
|
+
return
|
99
|
+
end
|
100
|
+
|
101
|
+
eobj = event.get_event_object
|
102
|
+
if eobj == @topwin
|
103
|
+
@log.write_text('topwin received drag event')
|
104
|
+
@topwin.set_default_size(Wx::Size.new(1000, event.get_drag_rect.height))
|
105
|
+
|
106
|
+
elsif eobj == @leftwin1
|
107
|
+
@log.write_text('leftwin1 received drag event')
|
108
|
+
@leftwin1.set_default_size(Wx::Size.new(event.get_drag_rect.width, 1000))
|
109
|
+
|
110
|
+
|
111
|
+
elsif eobj == @leftwin2
|
112
|
+
@log.write_text('leftwin2 received drag event')
|
113
|
+
@leftwin2.set_default_size(Wx::Size.new(event.get_drag_rect.width, 1000))
|
114
|
+
|
115
|
+
elsif eobj == @bottomwin
|
116
|
+
@log.write_text('bottomwin received drag event')
|
117
|
+
@bottomwin.set_default_size(Wx::Size.new(1000, event.get_drag_rect.height))
|
118
|
+
end
|
119
|
+
|
120
|
+
Wx::LayoutAlgorithm.new.layout_window(self, @remaining_space)
|
121
|
+
@remaining_space.refresh
|
122
|
+
end
|
123
|
+
|
124
|
+
def on_size(event)
|
125
|
+
Wx::LayoutAlgorithm.new.layout_window(self, @remaining_space)
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
129
|
+
|
130
|
+
module Demo
|
131
|
+
|
132
|
+
def Demo.run(frame, nb, log)
|
133
|
+
TestPanel.new(nb, log)
|
134
|
+
end
|
135
|
+
|
136
|
+
def Demo.overview
|
137
|
+
return <<EOS
|
138
|
+
Wx::SashLayoutWindow responds to OnCalculateLayout events generated by
|
139
|
+
wxLayoutAlgorithm. It allows the application to use simple accessors to
|
140
|
+
specify how the window should be laid out, rather than having to respond
|
141
|
+
to events. The fact that the class derives from Wx::SashWindow allows sashes
|
142
|
+
to be used if required, to allow the windows to be user-resizable.
|
143
|
+
|
144
|
+
The documentation for Wx::LayoutAlgorithm explains the purpose of this class
|
145
|
+
in more detail.
|
146
|
+
EOS
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
150
|
+
|
151
|
+
if __FILE__ == $0
|
152
|
+
run_solo_lib = File.join( File.dirname(__FILE__), 'run.rb')
|
153
|
+
load run_solo_lib
|
154
|
+
run File.basename($0)
|
155
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'wx'
|
5
|
+
rescue LoadError => no_wx_err
|
6
|
+
begin
|
7
|
+
require 'rubygems'
|
8
|
+
require 'wx'
|
9
|
+
rescue LoadError
|
10
|
+
raise no_wx_err
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class ScrolledMessageDialog < Wx::Dialog
|
15
|
+
def initialize(parent, msg, caption,
|
16
|
+
pos = Wx::DEFAULT_POSITION,
|
17
|
+
size = Wx::Size.new(500,300) )
|
18
|
+
super(parent, -1, caption, pos, size)
|
19
|
+
x,y = pos.x, pos.y
|
20
|
+
if x == -1 and y == -1
|
21
|
+
center_on_screen(Wx::BOTH)
|
22
|
+
end
|
23
|
+
sizer = Wx::BoxSizer.new(Wx::VERTICAL)
|
24
|
+
text = Wx::TextCtrl.new(self, -1, msg,
|
25
|
+
Wx::DEFAULT_POSITION, Wx::DEFAULT_SIZE,
|
26
|
+
Wx::TE_MULTILINE|Wx::TE_READONLY)
|
27
|
+
|
28
|
+
sizer.add(text, 1, Wx::EXPAND|Wx::ALL, 5)
|
29
|
+
|
30
|
+
button_sizer = Wx::StdDialogButtonSizer.new
|
31
|
+
button_sizer.add_button( Wx::Button.new(self, Wx::ID_OK, "OK") )
|
32
|
+
button_sizer.realize
|
33
|
+
|
34
|
+
sizer.add(button_sizer, 0, Wx::EXPAND|Wx::ALL, 5)
|
35
|
+
|
36
|
+
set_sizer(sizer)
|
37
|
+
layout
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
module Demo
|
42
|
+
def Demo.run(frame, nb, log)
|
43
|
+
f = open(__FILE__, "r")
|
44
|
+
msg = f.read()
|
45
|
+
dlg = ScrolledMessageDialog.new(frame, msg, "message test")
|
46
|
+
dlg.show_modal()
|
47
|
+
end
|
48
|
+
|
49
|
+
def Demo.overview
|
50
|
+
return "A simple ruby example of a custom dialog displaying a " +
|
51
|
+
"long message in a scrolled TextCtrl"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
if __FILE__ == $0
|
56
|
+
run_solo_lib = File.join( File.dirname(__FILE__), 'run.rb')
|
57
|
+
load run_solo_lib
|
58
|
+
run File.basename($0)
|
59
|
+
end
|
@@ -0,0 +1,196 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'wx'
|
5
|
+
rescue LoadError => no_wx_err
|
6
|
+
begin
|
7
|
+
require 'rubygems'
|
8
|
+
require 'wx'
|
9
|
+
rescue LoadError
|
10
|
+
raise no_wx_err
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
#$BUFFERED = 0 #Wx::BufferedDC not yet implemented
|
15
|
+
|
16
|
+
class MyCanvas < Wx::ScrolledWindow
|
17
|
+
def initialize(parent, id=-1, size=Wx::DEFAULT_SIZE)
|
18
|
+
super(parent, -1, Wx::Point.new(0,0), size, Wx::SUNKEN_BORDER)
|
19
|
+
@lines = []
|
20
|
+
@maxWidth = 1000
|
21
|
+
@maxHeight = 1000
|
22
|
+
@x = @y = 0
|
23
|
+
@curLine = []
|
24
|
+
@drawing = false
|
25
|
+
|
26
|
+
set_background_colour(Wx::WHITE)
|
27
|
+
|
28
|
+
set_cursor(Wx::Cursor.new(Wx::CURSOR_PENCIL))
|
29
|
+
bmp_file = File.join(File.dirname(__FILE__), 'icons', 'test2.xpm')
|
30
|
+
@bmp = Wx::Bitmap.new(bmp_file)
|
31
|
+
|
32
|
+
|
33
|
+
set_scrollbars(20, 20, @maxWidth / 20, @maxHeight / 20, 0, 0, true)
|
34
|
+
|
35
|
+
evt_left_down {|event| on_left_button_event_down(event)}
|
36
|
+
evt_left_up {|event| on_left_button_event_up(event)}
|
37
|
+
evt_motion {|event| on_left_button_event_motion(event)}
|
38
|
+
evt_paint { on_paint }
|
39
|
+
#evt_mousewheel {|event| on_wheel(event)}
|
40
|
+
end
|
41
|
+
|
42
|
+
def on_paint
|
43
|
+
paint { | dc | do_drawing(dc) }
|
44
|
+
end
|
45
|
+
|
46
|
+
def do_drawing(dc, printing=false)
|
47
|
+
# Reset the origin co-ordinates of the DC to reflect current scrolling
|
48
|
+
do_prepare_dc(dc)
|
49
|
+
dc.set_pen(Wx::Pen.new("RED", 1, Wx::SOLID))
|
50
|
+
dc.draw_rectangle(5,5,50,50)
|
51
|
+
|
52
|
+
dc.set_brush(Wx::LIGHT_GREY_BRUSH)
|
53
|
+
dc.set_pen(Wx::Pen.new("BLUE", 4, Wx::SOLID))
|
54
|
+
dc.draw_rectangle(15,15,50,50)
|
55
|
+
|
56
|
+
dc.set_font(Wx::Font.new(14, Wx::SWISS, Wx::NORMAL, Wx::NORMAL))
|
57
|
+
dc.set_text_foreground(Wx::Colour.new(0xFF, 0x20, 0xFF))
|
58
|
+
te = dc.get_text_extent("Hello World")
|
59
|
+
dc.draw_text("Hello World", 60, 65)
|
60
|
+
|
61
|
+
dc.set_pen(Wx::Pen.new("VIOLET", 4, Wx::SOLID))
|
62
|
+
dc.draw_line(5, 65+te[1], 60 + te[0], 65 + te[1])
|
63
|
+
|
64
|
+
lst = [Wx::Point.new(100,110), Wx::Point.new(150, 110), Wx::Point.new(150, 160), Wx::Point.new(100, 160)]
|
65
|
+
dc.draw_lines(lst, -60)
|
66
|
+
dc.set_pen(Wx::GREY_PEN)
|
67
|
+
dc.draw_polygon(lst, 75)
|
68
|
+
dc.set_pen(Wx::GREEN_PEN)
|
69
|
+
dc.draw_spline(lst << Wx::Point.new(100,100))
|
70
|
+
|
71
|
+
dc.draw_bitmap(@bmp, 200, 20, true)
|
72
|
+
dc.set_text_foreground(Wx::Colour.new(0, 0xFF, 0x80))
|
73
|
+
dc.draw_text("a bitmap", 200,85)
|
74
|
+
|
75
|
+
font = Wx::Font.new(14, Wx::SWISS, Wx::NORMAL, Wx::NORMAL)
|
76
|
+
dc.set_font(font)
|
77
|
+
dc.set_text_foreground(Wx::BLACK)
|
78
|
+
0.step(360, 45) {|number| dc.draw_rotated_text("Rotated text...", 300, 300, number)}
|
79
|
+
|
80
|
+
dc.set_pen(Wx::TRANSPARENT_PEN)
|
81
|
+
dc.set_brush(Wx::BLUE_BRUSH)
|
82
|
+
dc.draw_rectangle(50, 500, 50, 50)
|
83
|
+
dc.draw_rectangle(100, 500, 50, 50)
|
84
|
+
|
85
|
+
dc.set_pen(Wx::Pen.new("RED", 1, Wx::SOLID))
|
86
|
+
dc.draw_elliptic_arc(200, 500, 50, 75, 0, 90)
|
87
|
+
|
88
|
+
if not printing
|
89
|
+
# This has troubles when used on a print preview in wxGTK,
|
90
|
+
# probably something to do with the pen styles and the scaling
|
91
|
+
# it does...
|
92
|
+
y = 20
|
93
|
+
[Wx::DOT, Wx::LONG_DASH, Wx::SHORT_DASH, Wx::DOT_DASH, Wx::USER_DASH].each do |style|
|
94
|
+
pen = Wx::Pen.new("DARK ORCHID", 1, style)
|
95
|
+
if style == Wx::USER_DASH
|
96
|
+
pen.set_cap(Wx::CAP_BUTT)
|
97
|
+
pen.set_dashes([1,2])
|
98
|
+
pen.set_colour("RED")
|
99
|
+
end
|
100
|
+
dc.set_pen(pen)
|
101
|
+
dc.draw_line(300, y, 400, y)
|
102
|
+
y += 10
|
103
|
+
end
|
104
|
+
end
|
105
|
+
dc.set_brush(Wx::TRANSPARENT_BRUSH)
|
106
|
+
dc.set_pen(Wx::Pen.new(Wx::Colour.new(0xFF, 0x20, 0xFF), 1, Wx::SOLID))
|
107
|
+
dc.draw_rectangle(450, 50, 100, 100)
|
108
|
+
old_pen = dc.get_pen()
|
109
|
+
new_pen = Wx::Pen.new("BLACK", 5, Wx::SOLID)
|
110
|
+
dc.set_pen(new_pen)
|
111
|
+
dc.draw_rectangle(470, 70, 60, 60)
|
112
|
+
dc.set_pen(old_pen)
|
113
|
+
dc.draw_rectangle(490, 90, 20, 20)
|
114
|
+
|
115
|
+
draw_saved_lines(dc)
|
116
|
+
end
|
117
|
+
|
118
|
+
def draw_saved_lines(dc)
|
119
|
+
dc.set_pen(Wx::Pen.new("MEDIUM FOREST GREEN", 4, Wx::SOLID))
|
120
|
+
@lines.each do |line|
|
121
|
+
line.each do |coords|
|
122
|
+
coords.flatten!()
|
123
|
+
dc.draw_line(coords[0], coords[1], coords[2], coords[3])
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def set_XY(event)
|
129
|
+
@x, @y = convert_event_coords(event)
|
130
|
+
end
|
131
|
+
|
132
|
+
def convert_event_coords(event)
|
133
|
+
xView, yView = get_view_start()
|
134
|
+
xDelta, yDelta = get_scroll_pixels_per_unit()
|
135
|
+
return event.get_x() + (xView * xDelta), event.get_y() + (yView * yDelta)
|
136
|
+
end
|
137
|
+
|
138
|
+
def on_left_button_event_down(event)
|
139
|
+
if event.left_is_down() and !@drawing
|
140
|
+
set_focus()
|
141
|
+
set_XY(event)
|
142
|
+
@curLine = []
|
143
|
+
capture_mouse()
|
144
|
+
@drawing = true
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def on_left_button_event_up(event)
|
149
|
+
if !event.left_is_down() and @drawing
|
150
|
+
@lines.push(@curLine)
|
151
|
+
@curLine = []
|
152
|
+
release_mouse()
|
153
|
+
@drawing = false
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def on_left_button_event_motion(event)
|
158
|
+
if event.left_is_down() and @drawing
|
159
|
+
# if $BUFFERED
|
160
|
+
# # If doing buffered drawing, create the buffered DC, giving it
|
161
|
+
# # it a real DC to blit to when done.
|
162
|
+
# cdc = Wx::ClientDC.new(self)
|
163
|
+
# dc = Wx::BufferedDC.new(cdc, @buffer)
|
164
|
+
# else
|
165
|
+
# dc = Wx::ClientDC.new(self)
|
166
|
+
# end
|
167
|
+
|
168
|
+
paint do | dc |
|
169
|
+
dc.set_pen(Wx::Pen.new("MEDIUM FOREST GREEN", 4, Wx::SOLID))
|
170
|
+
coords = [@x, @y] + convert_event_coords(event)
|
171
|
+
@curLine.push(coords)
|
172
|
+
coords.flatten!()
|
173
|
+
dc.draw_line(coords[0], coords[1], coords[2], coords[3])
|
174
|
+
set_XY(event)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
end
|
180
|
+
|
181
|
+
module Demo
|
182
|
+
def Demo.run(frame, nb, log)
|
183
|
+
win = MyCanvas.new(nb, log)
|
184
|
+
return win
|
185
|
+
end
|
186
|
+
|
187
|
+
def Demo.overview
|
188
|
+
return "The wxScrolledWindow class manages scrolling for its client area, transforming the coordinates according to the scrollbar positions, and setting the scroll positions, thumb sizes and ranges according to the area in view."
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
if __FILE__ == $0
|
193
|
+
run_solo_lib = File.join( File.dirname(__FILE__), 'run.rb')
|
194
|
+
load run_solo_lib
|
195
|
+
run File.basename($0)
|
196
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'wx'
|
5
|
+
rescue LoadError => no_wx_err
|
6
|
+
begin
|
7
|
+
require 'rubygems'
|
8
|
+
require 'wx'
|
9
|
+
rescue LoadError
|
10
|
+
raise no_wx_err
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
module Demo
|
15
|
+
def Demo.run(frame, nb, log)
|
16
|
+
dlg = Wx::SingleChoiceDialog.new(frame, "Test Single Choice", "The Caption",
|
17
|
+
%w(zero one two three four five six seven eight))
|
18
|
+
#Wx::CHOICEDLG_STYLE)
|
19
|
+
if dlg.show_modal() == Wx::ID_OK
|
20
|
+
log.write_text("You selected: " + dlg.get_string_selection() + "\n")
|
21
|
+
end
|
22
|
+
dlg.destroy()
|
23
|
+
return nil
|
24
|
+
end
|
25
|
+
|
26
|
+
def Demo.overview
|
27
|
+
return "This class represents a dialog that shows a list of strings, and allows the user to select one. Double-clicking on a list item is equivalent to single-clicking and then pressing OK."
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
if __FILE__ == $0
|
32
|
+
run_solo_lib = File.join( File.dirname(__FILE__), 'run.rb')
|
33
|
+
load run_solo_lib
|
34
|
+
run File.basename($0)
|
35
|
+
end
|