wxruby 1.9.3-universal-darwin

Sign up to get free protection for your applications and to get access to all the features.
Files changed (226) hide show
  1. data/LICENSE +53 -0
  2. data/README +299 -0
  3. data/lib/wx.rb +42 -0
  4. data/lib/wx/accessors.rb +52 -0
  5. data/lib/wx/classes/app.rb +45 -0
  6. data/lib/wx/classes/artprovider.rb +31 -0
  7. data/lib/wx/classes/bitmap.rb +23 -0
  8. data/lib/wx/classes/checklistbox.rb +45 -0
  9. data/lib/wx/classes/choice.rb +4 -0
  10. data/lib/wx/classes/clientdc.rb +13 -0
  11. data/lib/wx/classes/clipboard.rb +16 -0
  12. data/lib/wx/classes/colour.rb +47 -0
  13. data/lib/wx/classes/combobox.rb +4 -0
  14. data/lib/wx/classes/commandevent.rb +7 -0
  15. data/lib/wx/classes/controlwithitems.rb +10 -0
  16. data/lib/wx/classes/event.rb +5 -0
  17. data/lib/wx/classes/evthandler.rb +894 -0
  18. data/lib/wx/classes/font.rb +118 -0
  19. data/lib/wx/classes/grid.rb +129 -0
  20. data/lib/wx/classes/helpcontroller.rb +5 -0
  21. data/lib/wx/classes/htmlhelpcontroller.rb +5 -0
  22. data/lib/wx/classes/htmlwindow.rb +6 -0
  23. data/lib/wx/classes/icon.rb +14 -0
  24. data/lib/wx/classes/image.rb +14 -0
  25. data/lib/wx/classes/listbox.rb +4 -0
  26. data/lib/wx/classes/listctrl.rb +21 -0
  27. data/lib/wx/classes/locale.rb +28 -0
  28. data/lib/wx/classes/mediactrl.rb +22 -0
  29. data/lib/wx/classes/menu.rb +62 -0
  30. data/lib/wx/classes/menuitem.rb +7 -0
  31. data/lib/wx/classes/object.rb +7 -0
  32. data/lib/wx/classes/paintdc.rb +12 -0
  33. data/lib/wx/classes/point.rb +48 -0
  34. data/lib/wx/classes/previewframe.rb +13 -0
  35. data/lib/wx/classes/rect.rb +5 -0
  36. data/lib/wx/classes/size.rb +49 -0
  37. data/lib/wx/classes/sound.rb +23 -0
  38. data/lib/wx/classes/styledtextctrl.rb +92 -0
  39. data/lib/wx/classes/textctrl.rb +14 -0
  40. data/lib/wx/classes/texturlevent.rb +6 -0
  41. data/lib/wx/classes/timer.rb +69 -0
  42. data/lib/wx/classes/treectrl.rb +44 -0
  43. data/lib/wx/classes/window.rb +49 -0
  44. data/lib/wx/classes/xmlresource.rb +16 -0
  45. data/lib/wx/keyword_ctors.rb +219 -0
  46. data/lib/wx/keyword_defs.rb +485 -0
  47. data/lib/wx/version.rb +3 -0
  48. data/lib/wxruby2.bundle +0 -0
  49. data/samples/SAMPLES-LICENSE.TXT +18 -0
  50. data/samples/aui/aui.rb +1360 -0
  51. data/samples/bigdemo/About.rbw +39 -0
  52. data/samples/bigdemo/ColorPanel.rbw +25 -0
  53. data/samples/bigdemo/GridSimple.rbw +80 -0
  54. data/samples/bigdemo/MDIDemo.rbw +59 -0
  55. data/samples/bigdemo/PopupMenu.rbw +151 -0
  56. data/samples/bigdemo/ShapedWindow.rbw +135 -0
  57. data/samples/bigdemo/Sizers.rbw +545 -0
  58. data/samples/bigdemo/bigdemo.rb +826 -0
  59. data/samples/bigdemo/demoTemplate.rbw +37 -0
  60. data/samples/bigdemo/helpfile.htb +0 -0
  61. data/samples/bigdemo/icons/Test 015.jpg +0 -0
  62. data/samples/bigdemo/icons/Test 015.png +0 -0
  63. data/samples/bigdemo/icons/choice.bmp +0 -0
  64. data/samples/bigdemo/icons/choice.xpm +27 -0
  65. data/samples/bigdemo/icons/combo.bmp +0 -0
  66. data/samples/bigdemo/icons/combo.xpm +27 -0
  67. data/samples/bigdemo/icons/copy.xpm +25 -0
  68. data/samples/bigdemo/icons/cut.xpm +24 -0
  69. data/samples/bigdemo/icons/gauge.bmp +0 -0
  70. data/samples/bigdemo/icons/gauge.xpm +27 -0
  71. data/samples/bigdemo/icons/help.xpm +25 -0
  72. data/samples/bigdemo/icons/list.bmp +0 -0
  73. data/samples/bigdemo/icons/list.xpm +27 -0
  74. data/samples/bigdemo/icons/mondrian.ico +0 -0
  75. data/samples/bigdemo/icons/mondrian.xpm +44 -0
  76. data/samples/bigdemo/icons/new.xpm +24 -0
  77. data/samples/bigdemo/icons/ogl.ico +0 -0
  78. data/samples/bigdemo/icons/ogl.xpm +45 -0
  79. data/samples/bigdemo/icons/open.xpm +26 -0
  80. data/samples/bigdemo/icons/paste.bmp +0 -0
  81. data/samples/bigdemo/icons/paste.xpm +38 -0
  82. data/samples/bigdemo/icons/pointy.png +0 -0
  83. data/samples/bigdemo/icons/preview.xpm +26 -0
  84. data/samples/bigdemo/icons/print.xpm +26 -0
  85. data/samples/bigdemo/icons/radio.bmp +0 -0
  86. data/samples/bigdemo/icons/radio.xpm +27 -0
  87. data/samples/bigdemo/icons/robert.xpm +415 -0
  88. data/samples/bigdemo/icons/ruby.png +0 -0
  89. data/samples/bigdemo/icons/sashtest.ico +0 -0
  90. data/samples/bigdemo/icons/save.xpm +25 -0
  91. data/samples/bigdemo/icons/smiles.bmp +0 -0
  92. data/samples/bigdemo/icons/smiles.xpm +39 -0
  93. data/samples/bigdemo/icons/smiley.ico +0 -0
  94. data/samples/bigdemo/icons/smiley.xpm +42 -0
  95. data/samples/bigdemo/icons/stattext.xpm +24 -0
  96. data/samples/bigdemo/icons/test2.bmp +0 -0
  97. data/samples/bigdemo/icons/test2.png +0 -0
  98. data/samples/bigdemo/icons/test2.xpm +79 -0
  99. data/samples/bigdemo/icons/text.bmp +0 -0
  100. data/samples/bigdemo/icons/text.xpm +27 -0
  101. data/samples/bigdemo/icons/tog1.bmp +0 -0
  102. data/samples/bigdemo/icons/tog1.xpm +38 -0
  103. data/samples/bigdemo/icons/tog2.bmp +0 -0
  104. data/samples/bigdemo/icons/tog2.xpm +38 -0
  105. data/samples/bigdemo/icons/wxwin.ico +0 -0
  106. data/samples/bigdemo/icons/wxwin16x16.png +0 -0
  107. data/samples/bigdemo/icons/wxwin16x16.xpm +25 -0
  108. data/samples/bigdemo/icons/wxwin32x32.png +0 -0
  109. data/samples/bigdemo/icons/wxwin48x48.png +0 -0
  110. data/samples/bigdemo/run.rb +94 -0
  111. data/samples/bigdemo/tips.txt +7 -0
  112. data/samples/bigdemo/utils.rb +12 -0
  113. data/samples/bigdemo/wxArtProvider.rbw +285 -0
  114. data/samples/bigdemo/wxBitmapButton.rbw +64 -0
  115. data/samples/bigdemo/wxButton.rbw +66 -0
  116. data/samples/bigdemo/wxCalendarCtrl.rbw +72 -0
  117. data/samples/bigdemo/wxCheckBox.rbw +52 -0
  118. data/samples/bigdemo/wxCheckListBox.rbw +77 -0
  119. data/samples/bigdemo/wxChoice.rbw +49 -0
  120. data/samples/bigdemo/wxChoicebook.rbw +80 -0
  121. data/samples/bigdemo/wxColourDialog.rbw +34 -0
  122. data/samples/bigdemo/wxComboBox.rbw +79 -0
  123. data/samples/bigdemo/wxCursor.rbw +140 -0
  124. data/samples/bigdemo/wxDialog.rbw +92 -0
  125. data/samples/bigdemo/wxDirDialog.rbw +32 -0
  126. data/samples/bigdemo/wxDragImage.rbw +74 -0
  127. data/samples/bigdemo/wxFileDialog.rbw +39 -0
  128. data/samples/bigdemo/wxFileDialog_Save.rbw +38 -0
  129. data/samples/bigdemo/wxFindReplaceDialog.rbw +85 -0
  130. data/samples/bigdemo/wxFontDialog.rbw +176 -0
  131. data/samples/bigdemo/wxFrame.rbw +55 -0
  132. data/samples/bigdemo/wxGauge.rbw +73 -0
  133. data/samples/bigdemo/wxGenericDirCtrl.rbw +78 -0
  134. data/samples/bigdemo/wxGrid.rbw +68 -0
  135. data/samples/bigdemo/wxHtmlHelpController.rbw +57 -0
  136. data/samples/bigdemo/wxListBox.rbw +142 -0
  137. data/samples/bigdemo/wxListCtrl_virtual.rbw +109 -0
  138. data/samples/bigdemo/wxMDIWindows.rbw +52 -0
  139. data/samples/bigdemo/wxMenu.rbw +238 -0
  140. data/samples/bigdemo/wxMessageDialog.rbw +30 -0
  141. data/samples/bigdemo/wxMiniFrame.rbw +74 -0
  142. data/samples/bigdemo/wxMultipleChoiceDialog.rbw +34 -0
  143. data/samples/bigdemo/wxNotebook.rbw +138 -0
  144. data/samples/bigdemo/wxProgressDialog.rbw +45 -0
  145. data/samples/bigdemo/wxRadioBox.rbw +74 -0
  146. data/samples/bigdemo/wxRadioButton.rbw +127 -0
  147. data/samples/bigdemo/wxSashWindow.rbw +145 -0
  148. data/samples/bigdemo/wxScrolledMessageDialog.rbw +59 -0
  149. data/samples/bigdemo/wxScrolledWindow.rbw +201 -0
  150. data/samples/bigdemo/wxSingleChoiceDialog.rbw +35 -0
  151. data/samples/bigdemo/wxSlider.rbw +44 -0
  152. data/samples/bigdemo/wxSpinButton.rbw +52 -0
  153. data/samples/bigdemo/wxSpinCtrl.rbw +53 -0
  154. data/samples/bigdemo/wxSplitterWindow.rbw +65 -0
  155. data/samples/bigdemo/wxStaticBitmap.rbw +53 -0
  156. data/samples/bigdemo/wxStaticText.rbw +57 -0
  157. data/samples/bigdemo/wxStatusBar.rbw +128 -0
  158. data/samples/bigdemo/wxTextCtrl.rbw +151 -0
  159. data/samples/bigdemo/wxTextEntryDialog.rbw +34 -0
  160. data/samples/bigdemo/wxToggleButton.rbw +51 -0
  161. data/samples/bigdemo/wxToolBar.rbw +133 -0
  162. data/samples/bigdemo/wxTreeCtrl.rbw +192 -0
  163. data/samples/calendar/calendar.rb +275 -0
  164. data/samples/caret/caret.rb +286 -0
  165. data/samples/caret/mondrian.xpm +44 -0
  166. data/samples/controls/controls.rb +1140 -0
  167. data/samples/controls/get_item_sample.rb +87 -0
  168. data/samples/controls/icons/choice.xpm +27 -0
  169. data/samples/controls/icons/combo.xpm +27 -0
  170. data/samples/controls/icons/gauge.xpm +27 -0
  171. data/samples/controls/icons/list.xpm +27 -0
  172. data/samples/controls/icons/radio.xpm +27 -0
  173. data/samples/controls/icons/stattext.xpm +24 -0
  174. data/samples/controls/icons/text.xpm +27 -0
  175. data/samples/controls/mondrian.ico +0 -0
  176. data/samples/controls/mondrian.xpm +44 -0
  177. data/samples/controls/test2.bmp +0 -0
  178. data/samples/dialogs/dialogs.rb +724 -0
  179. data/samples/dialogs/tips.txt +18 -0
  180. data/samples/drawing/graphics_drawing.rb +232 -0
  181. data/samples/drawing/images.rb +48 -0
  182. data/samples/drawing/paperclip.png +0 -0
  183. data/samples/etc/activation.rb +108 -0
  184. data/samples/etc/choice.rb +72 -0
  185. data/samples/etc/miniframe.rb +84 -0
  186. data/samples/etc/sash.rb +135 -0
  187. data/samples/etc/scrollwin.rb +116 -0
  188. data/samples/etc/system_settings.rb +258 -0
  189. data/samples/etc/threaded.rb +81 -0
  190. data/samples/etc/wizard.rb +79 -0
  191. data/samples/event/event.rb +184 -0
  192. data/samples/grid/grid.rb +202 -0
  193. data/samples/html/html.rb +264 -0
  194. data/samples/listbook/listbook.rb +181 -0
  195. data/samples/listbook/listbook.xrc +370 -0
  196. data/samples/mdi/mdi.rb +87 -0
  197. data/samples/media/mediactrl.rb +173 -0
  198. data/samples/minimal/minimal.rb +85 -0
  199. data/samples/minimal/mondrian.ico +0 -0
  200. data/samples/minimal/mondrian.png +0 -0
  201. data/samples/minimal/nothing.rb +21 -0
  202. data/samples/opengl/cube.rb +123 -0
  203. data/samples/printing/mondrian.ico +0 -0
  204. data/samples/printing/mondrian.xpm +44 -0
  205. data/samples/printing/printing.rb +484 -0
  206. data/samples/sockets/SocketPackets.rb +27 -0
  207. data/samples/sockets/res/message-new.png +0 -0
  208. data/samples/sockets/res/user.png +0 -0
  209. data/samples/sockets/wxClient.rb +395 -0
  210. data/samples/sockets/wxServer.rb +422 -0
  211. data/samples/sockets/wxSocketGUI.rb +97 -0
  212. data/samples/text/mondrian.ico +0 -0
  213. data/samples/text/mondrian.xpm +44 -0
  214. data/samples/text/scintilla.rb +174 -0
  215. data/samples/text/textctrl.rb +124 -0
  216. data/samples/text/unicode.rb +238 -0
  217. data/samples/text/utf8.txt +15 -0
  218. data/samples/treectrl/icon1.xpm +79 -0
  219. data/samples/treectrl/icon2.xpm +53 -0
  220. data/samples/treectrl/icon3.xpm +79 -0
  221. data/samples/treectrl/icon4.xpm +43 -0
  222. data/samples/treectrl/icon5.xpm +79 -0
  223. data/samples/treectrl/treectrl.rb +1180 -0
  224. data/samples/xrc/samples.xrc +46 -0
  225. data/samples/xrc/xrc_sample.rb +107 -0
  226. metadata +296 -0
@@ -0,0 +1,286 @@
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
+ include Wx
16
+
17
+ # menu items
18
+ Caret_set_blink_time = 3
19
+ Caret_Move = 4
20
+
21
+ # controls start here (the numbers are, of course, arbitrary)
22
+ Caret_Text = 1000
23
+
24
+
25
+ # MyCanvas is a canvas on which you can type
26
+ class MyCanvas < ScrolledWindow
27
+ def initialize(parent)
28
+ super(parent, :style => SUNKEN_BORDER)
29
+
30
+ self.background_colour = WHITE
31
+
32
+ @font = Font.new(12, FONTFAMILY_TELETYPE,
33
+ FONTSTYLE_NORMAL, FONTWEIGHT_NORMAL)
34
+
35
+ @x_caret = @y_caret = @x_chars = @y_chars = 0
36
+ @x_margin = @y_margin = 5
37
+ @text = nil
38
+
39
+ create_caret
40
+
41
+ evt_paint :on_paint
42
+ evt_size :on_size
43
+ evt_char :on_char
44
+ end
45
+
46
+ def [](x,y)
47
+ @text[x + @x_chars * y,1]
48
+ end
49
+
50
+ def []=(x,y,z)
51
+ @text[x + @x_chars * y,1] = z
52
+ end
53
+
54
+ # caret movement
55
+ def home_pos
56
+ @x_caret = 0
57
+ end
58
+
59
+ def end_pos
60
+ @x_caret = @x_chars - 1
61
+ end
62
+
63
+ def first_line
64
+ @y_caret = 0
65
+ end
66
+
67
+ def last_line
68
+ @y_caret = @y_chars - 1
69
+ end
70
+
71
+ def prev_char
72
+ if @x_caret == 0
73
+ end_pos
74
+ prev_line
75
+ else
76
+ @x_caret -= 1
77
+ end
78
+ end
79
+
80
+ def next_char
81
+ @x_caret += 1
82
+ if @x_caret == @x_chars
83
+ home_pos
84
+ next_line
85
+ end
86
+ end
87
+
88
+ def prev_line
89
+ if @y_caret == 0
90
+ last_line
91
+ else
92
+ @y_caret -= 1
93
+ end
94
+ end
95
+
96
+ def next_line
97
+ @y_caret += 1
98
+ if @y_caret == @y_chars
99
+ first_line
100
+ end
101
+ end
102
+
103
+ def create_caret
104
+ paint do | dc |
105
+ dc.font = @font
106
+ @height_char = dc.char_height
107
+ @width_char = dc.char_width
108
+
109
+ my_caret = Caret.new(self, Size.new(@width_char, @height_char))
110
+ self.caret = my_caret
111
+
112
+ caret.move [ @x_margin, @y_margin ]
113
+ caret.show
114
+ end
115
+ end
116
+
117
+ def move_caret(x,y)
118
+ @x_caret = x
119
+ @y_caret = y
120
+
121
+ do_move_caret
122
+ end
123
+
124
+ def do_move_caret
125
+ log_status("Caret is at (%d, %d)", @x_caret, @y_caret)
126
+
127
+ caret.move_xy( @x_margin + @x_caret * @width_char,
128
+ @y_margin + @y_caret * @height_char)
129
+ end
130
+
131
+ def on_size(event)
132
+ @x_chars = (event.size.x - 2 * @x_margin) / @width_char
133
+ @y_chars = (event.size.y - 2 * @y_margin) / @height_char
134
+ if @x_chars <= 0
135
+ @x_chars = 1
136
+ end
137
+ if @y_chars <= 0
138
+ @y_chars = 1
139
+ end
140
+ if @x_caret >= @x_chars
141
+ @x_caret = @x_chars-1
142
+ end
143
+ if @y_caret >= @y_chars
144
+ @y_caret = @y_chars-1
145
+ end
146
+
147
+ @text = " " * @x_chars * @y_chars
148
+
149
+ if parent && parent.status_bar
150
+ msg = sprintf("Panel size is (%d, %d)", @x_chars, @y_chars)
151
+ parent.set_status_text(msg, 1)
152
+ parent.refresh
153
+ end
154
+ event.skip
155
+ end
156
+
157
+ def on_paint
158
+ if caret
159
+ caret.hide
160
+ end
161
+
162
+ paint do | dc |
163
+ dc.clear
164
+ dc.set_font(@font)
165
+
166
+ for y in 0 ... @y_chars
167
+ line = @text[@x_chars * y,@x_chars]
168
+ dc.draw_text( line, @x_margin, @y_margin + y * @height_char )
169
+ end
170
+ end
171
+
172
+ if caret
173
+ caret.show
174
+ end
175
+ end
176
+
177
+ def on_char(event)
178
+ case event.key_code
179
+ when K_LEFT, K_BACK
180
+ prev_char
181
+ when K_RIGHT
182
+ next_char
183
+ when K_UP
184
+ prev_line
185
+ when K_DOWN
186
+ next_line
187
+ when K_HOME
188
+ home_pos
189
+ when K_END
190
+ end_pos
191
+ when K_RETURN
192
+ home_pos
193
+ next_line
194
+ else
195
+ ch = event.key_code
196
+ if !event.alt_down and (ch >= K_SPACE) and (ch < K_DELETE)
197
+ self[@x_caret, @y_caret] = ch.chr
198
+ refresh
199
+ next_char
200
+ else
201
+ event.skip
202
+ end
203
+ end
204
+ do_move_caret
205
+ end
206
+ end
207
+
208
+ class MyFrame < Frame
209
+ def initialize(title, pos, size)
210
+ super(nil, -1, title, pos, size)
211
+ # set the frame icon
212
+ icon_file = File.join(File.dirname(__FILE__), 'mondrian.xpm')
213
+ self.icon = Icon.new(icon_file, BITMAP_TYPE_XPM)
214
+
215
+ # create a menu bar
216
+ menu_file = Menu.new
217
+
218
+ menu_file.append(Caret_set_blink_time, "&Blink time...\tCtrl-B")
219
+ menu_file.append(Caret_Move, "&Move caret\tCtrl-C")
220
+ menu_file.append_separator
221
+ menu_file.append(Wx::ID_ABOUT, "&About...\tCtrl-A", "Show about dialog")
222
+ menu_file.append_separator
223
+ menu_file.append(Wx::ID_EXIT, "E&xit\tAlt-X", "Quit self program")
224
+
225
+ # now append the freshly created menu to the menu bar...
226
+ menu_bar = MenuBar.new
227
+ menu_bar.append(menu_file, "&File")
228
+
229
+ # ... and attach self menu bar to the frame
230
+ self.menu_bar = menu_bar
231
+
232
+ @canvas = MyCanvas.new(self)
233
+
234
+ # This is required to set focus so that key events are directed to
235
+ # this Window, on Linux/GTK in particular
236
+ @canvas.set_focus
237
+
238
+ # create a status bar just for fun (by default with 1 pane only)
239
+ create_status_bar(2)
240
+ self.status_text = "Welcome to Windows!"
241
+
242
+ evt_menu Wx::ID_EXIT, :on_quit
243
+ evt_menu Wx::ID_ABOUT, :on_about
244
+ evt_menu Caret_set_blink_time, :on_set_blink_time
245
+ evt_menu Caret_Move, :on_caret_move
246
+ end
247
+
248
+ def on_quit
249
+ # true is to force the frame to close
250
+ close(true)
251
+ end
252
+
253
+ def on_about
254
+ message_box("The caret Windows sample, adapted for WxRuby",
255
+ "About Caret", OK | ICON_INFORMATION, self)
256
+ end
257
+
258
+ def on_caret_move
259
+ @canvas.move_caret(10, 10)
260
+ end
261
+
262
+ def on_set_blink_time
263
+ blink_time = get_number_from_user(
264
+ "The caret blink time is the time between two blinks",
265
+ "Time in milliseconds:",
266
+ "Caret sample",
267
+ Caret::get_blink_time, 0, 10000,
268
+ self)
269
+ if blink_time != -1
270
+ Caret::set_blink_time(blink_time)
271
+ @canvas.create_caret
272
+ log_status(self,"Blink time set to %d milliseconds.", blink_time)
273
+ end
274
+ end
275
+ end
276
+
277
+ class CaretApp < App
278
+ def on_init
279
+ frame = MyFrame.new("Caret Windows sample",
280
+ Point.new(50, 50), Size.new(450, 340))
281
+ frame.show(true)
282
+ end
283
+ end
284
+
285
+ a = CaretApp.new
286
+ a.main_loop
@@ -0,0 +1,44 @@
1
+ /* XPM */
2
+ static char *mondrian_xpm[] = {
3
+ /* columns rows colors chars-per-pixel */
4
+ "32 32 6 1",
5
+ " c Black",
6
+ ". c Blue",
7
+ "X c #00bf00",
8
+ "o c Red",
9
+ "O c Yellow",
10
+ "+ c Gray100",
11
+ /* pixels */
12
+ " ",
13
+ " oooooo +++++++++++++++++++++++ ",
14
+ " oooooo +++++++++++++++++++++++ ",
15
+ " oooooo +++++++++++++++++++++++ ",
16
+ " oooooo +++++++++++++++++++++++ ",
17
+ " oooooo +++++++++++++++++++++++ ",
18
+ " oooooo +++++++++++++++++++++++ ",
19
+ " oooooo +++++++++++++++++++++++ ",
20
+ " ",
21
+ " ++++++ ++++++++++++++++++ .... ",
22
+ " ++++++ ++++++++++++++++++ .... ",
23
+ " ++++++ ++++++++++++++++++ .... ",
24
+ " ++++++ ++++++++++++++++++ .... ",
25
+ " ++++++ ++++++++++++++++++ .... ",
26
+ " ++++++ ++++++++++++++++++ ",
27
+ " ++++++ ++++++++++++++++++ ++++ ",
28
+ " ++++++ ++++++++++++++++++ ++++ ",
29
+ " ++++++ ++++++++++++++++++ ++++ ",
30
+ " ++++++ ++++++++++++++++++ ++++ ",
31
+ " ++++++ ++++++++++++++++++ ++++ ",
32
+ " ++++++ ++++++++++++++++++ ++++ ",
33
+ " ++++++ ++++++++++++++++++ ++++ ",
34
+ " ++++++ ++++++++++++++++++ ++++ ",
35
+ " ++++++ ++++++++++++++++++ ++++ ",
36
+ " ++++++ ++++ ",
37
+ " ++++++ OOOOOOOOOOOO XXXXX ++++ ",
38
+ " ++++++ OOOOOOOOOOOO XXXXX ++++ ",
39
+ " ++++++ OOOOOOOOOOOO XXXXX ++++ ",
40
+ " ++++++ OOOOOOOOOOOO XXXXX ++++ ",
41
+ " ++++++ OOOOOOOOOOOO XXXXX ++++ ",
42
+ " ++++++ OOOOOOOOOOOO XXXXX ++++ ",
43
+ " "
44
+ };
@@ -0,0 +1,1140 @@
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
+ include Wx
16
+
17
+ CONTROLS_QUIT = ID_EXIT
18
+ CONTROLS_TEXT = 101
19
+ CONTROLS_ABOUT = ID_ABOUT
20
+ CONTROLS_CLEAR_LOG = 103
21
+ # tooltip menu
22
+ CONTROLS_SET_TOOLTIP_DELAY = 200
23
+ CONTROLS_ENABLE_TOOLTIPS = 201
24
+ # panel menu
25
+ CONTROLS_ENABLE_ALL = 202
26
+
27
+
28
+ ID_NOTEBOOK = 1000
29
+
30
+ ID_LISTBOX = 130
31
+ ID_LISTBOX_SEL_NUM = 131
32
+ ID_LISTBOX_SEL_STR = 132
33
+ ID_LISTBOX_CLEAR = 133
34
+ ID_LISTBOX_APPEND = 134
35
+ ID_LISTBOX_DELETE = 135
36
+ ID_LISTBOX_FONT = 136
37
+ ID_LISTBOX_ENABLE = 137
38
+ ID_LISTBOX_SORTED = 138
39
+
40
+ ID_CHOICE = 120
41
+ ID_CHOICE_SEL_NUM = 121
42
+ ID_CHOICE_SEL_STR = 122
43
+ ID_CHOICE_CLEAR = 123
44
+ ID_CHOICE_APPEND = 124
45
+ ID_CHOICE_DELETE = 125
46
+ ID_CHOICE_FONT = 126
47
+ ID_CHOICE_ENABLE = 127
48
+ ID_CHOICE_SORTED = 128
49
+
50
+ ID_COMBO = 140
51
+ ID_COMBO_SEL_NUM = 141
52
+ ID_COMBO_SEL_STR = 142
53
+ ID_COMBO_CLEAR = 143
54
+ ID_COMBO_APPEND = 144
55
+ ID_COMBO_DELETE = 145
56
+ ID_COMBO_FONT = 146
57
+ ID_COMBO_ENABLE = 147
58
+
59
+ ID_RADIOBOX = 160
60
+ ID_RADIOBOX_SEL_NUM = 161
61
+ ID_RADIOBOX_SEL_STR = 162
62
+ ID_RADIOBOX_FONT = 163
63
+ ID_RADIOBOX_ENABLE = 164
64
+
65
+ ID_RADIOBUTTON_1 = 166
66
+ ID_RADIOBUTTON_2 = 167
67
+
68
+ ID_SET_FONT = 170
69
+
70
+ ID_GAUGE = 180
71
+ ID_SLIDER = 181
72
+
73
+ ID_SPIN = 182
74
+ ID_BTNPROGRESS = 183
75
+ ID_BUTTON_LABEL = 184
76
+ ID_SPINCTRL = 185
77
+
78
+ ID_BUTTON_TEST1 = 190
79
+ ID_BUTTON_TEST2 = 191
80
+ ID_BITMAP_BTN = 192
81
+
82
+ ID_CHANGE_COLOUR = 200
83
+
84
+ ID_SIZER_CHECK1 = 201
85
+ ID_SIZER_CHECK2 = 202
86
+ ID_SIZER_CHECK3 = 203
87
+ ID_SIZER_CHECK4 = 204
88
+ ID_SIZER_CHECK14 = 205
89
+ ID_SIZER_CHECKBIG = 206
90
+
91
+ Image_List, Image_Choice, Image_Combo, Image_Text, Image_Radio, Image_Gauge, Image_Max = (0..6).to_a
92
+
93
+
94
+ # a button which intercepts double clicks (for testing...)
95
+ class MyButton < Button
96
+ def initialize(parent,id,label = EmptyString,pos = DEFAULT_POSITION,size = DEFAULT_SIZE)
97
+ super(parent,id,label,pos,size)
98
+
99
+ evt_left_dclick {|event| onDClick(event)}
100
+ end
101
+
102
+ def onDClick(event)
103
+ log_message("MyButton::OnDClick")
104
+ event.skip()
105
+ end
106
+
107
+ end
108
+
109
+ # a combo which intercepts chars (to test Windows behaviour)
110
+ class MyComboBox < ComboBox
111
+ def initialize(parent,id,value = EmptyString,
112
+ pos = DEFAULT_POSITION,
113
+ size = DEFAULT_SIZE,
114
+ choices = [],
115
+ style = 0)
116
+ super(parent, id, value, pos, size, choices)#, style)
117
+
118
+ evt_char {|event| onChar(event)}
119
+ evt_key_down {|event| onKeyDown(event)}
120
+ evt_key_up {|event| onKeyUp(event)}
121
+
122
+ evt_set_focus {|event| onFocusGot(event)}
123
+ end
124
+
125
+ def onChar(event)
126
+ log_message("MyComboBox::OnChar")
127
+ if event.key_code() == ?w
128
+ log_message("MyComboBox: 'w' will be ignored.")
129
+ else
130
+ event.skip()
131
+ end
132
+ end
133
+
134
+ def onKeyDown(event)
135
+ log_message("MyComboBox::OnKeyDown")
136
+ if event.key_code() == ?w
137
+ log_message("MyComboBox: 'w' will be ignored.")
138
+ else
139
+ event.skip()
140
+ end
141
+ end
142
+
143
+ def onKeyUp(event)
144
+ #log_message("MyComboBox::OnKeyUp")
145
+ event.skip()
146
+ end
147
+
148
+ def onFocusGot(event)
149
+ #log_message("MyComboBox::OnFocusGot")
150
+ event.skip()
151
+ end
152
+
153
+ end
154
+
155
+ # a radiobox which handles focus set/kill (for testing)
156
+ class MyRadioBox < RadioBox
157
+ def initialize(parent,
158
+ id,title = EmptyString,
159
+ pos = DEFAULT_POSITION,
160
+ size = DEFAULT_SIZE,
161
+ choices = [],
162
+ majorDim = 1,
163
+ style = RA_HORIZONTAL)
164
+ super(parent, id, title, pos, size, choices, majorDim,style)
165
+ set_foreground_colour(RED)
166
+
167
+ evt_set_focus {|event| onFocusGot(event)}
168
+ evt_kill_focus {|event| onFocusLost(event)}
169
+
170
+ end
171
+
172
+ def onFocusGot(event)
173
+ log_message("MyRadioBox::OnFocusGot")
174
+ event.skip()
175
+ end
176
+
177
+ def onFocusLost(event)
178
+ log_message("MyRadioBox::OnFocusLost")
179
+ event.skip()
180
+ end
181
+
182
+ end
183
+
184
+
185
+ class MyPanel < Panel
186
+
187
+ # delete Log::set_active_target(@m_logTargetOld)
188
+ # delete @m_notebook.GetImageList()
189
+ attr_reader :m_text,:m_logTargetOld
190
+
191
+ def initialize(frame,x,y,w,h)
192
+ super( frame, -1, Point.new(x, y), Size.new(w, h) )
193
+
194
+ @s_colOld = NULL_COLOUR
195
+
196
+ @m_text = TextCtrl.new(self, -1, "This is the log window.\n",
197
+ Point.new(0, 250), Size.new(100, 50), TE_MULTILINE)
198
+ @m_text.set_background_colour(Colour.new("wheat"))
199
+
200
+ #@m_logTargetOld = Log::set_active_target(LogTextCtrl.new(@m_text))
201
+
202
+ @m_notebook = Wx::Notebook.new(self, ID_NOTEBOOK)
203
+
204
+ choices = [
205
+ "This",
206
+ "is one of my",
207
+ "really",
208
+ "wonderful",
209
+ "examples."
210
+ ]
211
+
212
+ # fill the image list
213
+
214
+ imagelist = ImageList.new(16, 16)
215
+
216
+ imagelist.add( Bitmap.new( local_icon_file("list.xpm"),
217
+ Wx::BITMAP_TYPE_XPM))
218
+ imagelist.add( Bitmap.new( local_icon_file("choice.xpm"),
219
+ Wx::BITMAP_TYPE_XPM))
220
+ imagelist.add( Bitmap.new( local_icon_file("combo.xpm"),
221
+ Wx::BITMAP_TYPE_XPM))
222
+ imagelist.add( Bitmap.new( local_icon_file("text.xpm"),
223
+ Wx::BITMAP_TYPE_XPM))
224
+ imagelist.add( Bitmap.new( local_icon_file("radio.xpm"),
225
+ Wx::BITMAP_TYPE_XPM))
226
+ imagelist.add( Bitmap.new( local_icon_file("gauge.xpm"),
227
+ Wx::BITMAP_TYPE_XPM))
228
+
229
+ @m_notebook.set_image_list(imagelist)
230
+
231
+ panel = Panel.new(@m_notebook)
232
+ @m_listbox = ListBox.new( panel, ID_LISTBOX,
233
+ Point.new(10,10), Size.new(120,70),
234
+ choices, LB_ALWAYS_SB )
235
+
236
+ @m_listboxSorted = ListBox.new( panel, ID_LISTBOX_SORTED,
237
+ Point.new(10,90), Size.new(120,70),
238
+ choices, LB_SORT )
239
+
240
+
241
+ @m_listbox.set_cursor(CROSS_CURSOR)
242
+
243
+ @m_listbox.set_tool_tip( "This is a list box" )
244
+
245
+
246
+ @m_lbSelectNum = Button.new( panel, ID_LISTBOX_SEL_NUM, "Select #&2", Point.new(180,30), Size.new(140,30) )
247
+ @m_lbSelectThis = Button.new( panel, ID_LISTBOX_SEL_STR, "&Select 'This'", Point.new(340,30), Size.new(140,30) )
248
+ Button.new( panel, ID_LISTBOX_CLEAR, "&clear", Point.new(180,80), Size.new(140,30) )
249
+ MyButton.new( panel, ID_LISTBOX_APPEND, "&append 'Hi!'", Point.new(340,80), Size.new(140,30) )
250
+ Button.new( panel, ID_LISTBOX_DELETE, "D&elete selected item", Point.new(180,130), Size.new(140,30) )
251
+ button = MyButton.new( panel, ID_LISTBOX_FONT, "Set &Italic font", Point.new(340,130), Size.new(140,30) )
252
+
253
+ button.set_default()
254
+
255
+ button.set_foreground_colour(BLUE)
256
+
257
+ button.set_tool_tip( "Press here to set italic font" )
258
+
259
+ @m_checkbox = CheckBox.new( panel, ID_LISTBOX_ENABLE, "&Disable", Point.new(20,170) )
260
+ @m_checkbox.set_value(FALSE)
261
+ @m_checkbox.set_tool_tip( "Click here to disable the listbox" )
262
+ @m_toggle_color = CheckBox.new( panel, ID_CHANGE_COLOUR, "&Toggle colour",
263
+ Point.new(110,170) )
264
+ panel.set_cursor(Cursor.new(CURSOR_HAND))
265
+ @m_notebook.add_page(panel, "ListBox", TRUE, Image_List)
266
+
267
+ panel = Panel.new(@m_notebook)
268
+ @m_choice = Choice.new( panel, ID_CHOICE, Point.new(10,10), Size.new(120,-1), choices )
269
+ @m_choiceSorted = Choice.new( panel, ID_CHOICE_SORTED, Point.new(10,70), Size.new(120,-1),
270
+ choices, CB_SORT )
271
+
272
+ @m_choice.set_selection(2)
273
+ @m_choice.set_background_colour(Colour.new("red"))
274
+ Button.new( panel, ID_CHOICE_SEL_NUM, "Select #&2", Point.new(180,30), Size.new(140,30) )
275
+ Button.new( panel, ID_CHOICE_SEL_STR, "&Select 'This'", Point.new(340,30), Size.new(140,30) )
276
+ Button.new( panel, ID_CHOICE_CLEAR, "&clear", Point.new(180,80), Size.new(140,30) )
277
+ Button.new( panel, ID_CHOICE_APPEND, "&append 'Hi!'", Point.new(340,80), Size.new(140,30) )
278
+ Button.new( panel, ID_CHOICE_DELETE, "D&elete selected item", Point.new(180,130), Size.new(140,30) )
279
+ Button.new( panel, ID_CHOICE_FONT, "Set &Italic font", Point.new(340,130), Size.new(140,30) )
280
+ CheckBox.new( panel, ID_CHOICE_ENABLE, "&Disable", Point.new(20,130), Size.new(140,30) )
281
+
282
+ @m_notebook.add_page(panel, "Choice", FALSE, Image_Choice)
283
+
284
+ panel = Panel.new(@m_notebook)
285
+ StaticBox.new( panel, -1, "&Box around combobox",
286
+ Point.new(5, 5), Size.new(150, 100))
287
+ @m_combo = MyComboBox.new( panel, ID_COMBO, "This",
288
+ Point.new(20,25), Size.new(120, -1),
289
+ choices,PROCESS_ENTER)
290
+ # CB_READONLY | PROCESS_ENTER)
291
+
292
+ @m_combo.set_tool_tip("This is a natural\ncombobox - can you believe me?")
293
+
294
+ Button.new( panel, ID_COMBO_SEL_NUM, "Select #&2", Point.new(180,30), Size.new(140,30) )
295
+ Button.new( panel, ID_COMBO_SEL_STR, "&Select 'This'", Point.new(340,30), Size.new(140,30) )
296
+ Button.new( panel, ID_COMBO_CLEAR, "&clear", Point.new(180,80), Size.new(140,30) )
297
+ Button.new( panel, ID_COMBO_APPEND, "&append 'Hi!'", Point.new(340,80), Size.new(140,30) )
298
+ Button.new( panel, ID_COMBO_DELETE, "D&elete selected item", Point.new(180,130), Size.new(140,30) )
299
+ Button.new( panel, ID_COMBO_FONT, "Set &Italic font", Point.new(340,130), Size.new(140,30) )
300
+ CheckBox.new( panel, ID_COMBO_ENABLE, "&Disable", Point.new(20,130), Size.new(140,30) )
301
+ @m_notebook.add_page(panel, "ComboBox", FALSE, Image_Combo)
302
+
303
+ choices2 = ["First", "Second"]
304
+ # "Third",
305
+ #"Fourth", "Fifth", "Sixth",
306
+ #"Seventh", "Eighth", "Nineth", "Tenth" */
307
+
308
+ panel = Panel.new(@m_notebook)
309
+ MyRadioBox.new( panel, ID_RADIOBOX, "&That", Point.new(10,160), Size.new(-1,-1), choices2, 1, RA_SPECIFY_ROWS )
310
+ @m_radio = RadioBox.new( panel, ID_RADIOBOX, "T&his", Point.new(10,10), Size.new(-1,-1), choices, 1, RA_SPECIFY_COLS )
311
+ @m_radio.set_foreground_colour(RED)
312
+
313
+ @m_radio.set_tool_tip("Ever seen a radiobox?")
314
+
315
+ Button.new( panel, ID_RADIOBOX_SEL_NUM, "Select #&2", Point.new(180,30), Size.new(140,30) )
316
+ Button.new( panel, ID_RADIOBOX_SEL_STR, "&Select 'This'", Point.new(180,80), Size.new(140,30) )
317
+ @m_fontButton = Button.new( panel, ID_SET_FONT, "Set &more Italic font", Point.new(340,30), Size.new(140,30) )
318
+ Button.new( panel, ID_RADIOBOX_FONT, "Set &Italic font", Point.new(340,80), Size.new(140,30) )
319
+ CheckBox.new( panel, ID_RADIOBOX_ENABLE, "&Disable", Point.new(340,130), DEFAULT_SIZE )
320
+ rb = RadioButton.new( panel, ID_RADIOBUTTON_1, "Radiobutton1", Point.new(210,170), DEFAULT_SIZE, RB_GROUP )
321
+ rb.set_value( FALSE )
322
+ RadioButton.new( panel, ID_RADIOBUTTON_2, "&Radiobutton2", Point.new(340,170), DEFAULT_SIZE )
323
+ @m_notebook.add_page(panel, "RadioBox", FALSE, Image_Radio)
324
+
325
+ panel = Panel.new(@m_notebook)
326
+ StaticBox.new( panel, -1, "&Gauge and Slider", Point.new(10,10), Size.new(222,130) )
327
+ @m_gauge = Gauge.new( panel, -1, 200, Point.new(18,50), Size.new(155, 30), GA_HORIZONTAL|NO_BORDER )
328
+ @m_gauge.set_background_colour(GREEN)
329
+ @m_gauge.set_foreground_colour(RED)
330
+ @m_gaugeVert = Gauge.new( panel, -1, 100,
331
+ Point.new(195,35), Size.new(30, 90),
332
+ GA_VERTICAL | GA_SMOOTH | NO_BORDER )
333
+ @m_slider = Slider.new( panel, ID_SLIDER, 0, 0, 200, Point.new(18,90), Size.new(155,-1),
334
+ SL_AUTOTICKS | SL_LABELS )
335
+ @m_slider.set_tick_freq(40, 0)
336
+ @m_slider.set_tool_tip("This is a sliding slider")
337
+
338
+ StaticBox.new( panel, -1, "&Explanation",
339
+ Point.new(230,10), Size.new(270,130),
340
+ ALIGN_CENTER )
341
+
342
+ StaticText.new( panel, -1,
343
+ "In order see the gauge (aka progress bar)\n"+
344
+ "control do something you have to drag the\n"+
345
+ "handle of the slider to the right.\n"+
346
+ "\n"+
347
+ "This is also supposed to demonstrate how\n"+
348
+ "to use static controls.\n",
349
+ Point.new(250,25),
350
+ Size.new(240, 110))
351
+ initialSpinValue = -5
352
+ s = initialSpinValue.to_s
353
+ @m_spintext = TextCtrl.new( panel, -1, s, Point.new(20,160), Size.new(80,-1) )
354
+ @m_spinbutton = SpinButton.new( panel, ID_SPIN, Point.new(103,160), Size.new(80, -1) )
355
+ @m_spinbutton.set_range(-40,30)
356
+ @m_spinbutton.set_value(initialSpinValue)
357
+
358
+ @m_btnProgress = Button.new( panel, ID_BTNPROGRESS, "&Show progress dialog",
359
+ Point.new(300, 160) )
360
+
361
+ @m_spinctrl = SpinCtrl.new( panel, ID_SPINCTRL, "", Point.new(200, 160), Size.new(80, -1) )
362
+ @m_spinctrl.set_range(10,30)
363
+ @m_spinctrl.set_value(15)
364
+
365
+ @m_notebook.add_page(panel, "Gauge", FALSE, Image_Gauge)
366
+
367
+ panel = Panel.new(@m_notebook)
368
+
369
+ icon = ArtProvider::get_icon(ART_INFORMATION)
370
+ StaticBitmap.new( panel, -1, icon, Point.new(10, 10) )
371
+
372
+ bitmap = Bitmap.new( 100, 100 )
373
+ bitmap.draw do | dc |
374
+ dc.clear()
375
+ dc.set_pen(GREEN_PEN)
376
+ dc.draw_ellipse(5, 5, 90, 90)
377
+ dc.draw_text("Bitmap", 30, 40)
378
+ end
379
+
380
+ BitmapButton.new(panel, ID_BITMAP_BTN, bitmap, Point.new(100, 20))
381
+
382
+ # test for masked bitmap display
383
+ bitmap = Bitmap.new( File.join(File.dirname(__FILE__), "test2.bmp"),
384
+ BITMAP_TYPE_BMP)
385
+ if bitmap.is_ok()
386
+ bitmap.set_mask(Mask.new(bitmap, BLUE))
387
+ StaticBitmap.new(panel, -1, bitmap, Point.new(300, 120))
388
+ end
389
+ # bmp1 = ArtProvider::get_bitmap(ART_INFORMATION)
390
+ # bmp2 = ArtProvider::get_bitmap(ART_WARNING)
391
+ # bmp3 = ArtProvider::get_bitmap(ART_QUESTION)
392
+ # bmpBtn = BitmapButton.new(panel, -1,
393
+ # bmp1,
394
+ # Point.new(30, 70))
395
+
396
+ # bmpBtn.set_bitmap_selected(bmp2)
397
+ # bmpBtn.set_bitmap_focus(bmp3)
398
+ ToggleButton.new(panel, ID_BUTTON_LABEL,
399
+ "&Toggle label", Point.new(250, 20))
400
+ @m_label = StaticText.new(panel, -1, "Label with some long text",
401
+ Point.new(250, 60), DEFAULT_SIZE,
402
+ ALIGN_RIGHT)
403
+ @m_label.set_foreground_colour(BLUE )
404
+
405
+ @m_notebook.add_page(panel, "BitmapXXX")
406
+
407
+ # sizer
408
+
409
+ panel = Panel.new(@m_notebook)
410
+ panel.set_auto_layout( TRUE )
411
+
412
+ sizer = BoxSizer.new( VERTICAL )
413
+
414
+ csizer =
415
+ StaticBoxSizer.new(StaticBox.new(panel, -1, "Show Buttons"),
416
+ HORIZONTAL )
417
+
418
+ check1 = CheckBox.new(panel, ID_SIZER_CHECK1, "1")
419
+ check1.set_value(TRUE)
420
+ csizer.add(check1)
421
+ check2 = CheckBox.new(panel, ID_SIZER_CHECK2, "2")
422
+ check2.set_value(TRUE)
423
+ csizer.add(check2)
424
+ check3 = CheckBox.new(panel, ID_SIZER_CHECK3, "3")
425
+ check3.set_value(TRUE)
426
+ csizer.add(check3)
427
+ check4 = CheckBox.new(panel, ID_SIZER_CHECK4, "4")
428
+ check4.set_value(TRUE)
429
+ csizer.add(check4)
430
+ check14 = CheckBox.new(panel, ID_SIZER_CHECK14, "1-4")
431
+ check14.set_value(TRUE)
432
+ csizer.add(check14)
433
+ checkBig = CheckBox.new(panel, ID_SIZER_CHECKBIG, "Big")
434
+ checkBig.set_value(TRUE)
435
+ csizer.add(checkBig)
436
+
437
+ sizer.add(csizer)
438
+
439
+ @m_hsizer = BoxSizer.new( HORIZONTAL )
440
+
441
+ @m_buttonSizer = BoxSizer.new(VERTICAL)
442
+
443
+ @m_sizerBtn1 = Button.new(panel, -1, "Test Button &1" )
444
+ @m_buttonSizer.add( @m_sizerBtn1, 0, ALL, 10 )
445
+ @m_sizerBtn2 = Button.new(panel, -1, "Test Button &2" )
446
+ @m_buttonSizer.add( @m_sizerBtn2, 0, ALL, 10 )
447
+ @m_sizerBtn3 = Button.new(panel, -1, "Test Button &3" )
448
+ @m_buttonSizer.add( @m_sizerBtn3, 0, ALL, 10 )
449
+ @m_sizerBtn4 = Button.new(panel, -1, "Test Button &4" )
450
+ @m_buttonSizer.add( @m_sizerBtn4, 0, ALL, 10 )
451
+
452
+ @m_hsizer.add(@m_buttonSizer)
453
+ @m_hsizer.add( 20,20, 1 )
454
+ @m_bigBtn = Button.new(panel, -1, "Multiline\nbutton" )
455
+ @m_hsizer.add( @m_bigBtn , 3, GROW|ALL, 10 )
456
+
457
+ sizer.add(@m_hsizer, 1, GROW)
458
+
459
+ panel.set_sizer( sizer )
460
+
461
+ @m_notebook.add_page(panel, "Sizer")
462
+
463
+ evt_size {|event| onSize(event) }
464
+ evt_notebook_page_changing(ID_NOTEBOOK) {|event| onPageChanging(event) }
465
+ evt_notebook_page_changed(ID_NOTEBOOK) {|event| onPageChanged(event) }
466
+ evt_listbox(ID_LISTBOX) {|event| onListBox(event) }
467
+ evt_listbox(ID_LISTBOX_SORTED) {|event| onListBox(event) }
468
+ evt_listbox_dclick(ID_LISTBOX) {|event| onListBoxDoubleClick(event) }
469
+ evt_button(ID_LISTBOX_SEL_NUM) {|event| onListBoxButtons(event) }
470
+ evt_button(ID_LISTBOX_SEL_STR) {|event| onListBoxButtons(event) }
471
+ evt_button(ID_LISTBOX_CLEAR) {|event| onListBoxButtons(event) }
472
+ evt_button(ID_LISTBOX_APPEND) {|event| onListBoxButtons(event) }
473
+ evt_button(ID_LISTBOX_DELETE) {|event| onListBoxButtons(event) }
474
+ evt_button(ID_LISTBOX_FONT) {|event| onListBoxButtons(event) }
475
+ evt_checkbox(ID_LISTBOX_ENABLE) {|event| onListBoxButtons(event) }
476
+ evt_choice(ID_CHOICE) {|event| onChoice(event) }
477
+ evt_choice(ID_CHOICE_SORTED) {|event| onChoice(event) }
478
+ evt_button(ID_CHOICE_SEL_NUM) {|event| onChoiceButtons(event) }
479
+ evt_button(ID_CHOICE_SEL_STR) {|event| onChoiceButtons(event) }
480
+ evt_button(ID_CHOICE_CLEAR) {|event| onChoiceButtons(event) }
481
+ evt_button(ID_CHOICE_APPEND) {|event| onChoiceButtons(event) }
482
+ evt_button(ID_CHOICE_DELETE) {|event| onChoiceButtons(event) }
483
+ evt_button(ID_CHOICE_FONT) {|event| onChoiceButtons(event) }
484
+ evt_checkbox(ID_CHOICE_ENABLE) {|event| onChoiceButtons(event) }
485
+ evt_combobox(ID_COMBO) {|event| onCombo(event) }
486
+ evt_text(ID_COMBO) {|event| onComboTextChanged(event) }
487
+ evt_text_enter(ID_COMBO) {|event| onComboTextEnter(event) }
488
+ evt_button(ID_COMBO_SEL_NUM) {|event| onComboButtons(event) }
489
+ evt_button(ID_COMBO_SEL_STR) {|event| onComboButtons(event) }
490
+ evt_button(ID_COMBO_CLEAR) {|event| onComboButtons(event) }
491
+ evt_button(ID_COMBO_APPEND) {|event| onComboButtons(event) }
492
+ evt_button(ID_COMBO_DELETE) {|event| onComboButtons(event) }
493
+ evt_button(ID_COMBO_FONT) {|event| onComboButtons(event) }
494
+ evt_checkbox(ID_COMBO_ENABLE) {|event| onComboButtons(event) }
495
+ evt_radiobox(ID_RADIOBOX) {|event| onRadio(event) }
496
+ evt_button(ID_RADIOBOX_SEL_NUM) {|event| onRadioButtons(event) }
497
+ evt_button(ID_RADIOBOX_SEL_STR) {|event| onRadioButtons(event) }
498
+ evt_button(ID_RADIOBOX_FONT) {|event| onRadioButtons(event) }
499
+ evt_checkbox(ID_RADIOBOX_ENABLE) {|event| onRadioButtons(event) }
500
+ evt_button(ID_SET_FONT) {|event| onSetFont(event) }
501
+ evt_slider(ID_SLIDER) {|event| onSliderupdate(event) }
502
+ evt_spin(ID_SPIN) {|event| onSpinupdate(event) }
503
+ evt_spin_up(ID_SPIN) {|event| onSpinUp(event) }
504
+ evt_spin_down(ID_SPIN) {|event| onSpinDown(event) }
505
+ evt_update_ui(ID_BTNPROGRESS) {|event| onupdateShowProgress(event) }
506
+ evt_button(ID_BTNPROGRESS) {|event| onShowProgress(event) }
507
+ evt_spinctrl(ID_SPINCTRL) {|event| onSpinCtrl(event) }
508
+ evt_spin_up(ID_SPINCTRL) {|event| onSpinCtrlUp(event) }
509
+ evt_spin_down(ID_SPINCTRL) {|event| onSpinCtrlDown(event) }
510
+ evt_text(ID_SPINCTRL) {|event| onSpinCtrlText(event) }
511
+ if (RUBY_PLATFORM =~ /mswin/)
512
+ evt_togglebutton(ID_BUTTON_LABEL) {|event| onupdateLabel(event) }
513
+ end
514
+ evt_checkbox(ID_CHANGE_COLOUR) {|event| onChangeColour(event) }
515
+ evt_button(ID_BUTTON_TEST1) {|event| onTestButton(event) }
516
+ evt_button(ID_BUTTON_TEST2) {|event| onTestButton(event) }
517
+ evt_button(ID_BITMAP_BTN) {|event| onBmpButton(event) }
518
+
519
+ evt_checkbox(ID_SIZER_CHECK1) {|event| onSizerCheck(event) }
520
+ evt_checkbox(ID_SIZER_CHECK2) {|event| onSizerCheck(event) }
521
+ evt_checkbox(ID_SIZER_CHECK3) {|event| onSizerCheck(event) }
522
+ evt_checkbox(ID_SIZER_CHECK4) {|event| onSizerCheck(event) }
523
+ evt_checkbox(ID_SIZER_CHECK14) {|event| onSizerCheck(event) }
524
+ evt_checkbox(ID_SIZER_CHECKBIG) {|event| onSizerCheck(event) }
525
+
526
+ end
527
+
528
+ # utility function to find an icon relative to this ruby script
529
+ def local_icon_file(icon_name)
530
+ File.join( File.dirname(__FILE__), 'icons', icon_name)
531
+ end
532
+
533
+
534
+ def onSize(event)
535
+ size = get_client_size()
536
+ x = size.get_width
537
+ y = size.get_height
538
+ if @m_notebook
539
+ @m_notebook.set_dimensions( 2, 2, x-4, y*2/3-4 )
540
+ end
541
+ if @m_text
542
+ @m_text.set_dimensions( 2, y*2/3+2, x-4, y/3-4 )
543
+ end
544
+ end
545
+
546
+ def onPageChanging(event)
547
+
548
+ selOld = event.get_old_selection()
549
+ if selOld == 2
550
+ if message_box("This demonstrates how a program may prevent the\n"+
551
+ "page change from taking place - if you select\n"+
552
+ "[No] the current page will stay the third one\n",
553
+ "Control sample",
554
+ ICON_QUESTION | YES_NO, self) != YES
555
+ event.veto()
556
+ return nil
557
+ end
558
+ end
559
+ @m_text << "Notebook selection is being changed from " << selOld \
560
+ << " to " << event.get_selection() \
561
+ << " (current page from notebook is " \
562
+ << @m_notebook.get_selection() << ")\n"
563
+ end
564
+
565
+ def onPageChanged(event)
566
+ @m_text << "Notebook selection is now " << event.get_selection() \
567
+ << " (from notebook: " << @m_notebook.get_selection() \
568
+ << ")\n"
569
+ end
570
+
571
+ def onTestButton(event)
572
+ log_message("Button %s clicked.",
573
+ event.get_id() == ID_BUTTON_TEST1 ? '1' : '2')
574
+ end
575
+
576
+ def onBmpButton(event)
577
+ log_message("Bitmap button clicked.")
578
+ end
579
+
580
+ def onChangeColour(event)
581
+ # test panel colour changing and propagation to the subcontrols
582
+ if @s_colOld.is_ok()
583
+
584
+ set_background_colour(@s_colOld)
585
+ @s_colOld = NULL_COLOUR
586
+
587
+ @m_lbSelectThis.set_foreground_colour(Colour.new("red"))
588
+ @m_lbSelectThis.set_background_colour(Colour.new("white"))
589
+ else
590
+ @s_colOld = Colour.new("red")
591
+ set_background_colour(Colour.new("white"))
592
+
593
+ @m_lbSelectThis.set_foreground_colour(Colour.new("white"))
594
+ @m_lbSelectThis.set_background_colour(Colour.new("red"))
595
+ end
596
+
597
+ @m_lbSelectThis.refresh()
598
+ refresh()
599
+ end
600
+
601
+ def onListBox(event)
602
+ # GetParent().Move(100, 100)
603
+ if event.get_int() == -1
604
+ @m_text.append_text( "ListBox has no selections anymore\n" )
605
+ return Qnil
606
+ end
607
+
608
+ listbox = (event.get_id() == ID_LISTBOX) ? @m_listbox : @m_listboxSorted
609
+
610
+ @m_text.append_text( "ListBox event selection string is: '" )
611
+ @m_text.append_text( event.get_string() )
612
+ @m_text.append_text( "'\n" )
613
+ @m_text.append_text( "ListBox control selection string is: '" )
614
+ @m_text.append_text( listbox.get_string_selection() )
615
+ @m_text.append_text( "'\n" )
616
+
617
+ # NOTE: get_client_data and set_client_data have been removed from wxRuby 0.4
618
+ # because they could cause crashes
619
+ # obj = event.get_client_data()
620
+ # @m_text.append_text( "ListBox event client data string is: '" )
621
+ # if obj
622
+ # @m_text.append_text( obj )
623
+ # else
624
+ # @m_text.append_text( "none" )
625
+ # end
626
+
627
+ # @m_text.append_text( "'\n" )
628
+ # @m_text.append_text( "ListBox control client data string is: '" )
629
+ # obj = listbox.get_client_data(listbox.get_selection())
630
+ # if obj
631
+ # @m_text.append_text( obj )
632
+ # else
633
+ # @m_text.append_text( "none" )
634
+ # end
635
+ # @m_text.append_text( "'\n" )
636
+ end
637
+
638
+ def onListBoxDoubleClick(event)
639
+ @m_text.append_text( "ListBox double click string is: " )
640
+ @m_text.append_text( event.get_string() )
641
+ @m_text.append_text( "\n" )
642
+ end
643
+
644
+ def onListBoxButtons(event)
645
+ case event.get_id()
646
+ when ID_LISTBOX_ENABLE
647
+ @m_text.append_text("Checkbox clicked.\n")
648
+ if event.get_int() != 0
649
+ @m_checkbox.set_tool_tip( "Click to enable listbox" )
650
+ @m_toggle_color.enable(false)
651
+ else
652
+ @m_checkbox.set_tool_tip( "Click to disable listbox" )
653
+ @m_toggle_color.enable(true)
654
+ end
655
+ @m_listbox.enable( event.get_int() == 0 )
656
+ @m_lbSelectThis.enable( event.get_int() == 0 )
657
+ @m_lbSelectNum.enable( event.get_int() == 0 )
658
+ @m_listboxSorted.enable( event.get_int() == 0 )
659
+ #w = Window::find_window_by_id(ID_CHANGE_COLOUR)
660
+ #if(w)
661
+ # w.enable( event.get_int() == 0 )
662
+ #else
663
+ # puts("Window ID_CHANGE_COLOR not found")
664
+ #end
665
+ when ID_LISTBOX_SEL_NUM
666
+ @m_listbox.set_selection( 2 )
667
+ @m_listboxSorted.set_selection( 2 )
668
+ @m_lbSelectThis.warp_pointer( 40, 14 )
669
+ when ID_LISTBOX_SEL_STR
670
+ @m_listbox.set_string_selection( "This" )
671
+ @m_listboxSorted.set_string_selection( "This" )
672
+ @m_lbSelectNum.warp_pointer( 40, 14 )
673
+ when ID_LISTBOX_CLEAR
674
+ @m_listbox.clear()
675
+ @m_listboxSorted.clear()
676
+ when ID_LISTBOX_APPEND
677
+ @m_listbox.append( "Hi!" )
678
+ @m_listboxSorted.append( "Hi!" )
679
+ when ID_LISTBOX_DELETE
680
+ idx = @m_listbox.get_selection()
681
+ if idx != NOT_FOUND
682
+ @m_listbox.delete( idx )
683
+ end
684
+ idx = @m_listboxSorted.get_selection()
685
+ if idx != NOT_FOUND
686
+ @m_listboxSorted.delete( idx )
687
+ end
688
+ when ID_LISTBOX_FONT
689
+ @m_listbox.set_font( ITALIC_FONT )
690
+ @m_listboxSorted.set_font( ITALIC_FONT )
691
+ @m_checkbox.set_font( ITALIC_FONT )
692
+ end
693
+ end
694
+
695
+
696
+ def onChoice(event)
697
+
698
+ choice = (event.get_id() == ID_CHOICE) ? @m_choice : @m_choiceSorted
699
+
700
+ @m_text.append_text( "Choice event selection string is: '" )
701
+ @m_text.append_text( event.get_string() )
702
+ @m_text.append_text( "'\n" )
703
+ @m_text.append_text( "Choice control selection string is: '" )
704
+ @m_text.append_text( choice.get_string_selection() )
705
+ @m_text.append_text( "'\n" )
706
+
707
+ # NOTE: get_client_data and set_client_data have been removed from wxRuby 0.4
708
+ # because they could cause crashes
709
+ # obj = event.get_client_data()
710
+ # @m_text.append_text( "Choice event client data string is: '" )
711
+
712
+ # if obj
713
+ # @m_text.append_text( obj )
714
+ # else
715
+ # @m_text.append_text( "none" )
716
+ # end
717
+
718
+ # @m_text.append_text( "'\n" )
719
+ # @m_text.append_text( "Choice control client data string is: '" )
720
+
721
+ # obj = choice.get_client_data(choice.get_selection())
722
+ # if obj
723
+ # @m_text.append_text( obj )
724
+ # else
725
+ # @m_text.append_text( "none" )
726
+ # end
727
+ # @m_text.append_text( "'\n" )
728
+ end
729
+
730
+ def onChoiceButtons(event)
731
+ case event.get_id()
732
+ when ID_CHOICE_ENABLE
733
+ @m_choice.enable( event.get_int() == 0 )
734
+ @m_choiceSorted.enable( event.get_int() == 0 )
735
+ when ID_CHOICE_SEL_NUM
736
+ @m_choice.set_selection( 2 )
737
+ @m_choiceSorted.set_selection( 2 )
738
+ when ID_CHOICE_SEL_STR
739
+ @m_choice.set_string_selection( "This" )
740
+ @m_choiceSorted.set_string_selection( "This" )
741
+ when ID_CHOICE_CLEAR
742
+ @m_choice.clear()
743
+ @m_choiceSorted.clear()
744
+ when ID_CHOICE_APPEND
745
+ @m_choice.append( "Hi!" )
746
+ @m_choiceSorted.append( "Hi!" )
747
+ when ID_CHOICE_DELETE
748
+ idx = @m_choice.get_selection()
749
+ if idx != NOT_FOUND
750
+ @m_choice.delete( idx )
751
+ end
752
+ idx = @m_choiceSorted.get_selection()
753
+ if idx != NOT_FOUND
754
+ @m_choiceSorted.delete( idx )
755
+ end
756
+ when ID_CHOICE_FONT
757
+ @m_choice.set_font( ITALIC_FONT )
758
+ @m_choiceSorted.set_font( ITALIC_FONT )
759
+ end
760
+ end
761
+
762
+ def onCombo(event)
763
+ @m_text.append_text( "ComboBox event selection string is: " )
764
+ @m_text.append_text( event.get_string() )
765
+ @m_text.append_text( "\n" )
766
+ @m_text.append_text( "ComboBox control selection string is: " )
767
+ @m_text.append_text( @m_combo.get_string_selection() )
768
+ @m_text.append_text( "\n" )
769
+ end
770
+
771
+ def onComboTextChanged(event)
772
+ str = sprintf( "Text in the combobox changed: now is '%s'.",
773
+ event.get_string())
774
+ log_message( str )
775
+ end
776
+
777
+ def onComboTextEnter(event)
778
+ log_message("Enter pressed in the combobox: value is '%s'.",
779
+ @m_combo.get_value())
780
+ end
781
+
782
+ def onComboButtons(event)
783
+ case event.get_id()
784
+ when ID_COMBO_ENABLE
785
+ @m_combo.enable( event.get_int() == 0 )
786
+ when ID_COMBO_SEL_NUM
787
+ @m_combo.set_selection( 2 )
788
+ when ID_COMBO_SEL_STR
789
+ @m_combo.set_string_selection( "This" )
790
+ when ID_COMBO_CLEAR
791
+ @m_combo.clear()
792
+ when ID_COMBO_APPEND
793
+ @m_combo.append( "Hi!" )
794
+ when ID_COMBO_DELETE
795
+ idx = @m_combo.get_selection()
796
+ @m_combo.delete( idx )
797
+ when ID_COMBO_FONT
798
+ @m_combo.set_font( ITALIC_FONT )
799
+ end
800
+ end
801
+
802
+ def onRadio(event)
803
+ @m_text.append_text( "RadioBox selection string is: " )
804
+ @m_text.append_text( event.get_string() )
805
+ @m_text.append_text( "\n" )
806
+ end
807
+
808
+ def onRadioButtons(event)
809
+ case event.get_id()
810
+ when ID_RADIOBOX_ENABLE
811
+ @m_radio.enable( event.get_int() == 0 )
812
+ when ID_RADIOBOX_SEL_NUM
813
+ @m_radio.set_selection( 2 )
814
+ when ID_RADIOBOX_SEL_STR
815
+ @m_radio.set_string_selection( "This" )
816
+ when ID_RADIOBOX_FONT
817
+ @m_radio.set_foreground_colour(GREEN)
818
+ @m_radio.set_font( ITALIC_FONT )
819
+ end
820
+ end
821
+
822
+ def onSetFont(event)
823
+ @m_fontButton.set_font( ITALIC_FONT )
824
+ @m_text.set_font( ITALIC_FONT )
825
+ end
826
+
827
+ def onupdateLabel(event)
828
+ @m_label.set_label(event.get_int() != 0 ? "Very very very very very long text." : "Shorter text.")
829
+ end
830
+
831
+ def onSliderupdate(event)
832
+ @m_gauge.set_value( @m_slider.get_value() )
833
+ @m_gaugeVert.set_value( @m_slider.get_value() / 2 )
834
+ end
835
+
836
+
837
+ def onSpinCtrlText(event)
838
+ if @m_spinctrl
839
+ s = sprintf( "Spin ctrl text changed: now %d (from event: %s)\n",
840
+ @m_spinctrl.get_value(), event.get_string() )
841
+ @m_text.append_text(s)
842
+ end
843
+ end
844
+
845
+ def onSpinCtrl(event)
846
+ if @m_spinctrl
847
+ s = sprintf( "Spin ctrl changed: now %d (from event: %d)\n",
848
+ @m_spinctrl.get_value(), event.get_int() )
849
+ @m_text.append_text(s)
850
+ end
851
+ end
852
+
853
+ def onSpinCtrlUp(event)
854
+ if @m_spinctrl
855
+ @m_text.append_text( sprintf(
856
+ "Spin up: %d (from event: %d)\n",
857
+ @m_spinctrl.get_value(), event.get_int() ) )
858
+ end
859
+ end
860
+
861
+ def onSpinCtrlDown(event)
862
+ if @m_spinctrl
863
+ @m_text.append_text( sprintf(
864
+ "Spin down: %d (from event: %d)\n",
865
+ @m_spinctrl.get_value(), event.get_int() ) )
866
+ end
867
+ end
868
+
869
+
870
+ def onSpinUp(event)
871
+ value = sprintf( "Spin control up: current = %d\n",
872
+ @m_spinbutton.get_value())
873
+
874
+ if event.get_position() > 17
875
+ value += "Preventing the spin button from going above 17.\n"
876
+ event.veto()
877
+ end
878
+
879
+ @m_text.append_text(value)
880
+ end
881
+
882
+ def onSpinDown(event)
883
+ value = sprintf( "Spin control down: current = %d\n",
884
+ @m_spinbutton.get_value())
885
+
886
+ if event.get_position() < -17
887
+ value += "Preventing the spin button from going below -17.\n"
888
+ event.veto()
889
+ end
890
+
891
+ @m_text.append_text(value)
892
+ end
893
+
894
+ def onSpinupdate(event)
895
+ value = sprintf( "%d", event.get_position() )
896
+ @m_spintext.set_value( value )
897
+
898
+ value = sprintf( "Spin control range: (%d, %d), current = %d\n",
899
+ @m_spinbutton.get_min(), @m_spinbutton.get_max(),
900
+ @m_spinbutton.get_value())
901
+
902
+ @m_text.append_text(value)
903
+ end
904
+
905
+ def onupdateShowProgress(event)
906
+ event.enable( @m_spinbutton.get_value() > 0 )
907
+ end
908
+
909
+ def onShowProgress(event)
910
+ max = @m_spinbutton.get_value()
911
+ if max <= 0
912
+ log_error("You must set positive range!")
913
+ return nil
914
+ end
915
+
916
+ dialog = ProgressDialog.new("Progress dialog example",
917
+ "An informative message",
918
+ max, # range
919
+ self, # parent
920
+ PD_CAN_ABORT |
921
+ PD_AUTO_HIDE |
922
+ PD_APP_MODAL |
923
+ PD_ELAPSED_TIME |
924
+ PD_ESTIMATED_TIME |
925
+ PD_REMAINING_TIME)
926
+
927
+ cont = TRUE
928
+ 0.upto(max) {|i|
929
+ break if !cont
930
+ sleep(1)
931
+ if i == max
932
+ cont = dialog.update(i, "That's all, folks!")
933
+ elsif i == max / 2
934
+ cont = dialog.update(i, "Only a half left (very long message)!")
935
+ else
936
+ cont = dialog.update(i)
937
+ end
938
+ }
939
+ dialog.destroy()
940
+ if !cont
941
+ @m_text << "Progress dialog aborted!\n"
942
+ else
943
+ @m_text << "Countdown from " << max << " finished.\n"
944
+ end
945
+ end
946
+
947
+ def onSizerCheck(event)
948
+ case event.get_id()
949
+ when ID_SIZER_CHECK1
950
+ @m_buttonSizer.show(@m_sizerBtn1, event.is_checked())
951
+ @m_buttonSizer.layout()
952
+ when ID_SIZER_CHECK2
953
+ @m_buttonSizer.show(@m_sizerBtn2, event.is_checked())
954
+ @m_buttonSizer.layout()
955
+ when ID_SIZER_CHECK3
956
+ @m_buttonSizer.show(@m_sizerBtn3, event.is_checked())
957
+ @m_buttonSizer.layout()
958
+ when ID_SIZER_CHECK4
959
+ @m_buttonSizer.show(@m_sizerBtn4, event.is_checked())
960
+ @m_buttonSizer.layout()
961
+ when ID_SIZER_CHECK14
962
+ @m_hsizer.show(@m_buttonSizer, event.is_checked())
963
+ @m_hsizer.layout()
964
+ when ID_SIZER_CHECKBIG
965
+ @m_hsizer.show(@m_bigBtn, event.is_checked())
966
+ @m_hsizer.layout()
967
+ end
968
+ end
969
+ end
970
+
971
+
972
+ class MyFrame < Frame
973
+ def initialize(title,x,y)
974
+ super(nil, -1, title, Point.new(x, y), Size.new(500, 430))
975
+
976
+ @s_delay = 5000
977
+ @s_enabled = TRUE
978
+ @s_enable2 = TRUE
979
+ @s_windowFocus = nil
980
+ mondrian_icon =
981
+ case Wx::PLATFORM
982
+ when "WXMSW"
983
+ Icon.new( File.join( File.dirname(__FILE__), "mondrian.ico"),
984
+ Wx::BITMAP_TYPE_ICO )
985
+ else
986
+ Icon.new( File.join( File.dirname(__FILE__), "mondrian.xpm"),
987
+ Wx::BITMAP_TYPE_XPM )
988
+ end
989
+
990
+ set_icon(mondrian_icon)
991
+
992
+ file_menu = Menu.new
993
+
994
+ file_menu.append(CONTROLS_CLEAR_LOG, "&clear log\tCtrl-L")
995
+ file_menu.append_separator()
996
+ file_menu.append(CONTROLS_ABOUT, "&About\tF1")
997
+ file_menu.append_separator()
998
+ file_menu.append(CONTROLS_QUIT, "E&xit\tAlt-X", "Quit controls sample")
999
+
1000
+ menu_bar = MenuBar.new
1001
+ menu_bar.append(file_menu, "&File")
1002
+
1003
+ tooltip_menu = Menu.new
1004
+ tooltip_menu.append(CONTROLS_SET_TOOLTIP_DELAY, "Set &delay\tCtrl-D")
1005
+ tooltip_menu.append_separator()
1006
+ tooltip_menu.append(CONTROLS_ENABLE_TOOLTIPS, "&Toggle tooltips\tCtrl-T",
1007
+ "enable/disable tooltips", ITEM_CHECK)
1008
+ tooltip_menu.check(CONTROLS_ENABLE_TOOLTIPS, TRUE)
1009
+ menu_bar.append(tooltip_menu, "&Tooltips")
1010
+
1011
+ panel_menu = Menu.new
1012
+ panel_menu.append(CONTROLS_ENABLE_ALL, "&Disable all\tCtrl-E",
1013
+ "enable/disable all panel controls", ITEM_CHECK)
1014
+ menu_bar.append(panel_menu, "&Panel")
1015
+
1016
+ set_menu_bar(menu_bar)
1017
+
1018
+ create_status_bar(2)
1019
+
1020
+ @m_panel = MyPanel.new( self, 10, 10, 300, 100 )
1021
+
1022
+ set_size_hints( 500, 425 )
1023
+
1024
+ evt_menu(CONTROLS_QUIT) {|event| onQuit(event) }
1025
+ evt_menu(CONTROLS_ABOUT) {|event| onAbout(event) }
1026
+ evt_menu(CONTROLS_CLEAR_LOG) {|event| onClearLog(event) }
1027
+ evt_menu(CONTROLS_SET_TOOLTIP_DELAY) {|event| onSetTooltipDelay(event) }
1028
+ evt_menu(CONTROLS_ENABLE_TOOLTIPS) {|event| onToggleTooltips(event) }
1029
+ evt_menu(CONTROLS_ENABLE_ALL) {|event| onenableAll(event) }
1030
+
1031
+ evt_size() {|event| onSize(event) }
1032
+ evt_move() {|event| onMove(event) }
1033
+ evt_idle() {|event| onIdle(event) }
1034
+ evt_close() {|event| onClose(event) }
1035
+ end
1036
+
1037
+ def onClose(event)
1038
+ Log::set_active_target(@m_panel.m_logTargetOld)
1039
+ destroy()
1040
+ end
1041
+
1042
+ def onQuit(event)
1043
+ close(TRUE)
1044
+ end
1045
+
1046
+ def onAbout(event)
1047
+ BusyCursor.busy do
1048
+ dialog = MessageDialog.new(self, "This is a control sample", "About Controls", OK)
1049
+ dialog.show_modal()
1050
+ end
1051
+ end
1052
+
1053
+ def onClearLog(event)
1054
+ @m_panel.m_text.clear()
1055
+ end
1056
+
1057
+ def onSetTooltipDelay(event)
1058
+ delay = @s_delay.to_s
1059
+
1060
+ delay = get_text_from_user("Enter delay (in milliseconds)",
1061
+ "Set tooltip delay",
1062
+ delay,
1063
+ self)
1064
+ if !delay
1065
+ return Qnil # cancelled
1066
+ end
1067
+
1068
+ @s_delay = delay.to_i
1069
+
1070
+ ToolTip::set_delay(@s_delay)
1071
+
1072
+ log_status(self, "Tooltip delay set to %d milliseconds", @s_delay)
1073
+ end
1074
+
1075
+ def onToggleTooltips(event)
1076
+ @s_enabled = ! @s_enabled
1077
+ ToolTip::enable(@s_enabled)
1078
+ log_status(self, "Tooltips %sabled", @s_enabled ? "en" : "dis" )
1079
+ end
1080
+
1081
+ def onenableAll(event)
1082
+ @s_enable2 = ! @s_enable2
1083
+ @m_panel.enable(@s_enable2)
1084
+ end
1085
+
1086
+ def onMove(event)
1087
+ update_status_bar(event.get_position(), get_size())
1088
+ event.skip()
1089
+ end
1090
+
1091
+ def onSize(event)
1092
+ update_status_bar(get_position(), event.get_size())
1093
+ event.skip()
1094
+ end
1095
+
1096
+ def onIdle(event)
1097
+
1098
+ # track the window which has the focus in the status bar
1099
+ focus = Window::find_focus()
1100
+ if focus && (focus != @s_windowFocus)
1101
+ @s_windowFocus = focus
1102
+ msg = sprintf( "Focus: %s, HWND = %08x",
1103
+ @s_windowFocus.wx_class,
1104
+ @s_windowFocus.get_handle )
1105
+ set_status_text(msg)
1106
+ end
1107
+ end
1108
+
1109
+ def GetPanel()
1110
+ @m_panel
1111
+ end
1112
+
1113
+ def update_status_bar(pos,size)
1114
+ if get_status_bar()
1115
+ sizeAll = get_size()
1116
+ sizeCl = get_client_size()
1117
+ msg = sprintf("pos=(%d, %d), size=%dx%d or %dx%d (client=%dx%d)",
1118
+ pos.x, pos.y,
1119
+ size.x, size.y,
1120
+ sizeAll.x, sizeAll.y,
1121
+ sizeCl.x, sizeCl.y)
1122
+ set_status_text(msg, 1)
1123
+ end
1124
+ end
1125
+
1126
+ end
1127
+
1128
+ class MyApp < App
1129
+ def on_init()
1130
+ # parse the cmd line
1131
+ x = 50
1132
+ y = 50
1133
+ # Create the main frame window
1134
+ frame = MyFrame.new("Controls Windows App", x, y)
1135
+ frame.show(TRUE)
1136
+ end
1137
+ end
1138
+
1139
+ a = MyApp.new
1140
+ a.main_loop