glimmer 0.4.6 → 0.4.7

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 (25) hide show
  1. checksums.yaml +4 -4
  2. data/README.markdown +14 -12
  3. data/lib/glimmer.rb +2 -1
  4. data/lib/glimmer/command_handler_chain_link.rb +2 -1
  5. data/lib/glimmer/swt/command_handlers/bind_command_handler.rb +2 -1
  6. data/lib/glimmer/swt/command_handlers/color_command_handler.rb +1 -1
  7. data/lib/glimmer/swt/command_handlers/combo_selection_data_binding_command_handler.rb +3 -2
  8. data/lib/glimmer/swt/command_handlers/custom_widget_command_handler.rb +3 -3
  9. data/lib/glimmer/swt/command_handlers/data_binding_command_handler.rb +4 -35
  10. data/lib/glimmer/swt/command_handlers/layout_command_handler.rb +1 -1
  11. data/lib/glimmer/swt/command_handlers/layout_data_command_handler.rb +2 -1
  12. data/lib/glimmer/swt/command_handlers/list_selection_data_binding_command_handler.rb +3 -2
  13. data/lib/glimmer/swt/command_handlers/tab_item_command_handler.rb +12 -2
  14. data/lib/glimmer/swt/command_handlers/table_column_properties_data_binding_command_handler.rb +2 -1
  15. data/lib/glimmer/swt/command_handlers/table_items_data_binding_command_handler.rb +2 -1
  16. data/lib/glimmer/swt/command_handlers/tree_items_data_binding_command_handler.rb +2 -1
  17. data/lib/glimmer/swt/command_handlers/tree_properties_data_binding_command_handler.rb +2 -1
  18. data/lib/glimmer/swt/command_handlers/widget_command_handler.rb +1 -1
  19. data/lib/glimmer/swt/command_handlers/widget_listener_command_handler.rb +4 -2
  20. data/lib/glimmer/swt/custom_widget.rb +29 -1
  21. data/lib/glimmer/swt/g_tab_item_composite.rb +8 -1
  22. data/lib/glimmer/swt/g_widget.rb +52 -0
  23. data/lib/glimmer/swt/observable_model.rb +1 -0
  24. data/lib/glimmer/swt/widget_binding.rb +3 -2
  25. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 53c846877535c288cc80b8c2972b14f5fd961b6e3e51f744278e8c6da47cfe6d
4
- data.tar.gz: 4be53a6c16f2a9ae9c6101ca4726b576bec5e17dae05f55d64c0714ab13ab6fd
3
+ metadata.gz: 8f82e6793a331105407650a919d3d973f360c9e0c5e6bd49d185bd44dd9ec745
4
+ data.tar.gz: 190ea8ddbe57f41100e9fa539f4e9465b9d621418e3f00e291b91103f04484ce
5
5
  SHA512:
6
- metadata.gz: 8f717afdd64e347b706a3d909474b579031c4a235d4881c490958d7c743892f363b64ae29f40bf8401506f327764163c4d08660cb6a29d8507b7077f11e06c29
7
- data.tar.gz: c2b5de327710faa1e6dde42e5ef011af9b5375b87c030edeea40a0e672c7abd8a848dd1f8f48da9deeee903be27c9cc8e79e4a8a404a31cbf522be11dad35ee3
6
+ metadata.gz: b57d3b3d4754fc2d5229c3ec2c2e7518336091b1d305a1d4c2d6b1b601a50245f75340ba2dc213168349408389f324afeeeb734ae81faa2045dd6d6e0e5d7da3
7
+ data.tar.gz: b2fd672bed1bf48b99c7e92ad8b82fb910c0d0330b78152fbf3cbe4a6c33e34dae4a0ed945ab2e646492af2daad1f9a224488ee5064a7d4f6650f6238882f86e
@@ -1,10 +1,8 @@
1
- # Glimmer (JRuby Desktop UI DSL + Data-Binding)
1
+ # Glimmer 0.4.7 Beta (JRuby Desktop UI DSL + Data-Binding)
2
2
  [![Coverage Status](https://coveralls.io/repos/github/AndyObtiva/glimmer/badge.svg?branch=master)](https://coveralls.io/github/AndyObtiva/glimmer?branch=master)
3
3
 
4
4
  Glimmer is a cross-platform Ruby desktop development library. Glimmer's main innovation is a JRuby DSL that enables easy and efficient authoring of desktop application user-interfaces while relying on the robust platform-independent Eclipse SWT library. Glimmer additionally innovates by having built-in desktop UI data-binding support to greatly facilitate synchronizing the UI with domain models. As a result, that achieves true decoupling of object oriented components, enabling developers to solve business problems without worrying about UI concerns, or alternatively drive development UI-first, and then write clean business components test-first afterward.
5
5
 
6
- You may learn more by reading this article: [Eclipse Zone Tutorial](http://eclipse.dzone.com/articles/an-introduction-glimmer)
7
-
8
6
  ## Examples
9
7
 
10
8
  ### Hello World
@@ -65,12 +63,7 @@ Glimmer app:
65
63
 
66
64
  ![Tic Tac Toe](https://github.com/AndyObtiva/glimmer/raw/master/images/glimmer-tic-tac-toe.png)
67
65
 
68
- ## Resources
69
-
70
- * [Eclipse Zone Tutorial](http://eclipse.dzone.com/articles/an-introduction-glimmer)
71
- * [InfoQ Article](http://www.infoq.com/news/2008/02/glimmer-jruby-swt)
72
- * [RubyConf 2008 Video](https://confreaks.tv/videos/rubyconf2008-desktop-development-with-glimmer)
73
- * [Code Blog](http://andymaleh.blogspot.com/search/label/Glimmer)
66
+ NOTE: Glimmer is in beta mode. Please help make better by adopting for small or low risk projects and providing feedback.
74
67
 
75
68
  ## Background
76
69
 
@@ -112,14 +105,14 @@ Please follow these instructions to make the `glimmer` command available on your
112
105
 
113
106
  Run this command to install directly:
114
107
  ```
115
- jgem install glimmer -v 0.4.6
108
+ jgem install glimmer -v 0.4.7
116
109
  ```
117
110
 
118
111
  ### Option 2: Bundler
119
112
 
120
113
  Add the following to `Gemfile`:
121
114
  ```
122
- gem 'glimmer', '~> 0.4.6'
115
+ gem 'glimmer', '~> 0.4.7'
123
116
  ```
124
117
 
125
118
  And, then run:
@@ -528,7 +521,7 @@ Check out the samples directory for more advanced examples of layouts in Glimmer
528
521
 
529
522
  Glimmer composites always come with grid_layout by default, but you can still specify explicitly if you'd like to set specific properties on it.
530
523
 
531
- Glimmer shell always comes containing one composite by default that wraps around specified shell content. That specific composite (the one directly under shell) has fill_layout with :horizontal type.
524
+ Glimmer shell always comes with fill_layout having :horizontal type.
532
525
 
533
526
  This is a great guide for learning more about SWT layouts:
534
527
 
@@ -936,7 +929,9 @@ Definition:
936
929
  ```ruby
937
930
  class Sandwich
938
931
  include Glimmer::SWT::CustomWidget
932
+
939
933
  options :orientation, :bg_color
934
+
940
935
  def body
941
936
  composite(swt_style) { # gets custom widget style
942
937
  fill_layout orientation # using orientation option
@@ -1089,6 +1084,13 @@ Example:
1089
1084
  jruby -J-XstartOnFirstThread -J-classpath "path_to/swt.jar" -r glimmer -S application.rb
1090
1085
  ```
1091
1086
 
1087
+ ## Resources
1088
+
1089
+ * [Eclipse Zone Tutorial](http://eclipse.dzone.com/articles/an-introduction-glimmer)
1090
+ * [InfoQ Article](http://www.infoq.com/news/2008/02/glimmer-jruby-swt)
1091
+ * [RubyConf 2008 Video](https://confreaks.tv/videos/rubyconf2008-desktop-development-with-glimmer)
1092
+ * [Code Blog](http://andymaleh.blogspot.com/search/label/Glimmer)
1093
+
1092
1094
  ## Feature Suggestions
1093
1095
 
1094
1096
  These features have been suggested. You might see them in a future version of Glimmer. You are welcome to contribute more feature suggestions.
@@ -46,6 +46,7 @@ module Glimmer
46
46
  end
47
47
 
48
48
  def self.dsl(dsl)
49
+ @@parent_stack = []
49
50
  CommandHandlerChainFactory.select_dsl(dsl)
50
51
  end
51
52
 
@@ -60,7 +61,7 @@ module Glimmer
60
61
  end
61
62
 
62
63
  def dsl(dsl)
63
- CommandHandlerChainFactory.select_dsl(dsl)
64
+ Glimmer.dsl(dsl)
64
65
  end
65
66
  end
66
67
 
@@ -13,7 +13,8 @@ module Glimmer
13
13
  elsif @next_chain_link
14
14
  return @next_chain_link.handle(parent, command_symbol, *args, &block)
15
15
  else
16
- Glimmer.logger.debug "Command: #{command_symbol} cannot be handled!"
16
+ # TODO see if we need a better response here (e.g. dev mode error raising vs production mode silent failure)
17
+ Glimmer.logger.error "Command: #{command_symbol} cannot be handled!"
17
18
  return nil
18
19
  end
19
20
  end
@@ -1,5 +1,6 @@
1
1
  require File.dirname(__FILE__) + "/../../command_handler"
2
2
  require File.dirname(__FILE__) + "/../g_widget"
3
+ require File.dirname(__FILE__) + "/../custom_widget"
3
4
  require File.dirname(__FILE__) + "/../model_binding"
4
5
 
5
6
  module Glimmer
@@ -17,7 +18,7 @@ module Glimmer
17
18
  def can_handle?(parent, command_symbol, *args, &block)
18
19
  # TODO refactor this long condition below
19
20
  (
20
- parent.is_a?(GWidget) and
21
+ (parent.is_a?(GWidget) || parent.is_a?(CustomWidget)) and
21
22
  command_symbol.to_s == "bind" and
22
23
  (
23
24
  (
@@ -17,7 +17,7 @@ module Glimmer
17
17
  def do_handle(parent, command_symbol, *args, &block)
18
18
  if args.first.is_a?(Display) || args.first.nil?
19
19
  display = args.delete_at(0)
20
- elsif parent.is_a?(GWidget)
20
+ elsif parent.is_a?(GWidget) || parent.is_a?(CustomWidget)
21
21
  display = parent.widget.display
22
22
  else
23
23
  display = GDisplay.instance.display
@@ -1,5 +1,6 @@
1
1
  require File.dirname(__FILE__) + "/../../command_handler"
2
2
  require File.dirname(__FILE__) + "/../g_widget"
3
+ require File.dirname(__FILE__) + "/../custom_widget"
3
4
 
4
5
  module Glimmer
5
6
  module SWT
@@ -11,7 +12,7 @@ module Glimmer
11
12
  include_package 'org.eclipse.swt.widgets'
12
13
 
13
14
  def can_handle?(parent, command_symbol, *args, &block)
14
- parent.is_a?(GWidget) and
15
+ (parent.is_a?(GWidget) || parent.is_a?(CustomWidget)) and
15
16
  parent.widget.is_a?(Combo) and
16
17
  command_symbol.to_s == "selection" and
17
18
  args.size == 1 and
@@ -36,7 +37,7 @@ module Glimmer
36
37
  model_binding.call(widget_binding.evaluate_property)
37
38
  }
38
39
  }
39
- end
40
+ end
40
41
  end
41
42
  end
42
43
  end
@@ -9,14 +9,14 @@ module Glimmer
9
9
  include CommandHandler
10
10
 
11
11
  def can_handle?(parent, command_symbol, *args, &block)
12
- (parent.is_a?(GWidget) || parent.is_a?(SWT::CustomWidget)) and
13
- SWT::CustomWidget.for(command_symbol)
12
+ (parent.is_a?(GWidget) || parent.is_a?(CustomWidget)) and
13
+ CustomWidget.for(command_symbol)
14
14
  end
15
15
 
16
16
  def do_handle(parent, command_symbol, *args, &block)
17
17
  options = args.pop if args.last.is_a?(Hash)
18
18
  Glimmer.logger.debug "Custom widget #{command_symbol} styles are: [" + args.inspect + "] and options are: #{options}"
19
- SWT::CustomWidget.for(command_symbol).new(parent, *args, options, &block)
19
+ CustomWidget.for(command_symbol).new(parent, *args, options, &block)
20
20
  end
21
21
  end
22
22
  end
@@ -1,5 +1,6 @@
1
1
  require File.dirname(__FILE__) + "/../../command_handler"
2
2
  require File.dirname(__FILE__) + "/../g_widget"
3
+ require File.dirname(__FILE__) + "/../custom_widget"
3
4
  require File.dirname(__FILE__) + "/../observable_model"
4
5
  require File.dirname(__FILE__) + "/../model_binding"
5
6
  require File.dirname(__FILE__) + "/../widget_binding"
@@ -20,40 +21,10 @@ module Glimmer
20
21
 
21
22
  include_package 'org.eclipse.swt.widgets'
22
23
 
23
- @@widget_data_binders = {
24
- Java::OrgEclipseSwtWidgets::Text => {
25
- :text => Proc.new do |g_widget, model_binding|
26
- add_contents(g_widget) {
27
- on_modify_text { |modify_event|
28
- model_binding.call(g_widget.widget.getText)
29
- }
30
- }
31
- end,
32
- },
33
- Java::OrgEclipseSwtWidgets::Button => {
34
- :selection => Proc.new do |g_widget, model_binding|
35
- add_contents(g_widget) {
36
- on_widget_selected { |selection_event|
37
- model_binding.call(g_widget.widget.getSelection)
38
- }
39
- }
40
- end
41
- },
42
- Java::OrgEclipseSwtWidgets::Spinner => {
43
- :selection => Proc.new do |g_widget, model_binding|
44
- add_contents(g_widget) {
45
- on_widget_selected { |selection_event|
46
- model_binding.call(g_widget.widget.getSelection)
47
- }
48
- }
49
- end
50
- }
51
- }
52
-
53
24
  def can_handle?(parent, command_symbol, *args, &block)
54
- (parent.is_a?(GWidget) and
25
+ (parent.is_a?(GWidget) || parent.is_a?(CustomWidget)) and
55
26
  args.size == 1 and
56
- args[0].is_a?(ModelBinding))
27
+ args[0].is_a?(ModelBinding)
57
28
  end
58
29
 
59
30
  def do_handle(parent, command_symbol, *args, &block)
@@ -62,9 +33,7 @@ module Glimmer
62
33
  widget_binding = WidgetBinding.new(*widget_binding_parameters)
63
34
  widget_binding.call(model_binding.evaluate_property)
64
35
  widget_binding.observe(model_binding)
65
- widget_data_binder_map = @@widget_data_binders[parent.widget.class]
66
- widget_data_binder = widget_data_binder_map[command_symbol.to_s.to_sym] if widget_data_binder_map
67
- widget_data_binder.call(parent, model_binding) if widget_data_binder
36
+ parent.add_observer(model_binding, command_symbol.to_s.to_sym) #TODO consider reversing statement
68
37
  end
69
38
  end
70
39
  end
@@ -11,7 +11,7 @@ module Glimmer
11
11
  include_package 'org.eclipse.swt.layout'
12
12
 
13
13
  def can_handle?(parent, command_symbol, *args, &block)
14
- parent.is_a?(GWidget) and
14
+ (parent.is_a?(GWidget) || parent.is_a?(CustomWidget)) and
15
15
  parent.widget.is_a?(Composite) and
16
16
  command_symbol.to_s.end_with?('_layout') and
17
17
  GLayout.layout_exists?(command_symbol.to_s)
@@ -1,5 +1,6 @@
1
1
  require File.dirname(__FILE__) + "/../../command_handler"
2
2
  require File.dirname(__FILE__) + "/../g_widget"
3
+ require File.dirname(__FILE__) + "/../custom_widget"
3
4
  require File.dirname(__FILE__) + "/../g_layout_data"
4
5
 
5
6
  module Glimmer
@@ -12,7 +13,7 @@ module Glimmer
12
13
  include_package 'org.eclipse.swt.layout'
13
14
 
14
15
  def can_handle?(parent, command_symbol, *args, &block)
15
- parent.is_a?(GWidget) and
16
+ (parent.is_a?(GWidget) || parent.is_a?(CustomWidget)) and
16
17
  command_symbol.to_s == 'layout_data'
17
18
  end
18
19
 
@@ -1,5 +1,6 @@
1
1
  require File.dirname(__FILE__) + "/../../command_handler"
2
2
  require File.dirname(__FILE__) + "/../g_widget"
3
+ require File.dirname(__FILE__) + "/../custom_widget"
3
4
  require File.dirname(__FILE__) + "/../list_selection_binding"
4
5
 
5
6
  module Glimmer
@@ -12,7 +13,7 @@ module Glimmer
12
13
  include_package 'org.eclipse.swt.widgets'
13
14
 
14
15
  def can_handle?(parent, command_symbol, *args, &block)
15
- parent.is_a?(GWidget) and
16
+ (parent.is_a?(GWidget) || parent.is_a?(CustomWidget)) and
16
17
  parent.widget.is_a?(List) and
17
18
  command_symbol.to_s == "selection" and
18
19
  args.size == 1 and
@@ -41,7 +42,7 @@ module Glimmer
41
42
  model_binding.call(list_selection_binding.evaluate_property)
42
43
  }
43
44
  }
44
- end
45
+ end
45
46
  end
46
47
  end
47
48
  end
@@ -9,9 +9,19 @@ module Glimmer
9
9
  include CommandHandler
10
10
  include Glimmer
11
11
 
12
+ include_package 'org.eclipse.swt.widgets'
13
+
12
14
  def can_handle?(parent, command_symbol, *args, &block)
13
- parent.is_a?(GWidget) and
14
- command_symbol.to_s == "tab_item"
15
+ initial_condition = (parent.is_a?(GWidget) || parent.is_a?(CustomWidget)) &&
16
+ command_symbol.to_s == "tab_item"
17
+ if initial_condition
18
+ if parent.widget.is_a?(TabFolder)
19
+ return true
20
+ else
21
+ Glimmer.logger.error "tab_item widget may only be used directly under a tab_folder widget!"
22
+ end
23
+ end
24
+ false
15
25
  end
16
26
 
17
27
  def do_handle(parent, command_symbol, *args, &block)
@@ -1,5 +1,6 @@
1
1
  require File.dirname(__FILE__) + "/../../command_handler"
2
2
  require File.dirname(__FILE__) + "/../g_widget"
3
+ require File.dirname(__FILE__) + "/../custom_widget"
3
4
 
4
5
  module Glimmer
5
6
  module SWT
@@ -13,7 +14,7 @@ module Glimmer
13
14
  include_package 'org.eclipse.swt.widgets'
14
15
 
15
16
  def can_handle?(parent, command_symbol, *args, &block)
16
- parent.is_a?(GWidget) and
17
+ (parent.is_a?(GWidget) || parent.is_a?(CustomWidget)) and
17
18
  parent.widget.is_a?(Table) and
18
19
  command_symbol.to_s == "column_properties" and
19
20
  block == nil
@@ -1,5 +1,6 @@
1
1
  require File.dirname(__FILE__) + "/../../command_handler"
2
2
  require File.dirname(__FILE__) + "/../g_widget"
3
+ require File.dirname(__FILE__) + "/../custom_widget"
3
4
  require File.dirname(__FILE__) + "/../table_items_binding"
4
5
 
5
6
  module Glimmer
@@ -12,7 +13,7 @@ module Glimmer
12
13
  include_package 'org.eclipse.swt.widgets'
13
14
 
14
15
  def can_handle?(parent, command_symbol, *args, &block)
15
- parent.is_a?(GWidget) and
16
+ (parent.is_a?(GWidget) || parent.is_a?(CustomWidget)) and
16
17
  parent.widget.is_a?(Table) and
17
18
  command_symbol.to_s == "items" and
18
19
  args.size == 2 and
@@ -1,5 +1,6 @@
1
1
  require File.dirname(__FILE__) + "/../../command_handler"
2
2
  require File.dirname(__FILE__) + "/../g_widget"
3
+ require File.dirname(__FILE__) + "/../custom_widget"
3
4
  require File.dirname(__FILE__) + "/../tree_items_binding"
4
5
 
5
6
  module Glimmer
@@ -11,7 +12,7 @@ module Glimmer
11
12
  include_package 'org.eclipse.swt.widgets'
12
13
 
13
14
  def can_handle?(parent, command_symbol, *args, &block)
14
- (parent.is_a?(GWidget)) and
15
+ (parent.is_a?(GWidget) || parent.is_a?(CustomWidget)) and
15
16
  (parent.widget.is_a?(Tree)) and
16
17
  (command_symbol.to_s == "items") and
17
18
  (args.size == 2) and
@@ -1,5 +1,6 @@
1
1
  require File.dirname(__FILE__) + "/../../command_handler"
2
2
  require File.dirname(__FILE__) + "/../g_widget"
3
+ require File.dirname(__FILE__) + "/../custom_widget"
3
4
 
4
5
  module Glimmer
5
6
  module SWT
@@ -13,7 +14,7 @@ module Glimmer
13
14
  include_package 'org.eclipse.swt.widgets'
14
15
 
15
16
  def can_handle?(parent, command_symbol, *args, &block)
16
- parent.is_a?(GWidget) and
17
+ (parent.is_a?(GWidget) || parent.is_a?(CustomWidget)) and
17
18
  parent.widget.is_a?(Tree) and
18
19
  command_symbol.to_s == "tree_properties" and
19
20
  block == nil
@@ -12,7 +12,7 @@ module Glimmer
12
12
  include_package 'org.eclipse.swt.browser'
13
13
 
14
14
  def can_handle?(parent, command_symbol, *args, &block)
15
- (parent.is_a?(GWidget) || parent.is_a?(SWT::CustomWidget)) and
15
+ (parent.is_a?(GWidget) || parent.is_a?(CustomWidget)) and
16
16
  command_symbol.to_s != "shell" and
17
17
  GWidget.widget_exists?(command_symbol.to_s)
18
18
  end
@@ -1,5 +1,6 @@
1
1
  require File.dirname(__FILE__) + "/../../command_handler"
2
2
  require File.dirname(__FILE__) + "/../g_widget"
3
+ require File.dirname(__FILE__) + "/../custom_widget"
3
4
 
4
5
  module Glimmer
5
6
  module SWT
@@ -10,8 +11,9 @@ module Glimmer
10
11
  include_package 'org.eclipse.swt.widgets'
11
12
 
12
13
  def can_handle?(parent, command_symbol, *args, &block)
13
- Glimmer.logger.debug "parent is a widget: " + (parent.is_a?(GWidget)).to_s
14
- return unless parent.is_a?(GWidget)
14
+ widget_parentage = (parent.is_a?(GWidget) || parent.is_a?(CustomWidget))
15
+ Glimmer.logger.debug "parent is a widget: #{widget_parentage}"
16
+ return unless widget_parentage
15
17
  Glimmer.logger.debug "on listener?: " + (command_symbol.to_s[0,3] == "on_").to_s
16
18
  return unless command_symbol.to_s[0,3] == "on_"
17
19
  Glimmer.logger.debug "command symbol is longer than 3: " + (command_symbol.to_s.length > 3).to_s
@@ -1,6 +1,7 @@
1
1
  require 'set'
2
2
 
3
3
  require_relative 'proc_tracker'
4
+ require_relative 'observable_model'
4
5
 
5
6
  module Glimmer
6
7
  module SWT
@@ -8,6 +9,7 @@ module Glimmer
8
9
  include SuperModule
9
10
  include Glimmer
10
11
  include Parent
12
+ include ObservableModel
11
13
 
12
14
  class << self
13
15
  def for(underscored_custom_widget_name)
@@ -67,6 +69,20 @@ module Glimmer
67
69
  raise 'Not implemented!'
68
70
  end
69
71
 
72
+ # TODO consider using delegators
73
+
74
+ def can_add_listener?(underscored_listener_name)
75
+ @body_root.can_add_listener?(underscored_listener_name)
76
+ end
77
+
78
+ def add_listener(underscored_listener_name, &block)
79
+ @body_root.add_listener(underscored_listener_name, &block)
80
+ end
81
+
82
+ def add_observer(observer, attribute_name)
83
+ @body_root.add_observer(observer, attribute_name)
84
+ end
85
+
70
86
  def has_attribute?(attribute_name, *args)
71
87
  respond_to?(attribute_setter(attribute_name), args) ||
72
88
  @body_root.has_attribute?(attribute_name, *args)
@@ -80,12 +96,24 @@ module Glimmer
80
96
  end
81
97
  end
82
98
 
99
+ def get_attribute(attribute_name)
100
+ if respond_to?(attribute_name)
101
+ send(attribute_name)
102
+ else
103
+ @body_root.get_attribute(attribute_name)
104
+ end
105
+ end
106
+
83
107
  def attribute_setter(attribute_name)
84
108
  "#{attribute_name}="
85
109
  end
86
110
 
87
111
  def process_block(block)
88
- @content.call if @content && !@content.called?
112
+ if block.source_location == @content&.__getobj__.source_location
113
+ @content.call unless @content.called?
114
+ else
115
+ block.call
116
+ end
89
117
  end
90
118
  end
91
119
  end
@@ -1,4 +1,3 @@
1
- require File.dirname(__FILE__) + "/g_widget_listener"
2
1
  require File.dirname(__FILE__) + "/g_runnable"
3
2
 
4
3
  module Glimmer
@@ -29,6 +28,14 @@ module Glimmer
29
28
  super(attribute_name, *args)
30
29
  end
31
30
  end
31
+
32
+ def get_attribute(attribute_name)
33
+ if attribute_name.to_s == "text"
34
+ @tab_item.widget.text
35
+ else
36
+ super(attribute_name)
37
+ end
38
+ end
32
39
  end
33
40
  end
34
41
  end
@@ -13,6 +13,8 @@ module Glimmer
13
13
  include_package 'org.eclipse.swt.layout'
14
14
  include_package 'org.eclipse.swt.graphics'
15
15
  include_package 'org.eclipse.swt.browser'
16
+
17
+ include Glimmer
16
18
  include Parent
17
19
 
18
20
  attr_reader :widget
@@ -56,6 +58,10 @@ module Glimmer
56
58
  @widget.send(attribute_setter(attribute_name), *args)
57
59
  end
58
60
 
61
+ def get_attribute(attribute_name)
62
+ @widget.send(attribute_getter(attribute_name))
63
+ end
64
+
59
65
  def property_type_converters
60
66
  color_converter = Proc.new do |value|
61
67
  if value.is_a?(Symbol) || value.is_a?(String)
@@ -81,6 +87,38 @@ module Glimmer
81
87
  }
82
88
  end
83
89
 
90
+ def widget_property_listener_installers
91
+ @widget_property_listener_installers ||= {
92
+ Java::OrgEclipseSwtWidgets::Text => {
93
+ :text => Proc.new do |observer|
94
+ add_contents(self) {
95
+ on_modify_text { |modify_event|
96
+ observer.call(widget.getText)
97
+ }
98
+ }
99
+ end,
100
+ },
101
+ Java::OrgEclipseSwtWidgets::Button => {
102
+ :selection => Proc.new do |observer|
103
+ add_contents(self) {
104
+ on_widget_selected { |selection_event|
105
+ observer.call(widget.getSelection)
106
+ }
107
+ }
108
+ end
109
+ },
110
+ Java::OrgEclipseSwtWidgets::Spinner => {
111
+ :selection => Proc.new do |observer|
112
+ add_contents(self) {
113
+ on_widget_selected { |selection_event|
114
+ observer.call(widget.getSelection)
115
+ }
116
+ }
117
+ end
118
+ }
119
+ }
120
+ end
121
+
84
122
  def apply_property_type_converters(attribute_name, args)
85
123
  if args.count == 1
86
124
  value = args.first
@@ -194,6 +232,16 @@ module Glimmer
194
232
  @widget.dispose
195
233
  end
196
234
 
235
+ def add_observer(observer, property_name)
236
+ property_listener_installers = widget_property_listener_installers[widget.class]
237
+ widget_listener_installer = property_listener_installers[property_name.to_s.to_sym] if property_listener_installers
238
+ widget_listener_installer.call(observer) if widget_listener_installer
239
+ end
240
+
241
+ def remove_observer(observer, property_name)
242
+ # TODO consider implementing if remove_observer is needed (consumers can remove listener via SWT API)
243
+ end
244
+
197
245
  private
198
246
 
199
247
  def style(underscored_widget_name, styles)
@@ -209,6 +257,10 @@ module Glimmer
209
257
  def attribute_setter(attribute_name)
210
258
  "set#{attribute_name.to_s.camelcase(:upper)}"
211
259
  end
260
+
261
+ def attribute_getter(attribute_name)
262
+ "get#{attribute_name.to_s.camelcase(:upper)}"
263
+ end
212
264
  end
213
265
  end
214
266
  end
@@ -40,6 +40,7 @@ module Glimmer
40
40
  end
41
41
 
42
42
  def property_observer_hash
43
+ # TODO simplify with ||=
43
44
  @property_observers = Hash.new unless @property_observers
44
45
  @property_observers
45
46
  end
@@ -13,7 +13,8 @@ module Glimmer
13
13
  @widget = model
14
14
  @property = property
15
15
  @translator = translator || proc {|value| value}
16
- add_contents(@widget) {
16
+
17
+ add_contents(@widget) { # TODO consider having custom widgets support on_widget_disposed event and any event on their body_root
17
18
  on_widget_disposed { |dispose_event|
18
19
  unregister_all_observables
19
20
  }
@@ -24,7 +25,7 @@ module Glimmer
24
25
  @widget.set_attribute(@property, converted_value) unless evaluate_property == converted_value
25
26
  end
26
27
  def evaluate_property
27
- @widget.widget.send(@property)
28
+ @widget.get_attribute(@property)
28
29
  end
29
30
  end
30
31
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glimmer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.6
4
+ version: 0.4.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - AndyMaleh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-26 00:00:00.000000000 Z
11
+ date: 2020-03-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement