glimmer-dsl-swt 0.5.6 → 0.6.4

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 (54) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/RUBY_VERSION +1 -1
  4. data/VERSION +1 -1
  5. data/bin/girb +1 -1
  6. data/bin/glimmer +1 -1
  7. data/icons/scaffold_app.ico +0 -0
  8. data/icons/scaffold_app.png +0 -0
  9. data/lib/ext/glimmer/config.rb +5 -1
  10. data/lib/glimmer/Rakefile +5 -0
  11. data/lib/glimmer/dsl/swt/cursor_expression.rb +23 -0
  12. data/lib/glimmer/dsl/swt/dsl.rb +3 -0
  13. data/lib/glimmer/dsl/swt/font_expression.rb +26 -0
  14. data/lib/glimmer/dsl/swt/image_expression.rb +21 -0
  15. data/lib/glimmer/dsl/swt/message_box_expression.rb +9 -1
  16. data/lib/glimmer/dsl/swt/widget_expression.rb +7 -7
  17. data/lib/glimmer/launcher.rb +36 -8
  18. data/lib/glimmer/package.rb +31 -7
  19. data/lib/glimmer/rake_task.rb +111 -6
  20. data/lib/glimmer/scaffold.rb +98 -62
  21. data/lib/glimmer/swt/cursor_proxy.rb +45 -0
  22. data/lib/glimmer/swt/display_proxy.rb +13 -2
  23. data/lib/glimmer/swt/font_proxy.rb +7 -7
  24. data/lib/glimmer/swt/image_proxy.rb +16 -23
  25. data/lib/glimmer/swt/layout_proxy.rb +2 -0
  26. data/lib/glimmer/swt/message_box_proxy.rb +23 -5
  27. data/lib/glimmer/swt/scrolled_composite_proxy.rb +6 -11
  28. data/lib/glimmer/swt/style_constantizable.rb +11 -1
  29. data/lib/glimmer/swt/table_proxy.rb +50 -2
  30. data/lib/glimmer/swt/widget_proxy.rb +79 -18
  31. data/samples/elaborate/contact_manager.rb +121 -0
  32. data/samples/elaborate/contact_manager/contact.rb +11 -0
  33. data/samples/elaborate/contact_manager/contact_manager_presenter.rb +26 -0
  34. data/samples/elaborate/contact_manager/contact_repository.rb +244 -0
  35. data/samples/elaborate/login.rb +108 -0
  36. data/samples/elaborate/tic_tac_toe.rb +55 -0
  37. data/samples/elaborate/tic_tac_toe/board.rb +124 -0
  38. data/samples/elaborate/tic_tac_toe/cell.rb +27 -0
  39. data/samples/hello/hello_browser.rb +8 -0
  40. data/samples/hello/hello_combo.rb +38 -0
  41. data/samples/hello/hello_computed.rb +69 -0
  42. data/samples/hello/hello_computed/contact.rb +21 -0
  43. data/samples/hello/hello_drag_and_drop.rb +29 -0
  44. data/samples/hello/hello_list_multi_selection.rb +48 -0
  45. data/samples/hello/hello_list_single_selection.rb +37 -0
  46. data/samples/hello/hello_menu_bar.rb +64 -0
  47. data/samples/hello/hello_message_box.rb +15 -0
  48. data/samples/hello/hello_pop_up_context_menu.rb +36 -0
  49. data/samples/hello/hello_tab.rb +24 -0
  50. data/samples/hello/hello_world.rb +8 -0
  51. data/vendor/swt/linux/swt.jar +0 -0
  52. data/vendor/swt/mac/swt.jar +0 -0
  53. data/vendor/swt/windows/swt.jar +0 -0
  54. metadata +48 -7
@@ -73,24 +73,11 @@ class Scaffold
73
73
 
74
74
  # Glimmer
75
75
  dist
76
- packages
76
+ packages
77
+ vendor/jars
77
78
  MULTI_LINE_STRING
78
79
 
79
- GEMFILE_APP = <<~MULTI_LINE_STRING
80
- # frozen_string_literal: true
81
-
82
- source 'https://rubygems.org'
83
-
84
- git_source(:github) {|repo_name| "https://github.com/\#{repo_name}" }
85
-
86
- gem 'glimmer-dsl-swt', '~> #{VERSION}'
87
-
88
- group :test do
89
- gem 'rspec'
90
- end
91
- MULTI_LINE_STRING
92
-
93
- GEMFILE_GEM = <<~MULTI_LINE_STRING
80
+ GEMFILE = <<~MULTI_LINE_STRING
94
81
  # frozen_string_literal: true
95
82
 
96
83
  source 'https://rubygems.org'
@@ -101,24 +88,12 @@ class Scaffold
101
88
 
102
89
  group :development do
103
90
  gem 'rspec', '~> 3.5.0'
91
+ gem 'git-glimmer', '1.7.0'
104
92
  gem 'jeweler', '2.3.9'
105
93
  gem 'simplecov', '>= 0'
106
94
  end
107
95
  MULTI_LINE_STRING
108
96
 
109
- RAKEFILE = <<~MULTI_LINE_STRING
110
- require 'glimmer/rake_task'
111
-
112
- ## Use the following configuration if you would like to customize javapackager
113
- ## arguments for `glimmer package` command.
114
- #
115
- # Glimmer::Package.javapackager_extra_args =
116
- # " -BlicenseType=" +
117
- # " -Bmac.CFBundleIdentifier=" +
118
- # " -Bmac.category=" +
119
- # " -Bmac.signing-key-developer-id-app="
120
- MULTI_LINE_STRING
121
-
122
97
  RVM_FUNCTION = <<~MULTI_LINE_STRING
123
98
  # Load RVM into a shell session *as a function*
124
99
  if [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then
@@ -135,31 +110,54 @@ class Scaffold
135
110
  MULTI_LINE_STRING
136
111
 
137
112
  def app(app_name)
138
- mkdir app_name
139
- cd app_name
113
+ gem_name = file_name(app_name)
114
+ gem_summary = human_name(app_name)
115
+ system "jruby -r git-glimmer -S jeweler --rspec --summary '#{gem_summary}' --description '#{gem_summary}' #{gem_name}"
116
+ cd gem_name
117
+ rm_rf 'lib'
140
118
  write '.gitignore', GITIGNORE
141
119
  write '.ruby-version', RUBY_VERSION
142
120
  write '.ruby-gemset', app_name
143
121
  write 'VERSION', '1.0.0'
144
122
  write 'LICENSE.txt', "Copyright (c) #{Time.now.year} #{app_name}"
145
- write 'Gemfile', GEMFILE_APP
146
- write 'Rakefile', RAKEFILE
123
+ write 'Gemfile', GEMFILE
124
+ write 'Rakefile', gem_rakefile(app_name, nil, gem_name)
147
125
  mkdir 'app'
148
126
  write "app/#{file_name(app_name)}.rb", app_main_file(app_name)
149
127
  mkdir 'app/models'
150
128
  mkdir 'app/views'
151
129
  custom_shell('AppView', current_dir_name, :app)
152
- if OS.mac?
153
- mkdir_p 'package/macosx'
154
- icon_file = "package/macosx/#{human_name(app_name)}.icns"
155
- cp File.expand_path('../../../icons/scaffold_app.icns', __FILE__), icon_file
156
- puts "Created #{current_dir_name}/#{icon_file}"
157
- end
130
+
131
+ mkdir_p 'package/windows'
132
+ icon_file = "package/windows/#{human_name(app_name)}.ico"
133
+ cp File.expand_path('../../../icons/scaffold_app.ico', __FILE__), icon_file
134
+ puts "Created #{current_dir_name}/#{icon_file}"
135
+
136
+ mkdir_p 'package/macosx'
137
+ icon_file = "package/macosx/#{human_name(app_name)}.icns"
138
+ cp File.expand_path('../../../icons/scaffold_app.icns', __FILE__), icon_file
139
+ puts "Created #{current_dir_name}/#{icon_file}"
140
+
141
+ mkdir_p 'package/linux'
142
+ icon_file = "package/linux/#{human_name(app_name)}.png"
143
+ cp File.expand_path('../../../icons/scaffold_app.png', __FILE__), icon_file
144
+ puts "Created #{current_dir_name}/#{icon_file}"
145
+
158
146
  mkdir 'bin'
159
147
  write "bin/#{file_name(app_name)}", app_bin_file(app_name)
160
- system "bash -c '#{RVM_FUNCTION}\n cd .\n bundle\n glimmer package\n'"
161
- system "open packages/bundles/#{human_name(app_name).gsub(' ', '\ ')}.app"
162
- # TODO generate rspec test suite
148
+ write 'spec/spec_helper.rb', spec_helper_file
149
+ if OS.windows?
150
+ system "bundle"
151
+ system "glimmer package[image]"
152
+ system "\"packages/bundles/#{human_name(app_name)}/#{human_name(app_name)}.exe\""
153
+ else
154
+ system "bash -c '#{RVM_FUNCTION}\n cd .\n bundle\n glimmer package\n'"
155
+ if OS.mac?
156
+ system "open packages/bundles/#{human_name(app_name).gsub(' ', '\ ')}.app"
157
+ else
158
+ system "glimmer bin/#{file_name(app_name)}"
159
+ end
160
+ end
163
161
  end
164
162
 
165
163
  def custom_shell(custom_shell_name, namespace, shell_type = nil)
@@ -179,22 +177,22 @@ class Scaffold
179
177
  end
180
178
 
181
179
  def custom_shell_gem(custom_shell_name, namespace)
182
- return puts('Namespace is required! Usage: glimmer scaffold:custom_shell_gem[custom_shell_name,namespace]') unless `git config --get github.user`.to_s.strip == 'AndyObtiva'
183
180
  gem_name = "glimmer-cs-#{compact_name(custom_shell_name)}"
184
181
  gem_summary = "#{human_name(custom_shell_name)} - Glimmer Custom Shell"
185
182
  if namespace
186
183
  gem_name += "-#{compact_name(namespace)}"
187
184
  gem_summary += " (#{human_name(namespace)})"
188
185
  else
186
+ return puts('Namespace is required! Usage: glimmer scaffold:gem:customshell[name,namespace]') unless `git config --get github.user`.to_s.strip == 'AndyObtiva'
189
187
  namespace = 'glimmer'
190
188
  end
191
- system "jeweler --rspec --summary '#{gem_summary}' --description '#{gem_summary}' #{gem_name}"
189
+ system "jruby -r git-glimmer -S jeweler --rspec --summary '#{gem_summary}' --description '#{gem_summary}' #{gem_name}"
192
190
  cd gem_name
193
191
  write '.gitignore', GITIGNORE
194
192
  write '.ruby-version', RUBY_VERSION
195
193
  write '.ruby-gemset', gem_name
196
194
  write 'VERSION', '1.0.0'
197
- write 'Gemfile', GEMFILE_GEM
195
+ write 'Gemfile', GEMFILE
198
196
  write 'Rakefile', gem_rakefile(custom_shell_name, namespace, gem_name)
199
197
  append "lib/#{gem_name}.rb", gem_main_file(custom_shell_name, namespace)
200
198
  mkdir 'lib/views'
@@ -203,14 +201,35 @@ class Scaffold
203
201
  write "bin/#{gem_name}", gem_bin_file(gem_name, custom_shell_name, namespace)
204
202
  write "bin/#{file_name(custom_shell_name)}", gem_bin_command_file(gem_name)
205
203
  FileUtils.chmod 0755, "bin/#{file_name(custom_shell_name)}"
206
- if OS.mac?
207
- mkdir_p 'package/macosx'
208
- icon_file = "package/macosx/#{human_name(custom_shell_name)}.icns"
209
- cp File.expand_path('../../../icons/scaffold_app.icns', __FILE__), icon_file
210
- puts "Created #{current_dir_name}/#{icon_file}"
204
+ write 'spec/spec_helper.rb', spec_helper_file
205
+
206
+ mkdir_p 'package/windows'
207
+ icon_file = "package/windows/#{human_name(custom_shell_name)}.ico"
208
+ cp File.expand_path('../../../icons/scaffold_app.ico', __FILE__), icon_file
209
+ puts "Created #{current_dir_name}/#{icon_file}"
210
+
211
+ mkdir_p 'package/macosx'
212
+ icon_file = "package/macosx/#{human_name(custom_shell_name)}.icns"
213
+ cp File.expand_path('../../../icons/scaffold_app.icns', __FILE__), icon_file
214
+ puts "Created #{current_dir_name}/#{icon_file}"
215
+
216
+ mkdir_p 'package/linux'
217
+ icon_file = "package/linux/#{human_name(custom_shell_name)}.png"
218
+ cp File.expand_path('../../../icons/scaffold_app.png', __FILE__), icon_file
219
+ puts "Created #{current_dir_name}/#{icon_file}"
220
+
221
+ if OS.windows?
222
+ system "bundle"
223
+ system "glimmer package[image]"
224
+ system "\"packages/bundles/#{human_name(custom_shell_name)}/#{human_name(custom_shell_name)}.exe\""
225
+ else
226
+ system "bash -c '#{RVM_FUNCTION}\n cd .\n bundle\n glimmer package\n'"
227
+ if OS.mac?
228
+ system "open packages/bundles/#{human_name(custom_shell_name).gsub(' ', '\ ')}.app" if OS.mac?
229
+ else
230
+ system "bin/#{file_name(custom_shell_name)}"
231
+ end
211
232
  end
212
- system "bash -c '#{RVM_FUNCTION}\n cd .\n bundle\n glimmer package\n'"
213
- system "open packages/bundles/#{human_name(custom_shell_name).gsub(' ', '\ ')}.app"
214
233
  puts "Finished creating #{gem_name} Ruby gem."
215
234
  puts 'Edit Rakefile to configure gem details.'
216
235
  puts 'Run `rake` to execute specs.'
@@ -228,19 +247,23 @@ class Scaffold
228
247
  else
229
248
  namespace = 'glimmer'
230
249
  end
231
- system "jeweler --rspec --summary '#{gem_summary}' --description '#{gem_summary}' #{gem_name}"
250
+ system "jruby -r git-glimmer -S jeweler --rspec --summary '#{gem_summary}' --description '#{gem_summary}' #{gem_name}"
232
251
  cd gem_name
233
252
  write '.gitignore', GITIGNORE
234
253
  write '.ruby-version', RUBY_VERSION
235
254
  write '.ruby-gemset', gem_name
236
255
  write 'VERSION', '1.0.0'
237
- write 'Gemfile', GEMFILE_GEM
256
+ write 'Gemfile', GEMFILE
238
257
  write 'Rakefile', gem_rakefile
239
258
  write 'spec/spec_helper.rb', spec_helper_file
240
259
  append "lib/#{gem_name}.rb", gem_main_file(custom_widget_name, namespace)
241
260
  mkdir 'lib/views'
242
261
  custom_widget(custom_widget_name, namespace)
243
- system "bash -c '#{RVM_FUNCTION}\n cd .\n bundle\n'"
262
+ if OS.windows?
263
+ system "bundle"
264
+ else
265
+ system "bash -c '#{RVM_FUNCTION}\n cd .\n bundle\n'"
266
+ end
244
267
  puts "Finished creating #{gem_name} Ruby gem."
245
268
  puts 'Edit Rakefile to configure gem details.'
246
269
  puts 'Run `rake` to execute specs.'
@@ -338,7 +361,7 @@ class Scaffold
338
361
 
339
362
  def gem_bin_command_file(gem_name)
340
363
  <<~MULTI_LINE_STRING
341
- #!/usr/bin/env ruby
364
+ #!/usr/bin/env jruby
342
365
 
343
366
  require 'glimmer/launcher'
344
367
 
@@ -355,10 +378,11 @@ class Scaffold
355
378
  lines.insert(require_rake_line_index, "require 'glimmer/launcher'")
356
379
  gem_files_line_index = lines.index(lines.detect {|l| l.include?('# dependencies defined in Gemfile') })
357
380
  if custom_shell_name
358
- lines.insert(gem_files_line_index, " gem.files = Dir['VERSION', 'LICENSE.txt', 'lib/**/*.rb', 'bin/**/*']")
381
+ lines.insert(gem_files_line_index, " gem.files = Dir['VERSION', 'LICENSE.txt', 'lib/**/*', 'app/**/*', 'bin/**/*', 'vendor/**/*', 'package/**/*']")
359
382
  lines.insert(gem_files_line_index+1, " gem.executables = ['#{gem_name}', '#{file_name(custom_shell_name)}']")
383
+ lines.insert(gem_files_line_index+2, " gem.require_paths = ['vendor', 'lib', 'app']")
360
384
  else
361
- lines.insert(gem_files_line_index, " gem.files = Dir['lib/**/*.rb']")
385
+ lines.insert(gem_files_line_index, " gem.files = Dir['VERSION', 'LICENSE.txt', 'lib/**/*']")
362
386
  end
363
387
  spec_pattern_line_index = lines.index(lines.detect {|l| l.include?('spec.pattern =') })
364
388
  lines.insert(spec_pattern_line_index+1, " spec.ruby_opts = [Glimmer::Launcher.jruby_swt_options]")
@@ -383,7 +407,7 @@ class Scaffold
383
407
  content = File.read('spec/spec_helper.rb')
384
408
  lines = content.split("\n")
385
409
  require_line_index = lines.index(lines.detect {|l| l.include?(current_dir_name) })
386
- lines[require_line_index...require_line_index] = [
410
+ lines[require_line_index..require_line_index] = [
387
411
  "require 'bundler/setup'",
388
412
  'Bundler.require(:default, :development)',
389
413
  ]
@@ -412,9 +436,9 @@ class Scaffold
412
436
 
413
437
  if shell_type == :gem
414
438
  custom_shell_file_content += <<-MULTI_LINE_STRING
415
- GEM_ROOT = File.expand_path('../../../..', __FILE__)
416
- VERSION = File.read(File.join(GEM_ROOT, 'VERSION'))
417
- LICENSE = File.read(File.join(GEM_ROOT, 'LICENSE.txt'))
439
+ APP_ROOT = File.expand_path('../../../..', __FILE__)
440
+ VERSION = File.read(File.join(APP_ROOT, 'VERSION'))
441
+ LICENSE = File.read(File.join(APP_ROOT, 'LICENSE.txt'))
418
442
 
419
443
  MULTI_LINE_STRING
420
444
  end
@@ -470,6 +494,7 @@ class Scaffold
470
494
  shell {
471
495
  # Replace example content below with custom shell content
472
496
  minimum_size 320, 240
497
+ image File.join(APP_ROOT, 'package', 'windows', "#{human_name(shell_type == :gem ? custom_shell_name : current_dir_name)}.ico") if OS.windows?
473
498
  text "#{human_name(namespace)} - #{human_name(custom_shell_name)}"
474
499
  grid_layout
475
500
  label(:center) {
@@ -477,6 +502,17 @@ class Scaffold
477
502
  font height: 40
478
503
  layout_data :fill, :center, true, true
479
504
  }
505
+ menu_bar {
506
+ menu {
507
+ text '&File'
508
+ menu_item {
509
+ text '&Preferences...'
510
+ on_widget_selected {
511
+ display_preferences_dialog
512
+ }
513
+ }
514
+ }
515
+ }
480
516
  }
481
517
  }
482
518
  MULTI_LINE_STRING
@@ -0,0 +1,45 @@
1
+ require 'glimmer/error'
2
+ require 'glimmer/swt/swt_proxy'
3
+ require 'glimmer/swt/display_proxy'
4
+
5
+ module Glimmer
6
+ module SWT
7
+ # Proxy for org.eclipse.swt.graphics.Cursor
8
+ #
9
+ # Invoking `#swt_cursor` returns the SWT Cursor object wrapped by this proxy
10
+ #
11
+ # Follows the Proxy Design Pattern
12
+ class CursorProxy
13
+ CURSOR_STYLES = org.eclipse.swt.SWT.constants.select {|c| c.to_s.downcase.start_with?('cursor_')}.map {|c| c.to_s.downcase.sub('cursor_', '').to_sym}
14
+ ERROR_INVALID_CURSOR_STYLE = " is an invalid cursor style! Valid values are #{CURSOR_STYLES.map(&:to_s).join(", ")}"
15
+
16
+ include_package 'org.eclipse.swt.graphics'
17
+
18
+ attr_reader :swt_cursor, :cursor_style
19
+
20
+ # Builds a new CursorProxy from passed in cursor SWT style (e.g. :appstarting, :hand, or :help)
21
+ #
22
+ # Cursor SWT styles are those that begin with "CURSOR_" prefix
23
+ #
24
+ # They are expected to be passed in in short form without the prefix (but would work with the prefix too)
25
+ def initialize(cursor_style)
26
+ @cursor_style = cursor_style
27
+ @cursor_style = SWTProxy.reverse_lookup(@cursor_style).detect { |symbol| symbol.to_s.downcase.start_with?('cursor_') } if cursor_style.is_a?(Integer)
28
+ @cursor_style = @cursor_style.to_s.downcase
29
+ @cursor_style = @cursor_style.sub(/^cursor\_/, '') if @cursor_style.start_with?('cursor_')
30
+ detect_invalid_cursor_style
31
+ @swt_cursor = DisplayProxy.instance.swt_display.get_system_cursor(SWTProxy[swt_style])
32
+ end
33
+
34
+ def swt_style
35
+ @swt_style ||= @cursor_style.upcase.start_with?('CURSOR_') ? @cursor_style : "CURSOR_#{@cursor_style}"
36
+ end
37
+
38
+ private
39
+
40
+ def detect_invalid_cursor_style
41
+ raise Error, cursor_style.to_s + ERROR_INVALID_CURSOR_STYLE unless CURSOR_STYLES.include?(cursor_style.to_s.downcase.to_sym)
42
+ end
43
+ end
44
+ end
45
+ end
@@ -35,16 +35,26 @@ module Glimmer
35
35
  @swt_display = Display.new(*args)
36
36
  @swt_display.set_data('proxy', self)
37
37
  end
38
+
39
+ def content(&block)
40
+ Glimmer::DSL::Engine.add_content(self, Glimmer::DSL::SWT::DisplayExpression.new, &block)
41
+ end
38
42
 
39
43
  def method_missing(method, *args, &block)
40
- swt_display.send(method, *args, &block)
44
+ if can_handle_observation_request?(method)
45
+ handle_observation_request(method, &block)
46
+ else
47
+ swt_display.send(method, *args, &block)
48
+ end
41
49
  rescue => e
42
50
  Glimmer::Config.logger.debug {"Neither DisplayProxy nor #{swt_display.class.name} can handle the method ##{method}"}
43
51
  super
44
52
  end
45
53
 
46
54
  def respond_to?(method, *args, &block)
47
- super || swt_display.respond_to?(method, *args, &block)
55
+ super ||
56
+ can_handle_observation_request?(method) ||
57
+ swt_display.respond_to?(method, *args, &block)
48
58
  end
49
59
 
50
60
  def can_handle_observation_request?(observation_request)
@@ -61,6 +71,7 @@ module Glimmer
61
71
  end
62
72
 
63
73
  def handle_observation_request(observation_request, &block)
74
+ observation_request = observation_request.to_s
64
75
  if observation_request.start_with?('on_swt_')
65
76
  constant_name = observation_request.sub(/^on_swt_/, '')
66
77
  add_swt_event_listener(constant_name, &block)
@@ -6,11 +6,10 @@ module Glimmer
6
6
  module SWT
7
7
  # Proxy for org.eclipse.swt.graphics.Font
8
8
  #
9
- # This class is meant to be used with WidgetProxy to manipulate
10
- # an SWT widget font.
9
+ # This class can be optionally used with WidgetProxy to manipulate
10
+ # an SWT widget font (reusing its FontData but building a new Font)
11
11
  #
12
- # It is not meant to create new SWT fonts form scratch without
13
- # a widget proxy.
12
+ # Otherwise, if no WidgetProxy is passed to constructor, it builds new FontData
14
13
  #
15
14
  # Invoking `#swt_font` returns the SWT Font object wrapped by this proxy
16
15
  #
@@ -21,7 +20,7 @@ module Glimmer
21
20
 
22
21
  include_package 'org.eclipse.swt.graphics'
23
22
 
24
- attr_reader :widget_proxy, :swt_font
23
+ attr_reader :widget_proxy, :swt_font, :font_properties
25
24
 
26
25
  # Builds a new font proxy from passed in widget_proxy and font_properties hash,
27
26
  #
@@ -31,8 +30,9 @@ module Glimmer
31
30
  #
32
31
  # Style (:style value) can only be one of FontProxy::FONT_STYLES values:
33
32
  # that is :normal, :bold, or :italic
34
- def initialize(widget_proxy, font_properties)
33
+ def initialize(widget_proxy = nil, font_properties)
35
34
  @widget_proxy = widget_proxy
35
+ @font_properties = font_properties
36
36
  detect_invalid_font_property(font_properties)
37
37
  font_properties[:style] = SWTProxy[*font_properties[:style]]
38
38
  font_data_args = [:name, :height, :style].map do |font_property_name|
@@ -57,7 +57,7 @@ module Glimmer
57
57
  private
58
58
 
59
59
  def font_datum
60
- @font_datum ||= @widget_proxy.swt_widget.getFont.getFontData[0]
60
+ @font_datum ||= @widget_proxy ? @widget_proxy.swt_widget.getFont.getFontData[0] : FontData.new
61
61
  end
62
62
 
63
63
  def detect_invalid_font_property(font_properties)
@@ -8,7 +8,7 @@ module Glimmer
8
8
  class ImageProxy
9
9
  include_package 'org.eclipse.swt.graphics'
10
10
 
11
- attr_reader :jar_file_path, :image_data
11
+ attr_reader :file_path, :jar_file_path, :image_data, :swt_image
12
12
 
13
13
  # Initializes a proxy for an SWT Image object
14
14
  #
@@ -17,31 +17,24 @@ module Glimmer
17
17
  # and returns an image object.
18
18
  def initialize(*args)
19
19
  @args = args
20
- @jar_file_path = @args.first if @args.first.is_a?(String) && @args.size == 1
21
-
22
- end
23
-
24
- def swt_image
25
- unless @swt_image
26
- if @jar_file_path
27
- file_path = @jar_file_path
28
- if file_path.start_with?('uri:classloader')
29
- file_path = file_path.sub(/^uri\:classloader\:/, '').sub('//', '/') # the latter sub is needed for Mac
30
- object = java.lang.Object.new
31
- file_input_stream = object.java_class.resource_as_stream(file_path)
32
- buffered_file_input_stream = java.io.BufferedInputStream.new(file_input_stream)
33
- end
34
- @image_data = ImageData.new(buffered_file_input_stream || file_path)
35
- @swt_image = Image.new(DisplayProxy.instance.swt_display, @image_data)
36
- else
37
- @swt_image = Image.new(*@args)
20
+ @file_path = @args.first if @args.first.is_a?(String) && @args.size == 1
21
+ if @file_path
22
+ if @file_path.start_with?('uri:classloader')
23
+ @jar_file_path = @file_path
24
+ @file_path = @jar_file_path.sub(/^uri\:classloader\:/, '').sub('//', '/') # the latter sub is needed for Mac
25
+ object = java.lang.Object.new
26
+ file_input_stream = object.java_class.resource_as_stream(file_path)
27
+ buffered_file_input_stream = java.io.BufferedInputStream.new(file_input_stream)
38
28
  end
39
- end
40
- @swt_image
29
+ @image_data = ImageData.new(buffered_file_input_stream || @file_path)
30
+ @swt_image = Image.new(DisplayProxy.instance.swt_display, @image_data)
31
+ else
32
+ @swt_image = Image.new(*@args)
33
+ @image_data = @swt_image.image_data
34
+ end
41
35
  end
42
-
36
+
43
37
  def scale_to(width, height)
44
- return @swt_image if image_data.nil?
45
38
  scaled_image_data = image_data.scaledTo(width, height)
46
39
  device = swt_image.device
47
40
  swt_image.dispose