fxruby 1.6.5 → 1.6.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. data/doc/apes02.html +2 -2
  2. data/doc/apes03.html +1 -1
  3. data/doc/book.html +1 -1
  4. data/doc/changes.html +55 -21
  5. data/doc/differences.html +9 -9
  6. data/doc/implementation.html +1 -1
  7. data/doc/library.html +5 -5
  8. data/doc/opengl.html +5 -5
  9. data/doc/pt02.html +1 -1
  10. data/doc/scintilla.html +4 -4
  11. data/doc/subversion.html +1 -1
  12. data/examples/accell.rb +36 -0
  13. data/examples/babelfish.rb +6 -9
  14. data/examples/bounce.rb +5 -4
  15. data/examples/button.rb +19 -21
  16. data/examples/datatarget.rb +9 -8
  17. data/examples/dctest.rb +7 -13
  18. data/examples/dialog.rb +12 -16
  19. data/examples/dilbert.rb +4 -4
  20. data/examples/dirlist.rb +6 -5
  21. data/examples/dragdrop.rb +30 -33
  22. data/examples/dragsource.rb +22 -22
  23. data/examples/dropsite.rb +16 -17
  24. data/examples/foursplit.rb +8 -13
  25. data/examples/gltest.rb +21 -24
  26. data/examples/glviewer.rb +56 -58
  27. data/examples/header.rb +25 -25
  28. data/examples/iconlist.rb +12 -8
  29. data/examples/image.rb +36 -34
  30. data/examples/imageviewer.rb +44 -43
  31. data/examples/inputs.rb +15 -15
  32. data/examples/mditest.rb +6 -5
  33. data/examples/pig.rb +1 -0
  34. data/examples/raabrowser.rb +31 -40
  35. data/examples/ratio.rb +27 -16
  36. data/examples/rulerview.rb +4 -3
  37. data/examples/scribble.rb +14 -17
  38. data/examples/shutter.rb +10 -9
  39. data/examples/splitter.rb +7 -6
  40. data/examples/tabbook.rb +59 -17
  41. data/examples/table.rb +12 -16
  42. data/ext/fox16/FXRuby.cpp +2 -2
  43. data/lib/fox16/glshapes.rb +6 -6
  44. data/lib/fox16/iterators.rb +13 -8
  45. data/lib/fox16/kwargs.rb +604 -380
  46. data/lib/fox16/version.rb +1 -1
  47. data/tests/TC_FXTreeList.rb +13 -13
  48. data/tests/TC_FXTreeListBox.rb +3 -3
  49. metadata +4 -3
data/examples/header.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'fox16'
4
+ require 'fox16/kwargs'
4
5
 
5
6
  include Fox
6
7
 
@@ -13,7 +14,7 @@ class HeaderWindow < FXMainWindow
13
14
 
14
15
  def initialize(app)
15
16
  # Invoke base class initializer first
16
- super(app, "Header Control Test", nil, nil, DECOR_ALL, 0, 0, 800, 600)
17
+ super(app, "Header Control Test", :opts => DECOR_ALL, :width => 800, :height => 600)
17
18
 
18
19
  # Menu bar stretched along the top of the main window
19
20
  menubar = FXMenuBar.new(self, LAYOUT_SIDE_TOP|LAYOUT_FILL_X)
@@ -29,34 +30,35 @@ class HeaderWindow < FXMainWindow
29
30
 
30
31
  # Help menu
31
32
  helpmenu = FXMenuPane.new(self)
32
- FXMenuCommand.new(helpmenu, "&About Header...").connect(SEL_COMMAND) {
33
+ FXMenuCommand.new(helpmenu, "&About Header...").connect(SEL_COMMAND) do
33
34
  FXMessageBox.information(self, MBOX_OK, "About Header",
34
35
  "An example of how to work with the header control.")
35
- }
36
+ end
36
37
  FXMenuTitle.new(menubar, "&Help", nil, helpmenu, LAYOUT_RIGHT)
37
38
 
38
39
  # Make Main Window contents
39
40
  contents = FXVerticalFrame.new(self,
40
41
  FRAME_SUNKEN|FRAME_THICK|LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y,
41
- 0,0,0,0, 0,0,0,0, 0,0)
42
+ :padLeft => 0, :padRight => 0, :padTop => 0, :padBottom => 0,
43
+ :hSpacing => 0, :vSpacing => 0)
42
44
 
43
45
  # Make header control
44
- @header1 = FXHeader.new(contents, nil, 0,
45
- HEADER_BUTTON|HEADER_RESIZE|FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_X)
46
- @header1.connect(SEL_CHANGED) { |sender, sel, which|
46
+ @header1 = FXHeader.new(contents,
47
+ :opts => HEADER_BUTTON|HEADER_RESIZE|FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_X)
48
+ @header1.connect(SEL_CHANGED) do |sender, sel, which|
47
49
  @lists[which].width = @header1.getItemSize(which)
48
- }
49
- @header1.connect(SEL_COMMAND) { |sender, sel, which|
50
+ end
51
+ @header1.connect(SEL_COMMAND) do |sender, sel, which|
50
52
  @lists[which].numItems.times do |i|
51
53
  @lists[which].selectItem(i)
52
54
  end
53
- }
55
+ end
54
56
 
55
57
  # Document icon
56
58
  doc = nil
57
- File.open(File.join("icons", "minidoc.png"), "rb") { |f|
59
+ File.open(File.join("icons", "minidoc.png"), "rb") do |f|
58
60
  doc = FXPNGIcon.new(getApp(), f.read)
59
- }
61
+ end
60
62
 
61
63
  @header1.appendItem("Name", doc, 150)
62
64
  @header1.appendItem("Type", nil, 140)
@@ -66,18 +68,15 @@ class HeaderWindow < FXMainWindow
66
68
  # Below header
67
69
  panes = FXHorizontalFrame.new(contents,
68
70
  FRAME_SUNKEN|FRAME_THICK|LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y,
69
- 0,0,0,0, 0,0,0,0, 0,0)
71
+ :padLeft => 0, :padRight => 0, :padTop => 0, :padBottom => 0,
72
+ :hSpacing => 0, :vSpacing => 0)
70
73
 
71
74
  # Make 4 lists
72
75
  @lists = []
73
- @lists.push(FXList.new(panes, nil, 0,
74
- LAYOUT_FILL_Y|LAYOUT_FIX_WIDTH|LIST_BROWSESELECT, 0, 0, 150, 0))
75
- @lists.push(FXList.new(panes, nil, 0,
76
- LAYOUT_FILL_Y|LAYOUT_FIX_WIDTH|LIST_SINGLESELECT, 0, 0, 140, 0))
77
- @lists.push(FXList.new(panes, nil, 0,
78
- LAYOUT_FILL_Y|LAYOUT_FIX_WIDTH|LIST_MULTIPLESELECT, 0, 0, 230, 0))
79
- @lists.push(FXList.new(panes, nil, 0,
80
- LAYOUT_FILL_Y|LAYOUT_FIX_WIDTH|LIST_EXTENDEDSELECT, 0, 0, 80, 0))
76
+ @lists.push(FXList.new(panes, :opts => LAYOUT_FILL_Y|LAYOUT_FIX_WIDTH|LIST_BROWSESELECT, :width => 150))
77
+ @lists.push(FXList.new(panes, :opts => LAYOUT_FILL_Y|LAYOUT_FIX_WIDTH|LIST_SINGLESELECT, :width => 140))
78
+ @lists.push(FXList.new(panes, :opts => LAYOUT_FILL_Y|LAYOUT_FIX_WIDTH|LIST_MULTIPLESELECT, :width => 230))
79
+ @lists.push(FXList.new(panes, :opts => LAYOUT_FILL_Y|LAYOUT_FIX_WIDTH|LIST_EXTENDEDSELECT, :width => 80))
81
80
 
82
81
  @lists[0].backColor = FXRGB(255, 240, 240)
83
82
  @lists[1].backColor = FXRGB(240, 255, 240)
@@ -113,8 +112,8 @@ class HeaderWindow < FXMainWindow
113
112
  @lists[3].appendItem("E")
114
113
  @lists[3].appendItem("F")
115
114
 
116
- @header2 = FXHeader.new(panes, nil, 0,
117
- HEADER_VERTICAL|HEADER_BUTTON|HEADER_RESIZE|FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_Y)
115
+ @header2 = FXHeader.new(panes,
116
+ :opts => HEADER_VERTICAL|HEADER_BUTTON|HEADER_RESIZE|FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_Y)
118
117
  @header2.appendItem("Example", nil, 30)
119
118
  @header2.appendItem("Of", nil, 30)
120
119
  @header2.appendItem("Vertical", nil, 30)
@@ -125,10 +124,11 @@ class HeaderWindow < FXMainWindow
125
124
  GROUPBOX_TITLE_CENTER|LAYOUT_FILL_X|LAYOUT_FILL_Y)
126
125
  check = FXCheckButton.new(groupie,
127
126
  "Continuous Tracking\tContinuous\tTrack Header continuously",
128
- nil, 0, ICON_BEFORE_TEXT|LAYOUT_SIDE_TOP).connect(SEL_COMMAND) {
127
+ :opts => ICON_BEFORE_TEXT|LAYOUT_SIDE_TOP)
128
+ check.connect(SEL_COMMAND) do
129
129
  @header1.headerStyle ^= HEADER_TRACKING
130
130
  @header2.headerStyle ^= HEADER_TRACKING
131
- }
131
+ end
132
132
 
133
133
  # Whip out a tooltip control, jeez, that's hard
134
134
  FXToolTip.new(getApp())
data/examples/iconlist.rb CHANGED
@@ -1,16 +1,18 @@
1
1
  require 'fox16'
2
+ require 'fox16/kwargs'
2
3
 
3
4
  include Fox
4
5
 
5
6
  class IconListWindow < FXMainWindow
7
+
6
8
  # Load the named PNG icon from a file
7
9
  def loadIcon(filename)
8
10
  begin
9
11
  filename = File.join("icons", filename)
10
12
  icon = nil
11
- File.open(filename, "rb") { |f|
13
+ File.open(filename, "rb") do |f|
12
14
  icon = FXPNGIcon.new(getApp(), f.read)
13
- }
15
+ end
14
16
  icon
15
17
  rescue
16
18
  raise RuntimeError, "Couldn't load icon: #{filename}"
@@ -20,7 +22,7 @@ class IconListWindow < FXMainWindow
20
22
  # Main window constructor
21
23
  def initialize(app)
22
24
  # Initialize base class first
23
- super(app, "Icon List Test", nil, nil, DECOR_ALL, 0, 0, 800, 600)
25
+ super(app, "Icon List Test", :opts => DECOR_ALL, :width => 800, :height => 600)
24
26
 
25
27
  # Menu bar
26
28
  menubar = FXMenuBar.new(self, LAYOUT_SIDE_TOP|LAYOUT_FILL_X)
@@ -34,14 +36,16 @@ class IconListWindow < FXMainWindow
34
36
  status = FXStatusBar.new(self, LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|STATUSBAR_WITH_DRAGCORNER)
35
37
 
36
38
  # Main window interior
37
- group = FXVerticalFrame.new(self, LAYOUT_FILL_X|LAYOUT_FILL_Y, 0, 0, 0, 0, 0, 0, 0, 0)
39
+ group = FXVerticalFrame.new(self, LAYOUT_FILL_X|LAYOUT_FILL_Y,
40
+ :padLeft => 0, :padRight => 0, :padTop => 0, :padBottom => 0)
38
41
 
39
42
  # Files
40
43
  FXLabel.new(group, "Icon List Widget", nil, LAYOUT_TOP|LAYOUT_FILL_X|FRAME_SUNKEN)
41
- subgroup = FXVerticalFrame.new(group, FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y, 0, 0, 0, 0, 0, 0, 0, 0)
44
+ subgroup = FXVerticalFrame.new(group, FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y,
45
+ :padLeft => 0, :padRight => 0, :padTop => 0, :padBottom => 0)
42
46
 
43
47
  # Icon list on the right
44
- iconlist = FXIconList.new(subgroup, nil, 0, LAYOUT_FILL_X|LAYOUT_FILL_Y|ICONLIST_BIG_ICONS|ICONLIST_EXTENDEDSELECT)
48
+ iconlist = FXIconList.new(subgroup, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|ICONLIST_BIG_ICONS|ICONLIST_EXTENDEDSELECT)
45
49
 
46
50
  iconlist.appendHeader("Name", nil, 200)
47
51
  iconlist.appendHeader("Type", nil, 100)
@@ -54,9 +58,9 @@ class IconListWindow < FXMainWindow
54
58
  mini_folder = loadIcon("minifolder.png")
55
59
 
56
60
  iconlist.appendItem("Really BIG and wide item to test\tDocument\t10000\tJune 13, 1999\tUser\tSoftware", big_folder, mini_folder)
57
- 1.upto(400) { |i|
61
+ 1.upto(400) do |i|
58
62
  iconlist.appendItem("Filename_#{i}\tDocument\t10000\tJune 13, 1999\tUser\tSoftware", big_folder, mini_folder)
59
- }
63
+ end
60
64
  iconlist.currentItem = iconlist.numItems - 1
61
65
 
62
66
  # Arrange menu
data/examples/image.rb CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'fox16'
4
4
  require 'fox16/colors'
5
+ require 'fox16/kwargs'
5
6
 
6
7
  include Fox
7
8
 
@@ -9,34 +10,36 @@ class ImageWindow < FXMainWindow
9
10
 
10
11
  def initialize(app)
11
12
  # Invoke base class initializer first
12
- super(app, "Image Application", nil, nil, DECOR_ALL, 0, 0, 800, 600)
13
+ super(app, "Image Application", :opts => DECOR_ALL, :width => 800, :height => 600)
13
14
 
14
15
  # Create a color dialog for later use
15
16
  colordlg = FXColorDialog.new(self, "Color Dialog")
16
17
 
17
18
  contents = FXHorizontalFrame.new(self,
18
- LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y, 0, 0, 0, 0, 0, 0, 0, 0)
19
+ LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y,
20
+ :padLeft => 0, :padRight => 0, :padTop => 0, :padBottom => 0)
19
21
 
20
22
  # LEFT pane to contain the canvas
21
23
  canvasFrame = FXVerticalFrame.new(contents,
22
24
  FRAME_SUNKEN|LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT,
23
- 0, 0, 0, 0, 10, 10, 10, 10)
25
+ :padLeft => 10, :padRight => 10, :padTop => 10, :padBottom => 10)
24
26
 
25
27
  # Label above the canvas
26
- FXLabel.new(canvasFrame, "Canvas Frame", nil,
27
- JUSTIFY_CENTER_X|LAYOUT_FILL_X)
28
+ FXLabel.new(canvasFrame, "Canvas Frame", :opts => JUSTIFY_CENTER_X|LAYOUT_FILL_X)
28
29
 
29
30
  # Horizontal divider line
30
31
  FXHorizontalSeparator.new(canvasFrame, SEPARATOR_GROOVE|LAYOUT_FILL_X)
31
32
 
32
33
  # Drawing canvas
33
- @canvas = FXCanvas.new(canvasFrame, nil, 0, (FRAME_SUNKEN|
34
+ @canvas = FXCanvas.new(canvasFrame, :opts => (FRAME_SUNKEN|
34
35
  FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT))
35
36
  @canvas.connect(SEL_PAINT, method(:onCanvasRepaint))
36
37
 
37
38
  # RIGHT pane for the buttons
38
- buttonFrame = FXVerticalFrame.new(contents, (FRAME_SUNKEN|LAYOUT_FILL_Y|
39
- LAYOUT_TOP|LAYOUT_LEFT), 0, 0, 0, 0, 10, 10, 10, 10)
39
+ buttonFrame = FXVerticalFrame.new(contents,
40
+ :opts => FRAME_SUNKEN|LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT,
41
+ :padLeft => 10, :padRight => 10, :padTop => 10, :padBottom => 10)
42
+
40
43
 
41
44
  # Label above the buttons
42
45
  FXLabel.new(buttonFrame, "Button Frame", nil,
@@ -45,43 +48,42 @@ class ImageWindow < FXMainWindow
45
48
  # Horizontal divider line
46
49
  FXHorizontalSeparator.new(buttonFrame, SEPARATOR_RIDGE|LAYOUT_FILL_X)
47
50
 
48
- FXLabel.new(buttonFrame, "&Background\nColor well", nil,
49
- JUSTIFY_CENTER_X|LAYOUT_FILL_X)
51
+ FXLabel.new(buttonFrame, "&Background\nColor well", :opts => JUSTIFY_CENTER_X|LAYOUT_FILL_X)
50
52
  @backwell = FXColorWell.new(buttonFrame, FXColor::White,
51
- nil, 0, (LAYOUT_CENTER_X|LAYOUT_TOP|LAYOUT_LEFT|
52
- LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT), 0, 0, 100, 30)
53
+ :opts => LAYOUT_CENTER_X|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT,
54
+ :width => 100, :height => 30)
53
55
  @backwell.connect(SEL_COMMAND, method(:onCmdWell))
54
56
 
55
- FXLabel.new(buttonFrame, "B&order\nColor well", nil,
56
- JUSTIFY_CENTER_X|LAYOUT_FILL_X)
57
+ FXLabel.new(buttonFrame, "B&order\nColor well", :opts => JUSTIFY_CENTER_X|LAYOUT_FILL_X)
57
58
  @borderwell = FXColorWell.new(buttonFrame, FXColor::Black,
58
- nil, 0, (LAYOUT_CENTER_X|LAYOUT_TOP|LAYOUT_LEFT|
59
- LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT), 0, 0, 100, 30)
59
+ :opts => LAYOUT_CENTER_X|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT,
60
+ :width => 100, :height => 30)
60
61
  @borderwell.connect(SEL_COMMAND, method(:onCmdWell))
61
62
 
62
- FXLabel.new(buttonFrame, "&Text\nColor well", nil,
63
- JUSTIFY_CENTER_X|LAYOUT_FILL_X)
63
+ FXLabel.new(buttonFrame, "&Text\nColor well", :opts => JUSTIFY_CENTER_X|LAYOUT_FILL_X)
64
64
  @textwell = FXColorWell.new(buttonFrame, FXColor::Black,
65
- nil, 0, (LAYOUT_CENTER_X|LAYOUT_TOP|LAYOUT_LEFT|
66
- LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT), 0, 0, 100, 30)
65
+ :opts => LAYOUT_CENTER_X|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT,
66
+ :width => 100, :height => 30)
67
67
  @textwell.connect(SEL_COMMAND, method(:onCmdWell))
68
68
 
69
69
  # Button to draw
70
70
  FXButton.new(buttonFrame, "&Colors...\tPop the color dialog", nil,
71
- colordlg, FXWindow::ID_SHOW, (FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_X|
72
- LAYOUT_TOP|LAYOUT_LEFT), 0, 0, 0, 0, 10, 10, 5, 5)
71
+ colordlg, FXWindow::ID_SHOW,
72
+ :opts => FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT,
73
+ :padLeft => 10, :padRight => 10, :padTop => 5, :padBottom => 5)
73
74
 
74
75
  # Button to draw
75
76
  saveBtn = FXButton.new(buttonFrame,
76
77
  "Save Image...\tRead back image and save to file",
77
- nil, nil, 0, (FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_X|
78
- LAYOUT_TOP|LAYOUT_LEFT), 0, 0, 0, 0, 10, 10, 5, 5)
78
+ :opts => FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT,
79
+ :padLeft => 10, :padRight => 10, :padTop => 5, :padBottom => 5)
79
80
  saveBtn.connect(SEL_COMMAND, method(:onCmdRestore))
80
81
 
81
82
  # Exit button
82
83
  FXButton.new(buttonFrame, "E&xit\tQuit ImageApp", nil,
83
- getApp(), FXApp::ID_QUIT, (FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_X|
84
- LAYOUT_TOP|LAYOUT_LEFT), 0, 0, 0, 0, 10, 10, 5, 5)
84
+ getApp(), FXApp::ID_QUIT,
85
+ :opts => FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT,
86
+ :padLeft => 10, :padRight => 10, :padTop => 5, :padBottom => 5)
85
87
 
86
88
  # Allocate the color arrays
87
89
  imgWidth = 512
@@ -122,15 +124,15 @@ class ImageWindow < FXMainWindow
122
124
  (0...512).each { |x|
123
125
  halfX = x >> 1
124
126
  (0...50).each { |y|
125
- z = (y << 9) + x
127
+ z = (y << 9) + x
126
128
  grey_data[z] = FXRGB(halfX, halfX, halfX)
127
- grey_nodither_data[z] = grey_data[z]
129
+ grey_nodither_data[z] = grey_data[z]
128
130
  red_data[z] = FXRGB(halfX, 0, 0)
129
- red_nodither_data[z] = red_data[z]
131
+ red_nodither_data[z] = red_data[z]
130
132
  green_data[z] = FXRGB(0, halfX, 0)
131
- green_nodither_data[z] = green_data[z]
133
+ green_nodither_data[z] = green_data[z]
132
134
  blue_data[z] = FXRGB(0, 0, halfX)
133
- blue_nodither_data[z] = blue_data[z]
135
+ blue_nodither_data[z] = blue_data[z]
134
136
  }
135
137
  }
136
138
 
@@ -168,7 +170,7 @@ class ImageWindow < FXMainWindow
168
170
  end
169
171
 
170
172
  def onCanvasRepaint(sender, sel, event)
171
- if event.synthetic
173
+ if event.synthetic?
172
174
  dc = FXDCWindow.new(@picture)
173
175
 
174
176
  # Erase the canvas, color comes from well
@@ -190,10 +192,10 @@ class ImageWindow < FXMainWindow
190
192
  dc.fillStyle = FILL_OPAQUESTIPPLED
191
193
  dc.foreground = FXColor::Black
192
194
  dc.background = FXColor::White
193
- (STIPPLE_0..STIPPLE_16).each { |pat|
195
+ (STIPPLE_0..STIPPLE_16).each do |pat|
194
196
  dc.stipple = pat
195
197
  dc.fillRectangle(10 + (512*pat)/17, 490, 31, 50)
196
- }
198
+ end
197
199
  dc.fillStyle = FILL_SOLID
198
200
 
199
201
  # Draw borders
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'fox16'
4
+ require 'fox16/kwargs'
4
5
 
5
6
  include Fox
6
7
 
@@ -10,8 +11,7 @@ class ImageWindow < FXMainWindow
10
11
 
11
12
  def initialize(app)
12
13
  # Invoke base class initialize first
13
- super(app, "FOX Image Viewer: - untitled", nil, nil, DECOR_ALL,
14
- 0, 0, 850, 600, 0, 0)
14
+ super(app, "FOX Image Viewer: - untitled", :opts => DECOR_ALL, :width => 850, :height => 600)
15
15
 
16
16
  # Recently used files list
17
17
  @mrufiles = FXRecentFiles.new
@@ -74,22 +74,22 @@ class ImageWindow < FXMainWindow
74
74
  # Sunken border for image widget
75
75
  imagebox = FXHorizontalFrame.new(splitter,
76
76
  FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y,
77
- 0, 0, 0, 0, 0, 0, 0, 0)
77
+ :padLeft => 0, :padRight => 0, :padTop => 0, :padBottom => 0)
78
78
 
79
79
  # Make image widget
80
- @imageview = FXImageView.new(imagebox, nil, nil, 0,
81
- LAYOUT_FILL_X|LAYOUT_FILL_Y)
80
+ @imageview = FXImageView.new(imagebox, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y)
82
81
 
83
82
  # Sunken border for file list
84
- @filebox = FXHorizontalFrame.new(splitter, LAYOUT_FILL_X|LAYOUT_FILL_Y,
85
- 0, 0, 0, 0, 0, 0, 0, 0)
83
+ @filebox = FXHorizontalFrame.new(splitter,
84
+ LAYOUT_FILL_X|LAYOUT_FILL_Y,
85
+ :padLeft => 0, :padRight => 0, :padTop => 0, :padBottom => 0)
86
86
 
87
87
  # Make file list
88
88
  fileframe = FXHorizontalFrame.new(@filebox,
89
89
  FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y,
90
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
91
- @filelist = FXFileList.new(fileframe, nil, 0,
92
- LAYOUT_FILL_X|LAYOUT_FILL_Y|ICONLIST_MINI_ICONS|ICONLIST_AUTOSIZE)
90
+ :padLeft => 0, :padRight => 0, :padTop => 0, :padBottom => 0. :hSpacing => 0, :vSpacing => 0)
91
+ @filelist = FXFileList.new(fileframe,
92
+ :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|ICONLIST_MINI_ICONS|ICONLIST_AUTOSIZE)
93
93
  @filelist.connect(SEL_DOUBLECLICKED, method(:onCmdFileList))
94
94
  FXButton.new(@filebox, "\tUp one level\tGo up to higher directory.",
95
95
  uplevelicon, @filelist, FXFileList::ID_DIRECTORY_UP,
@@ -97,19 +97,19 @@ class ImageWindow < FXMainWindow
97
97
 
98
98
  # Toobar buttons: File manipulation
99
99
  openBtn = FXButton.new(toolbar, "&Open\tOpen Image\tOpen image file.", fileopenicon,
100
- nil, 0, ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED)
100
+ :opts => ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED)
101
101
  openBtn.connect(SEL_COMMAND, method(:onCmdOpen))
102
102
  saveBtn = FXButton.new(toolbar, "&Save\tSave Image\tSave image file.", filesaveicon,
103
- nil, 0, ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED)
103
+ :opts => ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED)
104
104
  saveBtn.connect(SEL_COMMAND, method(:onCmdSave))
105
105
 
106
106
  # Toobar buttons: Editing
107
- FXButton.new(toolbar, "Cut\tCut", cuticon, nil, 0,
108
- ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED)
109
- FXButton.new(toolbar, "Copy\tCopy", copyicon, nil, 0,
110
- ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED)
111
- FXButton.new(toolbar, "Paste\tPaste", pasteicon, nil, 0,
112
- ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED)
107
+ FXButton.new(toolbar, "Cut\tCut", cuticon,
108
+ :opts => ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED)
109
+ FXButton.new(toolbar, "Copy\tCopy", copyicon,
110
+ :opts => ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED)
111
+ FXButton.new(toolbar, "Paste\tPaste", pasteicon,
112
+ :opts => ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED)
113
113
 
114
114
  # Color
115
115
  FXButton.new(toolbar, "&Colors\tColors\tDisplay color dialog.", paletteicon,
@@ -145,13 +145,10 @@ class ImageWindow < FXMainWindow
145
145
  # Edit Menu entries
146
146
  FXMenuCommand.new(editmenu, "&Undo\tCtl-Z\tUndo last change.")
147
147
  FXMenuCommand.new(editmenu, "&Redo\tCtl-R\tRedo last undo.")
148
- FXMenuCommand.new(editmenu, "&Copy\tCtl-C\tCopy selection to clipboard.",
149
- copyicon, nil, 0)
150
- FXMenuCommand.new(editmenu, "C&ut\tCtl-X\tCut selection to clipboard.",
151
- cuticon, nil, 0)
152
- FXMenuCommand.new(editmenu, "&Paste\tCtl-V\tPaste from clipboard.",
153
- pasteicon, nil, 0)
154
- FXMenuCommand.new(editmenu, "&Delete\t\tDelete selection.", nil, nil, 0)
148
+ FXMenuCommand.new(editmenu, "&Copy\tCtl-C\tCopy selection to clipboard.", copyicon)
149
+ FXMenuCommand.new(editmenu, "C&ut\tCtl-X\tCut selection to clipboard.", cuticon)
150
+ FXMenuCommand.new(editmenu, "&Paste\tCtl-V\tPaste from clipboard.", pasteicon)
151
+ FXMenuCommand.new(editmenu, "&Delete\t\tDelete selection.")
155
152
 
156
153
  # Manipulation Menu entries
157
154
  rotate90Cmd = FXMenuCommand.new(manipmenu, "Rotate 90\t\tRotate 90 degrees.")
@@ -247,44 +244,44 @@ class ImageWindow < FXMainWindow
247
244
  begin
248
245
  filename = File.join("icons", filename)
249
246
  icon = nil
250
- File.open(filename, "rb") { |f|
247
+ File.open(filename, "rb") do |f|
251
248
  icon = FXPNGIcon.new(getApp(), f.read)
252
- }
249
+ end
253
250
  icon
254
251
  rescue
255
252
  raise RuntimeError, "Couldn't load icon: #{filename}"
256
253
  end
257
254
  end
258
255
 
259
- def hasExtension(filename, ext)
256
+ def hasExtension?(filename, ext)
260
257
  File.basename(filename, ext) != File.basename(filename)
261
258
  end
262
259
 
263
260
  # Load the named image file
264
261
  def loadImage(file)
265
262
  img = nil
266
- if hasExtension(file, ".gif")
263
+ if hasExtension?(file, ".gif")
267
264
  img = FXGIFImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
268
- elsif hasExtension(file, ".bmp")
265
+ elsif hasExtension?(file, ".bmp")
269
266
  img = FXBMPImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
270
- elsif hasExtension(file, ".xpm")
267
+ elsif hasExtension?(file, ".xpm")
271
268
  img = FXXPMImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
272
- elsif hasExtension(file, ".png")
269
+ elsif hasExtension?(file, ".png")
273
270
  img = FXPNGImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
274
- elsif hasExtension(file, ".jpg")
271
+ elsif hasExtension?(file, ".jpg")
275
272
  img = FXJPGImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
276
- elsif hasExtension(file, ".pcx")
273
+ elsif hasExtension?(file, ".pcx")
277
274
  img = FXPCXImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
278
- elsif hasExtension(file, ".tif")
275
+ elsif hasExtension?(file, ".tif")
279
276
  img = FXTIFImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
280
- elsif hasExtension(file, ".tga")
277
+ elsif hasExtension?(file, ".tga")
281
278
  img = FXTGAImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
282
- elsif hasExtension(file, ".ico")
279
+ elsif hasExtension?(file, ".ico")
283
280
  img = FXICOImage.new(getApp(), nil, IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP)
284
281
  end
285
282
 
286
283
  # Perhaps failed?
287
- if !img
284
+ if img.nil?
288
285
  FXMessageBox.error(self, MBOX_OK, "Error loading image",
289
286
  "Unsupported image type: #{file}")
290
287
  return
@@ -340,7 +337,7 @@ class ImageWindow < FXMainWindow
340
337
  if MBOX_CLICKED_NO == FXMessageBox.question(self, MBOX_YES_NO,
341
338
  "Overwrite Image", "Overwrite existing image?")
342
339
  return 1
343
- end
340
+ end
344
341
  end
345
342
  @filename = saveDialog.filename
346
343
  @filelist.currentFile = @filename
@@ -400,9 +397,11 @@ class ImageWindow < FXMainWindow
400
397
  FXTextField.new(frame, 5, sy, FXDataTarget::ID_VALUE,
401
398
  LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK|JUSTIFY_RIGHT)
402
399
  FXButton.new(frame, "Cancel", nil, scalepanel, FXDialogBox::ID_CANCEL,
403
- LAYOUT_CENTER_Y|FRAME_RAISED|FRAME_THICK, 0, 0, 0, 0, 20, 20, 4, 4)
400
+ LAYOUT_CENTER_Y|FRAME_RAISED|FRAME_THICK,
401
+ :padLeft => 20, :padRight => 20, :padTop => 4, :padBottom => 4)
404
402
  FXButton.new(frame, "OK", nil, scalepanel, FXDialogBox::ID_ACCEPT,
405
- LAYOUT_CENTER_Y|FRAME_RAISED|FRAME_THICK, 0, 0, 0, 0, 30, 30, 4, 4)
403
+ LAYOUT_CENTER_Y|FRAME_RAISED|FRAME_THICK,
404
+ :padLeft => 30, :padRight => 30, :padTop => 4, :padBottom => 4)
406
405
  return 1 if (scalepanel.execute == 0)
407
406
  return 1 if (sx.value < 1 || sy.value < 1)
408
407
  image.scale(sx.value, sy.value)
@@ -432,9 +431,11 @@ class ImageWindow < FXMainWindow
432
431
  FXTextField.new(frame, 5, ch, FXDataTarget::ID_VALUE,
433
432
  LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK|JUSTIFY_RIGHT)
434
433
  FXButton.new(frame, "Cancel", nil, croppanel, FXDialogBox::ID_CANCEL,
435
- LAYOUT_CENTER_Y|FRAME_RAISED|FRAME_THICK, 0, 0, 0, 0, 20, 20, 4, 4)
434
+ LAYOUT_CENTER_Y|FRAME_RAISED|FRAME_THICK,
435
+ :padLeft => 20, :padRight => 20, :padTop => 4, :padBottom => 4)
436
436
  FXButton.new(frame, "OK", nil, croppanel, FXDialogBox::ID_ACCEPT,
437
- LAYOUT_CENTER_Y|FRAME_RAISED|FRAME_THICK, 0, 0, 0, 0, 30, 30, 4, 4)
437
+ LAYOUT_CENTER_Y|FRAME_RAISED|FRAME_THICK,
438
+ :padLeft => 30, :padRight => 30, :padTop => 4, :padBottom => 4)
438
439
  return 1 if (croppanel.execute == 0)
439
440
  return 1 if (cx.value < 0 || cy.value < 0 ||
440
441
  cx.value+cw.value > image.width ||