libguib 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/src/fxbase.rb ADDED
@@ -0,0 +1,855 @@
1
+ # Copyright (c) 2004-2006 by Henon (meinrad dot recheis at gmail dot com)
2
+
3
+ # Description: an adapter that simplifies the fox api
4
+ # reading this file gives you the information what widgets are currently implemented
5
+
6
+ # ~ if __FILE__==$0
7
+ # ~ require "fox14"
8
+ # ~ end
9
+
10
+ require "middle-right-mouse"
11
+ require "fxobjects"
12
+ require "radio_group"
13
+
14
+ # workaround for a fxruby 1.4.4 bug
15
+ if Fox.fxrubyversion == "1.4.4"
16
+ class Fox::FXMenuCaption
17
+ def text= text
18
+ @text = text
19
+ setText(text)
20
+ end
21
+
22
+ attr_reader :text
23
+ end
24
+ end
25
+
26
+ module FX
27
+ # mixin module definitions
28
+ module CheckState
29
+ def state=(x)
30
+ setCheck(x ? Fox::TRUE : Fox::FALSE)
31
+ end
32
+
33
+ def state
34
+ ((getCheckState == Fox::TRUE) ? true : false)
35
+ end
36
+ end
37
+
38
+ module RangeAccessor
39
+ def range= val
40
+ val = val.last..val.first if val.last < val.first
41
+ setRange val
42
+ end
43
+
44
+ def range
45
+ getRange
46
+ end
47
+ end
48
+
49
+ module RadioMutexInterface
50
+ def init_radio_mutex
51
+ @radioGroup = RadioGroup.new
52
+ @radioGroup.on_event_selected { |r| event_selected(r) }
53
+ end
54
+
55
+ def add_radio_option widget
56
+ @radioGroup << widget
57
+ end
58
+
59
+ def selected_radio
60
+ @radioGroup.selected
61
+ end
62
+ end
63
+
64
+ # class definitions
65
+ class ArrowButton < Fox::FXArrowButton
66
+ def initialize(p, opts = 0)
67
+ super(p, nil, 0, opts | Fox::ARROW_NORMAL)
68
+ end
69
+ end
70
+
71
+ class Button < Fox::FXButton
72
+ include Responder
73
+ include RightBtn
74
+ include MiddleBtn
75
+ def initialize(p, opts = 0)
76
+ super(p, "Button", nil, nil, 0, Fox::BUTTON_NORMAL | opts)
77
+ handleMMB_Events
78
+ handleRMB_Events
79
+ end
80
+
81
+ def state=(x)
82
+ if x == true
83
+ setState(Fox::STATE_DOWN)
84
+ elsif x == false
85
+ setState(Fox::STATE_UP)
86
+ elsif x.class == Integer
87
+ setState(x)
88
+ end
89
+ end
90
+
91
+ def state
92
+ if getState == Fox::STATE_DOWN then return true
93
+ elsif getState == Fox::STATE_CHECKED then return true
94
+ end
95
+ false
96
+ end
97
+ alias_method :buttonButtonStyle=, :buttonStyle=
98
+ alias_method :buttonButtonStyle, :buttonStyle
99
+ end
100
+ # ~ class Calendar < Fox::FXCalendar
101
+ # ~ def initialize(p, opts=0)
102
+ # ~ super p, initial_date=Time.now, tgt=nil, sel=0, opts
103
+
104
+ # ~ end
105
+ # ~ end
106
+ class Canvas < Fox::FXCanvas
107
+ def initialize(p, opts = 0)
108
+ super(p)
109
+ end
110
+ end
111
+
112
+ class CheckButton < Fox::FXCheckButton
113
+ def initialize(p, opts = 0)
114
+ super(p, "CheckButton")
115
+ end
116
+ include CheckState
117
+ end
118
+
119
+ class ComboBox < Fox::FXComboBox
120
+ def initialize(p, opts = 0)
121
+ super(p, 10, nil, 0, opts | Fox::FRAME_SUNKEN)
122
+ end
123
+
124
+ def comboItems= string
125
+ c = currentItem
126
+ clearItems
127
+ array = string.split(/\r?\n/)
128
+ array.each { |s|
129
+ appendItem s
130
+ }
131
+ self.numVisible = array.size
132
+ begin
133
+ self.currentItem = c
134
+ rescue Exception
135
+ end
136
+ end
137
+
138
+ def comboItems
139
+ array = []
140
+ each { |text, d|
141
+ array << text
142
+ }
143
+ array.join("\n")
144
+ end
145
+
146
+ def auto_resize
147
+ size = 0
148
+ each { |text, d|
149
+ size = text.size if size < text.size
150
+ }
151
+ self.numColumns = size
152
+ self.numVisible = numItems
153
+ end
154
+ end
155
+
156
+ class Dial < Fox::FXDial
157
+ def initialize(p, opts = 0)
158
+ super(p, nil, 0, opts | Fox::DIAL_NORMAL)
159
+ end
160
+ end
161
+
162
+ class DialogBox < Fox::FXDialogBox
163
+ def initialize(p, opts = 0)
164
+ # @eventListeners=[]
165
+ super(p, "title", Fox::DECOR_ALL)
166
+ pad(0, 0, 0, 0)
167
+ handleMMB_Events
168
+ end
169
+ # attr_accessor :eventListeners
170
+ include Responder
171
+ include MiddleBtn
172
+ # ~ def show(*args)
173
+ # ~ #dbg
174
+ # ~ @eventListeners.each{|el| el.on_event "DialogBox.show", self }
175
+ # ~ create if $fxapp.created? and not created?
176
+ # ~ super
177
+ # ~ end
178
+
179
+ # ~ def hide(*args)
180
+ # ~ #dbg
181
+ # ~ @eventListeners.each{|el| el.on_event "DialogBox.hide", self }
182
+ # ~ super
183
+ # ~ end
184
+
185
+ # ~ def destroy(*args)
186
+ # ~ #dbg
187
+ # ~ @eventListeners.each{|el| el.on_event "DialogBox.destroy", self }
188
+ # ~ super
189
+ # ~ end
190
+ end
191
+
192
+ class DirBox < Fox::FXDirBox
193
+ def initialize(p, opts = 0)
194
+ super(p, nil, 0, opts | Fox::FRAME_SUNKEN | Fox::TREELISTBOX_NORMAL)
195
+ end
196
+ end
197
+
198
+ class DirList < Fox::FXDirList
199
+ def initialize(p, opts = 0)
200
+ super(p, nil, 0, opts)
201
+ end
202
+ end
203
+
204
+ class DriveBox < Fox::FXDriveBox
205
+ def initialize(p, opts = 0)
206
+ super(p, nil, 0, opts | Fox::FRAME_SUNKEN | Fox::LISTBOX_NORMAL)
207
+ end
208
+ end
209
+
210
+ class FileList < Fox::FXFileList
211
+ def initialize(p, opts = 0)
212
+ super(p, nil, 0, opts | Fox::LAYOUT_FILL_X | Fox::LAYOUT_FILL_Y)
213
+ end
214
+ end
215
+
216
+ class Header < Fox::FXHeader
217
+ def initialize(p, opts = 0)
218
+ super(p, nil, 0, opts | Fox::LAYOUT_FILL_X | Fox::LAYOUT_FILL_Y | Fox::HEADER_NORMAL)
219
+ end
220
+ end
221
+
222
+ class GroupBox < Fox::FXGroupBox
223
+ def initialize(p, opts = 0)
224
+ super(p, "GroupBox", opts | Fox::FRAME_GROOVE, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4)
225
+ end
226
+ end
227
+
228
+ class HorizontalFrame < Fox::FXHorizontalFrame
229
+ def initialize(p, opts = 0)
230
+ super(p, opts | Fox::LAYOUT_FILL_X | Fox::LAYOUT_FILL_Y, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
231
+ end
232
+ end
233
+
234
+ class HorizontalSeparator < Fox::FXHorizontalSeparator
235
+ def initialize(p, opts = Fox::SEPARATOR_GROOVE)
236
+ super(p, Fox::LAYOUT_FILL_X | opts)
237
+ end
238
+ end
239
+
240
+ class IconList < Fox::FXIconList
241
+ def initialize(p, opts = 0)
242
+ super(p, nil, 0, opts | Fox::LAYOUT_FILL_X | Fox::LAYOUT_FILL_Y | Fox::HEADER_NORMAL)
243
+ end
244
+ alias_method :iconListStyle=, :listStyle=
245
+ alias_method :iconListStyle, :listStyle
246
+
247
+ def addItems names, imagefiles
248
+ names.size.times do |i|
249
+ img = loadImage(imagefiles[i])
250
+ appendItem(names[i], nil, img)
251
+ end
252
+ end
253
+ end
254
+
255
+ class Label < Fox::FXLabel
256
+ def initialize(p, opts = 0)
257
+ super(p, "Label")
258
+ end
259
+ end
260
+
261
+ class List < Fox::FXList
262
+ def initialize(p, opts = 0)
263
+ super(p, nil, 0, opts | Fox::LAYOUT_FILL_X | Fox::LAYOUT_FILL_Y | Fox::LIST_NORMAL)
264
+ end
265
+ alias_method :listListStyle=, :listStyle=
266
+ alias_method :listListStyle, :listStyle
267
+ end
268
+
269
+ class ListBox < Fox::FXListBox
270
+ def initialize(p, opts = 0)
271
+ super(p, nil, 0, opts | Fox::FRAME_SUNKEN | Fox::LISTBOX_NORMAL)
272
+ end
273
+ end
274
+
275
+ class MainWindow < Fox::FXMainWindow
276
+ # accepts app or any widget as parent
277
+ def initialize(p, opts = 0)
278
+ p = p.app if p.is_a? Fox::FXId
279
+ super(p, "MainWindow", nil, nil, Fox::DECOR_ALL)
280
+ end
281
+ end
282
+
283
+ class Matrix < Fox::FXMatrix
284
+ def initialize(p, opts = 0)
285
+ super(p, 1, opts | Fox::MATRIX_BY_ROWS | Fox::LAYOUT_FILL_X | Fox::LAYOUT_FILL_Y)
286
+ @cols = self.numColumns = 1
287
+ @rows = self.numRows = 1
288
+ end
289
+
290
+ # update the dimension when switching matrix by rows/columns
291
+ def matrixStyle=code
292
+ super
293
+ numColumns = @cols
294
+ numRows = @rows
295
+ end
296
+
297
+ def numColumns=(int)
298
+ super(@cols = dim_check(int))
299
+ end
300
+
301
+ def numRows=(int)
302
+ super(@rows = dim_check(int))
303
+ end
304
+
305
+ def dim_check int
306
+ # dimension must be a Numeric > 0
307
+ return 1 if int < 1
308
+ return 1 unless int.is_a?(Numeric)
309
+ int
310
+ end
311
+ end
312
+
313
+ class MDIClient < Fox::FXMDIClient
314
+ def initialize(p, opts = 0)
315
+ super(p, opts | Fox::LAYOUT_FILL_X | Fox::LAYOUT_FILL_Y)
316
+ end
317
+ end
318
+
319
+ class MenuButton < Fox::FXMenuButton
320
+ include Responder
321
+ include MiddleBtn
322
+ def initialize(p, opts = 0)
323
+ super(p, "MenuButton", nil, nil, opts | Fox::JUSTIFY_NORMAL | Fox::ICON_BEFORE_TEXT | Fox::MENUBUTTON_DOWN)
324
+ handleMMB_Events
325
+ end
326
+ alias_method :menuButtonStyle=, :buttonStyle=
327
+ alias_method :menuButtonStyle, :buttonStyle
328
+ end
329
+
330
+ class MenuCaption < Fox::FXMenuCaption
331
+ include Responder
332
+ include MiddleBtn
333
+ def initialize(p, opts = 0)
334
+ @text = text if Fox.fxrubyversion == "1.4.4"
335
+ super(p, "MenuCaption")
336
+ handleMMB_Events
337
+ end
338
+ end
339
+
340
+ class MenuCascade < Fox::FXMenuCascade
341
+ include Responder
342
+ include MiddleBtn
343
+ def initialize(p, text = "MenuCascade")
344
+ @text = text if Fox.fxrubyversion == "1.4.4"
345
+ super
346
+ handleMMB_Events
347
+ end
348
+ end
349
+
350
+ class MenuCheck < Fox::FXMenuCheck
351
+ include Responder
352
+ include MiddleBtn
353
+ include CheckState
354
+ def initialize(p, text = "MenuCheck")
355
+ @text = text if Fox.fxrubyversion == "1.4.4"
356
+ super
357
+ end
358
+ end
359
+
360
+ class MenuCommand < Fox::FXMenuCommand
361
+ include Responder
362
+ include MiddleBtn
363
+ def initialize(p, text = "MenuCommand")
364
+ @text = text if Fox.fxrubyversion == "1.4.4"
365
+ super
366
+ handleMMB_Events
367
+ end
368
+ end
369
+
370
+ class MenuPane < Fox::FXMenuPane
371
+ include Responder
372
+ include MiddleBtn
373
+ include RadioMutexInterface
374
+ def initialize(p, opts = 0)
375
+ init_radio_mutex
376
+ super(p)
377
+ p.menu = self
378
+ handleMMB_Events
379
+ end
380
+ end
381
+
382
+ class MenuRadio < Fox::FXMenuRadio
383
+ include Responder
384
+ include MiddleBtn
385
+ include CheckState
386
+ def initialize(p, text = "MenuRadio")
387
+ @text = text if Fox.fxrubyversion == "1.4.4"
388
+ super
389
+ parent.add_radio_option self if parent.respond_to? :add_radio_option
390
+ end
391
+ end
392
+
393
+ class MenuTitle < Fox::FXMenuTitle
394
+ include Responder
395
+ include MiddleBtn
396
+ def initialize(p, text = "MenuTitle")
397
+ @text = text if Fox.fxrubyversion == "1.4.4"
398
+ super
399
+ handleMMB_Events
400
+ end
401
+ end
402
+
403
+ class MenuBar < Fox::FXMenuBar
404
+ def initialize(p, opts = 0)
405
+ super(p, opts | Fox::LAYOUT_FILL_X)
406
+ handleMMB_Events
407
+ end
408
+ include Responder
409
+ include MiddleBtn
410
+ end
411
+
412
+ class MenuSeparator < Fox::FXMenuSeparator
413
+ def initialize(p, opts = 0)
414
+ super
415
+ handleMMB_Events
416
+ end
417
+ include Responder
418
+ include MiddleBtn
419
+ end
420
+
421
+ class Option < Fox::FXOption
422
+ def initialize(p, opts = 0)
423
+ super(p, "Option", nil, nil, 0, opts | Fox::JUSTIFY_NORMAL | Fox::ICON_BEFORE_TEXT)
424
+ handleMMB_Events
425
+ end
426
+ include Responder
427
+ include MiddleBtn
428
+ end
429
+
430
+ class OptionMenu < Fox::FXOptionMenu
431
+ def initialize(p, opts = 0)
432
+ super(p, nil, opts | Fox::JUSTIFY_NORMAL | Fox::ICON_BEFORE_TEXT)
433
+ handleMMB_Events
434
+ end
435
+ include Responder
436
+ include MiddleBtn
437
+ # alias :menu= :popup=
438
+ # alias :menu :popup
439
+ end
440
+
441
+ class Packer < Fox::FXPacker
442
+ def initialize(p, opts = 0)
443
+ super(p, opts | Fox::LAYOUT_FILL_X | Fox::LAYOUT_FILL_Y, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0)
444
+ end
445
+ end
446
+
447
+ class Popup < Fox::FXPopup
448
+ def initialize(p, opts = 0)
449
+ init_radio_mutex
450
+ super(p, opts | Fox::POPUP_VERTICAL | Fox::FRAME_RAISED | Fox::FRAME_THICK)
451
+ handleMMB_Events
452
+ end
453
+ include Responder
454
+ include MiddleBtn
455
+ include RadioMutexInterface
456
+ end
457
+
458
+ class ProgressBar < Fox::FXProgressBar
459
+ def initialize(p, opts = 0)
460
+ super(p, nil, 0, opts | Fox::LAYOUT_FILL_X)
461
+ self.displayText = Fox::TRUE
462
+ end
463
+
464
+ def displayText=bool
465
+ @displaysText = bool
466
+ bool ? showNumber : hideNumber
467
+ end
468
+
469
+ def displayText
470
+ @displaysText = Fox::FALSE if @displaysText.nil?
471
+ @displaysText
472
+ end
473
+ end
474
+
475
+ class RadioButton < Fox::FXRadioButton
476
+ def initialize(p, opts = 0)
477
+ super(p, "RadioButton", nil, 0, opts | Fox::ICON_BEFORE_TEXT)
478
+ parent.add_radio_option self if parent.respond_to? :add_radio_option
479
+ end
480
+ include CheckState
481
+ end
482
+
483
+ class ScrollArea < Fox::FXScrollArea
484
+ def initialize(p, opts = 0)
485
+ super(p)
486
+ self.layoutHints = Fox::LAYOUT_FILL_X | Fox::LAYOUT_FILL_Y
487
+ end
488
+ end
489
+
490
+ class ScrollBar < Fox::FXScrollBar
491
+ def initialize(p, opts = 0)
492
+ super(p)
493
+ end
494
+ alias_method :contentSize, :range
495
+ alias_method :contentSize=, :range=
496
+ end
497
+
498
+ class ScrollWindow < Fox::FXScrollWindow
499
+ def initialize(p, opts = 0)
500
+ super(p)
501
+ self.layoutHints = Fox::LAYOUT_FILL_X | Fox::LAYOUT_FILL_Y
502
+ end
503
+ end
504
+
505
+ class Shutter < Fox::FXShutter
506
+ def initialize(p, opts = 0)
507
+ super(p, nil, 0, opts | Fox::LAYOUT_FILL_X | Fox::LAYOUT_FILL_Y | Fox::LAYOUT_TOP | Fox::LAYOUT_LEFT | Fox::FRAME_SUNKEN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
508
+ handleMMB_Events
509
+ end
510
+ include Responder
511
+ include MiddleBtn
512
+ end
513
+
514
+ class ShutterItem < Fox::FXShutterItem
515
+ def initialize(p, opts = 0)
516
+ super(p, "ShutterItem", nil, opts | Fox::LAYOUT_FILL_X | Fox::LAYOUT_TOP | Fox::LAYOUT_LEFT, 0, 0, 0, 0, 2, 2, 4, 4, 4, 4)
517
+ # ~ button.frameStyle=Fox::FRAME_NONE
518
+ # ~ content.frameStyle=Fox::FRAME_NONE
519
+ button.padBottom = 3
520
+ button.padTop = 3
521
+ button.padLeft = 5
522
+ button.padRight = 5
523
+ handleMMB_Events
524
+ end
525
+
526
+ def text=(text)
527
+ button.text = text
528
+ end
529
+
530
+ def text
531
+ button.text
532
+ end
533
+ include Responder
534
+ include MiddleBtn
535
+ end
536
+
537
+ class Slider < Fox::FXSlider
538
+ def initialize(p, opts = 0)
539
+ super(p, nil, 0, opts | Fox::SLIDER_NORMAL | Fox::LAYOUT_FILL_X)
540
+ end
541
+ include RangeAccessor
542
+ end
543
+
544
+ class Spinner < Fox::FXSpinner
545
+ def initialize(p, opts = 0)
546
+ super(p, 3, nil, 0, opts | Fox::FRAME_SUNKEN)
547
+ end
548
+ include RangeAccessor
549
+ end
550
+
551
+ class Splitter < Fox::FXSplitter
552
+ def initialize(p, opts = 0)
553
+ super(p)
554
+ self.layoutHints = Fox::LAYOUT_FILL_X | Fox::LAYOUT_FILL_Y
555
+ end
556
+ end
557
+
558
+ class Switcher < Fox::FXSwitcher
559
+ def initialize(p, opts = 0)
560
+ super
561
+ end
562
+
563
+ def current=(*args)
564
+ super
565
+ rescue Exception
566
+ end
567
+ end
568
+
569
+ class StatusBar < Fox::FXStatusBar
570
+ def initialize(p, opts = 0)
571
+ super(p, opts | Fox::LAYOUT_FILL_X)
572
+ end
573
+ end
574
+
575
+ class StatusLine < Fox::FXStatusLine
576
+ def initialize(p, opts = 0)
577
+ super(p)
578
+ end
579
+ end
580
+
581
+ module TabBarInterface
582
+ attr_reader :tabs
583
+ def create_tab(text = "TabItem")
584
+ @tabs ||= []
585
+ TabItem.new(self) { |i|
586
+ @tabs << i
587
+ i.text = text
588
+ }
589
+ end
590
+
591
+ def remove_tab tab
592
+ @tabs.delete tab
593
+ removeChild(tab)
594
+ end
595
+ end
596
+
597
+ class TabBar < Fox::FXTabBar
598
+ include TabBarInterface
599
+ def initialize(p, opts = 0)
600
+ super(p, nil, 0, opts | Fox::LAYOUT_FILL_X)
601
+ end
602
+ end
603
+
604
+ class TabBook < Fox::FXTabBook
605
+ include TabBarInterface
606
+ def initialize(p, opts = 0)
607
+ super(p, nil, 0, opts | Fox::LAYOUT_FILL_X | Fox::LAYOUT_FILL_Y)
608
+ end
609
+ end
610
+
611
+ class TabItem < Fox::FXTabItem
612
+ def initialize(p, opts = 0)
613
+ super(p, "TabItem")
614
+ end
615
+
616
+ def index
617
+ parent.tabs.index(self)
618
+ end
619
+ end
620
+
621
+ class Text < Fox::FXText
622
+ def initialize(p, opts = 0)
623
+ super(p, nil, 0, opts | Fox::LAYOUT_FILL_X | Fox::LAYOUT_FILL_Y)
624
+ text = "Text"
625
+ end
626
+ alias_method :textTextStyle=, :textStyle=
627
+ alias_method :textTextStyle, :textStyle
628
+ end
629
+
630
+ class TextField < Fox::FXTextField
631
+ def initialize(p, opts = 0)
632
+ super(p, 10, nil, 0, opts | Fox::FRAME_SUNKEN)
633
+ text = "TextField"
634
+ end
635
+
636
+ def text=(*args)
637
+ args.collect! { |a| a.to_s }
638
+ super
639
+ end
640
+
641
+ alias_method :textFieldTextStyle=, :textStyle=
642
+ alias_method :textFieldTextStyle, :textStyle
643
+ end
644
+
645
+ class ToggleButton < Fox::FXToggleButton
646
+ def initialize p, opts = 0
647
+ super(p, "Toggle", "Button", nil, nil, nil, 0, opts | Fox::TOGGLEBUTTON_KEEPSTATE)
648
+ end
649
+
650
+ def altImg= filename
651
+ if filename.size > 0
652
+ setAltIcon loadImage(filename)
653
+ @alt_icon_filename = filename
654
+ end
655
+ end
656
+
657
+ def altImg
658
+ @alt_icon_filename.to_s
659
+ end
660
+ end
661
+
662
+ class ToolBar < Fox::FXToolBar
663
+ def initialize(p, opts = 0)
664
+ super(p, opts | Fox::LAYOUT_FILL_X)
665
+ end
666
+ end
667
+
668
+ class TreeList < Fox::FXTreeList
669
+ def initialize(p, opts = 0)
670
+ super(p, nil, 0, opts | Fox::LAYOUT_FILL_X | Fox::LAYOUT_FILL_Y)
671
+ end
672
+ alias_method :treeListStyle=, :listStyle=
673
+ alias_method :treeListStyle, :listStyle
674
+
675
+ def initialize_language_ids
676
+ each { |ti|
677
+ ti.initialize_language_ids
678
+ }
679
+ end
680
+ end
681
+
682
+ class VerticalFrame < Fox::FXVerticalFrame
683
+ def initialize(p, opts = 0)
684
+ super(p, opts | Fox::LAYOUT_FILL_X | Fox::LAYOUT_FILL_Y, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
685
+ end
686
+ end
687
+
688
+ class VerticalSeparator < Fox::FXVerticalSeparator
689
+ def initialize(p, opts = Fox::SEPARATOR_GROOVE)
690
+ super(p, Fox::LAYOUT_FILL_Y | opts)
691
+ end
692
+ end
693
+
694
+ class WidgetTable < GroupBox
695
+ def initialize(p, opts = 0)
696
+ @c = {}
697
+ @r = []
698
+ @nc = 0
699
+ super
700
+ self.text = ""
701
+ self.vSpacing = 0
702
+ self.frameStyle = FRAME_NONE
703
+ # ~ self.layoutHints=Fox::LAYOUT_FILL_X|Fox::LAYOUT_FILL_Y
704
+ pad 2, 2, 2, 2
705
+ end
706
+
707
+ def rows
708
+ @r.size
709
+ end
710
+
711
+ def cols
712
+ @nc
713
+ end
714
+
715
+ def size=(w, h)
716
+ # TODO implement
717
+ end
718
+
719
+ def add_col
720
+ @nc += 1
721
+ @r.each_with_index { |r, y|
722
+ VerticalFrame.new(r) { |f|
723
+ @c[[@nc - 1, y]] = f
724
+ f.pad 0, 0, 0, 0
725
+ }
726
+ }
727
+ end
728
+
729
+ def add_row
730
+ HorizontalFrame.new(self) { |h|
731
+ h.frameStyle = FRAME_NONE
732
+ h.pad 0, 0, 0, 0
733
+ h.layoutHints = Fox::LAYOUT_FILL_X # |Fox::LAYOUT_FILL_Y
734
+ @r << h
735
+ # new row has to have as many cols as other rows
736
+ @nc.times { |x|
737
+ VerticalFrame.new(h) { |f|
738
+ @c[[x, rows - 1]] = f
739
+ f.pad 0, 0, 0, 0
740
+ }
741
+ }
742
+ }
743
+ end
744
+
745
+ def cell(x, y)
746
+ # ~ puts [x,y].inspect
747
+ @c[[x, y]]
748
+ end
749
+ end
750
+
751
+ class RadioMutex < FX::VerticalFrame
752
+ __sends__ :event_selected
753
+ def initialize(p)
754
+ init_radio_mutex
755
+ super
756
+ self.layoutHints = 0
757
+ end
758
+ include RadioMutexInterface
759
+ end
760
+
761
+ # ~~~~~~~~~~~~~~~~~~~~~~~
762
+ # the following constant definitions are for backward compatibility
763
+ # they allow to load old rbins
764
+ Menubar = MenuBar
765
+ Toolbar = ToolBar
766
+ Scrollbar = ScrollBar
767
+ Statusbar = StatusBar
768
+ Statusline = StatusLine
769
+ # ToolbarShell=ToolBarShell
770
+ # ToolbarGrip=ToolBarGrip
771
+ # ~~~~~~~~~~~~~~~~~~~~~~~
772
+ end # module FX
773
+
774
+ class Fox::FXId
775
+ attr_accessor :wdg_name # a user-given name to identify the wdg
776
+ # overwriting app to return the type FX::App instead of the Fox::FXApp
777
+ def app
778
+ $fxapp
779
+ end
780
+ end
781
+
782
+ class Fox::FXWindow
783
+ def enabled=bool
784
+ bool ? enable : disable
785
+ end
786
+ alias_method :enabled, :enabled?
787
+
788
+ def visible=bool
789
+ bool ? show : hide
790
+ end
791
+ alias_method :visible?, :shown
792
+ alias_method :visible, :shown
793
+
794
+ def pad(*args)
795
+ args[0] ? self.padLeft = args[0] : nil
796
+ args[1] ? self.padRight = args[1] : nil
797
+ args[2] ? self.padTop = args[2] : nil
798
+ args[3] ? self.padBottom = args[3] : nil
799
+ end
800
+
801
+ def padding
802
+ [padLeft, padRight, padTop, padBottom]
803
+ end
804
+
805
+ # iterates recursively over all children and executes &block
806
+ # calls the block also for self
807
+ def recursive(&block) # {|wdg| ... }
808
+ if block
809
+ yield(self)
810
+ children.each { |child| child.recursive(&block) }
811
+ end
812
+ end
813
+ end
814
+
815
+ module ImgAccessors
816
+ def img= filename
817
+ raise TypeError unless filename.is_a? String
818
+ if filename.size > 0
819
+ setIcon loadImage(filename)
820
+ @icon_filename = filename
821
+ end
822
+ end
823
+
824
+ def img
825
+ @icon_filename.to_s
826
+ end
827
+ end
828
+
829
+ class Fox::FXLabel
830
+ include ImgAccessors
831
+ end
832
+
833
+ class Fox::FXMenuCaption
834
+ include ImgAccessors
835
+ end
836
+
837
+ if __FILE__ == $0
838
+ $stdout.sync = true
839
+ c = FX::Color.new 200, 10, 0, 50
840
+ c.from_s(c.to_s)
841
+ puts c.inspect
842
+ c.from_FXColor(c.to_FXColor)
843
+ puts c.inspect
844
+ fd = Fox::FXFontDesc.new.to_s
845
+ app = Fox::FXApp.new "", ""
846
+ mw = FX::DialogBox.new app
847
+ check = FX::CheckButton.new mw
848
+ mw.show(0)
849
+ check.connect(Fox::SEL_COMMAND) {
850
+ p check.checked?
851
+ }
852
+ check.state = true
853
+ app.create
854
+ app.run
855
+ end